📄 sim.c
字号:
rtr = ntoh32(inet_addr(argv[2])); sim->store_mapping(addr, rtr); return(TCL_OK);}/* Add mapping between network and attached router */int AddNetMember(ClientData, Tcl_Interp *interp, int, char *argv[]){ uns16 port; InAddr rtr; port = atoi(argv[1]); rtr = ntoh32(inet_addr(argv[2])); sim->store_mapping(port, rtr); return(TCL_OK);}/* Add mapping between IP address and owning router */void SimCtl::store_mapping(uns32 port_or_addr, uns32 rtr){ IfMap *map; if (port_or_addr != 0) { map = new IfMap(port_or_addr, rtr); ifmaps.add(map); send_addrmap_increment(map, 0); }}/* Stop the simulated time. */int TimeStop(ClientData, Tcl_Interp *, int, char *[]){ sim->frozen = true; return(TCL_OK);}/* Resum the simulated time. */int TimeResume(ClientData, Tcl_Interp *, int, char *[]){ sim->frozen = false; return(TCL_OK);}/* Download the global configuration values into the ospfd * software. If try to change Router ID, refuse reconfig. * If first time, create OSPF protocol instance. */int SendGeneral(ClientData, Tcl_Interp *, int, char *argv[]){ CfgGen m; InAddr id; SimNode *node; int len = sizeof(m); id = ntoh32(inet_addr(argv[1])); if (!(node = (SimNode *) sim->simnodes.find(id, 0))) return(TCL_OK); m.lsdb_limit = 0; m.mospf_enabled = atoi(argv[3]); m.inter_area_mc = 1; m.ovfl_int = 300; m.new_flood_rate = 1000; m.max_rxmt_window = 8; m.max_dds = 2; m.host_mode = atoi(argv[2]); m.log_priority = 2; m.refresh_rate = 6000; m.PPAdjLimit = atoi(argv[4]); m.random_refresh = atoi(argv[5]); node->pktdata.queue_xpkt(&m, SIM_CONFIG, CfgType_Gen, len); return(TCL_OK);}/* Download configuration of a single area */int SendArea(ClientData, Tcl_Interp *, int, char *argv[]){ CfgArea m; InAddr id; SimNode *node; int len = sizeof(m); id = ntoh32(inet_addr(argv[1])); if (!(node = (SimNode *) sim->simnodes.find(id, 0))) return(TCL_OK); m.area_id = ntoh32(inet_addr(argv[2])); m.stub = atoi(argv[3]); m.dflt_cost = atoi(argv[4]); m.import_summs = atoi(argv[5]); node->pktdata.queue_xpkt(&m, SIM_CONFIG, CfgType_Area, len); return(TCL_OK);}/* Download an interface's configuration. * Interface can by identified by its address, name, or * for point-to-point addresses, the other end of the link. */int SendInterface(ClientData, Tcl_Interp *, int, char *argv[]){ CfgIfc m; InAddr id; SimNode *node; int len = sizeof(m); int port; InAddr net; InAddr mask; int command; bool enabled; bool run_ospf; id = ntoh32(inet_addr(argv[1])); if (!(node = (SimNode *) sim->simnodes.find(id, 0))) return(TCL_OK); // Figure out interface type if (strcmp(argv[3], "broadcast") == 0) m.IfType = IFT_BROADCAST; else if (strcmp(argv[3], "pp") == 0) m.IfType = IFT_PP; else if (strcmp(argv[3], "nbma") == 0) m.IfType = IFT_NBMA; else if (strcmp(argv[3], "ptmp") == 0) m.IfType = IFT_P2MP; else return(TCL_ERROR); port = atoi(argv[2]); m.address = ntoh32(inet_addr(argv[5])); m.phyint = port; get_prefix(argv[8], net, mask); m.mask = mask; m.mtu = (m.IfType == IFT_BROADCAST ? 1500 : 2048); m.IfIndex = atoi(argv[7]); m.area_id = ntoh32(inet_addr(argv[4])); m.dr_pri = atoi(argv[13]); m.xmt_dly = 1; m.rxmt_int = 5; m.hello_int = 10; m.if_cost = atoi(argv[6]); m.dead_int = 40; m.poll_int = 60; m.auth_type = 0; memset(m.auth_key, 0, 8); m.mc_fwd = 1; m.demand = atoi(argv[9]); m.passive = atoi(argv[11]); m.igmp = ((m.IfType == IFT_BROADCAST) ? 1 : 0); enabled = (atoi(argv[10]) != 0); run_ospf = (atoi(argv[12]) != 0); command = (enabled && run_ospf) ? SIM_CONFIG : SIM_CONFIG_DEL; node->pktdata.queue_xpkt(&m, command, CfgType_Ifc, len); if (m.IfType == IFT_BROADCAST || m.IfType == IFT_NBMA) { CfgExRt rtm; rtm.net = net; rtm.mask = mask; rtm.type2 = 0; rtm.mc = 0; rtm.direct = 1; rtm.noadv = !run_ospf; rtm.cost = 1; rtm.gw = 0; rtm.phyint = 0; rtm.tag = 0; command = (enabled && !run_ospf) ? SIM_CONFIG : SIM_CONFIG_DEL; node->pktdata.queue_xpkt(&rtm, command, CfgType_Route, len); } return(TCL_OK);}int SendVL(ClientData, Tcl_Interp *, int, char *argv[]){ CfgVL m; InAddr id; SimNode *node; int len = sizeof(m); id = ntoh32(inet_addr(argv[1])); if (!(node = (SimNode *) sim->simnodes.find(id, 0))) return(TCL_OK); m.nbr_id = ntoh32(inet_addr(argv[3])); m.transit_area = ntoh32(inet_addr(argv[2])); m.xmt_dly = 1; m.rxmt_int = 5; m.hello_int = 10; m.dead_int = 60; m.auth_type = 0; memset(m.auth_key, 0, 8); node->pktdata.queue_xpkt(&m, SIM_CONFIG, CfgType_VL, len); return(TCL_OK);}int SendNeighbor(ClientData, Tcl_Interp *, int, char *argv[]){ CfgNbr m; InAddr id; SimNode *node; int len = sizeof(m); id = ntoh32(inet_addr(argv[1])); if (!(node = (SimNode *) sim->simnodes.find(id, 0))) return(TCL_OK); m.nbr_addr = ntoh32(inet_addr(argv[2])); m.dr_eligible = atoi(argv[3]); node->pktdata.queue_xpkt(&m, SIM_CONFIG, CfgType_Nbr, len); return(TCL_OK);}int SendAggregate(ClientData, Tcl_Interp *, int, char *argv[]){ CfgRnge m; InAddr net; InAddr mask; InAddr id; SimNode *node; int len = sizeof(m); id = ntoh32(inet_addr(argv[1])); if (!(node = (SimNode *) sim->simnodes.find(id, 0))) return(TCL_OK); if (get_prefix(argv[3], net, mask)) { m.net = net; m.mask = mask; m.area_id = ntoh32(inet_addr(argv[2])); m.no_adv = atoi(argv[4]); node->pktdata.queue_xpkt(&m, SIM_CONFIG, CfgType_Range, len); } return(TCL_OK);}int SendHost(ClientData, Tcl_Interp *, int, char *argv[]){ CfgHost m; InAddr net; InAddr mask; InAddr id; SimNode *node; int len = sizeof(m); id = ntoh32(inet_addr(argv[1])); if (!(node = (SimNode *) sim->simnodes.find(id, 0))) return(TCL_OK); if (get_prefix(argv[2], net, mask)) { m.net = net; m.mask = mask; m.area_id = ntoh32(inet_addr(argv[3])); m.cost = 0; node->pktdata.queue_xpkt(&m, SIM_CONFIG, CfgType_Host, len); } return(TCL_OK);}int SendExtRt(ClientData, Tcl_Interp *, int, char *argv[]){ CfgExRt m; InAddr net; InMask mask; InAddr id; SimNode *node; int len = sizeof(m); id = ntoh32(inet_addr(argv[1])); if (!(node = (SimNode *) sim->simnodes.find(id, 0))) return(TCL_OK); if (get_prefix(argv[2], net, mask)) { m.net = net; m.mask = mask; m.type2 = (atoi(argv[4]) == 2); m.mc = 0; m.direct = 0; m.noadv = (atoi(argv[6]) != 0); m.cost = atoi(argv[5]); m.gw = ntoh32(inet_addr(argv[3])); m.phyint = (m.gw != 0) ? -1 : 0; m.tag = 0; node->pktdata.queue_xpkt(&m, SIM_CONFIG, CfgType_Route, len); } return(TCL_OK);}/* Inform the simulated router of a group member on one of * its attached interfaces. */int SendGroup(ClientData, Tcl_Interp *, int, char *argv[]){ GroupMsg m; InAddr id; SimNode *node; int len = sizeof(m); id = ntoh32(inet_addr(argv[1])); if (!(node = (SimNode *) sim->simnodes.find(id, 0))) return(TCL_OK); m.phyint = atoi(argv[3]); m.group = ntoh32(inet_addr(argv[2])); node->pktdata.queue_xpkt(&m, SIM_ADD_MEMBER, 0, len); return(TCL_OK);}/* Similarly, a group member has left on one of the * attached interfaces. */int LeaveGroup(ClientData, Tcl_Interp *, int, char *argv[]){ GroupMsg m; InAddr id; SimNode *node; int len = sizeof(m); id = ntoh32(inet_addr(argv[1])); if (!(node = (SimNode *) sim->simnodes.find(id, 0))) return(TCL_OK); m.phyint = atoi(argv[3]); m.group = ntoh32(inet_addr(argv[2])); node->pktdata.queue_xpkt(&m, SIM_DEL_MEMBER, 0, len); return(TCL_OK);}/* Utility to parse prefixes. Returns false if the * prefix is malformed. */InMask masks[33] = { 0x00000000L, 0x80000000L, 0xc0000000L, 0xe0000000L, 0xf0000000L, 0xf8000000L, 0xfc000000L, 0xfe000000L, 0xff000000L, 0xff800000L, 0xffc00000L, 0xffe00000L, 0xfff00000L, 0xfff80000L, 0xfffc0000L, 0xfffe0000L, 0xffff0000L, 0xffff8000L, 0xffffc000L, 0xffffe000L, 0xfffff000L, 0xfffff800L, 0xfffffc00L, 0xfffffe00L, 0xffffff00L, 0xffffff80L, 0xffffffc0L, 0xffffffe0L, 0xfffffff0L, 0x80000000L, 0xfffffffcL, 0xfffffffeL, 0xffffffffL};bool get_prefix(char *prefix, InAddr &net, InMask &mask){ char *string; char temp[20]; char *netstr; int len; strncpy(temp, prefix, sizeof(temp)); string = temp; if (!(netstr = strsep(&string, "/")) || string == 0) return(false); net = ntoh32(inet_addr(netstr)); len = atoi(string); if (len < 0 || len > 32) return(false); mask = masks[len]; return(true);}// The sample.cfg configuration filechar *sample_cfg = "\router 10.0.0.1 210 209 1\n\router 10.0.0.2 248 122 1\n\router 10.0.0.3 313 120 1\n\router 10.0.0.4 349 209 1\n\router 10.1.1.8 124.0 116.0 1\n\router 10.0.0.9 125.0 267.0 1\n\router 10.0.0.10 246.0 40.0 1\n\router 10.0.0.11 313.0 40.0 1\n\router 10.0.0.12 399.0 96.0 1\n\router 10.0.0.13 519.0 94.0 1\n\router 10.0.0.5 453.0 166.0 1\n\router 10.0.0.6 453.0 246.0 1\n\router 10.0.0.7 387.0 290.0 1\n\router 10.0.0.14 528.0 297.0 1\n\nbma 10.1.3.0/24 0.0.0.2 125.0 191.0 0\n\broadcast 10.1.2.0/24 0.0.0.2 45.0 119.0 0\n\broadcast 10.1.1.0/24 0.0.0.2 43.0 266.0 0\n\broadcast 10.2.2.0/24 0.0.0.1 380.0 20.0 0\n\broadcast 10.2.1.0/24 0.0.0.1 178.0 21.0 0\n\broadcast 10.4.1.0/24 0.0.0.4 460.0 42.0 0\n\broadcast 10.4.2.0/24 0.0.0.5 459.0 330.0 0\n\broadcast 10.3.7.0/24 0.0.0.3 537.0 165.0 0\n\broadcast 10.8.2.0/24 0.0.0.3 529.0 244.0 0\n\pplink 10.0.0.1 0.0.0.0 1 10.0.0.2 0.0.0.0 1 0.0.0.0 0\n\pplink 10.0.0.1 0.0.0.0 2 10.0.0.3 0.0.0.0 2 0.0.0.0 0\n\pplink 10.0.0.1 0.0.0.0 1 10.0.0.4 0.0.0.0 1 0.0.0.0 0\n\interface 10.0.0.1 10.1.3.1 3 0 1\n\neighbor 10.0.0.1 10.1.3.8 0\n\neighbor 10.0.0.1 10.1.3.9 0\n\loopback 10.0.0.1 1.0.0.1/32 0.0.0.0\n\pplink 10.0.0.2 0.0.0.0 2 10.0.0.4 0.0.0.0 2 0.0.0.0 0\n\loopback 10.0.0.2 1.0.0.2/32 0.0.0.0\n\pplink 10.0.0.3 0.0.0.0 1 10.0.0.4 0.0.0.0 1 0.0.0.0 0\n\loopback 10.0.0.3 1.0.0.3/32 0.0.0.0\n\pplink 10.0.0.4 192.168.4.1 3 10.0.0.5 192.168.5.1 3 0.0.0.3 0\n\pplink 10.0.0.4 192.168.4.2 3 10.0.0.6 192.168.6.1 3 0.0.0.3 0\n\loopback 10.0.0.4 1.0.0.4/32 0.0.0.0\n\interface 10.1.1.8 10.1.3.8 3 0 1\n\drpri 10.1.1.8 10.1.3.8 0\n\interface 10.1.1.8 10.1.2.8 1 0 1\n\interface 10.0.0.9 10.1.3.9 3 0 1\n\drpri 10.0.0.9 10.1.3.9 0\n\interface 10.0.0.9 10.1.1.9 1 0 1\n\interface 10.0.0.10 10.2.1.10 1 0 1\n\pplink 10.0.0.10 0.0.0.0 3 10.0.0.2 0.0.0.0 3 0.0.0.1 0\n\pplink 10.0.0.10 0.0.0.0 3 10.0.0.11 0.0.0.0 3 0.0.0.1 1\n\interface 10.0.0.11 10.2.2.11 1 0 1\n\pplink 10.0.0.11 0.0.0.0 3 10.0.0.3 0.0.0.0 3 0.0.0.1 1\n\interface 10.0.0.12 10.4.1.12 1 0 1\n\pplink 10.0.0.12 0.0.0.0 3 10.0.0.5 0.0.0.0 3 0.0.0.4 0\n\interface 10.0.0.13 10.4.1.13 1 0 1\n\pplink 10.0.0.13 0.0.0.0 3 10.0.0.5 0.0.0.0 3 0.0.0.4 0\n\interface 10.0.0.5 10.3.7.5 1 0 1\n\pplink 10.0.0.5 0.0.0.0 3 10.0.0.6 0.0.0.0 3 0.0.0.3 0\n\pplink 10.0.0.6 0.0.0.0 3 10.0.0.7 0.0.0.0 3 0.0.0.5 0\n\pplink 10.0.0.6 0.0.0.0 3 10.0.0.14 0.0.0.0 3 0.0.0.5 0\n\interface 10.0.0.6 10.8.2.6 1 0 1\n\interface 10.0.0.7 10.4.2.7 1 0 1\n\interface 10.0.0.14 10.4.2.6 1 0 1\n\extrt 10.0.0.2 1.0.0.0/8 0.0.0.0 2 1 0\n\extrt 10.0.0.2 2.0.0.0/8 0.0.0.0 2 1 0\n\extrt 10.0.0.2 4.0.0.0/8 11.0.0.254 2 1 0\n\extrt 10.0.0.2 3.0.0.0/8 0.0.0.0 1 10 0\n\extrt 10.0.0.12 5.0.0.0/8 0.0.0.0 1 10 0\n\extrt 10.0.0.12 6.0.0.0/8 0.0.0.0 1 10 0\n\extrt 10.1.1.8 0.0.0.0/0 10.1.2.254 1 1 0\n\extrt 10.1.1.8 3.0.0.0/8 0.0.0.0 2 1 0\n\vlink 10.0.0.4 10.0.0.5 0.0.0.3\n\vlink 10.0.0.4 10.0.0.6 0.0.0.3\n\aggr 10.0.0.1 0.0.0.2 10.1.0.0/16 0\n\aggr 10.0.0.2 0.0.0.1 10.2.0.0/16 0\n\aggr 10.0.0.3 0.0.0.1 10.2.0.0/16 0\n";
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -