📄 gridroutecb.hh
字号:
/* * gridroutecb.hh -- Grid route action callback interface * Douglas S. J. De Couto * * Copyright (c) 2000 Massachusetts Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, subject to the conditions * listed in the Click LICENSE file. These conditions include: you must * preserve this copyright notice, and you cannot mention the copyright * holders in advertising related to the Software without their permission. * The Software is provided WITHOUT ANY WARRANTY, EXPRESS OR IMPLIED. This * notice is a summary of the Click LICENSE file; the license in that file is * legally binding. */#ifndef GRIDROUTECB_HH#define GRIDROUTECB_HH#include <click/packet_anno.hh>CLICK_DECLSclass GridRouteActionCallback {public: enum Action { UnknownAction = 0, SendToIP = 1, ForwardDSDV = 2, // data = next hop ip, data2 = (qual << 16) | (-sig & 0xFFff) FallbackToGF = 3, QueuedForLocQuery = 4, ForwardGF = 5, // data = next hop ip, data2 = best nbr ip Drop = 6, // data = drop reason ProbeFinished = 7, NoLocQueryNeeded = 8, CachedLocFound = 9 }; enum DropReason { UnknownReason = 0, UnknownType = 1, // dest_ip is unknown NoLocalRoute = 2, NoDestLoc = 3, NoCloserNode = 4, ConfigError = 5, OwnLocUnknown = 6, BadPacket = 7 }; virtual void route_cb(int id, unsigned int dest_ip, Action a, unsigned int data, unsigned int data2) = 0;protected: static void set_route_cb_bit(Packet *p, unsigned int cb_num) { unsigned int mask = 1 << cb_num; unsigned int newval = mask | GRID_ROUTE_CB_ANNO(p); SET_GRID_ROUTE_CB_ANNO(p, newval); }};class GridRouteActor {public: GridRouteActor() { memset(&_cbs, 0, sizeof(_cbs)); } int add_callback(GridRouteActionCallback *cb) { int id = alloc_cb_id(); if (id < 0) return -1; _cbs[id] = cb; return id; }private: static bool cb_is_set(Packet *p, unsigned int cb_num) { unsigned int mask = 1 << cb_num; return mask & GRID_ROUTE_CB_ANNO(p); } /* this number must be synchronized with the size of the grid route callback annotation in packet_anno.hh */ static const int _max_route_cbs = 8; /* defined in updateroutes.cc -- static so that all callback have unique ids, and share a bitmask in the packet annotation */ static int _next_free_cb; static int alloc_cb_id() { if (_next_free_cb >= _max_route_cbs) return -1; int id = _next_free_cb; _next_free_cb++; return id; } GridRouteActionCallback *_cbs[_max_route_cbs];protected: void notify_route_cbs(Packet *p, unsigned int dest_ip, GridRouteActionCallback::Action a, unsigned int data, unsigned int data2) { for (int i = 0; i < _max_route_cbs; i++) { if (_cbs[i] && cb_is_set(p, i)) _cbs[i]->route_cb(i, dest_ip, a, data, data2); } }};CLICK_ENDDECLS#endif /* GRIDROUTECB_HH */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -