Annotation of embedaddon/quagga/ospfd/ospf_routemap.c, revision 1.1.1.2.2.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;
1.1.1.2 misho 446: int32_t ret;
1.1 misho 447:
448: metric = XCALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (u_int32_t));
1.1.1.2 misho 449: ret = atoi (arg);
1.1 misho 450:
1.1.1.2 misho 451: if (ret >= 0)
452: {
453: *metric = (u_int32_t)ret;
454: return metric;
455: }
1.1 misho 456:
457: XFREE (MTYPE_ROUTE_MAP_COMPILED, metric);
458: return NULL;
459: }
460:
461: /* Free route map's compiled `set metric' value. */
462: static void
463: route_set_metric_free (void *rule)
464: {
465: XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);
466: }
467:
468: /* Set metric rule structure. */
469: struct route_map_rule_cmd route_set_metric_cmd =
470: {
471: "metric",
472: route_set_metric,
473: route_set_metric_compile,
474: route_set_metric_free,
475: };
476:
477: /* `set metric-type TYPE' */
478: /* Set metric-type to attribute. */
479: static route_map_result_t
480: route_set_metric_type (void *rule, struct prefix *prefix,
481: route_map_object_t type, void *object)
482: {
483: u_int32_t *metric_type;
484: struct external_info *ei;
485:
486: if (type == RMAP_OSPF)
487: {
488: /* Fetch routemap's rule information. */
489: metric_type = rule;
490: ei = object;
491:
492: /* Set metric out value. */
493: ei->route_map_set.metric_type = *metric_type;
494: }
495: return RMAP_OKAY;
496: }
497:
498: /* set metric-type compilation. */
499: static void *
500: route_set_metric_type_compile (const char *arg)
501: {
502: u_int32_t *metric_type;
503:
504: metric_type = XCALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (u_int32_t));
505: if (strcmp (arg, "type-1") == 0)
506: *metric_type = EXTERNAL_METRIC_TYPE_1;
507: else if (strcmp (arg, "type-2") == 0)
508: *metric_type = EXTERNAL_METRIC_TYPE_2;
509:
510: if (*metric_type == EXTERNAL_METRIC_TYPE_1 ||
511: *metric_type == EXTERNAL_METRIC_TYPE_2)
512: return metric_type;
513:
514: XFREE (MTYPE_ROUTE_MAP_COMPILED, metric_type);
515: return NULL;
516: }
517:
518: /* Free route map's compiled `set metric-type' value. */
519: static void
520: route_set_metric_type_free (void *rule)
521: {
522: XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);
523: }
524:
525: /* Set metric rule structure. */
526: struct route_map_rule_cmd route_set_metric_type_cmd =
527: {
528: "metric-type",
529: route_set_metric_type,
530: route_set_metric_type_compile,
531: route_set_metric_type_free,
532: };
533:
1.1.1.2.2.1! misho 534: /* `set ip next-hop IP_ADDRESS' */
! 535: /* Set nexthop to object. */
! 536: static route_map_result_t
! 537: route_set_ip_nexthop (void *rule, struct prefix *prefix,
! 538: route_map_object_t type, void *object)
! 539: {
! 540: struct in_addr *address;
! 541: struct external_info *ei;
! 542:
! 543: if (type == RMAP_OSPF)
! 544: {
! 545: /* Fetch routemap's rule information. */
! 546: address = rule;
! 547: ei = object;
! 548:
! 549: /* Set metric out value. */
! 550: ei->route_map_set.nexthop = *address;
! 551: }
! 552: return RMAP_OKAY;
! 553: }
! 554:
! 555: /* set ip next-hop compilation. */
! 556: static void *
! 557: route_set_ip_nexthop_compile (const char *arg)
! 558: {
! 559: struct in_addr *address = NULL;
! 560: int ret;
! 561:
! 562: address = XMALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (struct in_addr));
! 563: ret = inet_aton (arg, address);
! 564:
! 565: if (ret == 0)
! 566: {
! 567: XFREE (MTYPE_ROUTE_MAP_COMPILED, address);
! 568: return NULL;
! 569: }
! 570:
! 571: return address;
! 572: }
! 573:
! 574: /* Free route map's compiled `set ip next-hop' value. */
! 575: static void
! 576: route_set_ip_nexthop_free (void *rule)
! 577: {
! 578: XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);
! 579: }
! 580:
! 581: /* Set ip next-hop rule structure. */
! 582: struct route_map_rule_cmd route_set_ip_nexthop_cmd =
! 583: {
! 584: "ip next-hop",
! 585: route_set_ip_nexthop,
! 586: route_set_ip_nexthop_compile,
! 587: route_set_ip_nexthop_free,
! 588: };
! 589:
1.1 misho 590: DEFUN (match_ip_nexthop,
591: match_ip_nexthop_cmd,
592: "match ip next-hop (<1-199>|<1300-2699>|WORD)",
593: MATCH_STR
594: IP_STR
595: "Match next-hop address of route\n"
596: "IP access-list number\n"
597: "IP access-list number (expanded range)\n"
598: "IP access-list name\n")
599: {
600: return ospf_route_match_add (vty, vty->index, "ip next-hop", argv[0]);
601: }
602:
603: DEFUN (no_match_ip_nexthop,
604: no_match_ip_nexthop_cmd,
605: "no match ip next-hop",
606: NO_STR
607: MATCH_STR
608: IP_STR
609: "Match next-hop address of route\n")
610: {
611: if (argc == 0)
612: return ospf_route_match_delete (vty, vty->index, "ip next-hop", NULL);
613:
614: return ospf_route_match_delete (vty, vty->index, "ip next-hop", argv[0]);
615: }
616:
617: ALIAS (no_match_ip_nexthop,
618: no_match_ip_nexthop_val_cmd,
619: "no match ip next-hop (<1-199>|<1300-2699>|WORD)",
620: NO_STR
621: MATCH_STR
622: IP_STR
623: "Match next-hop address of route\n"
624: "IP access-list number\n"
625: "IP access-list number (expanded range)\n"
626: "IP access-list name\n")
627:
628: DEFUN (match_ip_next_hop_prefix_list,
629: match_ip_next_hop_prefix_list_cmd,
630: "match ip next-hop prefix-list WORD",
631: MATCH_STR
632: IP_STR
633: "Match next-hop address of route\n"
634: "Match entries of prefix-lists\n"
635: "IP prefix-list name\n")
636: {
637: return ospf_route_match_add (vty, vty->index, "ip next-hop prefix-list",
638: argv[0]);
639: }
640:
641: DEFUN (no_match_ip_next_hop_prefix_list,
642: no_match_ip_next_hop_prefix_list_cmd,
643: "no match ip next-hop prefix-list",
644: NO_STR
645: MATCH_STR
646: IP_STR
647: "Match next-hop address of route\n"
648: "Match entries of prefix-lists\n")
649: {
650: if (argc == 0)
651: return ospf_route_match_delete (vty, vty->index, "ip next-hop prefix-list",
652: NULL);
653: return ospf_route_match_delete (vty, vty->index, "ip next-hop prefix-list",
654: argv[0]);
655: }
656:
657: ALIAS (no_match_ip_next_hop_prefix_list,
658: no_match_ip_next_hop_prefix_list_val_cmd,
659: "no match ip next-hop prefix-list WORD",
660: NO_STR
661: MATCH_STR
662: IP_STR
663: "Match next-hop address of route\n"
664: "Match entries of prefix-lists\n"
665: "IP prefix-list name\n")
666:
667: DEFUN (match_ip_address,
668: match_ip_address_cmd,
669: "match ip address (<1-199>|<1300-2699>|WORD)",
670: MATCH_STR
671: IP_STR
672: "Match address of route\n"
673: "IP access-list number\n"
674: "IP access-list number (expanded range)\n"
675: "IP access-list name\n")
676: {
677: return ospf_route_match_add (vty, vty->index, "ip address", argv[0]);
678: }
679:
680: DEFUN (no_match_ip_address,
681: no_match_ip_address_cmd,
682: "no match ip address",
683: NO_STR
684: MATCH_STR
685: IP_STR
686: "Match address of route\n")
687: {
688: if (argc == 0)
689: return ospf_route_match_delete (vty, vty->index, "ip address", NULL);
690:
691: return ospf_route_match_delete (vty, vty->index, "ip address", argv[0]);
692: }
693:
694: ALIAS (no_match_ip_address,
695: no_match_ip_address_val_cmd,
696: "no match ip address (<1-199>|<1300-2699>|WORD)",
697: NO_STR
698: MATCH_STR
699: IP_STR
700: "Match address of route\n"
701: "IP access-list number\n"
702: "IP access-list number (expanded range)\n"
703: "IP access-list name\n")
704:
705: DEFUN (match_ip_address_prefix_list,
706: match_ip_address_prefix_list_cmd,
707: "match ip address prefix-list WORD",
708: MATCH_STR
709: IP_STR
710: "Match address of route\n"
711: "Match entries of prefix-lists\n"
712: "IP prefix-list name\n")
713: {
714: return ospf_route_match_add (vty, vty->index, "ip address prefix-list",
715: argv[0]);
716: }
717:
718: DEFUN (no_match_ip_address_prefix_list,
719: no_match_ip_address_prefix_list_cmd,
720: "no match ip address prefix-list",
721: NO_STR
722: MATCH_STR
723: IP_STR
724: "Match address of route\n"
725: "Match entries of prefix-lists\n")
726: {
727: if (argc == 0)
728: return ospf_route_match_delete (vty, vty->index, "ip address prefix-list",
729: NULL);
730: return ospf_route_match_delete (vty, vty->index, "ip address prefix-list",
731: argv[0]);
732: }
733:
734: ALIAS (no_match_ip_address_prefix_list,
735: no_match_ip_address_prefix_list_val_cmd,
736: "no match ip address prefix-list WORD",
737: NO_STR
738: MATCH_STR
739: IP_STR
740: "Match address of route\n"
741: "Match entries of prefix-lists\n"
742: "IP prefix-list name\n")
743:
744: DEFUN (match_interface,
745: match_interface_cmd,
746: "match interface WORD",
747: MATCH_STR
748: "Match first hop interface of route\n"
749: "Interface name\n")
750: {
751: return ospf_route_match_add (vty, vty->index, "interface", argv[0]);
752: }
753:
754: DEFUN (no_match_interface,
755: no_match_interface_cmd,
756: "no match interface",
757: NO_STR
758: MATCH_STR
759: "Match first hop interface of route\n")
760: {
761: if (argc == 0)
762: return ospf_route_match_delete (vty, vty->index, "interface", NULL);
763:
764: return ospf_route_match_delete (vty, vty->index, "interface", argv[0]);
765: }
766:
767: ALIAS (no_match_interface,
768: no_match_interface_val_cmd,
769: "no match interface WORD",
770: NO_STR
771: MATCH_STR
772: "Match first hop interface of route\n"
773: "Interface name\n")
774:
775: DEFUN (set_metric,
776: set_metric_cmd,
777: "set metric <0-4294967295>",
778: SET_STR
779: "Metric value for destination routing protocol\n"
780: "Metric value\n")
781: {
782: return ospf_route_set_add (vty, vty->index, "metric", argv[0]);
783: }
784:
785: DEFUN (no_set_metric,
786: no_set_metric_cmd,
787: "no set metric",
788: NO_STR
789: SET_STR
790: "Metric value for destination routing protocol\n")
791: {
792: if (argc == 0)
793: return ospf_route_set_delete (vty, vty->index, "metric", NULL);
794:
795: return ospf_route_set_delete (vty, vty->index, "metric", argv[0]);
796: }
797:
798: ALIAS (no_set_metric,
799: no_set_metric_val_cmd,
800: "no set metric <0-4294967295>",
801: NO_STR
802: SET_STR
803: "Metric value for destination routing protocol\n"
804: "Metric value\n")
805:
806: DEFUN (set_metric_type,
807: set_metric_type_cmd,
808: "set metric-type (type-1|type-2)",
809: SET_STR
810: "Type of metric for destination routing protocol\n"
811: "OSPF[6] external type 1 metric\n"
812: "OSPF[6] external type 2 metric\n")
813: {
814: if (strcmp (argv[0], "1") == 0)
815: return ospf_route_set_add (vty, vty->index, "metric-type", "type-1");
816: if (strcmp (argv[0], "2") == 0)
817: return ospf_route_set_add (vty, vty->index, "metric-type", "type-2");
818:
819: return ospf_route_set_add (vty, vty->index, "metric-type", argv[0]);
820: }
821:
822: DEFUN (no_set_metric_type,
823: no_set_metric_type_cmd,
824: "no set metric-type",
825: NO_STR
826: SET_STR
827: "Type of metric for destination routing protocol\n")
828: {
829: if (argc == 0)
830: return ospf_route_set_delete (vty, vty->index, "metric-type", NULL);
831:
832: return ospf_route_set_delete (vty, vty->index, "metric-type", argv[0]);
833: }
834:
835: ALIAS (no_set_metric_type,
836: no_set_metric_type_val_cmd,
837: "no set metric-type (type-1|type-2)",
838: NO_STR
839: SET_STR
840: "Type of metric for destination routing protocol\n"
841: "OSPF[6] external type 1 metric\n"
842: "OSPF[6] external type 2 metric\n")
843:
1.1.1.2.2.1! misho 844: DEFUN (set_ip_nexthop,
! 845: set_ip_nexthop_cmd,
! 846: "set ip next-hop A.B.C.D",
! 847: SET_STR
! 848: IP_STR
! 849: "Next hop address\n"
! 850: "IP address of next hop\n")
! 851: {
! 852: union sockunion su;
! 853: int ret;
! 854:
! 855: ret = str2sockunion (argv[0], &su);
! 856: if (ret < 0)
! 857: {
! 858: vty_out (vty, "%% Malformed Next-hop address%s", VTY_NEWLINE);
! 859: return CMD_WARNING;
! 860: }
! 861:
! 862: return ospf_route_set_add (vty, vty->index, "ip next-hop", argv[0]);
! 863: }
! 864:
! 865: DEFUN (no_set_ip_nexthop,
! 866: no_set_ip_nexthop_cmd,
! 867: "no set ip next-hop",
! 868: NO_STR
! 869: SET_STR
! 870: "Next hop address\n")
! 871: {
! 872: if (argc == 0)
! 873: return ospf_route_set_delete (vty, vty->index, "ip next-hop", NULL);
! 874:
! 875: return ospf_route_set_delete (vty, vty->index, "ip next-hop", argv[0]);
! 876: }
! 877:
! 878: ALIAS (no_set_ip_nexthop,
! 879: no_set_ip_nexthop_val_cmd,
! 880: "no set ip next-hop A.B.C.D",
! 881: NO_STR
! 882: SET_STR
! 883: IP_STR
! 884: "Next hop address\n"
! 885: "IP address of next hop\n")
! 886:
1.1 misho 887: /* Route-map init */
888: void
889: ospf_route_map_init (void)
890: {
891: route_map_init ();
892: route_map_init_vty ();
893:
894: route_map_add_hook (ospf_route_map_update);
895: route_map_delete_hook (ospf_route_map_update);
896: route_map_event_hook (ospf_route_map_event);
897:
898: route_map_install_match (&route_match_ip_nexthop_cmd);
899: route_map_install_match (&route_match_ip_next_hop_prefix_list_cmd);
900: route_map_install_match (&route_match_ip_address_cmd);
901: route_map_install_match (&route_match_ip_address_prefix_list_cmd);
902: route_map_install_match (&route_match_interface_cmd);
903:
904: route_map_install_set (&route_set_metric_cmd);
905: route_map_install_set (&route_set_metric_type_cmd);
1.1.1.2.2.1! misho 906: route_map_install_set (&route_set_ip_nexthop_cmd);
1.1 misho 907:
908: install_element (RMAP_NODE, &match_ip_nexthop_cmd);
909: install_element (RMAP_NODE, &no_match_ip_nexthop_cmd);
910: install_element (RMAP_NODE, &no_match_ip_nexthop_val_cmd);
911: install_element (RMAP_NODE, &match_ip_next_hop_prefix_list_cmd);
912: install_element (RMAP_NODE, &no_match_ip_next_hop_prefix_list_cmd);
913: install_element (RMAP_NODE, &no_match_ip_next_hop_prefix_list_val_cmd);
914: install_element (RMAP_NODE, &match_ip_address_cmd);
915: install_element (RMAP_NODE, &no_match_ip_address_cmd);
916: install_element (RMAP_NODE, &no_match_ip_address_val_cmd);
917: install_element (RMAP_NODE, &match_ip_address_prefix_list_cmd);
918: install_element (RMAP_NODE, &no_match_ip_address_prefix_list_cmd);
919: install_element (RMAP_NODE, &no_match_ip_address_prefix_list_val_cmd);
920: install_element (RMAP_NODE, &match_interface_cmd);
921: install_element (RMAP_NODE, &no_match_interface_cmd);
922: install_element (RMAP_NODE, &no_match_interface_val_cmd);
923:
924: install_element (RMAP_NODE, &set_metric_cmd);
925: install_element (RMAP_NODE, &no_set_metric_cmd);
926: install_element (RMAP_NODE, &no_set_metric_val_cmd);
927: install_element (RMAP_NODE, &set_metric_type_cmd);
928: install_element (RMAP_NODE, &no_set_metric_type_cmd);
929: install_element (RMAP_NODE, &no_set_metric_type_val_cmd);
1.1.1.2.2.1! misho 930: install_element (RMAP_NODE, &set_ip_nexthop_cmd);
! 931: install_element (RMAP_NODE, &no_set_ip_nexthop_cmd);
! 932: install_element (RMAP_NODE, &no_set_ip_nexthop_val_cmd);
1.1 misho 933: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>