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

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * dsragent.h
  3.  * Copyright (C) 2000 by the University of Southern California
  4.  * $Id: dsragent.h,v 1.10 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 noted when applicable.
  46. //
  47. // Ported from CMU/Monarch's code, appropriate copyright applies.  
  48. /* -*- c++ -*-
  49.    dsragent.h
  50.    */
  51. #ifndef _DSRAgent_h
  52. #define _DSRAgent_h
  53. class DSRAgent;
  54. #include <stdarg.h>
  55. #include <object.h>
  56. #include <agent.h>
  57. #include <trace.h>
  58. #include <packet.h>
  59. #include <dsr-priqueue.h>
  60. #include <mac.h>
  61. #include <mobilenode.h>
  62. #include "path.h"
  63. #include "srpacket.h"
  64. #include "routecache.h"
  65. #include "requesttable.h"
  66. #include "flowstruct.h"
  67. #define BUFFER_CHECK 0.03 // seconds between buffer checks
  68. #define RREQ_JITTER 0.010 // seconds to jitter broadcast route requests
  69. #define SEND_TIMEOUT 30.0 // # seconds a packet can live in sendbuf
  70. #define SEND_BUF_SIZE 64
  71. #define RTREP_HOLDOFF_SIZE 10
  72. #define GRAT_ROUTE_ERROR 0 // tell_addr indicating a grat route err
  73. #define DSR_FILTER_TAP /* process a packet only once via the tap */
  74. class ArpCallbackClass;
  75. struct RtRepHoldoff {
  76.   ID requestor;
  77.   ID requested_dest;
  78.   int best_length;
  79.   int our_length;
  80. };
  81. struct SendBufEntry {
  82.   Time t; // insertion time
  83.   SRPacket p;
  84. };
  85. struct GratReplyHoldDown {
  86.   Time t;
  87.   Path p;
  88. };
  89. class SendBufferTimer : public TimerHandler {
  90. public:
  91.   SendBufferTimer(DSRAgent *a) : TimerHandler() { a_ = a;}
  92.   void expire(Event *e);
  93. protected:
  94.   DSRAgent *a_;
  95. };
  96. LIST_HEAD(DSRAgent_List, DSRAgent);
  97. class DSRAgent : public Tap, public Agent {
  98. public:
  99.   virtual int command(int argc, const char*const* argv);
  100.   virtual void recv(Packet*, Handler* callback = 0);
  101.   void tap(const Packet *p);
  102.   // tap out all data packets received at this host and promiscously snoop
  103.   // them for interesting tidbits
  104.   void Terminate(void);
  105. // called at the end of the simulation to purge all packets
  106.   void sendOutBCastPkt(Packet *p);
  107.   
  108.   DSRAgent();
  109.   ~DSRAgent();
  110. private:
  111.   Trace *logtarget;
  112.   int off_mac_;
  113.   int off_ll_;
  114.   int off_ip_;
  115.   int off_sr_;
  116.   // will eventually need to handle multiple infs, but this is okay for
  117.   // now 1/28/98 -dam
  118.   ID net_id, MAC_id; // our IP addr and MAC addr
  119.   NsObject *ll;         // our link layer output 
  120.   CMUPriQueue *ifq; // output interface queue
  121.   Mac *mac_;
  122.   // extensions for wired cum wireless sim mode
  123.   MobileNode *node_;
  124.   int diff_subnet(ID dest, ID myid);
  125.   
  126.   // extensions for mobileIP
  127.   NsObject *port_dmux_;    // my port dmux
  128.   
  129. #ifdef DSR_FILTER_TAP
  130. #define TAP_CACHE_SIZE 1024
  131. #define TAP_BITMASK (TAP_CACHE_SIZE - 1)
  132.   /*
  133.    *  A cache of recently seen packets on the TAP so that I
  134.    *  don't process them over and over again.
  135.    */
  136.   int tap_uid_cache[TAP_CACHE_SIZE];
  137. #endif
  138.   /******** internal state ********/
  139.   RequestTable request_table;
  140.   RouteCache *route_cache;
  141.   SendBufEntry send_buf[SEND_BUF_SIZE];
  142.   SendBufferTimer send_buf_timer;
  143.   int route_request_num; // number for our next route_request
  144.   int num_heldoff_rt_replies;
  145.   RtRepHoldoff rtrep_holdoff[RTREP_HOLDOFF_SIZE]; // not used 1/27/98
  146.   GratReplyHoldDown grat_hold[RTREP_HOLDOFF_SIZE];
  147.   int grat_hold_victim;
  148.   /* for flow state ych 5/2/01 */
  149.   FlowTable flow_table;
  150.   ARSTable  ars_table;
  151.   bool route_error_held; // are we holding a rt err to propagate?
  152.   ID err_from, err_to;  // data from the last route err sent to us 
  153.   Time route_error_data_time; // time err data was filled in
  154.   /****** internal helper functions ******/
  155.   /* all handle<blah> functions either free or hand off the 
  156.      p.pkt handed to them */
  157.   void handlePktWithoutSR(SRPacket& p, bool retry);
  158.   /* obtain a source route to p's destination and send it off */
  159.   void handlePacketReceipt(SRPacket& p);
  160.   void handleForwarding(SRPacket& p);
  161.   void handleRouteRequest(SRPacket &p);
  162.   /* process a route request that isn't targeted at us */
  163.   /* flow state handle functions ych */
  164.   void handleFlowForwarding(SRPacket &p);
  165.   void handleFlowForwarding(SRPacket &p, int flowidx);
  166.   void handleDefaultForwarding(SRPacket &p);
  167.   bool ignoreRouteRequestp(SRPacket& p);
  168.   // assumes p is a route_request: answers true if it should be ignored.
  169.   // does not update the request table (you have to do that yourself if
  170.   // you want this packet ignored in the future)
  171.   void sendOutPacketWithRoute(SRPacket& p, bool fresh, Time delay = 0.0);
  172.   // take packet and send it out packet must a have a route in it
  173.   // fresh determines whether route is reset first
  174.   // time at which packet is sent is scheduled delay secs in the future
  175.   // pkt.p is freed or handed off
  176.   void sendOutRtReq(SRPacket &p, int max_prop = MAX_SR_LEN);
  177.   // turn p into a route request and launch it, max_prop of request is
  178.   // set as specified
  179.   // p.pkt is freed or handed off
  180.   void getRouteForPacket(SRPacket &p, bool retry);
  181.   /* try to obtain a route for packet
  182.      pkt is freed or handed off as needed, unless in_buffer == true
  183.      in which case they are not touched */
  184.   void acceptRouteReply(SRPacket &p);
  185.   /* - enter the packet's source route into our cache
  186.      - see if any packets are waiting to be sent out with this source route
  187.      - doesn't free the p.pkt */
  188.   void returnSrcRouteToRequestor(SRPacket &p);
  189.   // take the route in p, add us to the end of it and return the
  190.   // route to the sender of p
  191.   // doesn't free p.pkt
  192.   bool replyFromRouteCache(SRPacket &p); 
  193.   /* - see if can reply to this route request from our cache
  194.      if so, do it and return true, otherwise, return false 
  195.      - frees or hands off p.pkt i ff returns true */
  196.   void processUnknownFlowError(SRPacket &p, bool asDefault);
  197.   void processFlowARS(const Packet *packet);
  198.   // same idea as below, but for unknown flow error
  199.   void processBrokenRouteError(SRPacket& p);
  200.   // take the error packet and proccess our part of it.
  201.   // if needed, send the remainder of the errors to the next person
  202.   // doesn't free p.pkt
  203.   void sendUnknownFlow(SRPacket &p, bool asDefault, u_int16_t flowid = 0);
  204.   void xmitFailed(Packet *pkt, const char* reason = "DROP_RTR_MAC_CALLBACK");
  205.   void xmitFlowFailed(Packet *pkt, const char* reason = "DROP_RTR_MAC_CALLBACK");
  206.   /* mark our route cache reflect the failure of the link between
  207.      srh[cur_addr] and srh[next_addr], and then create a route err
  208.      message to send to the orginator of the pkt (srh[0]) 
  209.      p.pkt freed or handed off */
  210.   
  211.   void undeliverablePkt(Packet *p, int mine);
  212.   /* when we've got a packet we can't deliver, what to do with it? 
  213.      frees or hands off p if mine = 1, doesn't hurt it otherwise */
  214.   void dropSendBuff(SRPacket &p);
  215.   // log p as being dropped by the sendbuffer in DSR agent
  216.   
  217.   void stickPacketInSendBuffer(SRPacket& p);
  218.   
  219.   void sendBufferCheck();
  220.   // see if any packets in send buffer need route requests sent out
  221.   // for them, or need to be expired
  222.   void sendRouteShortening(SRPacket &p, int heard_at, int xmit_at);
  223.   // p was overheard at heard_at in it's SR, but we aren't supposed to
  224.   // get it till xmit_at, so all the nodes between heard_at and xmit_at
  225.   // can be elided.  Send originator of p a gratuitous route reply to 
  226.   // tell them this.
  227.   void testinit();
  228.   void trace(char* fmt, ...);
  229.   friend void XmitFailureCallback(Packet *pkt, void *data);
  230.   friend void XmitFlowFailureCallback(Packet *pkt, void *data);
  231.   friend int FilterFailure(Packet *p, void *data);
  232.   friend class SendBufferTimer;
  233. #if 0
  234.   void scheduleRouteReply(Time t, Packet *new_p);
  235.   // schedule a time to send new_p if we haven't heard a better
  236.   // answer in the mean time.  Do not modify new_p after calling this
  237.   void snoopForRouteReplies(Time t, Packet *p);
  238.   
  239. friend void RouteReplyHoldoffCallback(Node *node, Time time, EventData *data);
  240. #endif //0
  241.   /* the following variables are used to send end-of-sim notices to all objects */
  242. public:
  243. LIST_ENTRY(DSRAgent) link;
  244. static DSRAgent_List agthead;
  245. };
  246. #endif // _DSRAgent_h