📄 ripng_interface.c
字号:
}/* Delete interface from ripng_enable_if. */intripng_enable_if_delete (char *ifname){ int index; char *str; index = ripng_enable_if_lookup (ifname); if (index < 0) return -1; str = vector_slot (ripng_enable_if, index); free (str); vector_unset (ripng_enable_if, index); return 1;}/* Wake up interface. */intripng_interface_wakeup (struct thread *t){ struct interface *ifp; struct ripng_interface *ri; /* Get interface. */ ifp = THREAD_ARG (t); ri = ifp->info; ri->t_wakeup = NULL; /* Join to multicast group. */ ripng_multicast_join (ifp); /* Send RIP request to the interface. */ ripng_request (ifp); return 0;}/* Check RIPng is enabed on this interface. */voidripng_enable_apply (struct interface *ifp){ int ret; struct ripng_interface *ri = NULL; /* Check interface. */ if (if_is_loopback (ifp)) return; if (! if_is_up (ifp)) return; ri = ifp->info; /* Check network configuration. */ ret = ripng_enable_network_lookup (ifp); /* If the interface is matched. */ if (ret > 0) ri->enable_network = 1; else ri->enable_network = 0; /* Check interface name configuration. */ ret = ripng_enable_if_lookup (ifp->name); if (ret >= 0) ri->enable_interface = 1; else ri->enable_interface = 0; /* Update running status of the interface. */ if (ri->enable_network || ri->enable_interface) { if (! ri->running) { if (IS_RIPNG_DEBUG_EVENT) zlog_info ("RIPng turn on %s", ifp->name); /* Add interface wake up thread. */ if (! ri->t_wakeup) ri->t_wakeup = thread_add_timer (master, ripng_interface_wakeup, ifp, 1);#if 0 /* Join to multicast group. */ ripng_multicast_join (ifp); /* Send RIP request to the interface. */ ripng_request (ifp);#endif /* 0 */ ri->running = 1; } } else { if (ri->running) { if (IS_RIPNG_DEBUG_EVENT) zlog_info ("RIPng turn off %s", ifp->name); /* Leave from multicast group. */ ripng_multicast_leave (ifp); ri->running = 0; } }}/* Set distribute list to all interfaces. */static voidripng_enable_apply_all (){ struct interface *ifp; listnode node; for (node = listhead (iflist); node; nextnode (node)) { ifp = getdata (node); ripng_enable_apply (ifp); }}/* Vector to store passive-interface name. */vector Vripng_passive_interface;/* Utility function for looking up passive interface settings. */intripng_passive_interface_lookup (char *ifname){ int i; char *str; for (i = 0; i < vector_max (Vripng_passive_interface); i++) if ((str = vector_slot (Vripng_passive_interface, i)) != NULL) if (strcmp (str, ifname) == 0) return i; return -1;}voidripng_passive_interface_apply (struct interface *ifp){ int ret; struct ripng_interface *ri; ri = ifp->info; ret = ripng_passive_interface_lookup (ifp->name); if (ret < 0) ri->passive = 0; else ri->passive = 1;}voidripng_passive_interface_apply_all (void){ struct interface *ifp; listnode node; for (node = listhead (iflist); node; nextnode (node)) { ifp = getdata (node); ripng_passive_interface_apply (ifp); }}/* Passive interface. */intripng_passive_interface_set (struct vty *vty, char *ifname){ if (ripng_passive_interface_lookup (ifname) >= 0) return CMD_WARNING; vector_set (Vripng_passive_interface, strdup (ifname)); ripng_passive_interface_apply_all (); return CMD_SUCCESS;}intripng_passive_interface_unset (struct vty *vty, char *ifname){ int i; char *str; i = ripng_passive_interface_lookup (ifname); if (i < 0) return CMD_WARNING; str = vector_slot (Vripng_passive_interface, i); free (str); vector_unset (Vripng_passive_interface, i); ripng_passive_interface_apply_all (); return CMD_SUCCESS;}/* Free all configured RIP passive-interface settings. */voidripng_passive_interface_clean (void){ int i; char *str; for (i = 0; i < vector_max (Vripng_passive_interface); i++) if ((str = vector_slot (Vripng_passive_interface, i)) != NULL) { free (str); vector_slot (Vripng_passive_interface, i) = NULL; } ripng_passive_interface_apply_all ();}/* Write RIPng enable network and interface to the vty. */intripng_network_write (struct vty *vty){ int i; char *str; char *ifname; struct route_node *node; char buf[BUFSIZ]; /* Write enable network. */ for (node = route_top (ripng_enable_network); node; node = route_next (node)) if (node->info) { struct prefix *p = &node->p; vty_out (vty, " network %s/%d%s", inet_ntop (p->family, &p->u.prefix, buf, BUFSIZ), p->prefixlen, VTY_NEWLINE); } /* Write enable interface. */ for (i = 0; i < vector_max (ripng_enable_if); i++) if ((str = vector_slot (ripng_enable_if, i)) != NULL) vty_out (vty, " network %s%s", str, VTY_NEWLINE); /* Write passive interface. */ for (i = 0; i < vector_max (Vripng_passive_interface); i++) if ((ifname = vector_slot (Vripng_passive_interface, i)) != NULL) vty_out (vty, " passive-interface %s%s", ifname, VTY_NEWLINE); return 0;}/* RIPng enable on specified interface or matched network. */DEFUN (ripng_network, ripng_network_cmd, "network IF_OR_ADDR", "RIPng enable on specified interface or network.\n" "Interface or address"){ int ret; struct prefix p; ret = str2prefix (argv[0], &p); /* Given string is IPv6 network or interface name. */ if (ret) ret = ripng_enable_network_add (&p); else ret = ripng_enable_if_add (argv[0]); if (ret < 0) { vty_out (vty, "There is same network configuration %s%s", argv[0], VTY_NEWLINE); return CMD_WARNING; } ripng_enable_apply_all (); return CMD_SUCCESS;}/* RIPng enable on specified interface or matched network. */DEFUN (no_ripng_network, no_ripng_network_cmd, "no network IF_OR_ADDR", NO_STR "RIPng enable on specified interface or network.\n" "Interface or address"){ int ret; struct prefix p; ret = str2prefix (argv[0], &p); /* Given string is interface name. */ if (ret) ret = ripng_enable_network_delete (&p); else ret = ripng_enable_if_delete (argv[0]); if (ret < 0) { vty_out (vty, "can't find network %s%s", argv[0], VTY_NEWLINE); return CMD_WARNING; } ripng_enable_apply_all (); return CMD_SUCCESS;}DEFUN (ripng_passive_interface, ripng_passive_interface_cmd, "passive-interface IFNAME", "Suppress routing updates on an interface\n" "Interface name\n"){ return ripng_passive_interface_set (vty, argv[0]);}DEFUN (no_ripng_passive_interface, no_ripng_passive_interface_cmd, "no passive-interface IFNAME", NO_STR "Suppress routing updates on an interface\n" "Interface name\n"){ return ripng_passive_interface_unset (vty, argv[0]);}struct ripng_interface *ri_new (){ struct ripng_interface *ri; ri = XCALLOC (MTYPE_IF, sizeof (struct ripng_interface)); return ri;}intripng_if_new_hook (struct interface *ifp){ ifp->info = ri_new (); return 0;}/* Configuration write function for ripngd. */intinterface_config_write (struct vty *vty){ listnode node; struct interface *ifp; struct ripng_interface *ri; int write = 0; for (node = listhead (iflist); node; nextnode (node)) { ifp = getdata (node); ri = ifp->info; vty_out (vty, "interface %s%s", ifp->name, VTY_NEWLINE); if (ifp->desc) vty_out (vty, " description %s%s", ifp->desc, VTY_NEWLINE); vty_out (vty, "!%s", VTY_NEWLINE); write++; } return write;}/* ripngd's interface node. */struct cmd_node interface_node ={ INTERFACE_NODE, "%s(config-if)# ",};/* Initialization of interface. */voidripng_if_init (){ /* Interface initialize. */ iflist = list_new (); if_add_hook (IF_NEW_HOOK, ripng_if_new_hook); /* RIPng enable network init. */ ripng_enable_network = route_table_init (); /* RIPng enable interface init. */ ripng_enable_if = vector_init (1); /* RIPng passive interface. */ Vripng_passive_interface = vector_init (1); /* Install interface node. */ install_node (&interface_node, interface_config_write); install_element (CONFIG_NODE, &interface_cmd); install_element (INTERFACE_NODE, &config_end_cmd); install_element (INTERFACE_NODE, &config_exit_cmd); install_element (INTERFACE_NODE, &config_help_cmd); install_element (INTERFACE_NODE, &interface_desc_cmd); install_element (INTERFACE_NODE, &no_interface_desc_cmd); install_element (RIPNG_NODE, &ripng_network_cmd); install_element (RIPNG_NODE, &no_ripng_network_cmd); install_element (RIPNG_NODE, &ripng_passive_interface_cmd); install_element (RIPNG_NODE, &no_ripng_passive_interface_cmd);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -