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

网络

开发平台:

Unix_Linux

  1. /* route-map for interface.
  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 "hash.h"
  23. #include "command.h"
  24. #include "memory.h"
  25. #include "if.h"
  26. #include "ripng_ifrmap.h"
  27. struct hash *ifrmaphash;
  28. /* Hook functions. */
  29. void (*if_rmap_add_hook) (struct if_rmap *) = NULL;
  30. void (*if_rmap_delete_hook) (struct if_rmap *) = NULL;
  31. struct if_rmap *
  32. if_rmap_new ()
  33. {
  34.   struct if_rmap *new;
  35.   new = XCALLOC (MTYPE_IF_RMAP, sizeof (struct if_rmap));
  36.   return new;
  37. }
  38. void
  39. if_rmap_free (struct if_rmap *if_rmap)
  40. {
  41.   if (if_rmap->ifname)
  42.     free (if_rmap->ifname);
  43.   if (if_rmap->routemap[IF_RMAP_IN])
  44.     free (if_rmap->routemap[IF_RMAP_IN]);
  45.   if (if_rmap->routemap[IF_RMAP_OUT])
  46.     free (if_rmap->routemap[IF_RMAP_OUT]);
  47.   XFREE (MTYPE_IF_RMAP, if_rmap);
  48. }
  49. struct if_rmap *
  50. if_rmap_lookup (char *ifname)
  51. {
  52.   struct if_rmap key;
  53.   struct if_rmap *if_rmap;
  54.   key.ifname = ifname;
  55.   if_rmap = hash_lookup (ifrmaphash, &key);
  56.   
  57.   return if_rmap;
  58. }
  59. void
  60. if_rmap_hook_add (void (*func) (struct if_rmap *))
  61. {
  62.   if_rmap_add_hook = func;
  63. }
  64. void
  65. if_rmap_hook_delete (void (*func) (struct if_rmap *))
  66. {
  67.   if_rmap_delete_hook = func;
  68. }
  69. void *
  70. if_rmap_hash_alloc (struct if_rmap *arg)
  71. {
  72.   struct if_rmap *if_rmap;
  73.   if_rmap = if_rmap_new ();
  74.   if_rmap->ifname = strdup (arg->ifname);
  75.   return if_rmap;
  76. }
  77. struct if_rmap *
  78. if_rmap_get (char *ifname)
  79. {
  80.   struct if_rmap key;
  81.   key.ifname = ifname;
  82.   return (struct if_rmap *) hash_get (ifrmaphash, &key, if_rmap_hash_alloc);
  83. }
  84. unsigned int
  85. if_rmap_hash_make (struct if_rmap *if_rmap)
  86. {
  87.   unsigned int key;
  88.   int i;
  89.   key = 0;
  90.   for (i = 0; i < strlen (if_rmap->ifname); i++)
  91.     key += if_rmap->ifname[i];
  92.   return key;
  93. }
  94. int
  95. if_rmap_hash_cmp (struct if_rmap *if_rmap1, struct if_rmap *if_rmap2)
  96. {
  97.   if (strcmp (if_rmap1->ifname, if_rmap2->ifname) == 0)
  98.     return 1;
  99.   return 0;
  100. }
  101. struct if_rmap *
  102. if_rmap_set (char *ifname, enum if_rmap_type type, char *routemap_name)
  103. {
  104.   struct if_rmap *if_rmap;
  105.   if_rmap = if_rmap_get (ifname);
  106.   if (type == IF_RMAP_IN)
  107.     {
  108.       if (if_rmap->routemap[IF_RMAP_IN])
  109. free (if_rmap->routemap[IF_RMAP_IN]);
  110.       if_rmap->routemap[IF_RMAP_IN] = strdup (routemap_name);
  111.     }
  112.   if (type == IF_RMAP_OUT)
  113.     {
  114.       if (if_rmap->routemap[IF_RMAP_OUT])
  115. free (if_rmap->routemap[IF_RMAP_OUT]);
  116.       if_rmap->routemap[IF_RMAP_OUT] = strdup (routemap_name);
  117.     }
  118.   if (if_rmap_add_hook)
  119.     (*if_rmap_add_hook) (if_rmap);
  120.   
  121.   return if_rmap;
  122. }
  123. int
  124. if_rmap_unset (char *ifname, enum if_rmap_type type, char *routemap_name)
  125. {
  126.   struct if_rmap *if_rmap;
  127.   if_rmap = if_rmap_lookup (ifname);
  128.   if (!if_rmap)
  129.     return 0;
  130.   if (type == IF_RMAP_IN)
  131.     {
  132.       if (!if_rmap->routemap[IF_RMAP_IN])
  133. return 0;
  134.       if (strcmp (if_rmap->routemap[IF_RMAP_IN], routemap_name) != 0)
  135. return 0;
  136.       free (if_rmap->routemap[IF_RMAP_IN]);
  137.       if_rmap->routemap[IF_RMAP_IN] = NULL;      
  138.     }
  139.   if (type == IF_RMAP_OUT)
  140.     {
  141.       if (!if_rmap->routemap[IF_RMAP_OUT])
  142. return 0;
  143.       if (strcmp (if_rmap->routemap[IF_RMAP_OUT], routemap_name) != 0)
  144. return 0;
  145.       free (if_rmap->routemap[IF_RMAP_OUT]);
  146.       if_rmap->routemap[IF_RMAP_OUT] = NULL;      
  147.     }
  148.   if (if_rmap_delete_hook)
  149.     (*if_rmap_delete_hook) (if_rmap);
  150.   if (if_rmap->routemap[IF_RMAP_IN] == NULL &&
  151.       if_rmap->routemap[IF_RMAP_OUT] == NULL)
  152.     {
  153.       hash_release (ifrmaphash, if_rmap);
  154.       if_rmap_free (if_rmap);
  155.     }
  156.   return 1;
  157. }
  158. DEFUN (ripng_if_rmap,
  159.        ripng_if_rmap_cmd,
  160.        "route-map RMAP_NAME (in|out) IFNAME",
  161.        "Route map setn"
  162.        "Route map namen"
  163.        "Route map set for input filteringn"
  164.        "Route map set for output filteringn"
  165.        "Route map interface namen")
  166. {
  167.   enum if_rmap_type type;
  168.   struct if_rmap *if_rmap;
  169.   if (strncmp (argv[1], "i", 1) == 0)
  170.     type = IF_RMAP_IN;
  171.   else if (strncmp (argv[1], "o", 1) == 0)
  172.     type = IF_RMAP_OUT;
  173.   else
  174.     {
  175.       vty_out (vty, "route-map direction must be [in|out]%s", VTY_NEWLINE);
  176.       return CMD_WARNING;
  177.     }
  178.   if_rmap = if_rmap_set (argv[2], type, argv[0]);
  179.   return CMD_SUCCESS;
  180. }       
  181. DEFUN (no_ripng_if_rmap,
  182.        no_ripng_if_rmap_cmd,
  183.        "no route-map ROUTEMAP_NAME (in|out) IFNAME",
  184.        NO_STR
  185.        "Route map unsetn"
  186.        "Route map namen"
  187.        "Route map for input filteringn"
  188.        "Route map for output filteringn"
  189.        "Route map interface namen")
  190. {
  191.   int ret;
  192.   enum if_rmap_type type;
  193.   if (strncmp (argv[1], "i", 1) == 0)
  194.     type = IF_RMAP_IN;
  195.   else if (strncmp (argv[1], "o", 1) == 0)
  196.     type = IF_RMAP_OUT;
  197.   else
  198.     {
  199.       vty_out (vty, "route-map direction must be [in|out]%s", VTY_NEWLINE);
  200.       return CMD_WARNING;
  201.     }
  202.   ret = if_rmap_unset (argv[2], type, argv[0]);
  203.   if (! ret)
  204.     {
  205.       vty_out (vty, "route-map doesn't exist%s", VTY_NEWLINE);
  206.       return CMD_WARNING;
  207.     }
  208.   return CMD_SUCCESS;
  209. }       
  210. /* Configuration write function. */
  211. int
  212. config_write_if_rmap (struct vty *vty)
  213. {
  214.   int i;
  215.   struct hash_backet *mp;
  216.   int write = 0;
  217.   for (i = 0; i < ifrmaphash->size; i++)
  218.     for (mp = ifrmaphash->index[i]; mp; mp = mp->next)
  219.       {
  220. struct if_rmap *if_rmap;
  221. if_rmap = mp->data;
  222. if (if_rmap->routemap[IF_RMAP_IN])
  223.   {
  224.     vty_out (vty, " route-map %s in %s%s", 
  225.      if_rmap->routemap[IF_RMAP_IN],
  226.      if_rmap->ifname,
  227.      VTY_NEWLINE);
  228.     write++;
  229.   }
  230. if (if_rmap->routemap[IF_RMAP_OUT])
  231.   {
  232.     vty_out (vty, " route-map %s out %s%s", 
  233.      if_rmap->routemap[IF_RMAP_OUT],
  234.      if_rmap->ifname,
  235.      VTY_NEWLINE);
  236.     write++;
  237.   }
  238.       }
  239.   return write;
  240. }
  241. void
  242. if_rmap_reset ()
  243. {
  244.   hash_clean (ifrmaphash, (void (*) (void *)) if_rmap_free);
  245. }
  246. void
  247. if_rmap_init (void)
  248. {
  249.   ifrmaphash = hash_create (if_rmap_hash_make, if_rmap_hash_cmp);
  250.   install_element (RIPNG_NODE, &ripng_if_rmap_cmd);
  251.   install_element (RIPNG_NODE, &no_ripng_if_rmap_cmd);
  252. }