?? ripngd.c
字號:
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 + -