Annotation of embedaddon/quagga/ospf6d/ospf6_zebra.c, revision 1.1.1.2
1.1 misho 1: /*
2: * Copyright (C) 2003 Yasuhiro Ohara
3: *
4: * This file is part of GNU Zebra.
5: *
6: * GNU Zebra is free software; you can redistribute it and/or modify it
7: * under the terms of the GNU General Public License as published by the
8: * Free Software Foundation; either version 2, or (at your option) any
9: * later version.
10: *
11: * GNU Zebra is distributed in the hope that it will be useful, but
12: * WITHOUT ANY WARRANTY; without even the implied warranty of
13: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14: * General Public License for more details.
15: *
16: * You should have received a copy of the GNU General Public License
17: * along with GNU Zebra; see the file COPYING. If not, write to the
18: * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19: * Boston, MA 02111-1307, USA.
20: */
21:
22: #include <zebra.h>
23:
24: #include "log.h"
25: #include "vty.h"
26: #include "command.h"
27: #include "prefix.h"
28: #include "stream.h"
29: #include "zclient.h"
30: #include "memory.h"
31:
32: #include "ospf6_proto.h"
33: #include "ospf6_top.h"
34: #include "ospf6_interface.h"
35: #include "ospf6_route.h"
36: #include "ospf6_lsa.h"
37: #include "ospf6_lsdb.h"
38: #include "ospf6_asbr.h"
39: #include "ospf6_zebra.h"
40: #include "ospf6d.h"
41:
42: unsigned char conf_debug_ospf6_zebra = 0;
43:
44: /* information about zebra. */
45: struct zclient *zclient = NULL;
46:
47: struct in_addr router_id_zebra;
48:
49: /* Router-id update message from zebra. */
50: static int
51: ospf6_router_id_update_zebra (int command, struct zclient *zclient,
52: zebra_size_t length)
53: {
54: struct prefix router_id;
55: struct ospf6 *o = ospf6;
56:
57: zebra_router_id_update_read(zclient->ibuf,&router_id);
58: router_id_zebra = router_id.u.prefix4;
59:
60: if (o == NULL)
61: return 0;
62:
63: if (o->router_id == 0)
64: o->router_id = (u_int32_t) router_id_zebra.s_addr;
65:
66: return 0;
67: }
68:
69: /* redistribute function */
70: void
71: ospf6_zebra_redistribute (int type)
72: {
73: if (zclient->redist[type])
74: return;
75: zclient->redist[type] = 1;
76: if (zclient->sock > 0)
77: zebra_redistribute_send (ZEBRA_REDISTRIBUTE_ADD, zclient, type);
78: }
79:
80: void
81: ospf6_zebra_no_redistribute (int type)
82: {
83: if (! zclient->redist[type])
84: return;
85: zclient->redist[type] = 0;
86: if (zclient->sock > 0)
87: zebra_redistribute_send (ZEBRA_REDISTRIBUTE_DELETE, zclient, type);
88: }
89:
90: /* Inteface addition message from zebra. */
91: static int
92: ospf6_zebra_if_add (int command, struct zclient *zclient, zebra_size_t length)
93: {
94: struct interface *ifp;
95:
96: ifp = zebra_interface_add_read (zclient->ibuf);
97: if (IS_OSPF6_DEBUG_ZEBRA (RECV))
98: zlog_debug ("Zebra Interface add: %s index %d mtu %d",
99: ifp->name, ifp->ifindex, ifp->mtu6);
100: ospf6_interface_if_add (ifp);
101: return 0;
102: }
103:
104: static int
105: ospf6_zebra_if_del (int command, struct zclient *zclient, zebra_size_t length)
106: {
107: struct interface *ifp;
108:
109: if (!(ifp = zebra_interface_state_read(zclient->ibuf)))
110: return 0;
111:
112: if (if_is_up (ifp))
113: zlog_warn ("Zebra: got delete of %s, but interface is still up", ifp->name);
114:
115: if (IS_OSPF6_DEBUG_ZEBRA (RECV))
116: zlog_debug ("Zebra Interface delete: %s index %d mtu %d",
117: ifp->name, ifp->ifindex, ifp->mtu6);
118:
119: #if 0
120: /* Why is this commented out? */
121: ospf6_interface_if_del (ifp);
122: #endif /*0*/
123:
124: ifp->ifindex = IFINDEX_INTERNAL;
125: return 0;
126: }
127:
128: static int
129: ospf6_zebra_if_state_update (int command, struct zclient *zclient,
130: zebra_size_t length)
131: {
132: struct interface *ifp;
133:
134: ifp = zebra_interface_state_read (zclient->ibuf);
135: if (ifp == NULL)
136: return 0;
137:
138: if (IS_OSPF6_DEBUG_ZEBRA (RECV))
139: zlog_debug ("Zebra Interface state change: "
140: "%s index %d flags %llx metric %d mtu %d",
141: ifp->name, ifp->ifindex, (unsigned long long)ifp->flags,
142: ifp->metric, ifp->mtu6);
143:
144: ospf6_interface_state_update (ifp);
145: return 0;
146: }
147:
148: static int
149: ospf6_zebra_if_address_update_add (int command, struct zclient *zclient,
150: zebra_size_t length)
151: {
152: struct connected *c;
153: char buf[128];
154:
155: c = zebra_interface_address_read (ZEBRA_INTERFACE_ADDRESS_ADD, zclient->ibuf);
156: if (c == NULL)
157: return 0;
158:
159: if (IS_OSPF6_DEBUG_ZEBRA (RECV))
160: zlog_debug ("Zebra Interface address add: %s %5s %s/%d",
161: c->ifp->name, prefix_family_str (c->address),
162: inet_ntop (c->address->family, &c->address->u.prefix,
163: buf, sizeof (buf)), c->address->prefixlen);
164:
165: if (c->address->family == AF_INET6)
166: ospf6_interface_connected_route_update (c->ifp);
167:
168: return 0;
169: }
170:
171: static int
172: ospf6_zebra_if_address_update_delete (int command, struct zclient *zclient,
173: zebra_size_t length)
174: {
175: struct connected *c;
176: char buf[128];
177:
178: c = zebra_interface_address_read (ZEBRA_INTERFACE_ADDRESS_DELETE, zclient->ibuf);
179: if (c == NULL)
180: return 0;
181:
182: if (IS_OSPF6_DEBUG_ZEBRA (RECV))
183: zlog_debug ("Zebra Interface address delete: %s %5s %s/%d",
184: c->ifp->name, prefix_family_str (c->address),
185: inet_ntop (c->address->family, &c->address->u.prefix,
186: buf, sizeof (buf)), c->address->prefixlen);
187:
188: if (c->address->family == AF_INET6)
189: ospf6_interface_connected_route_update (c->ifp);
190:
191: return 0;
192: }
193:
194: static int
195: ospf6_zebra_read_ipv6 (int command, struct zclient *zclient,
196: zebra_size_t length)
197: {
198: struct stream *s;
199: struct zapi_ipv6 api;
200: unsigned long ifindex;
201: struct prefix_ipv6 p;
202: struct in6_addr *nexthop;
203:
204: s = zclient->ibuf;
205: ifindex = 0;
206: nexthop = NULL;
207: memset (&api, 0, sizeof (api));
208:
209: /* Type, flags, message. */
210: api.type = stream_getc (s);
211: api.flags = stream_getc (s);
212: api.message = stream_getc (s);
213:
214: /* IPv6 prefix. */
215: memset (&p, 0, sizeof (struct prefix_ipv6));
216: p.family = AF_INET6;
217: p.prefixlen = stream_getc (s);
218: stream_get (&p.prefix, s, PSIZE (p.prefixlen));
219:
220: /* Nexthop, ifindex, distance, metric. */
221: if (CHECK_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP))
222: {
223: api.nexthop_num = stream_getc (s);
224: nexthop = (struct in6_addr *)
225: malloc (api.nexthop_num * sizeof (struct in6_addr));
226: stream_get (nexthop, s, api.nexthop_num * sizeof (struct in6_addr));
227: }
228: if (CHECK_FLAG (api.message, ZAPI_MESSAGE_IFINDEX))
229: {
230: api.ifindex_num = stream_getc (s);
231: ifindex = stream_getl (s);
232: }
233: if (CHECK_FLAG (api.message, ZAPI_MESSAGE_DISTANCE))
234: api.distance = stream_getc (s);
235: else
236: api.distance = 0;
237: if (CHECK_FLAG (api.message, ZAPI_MESSAGE_METRIC))
238: api.metric = stream_getl (s);
239: else
240: api.metric = 0;
241:
242: if (IS_OSPF6_DEBUG_ZEBRA (RECV))
243: {
244: char prefixstr[128], nexthopstr[128];
245: prefix2str ((struct prefix *)&p, prefixstr, sizeof (prefixstr));
246: if (nexthop)
247: inet_ntop (AF_INET6, nexthop, nexthopstr, sizeof (nexthopstr));
248: else
249: snprintf (nexthopstr, sizeof (nexthopstr), "::");
250:
251: zlog_debug ("Zebra Receive route %s: %s %s nexthop %s ifindex %ld",
252: (command == ZEBRA_IPV6_ROUTE_ADD ? "add" : "delete"),
253: zebra_route_string(api.type), prefixstr, nexthopstr, ifindex);
254: }
255:
256: if (command == ZEBRA_IPV6_ROUTE_ADD)
257: ospf6_asbr_redistribute_add (api.type, ifindex, (struct prefix *) &p,
258: api.nexthop_num, nexthop);
259: else
260: ospf6_asbr_redistribute_remove (api.type, ifindex, (struct prefix *) &p);
261:
262: if (CHECK_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP))
263: free (nexthop);
264:
265: return 0;
266: }
267:
268:
269:
270:
271: DEFUN (show_zebra,
272: show_zebra_cmd,
273: "show zebra",
274: SHOW_STR
275: "Zebra information\n")
276: {
277: int i;
278: if (zclient == NULL)
279: {
280: vty_out (vty, "Not connected to zebra%s", VNL);
281: return CMD_SUCCESS;
282: }
283:
284: vty_out (vty, "Zebra Infomation%s", VNL);
285: vty_out (vty, " enable: %d fail: %d%s",
286: zclient->enable, zclient->fail, VNL);
287: vty_out (vty, " redistribute default: %d%s", zclient->redist_default,
288: VNL);
289: vty_out (vty, " redistribute:");
290: for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
291: {
292: if (zclient->redist[i])
293: vty_out (vty, " %s", zebra_route_string(i));
294: }
295: vty_out (vty, "%s", VNL);
296: return CMD_SUCCESS;
297: }
298:
299: DEFUN (router_zebra,
300: router_zebra_cmd,
301: "router zebra",
302: "Enable a routing process\n"
303: "Make connection to zebra daemon\n")
304: {
305: vty->node = ZEBRA_NODE;
306: zclient->enable = 1;
307: zclient_start (zclient);
308: return CMD_SUCCESS;
309: }
310:
311: DEFUN (no_router_zebra,
312: no_router_zebra_cmd,
313: "no router zebra",
314: NO_STR
315: "Configure routing process\n"
316: "Disable connection to zebra daemon\n")
317: {
318: zclient->enable = 0;
319: zclient_stop (zclient);
320: return CMD_SUCCESS;
321: }
322:
323: /* Zebra configuration write function. */
324: static int
325: config_write_ospf6_zebra (struct vty *vty)
326: {
327: if (! zclient->enable)
328: {
329: vty_out (vty, "no router zebra%s", VNL);
330: vty_out (vty, "!%s", VNL);
331: }
332: else if (! zclient->redist[ZEBRA_ROUTE_OSPF6])
333: {
334: vty_out (vty, "router zebra%s", VNL);
335: vty_out (vty, " no redistribute ospf6%s", VNL);
336: vty_out (vty, "!%s", VNL);
337: }
338: return 0;
339: }
340:
341: /* Zebra node structure. */
342: static struct cmd_node zebra_node =
343: {
344: ZEBRA_NODE,
345: "%s(config-zebra)# ",
346: };
347:
348: #define ADD 0
349: #define REM 1
350: static void
351: ospf6_zebra_route_update (int type, struct ospf6_route *request)
352: {
353: struct zapi_ipv6 api;
354: char buf[64];
355: int nhcount;
356: struct in6_addr **nexthops;
357: unsigned int *ifindexes;
358: int i, ret = 0;
359: struct prefix_ipv6 *dest;
360:
361: if (IS_OSPF6_DEBUG_ZEBRA (SEND))
362: {
363: prefix2str (&request->prefix, buf, sizeof (buf));
364: zlog_debug ("Send %s route: %s",
365: (type == REM ? "remove" : "add"), buf);
366: }
367:
368: if (zclient->sock < 0)
369: {
370: if (IS_OSPF6_DEBUG_ZEBRA (SEND))
371: zlog_debug (" Not connected to Zebra");
372: return;
373: }
374:
375: if (request->path.origin.adv_router == ospf6->router_id &&
376: (request->path.type == OSPF6_PATH_TYPE_EXTERNAL1 ||
377: request->path.type == OSPF6_PATH_TYPE_EXTERNAL2))
378: {
379: if (IS_OSPF6_DEBUG_ZEBRA (SEND))
380: zlog_debug (" Ignore self-originated external route");
381: return;
382: }
383:
384: /* If removing is the best path and if there's another path,
385: treat this request as add the secondary path */
386: if (type == REM && ospf6_route_is_best (request) &&
387: request->next && ospf6_route_is_same (request, request->next))
388: {
389: if (IS_OSPF6_DEBUG_ZEBRA (SEND))
390: zlog_debug (" Best-path removal resulted Sencondary addition");
391: type = ADD;
392: request = request->next;
393: }
394:
395: /* Only the best path will be sent to zebra. */
396: if (! ospf6_route_is_best (request))
397: {
398: /* this is not preferred best route, ignore */
399: if (IS_OSPF6_DEBUG_ZEBRA (SEND))
400: zlog_debug (" Ignore non-best route");
401: return;
402: }
403:
404: nhcount = 0;
405: for (i = 0; i < OSPF6_MULTI_PATH_LIMIT; i++)
406: if (ospf6_nexthop_is_set (&request->nexthop[i]))
407: nhcount++;
408:
409: if (nhcount == 0)
410: {
411: if (IS_OSPF6_DEBUG_ZEBRA (SEND))
412: zlog_debug (" No nexthop, ignore");
413: return;
414: }
415:
416: /* allocate memory for nexthop_list */
417: nexthops = XCALLOC (MTYPE_OSPF6_OTHER,
418: nhcount * sizeof (struct in6_addr *));
419: if (nexthops == NULL)
420: {
421: zlog_warn ("Can't send route to zebra: malloc failed");
422: return;
423: }
424:
425: /* allocate memory for ifindex_list */
426: ifindexes = XCALLOC (MTYPE_OSPF6_OTHER,
427: nhcount * sizeof (unsigned int));
428: if (ifindexes == NULL)
429: {
430: zlog_warn ("Can't send route to zebra: malloc failed");
431: XFREE (MTYPE_OSPF6_OTHER, nexthops);
432: return;
433: }
434:
435: for (i = 0; i < nhcount; i++)
436: {
437: if (IS_OSPF6_DEBUG_ZEBRA (SEND))
438: {
439: char ifname[IFNAMSIZ];
440: inet_ntop (AF_INET6, &request->nexthop[i].address,
441: buf, sizeof (buf));
442: if (!if_indextoname(request->nexthop[i].ifindex, ifname))
443: strlcpy(ifname, "unknown", sizeof(ifname));
444: zlog_debug (" nexthop: %s%%%.*s(%d)", buf, IFNAMSIZ, ifname,
445: request->nexthop[i].ifindex);
446: }
447: nexthops[i] = &request->nexthop[i].address;
448: ifindexes[i] = request->nexthop[i].ifindex;
449: }
450:
451: api.type = ZEBRA_ROUTE_OSPF6;
452: api.flags = 0;
453: api.message = 0;
1.1.1.2 ! misho 454: api.safi = SAFI_UNICAST;
1.1 misho 455: SET_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP);
456: api.nexthop_num = nhcount;
457: api.nexthop = nexthops;
458: SET_FLAG (api.message, ZAPI_MESSAGE_IFINDEX);
459: api.ifindex_num = nhcount;
460: api.ifindex = ifindexes;
461: SET_FLAG (api.message, ZAPI_MESSAGE_METRIC);
462: api.metric = (request->path.metric_type == 2 ?
463: request->path.cost_e2 : request->path.cost);
464:
465: dest = (struct prefix_ipv6 *) &request->prefix;
466: if (type == REM)
467: ret = zapi_ipv6_route (ZEBRA_IPV6_ROUTE_DELETE, zclient, dest, &api);
468: else
469: ret = zapi_ipv6_route (ZEBRA_IPV6_ROUTE_ADD, zclient, dest, &api);
470:
471: if (ret < 0)
472: zlog_err ("zapi_ipv6_route() %s failed: %s",
473: (type == REM ? "delete" : "add"), safe_strerror (errno));
474:
475: XFREE (MTYPE_OSPF6_OTHER, nexthops);
476: XFREE (MTYPE_OSPF6_OTHER, ifindexes);
477:
478: return;
479: }
480:
481: void
482: ospf6_zebra_route_update_add (struct ospf6_route *request)
483: {
484: if (! zclient->redist[ZEBRA_ROUTE_OSPF6])
485: {
486: ospf6->route_table->hook_add = NULL;
487: ospf6->route_table->hook_remove = NULL;
488: return;
489: }
490: ospf6_zebra_route_update (ADD, request);
491: }
492:
493: void
494: ospf6_zebra_route_update_remove (struct ospf6_route *request)
495: {
496: if (! zclient->redist[ZEBRA_ROUTE_OSPF6])
497: {
498: ospf6->route_table->hook_add = NULL;
499: ospf6->route_table->hook_remove = NULL;
500: return;
501: }
502: ospf6_zebra_route_update (REM, request);
503: }
504:
505: DEFUN (redistribute_ospf6,
506: redistribute_ospf6_cmd,
507: "redistribute ospf6",
508: "Redistribute control\n"
509: "OSPF6 route\n")
510: {
511: struct ospf6_route *route;
512:
513: if (zclient->redist[ZEBRA_ROUTE_OSPF6])
514: return CMD_SUCCESS;
515:
516: zclient->redist[ZEBRA_ROUTE_OSPF6] = 1;
517:
518: if (ospf6 == NULL)
519: return CMD_SUCCESS;
520:
521: /* send ospf6 route to zebra route table */
522: for (route = ospf6_route_head (ospf6->route_table); route;
523: route = ospf6_route_next (route))
524: ospf6_zebra_route_update_add (route);
525:
526: ospf6->route_table->hook_add = ospf6_zebra_route_update_add;
527: ospf6->route_table->hook_remove = ospf6_zebra_route_update_remove;
528:
529: return CMD_SUCCESS;
530: }
531:
532: DEFUN (no_redistribute_ospf6,
533: no_redistribute_ospf6_cmd,
534: "no redistribute ospf6",
535: NO_STR
536: "Redistribute control\n"
537: "OSPF6 route\n")
538: {
539: struct ospf6_route *route;
540:
541: if (! zclient->redist[ZEBRA_ROUTE_OSPF6])
542: return CMD_SUCCESS;
543:
544: zclient->redist[ZEBRA_ROUTE_OSPF6] = 0;
545:
546: if (ospf6 == NULL)
547: return CMD_SUCCESS;
548:
549: ospf6->route_table->hook_add = NULL;
550: ospf6->route_table->hook_remove = NULL;
551:
552: /* withdraw ospf6 route from zebra route table */
553: for (route = ospf6_route_head (ospf6->route_table); route;
554: route = ospf6_route_next (route))
555: ospf6_zebra_route_update_remove (route);
556:
557: return CMD_SUCCESS;
558: }
559:
560: void
561: ospf6_zebra_init (void)
562: {
563: /* Allocate zebra structure. */
564: zclient = zclient_new ();
565: zclient_init (zclient, ZEBRA_ROUTE_OSPF6);
566: zclient->router_id_update = ospf6_router_id_update_zebra;
567: zclient->interface_add = ospf6_zebra_if_add;
568: zclient->interface_delete = ospf6_zebra_if_del;
569: zclient->interface_up = ospf6_zebra_if_state_update;
570: zclient->interface_down = ospf6_zebra_if_state_update;
571: zclient->interface_address_add = ospf6_zebra_if_address_update_add;
572: zclient->interface_address_delete = ospf6_zebra_if_address_update_delete;
573: zclient->ipv4_route_add = NULL;
574: zclient->ipv4_route_delete = NULL;
575: zclient->ipv6_route_add = ospf6_zebra_read_ipv6;
576: zclient->ipv6_route_delete = ospf6_zebra_read_ipv6;
577:
578: /* redistribute connected route by default */
579: /* ospf6_zebra_redistribute (ZEBRA_ROUTE_CONNECT); */
580:
581: /* Install zebra node. */
582: install_node (&zebra_node, config_write_ospf6_zebra);
583:
584: /* Install command element for zebra node. */
585: install_element (VIEW_NODE, &show_zebra_cmd);
586: install_element (ENABLE_NODE, &show_zebra_cmd);
587: install_element (CONFIG_NODE, &router_zebra_cmd);
588: install_element (CONFIG_NODE, &no_router_zebra_cmd);
589:
590: install_default (ZEBRA_NODE);
591: install_element (ZEBRA_NODE, &redistribute_ospf6_cmd);
592: install_element (ZEBRA_NODE, &no_redistribute_ospf6_cmd);
593:
594: return;
595: }
596:
597: /* Debug */
598:
599: DEFUN (debug_ospf6_zebra_sendrecv,
600: debug_ospf6_zebra_sendrecv_cmd,
601: "debug ospf6 zebra (send|recv)",
602: DEBUG_STR
603: OSPF6_STR
604: "Debug connection between zebra\n"
605: "Debug Sending zebra\n"
606: "Debug Receiving zebra\n"
607: )
608: {
609: unsigned char level = 0;
610:
611: if (argc)
612: {
613: if (! strncmp (argv[0], "s", 1))
614: level = OSPF6_DEBUG_ZEBRA_SEND;
615: else if (! strncmp (argv[0], "r", 1))
616: level = OSPF6_DEBUG_ZEBRA_RECV;
617: }
618: else
619: level = OSPF6_DEBUG_ZEBRA_SEND | OSPF6_DEBUG_ZEBRA_RECV;
620:
621: OSPF6_DEBUG_ZEBRA_ON (level);
622: return CMD_SUCCESS;
623: }
624:
625: ALIAS (debug_ospf6_zebra_sendrecv,
626: debug_ospf6_zebra_cmd,
627: "debug ospf6 zebra",
628: DEBUG_STR
629: OSPF6_STR
630: "Debug connection between zebra\n"
631: )
632:
633:
634: DEFUN (no_debug_ospf6_zebra_sendrecv,
635: no_debug_ospf6_zebra_sendrecv_cmd,
636: "no debug ospf6 zebra (send|recv)",
637: NO_STR
638: DEBUG_STR
639: OSPF6_STR
640: "Debug connection between zebra\n"
641: "Debug Sending zebra\n"
642: "Debug Receiving zebra\n"
643: )
644: {
645: unsigned char level = 0;
646:
647: if (argc)
648: {
649: if (! strncmp (argv[0], "s", 1))
650: level = OSPF6_DEBUG_ZEBRA_SEND;
651: else if (! strncmp (argv[0], "r", 1))
652: level = OSPF6_DEBUG_ZEBRA_RECV;
653: }
654: else
655: level = OSPF6_DEBUG_ZEBRA_SEND | OSPF6_DEBUG_ZEBRA_RECV;
656:
657: OSPF6_DEBUG_ZEBRA_OFF (level);
658: return CMD_SUCCESS;
659: }
660:
661: ALIAS (no_debug_ospf6_zebra_sendrecv,
662: no_debug_ospf6_zebra_cmd,
663: "no debug ospf6 zebra",
664: NO_STR
665: DEBUG_STR
666: OSPF6_STR
667: "Debug connection between zebra\n"
668: )
669:
670: int
671: config_write_ospf6_debug_zebra (struct vty *vty)
672: {
673: if (IS_OSPF6_DEBUG_ZEBRA (SEND) && IS_OSPF6_DEBUG_ZEBRA (RECV))
674: vty_out (vty, "debug ospf6 zebra%s", VNL);
675: else
676: {
677: if (IS_OSPF6_DEBUG_ZEBRA (SEND))
678: vty_out (vty, "debug ospf6 zebra send%s", VNL);
679: if (IS_OSPF6_DEBUG_ZEBRA (RECV))
680: vty_out (vty, "debug ospf6 zebra recv%s", VNL);
681: }
682: return 0;
683: }
684:
685: void
686: install_element_ospf6_debug_zebra (void)
687: {
688: install_element (ENABLE_NODE, &debug_ospf6_zebra_cmd);
689: install_element (ENABLE_NODE, &no_debug_ospf6_zebra_cmd);
690: install_element (ENABLE_NODE, &debug_ospf6_zebra_sendrecv_cmd);
691: install_element (ENABLE_NODE, &no_debug_ospf6_zebra_sendrecv_cmd);
692: install_element (CONFIG_NODE, &debug_ospf6_zebra_cmd);
693: install_element (CONFIG_NODE, &no_debug_ospf6_zebra_cmd);
694: install_element (CONFIG_NODE, &debug_ospf6_zebra_sendrecv_cmd);
695: install_element (CONFIG_NODE, &no_debug_ospf6_zebra_sendrecv_cmd);
696: }
697:
698:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>