📄 bgp_routemap.c
字号:
{ 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 + -