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

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * flowstruct.h
  3.  * Copyright (C) 2000 by the University of Southern California
  4.  * $Id: flowstruct.h,v 1.3 2006/02/21 15:20:18 mahrenho 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. #ifndef __flow_table_h__
  50. #define __flow_table_h__
  51. extern "C" {
  52. #include <stdio.h>
  53. #include <stdarg.h>
  54. }
  55. #include "path.h"
  56. #include "srpacket.h"
  57. #include "hdr_sr.h"
  58. //#include "net-if.h"
  59. #include <phy.h>
  60. #include "scheduler.h" // for timeout
  61. // end_to_end count - 1, actually, so a misnomer...
  62. #define END_TO_END_COUNT  2
  63. #define FLOW_TABLE_SIZE 3000
  64. #define ARS_TABLE_SIZE          5
  65. struct ARSTabEnt {
  66.   int uid;
  67.   u_int16_t fid;
  68.   int hopsEarly; /* 0 overloads as invalid */
  69. };
  70. class ARSTable {
  71.  public:
  72.   ARSTable(int size_ = ARS_TABLE_SIZE);
  73.   ~ARSTable();
  74.   void insert(int uid, u_int16_t fid, int hopsEarly);
  75.   int  findAndClear(int uid, u_int16_t fid);
  76.  private:
  77.   ARSTabEnt *table;
  78.   int victim;
  79.   int size;
  80. };
  81. struct DRTabEnt { /* Default Route Table Entry */
  82.   nsaddr_t src;
  83.   nsaddr_t dst;
  84.   u_int16_t fid;
  85. };
  86. class DRTable {
  87.   public:
  88.     DRTable(int size_=FLOW_TABLE_SIZE);
  89.     ~DRTable();
  90.     bool find(nsaddr_t src, nsaddr_t dst, u_int16_t &flow);
  91.     void insert(nsaddr_t src, nsaddr_t dst, u_int16_t flow);
  92.     void flush(nsaddr_t src, nsaddr_t dst);
  93.   private:
  94.     int       size;
  95.     int       maxSize;
  96.     DRTabEnt *table;
  97.     void grow();
  98. };
  99. struct TableEntry {
  100.     // The following three are a key
  101.     nsaddr_t   sourceIP ; // Source IP Addresss
  102.     nsaddr_t   destinationIP ; // Destination IP Addresss
  103.     u_int16_t  flowId ; // 16bit flow id
  104.     // Ugly hack for supporting the "established end-to-end" concept
  105.     int count ; // starts from 0 and when it reaches 
  106. // END_TO_END_COUNT it means that the 
  107. // flow has been established end to end.
  108.     nsaddr_t nextHop; // According to the draft, this is a MUST.
  109. // Obviously, said info is also in sourceRoute,
  110. // but keeping it separate makes my life easier,
  111. // and does so for free. -- ych 5/5/01
  112.     Time   lastAdvRt;  // Last time this route was "advertised"
  113. // advertisements are essentially source routed
  114. // packets.
  115.     Time   timeout ;  // MUST : Timeout of this flowtable entry
  116.     int hopCount ;  // MUST : Hop count
  117.     int expectedTTL ; // MUST : Expected TTL
  118.     bool allowDefault ; // MUST : If true then this flow
  119. // can be used as default if the 
  120. // source is this node and the 
  121. // flow ID is odd.
  122. // Default is 'false' 
  123.     Path  sourceRoute ; // SHOULD : The complete source route.
  124. // Nodes not keeping complete source 
  125. // route information cannot
  126. // participate in Automatic Route
  127. // Shortening
  128. };
  129. class FlowTable
  130. {
  131.   public :
  132.     FlowTable(int size_=FLOW_TABLE_SIZE);
  133.     ~FlowTable();
  134.     // Returns a pointer to the entry corresponding to
  135.     // the index that has been passed.
  136.     TableEntry &operator[](int index);
  137.     // Returns the index number for that entry or -1 
  138.     // if it is not found
  139.     int find(nsaddr_t source, 
  140.      nsaddr_t destination, 
  141.      u_int16_t flow);
  142.     // If there is an entry corresponding to the arguments of this
  143.     // function then the index corresponding to that entry is
  144.     // returned; returns -1 on error
  145.     int find(nsaddr_t source, 
  146.      nsaddr_t destination, 
  147.      const Path& route);
  148.     // Returns index number if successfully created, 
  149.     // else returns -1 ( if entry already exists )
  150.     // or if memory problem.
  151.     int createEntry(nsaddr_t source, 
  152.     nsaddr_t destination, 
  153.     u_int16_t flow);
  154.     // If there is a default flow id corresponding to the source and
  155.     // destination addresses passed in the argument then return the index
  156.     bool defaultFlow(nsaddr_t source, nsaddr_t destination, u_int16_t &flow);
  157.     // Generates the next flow id keeping in mind that default flow
  158.     // ids are odd and non-default ones are even.
  159.     u_int16_t generateNextFlowId(nsaddr_t destination, 
  160.  bool allowDefault) ;
  161.     // Purge all the flows which uses the link from 'from' to 'to'
  162.     void noticeDeadLink(const ID& from, const ID& to) ;
  163.     // promise not to hold indexes into flow table across cleanup()s.
  164.     void cleanup();
  165.     // set our net address, for noticeDeadLink()
  166.     void setNetAddr(nsaddr_t net_id);
  167.   private :
  168.     TableEntry *table ; // Actual flow state table
  169.     int size ; // Number of entries in the table
  170.     int  maxSize ; // Maximum possible size
  171.     u_int16_t   counter; // next flowid to give out
  172.     nsaddr_t    net_addr; // for noticeDeadLink()
  173.     DRTable     DRTab;
  174.     void grow();
  175. };
  176. #endif // __flow_table_h__