⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rtadv.c

📁 zebra测试源代码用于 SOCKET 通信
💻 C
📖 第 1 页 / 共 2 页
字号:
      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 + -