Annotation of embedaddon/quagga/ospfd/ospf_routemap.c, revision 1.1.1.1
1.1 misho 1: /*
2: * Route map function of ospfd.
3: * Copyright (C) 2000 IP Infusion Inc.
4: *
5: * Written by Toshiaki Takada.
6: *
7: * This file is part of GNU Zebra.
8: *
9: * GNU Zebra is free software; you can redistribute it and/or modify it
10: * under the terms of the GNU General Public License as published by the
11: * Free Software Foundation; either version 2, or (at your option) any
12: * later version.
13: *
14: * GNU Zebra is distributed in the hope that it will be useful, but
15: * WITHOUT ANY WARRANTY; without even the implied warranty of
16: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17: * General Public License for more details.
18: *
19: * You should have received a copy of the GNU General Public License
20: * along with GNU Zebra; see the file COPYING. If not, write to the Free
21: * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
22: * 02111-1307, USA.
23: */
24:
25: #include <zebra.h>
26:
27: #include "memory.h"
28: #include "prefix.h"
29: #include "table.h"
30: #include "routemap.h"
31: #include "command.h"
32: #include "log.h"
33: #include "plist.h"
34:
35: #include "ospfd/ospfd.h"
36: #include "ospfd/ospf_asbr.h"
37: #include "ospfd/ospf_interface.h"
38: #include "ospfd/ospf_lsa.h"
39: #include "ospfd/ospf_route.h"
40: #include "ospfd/ospf_zebra.h"
41:
42: /* Hook function for updating route_map assignment. */
43: static void
44: ospf_route_map_update (const char *name)
45: {
46: struct ospf *ospf;
47: int type;
48:
49: /* If OSPF instatnce does not exist, return right now. */
50: ospf = ospf_lookup ();
51: if (ospf == NULL)
52: return;
53:
54: /* Update route-map */
55: for (type = 0; type <= ZEBRA_ROUTE_MAX; type++)
56: {
57: if (ROUTEMAP_NAME (ospf, type)
58: && strcmp (ROUTEMAP_NAME (ospf, type), name) == 0)
59: {
60: /* Keep old route-map. */
61: struct route_map *old = ROUTEMAP (ospf, type);
62:
63: /* Update route-map. */
64: ROUTEMAP (ospf, type) =
65: route_map_lookup_by_name (ROUTEMAP_NAME (ospf, type));
66:
67: /* No update for this distribute type. */
68: if (old == NULL && ROUTEMAP (ospf, type) == NULL)
69: continue;
70:
71: ospf_distribute_list_update (ospf, type);
72: }
73: }
74: }
75:
76: static void
77: ospf_route_map_event (route_map_event_t event, const char *name)
78: {
79: struct ospf *ospf;
80: int type;
81:
82: /* If OSPF instatnce does not exist, return right now. */
83: ospf = ospf_lookup ();
84: if (ospf == NULL)
85: return;
86:
87: /* Update route-map. */
88: for (type = 0; type <= ZEBRA_ROUTE_MAX; type++)
89: {
90: if (ROUTEMAP_NAME (ospf, type) && ROUTEMAP (ospf, type)
91: && !strcmp (ROUTEMAP_NAME (ospf, type), name))
92: {
93: ospf_distribute_list_update (ospf, type);
94: }
95: }
96: }
97:
98: /* Delete rip route map rule. */
99: static int
100: ospf_route_match_delete (struct vty *vty, struct route_map_index *index,
101: const char *command, const char *arg)
102: {
103: int ret;
104:
105: ret = route_map_delete_match (index, command, arg);
106: if (ret)
107: {
108: switch (ret)
109: {
110: case RMAP_RULE_MISSING:
111: vty_out (vty, "%% Can't find rule.%s", VTY_NEWLINE);
112: return CMD_WARNING;
113: case RMAP_COMPILE_ERROR:
114: vty_out (vty, "%% Argument is malformed.%s", VTY_NEWLINE);
115: return CMD_WARNING;
116: }
117: }
118:
119: return CMD_SUCCESS;
120: }
121:
122: static int
123: ospf_route_match_add (struct vty *vty, struct route_map_index *index,
124: const char *command, const char *arg)
125: {
126: int ret;
127:
128: ret = route_map_add_match (index, command, arg);
129: if (ret)
130: {
131: switch (ret)
132: {
133: case RMAP_RULE_MISSING:
134: vty_out (vty, "%% Can't find rule.%s", VTY_NEWLINE);
135: return CMD_WARNING;
136: case RMAP_COMPILE_ERROR:
137: vty_out (vty, "%% Argument is malformed.%s", VTY_NEWLINE);
138: return CMD_WARNING;
139: }
140: }
141:
142: return CMD_SUCCESS;
143: }
144:
145: static int
146: ospf_route_set_add (struct vty *vty, struct route_map_index *index,
147: const char *command, const char *arg)
148: {
149: int ret;
150:
151: ret = route_map_add_set (index, command, arg);
152: if (ret)
153: {
154: switch (ret)
155: {
156: case RMAP_RULE_MISSING:
157: vty_out (vty, "%% Can't find rule.%s", VTY_NEWLINE);
158: return CMD_WARNING;
159: case RMAP_COMPILE_ERROR:
160: vty_out (vty, "%% Argument is malformed.%s", VTY_NEWLINE);
161: return CMD_WARNING;
162: }
163: }
164:
165: return CMD_SUCCESS;
166: }
167:
168: /* Delete rip route map rule. */
169: static int
170: ospf_route_set_delete (struct vty *vty, struct route_map_index *index,
171: const char *command, const char *arg)
172: {
173: int ret;
174:
175: ret = route_map_delete_set (index, command, arg);
176: if (ret)
177: {
178: switch (ret)
179: {
180: case RMAP_RULE_MISSING:
181: vty_out (vty, "%% Can't find rule.%s", VTY_NEWLINE);
182: return CMD_WARNING;
183: case RMAP_COMPILE_ERROR:
184: vty_out (vty, "%% Argument is malformed.%s", VTY_NEWLINE);
185: return CMD_WARNING;
186: }
187: }
188:
189: return CMD_SUCCESS;
190: }
191:
192: /* `match ip netxthop ' */
193: /* Match function return 1 if match is success else return zero. */
194: static route_map_result_t
195: route_match_ip_nexthop (void *rule, struct prefix *prefix,
196: route_map_object_t type, void *object)
197: {
198: struct access_list *alist;
199: struct external_info *ei = object;
200: struct prefix_ipv4 p;
201:
202: if (type == RMAP_OSPF)
203: {
204: p.family = AF_INET;
205: p.prefix = ei->nexthop;
206: p.prefixlen = IPV4_MAX_BITLEN;
207:
208: alist = access_list_lookup (AFI_IP, (char *) rule);
209: if (alist == NULL)
210: return RMAP_NOMATCH;
211:
212: return (access_list_apply (alist, &p) == FILTER_DENY ?
213: RMAP_NOMATCH : RMAP_MATCH);
214: }
215: return RMAP_NOMATCH;
216: }
217:
218: /* Route map `ip next-hop' match statement. `arg' should be
219: access-list name. */
220: static void *
221: route_match_ip_nexthop_compile (const char *arg)
222: {
223: return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg);
224: }
225:
226: /* Free route map's compiled `ip address' value. */
227: static void
228: route_match_ip_nexthop_free (void *rule)
229: {
230: XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);
231: }
232:
233: /* Route map commands for metric matching. */
234: struct route_map_rule_cmd route_match_ip_nexthop_cmd =
235: {
236: "ip next-hop",
237: route_match_ip_nexthop,
238: route_match_ip_nexthop_compile,
239: route_match_ip_nexthop_free
240: };
241:
242: /* `match ip next-hop prefix-list PREFIX_LIST' */
243:
244: static route_map_result_t
245: route_match_ip_next_hop_prefix_list (void *rule, struct prefix *prefix,
246: route_map_object_t type, void *object)
247: {
248: struct prefix_list *plist;
249: struct external_info *ei = object;
250: struct prefix_ipv4 p;
251:
252: if (type == RMAP_OSPF)
253: {
254: p.family = AF_INET;
255: p.prefix = ei->nexthop;
256: p.prefixlen = IPV4_MAX_BITLEN;
257:
258: plist = prefix_list_lookup (AFI_IP, (char *) rule);
259: if (plist == NULL)
260: return RMAP_NOMATCH;
261:
262: return (prefix_list_apply (plist, &p) == PREFIX_DENY ?
263: RMAP_NOMATCH : RMAP_MATCH);
264: }
265: return RMAP_NOMATCH;
266: }
267:
268: static void *
269: route_match_ip_next_hop_prefix_list_compile (const char *arg)
270: {
271: return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg);
272: }
273:
274: static void
275: route_match_ip_next_hop_prefix_list_free (void *rule)
276: {
277: XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);
278: }
279:
280: struct route_map_rule_cmd route_match_ip_next_hop_prefix_list_cmd =
281: {
282: "ip next-hop prefix-list",
283: route_match_ip_next_hop_prefix_list,
284: route_match_ip_next_hop_prefix_list_compile,
285: route_match_ip_next_hop_prefix_list_free
286: };
287:
288: /* `match ip address IP_ACCESS_LIST' */
289: /* Match function should return 1 if match is success else return
290: zero. */
291: static route_map_result_t
292: route_match_ip_address (void *rule, struct prefix *prefix,
293: route_map_object_t type, void *object)
294: {
295: struct access_list *alist;
296: /* struct prefix_ipv4 match; */
297:
298: if (type == RMAP_OSPF)
299: {
300: alist = access_list_lookup (AFI_IP, (char *) rule);
301: if (alist == NULL)
302: return RMAP_NOMATCH;
303:
304: return (access_list_apply (alist, prefix) == FILTER_DENY ?
305: RMAP_NOMATCH : RMAP_MATCH);
306: }
307: return RMAP_NOMATCH;
308: }
309:
310: /* Route map `ip address' match statement. `arg' should be
311: access-list name. */
312: static void *
313: route_match_ip_address_compile (const char *arg)
314: {
315: return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg);
316: }
317:
318: /* Free route map's compiled `ip address' value. */
319: static void
320: route_match_ip_address_free (void *rule)
321: {
322: XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);
323: }
324:
325: /* Route map commands for ip address matching. */
326: struct route_map_rule_cmd route_match_ip_address_cmd =
327: {
328: "ip address",
329: route_match_ip_address,
330: route_match_ip_address_compile,
331: route_match_ip_address_free
332: };
333:
334: /* `match ip address prefix-list PREFIX_LIST' */
335: static route_map_result_t
336: route_match_ip_address_prefix_list (void *rule, struct prefix *prefix,
337: route_map_object_t type, void *object)
338: {
339: struct prefix_list *plist;
340:
341: if (type == RMAP_OSPF)
342: {
343: plist = prefix_list_lookup (AFI_IP, (char *) rule);
344: if (plist == NULL)
345: return RMAP_NOMATCH;
346:
347: return (prefix_list_apply (plist, prefix) == PREFIX_DENY ?
348: RMAP_NOMATCH : RMAP_MATCH);
349: }
350: return RMAP_NOMATCH;
351: }
352:
353: static void *
354: route_match_ip_address_prefix_list_compile (const char *arg)
355: {
356: return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg);
357: }
358:
359: static void
360: route_match_ip_address_prefix_list_free (void *rule)
361: {
362: XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);
363: }
364:
365: struct route_map_rule_cmd route_match_ip_address_prefix_list_cmd =
366: {
367: "ip address prefix-list",
368: route_match_ip_address_prefix_list,
369: route_match_ip_address_prefix_list_compile,
370: route_match_ip_address_prefix_list_free
371: };
372:
373: /* `match interface IFNAME' */
374: /* Match function should return 1 if match is success else return
375: zero. */
376: static route_map_result_t
377: route_match_interface (void *rule, struct prefix *prefix,
378: route_map_object_t type, void *object)
379: {
380: struct interface *ifp;
381: struct external_info *ei;
382:
383: if (type == RMAP_OSPF)
384: {
385: ei = object;
386: ifp = if_lookup_by_name ((char *)rule);
387:
388: if (ifp == NULL || ifp->ifindex != ei->ifindex)
389: return RMAP_NOMATCH;
390:
391: return RMAP_MATCH;
392: }
393: return RMAP_NOMATCH;
394: }
395:
396: /* Route map `interface' match statement. `arg' should be
397: interface name. */
398: static void *
399: route_match_interface_compile (const char *arg)
400: {
401: return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg);
402: }
403:
404: /* Free route map's compiled `interface' value. */
405: static void
406: route_match_interface_free (void *rule)
407: {
408: XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);
409: }
410:
411: /* Route map commands for ip address matching. */
412: struct route_map_rule_cmd route_match_interface_cmd =
413: {
414: "interface",
415: route_match_interface,
416: route_match_interface_compile,
417: route_match_interface_free
418: };
419:
420: /* `set metric METRIC' */
421: /* Set metric to attribute. */
422: static route_map_result_t
423: route_set_metric (void *rule, struct prefix *prefix,
424: route_map_object_t type, void *object)
425: {
426: u_int32_t *metric;
427: struct external_info *ei;
428:
429: if (type == RMAP_OSPF)
430: {
431: /* Fetch routemap's rule information. */
432: metric = rule;
433: ei = object;
434:
435: /* Set metric out value. */
436: ei->route_map_set.metric = *metric;
437: }
438: return RMAP_OKAY;
439: }
440:
441: /* set metric compilation. */
442: static void *
443: route_set_metric_compile (const char *arg)
444: {
445: u_int32_t *metric;
446:
447: metric = XCALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (u_int32_t));
448: *metric = atoi (arg);
449:
450: if (*metric >= 0)
451: return metric;
452:
453: XFREE (MTYPE_ROUTE_MAP_COMPILED, metric);
454: return NULL;
455: }
456:
457: /* Free route map's compiled `set metric' value. */
458: static void
459: route_set_metric_free (void *rule)
460: {
461: XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);
462: }
463:
464: /* Set metric rule structure. */
465: struct route_map_rule_cmd route_set_metric_cmd =
466: {
467: "metric",
468: route_set_metric,
469: route_set_metric_compile,
470: route_set_metric_free,
471: };
472:
473: /* `set metric-type TYPE' */
474: /* Set metric-type to attribute. */
475: static route_map_result_t
476: route_set_metric_type (void *rule, struct prefix *prefix,
477: route_map_object_t type, void *object)
478: {
479: u_int32_t *metric_type;
480: struct external_info *ei;
481:
482: if (type == RMAP_OSPF)
483: {
484: /* Fetch routemap's rule information. */
485: metric_type = rule;
486: ei = object;
487:
488: /* Set metric out value. */
489: ei->route_map_set.metric_type = *metric_type;
490: }
491: return RMAP_OKAY;
492: }
493:
494: /* set metric-type compilation. */
495: static void *
496: route_set_metric_type_compile (const char *arg)
497: {
498: u_int32_t *metric_type;
499:
500: metric_type = XCALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (u_int32_t));
501: if (strcmp (arg, "type-1") == 0)
502: *metric_type = EXTERNAL_METRIC_TYPE_1;
503: else if (strcmp (arg, "type-2") == 0)
504: *metric_type = EXTERNAL_METRIC_TYPE_2;
505:
506: if (*metric_type == EXTERNAL_METRIC_TYPE_1 ||
507: *metric_type == EXTERNAL_METRIC_TYPE_2)
508: return metric_type;
509:
510: XFREE (MTYPE_ROUTE_MAP_COMPILED, metric_type);
511: return NULL;
512: }
513:
514: /* Free route map's compiled `set metric-type' value. */
515: static void
516: route_set_metric_type_free (void *rule)
517: {
518: XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);
519: }
520:
521: /* Set metric rule structure. */
522: struct route_map_rule_cmd route_set_metric_type_cmd =
523: {
524: "metric-type",
525: route_set_metric_type,
526: route_set_metric_type_compile,
527: route_set_metric_type_free,
528: };
529:
530: DEFUN (match_ip_nexthop,
531: match_ip_nexthop_cmd,
532: "match ip next-hop (<1-199>|<1300-2699>|WORD)",
533: MATCH_STR
534: IP_STR
535: "Match next-hop address of route\n"
536: "IP access-list number\n"
537: "IP access-list number (expanded range)\n"
538: "IP access-list name\n")
539: {
540: return ospf_route_match_add (vty, vty->index, "ip next-hop", argv[0]);
541: }
542:
543: DEFUN (no_match_ip_nexthop,
544: no_match_ip_nexthop_cmd,
545: "no match ip next-hop",
546: NO_STR
547: MATCH_STR
548: IP_STR
549: "Match next-hop address of route\n")
550: {
551: if (argc == 0)
552: return ospf_route_match_delete (vty, vty->index, "ip next-hop", NULL);
553:
554: return ospf_route_match_delete (vty, vty->index, "ip next-hop", argv[0]);
555: }
556:
557: ALIAS (no_match_ip_nexthop,
558: no_match_ip_nexthop_val_cmd,
559: "no match ip next-hop (<1-199>|<1300-2699>|WORD)",
560: NO_STR
561: MATCH_STR
562: IP_STR
563: "Match next-hop address of route\n"
564: "IP access-list number\n"
565: "IP access-list number (expanded range)\n"
566: "IP access-list name\n")
567:
568: DEFUN (match_ip_next_hop_prefix_list,
569: match_ip_next_hop_prefix_list_cmd,
570: "match ip next-hop prefix-list WORD",
571: MATCH_STR
572: IP_STR
573: "Match next-hop address of route\n"
574: "Match entries of prefix-lists\n"
575: "IP prefix-list name\n")
576: {
577: return ospf_route_match_add (vty, vty->index, "ip next-hop prefix-list",
578: argv[0]);
579: }
580:
581: DEFUN (no_match_ip_next_hop_prefix_list,
582: no_match_ip_next_hop_prefix_list_cmd,
583: "no match ip next-hop prefix-list",
584: NO_STR
585: MATCH_STR
586: IP_STR
587: "Match next-hop address of route\n"
588: "Match entries of prefix-lists\n")
589: {
590: if (argc == 0)
591: return ospf_route_match_delete (vty, vty->index, "ip next-hop prefix-list",
592: NULL);
593: return ospf_route_match_delete (vty, vty->index, "ip next-hop prefix-list",
594: argv[0]);
595: }
596:
597: ALIAS (no_match_ip_next_hop_prefix_list,
598: no_match_ip_next_hop_prefix_list_val_cmd,
599: "no match ip next-hop prefix-list WORD",
600: NO_STR
601: MATCH_STR
602: IP_STR
603: "Match next-hop address of route\n"
604: "Match entries of prefix-lists\n"
605: "IP prefix-list name\n")
606:
607: DEFUN (match_ip_address,
608: match_ip_address_cmd,
609: "match ip address (<1-199>|<1300-2699>|WORD)",
610: MATCH_STR
611: IP_STR
612: "Match address of route\n"
613: "IP access-list number\n"
614: "IP access-list number (expanded range)\n"
615: "IP access-list name\n")
616: {
617: return ospf_route_match_add (vty, vty->index, "ip address", argv[0]);
618: }
619:
620: DEFUN (no_match_ip_address,
621: no_match_ip_address_cmd,
622: "no match ip address",
623: NO_STR
624: MATCH_STR
625: IP_STR
626: "Match address of route\n")
627: {
628: if (argc == 0)
629: return ospf_route_match_delete (vty, vty->index, "ip address", NULL);
630:
631: return ospf_route_match_delete (vty, vty->index, "ip address", argv[0]);
632: }
633:
634: ALIAS (no_match_ip_address,
635: no_match_ip_address_val_cmd,
636: "no match ip address (<1-199>|<1300-2699>|WORD)",
637: NO_STR
638: MATCH_STR
639: IP_STR
640: "Match address of route\n"
641: "IP access-list number\n"
642: "IP access-list number (expanded range)\n"
643: "IP access-list name\n")
644:
645: DEFUN (match_ip_address_prefix_list,
646: match_ip_address_prefix_list_cmd,
647: "match ip address prefix-list WORD",
648: MATCH_STR
649: IP_STR
650: "Match address of route\n"
651: "Match entries of prefix-lists\n"
652: "IP prefix-list name\n")
653: {
654: return ospf_route_match_add (vty, vty->index, "ip address prefix-list",
655: argv[0]);
656: }
657:
658: DEFUN (no_match_ip_address_prefix_list,
659: no_match_ip_address_prefix_list_cmd,
660: "no match ip address prefix-list",
661: NO_STR
662: MATCH_STR
663: IP_STR
664: "Match address of route\n"
665: "Match entries of prefix-lists\n")
666: {
667: if (argc == 0)
668: return ospf_route_match_delete (vty, vty->index, "ip address prefix-list",
669: NULL);
670: return ospf_route_match_delete (vty, vty->index, "ip address prefix-list",
671: argv[0]);
672: }
673:
674: ALIAS (no_match_ip_address_prefix_list,
675: no_match_ip_address_prefix_list_val_cmd,
676: "no match ip address prefix-list WORD",
677: NO_STR
678: MATCH_STR
679: IP_STR
680: "Match address of route\n"
681: "Match entries of prefix-lists\n"
682: "IP prefix-list name\n")
683:
684: DEFUN (match_interface,
685: match_interface_cmd,
686: "match interface WORD",
687: MATCH_STR
688: "Match first hop interface of route\n"
689: "Interface name\n")
690: {
691: return ospf_route_match_add (vty, vty->index, "interface", argv[0]);
692: }
693:
694: DEFUN (no_match_interface,
695: no_match_interface_cmd,
696: "no match interface",
697: NO_STR
698: MATCH_STR
699: "Match first hop interface of route\n")
700: {
701: if (argc == 0)
702: return ospf_route_match_delete (vty, vty->index, "interface", NULL);
703:
704: return ospf_route_match_delete (vty, vty->index, "interface", argv[0]);
705: }
706:
707: ALIAS (no_match_interface,
708: no_match_interface_val_cmd,
709: "no match interface WORD",
710: NO_STR
711: MATCH_STR
712: "Match first hop interface of route\n"
713: "Interface name\n")
714:
715: DEFUN (set_metric,
716: set_metric_cmd,
717: "set metric <0-4294967295>",
718: SET_STR
719: "Metric value for destination routing protocol\n"
720: "Metric value\n")
721: {
722: return ospf_route_set_add (vty, vty->index, "metric", argv[0]);
723: }
724:
725: DEFUN (no_set_metric,
726: no_set_metric_cmd,
727: "no set metric",
728: NO_STR
729: SET_STR
730: "Metric value for destination routing protocol\n")
731: {
732: if (argc == 0)
733: return ospf_route_set_delete (vty, vty->index, "metric", NULL);
734:
735: return ospf_route_set_delete (vty, vty->index, "metric", argv[0]);
736: }
737:
738: ALIAS (no_set_metric,
739: no_set_metric_val_cmd,
740: "no set metric <0-4294967295>",
741: NO_STR
742: SET_STR
743: "Metric value for destination routing protocol\n"
744: "Metric value\n")
745:
746: DEFUN (set_metric_type,
747: set_metric_type_cmd,
748: "set metric-type (type-1|type-2)",
749: SET_STR
750: "Type of metric for destination routing protocol\n"
751: "OSPF[6] external type 1 metric\n"
752: "OSPF[6] external type 2 metric\n")
753: {
754: if (strcmp (argv[0], "1") == 0)
755: return ospf_route_set_add (vty, vty->index, "metric-type", "type-1");
756: if (strcmp (argv[0], "2") == 0)
757: return ospf_route_set_add (vty, vty->index, "metric-type", "type-2");
758:
759: return ospf_route_set_add (vty, vty->index, "metric-type", argv[0]);
760: }
761:
762: DEFUN (no_set_metric_type,
763: no_set_metric_type_cmd,
764: "no set metric-type",
765: NO_STR
766: SET_STR
767: "Type of metric for destination routing protocol\n")
768: {
769: if (argc == 0)
770: return ospf_route_set_delete (vty, vty->index, "metric-type", NULL);
771:
772: return ospf_route_set_delete (vty, vty->index, "metric-type", argv[0]);
773: }
774:
775: ALIAS (no_set_metric_type,
776: no_set_metric_type_val_cmd,
777: "no set metric-type (type-1|type-2)",
778: NO_STR
779: SET_STR
780: "Type of metric for destination routing protocol\n"
781: "OSPF[6] external type 1 metric\n"
782: "OSPF[6] external type 2 metric\n")
783:
784: /* Route-map init */
785: void
786: ospf_route_map_init (void)
787: {
788: route_map_init ();
789: route_map_init_vty ();
790:
791: route_map_add_hook (ospf_route_map_update);
792: route_map_delete_hook (ospf_route_map_update);
793: route_map_event_hook (ospf_route_map_event);
794:
795: route_map_install_match (&route_match_ip_nexthop_cmd);
796: route_map_install_match (&route_match_ip_next_hop_prefix_list_cmd);
797: route_map_install_match (&route_match_ip_address_cmd);
798: route_map_install_match (&route_match_ip_address_prefix_list_cmd);
799: route_map_install_match (&route_match_interface_cmd);
800:
801: route_map_install_set (&route_set_metric_cmd);
802: route_map_install_set (&route_set_metric_type_cmd);
803:
804: install_element (RMAP_NODE, &match_ip_nexthop_cmd);
805: install_element (RMAP_NODE, &no_match_ip_nexthop_cmd);
806: install_element (RMAP_NODE, &no_match_ip_nexthop_val_cmd);
807: install_element (RMAP_NODE, &match_ip_next_hop_prefix_list_cmd);
808: install_element (RMAP_NODE, &no_match_ip_next_hop_prefix_list_cmd);
809: install_element (RMAP_NODE, &no_match_ip_next_hop_prefix_list_val_cmd);
810: install_element (RMAP_NODE, &match_ip_address_cmd);
811: install_element (RMAP_NODE, &no_match_ip_address_cmd);
812: install_element (RMAP_NODE, &no_match_ip_address_val_cmd);
813: install_element (RMAP_NODE, &match_ip_address_prefix_list_cmd);
814: install_element (RMAP_NODE, &no_match_ip_address_prefix_list_cmd);
815: install_element (RMAP_NODE, &no_match_ip_address_prefix_list_val_cmd);
816: install_element (RMAP_NODE, &match_interface_cmd);
817: install_element (RMAP_NODE, &no_match_interface_cmd);
818: install_element (RMAP_NODE, &no_match_interface_val_cmd);
819:
820: install_element (RMAP_NODE, &set_metric_cmd);
821: install_element (RMAP_NODE, &no_set_metric_cmd);
822: install_element (RMAP_NODE, &no_set_metric_val_cmd);
823: install_element (RMAP_NODE, &set_metric_type_cmd);
824: install_element (RMAP_NODE, &no_set_metric_type_cmd);
825: install_element (RMAP_NODE, &no_set_metric_type_val_cmd);
826: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>