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

通讯编程

开发平台:

Visual C++

  1. /* -*-  Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
  2. /*
  3.  * Copyright (c) 1999 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 MASH Research
  17.  *      Group at the University of California Berkeley.
  18.  * 4. Neither the name of the University nor of the Research Group may be
  19.  *    used 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.  * Contributed by Tom Henderson, UCB Daedalus Research Group, June 1999
  35.  */
  36. #ifndef lint
  37. static const char rcsid[] =
  38.     "@(#) $Header: /cvsroot/nsnam/ns-2/satellite/satnode.cc,v 1.8 2001/11/06 06:21:47 tomh Exp $";
  39. #endif
  40. #include "satnode.h"
  41. #include "satlink.h"
  42. #include "sattrace.h"
  43. #include "sathandoff.h"
  44. #include "satposition.h"
  45. static class SatNodeClass : public TclClass {
  46. public:
  47. SatNodeClass() : TclClass("Node/SatNode") {}
  48. TclObject* create(int , const char*const* ) {
  49. return (new SatNode);
  50. }
  51. } class_satnode;
  52. #define MAXSATNODELIST 64 // Assume 64 nodes to start-- dynamically increases
  53. int* SatNode::satnodelist_ = NULL;
  54. int SatNode::maxsatnodelist_ = 0;
  55. int SatNode::dist_routing_ = 0;
  56. SatNode::SatNode() : ragent_(0), trace_(0), hm_(0)  
  57. {
  58. bind_bool("dist_routing_", &dist_routing_);
  59. }
  60. int SatNode::command(int argc, const char*const* argv) {     
  61. Tcl& tcl = Tcl::instance();
  62. if (argc == 2) {
  63. if (strcmp(argv[1], "set_downlink") == 0) {
  64. if (downlink_ != NULL) {
  65. tcl.result(downlink_->name());
  66. return (TCL_OK);
  67. }
  68. } else if (strcmp(argv[1], "set_uplink") == 0) {
  69. if (downlink_ != NULL) {
  70. tcl.result(uplink_->name());
  71. return (TCL_OK);
  72. }
  73. } else if (strcmp(argv[1], "start_handoff") == 0) {
  74. if (hm_)
  75. hm_->start();
  76. else {
  77. printf("Error: starting non-existent ");
  78. printf("handoff mgrn");
  79. exit(1);
  80. }
  81. return (TCL_OK);
  82. } else if (strcmp(argv[1], "dump_sats") == 0) {
  83. dumpSats();
  84. return (TCL_OK);
  85. }
  86. }
  87. if (argc == 3) {
  88. if (strcmp(argv[1], "set_uplink") == 0) {
  89. uplink_ = (SatChannel *) TclObject::lookup(argv[2]);
  90. if (uplink_ == 0) {
  91. tcl.resultf("no such object %s", argv[2]);
  92. return (TCL_ERROR);
  93. }
  94. return (TCL_OK);
  95. } else if (strcmp(argv[1], "set_downlink") == 0) {
  96. downlink_ = (SatChannel *) TclObject::lookup(argv[2]);
  97. if (downlink_ == 0) {
  98. tcl.resultf("no such object %s", argv[2]);
  99. return (TCL_ERROR);
  100. }
  101. return (TCL_OK);
  102. } else if (strcmp(argv[1], "set_trace") == 0) {
  103. trace_ = (SatTrace *) TclObject::lookup(argv[2]);
  104. if (trace_ == 0) {
  105. tcl.resultf("no such object %s", argv[2]);
  106. return (TCL_ERROR);
  107. }
  108. return (TCL_OK);
  109. } else if (strcmp(argv[1], "set_ragent") == 0) {
  110. ragent_ = (SatRouteAgent *) TclObject::lookup(argv[2]);
  111. if (ragent_ == 0) {
  112. tcl.resultf("no such object %s", argv[2]);
  113. return (TCL_ERROR);
  114. }
  115. return (TCL_OK);
  116. } else if(strcmp(argv[1], "addif") == 0) {
  117.                         SatPhy* n = (SatPhy*) TclObject::lookup(argv[2]);
  118.                         if(n == 0)
  119.                                 return TCL_ERROR; 
  120.                         n->insertnode(&ifhead_);
  121.                         n->setnode(this);
  122.                         return TCL_OK;
  123. } else if (strcmp(argv[1], "set_position") == 0) {
  124. pos_ = (SatPosition*) TclObject::lookup(argv[2]);
  125. if (pos_ == 0) {
  126. tcl.resultf("no such object %s", argv[2]);
  127. return (TCL_ERROR);
  128. }
  129. return (TCL_OK);
  130. } else if (strcmp(argv[1], "set_handoff_mgr") == 0) {
  131. hm_ = (LinkHandoffMgr*) TclObject::lookup(argv[2]);
  132. if (hm_ == 0) {
  133. tcl.resultf("no such object %s", argv[2]);
  134. return (TCL_ERROR);
  135. }
  136. return (TCL_OK);
  137. } else if (strcmp(argv[1], "set_address") == 0) {
  138. addNode(atoi(argv[2]));
  139. return (TCL_OK);
  140. }
  141. }
  142. return (Node::command(argc, argv));
  143. }
  144. int SatNode::addNode(int nodenum)
  145. {
  146. if (maxsatnodelist_ == 0) {
  147. satnodelist_ = new int[MAXSATNODELIST];
  148. memset(satnodelist_, 0, MAXSATNODELIST * sizeof(satnodelist_));
  149. maxsatnodelist_ = MAXSATNODELIST;
  150. }
  151. assert(nodenum < 2*maxsatnodelist_);
  152. if (nodenum >= maxsatnodelist_) {
  153. // Double size of array
  154. int i;
  155. int* temp = new int[2 * maxsatnodelist_];
  156. memset(temp, 0, 2 * maxsatnodelist_ * sizeof(temp));
  157. for (i = 0; i < maxsatnodelist_; i++) {
  158. temp[i] = satnodelist_[i];
  159. }
  160. delete [] satnodelist_;
  161. satnodelist_ = temp;
  162. maxsatnodelist_ *= 2;
  163. }
  164. satnodelist_[nodenum] = 1;
  165. return 0;
  166. }
  167. int SatNode::IsASatNode(int nodenum)
  168. {
  169. if (nodenum > maxsatnodelist_) {
  170. printf("Error: IsASatNode() nodenum %d greater than maxsatnodelist_ %dn", nodenum, maxsatnodelist_);
  171. exit(1);
  172. }
  173. return satnodelist_[nodenum];
  174. }
  175. // debugging method for dumping out all of the satellite and ISL locations
  176. // on demand from OTcl.
  177. void SatNode::dumpSats()
  178. {
  179. SatNode *snodep, *peer_snodep;
  180. SatPosition *sposp, *peer_sposp;
  181. PolarSatPosition *polar_sposp;
  182. SatLinkHead *slhp;
  183. int linktype;
  184.         printf("nDumping satellites at time %.2fnn", NOW);
  185.         for (snodep= (SatNode*) Node::nodehead_.lh_first; snodep; 
  186. snodep = (SatNode*) snodep->nextnode()) {
  187. if (!SatNode::IsASatNode(snodep->address()))
  188. continue;
  189. sposp = snodep->position();
  190.                 printf("%dt%.2ft%.2f", snodep->address(), 
  191.     RAD_TO_DEG(SatGeometry::get_latitude(sposp->coord())), 
  192.     RAD_TO_DEG(SatGeometry::get_longitude(sposp->coord())));
  193. // If SatNode is polar, append plane information
  194. if (sposp->type()==POSITION_SAT_POLAR) {
  195. polar_sposp = (PolarSatPosition*) snodep->position();
  196. printf ("t%d", polar_sposp->plane());
  197. } else if (sposp->type()==POSITION_SAT_GEO) {
  198. printf ("tGEO");
  199. } else if (sposp->type()==POSITION_SAT_TERM) {
  200. printf ("tTERM");
  201. }
  202. printf("n");
  203. }
  204.         printf("n");
  205.         // Dump satellite links
  206.         // There is a static list of address classifiers //QQQ
  207.         printf("Links:n");
  208.         for (snodep = (SatNode*) Node::nodehead_.lh_first; snodep; 
  209. snodep = (SatNode*) snodep->nextnode()) {
  210. if (!SatNode::IsASatNode(snodep->address()))
  211. continue;
  212. // XXX Not all links necessarily satlinks
  213. for (slhp = (SatLinkHead*) snodep->linklisthead_.lh_first; 
  214.     slhp; slhp = (SatLinkHead*) slhp->nextlinkhead() ) {
  215. linktype = slhp->type();
  216.                  if (linktype == LINK_GENERIC)
  217.                          continue;
  218. if (!slhp->linkup_)
  219. continue;
  220.                         // Link is up.
  221. // Print out source and dest coordinates.
  222. sposp = snodep->position();
  223. peer_snodep = hm_->get_peer(slhp);
  224. if (peer_snodep == 0)
  225. continue; // this link interface is not attached
  226. // need something in here for txs.
  227. peer_sposp = peer_snodep->position();
  228.                         printf("%.2ft%.2ft%.2ft%.2ft%dn", 
  229.  RAD_TO_DEG(SatGeometry::get_latitude(sposp->coord())),
  230.  RAD_TO_DEG(SatGeometry::get_longitude(sposp->coord())),
  231.  RAD_TO_DEG(SatGeometry::get_latitude(peer_sposp->coord())), 
  232.  RAD_TO_DEG(SatGeometry::get_longitude(peer_sposp->coord())),
  233.  linktype);
  234. }
  235. }
  236. printf("nDumped satellites at time %.2fnn", NOW);
  237. }