⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rip_routemap.c

📁 大名鼎鼎的路由器源码。程序分ZEBRA、OSPFRIP等3个包。程序框架采用一个路由协议一个进程的方式
💻 C
📖 第 1 页 / 共 2 页
字号:
/* RIPv2 routemap. * Copyright (C) 1999 Kunihiro Ishiguro <kunihiro@zebra.org> * * This file is part of GNU Zebra. * * GNU Zebra is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2, or (at your option) any * later version. * * GNU Zebra is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GNU Zebra; see the file COPYING.  If not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA.   */#include <zebra.h>#include "memory.h"#include "prefix.h"#include "routemap.h"#include "command.h"#include "filter.h"#include "log.h"#include "sockunion.h"		/* for inet_aton () */#include "plist.h"#include "ripd/ripd.h"/* Add rip route map rule. */intrip_route_match_add (struct vty *vty, struct route_map_index *index,		     char *command, char *arg){  int ret;  ret = route_map_add_match (index, command, arg);  if (ret)    {      switch (ret)	{	case RMAP_RULE_MISSING:	  vty_out (vty, "%% Can't find rule.%s", VTY_NEWLINE);	  return CMD_WARNING;	  break;	case RMAP_COMPILE_ERROR:	  vty_out (vty, "%% Argument is malformed.%s", VTY_NEWLINE);	  return CMD_WARNING;	  break;	}    }  return CMD_SUCCESS;}/* Delete rip route map rule. */intrip_route_match_delete (struct vty *vty, struct route_map_index *index,			char *command, char *arg){  int ret;  ret = route_map_delete_match (index, command, arg);  if (ret)    {      switch (ret)	{	case RMAP_RULE_MISSING:	  vty_out (vty, "%% Can't find rule.%s", VTY_NEWLINE);	  return CMD_WARNING;	  break;	case RMAP_COMPILE_ERROR:	  vty_out (vty, "%% Argument is malformed.%s", VTY_NEWLINE);	  return CMD_WARNING;	  break;	}    }  return CMD_SUCCESS;}/* Add rip route map rule. */intrip_route_set_add (struct vty *vty, struct route_map_index *index,		   char *command, char *arg){  int ret;  ret = route_map_add_set (index, command, arg);  if (ret)    {      switch (ret)	{	case RMAP_RULE_MISSING:	  vty_out (vty, "%% Can't find rule.%s", VTY_NEWLINE);	  return CMD_WARNING;	  break;	case RMAP_COMPILE_ERROR:	  vty_out (vty, "%% Argument is malformed.%s", VTY_NEWLINE);	  return CMD_WARNING;	  break;	}    }  return CMD_SUCCESS;}/* Delete rip route map rule. */intrip_route_set_delete (struct vty *vty, struct route_map_index *index,		      char *command, char *arg){  int ret;  ret = route_map_delete_set (index, command, arg);  if (ret)    {      switch (ret)	{	case RMAP_RULE_MISSING:	  vty_out (vty, "%% Can't find rule.%s", VTY_NEWLINE);	  return CMD_WARNING;	  break;	case RMAP_COMPILE_ERROR:	  vty_out (vty, "%% Argument is malformed.%s", VTY_NEWLINE);	  return CMD_WARNING;	  break;	}    }  return CMD_SUCCESS;}/* Hook function for updating route_map assignment. */voidrip_route_map_update (){  int i;  if (rip)     {      for (i = 0; i < ZEBRA_ROUTE_MAX; i++) 	{	  if (rip->route_map[i].name)	    rip->route_map[i].map = 	      route_map_lookup_by_name (rip->route_map[i].name);	}    }}/* `match metric METRIC' *//* Match function return 1 if match is success else return zero. */route_map_result_troute_match_metric (void *rule, struct prefix *prefix, 		    route_map_object_t type, void *object){  u_int32_t *metric;  struct rip_info *rinfo;  if (type == RMAP_RIP)    {      metric = rule;      rinfo = object;          if (rinfo->metric == *metric)	return RMAP_MATCH;      else	return RMAP_NOMATCH;    }  return RMAP_NOMATCH;}/* Route map `match metric' match statement. `arg' is METRIC value */void *route_match_metric_compile (char *arg){  u_int32_t *metric;  metric = XMALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (u_int32_t));  *metric = atoi (arg);  if(*metric > 0)    return metric;  XFREE (MTYPE_ROUTE_MAP_COMPILED, metric);  return NULL;}/* Free route map's compiled `match metric' value. */voidroute_match_metric_free (void *rule){  XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);}/* Route map commands for metric matching. */struct route_map_rule_cmd route_match_metric_cmd ={  "metric",  route_match_metric,  route_match_metric_compile,  route_match_metric_free};/* `match interface IFNAME' *//* Match function return 1 if match is success else return zero. */route_map_result_troute_match_interface (void *rule, struct prefix *prefix,		       route_map_object_t type, void *object){  struct rip_info *rinfo;  struct interface *ifp;  char *ifname;  if (type == RMAP_RIP)    {      ifname = rule;      ifp = if_lookup_by_name(ifname);      if (!ifp)	return RMAP_NOMATCH;      rinfo = object;      if (rinfo->ifindex_out == ifp->ifindex)	return RMAP_MATCH;      else	return RMAP_NOMATCH;    }  return RMAP_NOMATCH;}/* Route map `match interface' match statement. `arg' is IFNAME value *//* XXX I don`t know if I need to check does interface exist? */void *route_match_interface_compile (char *arg){  return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg);}/* Free route map's compiled `match interface' value. */voidroute_match_interface_free (void *rule){  XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);}/* Route map commands for interface matching. */struct route_map_rule_cmd route_match_interface_cmd ={  "interface",  route_match_interface,  route_match_interface_compile,  route_match_interface_free};/* `match ip next-hop IP_ACCESS_LIST' *//* Match function return 1 if match is success else return zero. */route_map_result_troute_match_ip_next_hop (void *rule, struct prefix *prefix,			route_map_object_t type, void *object){  struct access_list *alist;  struct rip_info *rinfo;  struct prefix_ipv4 p;  if (type == RMAP_RIP)    {      rinfo = object;      p.family = AF_INET;      p.prefix = rinfo->nexthop;      p.prefixlen = IPV4_MAX_BITLEN;      alist = access_list_lookup (AFI_IP, (char *) rule);      if (alist == NULL)	return RMAP_NOMATCH;      return (access_list_apply (alist, &p) == FILTER_DENY ?	      RMAP_NOMATCH : RMAP_MATCH);    }  return RMAP_NOMATCH;}/* Route map `ip next-hop' match statement.  `arg' should be   access-list name. */void *route_match_ip_next_hop_compile (char *arg){  return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg);}/* Free route map's compiled `. */voidroute_match_ip_next_hop_free (void *rule){  XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);}/* Route map commands for ip next-hop matching. */struct route_map_rule_cmd route_match_ip_next_hop_cmd ={  "ip next-hop",  route_match_ip_next_hop,  route_match_ip_next_hop_compile,  route_match_ip_next_hop_free};/* `match ip next-hop prefix-list PREFIX_LIST' */route_map_result_troute_match_ip_next_hop_prefix_list (void *rule, struct prefix *prefix,                                    route_map_object_t type, void *object){  struct prefix_list *plist;  struct rip_info *rinfo;  struct prefix_ipv4 p;  if (type == RMAP_RIP)    {      rinfo = object;      p.family = AF_INET;      p.prefix = rinfo->nexthop;      p.prefixlen = IPV4_MAX_BITLEN;      plist = prefix_list_lookup (AFI_IP, (char *) rule);      if (plist == NULL)        return RMAP_NOMATCH;      return (prefix_list_apply (plist, &p) == PREFIX_DENY ?              RMAP_NOMATCH : RMAP_MATCH);    }  return RMAP_NOMATCH;}void *route_match_ip_next_hop_prefix_list_compile (char *arg){  return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg);}voidroute_match_ip_next_hop_prefix_list_free (void *rule){  XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);}struct route_map_rule_cmd route_match_ip_next_hop_prefix_list_cmd ={  "ip next-hop prefix-list",  route_match_ip_next_hop_prefix_list,  route_match_ip_next_hop_prefix_list_compile,  route_match_ip_next_hop_prefix_list_free};/* `match ip address IP_ACCESS_LIST' *//* Match function should return 1 if match is success else return   zero. */route_map_result_troute_match_ip_address (void *rule, struct prefix *prefix, 			route_map_object_t type, void *object){  struct access_list *alist;  if (type == RMAP_RIP)    {      alist = access_list_lookup (AFI_IP, (char *) rule);      if (alist == NULL)	return RMAP_NOMATCH;          return (access_list_apply (alist, prefix) == FILTER_DENY ?	      RMAP_NOMATCH : RMAP_MATCH);    }  return RMAP_NOMATCH;}/* Route map `ip address' match statement.  `arg' should be   access-list name. */void *route_match_ip_address_compile (char *arg){  return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg);}/* Free route map's compiled `ip address' value. */voidroute_match_ip_address_free (void *rule){  XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);}/* Route map commands for ip address matching. */struct route_map_rule_cmd route_match_ip_address_cmd ={  "ip address",  route_match_ip_address,  route_match_ip_address_compile,  route_match_ip_address_free};/* `match ip address prefix-list PREFIX_LIST' */route_map_result_troute_match_ip_address_prefix_list (void *rule, struct prefix *prefix, 				    route_map_object_t type, void *object){  struct prefix_list *plist;  if (type == RMAP_RIP)    {      plist = prefix_list_lookup (AFI_IP, (char *) rule);      if (plist == NULL)	return RMAP_NOMATCH;          return (prefix_list_apply (plist, prefix) == PREFIX_DENY ?	      RMAP_NOMATCH : RMAP_MATCH);    }  return RMAP_NOMATCH;}void *route_match_ip_address_prefix_list_compile (char *arg){  return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg);}voidroute_match_ip_address_prefix_list_free (void *rule){  XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);}struct route_map_rule_cmd route_match_ip_address_prefix_list_cmd ={  "ip address prefix-list",  route_match_ip_address_prefix_list,  route_match_ip_address_prefix_list_compile,  route_match_ip_address_prefix_list_free};/* `set metric METRIC' *//* Set metric to attribute. */route_map_result_troute_set_metric (void *rule, struct prefix *prefix, 		  route_map_object_t type, void *object){  u_int32_t *metric;  struct rip_info *rinfo;  if (type == RMAP_RIP)    {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -