00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #ifndef lint
00038 static const char rcsid[] =
00039 "@(#) $Header: /nfs/jade/vint/CVSROOT/ns-2/satellite/satnode.cc,v 1.8 2001/11/06 06:21:47 tomh Exp $";
00040 #endif
00041
00042 #include "satnode.h"
00043 #include "satlink.h"
00044 #include "sattrace.h"
00045 #include "sathandoff.h"
00046 #include "satposition.h"
00047
00048 static class SatNodeClass : public TclClass {
00049 public:
00050 SatNodeClass() : TclClass("Node/SatNode") {}
00051 TclObject* create(int , const char*const* ) {
00052 return (new SatNode);
00053 }
00054 } class_satnode;
00055
00056 #define MAXSATNODELIST 64 // Assume 64 nodes to start-- dynamically increases
00057 int* SatNode::satnodelist_ = NULL;
00058 int SatNode::maxsatnodelist_ = 0;
00059 int SatNode::dist_routing_ = 0;
00060
00061 SatNode::SatNode() : ragent_(0), trace_(0), hm_(0)
00062 {
00063 bind_bool("dist_routing_", &dist_routing_);
00064 }
00065
00066 int SatNode::command(int argc, const char*const* argv) {
00067 Tcl& tcl = Tcl::instance();
00068 if (argc == 2) {
00069 if (strcmp(argv[1], "set_downlink") == 0) {
00070 if (downlink_ != NULL) {
00071 tcl.result(downlink_->name());
00072 return (TCL_OK);
00073 }
00074 } else if (strcmp(argv[1], "set_uplink") == 0) {
00075 if (downlink_ != NULL) {
00076 tcl.result(uplink_->name());
00077 return (TCL_OK);
00078 }
00079 } else if (strcmp(argv[1], "start_handoff") == 0) {
00080 if (hm_)
00081 hm_->start();
00082 else {
00083 printf("Error: starting non-existent ");
00084 printf("handoff mgr\n");
00085 exit(1);
00086 }
00087 return (TCL_OK);
00088 } else if (strcmp(argv[1], "dump_sats") == 0) {
00089 dumpSats();
00090 return (TCL_OK);
00091 }
00092 }
00093 if (argc == 3) {
00094 if (strcmp(argv[1], "set_uplink") == 0) {
00095 uplink_ = (SatChannel *) TclObject::lookup(argv[2]);
00096 if (uplink_ == 0) {
00097 tcl.resultf("no such object %s", argv[2]);
00098 return (TCL_ERROR);
00099 }
00100 return (TCL_OK);
00101 } else if (strcmp(argv[1], "set_downlink") == 0) {
00102 downlink_ = (SatChannel *) TclObject::lookup(argv[2]);
00103 if (downlink_ == 0) {
00104 tcl.resultf("no such object %s", argv[2]);
00105 return (TCL_ERROR);
00106 }
00107 return (TCL_OK);
00108 } else if (strcmp(argv[1], "set_trace") == 0) {
00109 trace_ = (SatTrace *) TclObject::lookup(argv[2]);
00110 if (trace_ == 0) {
00111 tcl.resultf("no such object %s", argv[2]);
00112 return (TCL_ERROR);
00113 }
00114 return (TCL_OK);
00115 } else if (strcmp(argv[1], "set_ragent") == 0) {
00116 ragent_ = (SatRouteAgent *) TclObject::lookup(argv[2]);
00117 if (ragent_ == 0) {
00118 tcl.resultf("no such object %s", argv[2]);
00119 return (TCL_ERROR);
00120 }
00121 return (TCL_OK);
00122 } else if(strcmp(argv[1], "addif") == 0) {
00123 SatPhy* n = (SatPhy*) TclObject::lookup(argv[2]);
00124 if(n == 0)
00125 return TCL_ERROR;
00126 n->insertnode(&ifhead_);
00127 n->setnode(this);
00128 return TCL_OK;
00129 } else if (strcmp(argv[1], "set_position") == 0) {
00130 pos_ = (SatPosition*) TclObject::lookup(argv[2]);
00131 if (pos_ == 0) {
00132 tcl.resultf("no such object %s", argv[2]);
00133 return (TCL_ERROR);
00134 }
00135 return (TCL_OK);
00136 } else if (strcmp(argv[1], "set_handoff_mgr") == 0) {
00137 hm_ = (LinkHandoffMgr*) TclObject::lookup(argv[2]);
00138 if (hm_ == 0) {
00139 tcl.resultf("no such object %s", argv[2]);
00140 return (TCL_ERROR);
00141 }
00142 return (TCL_OK);
00143 } else if (strcmp(argv[1], "set_address") == 0) {
00144 addNode(atoi(argv[2]));
00145 return (TCL_OK);
00146 }
00147 }
00148 return (Node::command(argc, argv));
00149 }
00150
00151 int SatNode::addNode(int nodenum)
00152 {
00153 if (maxsatnodelist_ == 0) {
00154 satnodelist_ = new int[MAXSATNODELIST];
00155 memset(satnodelist_, 0, MAXSATNODELIST * sizeof(satnodelist_));
00156 maxsatnodelist_ = MAXSATNODELIST;
00157 }
00158 assert(nodenum < 2*maxsatnodelist_);
00159 if (nodenum >= maxsatnodelist_) {
00160
00161 int i;
00162 int* temp = new int[2 * maxsatnodelist_];
00163 memset(temp, 0, 2 * maxsatnodelist_ * sizeof(temp));
00164 for (i = 0; i < maxsatnodelist_; i++) {
00165 temp[i] = satnodelist_[i];
00166 }
00167 delete [] satnodelist_;
00168 satnodelist_ = temp;
00169 maxsatnodelist_ *= 2;
00170 }
00171 satnodelist_[nodenum] = 1;
00172 return 0;
00173 }
00174
00175 int SatNode::IsASatNode(int nodenum)
00176 {
00177 if (nodenum > maxsatnodelist_) {
00178 printf("Error: IsASatNode() nodenum %d greater than maxsatnodelist_ %d\n", nodenum, maxsatnodelist_);
00179 exit(1);
00180 }
00181 return satnodelist_[nodenum];
00182 }
00183
00184
00185
00186 void SatNode::dumpSats()
00187 {
00188 SatNode *snodep, *peer_snodep;
00189 SatPosition *sposp, *peer_sposp;
00190 PolarSatPosition *polar_sposp;
00191 SatLinkHead *slhp;
00192 int linktype;
00193
00194 printf("\nDumping satellites at time %.2f\n\n", NOW);
00195 for (snodep= (SatNode*) Node::nodehead_.lh_first; snodep;
00196 snodep = (SatNode*) snodep->nextnode()) {
00197 if (!SatNode::IsASatNode(snodep->address()))
00198 continue;
00199 sposp = snodep->position();
00200 printf("%d\t%.2f\t%.2f", snodep->address(),
00201 RAD_TO_DEG(SatGeometry::get_latitude(sposp->coord())),
00202 RAD_TO_DEG(SatGeometry::get_longitude(sposp->coord())));
00203
00204 if (sposp->type()==POSITION_SAT_POLAR) {
00205 polar_sposp = (PolarSatPosition*) snodep->position();
00206 printf ("\t%d", polar_sposp->plane());
00207 } else if (sposp->type()==POSITION_SAT_GEO) {
00208 printf ("\tGEO");
00209 } else if (sposp->type()==POSITION_SAT_TERM) {
00210 printf ("\tTERM");
00211 }
00212 printf("\n");
00213 }
00214 printf("\n");
00215
00216
00217 printf("Links:\n");
00218 for (snodep = (SatNode*) Node::nodehead_.lh_first; snodep;
00219 snodep = (SatNode*) snodep->nextnode()) {
00220 if (!SatNode::IsASatNode(snodep->address()))
00221 continue;
00222
00223 for (slhp = (SatLinkHead*) snodep->linklisthead_.lh_first;
00224 slhp; slhp = (SatLinkHead*) slhp->nextlinkhead() ) {
00225 linktype = slhp->type();
00226 if (linktype == LINK_GENERIC)
00227 continue;
00228 if (!slhp->linkup_)
00229 continue;
00230
00231
00232 sposp = snodep->position();
00233 peer_snodep = hm_->get_peer(slhp);
00234 if (peer_snodep == 0)
00235 continue;
00236
00237 peer_sposp = peer_snodep->position();
00238 printf("%.2f\t%.2f\t%.2f\t%.2f\t%d\n",
00239 RAD_TO_DEG(SatGeometry::get_latitude(sposp->coord())),
00240 RAD_TO_DEG(SatGeometry::get_longitude(sposp->coord())),
00241 RAD_TO_DEG(SatGeometry::get_latitude(peer_sposp->coord())),
00242 RAD_TO_DEG(SatGeometry::get_longitude(peer_sposp->coord())),
00243 linktype);
00244 }
00245 }
00246 printf("\nDumped satellites at time %.2f\n\n", NOW);
00247 }