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

网络

开发平台:

Unix_Linux

  1. /* RIPng routemap.
  2.  * Copyright (C) 1999 Kunihiro Ishiguro
  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 "if.h"
  23. #include "memory.h"
  24. #include "prefix.h"
  25. #include "routemap.h"
  26. #include "command.h"
  27. #include "ripngd/ripngd.h"
  28. #if 0
  29. /* `match interface IFNAME' */
  30. route_map_result_t
  31. route_match_interface (void *rule, struct prefix *prefix,
  32.        route_map_object_t type, void *object)
  33. {
  34.   struct ripng_info *rinfo;
  35.   struct interface *ifp;
  36.   char *ifname;
  37.   if (type == ROUTE_MAP_RIPNG)
  38.     {
  39.       ifname = rule;
  40.       ifp = if_lookup_by_name(ifname);
  41.       if (!ifp)
  42. return RM_NOMATCH;
  43.       rinfo = object;
  44.       if (rinfo->ifindex == ifp->ifindex)
  45. return RM_MATCH;
  46.       else
  47. return RM_NOMATCH;
  48.     }
  49.   return RM_NOMATCH;
  50. }
  51. void *
  52. route_match_interface_compile (char *arg)
  53. {
  54.   return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg);
  55. }
  56. void
  57. route_match_interface_free (void *rule)
  58. {
  59.   XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);
  60. }
  61. struct route_map_rule_cmd route_match_interface_cmd =
  62. {
  63.   "interface",
  64.   route_match_interface,
  65.   route_match_interface_compile,
  66.   route_match_interface_free
  67. };
  68. #endif /* 0 */
  69. struct rip_metric_modifier
  70. {
  71.   enum 
  72.   {
  73.     metric_increment,
  74.     metric_decrement,
  75.     metric_absolute
  76.   } type;
  77.   u_char metric;
  78. };
  79. route_map_result_t
  80. route_set_metric (void *rule, struct prefix *prefix, 
  81.   route_map_object_t type, void *object)
  82. {
  83.   if (type == RMAP_RIPNG)
  84.     {
  85.       struct rip_metric_modifier *mod;
  86.       struct ripng_info *rinfo;
  87.       mod = rule;
  88.       rinfo = object;
  89.       if (mod->type == metric_increment)
  90. rinfo->metric += mod->metric;
  91.       else if (mod->type == metric_decrement)
  92. rinfo->metric -= mod->metric;
  93.       else if (mod->type == metric_absolute)
  94. rinfo->metric = mod->metric;
  95.       if (rinfo->metric < 1)
  96. rinfo->metric = 1;
  97.       if (rinfo->metric > RIPNG_METRIC_INFINITY)
  98. rinfo->metric = RIPNG_METRIC_INFINITY;
  99.       rinfo->metric_set = 1;
  100.     }
  101.   return RMAP_OKAY;
  102. }
  103. void *
  104. route_set_metric_compile (char *arg)
  105. {
  106.   int len;
  107.   char *pnt;
  108.   int type;
  109.   long metric;
  110.   char *endptr = NULL;
  111.   struct rip_metric_modifier *mod;
  112.   len = strlen (arg);
  113.   pnt = arg;
  114.   if (len == 0)
  115.     return NULL;
  116.   /* Examine first character. */
  117.   if (arg[0] == '+')
  118.     {
  119.       type = metric_increment;
  120.       pnt++;
  121.     }
  122.   else if (arg[0] == '-')
  123.     {
  124.       type = metric_decrement;
  125.       pnt++;
  126.     }
  127.   else
  128.     type = metric_absolute;
  129.   /* Check beginning with digit string. */
  130.   if (*pnt < '0' || *pnt > '9')
  131.     return NULL;
  132.   /* Convert string to integer. */
  133.   metric = strtol (pnt, &endptr, 10);
  134.   if (metric == LONG_MAX || *endptr != '')
  135.     return NULL;
  136.   /* Commented out by Hasso Tepper, to avoid problems in vtysh. */
  137.   /* if (metric < 0 || metric > RIPNG_METRIC_INFINITY) */
  138.   if (metric < 0)
  139.     return NULL;
  140.   mod = XMALLOC (MTYPE_ROUTE_MAP_COMPILED, 
  141.  sizeof (struct rip_metric_modifier));
  142.   mod->type = type;
  143.   mod->metric = metric;
  144.   return mod;
  145. }
  146. void
  147. route_set_metric_free (void *rule)
  148. {
  149.   XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);
  150. }
  151. struct route_map_rule_cmd route_set_metric_cmd = 
  152. {
  153.   "metric",
  154.   route_set_metric,
  155.   route_set_metric_compile,
  156.   route_set_metric_free,
  157. };
  158. int
  159. ripng_route_match_add (struct vty *vty, struct route_map_index *index,
  160.        char *command, char *arg)
  161. {
  162.   int ret;
  163.   ret = route_map_add_match (index, command, arg);
  164.   if (ret)
  165.     {
  166.       switch (ret)
  167. {
  168. case RMAP_RULE_MISSING:
  169.   vty_out (vty, "Can't find rule.%s", VTY_NEWLINE);
  170.   return CMD_WARNING;
  171.   break;
  172. case RMAP_COMPILE_ERROR:
  173.   vty_out (vty, "Argument is malformed.%s", VTY_NEWLINE);
  174.   return CMD_WARNING;
  175.   break;
  176. }
  177.     }
  178.   return CMD_SUCCESS;
  179. }
  180. int
  181. ripng_route_match_delete (struct vty *vty, struct route_map_index *index,
  182.   char *command, char *arg)
  183. {
  184.   int ret;
  185.   ret = route_map_delete_match (index, command, arg);
  186.   if (ret)
  187.     {
  188.       switch (ret)
  189. {
  190. case RMAP_RULE_MISSING:
  191.   vty_out (vty, "Can't find rule.%s", VTY_NEWLINE);
  192.   return CMD_WARNING;
  193.   break;
  194. case RMAP_COMPILE_ERROR:
  195.   vty_out (vty, "Argument is malformed.%s", VTY_NEWLINE);
  196.   return CMD_WARNING;
  197.   break;
  198. }
  199.     }
  200.   return CMD_SUCCESS;
  201. }
  202. int
  203. ripng_route_set_add (struct vty *vty, struct route_map_index *index,
  204.      char *command, char *arg)
  205. {
  206.   int ret;
  207.   ret = route_map_add_set (index, command, arg);
  208.   if (ret)
  209.     {
  210.       switch (ret)
  211. {
  212. case RMAP_RULE_MISSING:
  213.   vty_out (vty, "Can't find rule.%s", VTY_NEWLINE);
  214.   return CMD_WARNING;
  215.   break;
  216. case RMAP_COMPILE_ERROR:
  217.   vty_out (vty, "Argument is malformed.%s", VTY_NEWLINE);
  218.   return CMD_WARNING;
  219.   break;
  220. }
  221.     }
  222.   return CMD_SUCCESS;
  223. }
  224. int
  225. ripng_route_set_delete (struct vty *vty, struct route_map_index *index,
  226. char *command, char *arg)
  227. {
  228.   int ret;
  229.   ret = route_map_delete_set (index, command, arg);
  230.   if (ret)
  231.     {
  232.       switch (ret)
  233. {
  234. case RMAP_RULE_MISSING:
  235.   vty_out (vty, "Can't find rule.%s", VTY_NEWLINE);
  236.   return CMD_WARNING;
  237.   break;
  238. case RMAP_COMPILE_ERROR:
  239.   vty_out (vty, "Argument is malformed.%s", VTY_NEWLINE);
  240.   return CMD_WARNING;
  241.   break;
  242. }
  243.     }
  244.   return CMD_SUCCESS;
  245. }
  246. #if 0
  247. DEFUN (match_interface,
  248.        match_interface_cmd,
  249.        "match interface WORD",
  250.        "Match valuen"
  251.        "Interfacen"
  252.        "Interface namen")
  253. {
  254.   return ripng_route_match_add (vty, vty->index, "interface", argv[0]);
  255. }
  256. DEFUN (no_match_interface,
  257.        no_match_interface_cmd,
  258.        "no match interface WORD",
  259.        NO_STR
  260.        "Match valuen"
  261.        "Interfacen"
  262.        "Interface namen")
  263. {
  264.   return ripng_route_match_delete (vty, vty->index, "interface", argv[0]);
  265. }
  266. #endif /* 0 */
  267. DEFUN (set_metric,
  268.        set_metric_cmd,
  269.        "set metric <0-4294967295>",
  270.        "Set valuen"
  271.        "Metricn"
  272.        "METRIC valuen")
  273. {
  274.   return ripng_route_set_add (vty, vty->index, "metric", argv[0]);
  275. }
  276. DEFUN (no_set_metric,
  277.        no_set_metric_cmd,
  278.        "no set metric",
  279.        NO_STR
  280.        SET_STR
  281.        "Metric value for destination routing protocoln")
  282. {
  283.   if (argc == 0)
  284.     return ripng_route_set_delete (vty, vty->index, "metric", NULL);
  285.   return ripng_route_set_delete (vty, vty->index, "metric", argv[0]);
  286. }
  287. ALIAS (no_set_metric,
  288.        no_set_metric_val_cmd,
  289.        "no set metric <0-4294967295>",
  290.        NO_STR
  291.        SET_STR
  292.        "Metric value for destination routing protocoln"
  293.        "Metric valuen");
  294. void
  295. ripng_route_map_init ()
  296. {
  297.   route_map_init ();
  298.   route_map_init_vty ();
  299.   /* route_map_install_match (&route_match_interface_cmd); */
  300.   route_map_install_set (&route_set_metric_cmd);
  301.   /*
  302.   install_element (RMAP_NODE, &match_interface_cmd);
  303.   install_element (RMAP_NODE, &no_match_interface_cmd);
  304.   */
  305.   install_element (RMAP_NODE, &set_metric_cmd);
  306.   install_element (RMAP_NODE, &no_set_metric_cmd);
  307. }