/home/aherms/Code/git/awds-routing/src/awds/routing.h

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         /* name resolution functions */
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         /* ---------- for interaction with topology ---------- */
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 /* This stuff is for emacs
00142  * Local variables:
00143  * mode:c++
00144  * c-basic-offset: 4
00145  * End:
00146  */

Generated on Tue Dec 11 17:58:48 2007 for AWDS by  doxygen 1.5.3-20071008