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

通讯编程

开发平台:

Visual C++

  1. /* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- 
  2.  *
  3.  * Copyright (c) 1997-2000 Regents of the University of California.
  4.  * All rights reserved.
  5.  *
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  * 1. Redistributions of source code must retain the above copyright
  10.  *    notice, this list of conditions and the following disclaimer.
  11.  * 2. Redistributions in binary form must reproduce the above copyright
  12.  *    notice, this list of conditions and the following disclaimer in the
  13.  *    documentation and/or other materials provided with the distribution.
  14.  * 3. All advertising materials mentioning features or use of this software
  15.  *    must display the following acknowledgement:
  16.  * This product includes software developed by the Computer Systems
  17.  * Engineering Group at Lawrence Berkeley Laboratory.
  18.  * 4. Neither the name of the University nor of the Laboratory may be used
  19.  *    to endorse or promote products derived from this software without
  20.  *    specific prior written permission.
  21.  *
  22.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  23.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  24.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  25.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  26.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  27.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  28.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  29.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  30.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  31.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  32.  * SUCH DAMAGE.
  33.  *
  34.  * $Header: /cvsroot/nsnam/ns-2/common/node.h,v 1.33 2002/05/30 17:44:03 haldar Exp $
  35.  */
  36. /*
  37.  * XXX GUIDELINE TO ADDING FUNCTIONALITY TO THE BASE NODE
  38.  *
  39.  * One should not add something specific to one particular routing module 
  40.  * into the base node, which is shared by all modules in ns. Otherwise you 
  41.  * bloat other people's simulations.
  42.  */
  43. /*
  44.  * CMU-Monarch project's Mobility extensions ported by Padma Haldar, 
  45.  * 10/98.
  46.  */
  47.  
  48. #ifndef __ns_node_h__
  49. #define __ns_node_h__
  50. #include "connector.h"
  51. #include "object.h"
  52. #include "lib/bsd-list.h"
  53. #include "phy.h"
  54. #include "net-interface.h"
  55. #include "energy-model.h"
  56. #include "location.h"
  57. #include "rtmodule.h"
  58. class NixNode;
  59. class LinkHead;
  60. LIST_HEAD(linklist_head, LinkHead); // declare list head structure 
  61. /*
  62.  * The interface between a network stack and the higher layers.
  63.  * This is analogous to the OTcl Link class's "head_" object.
  64.  * XXX This object should provide a uniform API across multiple link objects;
  65.  * right now it is a placeholder.  See satlink.h for now.  It is declared in
  66.  * node.h for now since all nodes have a linked list of LinkHeads.
  67.  */
  68. #include "parentnode.h"
  69. class Node;
  70. class NetworkInterface;
  71. class RoutingModule;
  72. class LinkHead : public Connector {
  73. public:
  74. LinkHead(); 
  75. // API goes here
  76. Node* node() { return node_; }
  77. int type() { return type_; }
  78. int32_t label();
  79. // Future API items could go here 
  80. // list of all networkinterfaces on a node
  81. inline void insertlink(struct linklist_head *head) {
  82.                 LIST_INSERT_HEAD(head, this, link_entry_);
  83.         }
  84.         LinkHead* nextlinkhead(void) const { return link_entry_.le_next; }
  85. protected:
  86. virtual int command(int argc, const char*const* argv);
  87. NetworkInterface* net_if_; // Each link has a Network Interface
  88. Node* node_; // Pointer to node object
  89. int type_; // Type of link
  90. // Each node has a linked list of link heads
  91. LIST_ENTRY(LinkHead) link_entry_;
  92. };
  93. LIST_HEAD(node_head, Node); // declare list head structure 
  94. //declare the neighbor list structure
  95. //added for pushback, but should be useful otherwise also.
  96. //there was something here which was moved to energy model. 
  97. //since that work is in flux, i am not meddling with it.
  98. struct neighbor_list_node {
  99. int nodeid;
  100. neighbor_list_node* next;
  101. };
  102. // Size of the buffer for dumping nam traces.
  103. const int NODE_NAMLOG_BUFSZ = 256;
  104. //routing module node used for creating rtg module list
  105. struct rtm_node {
  106. RoutingModule* rtm;
  107. rtm_node* next;
  108. };
  109. class Node : public ParentNode {
  110. public:
  111. Node(void);
  112. ~Node();
  113. inline int address() { return address_;}
  114. inline int nodeid() { return nodeid_;}
  115. inline bool exist_namchan() const { return (namChan_ != 0); }
  116. virtual int command(int argc, const char*const* argv);
  117. virtual void namlog(const char *fmt, ...);
  118. NsObject* intf_to_target(int32_t); 
  119. static struct node_head nodehead_;  // static head of list of nodes
  120. inline void insert(struct node_head* head) {
  121. LIST_INSERT_HEAD(head, this, entry);
  122. }
  123. inline Node* nextnode() { return entry.le_next; }
  124. // The remaining objects handle a (static) linked list of nodes
  125. // Used by Tom's satallite code and the wireless code
  126. inline const struct if_head& ifhead() const { return ifhead_; }
  127. inline const struct linklist_head& linklisthead() const { 
  128. return linklisthead_; 
  129. }
  130. //neighbor list maintenance
  131. neighbor_list_node* neighbor_list_;
  132. void addNeighbor(Node *node);
  133. static Node* get_node_by_address(nsaddr_t);
  134. //routines for supporting routing
  135. void route_notify (RoutingModule *rtm);
  136. void unreg_route_notify(RoutingModule *rtm);
  137. void add_route (char *dst, NsObject *target);
  138. void delete_route (char *dst, NsObject *nullagent);
  139. void set_table_size(int nn);
  140. void set_table_size(int level, int csize);
  141. protected:
  142. LIST_ENTRY(Node) entry;  // declare list entry structure
  143. int address_;
  144. int nodeid_;   // for nam use
  145. // Nam tracing facility
  146.         Tcl_Channel namChan_;
  147. // Single thread ns, so we can use one global storage for all 
  148. // node objects
  149. static char nwrk_[NODE_NAMLOG_BUFSZ];
  150. void namdump();
  151. struct if_head ifhead_; // list of phys for this node
  152. struct linklist_head linklisthead_; // list of link heads on node
  153. // pointer to head of rtmodule chain
  154. RoutingModule* rtnotif_;
  155. #ifdef HAVE_STL
  156. NixNode* nixnode_;   // used for nix routing (on-demand source routing for simulator performance)
  157. #endif /* STL */
  158. public:
  159. // XXX Energy related stuff. Should be moved later to a wireless 
  160. // routing plugin module instead of sitting here.
  161. inline EnergyModel* energy_model() { return energy_model_; }
  162. inline Location* location() { return location_; }
  163. protected:
  164. EnergyModel* energy_model_;
  165. // XXX Currently this is a placeholder only. It is supposed to 
  166. // hold the position-related stuff in MobileNode. Yet another 
  167. // 'Under Construction' sign :(
  168. Location* location_;
  169. };
  170. #endif /* __ns_node_h__ */