bgpd: ability to export prefixes entries to a kernel table identifier

this table identifier can be used for policy routing. incoming entries
are locally exported to that local table identifier.
note that so that the user applies the new table identifier to all
entries, the user should flush local tables first.

Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
This commit is contained in:
Philippe Guibert 2019-04-29 15:26:01 +02:00
parent d09e0a81b4
commit 951745bdab
5 changed files with 71 additions and 0 deletions

View File

@ -520,6 +520,7 @@ unsigned int attrhash_key_make(const void *p)
key = jhash(attr->mp_nexthop_global.s6_addr, IPV6_MAX_BYTELEN, key);
key = jhash(attr->mp_nexthop_local.s6_addr, IPV6_MAX_BYTELEN, key);
MIX3(attr->nh_ifindex, attr->nh_lla_ifindex, attr->distance);
MIX(attr->rmap_table_id);
return key;
}
@ -546,6 +547,7 @@ bool attrhash_cmp(const void *p1, const void *p2)
&& attr1->lcommunity == attr2->lcommunity
&& attr1->cluster == attr2->cluster
&& attr1->transit == attr2->transit
&& attr1->rmap_table_id == attr2->rmap_table_id
&& (attr1->encap_tunneltype == attr2->encap_tunneltype)
&& encap_same(attr1->encap_subtlvs, attr2->encap_subtlvs)
#if ENABLE_BGP_VNC

View File

@ -209,6 +209,9 @@ struct attr {
/* Distance as applied by Route map */
uint8_t distance;
/* rmap set table */
uint32_t rmap_table_id;
};
/* rmap_change_flags definition */

View File

@ -114,6 +114,7 @@ o Cisco route-map
origin : Done
tag : Done
weight : Done
table : Done
o Local extensions
@ -1754,6 +1755,32 @@ struct route_map_rule_cmd route_set_metric_cmd = {
"metric", route_set_metric, route_value_compile, route_value_free,
};
/* `set table (1-4294967295)' */
static enum route_map_cmd_result_t route_set_table_id(void *rule,
const struct prefix *prefix,
route_map_object_t type,
void *object)
{
struct rmap_value *rv;
struct bgp_path_info *path;
if (type == RMAP_BGP) {
/* Fetch routemap's rule information. */
rv = rule;
path = object;
path->attr->rmap_table_id = rv->value;
}
return RMAP_OKAY;
}
/* Set table_id rule structure. */
static struct route_map_rule_cmd route_set_table_id_cmd = {
"table", route_set_table_id,
route_value_compile, route_value_free
};
/* `set as-path prepend ASPATH' */
/* For AS path prepend mechanism. */
@ -4058,6 +4085,32 @@ DEFUN (no_match_origin,
RMAP_EVENT_MATCH_DELETED);
}
DEFUN (set_table_id,
set_table_id_cmd,
"set table (1-4294967295)",
SET_STR
"export route to non-main kernel table\n"
"Kernel routing table id\n")
{
int idx_id = 2;
VTY_DECLVAR_CONTEXT(route_map_index, index);
return generic_set_add(vty, index, "table", argv[idx_id]->arg);
}
DEFUN (no_set_table_id,
no_set_table_id_cmd,
"no set table",
NO_STR
SET_STR
"export route to non-main kernel table\n")
{
VTY_DECLVAR_CONTEXT(route_map_index, index);
return generic_set_delete(vty, index, "table", NULL);
}
DEFUN (set_ip_nexthop_peer,
set_ip_nexthop_peer_cmd,
"[no] set ip next-hop peer-address",
@ -5167,6 +5220,7 @@ void bgp_route_map_init(void)
route_map_install_match(&route_match_evpn_default_route_cmd);
route_map_install_match(&route_match_vrl_source_vrf_cmd);
route_map_install_set(&route_set_table_id_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_weight_cmd);
@ -5223,6 +5277,8 @@ void bgp_route_map_init(void)
install_element(RMAP_NODE, &match_probability_cmd);
install_element(RMAP_NODE, &no_match_probability_cmd);
install_element(RMAP_NODE, &no_set_table_id_cmd);
install_element(RMAP_NODE, &set_table_id_cmd);
install_element(RMAP_NODE, &set_ip_nexthop_peer_cmd);
install_element(RMAP_NODE, &set_ip_nexthop_unchanged_cmd);
install_element(RMAP_NODE, &set_local_pref_cmd);

View File

@ -1228,6 +1228,11 @@ void bgp_zebra_announce(struct bgp_node *rn, struct prefix *p,
SET_FLAG(api.flags, ZEBRA_FLAG_ALLOW_RECURSION);
if (info->attr->rmap_table_id) {
SET_FLAG(api.message, ZAPI_MESSAGE_TABLEID);
api.tableid = info->attr->rmap_table_id;
}
/* Metric is currently based on the best-path only */
metric = info->attr->med;
for (mpinfo = info; mpinfo; mpinfo = bgp_path_info_mpath_next(mpinfo)) {

View File

@ -306,6 +306,11 @@ Route Map Set Command
Set BGP route origin.
.. index:: set table (1-4294967295)
.. clicmd:: set table (1-4294967295)
Set the BGP table to a given table identifier
.. _route-map-call-command:
Route Map Call Command