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

📄 ripngd.c

📁 大名鼎鼎的路由器源码。程序分ZEBRA、OSPFRIP等3个包。程序框架采用一个路由协议一个进程的方式
💻 C
📖 第 1 页 / 共 5 页
字号:
		ripng_packet_dump ((struct ripng_packet *)STREAM_DATA (s),				   stream_get_endp(s), "SEND");	      num = 0;	      stream_reset (s);	    }	}    }    /* If unwritten RTE exist, flush it. */  if (num != 0)    {      ret = ripng_send_packet (STREAM_DATA (s), stream_get_endp (s),			       to, ifp);      if (ret >= 0 && IS_RIPNG_DEBUG_SEND)	ripng_packet_dump ((struct ripng_packet *)STREAM_DATA (s),			   stream_get_endp (s), "SEND");      num = 0;      stream_reset (s);    }}/* Create new RIPng instance and set it to global variable. */intripng_create (){  /* ripng should be NULL. */  assert (ripng == NULL);  /* Allocaste RIPng instance. */  ripng = XMALLOC (0, sizeof (struct ripng));  memset (ripng, 0, sizeof (struct ripng));  /* Default version and timer values. */  ripng->version = RIPNG_V1;  ripng->update_time = RIPNG_UPDATE_TIMER_DEFAULT;  ripng->timeout_time = RIPNG_TIMEOUT_TIMER_DEFAULT;  ripng->garbage_time = RIPNG_GARBAGE_TIMER_DEFAULT;  ripng->default_metric = RIPNG_DEFAULT_METRIC_DEFAULT;    /* Make buffer.  */  ripng->ibuf = stream_new (RIPNG_MAX_PACKET_SIZE * 5);  ripng->obuf = stream_new (RIPNG_MAX_PACKET_SIZE);  /* Initialize RIPng routig table. */  ripng->table = route_table_init ();  ripng->route = route_table_init ();  ripng->aggregate = route_table_init ();   /* Make socket. */  ripng->sock = ripng_make_socket ();  if (ripng->sock < 0)    return ripng->sock;  /* Threads. */  ripng_event (RIPNG_READ, ripng->sock);  ripng_event (RIPNG_UPDATE_EVENT, 1);  return 0;}/* Sned RIPng request to the interface. */intripng_request (struct interface *ifp){  struct rte *rte;  struct ripng_packet ripng_packet;  if (IS_RIPNG_DEBUG_EVENT)    zlog_info ("RIPng send request to %s", ifp->name);  memset (&ripng_packet, 0, sizeof (ripng_packet));  ripng_packet.command = RIPNG_REQUEST;  ripng_packet.version = RIPNG_V1;  rte = ripng_packet.rte;  rte->metric = RIPNG_METRIC_INFINITY;  return ripng_send_packet ((caddr_t) &ripng_packet, sizeof (ripng_packet), 			    NULL, ifp);}/* Clean up installed RIPng routes. */voidripng_terminate (){  struct route_node *rp;  struct ripng_info *rinfo;  for (rp = route_top (ripng->table); rp; rp = route_next (rp))    if ((rinfo = rp->info) != NULL)      {	if (rinfo->type == ZEBRA_ROUTE_RIPNG &&	    rinfo->sub_type == RIPNG_ROUTE_RTE)	  ripng_zebra_ipv6_delete ((struct prefix_ipv6 *)&rp->p,				   &rinfo->nexthop, rinfo->ifindex);      }}intripng_update_jitter (int time){  return ((rand () % (time + 1)) - (time / 2));}voidripng_event (enum ripng_event event, int sock){  int ripng_request_all (struct thread *);  int jitter = 0;  switch (event)    {    case RIPNG_READ:      if (!ripng->t_read)	ripng->t_read = thread_add_read (master, ripng_read, NULL, sock);      break;    case RIPNG_UPDATE_EVENT:      if (ripng->t_update)	{	  thread_cancel (ripng->t_update);	  ripng->t_update = NULL;	}      /* Update timer jitter. */      jitter = ripng_update_jitter (ripng->update_time);      ripng->t_update = 	thread_add_timer (master, ripng_update, NULL, 			  sock ? 2 : ripng->update_time + jitter);      break;    case RIPNG_TRIGGERED_UPDATE:      if (ripng->t_triggered_interval)	ripng->trigger = 1;      else if (! ripng->t_triggered_update)	ripng->t_triggered_update = 	  thread_add_event (master, ripng_triggered_update, NULL, 0);      break;    default:      break;    }}/* Each route type's strings and default preference. */struct{    int key;  char *str;  char *str_long;  int distance;} route_info[] ={  { ZEBRA_ROUTE_SYSTEM,  "X", "system",    10},  { ZEBRA_ROUTE_KERNEL,  "K", "kernel",    20},  { ZEBRA_ROUTE_CONNECT, "C", "connected", 30},  { ZEBRA_ROUTE_STATIC,  "S", "static",    40},  { ZEBRA_ROUTE_RIP,     "R", "rip",       50},  { ZEBRA_ROUTE_RIPNG,   "R", "ripng",     50},  { ZEBRA_ROUTE_OSPF,    "O", "ospf",      60},  { ZEBRA_ROUTE_OSPF6,   "O", "ospf6",     60},  { ZEBRA_ROUTE_BGP,     "B", "bgp",       70},};/* For messages. */struct message ripng_route_info[] ={  { RIPNG_ROUTE_RTE,       " "},  { RIPNG_ROUTE_STATIC,    "S"},  { RIPNG_ROUTE_AGGREGATE, "a"}};/* Print out routes update time. */static voidripng_vty_out_uptime (struct vty *vty, struct ripng_info *rinfo){  struct timeval timer_now;  time_t clock;  struct tm *tm;#define TIME_BUF 25  char timebuf [TIME_BUF];  struct thread *thread;    gettimeofday (&timer_now, NULL);  if ((thread = rinfo->t_timeout) != NULL)    {      clock = thread->u.sands.tv_sec - timer_now.tv_sec;      tm = gmtime (&clock);      strftime (timebuf, TIME_BUF, "%M:%S", tm);      vty_out (vty, "%5s", timebuf);    }  else if ((thread = rinfo->t_garbage_collect) != NULL)    {      clock = thread->u.sands.tv_sec - timer_now.tv_sec;      tm = gmtime (&clock);      strftime (timebuf, TIME_BUF, "%M:%S", tm);      vty_out (vty, "%5s", timebuf);    }}DEFUN (show_ipv6_ripng,       show_ipv6_ripng_cmd,       "show ipv6 ripng",       SHOW_STR       IP_STR       "Show RIPng routes\n"){  struct route_node *rp;  struct ripng_info *rinfo;  struct ripng_aggregate *aggregate;  struct prefix_ipv6 *p;  int len;  /* Header of display. */   vty_out (vty, "%sCodes: R - RIPng%s%s"	   "   Network                           "	   "Next Hop                  If Met Tag Time%s", VTY_NEWLINE,	   VTY_NEWLINE, VTY_NEWLINE, VTY_NEWLINE);    for (rp = route_top (ripng->table); rp; rp = route_next (rp))    {      if ((aggregate = rp->aggregate) != NULL)	{	  p = (struct prefix_ipv6 *) &rp->p;#ifdef DEBUG	  len = vty_out (vty, "Ra %d/%d %s/%d ",			 aggregate->count, aggregate->suppress,			 inet6_ntop (&p->prefix), p->prefixlen);#else	  len = vty_out (vty, "Ra %s/%d ", 			 inet6_ntop (&p->prefix), p->prefixlen);#endif /* DEBUG */	  len = 37 - len;	  if (len > 0)	    vty_out (vty, "%*s", len, " ");	  vty_out (vty, "%*s", 26, " ");	  vty_out (vty, "%4d %3d%s", aggregate->metric,		   aggregate->tag,		   VTY_NEWLINE);	}      if ((rinfo = rp->info) != NULL)	{	  p = (struct prefix_ipv6 *) &rp->p;#ifdef DEBUG	  len = vty_out (vty, "%s%s 0/%d %s/%d ",			 route_info[rinfo->type].str,			 rinfo->suppress ? "s" : " ",			 rinfo->suppress,			 inet6_ntop (&p->prefix), p->prefixlen);#else	  len = vty_out (vty, "%s%s %s/%d ",			 route_info[rinfo->type].str,			 rinfo->suppress ? "s" : " ",			 inet6_ntop (&p->prefix), p->prefixlen);#endif /* DEBUG */	  len = 37 - len;	  if (len > 0)	    vty_out (vty, "%*s", len, " ");	  len = vty_out (vty, "%s", inet6_ntop (&rinfo->nexthop));	  len = 26 - len;	  if (len > 0)	    vty_out (vty, "%*s", len, " ");	  vty_out (vty, "%2d %2d %3d ",		   rinfo->ifindex, rinfo->metric, rinfo->tag);	  if (rinfo->sub_type == RIPNG_ROUTE_RTE)	    ripng_vty_out_uptime (vty, rinfo);	  vty_out (vty, "%s", VTY_NEWLINE);	}    }  return CMD_SUCCESS;}DEFUN (router_ripng,       router_ripng_cmd,       "router ripng",       "Enable a routing process\n"       "Make RIPng instance command\n"){  int ret;  vty->node = RIPNG_NODE;  if (!ripng)    {      ret = ripng_create ();      /* Notice to user we couldn't create RIPng. */      if (ret < 0)	{	  zlog_warn ("can't create RIPng");	  return CMD_WARNING;	}    }  return CMD_SUCCESS;}DEFUN (ripng_route,       ripng_route_cmd,       "route IPV6ADDR",       "Static route setup\n"       "Set static RIPng route announcement\n"){  int ret;  struct prefix_ipv6 p;  struct route_node *rp;  ret = str2prefix_ipv6 (argv[0], (struct prefix_ipv6 *)&p);  if (ret <= 0)    {      vty_out (vty, "Malformed address%s", VTY_NEWLINE);      return CMD_WARNING;    }  apply_mask_ipv6 (&p);  rp = route_node_get (ripng->route, (struct prefix *) &p);  if (rp->info)    {      vty_out (vty, "There is already same static route.%s", VTY_NEWLINE);      route_unlock_node (rp);      return CMD_WARNING;    }  rp->info = (void *)1;  ripng_redistribute_add (ZEBRA_ROUTE_RIPNG, RIPNG_ROUTE_STATIC, &p, 0);  return CMD_SUCCESS;}DEFUN (no_ripng_route,       no_ripng_route_cmd,       "no route IPV6ADDR",       NO_STR       "Static route setup\n"       "Delete static RIPng route announcement\n"){  int ret;  struct prefix_ipv6 p;  struct route_node *rp;  ret = str2prefix_ipv6 (argv[0], (struct prefix_ipv6 *)&p);  if (ret <= 0)    {      vty_out (vty, "Malformed address%s", VTY_NEWLINE);      return CMD_WARNING;    }  apply_mask_ipv6 (&p);  rp = route_node_lookup (ripng->route, (struct prefix *) &p);  if (! rp)    {      vty_out (vty, "Can't find static route.%s", VTY_NEWLINE);      return CMD_WARNING;    }  ripng_redistribute_delete (ZEBRA_ROUTE_RIPNG, RIPNG_ROUTE_STATIC, &p, 0);  route_unlock_node (rp);  rp->info = NULL;  route_unlock_node (rp);  return CMD_SUCCESS;}DEFUN (ripng_aggregate_address,       ripng_aggregate_address_cmd,       "aggregate-address X:X::X:X/M",       "Set aggregate RIPng route announcement\n"       "Aggregate network\n"){  int ret;  struct prefix p;  struct route_node *node;  ret = str2prefix_ipv6 (argv[0], (struct prefix_ipv6 *)&p);  if (ret <= 0)    {      vty_out (vty, "Malformed address%s", VTY_NEWLINE);      return CMD_WARNING;    }  /* Check aggregate alredy exist or not. */  node = route_node_get (ripng->aggregate, &p);  if (node->info)    {      vty_out (vty, "There is already same aggregate route.%s", VTY_NEWLINE);      route_unlock_node (node);      return CMD_WARNING;    }  node->info = (void *)1;  ripng_aggregate_add (&p);  return CMD_SUCCESS;}DEFUN (no_ripng_aggregate_address,       no_ripng_aggregate_address_cmd,       "no aggregate-address X:X::X:X/M",       NO_STR       "Delete aggregate RIPng route announcement\n"       "Aggregate network"){  int ret;  struct prefix p;  struct route_node *rn;  ret = str2prefix_ipv6 (argv[0], (struct prefix_ipv6 *) &p);  if (ret <= 0)    {      vty_out (vty, "Malformed address%s", VTY_NEWLINE);      return CMD_WARNING;    }  rn = route_node_lookup (ripng->aggregate, &p);  if (! rn)    {      vty_out (vty, "Can't find aggregate route.%s", VTY_NEWLINE);      return CMD_WARNING;    }  route_unlock_node (rn);  rn->info = NULL;  route_unlock_node (rn);  ripng_aggregate_delete (&p);  return CMD_SUCCESS;}DEFUN (ripng_default_metric,       ripng_default_metric_cmd,       "default-metric <1-16>",       "Set a metric of redistribute routes\n"       "Default metric\n"){  if (ripng)    {      ripng->default_metric = atoi (argv[0]);    }  return CMD_SUCCESS;}DEFUN (no_ripng_default_metric,       no_ripng_default_metric_cmd,       "no default-metric",       NO_STR       "Set a metric of redistribute routes\n"       "Default metric\n"){  if (ripng)    {      ripng->default_metric = RIPNG_DEFAULT_METRIC_DEFAULT;    }  return CMD_SUCCESS;}ALIAS (no_ripng_default_metric,       no_ripng_default_metric_val_cmd,       "no default-metric <1-16>",       NO_STR       "Set a metric of redistribute routes\n"       "Default metric\n");#if 0/* RIPng update timer setup. */DEFUN (ripng_update_timer,       ripng_update_timer_cmd,       "update-timer SECOND",       "Set RIPng update timer in seconds\n"       "Seconds\n"){  unsigned long update;  char *endptr = NULL;  update = strtoul (argv[0], &endptr, 10);  if (update == ULONG_MAX || *endptr != '\0')    {      vty_out (vty, "update timer value error%s", VTY_NEWLINE);      return CMD_WARNING;    }  ripng->update_time = update;  ripng_event (RIPNG_UPDATE_EVENT, 0);  return CMD_SUCCESS;}DEFUN (no_ripng_update_timer,       no_ripng_update_timer_cmd,       "no update-timer SECOND",       NO_STR       "Unset RIPng update timer in seconds\n"       "Seconds\n"){

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -