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

📄 ripng_interface.c

📁 大名鼎鼎的路由器源码。程序分ZEBRA、OSPFRIP等3个包。程序框架采用一个路由协议一个进程的方式
💻 C
📖 第 1 页 / 共 2 页
字号:
}/* 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 + -