hdr_sr.h
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:9k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * hdr_sr.h
  3.  * Copyright (C) 2000 by the University of Southern California
  4.  * $Id: hdr_sr.h,v 1.8 2005/08/25 18:58:04 johnh Exp $
  5.  *
  6.  * This program is free software; you can redistribute it and/or
  7.  * modify it under the terms of the GNU General Public License,
  8.  * version 2, as published by the Free Software Foundation.
  9.  *
  10.  * This program is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  * GNU General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU General Public License along
  16.  * with this program; if not, write to the Free Software Foundation, Inc.,
  17.  * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
  18.  *
  19.  *
  20.  * The copyright of this module includes the following
  21.  * linking-with-specific-other-licenses addition:
  22.  *
  23.  * In addition, as a special exception, the copyright holders of
  24.  * this module give you permission to combine (via static or
  25.  * dynamic linking) this module with free software programs or
  26.  * libraries that are released under the GNU LGPL and with code
  27.  * included in the standard release of ns-2 under the Apache 2.0
  28.  * license or under otherwise-compatible licenses with advertising
  29.  * requirements (or modified versions of such code, with unchanged
  30.  * license).  You may copy and distribute such a system following the
  31.  * terms of the GNU GPL for this module and the licenses of the
  32.  * other code concerned, provided that you include the source code of
  33.  * that other code when and as the GNU GPL requires distribution of
  34.  * source code.
  35.  *
  36.  * Note that people who make modified versions of this module
  37.  * are not obligated to grant this special exception for their
  38.  * modified versions; it is their choice whether to do so.  The GNU
  39.  * General Public License gives permission to release a modified
  40.  * version without this exception; this exception also makes it
  41.  * possible to release a modified version which carries forward this
  42.  * exception.
  43.  *
  44.  */
  45. // Other copyrights might apply to parts of this software and are so
  46. // noted when applicable.
  47. //
  48. // Ported from CMU/Monarch's code, appropriate copyright applies.  
  49. /* -*- c++ -*-
  50.    hdr_sr.h
  51.    source route header
  52.    
  53. */
  54. #ifndef sr_hdr_h
  55. #define sr_hdr_h
  56. #include <assert.h>
  57. #include <packet.h>
  58. #define SR_HDR_SZ 4 // size of constant part of hdr
  59. #define MAX_SR_LEN 16 // longest source route we can handle
  60. #define MAX_ROUTE_ERRORS 3 // how many route errors can fit in one pkt?
  61. struct sr_addr {
  62.         int addr_type; /* same as hdr_cmn in packet.h */
  63. nsaddr_t addr;
  64. /*
  65.  * Metrics that I want to collect at each node
  66.  */
  67. double Pt_;
  68. };
  69. struct link_down {
  70. int addr_type; /* same as hdr_cmn in packet.h */
  71. nsaddr_t tell_addr; // tell this host
  72. nsaddr_t from_addr; // that from_addr host can no longer
  73. nsaddr_t to_addr; // get packets to to_addr host
  74. };
  75. /* ======================================================================
  76.    DSR Packet Types
  77.    ====================================================================== */
  78. struct route_request {
  79. int req_valid_; /* request header is valid? */
  80. int req_id_; /* unique request identifier */
  81. int req_ttl_; /* max propagation */
  82. };
  83. struct route_reply {
  84. int rep_valid_; /* reply header is valid? */
  85. int rep_rtlen_; /* # hops in route reply */
  86. struct sr_addr rep_addrs_[MAX_SR_LEN];
  87. };
  88. struct route_error {
  89. int err_valid_; /* error header is valid? */
  90. int err_count_; /* number of route errors */
  91. struct link_down err_links_[MAX_ROUTE_ERRORS];
  92. };
  93. /* ======================================================================
  94.    DSR Flow State Draft Stuff
  95.    ====================================================================== */
  96. struct flow_error {
  97. nsaddr_t  flow_src;
  98. nsaddr_t  flow_dst;
  99. u_int16_t flow_id;  /* not valid w/ default flow stuff */
  100. };
  101. struct flow_header {
  102. int flow_valid_;
  103. int hopCount_;
  104. unsigned short flow_id_;
  105. };
  106. struct flow_timeout {
  107. int flow_timeout_valid_;
  108. unsigned long timeout_;  // timeout in seconds...
  109. };
  110. struct flow_unknown {
  111. int flow_unknown_valid_;
  112. int err_count_;
  113. struct flow_error err_flows_[MAX_ROUTE_ERRORS];
  114. };
  115. // default flow unknown errors
  116. struct flow_default_err {
  117. int flow_default_valid_;
  118. int err_count_;
  119. struct flow_error err_flows_[MAX_ROUTE_ERRORS];
  120. };
  121. /* ======================================================================
  122.    DSR Header
  123.    ====================================================================== */
  124. class hdr_sr {
  125. private:
  126. int valid_; /* is this header actually in the packet? 
  127.    and initialized? */
  128. int salvaged_; /* packet has been salvaged? */
  129. int num_addrs_;
  130. int cur_addr_;
  131. struct sr_addr addrs_[MAX_SR_LEN];
  132. struct route_request sr_request_;
  133. struct route_reply sr_reply_;
  134. struct route_error sr_error_;
  135. struct flow_header      sr_flow_;
  136. struct flow_timeout sr_ftime_;
  137. struct flow_unknown sr_funk_;
  138. struct flow_default_err sr_fdef_unk;
  139. public:
  140. static int offset_; /* offset for this header */
  141. inline int& offset() { return offset_; }
  142.         inline static hdr_sr* access(const Packet* p) {
  143.         return (hdr_sr*)p->access(offset_);
  144. }
  145. inline int& valid() { return valid_; }
  146. inline int& salvaged() { return salvaged_; }
  147. inline int& num_addrs() { return num_addrs_; }
  148. inline int& cur_addr() { return cur_addr_; }
  149. inline int valid() const { return valid_; }
  150. inline int salvaged() const { return salvaged_; }
  151. inline int num_addrs() const { return num_addrs_; }
  152. inline int cur_addr() const { return cur_addr_; }
  153. inline struct sr_addr* addrs() { return addrs_; }
  154. inline int& route_request() {return sr_request_.req_valid_; }
  155. inline int& rtreq_seq() {return sr_request_.req_id_; }
  156. inline int& max_propagation() {return sr_request_.req_ttl_; }
  157. inline int& route_reply() {return sr_reply_.rep_valid_; }
  158. inline int& route_reply_len() {return sr_reply_.rep_rtlen_; }
  159. inline struct sr_addr* reply_addrs() {return sr_reply_.rep_addrs_; }
  160. inline int& route_error() {return sr_error_.err_valid_; }
  161. inline int& num_route_errors() {return sr_error_.err_count_; }
  162. inline struct link_down* down_links() {return sr_error_.err_links_; }
  163. // Flow state stuff, ych 5/2/01
  164. inline int &flow_header() { return sr_flow_.flow_valid_; }
  165. inline u_int16_t &flow_id() { return sr_flow_.flow_id_; }
  166. inline int &hopCount() { return sr_flow_.hopCount_; }
  167. inline int &flow_timeout() { return sr_ftime_.flow_timeout_valid_; }
  168. inline unsigned long &flow_timeout_time() { return sr_ftime_.timeout_; }
  169. inline int &flow_unknown() { return sr_funk_.flow_unknown_valid_; }
  170. inline int &num_flow_unknown() { return sr_funk_.err_count_; }
  171. inline struct flow_error *unknown_flows() { return sr_funk_.err_flows_; }
  172. inline int &flow_default_unknown() { return sr_fdef_unk.flow_default_valid_; }
  173. inline int &num_default_unknown() { return sr_fdef_unk.err_count_; }
  174. inline struct flow_error *unknown_defaults() { return sr_fdef_unk.err_flows_; }
  175. inline int size() {
  176. int sz = 0;
  177. if (num_addrs_ || route_request() || 
  178.     route_reply() || route_error() ||
  179.     flow_timeout() || flow_unknown() || flow_default_unknown())
  180. sz += SR_HDR_SZ;
  181. if (num_addrs_) sz += 4 * (num_addrs_ - 1);
  182. if (route_reply()) sz += 5 + 4 * route_reply_len();
  183. if (route_request()) sz += 8;
  184. if (route_error()) sz += 16 * num_route_errors();
  185. if (flow_timeout()) sz += 4;
  186. if (flow_unknown()) sz += 14 * num_flow_unknown();
  187. if (flow_default_unknown()) sz += 12 * num_default_unknown();
  188. if (flow_header()) sz += 4;
  189. sz = ((sz+3)&(~3)); // align...
  190. assert(sz >= 0);
  191. #if 0
  192. printf("Size: %d (%d %d %d %d %d %d %d %d %d)n", sz,
  193. (num_addrs_ || route_request() ||
  194. route_reply() || route_error() ||
  195. flow_timeout() || flow_unknown() || 
  196. flow_default_unknown()) ? SR_HDR_SZ : 0,
  197. num_addrs_ ? 4 * (num_addrs_ - 1) : 0,
  198. route_reply() ? 5 + 4 * route_reply_len() : 0,
  199. route_request() ? 8 : 0,
  200. route_error() ? 16 * num_route_errors() : 0,
  201. flow_timeout() ? 4 : 0,
  202. flow_unknown() ? 14 * num_flow_unknown() : 0,
  203. flow_default_unknown() ? 12 * num_default_unknown() : 0,
  204. flow_header() ? 4 : 0);
  205. #endif
  206. return sz;
  207. }
  208. // End Flow State stuff
  209. inline nsaddr_t& get_next_addr() { 
  210. assert(cur_addr_ < num_addrs_);
  211. return (addrs_[cur_addr_ + 1].addr);
  212. }
  213. inline int& get_next_type() {
  214. assert(cur_addr_ < num_addrs_);
  215. return (addrs_[cur_addr_ + 1].addr_type);
  216. }
  217. inline void append_addr(nsaddr_t a, int type) {
  218. assert(num_addrs_ < MAX_SR_LEN-1);
  219. addrs_[num_addrs_].addr_type = type;
  220. addrs_[num_addrs_++].addr = a;
  221. }
  222. inline void init() {
  223. valid_ = 1;
  224. salvaged_ = 0;
  225. num_addrs_ = 0;
  226. cur_addr_ = 0;
  227. route_request() = 0;
  228. route_reply() = 0;
  229. route_reply_len() = 0;
  230. route_error() = 0;
  231. num_route_errors() = 0;
  232. flow_timeout() = 0;
  233. flow_unknown() = 0;
  234. flow_default_unknown() = 0;
  235. flow_header() = 0;
  236. }
  237. #if 0
  238. #ifdef DSR_CONST_HDR_SZ
  239.   /* used to estimate the potential benefit of removing the 
  240.      src route in every packet */
  241. inline int size() { 
  242. return SR_HDR_SZ;
  243. }
  244. #else
  245. inline int size() { 
  246. int sz = SR_HDR_SZ +
  247. 4 * (num_addrs_ - 1) +
  248. 4 * (route_reply() ? route_reply_len() : 0) +
  249. 8 * (route_error() ? num_route_errors() : 0);
  250. assert(sz >= 0);
  251. return sz;
  252. }
  253. #endif // DSR_CONST_HDR_SZ
  254. #endif // 0
  255.   void dump(char *);
  256.   char* dump();
  257. };
  258. #endif // sr_hdr_h