rip_routemap.c
上传用户:xiaozhuqw
上传日期:2009-11-15
资源大小:1338k
文件大小:22k
源码类别:

网络

开发平台:

Unix_Linux

  1. /* RIPv2 routemap.
  2.  * Copyright (C) 1999 Kunihiro Ishiguro <kunihiro@zebra.org>
  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 Free
  18.  * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
  19.  * 02111-1307, USA.  
  20.  */
  21. #include <zebra.h>
  22. #include "memory.h"
  23. #include "prefix.h"
  24. #include "routemap.h"
  25. #include "command.h"
  26. #include "filter.h"
  27. #include "log.h"
  28. #include "sockunion.h" /* for inet_aton () */
  29. #include "plist.h"
  30. #include "ripd/ripd.h"
  31. /* Add rip route map rule. */
  32. int
  33. rip_route_match_add (struct vty *vty, struct route_map_index *index,
  34.      char *command, char *arg)
  35. {
  36.   int ret;
  37.   ret = route_map_add_match (index, command, arg);
  38.   if (ret)
  39.     {
  40.       switch (ret)
  41. {
  42. case RMAP_RULE_MISSING:
  43.   vty_out (vty, "%% Can't find rule.%s", VTY_NEWLINE);
  44.   return CMD_WARNING;
  45.   break;
  46. case RMAP_COMPILE_ERROR:
  47.   vty_out (vty, "%% Argument is malformed.%s", VTY_NEWLINE);
  48.   return CMD_WARNING;
  49.   break;
  50. }
  51.     }
  52.   return CMD_SUCCESS;
  53. }
  54. /* Delete rip route map rule. */
  55. int
  56. rip_route_match_delete (struct vty *vty, struct route_map_index *index,
  57. char *command, char *arg)
  58. {
  59.   int ret;
  60.   ret = route_map_delete_match (index, command, arg);
  61.   if (ret)
  62.     {
  63.       switch (ret)
  64. {
  65. case RMAP_RULE_MISSING:
  66.   vty_out (vty, "%% Can't find rule.%s", VTY_NEWLINE);
  67.   return CMD_WARNING;
  68.   break;
  69. case RMAP_COMPILE_ERROR:
  70.   vty_out (vty, "%% Argument is malformed.%s", VTY_NEWLINE);
  71.   return CMD_WARNING;
  72.   break;
  73. }
  74.     }
  75.   return CMD_SUCCESS;
  76. }
  77. /* Add rip route map rule. */
  78. int
  79. rip_route_set_add (struct vty *vty, struct route_map_index *index,
  80.    char *command, char *arg)
  81. {
  82.   int ret;
  83.   ret = route_map_add_set (index, command, arg);
  84.   if (ret)
  85.     {
  86.       switch (ret)
  87. {
  88. case RMAP_RULE_MISSING:
  89.   vty_out (vty, "%% Can't find rule.%s", VTY_NEWLINE);
  90.   return CMD_WARNING;
  91.   break;
  92. case RMAP_COMPILE_ERROR:
  93.   vty_out (vty, "%% Argument is malformed.%s", VTY_NEWLINE);
  94.   return CMD_WARNING;
  95.   break;
  96. }
  97.     }
  98.   return CMD_SUCCESS;
  99. }
  100. /* Delete rip route map rule. */
  101. int
  102. rip_route_set_delete (struct vty *vty, struct route_map_index *index,
  103.       char *command, char *arg)
  104. {
  105.   int ret;
  106.   ret = route_map_delete_set (index, command, arg);
  107.   if (ret)
  108.     {
  109.       switch (ret)
  110. {
  111. case RMAP_RULE_MISSING:
  112.   vty_out (vty, "%% Can't find rule.%s", VTY_NEWLINE);
  113.   return CMD_WARNING;
  114.   break;
  115. case RMAP_COMPILE_ERROR:
  116.   vty_out (vty, "%% Argument is malformed.%s", VTY_NEWLINE);
  117.   return CMD_WARNING;
  118.   break;
  119. }
  120.     }
  121.   return CMD_SUCCESS;
  122. }
  123. /* Hook function for updating route_map assignment. */
  124. void
  125. rip_route_map_update ()
  126. {
  127.   int i;
  128.   if (rip) 
  129.     {
  130.       for (i = 0; i < ZEBRA_ROUTE_MAX; i++) 
  131. {
  132.   if (rip->route_map[i].name)
  133.     rip->route_map[i].map = 
  134.       route_map_lookup_by_name (rip->route_map[i].name);
  135. }
  136.     }
  137. }
  138. /* `match metric METRIC' */
  139. /* Match function return 1 if match is success else return zero. */
  140. route_map_result_t
  141. route_match_metric (void *rule, struct prefix *prefix, 
  142.     route_map_object_t type, void *object)
  143. {
  144.   u_int32_t *metric;
  145.   struct rip_info *rinfo;
  146.   if (type == RMAP_RIP)
  147.     {
  148.       metric = rule;
  149.       rinfo = object;
  150.     
  151.       if (rinfo->metric == *metric)
  152. return RMAP_MATCH;
  153.       else
  154. return RMAP_NOMATCH;
  155.     }
  156.   return RMAP_NOMATCH;
  157. }
  158. /* Route map `match metric' match statement. `arg' is METRIC value */
  159. void *
  160. route_match_metric_compile (char *arg)
  161. {
  162.   u_int32_t *metric;
  163.   metric = XMALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (u_int32_t));
  164.   *metric = atoi (arg);
  165.   if(*metric > 0)
  166.     return metric;
  167.   XFREE (MTYPE_ROUTE_MAP_COMPILED, metric);
  168.   return NULL;
  169. }
  170. /* Free route map's compiled `match metric' value. */
  171. void
  172. route_match_metric_free (void *rule)
  173. {
  174.   XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);
  175. }
  176. /* Route map commands for metric matching. */
  177. struct route_map_rule_cmd route_match_metric_cmd =
  178. {
  179.   "metric",
  180.   route_match_metric,
  181.   route_match_metric_compile,
  182.   route_match_metric_free
  183. };
  184. /* `match interface IFNAME' */
  185. /* Match function return 1 if match is success else return zero. */
  186. route_map_result_t
  187. route_match_interface (void *rule, struct prefix *prefix,
  188.        route_map_object_t type, void *object)
  189. {
  190.   struct rip_info *rinfo;
  191.   struct interface *ifp;
  192.   char *ifname;
  193.   if (type == RMAP_RIP)
  194.     {
  195.       ifname = rule;
  196.       ifp = if_lookup_by_name(ifname);
  197.       if (!ifp)
  198. return RMAP_NOMATCH;
  199.       rinfo = object;
  200.       if (rinfo->ifindex_out == ifp->ifindex)
  201. return RMAP_MATCH;
  202.       else
  203. return RMAP_NOMATCH;
  204.     }
  205.   return RMAP_NOMATCH;
  206. }
  207. /* Route map `match interface' match statement. `arg' is IFNAME value */
  208. /* XXX I don`t know if I need to check does interface exist? */
  209. void *
  210. route_match_interface_compile (char *arg)
  211. {
  212.   return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg);
  213. }
  214. /* Free route map's compiled `match interface' value. */
  215. void
  216. route_match_interface_free (void *rule)
  217. {
  218.   XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);
  219. }
  220. /* Route map commands for interface matching. */
  221. struct route_map_rule_cmd route_match_interface_cmd =
  222. {
  223.   "interface",
  224.   route_match_interface,
  225.   route_match_interface_compile,
  226.   route_match_interface_free
  227. };
  228. /* `match ip next-hop IP_ACCESS_LIST' */
  229. /* Match function return 1 if match is success else return zero. */
  230. route_map_result_t
  231. route_match_ip_next_hop (void *rule, struct prefix *prefix,
  232. route_map_object_t type, void *object)
  233. {
  234.   struct access_list *alist;
  235.   struct rip_info *rinfo;
  236.   struct prefix_ipv4 p;
  237.   if (type == RMAP_RIP)
  238.     {
  239.       rinfo = object;
  240.       p.family = AF_INET;
  241.       p.prefix = rinfo->nexthop;
  242.       p.prefixlen = IPV4_MAX_BITLEN;
  243.       alist = access_list_lookup (AFI_IP, (char *) rule);
  244.       if (alist == NULL)
  245. return RMAP_NOMATCH;
  246.       return (access_list_apply (alist, &p) == FILTER_DENY ?
  247.       RMAP_NOMATCH : RMAP_MATCH);
  248.     }
  249.   return RMAP_NOMATCH;
  250. }
  251. /* Route map `ip next-hop' match statement.  `arg' should be
  252.    access-list name. */
  253. void *
  254. route_match_ip_next_hop_compile (char *arg)
  255. {
  256.   return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg);
  257. }
  258. /* Free route map's compiled `. */
  259. void
  260. route_match_ip_next_hop_free (void *rule)
  261. {
  262.   XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);
  263. }
  264. /* Route map commands for ip next-hop matching. */
  265. struct route_map_rule_cmd route_match_ip_next_hop_cmd =
  266. {
  267.   "ip next-hop",
  268.   route_match_ip_next_hop,
  269.   route_match_ip_next_hop_compile,
  270.   route_match_ip_next_hop_free
  271. };
  272. /* `match ip next-hop prefix-list PREFIX_LIST' */
  273. route_map_result_t
  274. route_match_ip_next_hop_prefix_list (void *rule, struct prefix *prefix,
  275.                                     route_map_object_t type, void *object)
  276. {
  277.   struct prefix_list *plist;
  278.   struct rip_info *rinfo;
  279.   struct prefix_ipv4 p;
  280.   if (type == RMAP_RIP)
  281.     {
  282.       rinfo = object;
  283.       p.family = AF_INET;
  284.       p.prefix = rinfo->nexthop;
  285.       p.prefixlen = IPV4_MAX_BITLEN;
  286.       plist = prefix_list_lookup (AFI_IP, (char *) rule);
  287.       if (plist == NULL)
  288.         return RMAP_NOMATCH;
  289.       return (prefix_list_apply (plist, &p) == PREFIX_DENY ?
  290.               RMAP_NOMATCH : RMAP_MATCH);
  291.     }
  292.   return RMAP_NOMATCH;
  293. }
  294. void *
  295. route_match_ip_next_hop_prefix_list_compile (char *arg)
  296. {
  297.   return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg);
  298. }
  299. void
  300. route_match_ip_next_hop_prefix_list_free (void *rule)
  301. {
  302.   XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);
  303. }
  304. struct route_map_rule_cmd route_match_ip_next_hop_prefix_list_cmd =
  305. {
  306.   "ip next-hop prefix-list",
  307.   route_match_ip_next_hop_prefix_list,
  308.   route_match_ip_next_hop_prefix_list_compile,
  309.   route_match_ip_next_hop_prefix_list_free
  310. };
  311. /* `match ip address IP_ACCESS_LIST' */
  312. /* Match function should return 1 if match is success else return
  313.    zero. */
  314. route_map_result_t
  315. route_match_ip_address (void *rule, struct prefix *prefix, 
  316. route_map_object_t type, void *object)
  317. {
  318.   struct access_list *alist;
  319.   if (type == RMAP_RIP)
  320.     {
  321.       alist = access_list_lookup (AFI_IP, (char *) rule);
  322.       if (alist == NULL)
  323. return RMAP_NOMATCH;
  324.     
  325.       return (access_list_apply (alist, prefix) == FILTER_DENY ?
  326.       RMAP_NOMATCH : RMAP_MATCH);
  327.     }
  328.   return RMAP_NOMATCH;
  329. }
  330. /* Route map `ip address' match statement.  `arg' should be
  331.    access-list name. */
  332. void *
  333. route_match_ip_address_compile (char *arg)
  334. {
  335.   return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg);
  336. }
  337. /* Free route map's compiled `ip address' value. */
  338. void
  339. route_match_ip_address_free (void *rule)
  340. {
  341.   XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);
  342. }
  343. /* Route map commands for ip address matching. */
  344. struct route_map_rule_cmd route_match_ip_address_cmd =
  345. {
  346.   "ip address",
  347.   route_match_ip_address,
  348.   route_match_ip_address_compile,
  349.   route_match_ip_address_free
  350. };
  351. /* `match ip address prefix-list PREFIX_LIST' */
  352. route_map_result_t
  353. route_match_ip_address_prefix_list (void *rule, struct prefix *prefix, 
  354.     route_map_object_t type, void *object)
  355. {
  356.   struct prefix_list *plist;
  357.   if (type == RMAP_RIP)
  358.     {
  359.       plist = prefix_list_lookup (AFI_IP, (char *) rule);
  360.       if (plist == NULL)
  361. return RMAP_NOMATCH;
  362.     
  363.       return (prefix_list_apply (plist, prefix) == PREFIX_DENY ?
  364.       RMAP_NOMATCH : RMAP_MATCH);
  365.     }
  366.   return RMAP_NOMATCH;
  367. }
  368. void *
  369. route_match_ip_address_prefix_list_compile (char *arg)
  370. {
  371.   return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg);
  372. }
  373. void
  374. route_match_ip_address_prefix_list_free (void *rule)
  375. {
  376.   XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);
  377. }
  378. struct route_map_rule_cmd route_match_ip_address_prefix_list_cmd =
  379. {
  380.   "ip address prefix-list",
  381.   route_match_ip_address_prefix_list,
  382.   route_match_ip_address_prefix_list_compile,
  383.   route_match_ip_address_prefix_list_free
  384. };
  385. /* `set metric METRIC' */
  386. /* Set metric to attribute. */
  387. route_map_result_t
  388. route_set_metric (void *rule, struct prefix *prefix, 
  389.   route_map_object_t type, void *object)
  390. {
  391.   u_int32_t *metric;
  392.   struct rip_info *rinfo;
  393.   if (type == RMAP_RIP)
  394.     {
  395.       /* Fetch routemap's rule information. */
  396.       metric = rule;
  397.       rinfo = object;
  398.     
  399.       /* Set metric out value. */
  400.       rinfo->metric_out = *metric;
  401.       rinfo->metric_set = 1;
  402.     }
  403.   return RMAP_OKAY;
  404. }
  405. /* set metric compilation. */
  406. void *
  407. route_set_metric_compile (char *arg)
  408. {
  409.   u_int32_t *metric;
  410.   metric = XMALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (u_int32_t));
  411.   *metric = atoi (arg);
  412.   return metric;
  413. }
  414. /* Free route map's compiled `set metric' value. */
  415. void
  416. route_set_metric_free (void *rule)
  417. {
  418.   XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);
  419. }
  420. /* Set metric rule structure. */
  421. struct route_map_rule_cmd route_set_metric_cmd = 
  422. {
  423.   "metric",
  424.   route_set_metric,
  425.   route_set_metric_compile,
  426.   route_set_metric_free,
  427. };
  428. /* `set ip next-hop IP_ADDRESS' */
  429. /* Set nexthop to object.  ojbect must be pointer to struct attr. */
  430. route_map_result_t
  431. route_set_ip_nexthop (void *rule, struct prefix *prefix, 
  432.       route_map_object_t type, void *object)
  433. {
  434.   struct in_addr *address;
  435.   struct rip_info *rinfo;
  436.   if(type == RMAP_RIP)
  437.     {
  438.       /* Fetch routemap's rule information. */
  439.       address = rule;
  440.       rinfo = object;
  441.     
  442.       /* Set next hop value. */ 
  443.       rinfo->nexthop_out = *address;
  444.     }
  445.   return RMAP_OKAY;
  446. }
  447. /* Route map `ip nexthop' compile function.  Given string is converted
  448.    to struct in_addr structure. */
  449. void *
  450. route_set_ip_nexthop_compile (char *arg)
  451. {
  452.   int ret;
  453.   struct in_addr *address;
  454.   address = XMALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (struct in_addr));
  455.   ret = inet_aton (arg, address);
  456.   if (ret == 0)
  457.     {
  458.       XFREE (MTYPE_ROUTE_MAP_COMPILED, address);
  459.       return NULL;
  460.     }
  461.   return address;
  462. }
  463. /* Free route map's compiled `ip nexthop' value. */
  464. void
  465. route_set_ip_nexthop_free (void *rule)
  466. {
  467.   XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);
  468. }
  469. /* Route map commands for ip nexthop set. */
  470. struct route_map_rule_cmd route_set_ip_nexthop_cmd =
  471. {
  472.   "ip next-hop",
  473.   route_set_ip_nexthop,
  474.   route_set_ip_nexthop_compile,
  475.   route_set_ip_nexthop_free
  476. };
  477. #define MATCH_STR "Match values from routing tablen"
  478. #define SET_STR "Set values in destination routing protocoln"
  479. DEFUN (match_metric, 
  480.        match_metric_cmd,
  481.        "match metric <0-4294967295>",
  482.        MATCH_STR
  483.        "Match metric of routen"
  484.        "Metric valuen")
  485. {
  486.   return rip_route_match_add (vty, vty->index, "metric", argv[0]);
  487. }
  488. DEFUN (no_match_metric,
  489.        no_match_metric_cmd,
  490.        "no match metric",
  491.        NO_STR
  492.        MATCH_STR
  493.        "Match metric of routen")
  494. {
  495.   if (argc == 0)
  496.     return rip_route_match_delete (vty, vty->index, "metric", NULL);
  497.   return rip_route_match_delete (vty, vty->index, "metric", argv[0]);
  498. }
  499. ALIAS (no_match_metric,
  500.        no_match_metric_val_cmd,
  501.        "no match metric <0-4294967295>",
  502.        NO_STR
  503.        MATCH_STR
  504.        "Match metric of routen"
  505.        "Metric valuen");
  506. DEFUN (match_interface,
  507.        match_interface_cmd,
  508.        "match interface WORD",
  509.        MATCH_STR
  510.        "Match first hop interface of routen"
  511.        "Interface namen")
  512. {
  513.   return rip_route_match_add (vty, vty->index, "interface", argv[0]);
  514. }
  515. DEFUN (no_match_interface,
  516.        no_match_interface_cmd,
  517.        "no match interface",
  518.        NO_STR
  519.        MATCH_STR
  520.        "Match first hop interface of routen")
  521. {
  522.   if (argc == 0)
  523.     return rip_route_match_delete (vty, vty->index, "interface", NULL);
  524.   return rip_route_match_delete (vty, vty->index, "interface", argv[0]);
  525. }
  526. ALIAS (no_match_interface,
  527.        no_match_interface_val_cmd,
  528.        "no match interface WORD",
  529.        NO_STR
  530.        MATCH_STR
  531.        "Match first hop interface of routen"
  532.        "Interface namen");
  533. DEFUN (match_ip_next_hop,
  534.        match_ip_next_hop_cmd,
  535.        "match ip next-hop (<1-199>|<1300-2699>|WORD)",
  536.        MATCH_STR
  537.        IP_STR
  538.        "Match next-hop address of routen"
  539.        "IP access-list numbern"
  540.        "IP access-list number (expanded range)n"
  541.        "IP Access-list namen")
  542. {
  543.   return rip_route_match_add (vty, vty->index, "ip next-hop", argv[0]);
  544. }
  545. DEFUN (no_match_ip_next_hop,
  546.        no_match_ip_next_hop_cmd,
  547.        "no match ip next-hop",
  548.        NO_STR
  549.        MATCH_STR
  550.        IP_STR
  551.        "Match next-hop address of routen")
  552. {
  553.   if (argc == 0)
  554.     return rip_route_match_delete (vty, vty->index, "ip next-hop", NULL);
  555.   return rip_route_match_delete (vty, vty->index, "ip next-hop", argv[0]);
  556. }
  557. ALIAS (no_match_ip_next_hop,
  558.        no_match_ip_next_hop_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 routen"
  564.        "IP access-list numbern"
  565.        "IP access-list number (expanded range)n"
  566.        "IP Access-list namen");
  567. DEFUN (match_ip_next_hop_prefix_list,
  568.        match_ip_next_hop_prefix_list_cmd,
  569.        "match ip next-hop prefix-list WORD",
  570.        MATCH_STR
  571.        IP_STR
  572.        "Match next-hop address of routen"
  573.        "Match entries of prefix-listsn"
  574.        "IP prefix-list namen")
  575. {
  576.   return rip_route_match_add (vty, vty->index, "ip next-hop prefix-list", argv[0]);
  577. }
  578. DEFUN (no_match_ip_next_hop_prefix_list,
  579.        no_match_ip_next_hop_prefix_list_cmd,
  580.        "no match ip next-hop prefix-list",
  581.        NO_STR
  582.        MATCH_STR
  583.        IP_STR
  584.        "Match next-hop address of routen"
  585.        "Match entries of prefix-listsn")
  586. {
  587.   if (argc == 0)
  588.     return rip_route_match_delete (vty, vty->index, "ip next-hop prefix-list", NULL);
  589.   return rip_route_match_delete (vty, vty->index, "ip next-hop prefix-list", argv[0]);
  590. }
  591. ALIAS (no_match_ip_next_hop_prefix_list,
  592.        no_match_ip_next_hop_prefix_list_val_cmd,
  593.        "no match ip next-hop prefix-list WORD",
  594.        NO_STR
  595.        MATCH_STR
  596.        IP_STR
  597.        "Match next-hop address of routen"
  598.        "Match entries of prefix-listsn"
  599.        "IP prefix-list namen");
  600. DEFUN (match_ip_address,
  601.        match_ip_address_cmd,
  602.        "match ip address (<1-199>|<1300-2699>|WORD)",
  603.        MATCH_STR
  604.        IP_STR
  605.        "Match address of routen"
  606.        "IP access-list numbern"
  607.        "IP access-list number (expanded range)n"
  608.        "IP Access-list namen")
  609. {
  610.   return rip_route_match_add (vty, vty->index, "ip address", argv[0]);
  611. }
  612. DEFUN (no_match_ip_address, 
  613.        no_match_ip_address_cmd,
  614.        "no match ip address",
  615.        NO_STR
  616.        MATCH_STR
  617.        IP_STR
  618.        "Match address of routen")
  619. {
  620.   if (argc == 0)
  621.     return rip_route_match_delete (vty, vty->index, "ip address", NULL);
  622.   return rip_route_match_delete (vty, vty->index, "ip address", argv[0]);
  623. }
  624. ALIAS (no_match_ip_address,
  625.        no_match_ip_address_val_cmd,
  626.        "no match ip address (<1-199>|<1300-2699>|WORD)",
  627.        NO_STR
  628.        MATCH_STR
  629.        IP_STR
  630.        "Match address of routen"
  631.        "IP access-list numbern"
  632.        "IP access-list number (expanded range)n"
  633.        "IP Access-list namen");
  634. DEFUN (match_ip_address_prefix_list, 
  635.        match_ip_address_prefix_list_cmd,
  636.        "match ip address prefix-list WORD",
  637.        MATCH_STR
  638.        IP_STR
  639.        "Match address of routen"
  640.        "Match entries of prefix-listsn"
  641.        "IP prefix-list namen")
  642. {
  643.   return rip_route_match_add (vty, vty->index, "ip address prefix-list", argv[0]);
  644. }
  645. DEFUN (no_match_ip_address_prefix_list,
  646.        no_match_ip_address_prefix_list_cmd,
  647.        "no match ip address prefix-list",
  648.        NO_STR
  649.        MATCH_STR
  650.        IP_STR
  651.        "Match address of routen"
  652.        "Match entries of prefix-listsn")
  653. {
  654.   if (argc == 0)
  655.     return rip_route_match_delete (vty, vty->index, "ip address prefix-list", NULL);
  656.   return rip_route_match_delete (vty, vty->index, "ip address prefix-list", argv[0]);
  657. }
  658. ALIAS (no_match_ip_address_prefix_list,
  659.        no_match_ip_address_prefix_list_val_cmd,
  660.        "no match ip address prefix-list WORD",
  661.        NO_STR
  662.        MATCH_STR
  663.        IP_STR
  664.        "Match address of routen"
  665.        "Match entries of prefix-listsn"
  666.        "IP prefix-list namen");
  667. /* set functions */
  668. DEFUN (set_metric,
  669.        set_metric_cmd,
  670.        "set metric <0-4294967295>",
  671.        SET_STR
  672.        "Metric value for destination routing protocoln"
  673.        "Metric valuen")
  674. {
  675.   return rip_route_set_add (vty, vty->index, "metric", argv[0]);
  676. }
  677. DEFUN (no_set_metric,
  678.        no_set_metric_cmd,
  679.        "no set metric",
  680.        NO_STR
  681.        SET_STR
  682.        "Metric value for destination routing protocoln")
  683. {
  684.   if (argc == 0)
  685.     return rip_route_set_delete (vty, vty->index, "metric", NULL);
  686.   return rip_route_set_delete (vty, vty->index, "metric", argv[0]);
  687. }
  688. ALIAS (no_set_metric,
  689.        no_set_metric_val_cmd,
  690.        "no set metric <0-4294967295>",
  691.        NO_STR
  692.        SET_STR
  693.        "Metric value for destination routing protocoln"
  694.        "Metric valuen");
  695. DEFUN (set_ip_nexthop,
  696.        set_ip_nexthop_cmd,
  697.        "set ip next-hop A.B.C.D",
  698.        SET_STR
  699.        IP_STR
  700.        "Next hop addressn"
  701.        "IP address of next hopn")
  702. {
  703.   union sockunion su;
  704.   int ret;
  705.   ret = str2sockunion (argv[0], &su);
  706.   if (ret < 0)
  707.     {
  708.       vty_out (vty, "%% Malformed next-hop address%s", VTY_NEWLINE);
  709.       return CMD_WARNING;
  710.     }
  711.   return rip_route_set_add (vty, vty->index, "ip next-hop", argv[0]);
  712. }
  713. DEFUN (no_set_ip_nexthop,
  714.        no_set_ip_nexthop_cmd,
  715.        "no set ip next-hop",
  716.        NO_STR
  717.        SET_STR
  718.        IP_STR
  719.        "Next hop addressn")
  720. {
  721.   if (argc == 0)
  722.     return rip_route_set_delete (vty, vty->index, "ip next-hop", NULL);
  723.   
  724.   return rip_route_set_delete (vty, vty->index, "ip next-hop", argv[0]);
  725. }
  726. ALIAS (no_set_ip_nexthop,
  727.        no_set_ip_nexthop_val_cmd,
  728.        "no set ip next-hop A.B.C.D",
  729.        NO_STR
  730.        SET_STR
  731.        IP_STR
  732.        "Next hop addressn"
  733.        "IP address of next hopn");
  734. void
  735. rip_route_map_reset ()
  736. {
  737.   ;
  738. }
  739. /* Route-map init */
  740. void
  741. rip_route_map_init ()
  742. {
  743.   route_map_init ();
  744.   route_map_init_vty ();
  745.   route_map_add_hook (rip_route_map_update);
  746.   route_map_delete_hook (rip_route_map_update);
  747.   route_map_install_match (&route_match_metric_cmd);
  748.   route_map_install_match (&route_match_interface_cmd);
  749.   route_map_install_match (&route_match_ip_next_hop_cmd);
  750.   route_map_install_match (&route_match_ip_next_hop_prefix_list_cmd);
  751.   route_map_install_match (&route_match_ip_address_cmd);
  752.   route_map_install_match (&route_match_ip_address_prefix_list_cmd);
  753.   route_map_install_set (&route_set_metric_cmd);
  754.   route_map_install_set (&route_set_ip_nexthop_cmd);
  755.   install_element (RMAP_NODE, &match_metric_cmd);
  756.   install_element (RMAP_NODE, &no_match_metric_cmd);
  757.   install_element (RMAP_NODE, &no_match_metric_val_cmd);
  758.   install_element (RMAP_NODE, &match_interface_cmd);
  759.   install_element (RMAP_NODE, &no_match_interface_cmd);
  760.   install_element (RMAP_NODE, &no_match_interface_val_cmd);
  761.   install_element (RMAP_NODE, &match_ip_next_hop_cmd);
  762.   install_element (RMAP_NODE, &no_match_ip_next_hop_cmd);
  763.   install_element (RMAP_NODE, &no_match_ip_next_hop_val_cmd);
  764.   install_element (RMAP_NODE, &match_ip_next_hop_prefix_list_cmd);
  765.   install_element (RMAP_NODE, &no_match_ip_next_hop_prefix_list_cmd);
  766.   install_element (RMAP_NODE, &no_match_ip_next_hop_prefix_list_val_cmd);
  767.   install_element (RMAP_NODE, &match_ip_address_cmd);
  768.   install_element (RMAP_NODE, &no_match_ip_address_cmd);
  769.   install_element (RMAP_NODE, &no_match_ip_address_val_cmd);
  770.   install_element (RMAP_NODE, &match_ip_address_prefix_list_cmd);
  771.   install_element (RMAP_NODE, &no_match_ip_address_prefix_list_cmd);
  772.   install_element (RMAP_NODE, &no_match_ip_address_prefix_list_val_cmd);
  773.   install_element (RMAP_NODE, &set_metric_cmd);
  774.   install_element (RMAP_NODE, &no_set_metric_cmd);
  775.   install_element (RMAP_NODE, &no_set_metric_val_cmd);
  776.   install_element (RMAP_NODE, &set_ip_nexthop_cmd);
  777.   install_element (RMAP_NODE, &no_set_ip_nexthop_cmd);
  778.   install_element (RMAP_NODE, &no_set_ip_nexthop_val_cmd);
  779. }