mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-05-29 06:29:40 +00:00
bgpd: implement 'match probability' in route-maps
New clause 'match probability <percentage value>' was added in route-maps (bgpd/bgp_routemap.c modified).
This commit is contained in:
parent
9a9446eabb
commit
1add115a9c
@ -790,6 +790,75 @@ struct route_map_rule_cmd route_match_origin_cmd =
|
|||||||
route_match_origin_compile,
|
route_match_origin_compile,
|
||||||
route_match_origin_free
|
route_match_origin_free
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* match probability { */
|
||||||
|
|
||||||
|
static route_map_result_t
|
||||||
|
route_match_probability (void *rule, struct prefix *prefix,
|
||||||
|
route_map_object_t type, void *object)
|
||||||
|
{
|
||||||
|
long r;
|
||||||
|
#if _SVID_SOURCE || _BSD_SOURCE || _XOPEN_SOURCE >= 500
|
||||||
|
r = random();
|
||||||
|
#else
|
||||||
|
r = (long) rand();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
switch (*(unsigned *) rule)
|
||||||
|
{
|
||||||
|
case 0: break;
|
||||||
|
case RAND_MAX: return RMAP_MATCH;
|
||||||
|
default:
|
||||||
|
if (r < *(unsigned *) rule)
|
||||||
|
{
|
||||||
|
return RMAP_MATCH;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return RMAP_NOMATCH;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void *
|
||||||
|
route_match_probability_compile (const char *arg)
|
||||||
|
{
|
||||||
|
unsigned *lobule;
|
||||||
|
unsigned perc;
|
||||||
|
|
||||||
|
#if _SVID_SOURCE || _BSD_SOURCE || _XOPEN_SOURCE >= 500
|
||||||
|
srandom (time (NULL));
|
||||||
|
#else
|
||||||
|
srand (time (NULL));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
perc = atoi (arg);
|
||||||
|
lobule = XMALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (unsigned));
|
||||||
|
|
||||||
|
switch (perc)
|
||||||
|
{
|
||||||
|
case 0: *lobule = 0; break;
|
||||||
|
case 100: *lobule = RAND_MAX; break;
|
||||||
|
default: *lobule = RAND_MAX / 100 * perc;
|
||||||
|
}
|
||||||
|
|
||||||
|
return lobule;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
route_match_probability_free (void *rule)
|
||||||
|
{
|
||||||
|
XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct route_map_rule_cmd route_match_probability_cmd =
|
||||||
|
{
|
||||||
|
"probability",
|
||||||
|
route_match_probability,
|
||||||
|
route_match_probability_compile,
|
||||||
|
route_match_probability_free
|
||||||
|
};
|
||||||
|
|
||||||
|
/* } */
|
||||||
|
|
||||||
/* `set ip next-hop IP_ADDRESS' */
|
/* `set ip next-hop IP_ADDRESS' */
|
||||||
|
|
||||||
/* Set nexthop to object. ojbect must be pointer to struct attr. */
|
/* Set nexthop to object. ojbect must be pointer to struct attr. */
|
||||||
@ -2462,6 +2531,38 @@ ALIAS (no_match_ip_next_hop,
|
|||||||
"IP access-list number (expanded range)\n"
|
"IP access-list number (expanded range)\n"
|
||||||
"IP Access-list name\n")
|
"IP Access-list name\n")
|
||||||
|
|
||||||
|
/* match probability { */
|
||||||
|
|
||||||
|
DEFUN (match_probability,
|
||||||
|
match_probability_cmd,
|
||||||
|
"match probability <0-100>",
|
||||||
|
MATCH_STR
|
||||||
|
"Match portion of routes defined by percentage value\n"
|
||||||
|
"Percentage of routes\n")
|
||||||
|
{
|
||||||
|
return bgp_route_match_add (vty, vty->index, "probability", argv[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
DEFUN (no_match_probability,
|
||||||
|
no_match_probability_cmd,
|
||||||
|
"no match probability",
|
||||||
|
NO_STR
|
||||||
|
MATCH_STR
|
||||||
|
"Match portion of routes defined by percentage value\n")
|
||||||
|
{
|
||||||
|
return bgp_route_match_delete (vty, vty->index, "probability", argc ? argv[0] : NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
ALIAS (no_match_probability,
|
||||||
|
no_match_probability_val_cmd,
|
||||||
|
"no match probability <1-99>",
|
||||||
|
NO_STR
|
||||||
|
MATCH_STR
|
||||||
|
"Match portion of routes defined by percentage value\n"
|
||||||
|
"Percentage of routes\n")
|
||||||
|
|
||||||
|
/* } */
|
||||||
|
|
||||||
DEFUN (match_ip_route_source,
|
DEFUN (match_ip_route_source,
|
||||||
match_ip_route_source_cmd,
|
match_ip_route_source_cmd,
|
||||||
"match ip route-source (<1-199>|<1300-2699>|WORD)",
|
"match ip route-source (<1-199>|<1300-2699>|WORD)",
|
||||||
@ -3749,6 +3850,7 @@ bgp_route_map_init (void)
|
|||||||
route_map_install_match (&route_match_ecommunity_cmd);
|
route_map_install_match (&route_match_ecommunity_cmd);
|
||||||
route_map_install_match (&route_match_metric_cmd);
|
route_map_install_match (&route_match_metric_cmd);
|
||||||
route_map_install_match (&route_match_origin_cmd);
|
route_map_install_match (&route_match_origin_cmd);
|
||||||
|
route_map_install_match (&route_match_probability_cmd);
|
||||||
|
|
||||||
route_map_install_set (&route_set_ip_nexthop_cmd);
|
route_map_install_set (&route_set_ip_nexthop_cmd);
|
||||||
route_map_install_set (&route_set_local_pref_cmd);
|
route_map_install_set (&route_set_local_pref_cmd);
|
||||||
@ -3780,7 +3882,6 @@ bgp_route_map_init (void)
|
|||||||
install_element (RMAP_NODE, &match_ip_route_source_cmd);
|
install_element (RMAP_NODE, &match_ip_route_source_cmd);
|
||||||
install_element (RMAP_NODE, &no_match_ip_route_source_cmd);
|
install_element (RMAP_NODE, &no_match_ip_route_source_cmd);
|
||||||
install_element (RMAP_NODE, &no_match_ip_route_source_val_cmd);
|
install_element (RMAP_NODE, &no_match_ip_route_source_val_cmd);
|
||||||
|
|
||||||
install_element (RMAP_NODE, &match_ip_address_prefix_list_cmd);
|
install_element (RMAP_NODE, &match_ip_address_prefix_list_cmd);
|
||||||
install_element (RMAP_NODE, &no_match_ip_address_prefix_list_cmd);
|
install_element (RMAP_NODE, &no_match_ip_address_prefix_list_cmd);
|
||||||
install_element (RMAP_NODE, &no_match_ip_address_prefix_list_val_cmd);
|
install_element (RMAP_NODE, &no_match_ip_address_prefix_list_val_cmd);
|
||||||
@ -3808,6 +3909,9 @@ bgp_route_map_init (void)
|
|||||||
install_element (RMAP_NODE, &match_origin_cmd);
|
install_element (RMAP_NODE, &match_origin_cmd);
|
||||||
install_element (RMAP_NODE, &no_match_origin_cmd);
|
install_element (RMAP_NODE, &no_match_origin_cmd);
|
||||||
install_element (RMAP_NODE, &no_match_origin_val_cmd);
|
install_element (RMAP_NODE, &no_match_origin_val_cmd);
|
||||||
|
install_element (RMAP_NODE, &match_probability_cmd);
|
||||||
|
install_element (RMAP_NODE, &no_match_probability_cmd);
|
||||||
|
install_element (RMAP_NODE, &no_match_probability_val_cmd);
|
||||||
|
|
||||||
install_element (RMAP_NODE, &set_ip_nexthop_cmd);
|
install_element (RMAP_NODE, &set_ip_nexthop_cmd);
|
||||||
install_element (RMAP_NODE, &set_ip_nexthop_peer_cmd);
|
install_element (RMAP_NODE, &set_ip_nexthop_peer_cmd);
|
||||||
|
Loading…
Reference in New Issue
Block a user