00001 #ifndef _ROUTING_H__
00002 #define _ROUTING_H__
00003
00004 #include <gea/Time.h>
00005 #include <awds/NodeId.h>
00006 #include <string>
00007
00014 namespace awds {
00015 class BasePacket;
00016 class CryptoUnit;
00017
00018
00029 class Routing {
00030
00031 public:
00032
00033 CryptoUnit *cryptoUnit;
00034
00042 typedef void (*recv_callback)( BasePacket *p, void *data);
00043
00044 const NodeId myNodeId;
00046 enum Metrics {
00047 TransmitDurationMetrics = 0,
00048 EtxMetrics = 1,
00049 PacketLossMetrics = 2,
00050 HopCountMetrics = 3
00051 };
00052
00053 enum Metrics x_metrics;
00054
00056 Routing(const NodeId& id) :
00057 cryptoUnit(0),
00058 myNodeId(id),
00059 x_metrics(PacketLossMetrics)
00060 {}
00061
00063 virtual ~Routing() {};
00064
00065
00066
00071 virtual std::string getNameOfNode(const NodeId& id) const = 0;
00072
00078 virtual bool getNodeByName(NodeId& id, const char *name) const = 0;
00079
00080
00081
00082
00083 typedef int (*NodeFunctor)( void *data, const NodeId& id);
00086 virtual int foreachNode(NodeFunctor, void *data) const = 0;
00087
00088 typedef int (*EdgeFunctor)( void *data, const NodeId& from, const NodeId& to);
00091 virtual int foreachEdge(EdgeFunctor, void *data) const = 0;
00092
00093
00094 struct NodesObserver {
00095 struct NodesObserver *next;
00096 virtual void nodesChanged() = 0;
00097 virtual void nodeAdded(const awds::NodeId& id) = 0 ;
00098 virtual void nodeRemoved(const awds::NodeId& id) = 0;
00099 virtual ~NodesObserver() {}
00100 };
00101
00102 virtual void addNodeObserver(struct NodesObserver *observer) = 0;
00103
00104 struct LinksObserver {
00105 struct LinksObserver *next;
00106 virtual void linksChanged() = 0;
00107 virtual void linkAdded(const awds::NodeId& from, const awds::NodeId& to) = 0;
00108 virtual void linkRemoved(const awds::NodeId& from, const awds::NodeId& to) = 0;
00109 virtual ~LinksObserver() {}
00110 };
00111
00112 virtual void addLinkObserver(struct LinksObserver *observer) = 0;
00113
00123 virtual BasePacket *newFloodPacket(int floodType) = 0;
00124 virtual BasePacket *newUnicastPacket(int type) = 0;
00125
00126 virtual bool isReachable(const NodeId& id) const = 0;
00127
00128 virtual void sendBroadcast(BasePacket *p) = 0;
00129 virtual void sendUnicast(BasePacket *p) = 0;
00130 virtual void sendUnicastVia(BasePacket *p,NodeId nextHop) = 0;
00131
00132 virtual void registerUnicastProtocol(int num, recv_callback cb, void* data) = 0;
00133 virtual void registerBroadcastProtocol(int num, recv_callback cb, void* data) = 0;
00134
00135 virtual size_t getMTU() = 0;
00136
00137 };
00138 }
00139
00140 #endif //ROUTING_H__
00141
00142
00143
00144
00145
00146