patch2.2
来自「BCAST Implementation for NS2」· 2 代码 · 共 853 行 · 第 1/2 页
2
853 行
SimPktQ *rcv_tail; SPFtime xmt_stamp; // Transmission timestamp@@ -56,6 +108,7 @@ void rtdel(InAddr, InMask, MPath *); void add_mcache(InAddr src, InAddr group, MCache *); void del_mcache(InAddr src, InAddr group);+ virtual void upload_remnants(); char *phyname(int phyint); void sys_spflog(int code, char *buffer); void halt(int code, char *string);diff -X exclude_files -Nabur ospfd2.1/ospf_sim/sim.C ospfd2.2/ospf_sim/sim.C--- ospfd2.1/ospf_sim/sim.C Thu Apr 19 17:50:50 2001+++ ospfd2.2/ospf_sim/sim.C Mon May 14 14:27:15 2001@@ -52,6 +52,8 @@ int StartRouter(ClientData, Tcl_Interp *, int, char *argv[]); int ToggleRouter(ClientData, Tcl_Interp *, int, char *argv[]);+int RestartRouter(ClientData, Tcl_Interp *, int, char *argv[]);+int HitlessRestart(ClientData, Tcl_Interp *, int, char *argv[]); int StartPing(ClientData, Tcl_Interp *, int, char *argv[]); int StopPing(ClientData, Tcl_Interp *, int, char *argv[]); int StartTraceroute(ClientData, Tcl_Interp *, int, char *argv[]);@@ -240,6 +242,8 @@ // Install C-language TCl commands Tcl_CreateCommand(interp, "startrtr", StartRouter, 0, 0); Tcl_CreateCommand(interp, "togglertr", ToggleRouter, 0, 0);+ Tcl_CreateCommand(interp, "rstrtr", RestartRouter, 0, 0);+ Tcl_CreateCommand(interp, "hitlessrtr", HitlessRestart, 0, 0); Tcl_CreateCommand(interp, "start_ping", StartPing, 0, 0); Tcl_CreateCommand(interp, "stop_ping", StopPing, 0, 0); Tcl_CreateCommand(interp, "start_traceroute", StartTraceroute, 0, 0);@@ -467,30 +471,9 @@ switch(type) { char tcl_command[80]; case SIM_HELLO:- SimNode *newnode;- // Delete temporary router hello = (SimHello *)msg;- newnode = new SimNode(hello->rtrid, fd);- sim->simnodes.add(newnode);- newnode->home_port = ntoh16(hello->myport);- addr.s_addr = hton32(newnode->id());- newnode->color = SimNode::WHITE;- if (Tcl_VarEval(sim->interp, "color_router ", inet_ntoa(addr),- " white", 0) != TCL_OK)- printf("color_router: %s\n", sim->interp->result);- // Initialize its idea of time- TickBody tm;- tm.tick = sim->n_ticks;- newnode->pktdata.queue_xpkt(&tm, SIM_FIRST_TICK, 0, sizeof(tm));- // Send address to port maps- send_addrmap(newnode);- send_addrmap_increment(0, newnode);- // Download node's configuration- if (Tcl_VarEval(sim->interp,"sendcfg ",- inet_ntoa(addr),0) != TCL_OK)- printf("sendcfg: %s\n", sim->interp->result);- // Also frees message space- delete node;+ // Start the node, reassigning simnode class+ restart_node(node, hello->rtrid, fd, ntoh16(hello->myport)); break; case SIM_TICK_RESPONSE: NodeStats *statentry;@@ -567,6 +550,43 @@ } } +/* (Re)start a router.+ */++void SimCtl::restart_node(SimNode *node, InAddr id, int fd, uns16 home_port)++{+ in_addr addr;+ TickBody tm;+ SimNode *newnode;++ newnode = new SimNode(id, fd);+ sim->simnodes.add(newnode);+ newnode->home_port = home_port;+ addr.s_addr = hton32(newnode->id());+ newnode->color = SimNode::WHITE;+ if (Tcl_VarEval(sim->interp, "color_router ", inet_ntoa(addr),+ " white", 0) != TCL_OK)+ printf("color_router: %s\n", sim->interp->result);+ // If the router has already been running, tell it to restart+ if (node->id() != 0)+ newnode->pktdata.queue_xpkt(NULL, SIM_RESTART, 0, 0);+ // Initialize its idea of time+ tm.tick = sim->n_ticks;+ newnode->pktdata.queue_xpkt(&tm, SIM_FIRST_TICK, 0, sizeof(tm));+ // Send address to port maps+ send_addrmap(newnode);+ send_addrmap_increment(0, newnode);+ // Download node's configuration+ addr.s_addr = hton32(newnode->id());+ if (Tcl_VarEval(sim->interp,"sendcfg ", inet_ntoa(addr),0) != TCL_OK)+ printf("sendcfg: %s\n", sim->interp->result);++ // Delete previous router+ // Also frees message space+ delete node;+}+ /* Construct a node statistics entry. */ @@ -725,6 +745,48 @@ Tcl_VarEval(interp, "startrtr ", argv[1], 0); else node->pktdata.queue_xpkt(NULL, SIM_SHUTDOWN, 0, 0);++ return(TCL_OK);+}++/* Restart a simulated router.+ * If it is not running, simply start it.+ */++int RestartRouter(ClientData, Tcl_Interp *interp, int, char *argv[])++{+ InAddr id;+ SimNode *node;++ id = ntoh32(inet_addr(argv[1]));+ if (!(node = (SimNode *) sim->simnodes.find(id, 0)))+ Tcl_VarEval(interp, "startrtr ", argv[1], 0);+ else {+ sim->simnodes.remove(node);+ sim->restart_node(node, node->id(), node->fd, node->home_port);+ }++ return(TCL_OK);+}++/* Perform a hitless restart of a simulated router.+ * If it is not running, simply start it.+ */++int HitlessRestart(ClientData, Tcl_Interp *interp, int, char *argv[])++{+ InAddr id;+ SimNode *node;+ HitlessRestartMsg m;++ m.period = 60;+ id = ntoh32(inet_addr(argv[1]));+ if (!(node = (SimNode *) sim->simnodes.find(id, 0)))+ Tcl_VarEval(interp, "startrtr ", argv[1], 0);+ else+ node->pktdata.queue_xpkt(&m, SIM_RESTART_HITLESS, 0, sizeof(m)); return(TCL_OK); }diff -X exclude_files -Nabur ospfd2.1/ospf_sim/sim.h ospfd2.2/ospf_sim/sim.h--- ospfd2.1/ospf_sim/sim.h Thu Apr 19 17:50:50 2001+++ ospfd2.2/ospf_sim/sim.h Mon May 14 14:27:15 2001@@ -39,6 +39,8 @@ SIM_ADD_MEMBER, // Add membership on segment SIM_DEL_MEMBER, // Delete membership on segment SIM_START_MTRACE, // Start multicast traceroute session+ SIM_RESTART, // Restart router+ SIM_RESTART_HITLESS,// Hitless restart of router // Responses from ospfds SIM_HELLO = 100, // Initial identification@@ -91,6 +93,14 @@ InAddr src; InAddr dest; byte ttl;+};++/* Body of the Hitless Restart message contains the length+ * of the hitless restart period in seconds.+ */++struct HitlessRestartMsg {+ uns16 period; }; /* Tick responses carry the #LSAs and checksum for diff -X exclude_files -Nabur ospfd2.1/ospf_sim/sim_system.C ospfd2.2/ospf_sim/sim_system.C--- ospfd2.1/ospf_sim/sim_system.C Thu Apr 19 17:50:50 2001+++ ospfd2.2/ospf_sim/sim_system.C Mon May 14 14:27:15 2001@@ -215,22 +215,50 @@ } /* Add/modify a kernel routing table entry.- * NULL for simulator, as we just use the routing table- * entries internal to the OSPF application. */ -void SimSys::rtadd(InAddr, InMask, MPath *, MPath *, bool)+void SimSys::rtadd(InAddr net, InMask mask, MPath *mpp, MPath *, bool reject) {+ SimRte *rte;+ rte = rttbl.add(net, mask);+ rte->reachable = true;+ rte->reject = reject;+ if (mpp) {+ rte->phyint = mpp->NHs[0].phyint;+ rte->if_addr = mpp->NHs[0].if_addr;+ rte->gw = mpp->NHs[0].gw;+ } } /* Delete a kernel routing table entry.- * Again, NULL for simulator.+ * We don't actually delete them, but instead set the+ * reachability to false - this will cause the lookup to+ * fall back on a less-specific prefix. */ -void SimSys::rtdel(InAddr, InMask, MPath *)+void SimSys::rtdel(InAddr net, InMask mask, MPath *) {+ SimRte *rte;+ rte = rttbl.add(net, mask);+ rte->reachable = false;+}++/* Upload the current set of routing+ * table entries into the OSPF application.+ */++void SimSys::upload_remnants()++{+ SimRte *rte;+ AVLsearch iter(&rttbl.routes);++ while ((rte = (SimRte *)iter.next())) {+ if (rte->reachable)+ ospf->remnant_notification(rte->net(), rte->mask());+ } } /* Add a multicast routing table entry to the kernel.diff -X exclude_files -Nabur ospfd2.1/ospf_sim/simctl.h ospfd2.2/ospf_sim/simctl.h--- ospfd2.1/ospf_sim/simctl.h Thu Apr 19 17:50:50 2001+++ ospfd2.2/ospf_sim/simctl.h Mon May 14 14:27:15 2001@@ -29,6 +29,7 @@ void store_mapping(uns32 net_or_addr, uns32 rtr); void send_addrmap(class SimNode *); void send_addrmap_increment(class IfMap *, class SimNode *);+ void restart_node(SimNode *, InAddr, int, uns16); friend class SimNode; friend int main(int argc, char *argv[]);@@ -36,6 +37,8 @@ friend void tick(ClientData); friend int StartRouter(ClientData, Tcl_Interp *, int, char *argv[]); friend int ToggleRouter(ClientData, Tcl_Interp *interp, int, char *argv[]);+ friend int RestartRouter(ClientData,Tcl_Interp *interp, int, char *argv[]);+ friend int HitlessRestart(ClientData,Tcl_Interp *interp,int, char *argv[]); friend int AddMapping(ClientData, Tcl_Interp *interp, int, char *argv[]); friend int AddNetMember(ClientData, Tcl_Interp *interp, int, char *argv[]); friend int TimeStop(ClientData, Tcl_Interp *, int, char *argv[]);@@ -106,6 +109,8 @@ friend int main(int argc, char *argv[]); friend void tick(ClientData); friend int ToggleRouter(ClientData, Tcl_Interp *interp, int, char *argv[]);+ friend int RestartRouter(ClientData,Tcl_Interp *interp, int, char *argv[]);+ friend int HitlessRestart(ClientData,Tcl_Interp *interp,int, char *argv[]); friend int SendGeneral(ClientData, Tcl_Interp *, int, char *argv[]); friend int SendArea(ClientData, Tcl_Interp *, int, char *argv[]); friend int SendInterface(ClientData, Tcl_Interp *, int, char *argv[]);diff -X exclude_files -Nabur ospfd2.1/src/dbage.C ospfd2.2/src/dbage.C--- ospfd2.1/src/dbage.C Thu Apr 19 17:50:47 2001+++ ospfd2.2/src/dbage.C Mon May 14 14:27:10 2001@@ -130,6 +130,12 @@ // Process any pending LSA activity (flooding, origination) // Synchronize with kernel ospf->krt_sync();++ // If not performing a hitless restart, upload remnants+ if (ospf->need_remnants) {+ ospf->need_remnants = false;+ sys->upload_remnants();+ } } /* Main aging routine called once a second. Increment the currentdiff -X exclude_files -Nabur ospfd2.1/src/ospf.C ospfd2.2/src/ospf.C--- ospfd2.1/src/ospf.C Thu Apr 19 17:50:47 2001+++ ospfd2.2/src/ospf.C Mon May 14 14:27:10 2001@@ -106,6 +106,7 @@ ospf_mtu = 65535; full_sched = false; ase_sched = false;+ need_remnants = true; n_dijkstras = 0; @@ -700,6 +701,25 @@ KrtSync *item; item = new KrtSync(net, mask); krtdeletes.add(item);+ }+}++/* Kernel has indicated that we have previously installed+ * a route to this destination. If we don't have the destination+ * currently in our routing table, assume that it is a remnant+ * from a previous execution run, and delete the route.+ */++void OSPF::remnant_notification(InAddr net, InMask mask)++{+ INrte *rte;++ if (!(rte = inrttbl->find(net, mask)) || !rte->valid()) {+ if (spflog(LOG_REMNANT, 5)) {+ log(&net, &mask);+ }+ sys->rtdel(net, mask, 0); } } diff -X exclude_files -Nabur ospfd2.1/src/ospf.h ospfd2.2/src/ospf.h--- ospfd2.1/src/ospf.h Thu Apr 19 17:50:47 2001+++ ospfd2.2/src/ospf.h Mon May 14 14:27:10 2001@@ -87,6 +87,7 @@ bool delete_neighbors; // Neighbors being deleted? AVLtree phyints; // Physical interfaces AVLtree krtdeletes; // Deleted, unsynced kernel routing entries+ bool need_remnants; // Yet to get remnants? // Flooding queues int n_local_flooded;// AS-external-LSAs originated this tick ExRtData *ases_pending; // Pending AS-external-LSA originations@@ -265,12 +266,13 @@ void log(InAddr *addr); void log(class LSA *); void log(class INrte *);+ void log(InAddr *addr, InMask *mask); public: // Version numbers enum { vmajor = 2, // Major version number- vminor = 1, // Minor version number+ vminor = 2, // Minor version number }; // Entry points into the OSPF code@@ -287,6 +289,7 @@ void phy_up(int phyint); void phy_down(int phyint); void krt_delete_notification(InAddr net, InMask mask);+ void remnant_notification(InAddr net, InMask mask); MPath *ip_lookup(InAddr dest); InAddr ip_source(InAddr dest); InAddr if_addr(int phyint);diff -X exclude_files -Nabur ospfd2.1/src/spflog.h ospfd2.2/src/spflog.h--- ospfd2.1/src/spflog.h Thu Apr 19 17:50:47 2001+++ ospfd2.2/src/spflog.h Mon May 14 14:27:10 2001@@ -83,6 +83,8 @@ IGMP_RCV, // Received IGMP packet LOG_SPFDEBUG, // Debug statements LOG_KRTSYNC, // Synch kernel routing entry+ LOG_REMNANT, // Deleting remnant routing entry+ LOG_DEBUGGING, // Debug statements MAXLOG, // KEEP THIS LAST!!!! }; diff -X exclude_files -Nabur ospfd2.1/src/spfutil.C ospfd2.2/src/spfutil.C--- ospfd2.1/src/spfutil.C Thu Apr 19 17:50:47 2001+++ ospfd2.2/src/spfutil.C Mon May 14 14:27:10 2001@@ -408,6 +408,10 @@ return("DEBUG"); case LOG_KRTSYNC: return("Synching kernel routing entry");+ case LOG_REMNANT:+ return("Deleting remnant");+ case LOG_DEBUGGING:+ return(""); default: break; }@@ -701,6 +705,28 @@ log("."); log((int) ptr[3]); }++/* Log a network/mask combination in CIDR format.+ */++void OSPF::log(InAddr *addr, InMask *mask)++{+ int prefix_len;+ int bit;++ prefix_len = 32;+ bit = 1;+ while (prefix_len > 0 && (bit & *mask) == 0) {+ prefix_len--;+ bit = bit << 1;+ }++ log(addr);+ log("/");+ log(prefix_len);+}+ /* Initialize the OspfSysCalls class. Time begins at zero. */diff -X exclude_files -Nabur ospfd2.1/src/system.h ospfd2.2/src/system.h--- ospfd2.1/src/system.h Thu Apr 19 17:50:47 2001+++ ospfd2.2/src/system.h Mon May 14 14:27:10 2001@@ -43,6 +43,7 @@ virtual void rtdel(InAddr, InMask, MPath *ompp)=0; virtual void add_mcache(InAddr, InAddr, MCache *)=0; virtual void del_mcache(InAddr src, InAddr group)=0;+ virtual void upload_remnants()=0; virtual void monitor_response(struct MonMsg *, uns16, int, int)=0; virtual char *phyname(int phyint)=0; virtual void sys_spflog(int msgno, char *msgbuf)=0;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?