📄 show_interfaces.cc
字号:
vifaddr4_deleted(ifname, vifname, addr); break; case IF_EVENT_CHANGED: // shouldn't happen abort(); break; }}voidInterfaceMonitor::vifaddr6_update(const string& ifname, const string& vifname, const IPv6& addr, const uint32_t& event){ switch (event) { case IF_EVENT_CREATED: vifaddr6_created(ifname, vifname, addr); break; case IF_EVENT_DELETED: vifaddr6_deleted(ifname, vifname, addr); break; case IF_EVENT_CHANGED: // shouldn't happen abort(); break; }}voidInterfaceMonitor::interface_deleted(const string& ifname){ multimap<string, Vif*>::iterator i; i = _vifs_by_interface.find(ifname); if (i != _vifs_by_interface.end()) { vif_deleted(ifname, i->second->name()); }}voidInterfaceMonitor::vif_deleted(const string& ifname, const string& vifname){ Vif *vif; debug_msg("vif_deleted %s %s\n", ifname.c_str(), vifname.c_str()); map<string, Vif*>::iterator vi = _vifs_by_name.find(vifname); if (vi != _vifs_by_name.end()) { vif = vi->second; _vifs_by_name.erase(vi); multimap<string, Vif*>::iterator ii = _vifs_by_interface.find(ifname); assert(ii != _vifs_by_interface.end()); while (ii != _vifs_by_interface.end() && ii->first == ifname) { if (ii->second == vif) { _vifs_by_interface.erase(ii); break; } ii++; assert(ii != _vifs_by_interface.end()); } // now process the deletion... // XXX } else { XLOG_ERROR("vif_deleted: vif %s not found.", vifname.c_str()); }}voidInterfaceMonitor::vif_created(const string& ifname, const string& vifname){ debug_msg("vif_created: %s\n", vifname.c_str()); if (_vifs_by_name.find(vifname) != _vifs_by_name.end()) { XLOG_ERROR("vif_created: vif %s already exists.", vifname.c_str()); return; } Vif *vif = new Vif(vifname, ifname); _vifs_by_name[vifname] = vif; _vifs_by_interface.insert(pair<string, Vif*>(ifname, vif)); // now process the addition // XXX}voidInterfaceMonitor::vifaddr4_created(const string& ifn, const string& vifn, const IPv4& addr){ if (_vifs_by_name.find(vifn) == _vifs_by_name.end()) { XLOG_ERROR("vifaddr4_created on unknown vif: %s", vifn.c_str()); return; } XorpCallback2<void, const XrlError&, const uint32_t*>::RefPtr cb; cb = callback(this, &InterfaceMonitor::vifaddr4_done, ifn, vifn, addr); if (_ifmgr_client.send_get_configured_prefix4("fea", ifn, vifn, addr, cb) == false) { XLOG_ERROR("Failed to send address prefix request"); _state = FAILED; } _addrs_remaining++;}voidInterfaceMonitor::vifaddr4_done(const XrlError& e, const uint32_t* prefix_len, string ifname, string vifname, IPv4 addr){ UNUSED(ifname); if (e == XrlError::OKAY()) { if (_vifs_by_name.find(vifname) == _vifs_by_name.end()) { // silently ignore - the vif could have been deleted while we // were waiting for the answer. return; } Vif* vif = _vifs_by_name[vifname]; debug_msg("adding address %s prefix_len %d to vif %s\n", addr.str().c_str(), *prefix_len, vifname.c_str()); vif->add_address(addr, IPvXNet(addr, *prefix_len), IPvX("0.0.0.0"), IPvX("0.0.0.0")); _addrs_remaining--; } else if (e != XrlError::COMMAND_FAILED()) { _addrs_remaining--; } else { XLOG_ERROR("Failed to get prefix_len for address %s.", addr.str().c_str()); _addrs_remaining--; } if (_interfaces_remaining == 0 && _vifs_remaining == 0 && _addrs_remaining == 0 && _flags_remaining == 0 && _state == INITIALIZING) { _state = READY; }}voidInterfaceMonitor::vifaddr4_deleted(const string& ifname, const string& vifname, const IPv4& addr){ UNUSED(ifname); if (_vifs_by_name.find(vifname) == _vifs_by_name.end()) { XLOG_ERROR("vifaddr4_deleted on unknown vif: %s", vifname.c_str()); return; } Vif* vif = _vifs_by_name[vifname]; vif->delete_address(addr);}voidInterfaceMonitor::vifaddr6_created(const string& ifn, const string& vifn, const IPv6& addr){ if (_vifs_by_name.find(vifn) == _vifs_by_name.end()) { XLOG_ERROR("vifaddr6_created on unknown vif: %s", vifn.c_str()); return; } XorpCallback2<void, const XrlError&, const uint32_t*>::RefPtr cb; cb = callback(this, &InterfaceMonitor::vifaddr6_done, ifn, vifn, addr); if (_ifmgr_client.send_get_configured_prefix6("fea", ifn, vifn, addr, cb) == false) { XLOG_ERROR("Failed to send address prefix request"); _state = FAILED; } _addrs_remaining++;}voidInterfaceMonitor::vifaddr6_done(const XrlError& e, const uint32_t* prefix_len, string ifname, string vifname, IPv6 addr){ UNUSED(ifname); if (e == XrlError::OKAY()) { if (_vifs_by_name.find(vifname) == _vifs_by_name.end()) { // silently ignore - the vif could have been deleted while we // were waiting for the answer. return; } Vif* vif = _vifs_by_name[vifname]; debug_msg("adding address %s prefix_len %d to vif %s\n", addr.str().c_str(), *prefix_len, vifname.c_str()); vif->add_address(addr, IPvXNet(addr, *prefix_len), IPvX("0.0.0.0"), IPvX("0.0.0.0")); _addrs_remaining--; } else if (e != XrlError::COMMAND_FAILED()) { _addrs_remaining--; } else { XLOG_ERROR("Failed to get prefix_len for address %s.", addr.str().c_str()); _addrs_remaining--; } if (_interfaces_remaining == 0 && _vifs_remaining == 0 && _addrs_remaining == 0 && _flags_remaining == 0 && _state == INITIALIZING) { _state = READY; }}voidInterfaceMonitor::vifaddr6_deleted(const string& ifname, const string& vifname, const IPv6& addr){ UNUSED(ifname); if (_vifs_by_name.find(vifname) == _vifs_by_name.end()) { XLOG_ERROR("vifaddr6_deleted on unknown vif: %s", vifname.c_str()); return; } Vif* vif = _vifs_by_name[vifname]; vif->delete_address(addr);}voidInterfaceMonitor::print_results() const{ map<string, Vif*>::const_iterator i; for (i = _vifs_by_name.begin(); i != _vifs_by_name.end(); i++) { Vif *vif = i->second; printf("%s/%s: Flags:<", vif->ifname().c_str(), vif->name().c_str()); bool prev = false; if (vif->is_underlying_vif_up()) { if (prev) printf(","); printf("ENABLED"); prev = true; } if (vif->is_broadcast_capable()) { if (prev) printf(","); printf("BROADCAST"); prev = true; } if (vif->is_multicast_capable()) { if (prev) printf(","); printf("MULTICAST"); prev = true; } if (vif->is_loopback()) { if (prev) printf(","); printf("LOOPBACK"); prev = true; } if (vif->is_p2p()) { if (prev) printf(","); printf("POINTTOPOINT"); prev = true; } printf(">\n"); list<VifAddr>::const_iterator ai; for (ai = vif->addr_list().begin(); ai != vif->addr_list().end(); ai++) { IPvX addr = ai->addr(); if (addr.is_ipv4()) { printf(" inet %s ", addr.str().c_str()); printf("netmask %s ", IPv4::make_prefix(ai->subnet_addr(). prefix_len()).str().c_str()); printf("broadcast %s\n", ai->broadcast_addr().str().c_str()); } } for (ai = vif->addr_list().begin(); ai != vif->addr_list().end(); ai++) { IPvX addr = ai->addr(); if (addr.is_ipv6()) { printf("inet6 %s ", addr.str().c_str()); printf("netmask %s ", IPv6::make_prefix(ai->subnet_addr(). prefix_len()).str().c_str()); } } }}intmain(int argc, char* const argv[]){ XorpUnexpectedHandler x(xorp_unexpected_handler); // // Initialize and start xlog // xlog_init(argv[0], NULL); xlog_set_verbose(XLOG_VERBOSE_LOW); // Least verbose messages // XXX: verbosity of the error messages temporary increased xlog_level_set_verbose(XLOG_LEVEL_ERROR, XLOG_VERBOSE_HIGH); xlog_add_default_output(); xlog_start(); UNUSED(argc); UNUSED(argv); EventLoop eventloop; string process; process = c_format("interface_monitor%d", getpid()); try { XrlRouter xrl_rtr(eventloop, process.c_str()); InterfaceMonitor ifmon(xrl_rtr, eventloop); bool timed_out = false; XorpTimer t = eventloop.set_flag_after_ms(10000, &timed_out); xrl_rtr.finalize(); while (xrl_rtr.ready() == false) { eventloop.run(); } ifmon.start(); while (ifmon.state() == InterfaceMonitor::INITIALIZING) { eventloop.run(); } ifmon.print_results(); } catch(...) { xorp_catch_standard_exceptions(); } // // Gracefully stop and exit xlog // xlog_stop(); xlog_exit(); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -