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

📄 bgp_routemap.c

📁 大名鼎鼎的路由器源码。程序分ZEBRA、OSPFRIP等3个包。程序框架采用一个路由协议一个进程的方式
💻 C
📖 第 1 页 / 共 5 页
字号:
{  struct community_list *list;  struct community *merge;  struct community *new;  struct community *old;  struct bgp_info *binfo;  if (type == RMAP_BGP)    {      if (! rule)	return RMAP_OKAY;      binfo = object;      list = community_list_lookup (bgp_clist, rule, COMMUNITY_LIST_AUTO);      old = binfo->attr->community;      if (list && old)	{	  merge = community_list_match_delete (old, list);	  new = community_uniq_sort (merge);	  community_free (merge);	  if (new->size == 0)	    {	      binfo->attr->community = NULL;	      binfo->attr->flag &= ~ATTR_FLAG_BIT (BGP_ATTR_COMMUNITIES);	      community_free (new);	    }	  else	    {	      binfo->attr->community = new;	      binfo->attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_COMMUNITIES);	    }	}    }  return RMAP_OKAY;}/* Compile function for set community. */void *route_set_community_delete_compile (char *arg){  char *p;  char *str;  int len;  p = strchr (arg, ' ');  if (p)    {      len = p - arg;      str = XCALLOC (MTYPE_ROUTE_MAP_COMPILED, len + 1);      memcpy (str, arg, len);    }  else    str = NULL;  return str;}/* Free function for set community. */voidroute_set_community_delete_free (void *rule){  XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);}/* Set community rule structure. */struct route_map_rule_cmd route_set_community_delete_cmd ={  "comm-list",  route_set_community_delete,  route_set_community_delete_compile,  route_set_community_delete_free,};/* `set extcommunity rt COMMUNITY' *//* For community set mechanism. */route_map_result_troute_set_ecommunity_rt (void *rule, struct prefix *prefix, 			 route_map_object_t type, void *object){  struct ecommunity *ecom;  struct ecommunity *new_ecom;  struct ecommunity *old_ecom;  struct bgp_info *bgp_info;  if (type == RMAP_BGP)    {      ecom = rule;      bgp_info = object;          if (! ecom)	return RMAP_OKAY;          /* We assume additive for Extended Community. */      old_ecom = bgp_info->attr->ecommunity;      if (old_ecom)	new_ecom = ecommunity_merge (ecommunity_dup (old_ecom), ecom);      else	new_ecom = ecommunity_dup (ecom);      bgp_info->attr->ecommunity = new_ecom;      bgp_info->attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_EXT_COMMUNITIES);    }  return RMAP_OKAY;}/* Compile function for set community. */void *route_set_ecommunity_rt_compile (char *arg){  struct ecommunity *ecom;  ecom = ecommunity_str2com (arg, ECOMMUNITY_ROUTE_TARGET, 0);  if (! ecom)    return NULL;  return ecom;}/* Free function for set community. */voidroute_set_ecommunity_rt_free (void *rule){  struct ecommunity *ecom = rule;  ecommunity_free (ecom);}/* Set community rule structure. */struct route_map_rule_cmd route_set_ecommunity_rt_cmd = {  "extcommunity rt",  route_set_ecommunity_rt,  route_set_ecommunity_rt_compile,  route_set_ecommunity_rt_free,};/* `set extcommunity soo COMMUNITY' *//* For community set mechanism. */route_map_result_troute_set_ecommunity_soo (void *rule, struct prefix *prefix, 			 route_map_object_t type, void *object){  struct ecommunity *ecom;  struct bgp_info *bgp_info;  if (type == RMAP_BGP)    {      ecom = rule;      bgp_info = object;          if (! ecom)	return RMAP_OKAY;          bgp_info->attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_EXT_COMMUNITIES);      bgp_info->attr->ecommunity = ecommunity_dup (ecom);    }  return RMAP_OKAY;}/* Compile function for set community. */void *route_set_ecommunity_soo_compile (char *arg){  struct ecommunity *ecom;  ecom = ecommunity_str2com (arg, ECOMMUNITY_SITE_ORIGIN, 0);  if (! ecom)    return NULL;    return ecom;}/* Free function for set community. */voidroute_set_ecommunity_soo_free (void *rule){  struct ecommunity *ecom = rule;  ecommunity_free (ecom);}/* Set community rule structure. */struct route_map_rule_cmd route_set_ecommunity_soo_cmd = {  "extcommunity soo",  route_set_ecommunity_soo,  route_set_ecommunity_soo_compile,  route_set_ecommunity_soo_free,};/* `set origin ORIGIN' *//* For origin set. */route_map_result_troute_set_origin (void *rule, struct prefix *prefix, route_map_object_t type, void *object){  u_char *origin;  struct bgp_info *bgp_info;  if (type == RMAP_BGP)    {      origin = rule;      bgp_info = object;          bgp_info->attr->origin = *origin;    }  return RMAP_OKAY;}/* Compile function for origin set. */void *route_set_origin_compile (char *arg){  u_char *origin;  origin = XMALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (u_char));  if (strcmp (arg, "igp") == 0)    *origin = 0;  else if (strcmp (arg, "egp") == 0)    *origin = 1;  else    *origin = 2;  return origin;}/* Compile function for origin set. */voidroute_set_origin_free (void *rule){  XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);}/* Set metric rule structure. */struct route_map_rule_cmd route_set_origin_cmd = {  "origin",  route_set_origin,  route_set_origin_compile,  route_set_origin_free,};/* `set atomic-aggregate' *//* For atomic aggregate set. */route_map_result_troute_set_atomic_aggregate (void *rule, struct prefix *prefix,			    route_map_object_t type, void *object){  struct bgp_info *bgp_info;  if (type == RMAP_BGP)    {      bgp_info = object;      bgp_info->attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_ATOMIC_AGGREGATE);    }  return RMAP_OKAY;}/* Compile function for atomic aggregate. */void *route_set_atomic_aggregate_compile (char *arg){  return (void *)1;}/* Compile function for atomic aggregate. */voidroute_set_atomic_aggregate_free (void *rule){  return;}/* Set atomic aggregate rule structure. */struct route_map_rule_cmd route_set_atomic_aggregate_cmd = {  "atomic-aggregate",  route_set_atomic_aggregate,  route_set_atomic_aggregate_compile,  route_set_atomic_aggregate_free,};/* `set aggregator as AS A.B.C.D' */struct aggregator{  as_t as;  struct in_addr address;};route_map_result_troute_set_aggregator_as (void *rule, struct prefix *prefix, 			 route_map_object_t type, void *object){  struct bgp_info *bgp_info;  struct aggregator *aggregator;  if (type == RMAP_BGP)    {      bgp_info = object;      aggregator = rule;          bgp_info->attr->aggregator_as = aggregator->as;      bgp_info->attr->aggregator_addr = aggregator->address;      bgp_info->attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_AGGREGATOR);    }  return RMAP_OKAY;}void *route_set_aggregator_as_compile (char *arg){  struct aggregator *aggregator;  char as[10];  char address[20];  aggregator = XMALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (struct aggregator));  memset (aggregator, 0, sizeof (struct aggregator));  sscanf (arg, "%s %s", as, address);  aggregator->as = strtoul (as, NULL, 10);  inet_aton (address, &aggregator->address);  return aggregator;}voidroute_set_aggregator_as_free (void *rule){  XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);}struct route_map_rule_cmd route_set_aggregator_as_cmd = {  "aggregator as",  route_set_aggregator_as,  route_set_aggregator_as_compile,  route_set_aggregator_as_free,};#ifdef HAVE_IPV6/* `match ipv6 address IP_ACCESS_LIST' */route_map_result_troute_match_ipv6_address (void *rule, struct prefix *prefix, 			  route_map_object_t type, void *object){  struct access_list *alist;  if (type == RMAP_BGP)    {      alist = access_list_lookup (AFI_IP6, (char *) rule);      if (alist == NULL)	return RMAP_NOMATCH;          return (access_list_apply (alist, prefix) == FILTER_DENY ?	      RMAP_NOMATCH : RMAP_MATCH);    }  return RMAP_NOMATCH;}void *route_match_ipv6_address_compile (char *arg){  return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg);}voidroute_match_ipv6_address_free (void *rule){  XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);}/* Route map commands for ip address matching. */struct route_map_rule_cmd route_match_ipv6_address_cmd ={  "ipv6 address",  route_match_ipv6_address,  route_match_ipv6_address_compile,  route_match_ipv6_address_free};/* `match ipv6 next-hop IP_ADDRESS' */route_map_result_troute_match_ipv6_next_hop (void *rule, struct prefix *prefix, 			   route_map_object_t type, void *object){  struct in6_addr *addr;  struct bgp_info *bgp_info;  if (type == RMAP_BGP)    {      addr = rule;      bgp_info = object;          if (IPV6_ADDR_SAME (&bgp_info->attr->mp_nexthop_global, rule))	return RMAP_MATCH;      if (bgp_info->attr->mp_nexthop_len == 32 &&	  IPV6_ADDR_SAME (&bgp_info->attr->mp_nexthop_local, rule))	return RMAP_MATCH;      return RMAP_NOMATCH;    }  return RMAP_NOMATCH;}void *route_match_ipv6_next_hop_compile (char *arg){  struct in6_addr *address;  int ret;  address = XMALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (struct in6_addr));  ret = inet_pton (AF_INET6, arg, address);  if (!ret)    {      XFREE (MTYPE_ROUTE_MAP_COMPILED, address);      return NULL;    }  return address;}voidroute_match_ipv6_next_hop_free (void *rule){  XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);}struct route_map_rule_cmd route_match_ipv6_next_hop_cmd ={  "ipv6 next-hop",  route_match_ipv6_next_hop,  route_match_ipv6_next_hop_compile,  route_match_ipv6_next_hop_free};/* `match ipv6 address prefix-list PREFIX_LIST' */route_map_result_troute_match_ipv6_address_prefix_list (void *rule, struct prefix *prefix, 			      route_map_object_t type, void *object){  struct prefix_list *plist;  if (type == RMAP_BGP)    {      plist = prefix_list_lookup (AFI_IP6, (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_ipv6_address_prefix_list_compile (char *arg){  return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg);}voidroute_match_ipv6_address_prefix_list_free (void *rule){  XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);}struct route_map_rule_cmd route_match_ipv6_address_prefix_list_cmd ={  "ipv6 address prefix-list",  route_match_ipv6_address_prefix_list,  route_match_ipv6_address_prefix_list_compile,  route_match_ipv6_address_prefix_list_free};/* `set ipv6 nexthop global IP_ADDRESS' *//* Set nexthop to object.  ojbect must be pointer to struct attr. */route_map_result_troute_set_ipv6_nexthop_global (void *rule, struct prefix *prefix, 			       route_map_object_t type, void *object){  struct in6_addr *address;  struct bgp_info *bgp_info;  if (type == RMAP_BGP)    {      /* Fetch routemap's rule information. */      address = rule;      bgp_info = object;          /* Set next hop value. */       bgp_info->attr->mp_nexthop_global = *address;          /* Set nexthop length. */      if (bgp_info->attr->mp_nexthop_len == 0)	bgp_info->attr->mp_nexthop_len = 16;    }  return RMAP_OKAY;}/* Route map `ip next-hop' compile function.  Given string is converted   to struct in_addr structure. */void *route_set_ipv6_nexthop_global_compile (char *arg){  int ret;  struct in6_addr *address;  address = XMALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (struct in6_addr));  ret = inet_pton (AF_INET6, arg, address);  if (ret == 0)    {      XFREE (MTYPE_ROUTE_MAP_COMPILED, address);      return NULL;    }  return address;}/* Free route map's compiled `ip next-hop' value. */voidroute_set_ipv6_nexthop_global_free (void *rule){  XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);}/* Route map commands for ip nexthop set. */struct route_map_rule_cmd route_set_ipv6_nexthop_global_cmd ={  "ipv6 next-hop global",  route_set_ipv6_nexthop_global,  route_set_ipv6_nexthop_global_compile,  route_set_ipv6_nexthop_global_free};/* `set ipv6 nexthop local IP_ADDRESS' *//* Set nexthop to object.  ojbect must be pointer to struct attr. */route_map_result_troute_set_ipv6_nexthop_local (void *rule, struct prefix *prefix, 			      route_map_object_t type, void *object){

⌨️ 快捷键说明

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