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

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * iflist.h
  3.  * Copyright (C) 2000 by the University of Southern California
  4.  * $Id: iflist.h,v 1.5 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. /**********************************************************/
  46. /* iflist.h : Chalermek Intanagonwiwat (USC/ISI) 06/25/99 */
  47. /**********************************************************/
  48. #ifndef ns_iflist_h
  49. #define ns_iflist_h
  50. #include <stdio.h>
  51. #include "config.h"
  52. #define INTF_INSERT(x,y)  x->InsertFront((Agent_List **)&x, (Agent_List *)y)
  53. #define INTF_REMOVE(x,y)  y->Remove(x,y)
  54. #define INTF_FIND(x,y)    x->Find((Agent_List **)&x, y)
  55. #define INTF_FREEALL(x)   x->FreeAll((Agent_List **)&x)
  56. #define INTF_UNION(x,y)   x->Union((Agent_List **)&x, (Agent_List *)y)
  57. #define AGENT_NEXT(x)     x->next
  58. #define FROM_NEXT(x)      (From_List *)(x->next)
  59. #define OUT_NEXT(x)       (Out_List *)(x->next)
  60. #define IN_NEXT(x)        (In_List *)(x->next)
  61. #define AGT_ADDR(x)       x->agent_addr
  62. #define NODE_ADDR(x)      x->agent_addr.addr_
  63. #define PORT(x)           x->agent_addr.port_
  64. #define RANK(x)           ((From_List *)x)->rank
  65. #define IS_SINK(x)        ((From_List *)x)->is_sink
  66. #define GRADIENT(x)       ((Out_List *)x)->gradient
  67. #define GRAD_TMOUT(x)     ((Out_List *)x)->timeout
  68. #define FROM_SLOT(x)      ((Out_List *)x)->from
  69. #define TO_SLOT(x)        ((Out_List *)x)->to
  70. #define NUM_DATA_SEND(x)       ((Out_List *)x)->num_data_send
  71. #define NUM_NEG_RECV(x)       ((Out_List *)x)->num_neg_recv
  72. #define NUM_POS_RECV(x)       ((Out_List *)x)->num_pos_recv
  73. #define NUM_POS_SEND(x)   ((In_List *)x)->num_pos_send
  74. #define NUM_NEG_SEND(x)   ((In_List *)x)->num_neg_send
  75. #define LAST_TS_NEW_SUB(x) ((In_List *)x)->last_ts_new_sub
  76. #define NEW_SUB_RECV(x)   ((In_List *)x)->new_sub_recv
  77. #define NEW_ORG_RECV(x)   ((In_List *)x)->new_org_recv
  78. #define OLD_ORG_RECV(x)   ((In_List *)x)->old_org_recv
  79. #define TOTAL_NEW_SUB_RECV(x)   ((In_List *)x)->total_new_sub_recv
  80. #define TOTAL_NEW_ORG_RECV(x)   ((In_List *)x)->total_new_org_recv
  81. #define TOTAL_OLD_ORG_RECV(x)   ((In_List *)x)->total_old_org_recv
  82. #define TOTAL_RECV(x)     ((In_List *)x)->total_received
  83. #define PREV_RECV(x)      ((In_List *)x)->prev_received
  84. #define NUM_LOSS(x)       ((In_List *)x)->num_loss
  85. #define AVG_DELAY(x)      ((In_List *)x)->avg_delay
  86. #define VAR_DELAY(x)      ((In_List *)x)->var_delay
  87. #define WHERE_TO_GO(x)    x->WhereToGo()
  88. #define FIND_MAX_IN(x)    x->FindMaxIn()
  89. #define CAL_RANGE(x)      x->CalRange()
  90. #define NORMALIZE(x)      x->NormalizeGradient()
  91. class Agent_List;
  92. class PrvCurPtr {
  93. public:
  94.   Agent_List **prv;
  95.   Agent_List *cur;
  96. };
  97. class Agent_List {
  98. public:
  99.   ns_addr_t agent_addr;
  100.   Agent_List *next;
  101.   Agent_List() { 
  102.     next = NULL; 
  103.     agent_addr.addr_=0;
  104.     agent_addr.port_=0;
  105.   }
  106.   virtual ~Agent_List () {}
  107.   
  108.   void InsertFront(Agent_List **, Agent_List *);
  109.   void Remove(Agent_List **, Agent_List *);
  110.   PrvCurPtr Find(Agent_List **, ns_addr_t);
  111.   void FreeAll(Agent_List **);
  112.   void Union(Agent_List **, Agent_List *);
  113.   virtual void print();
  114. };
  115. class From_List : public Agent_List {
  116. public:
  117.   int rank;
  118.   bool  is_sink;
  119.   From_List() : Agent_List() { rank = 0; is_sink = false; }
  120.   virtual ~From_List () {}
  121. };
  122. class Out_List : public From_List {
  123. public:
  124.   float gradient;
  125.   double timeout;
  126.   double   from;
  127.   double   to;
  128.   int   num_data_send;
  129.   int   num_neg_recv;
  130.   int   num_pos_recv;
  131.   Out_List() : From_List() { gradient = 0; from=0.0; to=0.0; num_data_send=0; 
  132.                              timeout = 0.0; num_neg_recv = 0; num_pos_recv=0;}
  133.   virtual ~Out_List () {}
  134.   Out_List *WhereToGo();
  135.   void CalRange();
  136.   void NormalizeGradient();
  137. };
  138. class In_List : public Agent_List {
  139. public:
  140.   double avg_delay;
  141.   double var_delay;
  142.   int    total_received;
  143.   int    prev_received;
  144.   int    num_loss;
  145.   int    num_neg_send;
  146.   int    num_pos_send;
  147.   int    total_new_org_recv;
  148.   int    total_old_org_recv;
  149.   int    total_new_sub_recv;
  150.   int    new_org_recv;        // for simple mode. New original sample counter.
  151.   int    old_org_recv;        // for simple mode. Old original sample counter.
  152.   int    new_sub_recv;        // for simple mode. New subsample counter.
  153.   double last_ts_new_sub;     // Last timestamp in receiving a new subsample.
  154.   In_List() : Agent_List() { 
  155.     avg_delay =0; 
  156.     var_delay =0; 
  157.     total_received=0;
  158.     prev_received =0; 
  159.     num_loss =0; 
  160.     num_neg_send = 0;
  161.     num_pos_send = 0;
  162.     total_new_org_recv=0;
  163.     total_old_org_recv=0;
  164.     total_new_sub_recv=0; 
  165.     new_org_recv=0;
  166.     old_org_recv=0;
  167.     new_sub_recv=0; 
  168.     last_ts_new_sub = -1.0;
  169.   }
  170.   virtual ~In_List () {}
  171.   In_List *FindMaxIn();
  172. };
  173. #endif
  174. /* Example 
  175. void main () {
  176.   From_List *start, *cur;
  177.   start=NULL;
  178.   cur = new From_List;
  179.   cur->agent_addr.addr_ =1;
  180.   cur->agent_addr.port_ =1;
  181.   INTF_INSERT(start,cur);
  182.   cur = new From_List;
  183.   cur->agent_addr.addr_ = 3;
  184.   cur->agent_addr.port_ = 3;
  185.   INTF_INSERT(start,cur);
  186.   cur = new From_List;
  187.   cur->agent_addr.addr_ = 5;
  188.   cur->agent_addr.port_ = 5;
  189.   INTF_INSERT(start,cur);
  190.   start->print();
  191.   PrvCurPtr RetVal;
  192.   ns_addr_t fnd_addr;
  193.   fnd_addr.addr_ = 1;
  194.   fnd_addr.port_ = 1;
  195.   RetVal= INTF_FIND(start, fnd_addr);
  196.   INTF_REMOVE(RetVal.prv, RetVal.cur);
  197.   start->print();
  198. }
  199. */