📄 rtadv.c
字号:
if (rtadv->adv_if_count == 0) rtadv_event (RTADV_STOP, 0); } return CMD_SUCCESS;}ALIAS (ipv6_nd_suppress_ra, no_ipv6_nd_send_ra_cmd, "no ipv6 nd send-ra", NO_STR IP_STR "Neighbor discovery\n" "Send Router Advertisement\n");DEFUN (no_ipv6_nd_suppress_ra, no_ipv6_nd_suppress_ra_cmd, "no ipv6 nd suppress-ra", NO_STR IP_STR "Neighbor discovery\n" "Suppress Router Advertisement\n"){ struct interface *ifp; struct zebra_if *zif; ifp = vty->index; zif = ifp->info; if (if_is_loopback (ifp)) { vty_out (vty, "Invalid interface%s", VTY_NEWLINE); return CMD_WARNING; } if (! zif->rtadv.AdvSendAdvertisements) { zif->rtadv.AdvSendAdvertisements = 1; zif->rtadv.AdvIntervalTimer = 0; rtadv->adv_if_count++; if_join_all_router (rtadv->sock, ifp); if (rtadv->adv_if_count == 1) rtadv_event (RTADV_START, rtadv->sock); } return CMD_SUCCESS;}ALIAS (no_ipv6_nd_suppress_ra, ipv6_nd_send_ra_cmd, "ipv6 nd send-ra", IP_STR "Neighbor discovery\n" "Send Router Advertisement\n");DEFUN (ipv6_nd_ra_interval, ipv6_nd_ra_interval_cmd, "ipv6 nd ra-interval SECONDS", IP_STR "Neighbor discovery\n" "Router Advertisement interval\n" "Router Advertisement interval in seconds\n"){ int interval; struct interface *ifp; struct zebra_if *zif; ifp = (struct interface *) vty->index; zif = ifp->info; interval = atoi (argv[0]); if (interval < 0) { vty_out (vty, "Invalid Router Advertisement Interval%s", VTY_NEWLINE); return CMD_WARNING; } zif->rtadv.MaxRtrAdvInterval = interval; zif->rtadv.MinRtrAdvInterval = 0.33 * interval; zif->rtadv.AdvIntervalTimer = 0; return CMD_SUCCESS;}DEFUN (no_ipv6_nd_ra_interval, no_ipv6_nd_ra_interval_cmd, "no ipv6 nd ra-interval", NO_STR IP_STR "Neighbor discovery\n" "Router Advertisement interval\n"){ struct interface *ifp; struct zebra_if *zif; ifp = (struct interface *) vty->index; zif = ifp->info; zif->rtadv.MaxRtrAdvInterval = RTADV_MAX_RTR_ADV_INTERVAL; zif->rtadv.MinRtrAdvInterval = RTADV_MIN_RTR_ADV_INTERVAL; zif->rtadv.AdvIntervalTimer = zif->rtadv.MaxRtrAdvInterval; return CMD_SUCCESS;}DEFUN (ipv6_nd_ra_lifetime, ipv6_nd_ra_lifetime_cmd, "ipv6 nd ra-lifetime SECONDS", IP_STR "Neighbor discovery\n" "Router lifetime\n" "Router lifetime in seconds\n"){ int lifetime; struct interface *ifp; struct zebra_if *zif; ifp = (struct interface *) vty->index; zif = ifp->info; lifetime = atoi (argv[0]); if (lifetime < 0 || lifetime > 0xffff) { vty_out (vty, "Invalid Router Lifetime%s", VTY_NEWLINE); return CMD_WARNING; } zif->rtadv.AdvDefaultLifetime = lifetime; return CMD_SUCCESS;}DEFUN (no_ipv6_nd_ra_lifetime, no_ipv6_nd_ra_lifetime_cmd, "no ipv6 nd ra-lifetime", NO_STR IP_STR "Neighbor discovery\n" "Router lifetime\n"){ struct interface *ifp; struct zebra_if *zif; ifp = (struct interface *) vty->index; zif = ifp->info; zif->rtadv.AdvDefaultLifetime = RTADV_ADV_DEFAULT_LIFETIME; return CMD_SUCCESS;}DEFUN (ipv6_nd_reachable_time, ipv6_nd_reachable_time_cmd, "ipv6 nd reachable-time MILLISECONDS", IP_STR "Neighbor discovery\n" "Reachable time\n" "Reachable time in milliseconds\n"){ u_int32_t rtime; struct interface *ifp; struct zebra_if *zif; ifp = (struct interface *) vty->index; zif = ifp->info; rtime = (u_int32_t) atol (argv[0]); if (rtime > RTADV_MAX_REACHABLE_TIME) { vty_out (vty, "Invalid Reachable time%s", VTY_NEWLINE); return CMD_WARNING; } zif->rtadv.AdvReachableTime = rtime; return CMD_SUCCESS;}DEFUN (no_ipv6_nd_reachable_time, no_ipv6_nd_reachable_time_cmd, "no ipv6 nd reachable-time", NO_STR IP_STR "Neighbor discovery\n" "Reachable time\n"){ struct interface *ifp; struct zebra_if *zif; ifp = (struct interface *) vty->index; zif = ifp->info; zif->rtadv.AdvReachableTime = 0; return CMD_SUCCESS;}DEFUN (ipv6_nd_managed_config_flag, ipv6_nd_managed_config_flag_cmd, "ipv6 nd managed-config-flag", IP_STR "Neighbor discovery\n" "Managed address configuration flag\n"){ struct interface *ifp; struct zebra_if *zif; ifp = (struct interface *) vty->index; zif = ifp->info; zif->rtadv.AdvManagedFlag = 1; return CMD_SUCCESS;}DEFUN (no_ipv6_nd_managed_config_flag, no_ipv6_nd_managed_config_flag_cmd, "no ipv6 nd managed-config-flag", NO_STR IP_STR "Neighbor discovery\n" "Managed address configuration flag\n"){ struct interface *ifp; struct zebra_if *zif; ifp = (struct interface *) vty->index; zif = ifp->info; zif->rtadv.AdvManagedFlag = 0; return CMD_SUCCESS;}DEFUN (ipv6_nd_other_config_flag, ipv6_nd_other_config_flag_cmd, "ipv6 nd other-config-flag", IP_STR "Neighbor discovery\n" "Other statefull configuration flag\n"){ struct interface *ifp; struct zebra_if *zif; ifp = (struct interface *) vty->index; zif = ifp->info; zif->rtadv.AdvOtherConfigFlag = 1; return CMD_SUCCESS;}DEFUN (no_ipv6_nd_other_config_flag, no_ipv6_nd_other_config_flag_cmd, "no ipv6 nd other-config-flag", NO_STR IP_STR "Neighbor discovery\n" "Other statefull configuration flag\n"){ struct interface *ifp; struct zebra_if *zif; ifp = (struct interface *) vty->index; zif = ifp->info; zif->rtadv.AdvOtherConfigFlag = 0; return CMD_SUCCESS;}DEFUN (ipv6_nd_prefix_advertisement, ipv6_nd_prefix_advertisement_cmd, "ipv6 nd prefix-advertisement IPV6PREFIX VALID PREFERRED [onlink] [autoconfig]", IP_STR "Neighbor discovery\n" "Prefix information\n" "IPv6 prefix\n" "Valid lifetime in seconds\n" "Preferred lifetime in seconds\n" "On link flag\n" "Autonomous address-configuration flag\n"){ int i; int ret; struct interface *ifp; struct zebra_if *zebra_if; struct rtadv_prefix rp; ifp = (struct interface *) vty->index; zebra_if = ifp->info; ret = str2prefix_ipv6 (argv[0], (struct prefix_ipv6 *) &rp.prefix); if (!ret) { vty_out (vty, "Malformed IPv6 prefix%s", VTY_NEWLINE); return CMD_WARNING; } if (argc == 1) { rp.AdvValidLifetime = RTADV_VALID_LIFETIME; rp.AdvPreferredLifetime = RTADV_PREFERRED_LIFETIME; rp.AdvOnLinkFlag = 1; rp.AdvAutonomousFlag = 1; } else { rp.AdvValidLifetime = (u_int32_t) atol (argv[1]); rp.AdvPreferredLifetime = (u_int32_t) atol (argv[2]); if (rp.AdvPreferredLifetime > rp.AdvValidLifetime) { vty_out (vty, "Invalid preferred lifetime%s", VTY_NEWLINE); return CMD_WARNING; } rp.AdvOnLinkFlag = 0; rp.AdvAutonomousFlag = 0; for (i = 3; i < argc; i++) { if (! strcmp (argv[i], "onlink")) rp.AdvOnLinkFlag = 1; else if (! strcmp (argv[i], "autoconfig")) rp.AdvAutonomousFlag = 1; } } rtadv_prefix_set (zebra_if, &rp); return CMD_SUCCESS;}ALIAS (ipv6_nd_prefix_advertisement, ipv6_nd_prefix_advertisement_no_val_cmd, "ipv6 nd prefix-advertisement IPV6PREFIX", IP_STR "Neighbor discovery\n" "Prefix information\n" "IPv6 prefix\n");DEFUN (no_ipv6_nd_prefix_advertisement, no_ipv6_nd_prefix_advertisement_cmd, "no ipv6 nd prefix-advertisement IPV6PREFIX", NO_STR IP_STR "Neighbor discovery\n" "Prefix information\n" "IPv6 prefix\n"){ int ret; struct interface *ifp; struct zebra_if *zebra_if; struct rtadv_prefix rp; ifp = (struct interface *) vty->index; zebra_if = ifp->info; ret = str2prefix_ipv6 (argv[0], (struct prefix_ipv6 *) &rp.prefix); if (!ret) { vty_out (vty, "Malformed IPv6 prefix%s", VTY_NEWLINE); return CMD_WARNING; } ret = rtadv_prefix_reset (zebra_if, &rp); if (!ret) { vty_out (vty, "Non-exist IPv6 prefix%s", VTY_NEWLINE); return CMD_WARNING; } return CMD_SUCCESS;}/* Write configuration about router advertisement. */voidrtadv_config_write (struct vty *vty, struct interface *ifp){ struct zebra_if *zif; listnode node; struct rtadv_prefix *rprefix; u_char buf[INET6_ADDRSTRLEN]; if (! rtadv) return; zif = ifp->info; if (! if_is_loopback (ifp)) { if (zif->rtadv.AdvSendAdvertisements) vty_out (vty, " no ipv6 nd suppress-ra%s", VTY_NEWLINE); else vty_out (vty, " ipv6 nd suppress-ra%s", VTY_NEWLINE); } if (zif->rtadv.MaxRtrAdvInterval != RTADV_MAX_RTR_ADV_INTERVAL) vty_out (vty, " ipv6 nd ra-interval %d%s", zif->rtadv.MaxRtrAdvInterval, VTY_NEWLINE); if (zif->rtadv.AdvDefaultLifetime != RTADV_ADV_DEFAULT_LIFETIME) vty_out (vty, " ipv6 nd ra-lifetime %d%s", zif->rtadv.AdvDefaultLifetime, VTY_NEWLINE); if (zif->rtadv.AdvReachableTime) vty_out (vty, " ipv6 nd reachable-time %d%s", zif->rtadv.AdvReachableTime, VTY_NEWLINE); if (zif->rtadv.AdvManagedFlag) vty_out (vty, " ipv6 nd managed-config-flag%s", VTY_NEWLINE); if (zif->rtadv.AdvOtherConfigFlag) vty_out (vty, " ipv6 nd other-config-flag%s", VTY_NEWLINE); for (node = listhead(zif->rtadv.AdvPrefixList); node; node = nextnode (node)) { rprefix = getdata (node); vty_out (vty, " ipv6 nd prefix-advertisement %s/%d %d %d", inet_ntop (AF_INET6, &rprefix->prefix.u.prefix6, buf, INET6_ADDRSTRLEN), rprefix->prefix.prefixlen, rprefix->AdvValidLifetime, rprefix->AdvPreferredLifetime); if (rprefix->AdvOnLinkFlag) vty_out (vty, " onlink"); if (rprefix->AdvAutonomousFlag) vty_out (vty, " autoconfig"); vty_out (vty, "%s", VTY_NEWLINE); }}extern struct thread_master *master;voidrtadv_event (enum rtadv_event event, int val){ switch (event) { case RTADV_START: if (! rtadv->ra_read) rtadv->ra_read = thread_add_read (master, rtadv_read, NULL, val); if (! rtadv->ra_timer) rtadv->ra_timer = thread_add_event (master, rtadv_timer, NULL, 0); break; case RTADV_STOP: if (rtadv->ra_timer) { thread_cancel (rtadv->ra_timer); rtadv->ra_timer = NULL; } if (rtadv->ra_read) { thread_cancel (rtadv->ra_read); rtadv->ra_read = NULL; } break; case RTADV_TIMER: if (! rtadv->ra_timer) rtadv->ra_timer = thread_add_timer (master, rtadv_timer, NULL, val); break; case RTADV_READ: if (! rtadv->ra_read) rtadv->ra_read = thread_add_read (master, rtadv_read, NULL, val); break; default: break; } return;}voidrtadv_init (){ int sock; sock = rtadv_make_socket (); if (sock < 0) return; rtadv = rtadv_new (); rtadv->sock = sock; install_element (INTERFACE_NODE, &ipv6_nd_suppress_ra_cmd); install_element (INTERFACE_NODE, &no_ipv6_nd_suppress_ra_cmd); install_element (INTERFACE_NODE, &ipv6_nd_send_ra_cmd); install_element (INTERFACE_NODE, &no_ipv6_nd_send_ra_cmd); install_element (INTERFACE_NODE, &ipv6_nd_ra_interval_cmd); install_element (INTERFACE_NODE, &no_ipv6_nd_ra_interval_cmd); install_element (INTERFACE_NODE, &ipv6_nd_ra_lifetime_cmd); install_element (INTERFACE_NODE, &no_ipv6_nd_ra_lifetime_cmd); install_element (INTERFACE_NODE, &ipv6_nd_reachable_time_cmd); install_element (INTERFACE_NODE, &no_ipv6_nd_reachable_time_cmd); install_element (INTERFACE_NODE, &ipv6_nd_managed_config_flag_cmd); install_element (INTERFACE_NODE, &no_ipv6_nd_managed_config_flag_cmd); install_element (INTERFACE_NODE, &ipv6_nd_other_config_flag_cmd); install_element (INTERFACE_NODE, &no_ipv6_nd_other_config_flag_cmd); install_element (INTERFACE_NODE, &ipv6_nd_prefix_advertisement_cmd); install_element (INTERFACE_NODE, &ipv6_nd_prefix_advertisement_no_val_cmd); install_element (INTERFACE_NODE, &no_ipv6_nd_prefix_advertisement_cmd);}intif_join_all_router (int sock, struct interface *ifp){ int ret; struct ipv6_mreq mreq; memset (&mreq, 0, sizeof (struct ipv6_mreq)); inet_pton (AF_INET6, ALLROUTER, &mreq.ipv6mr_multiaddr); mreq.ipv6mr_interface = ifp->ifindex; ret = setsockopt (sock, IPPROTO_IPV6, IPV6_JOIN_GROUP, (char *) &mreq, sizeof mreq); if (ret < 0) zlog_warn ("can't setsockopt IPV6_JOIN_GROUP: %s", strerror (errno)); zlog_info ("rtadv: %s join to all-routers multicast group", ifp->name); return 0;}intif_leave_all_router (int sock, struct interface *ifp){ int ret; struct ipv6_mreq mreq; memset (&mreq, 0, sizeof (struct ipv6_mreq)); inet_pton (AF_INET6, ALLROUTER, &mreq.ipv6mr_multiaddr); mreq.ipv6mr_interface = ifp->ifindex; ret = setsockopt (sock, IPPROTO_IPV6, IPV6_LEAVE_GROUP, (char *) &mreq, sizeof mreq); if (ret < 0) zlog_warn ("can't setsockopt IPV6_LEAVE_GROUP: %s", strerror (errno)); zlog_info ("rtadv: %s leave from all-routers multicast group", ifp->name); return 0;}#elsevoidrtadv_init (){ /* Empty.*/;}#endif /* RTADV && HAVE_IPV6 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -