mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-05-25 22:00:41 +00:00
bgpd: add redistribute table-direct support
Add the 'redistribute table-direct' command under the bgp address-family node. Handle the table-direct support wherever needed in the BGP code. Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
This commit is contained in:
parent
a61f49ab36
commit
b6367f8460
129
bgpd/bgp_vty.c
129
bgpd/bgp_vty.c
@ -16846,10 +16846,11 @@ ALIAS_HIDDEN(
|
||||
|
||||
DEFUN (bgp_redistribute_ipv4_ospf,
|
||||
bgp_redistribute_ipv4_ospf_cmd,
|
||||
"redistribute <ospf|table> (1-65535)",
|
||||
"redistribute <ospf|table|table-direct> (1-65535)",
|
||||
"Redistribute information from another routing protocol\n"
|
||||
"Open Shortest Path First (OSPFv2)\n"
|
||||
"Non-main Kernel Routing Table\n"
|
||||
"Non-main Kernel Routing Table - Direct\n"
|
||||
"Instance ID/Table ID\n")
|
||||
{
|
||||
VTY_DECLVAR_CONTEXT(bgp, bgp);
|
||||
@ -16869,7 +16870,18 @@ DEFUN (bgp_redistribute_ipv4_ospf,
|
||||
argv[idx_ospf_table]->arg);
|
||||
return CMD_WARNING_CONFIG_FAILED;
|
||||
}
|
||||
protocol = ZEBRA_ROUTE_TABLE;
|
||||
if (strncmp(argv[idx_ospf_table]->arg, "table-direct",
|
||||
strlen("table-direct")) == 0) {
|
||||
protocol = ZEBRA_ROUTE_TABLE_DIRECT;
|
||||
if (instance == RT_TABLE_MAIN ||
|
||||
instance == RT_TABLE_LOCAL) {
|
||||
vty_out(vty,
|
||||
"%% 'table-direct', can not use %u routing table\n",
|
||||
instance);
|
||||
return CMD_WARNING_CONFIG_FAILED;
|
||||
}
|
||||
} else
|
||||
protocol = ZEBRA_ROUTE_TABLE;
|
||||
}
|
||||
|
||||
bgp_redist_add(bgp, AFI_IP, protocol, instance);
|
||||
@ -16877,18 +16889,20 @@ DEFUN (bgp_redistribute_ipv4_ospf,
|
||||
}
|
||||
|
||||
ALIAS_HIDDEN(bgp_redistribute_ipv4_ospf, bgp_redistribute_ipv4_ospf_hidden_cmd,
|
||||
"redistribute <ospf|table> (1-65535)",
|
||||
"redistribute <ospf|table|table-direct> (1-65535)",
|
||||
"Redistribute information from another routing protocol\n"
|
||||
"Open Shortest Path First (OSPFv2)\n"
|
||||
"Non-main Kernel Routing Table\n"
|
||||
"Non-main Kernel Routing Table - Direct\n"
|
||||
"Instance ID/Table ID\n")
|
||||
|
||||
DEFUN (bgp_redistribute_ipv4_ospf_rmap,
|
||||
bgp_redistribute_ipv4_ospf_rmap_cmd,
|
||||
"redistribute <ospf|table> (1-65535) route-map RMAP_NAME",
|
||||
"redistribute <ospf|table|table-direct> (1-65535) route-map RMAP_NAME",
|
||||
"Redistribute information from another routing protocol\n"
|
||||
"Open Shortest Path First (OSPFv2)\n"
|
||||
"Non-main Kernel Routing Table\n"
|
||||
"Non-main Kernel Routing Table - Direct\n"
|
||||
"Instance ID/Table ID\n"
|
||||
"Route map reference\n"
|
||||
"Pointer to route-map entries\n")
|
||||
@ -16904,6 +16918,8 @@ DEFUN (bgp_redistribute_ipv4_ospf_rmap,
|
||||
struct route_map *route_map =
|
||||
route_map_lookup_warn_noexist(vty, argv[idx_word]->arg);
|
||||
|
||||
instance = strtoul(argv[idx_number]->arg, NULL, 10);
|
||||
|
||||
if (strncmp(argv[idx_ospf_table]->arg, "o", 1) == 0)
|
||||
protocol = ZEBRA_ROUTE_OSPF;
|
||||
else {
|
||||
@ -16913,10 +16929,20 @@ DEFUN (bgp_redistribute_ipv4_ospf_rmap,
|
||||
argv[idx_ospf_table]->arg);
|
||||
return CMD_WARNING_CONFIG_FAILED;
|
||||
}
|
||||
protocol = ZEBRA_ROUTE_TABLE;
|
||||
if (strncmp(argv[idx_ospf_table]->arg, "table-direct",
|
||||
strlen("table-direct")) == 0) {
|
||||
protocol = ZEBRA_ROUTE_TABLE_DIRECT;
|
||||
if (instance == RT_TABLE_MAIN ||
|
||||
instance == RT_TABLE_LOCAL) {
|
||||
vty_out(vty,
|
||||
"%% 'table-direct', can not use %u routing table\n",
|
||||
instance);
|
||||
return CMD_WARNING_CONFIG_FAILED;
|
||||
}
|
||||
} else
|
||||
protocol = ZEBRA_ROUTE_TABLE;
|
||||
}
|
||||
|
||||
instance = strtoul(argv[idx_number]->arg, NULL, 10);
|
||||
red = bgp_redist_add(bgp, AFI_IP, protocol, instance);
|
||||
changed =
|
||||
bgp_redistribute_rmap_set(red, argv[idx_word]->arg, route_map);
|
||||
@ -16925,20 +16951,22 @@ DEFUN (bgp_redistribute_ipv4_ospf_rmap,
|
||||
|
||||
ALIAS_HIDDEN(bgp_redistribute_ipv4_ospf_rmap,
|
||||
bgp_redistribute_ipv4_ospf_rmap_hidden_cmd,
|
||||
"redistribute <ospf|table> (1-65535) route-map RMAP_NAME",
|
||||
"redistribute <ospf|table|table-direct> (1-65535) route-map RMAP_NAME",
|
||||
"Redistribute information from another routing protocol\n"
|
||||
"Open Shortest Path First (OSPFv2)\n"
|
||||
"Non-main Kernel Routing Table\n"
|
||||
"Non-main Kernel Routing Table - Direct\n"
|
||||
"Instance ID/Table ID\n"
|
||||
"Route map reference\n"
|
||||
"Pointer to route-map entries\n")
|
||||
|
||||
DEFUN (bgp_redistribute_ipv4_ospf_metric,
|
||||
bgp_redistribute_ipv4_ospf_metric_cmd,
|
||||
"redistribute <ospf|table> (1-65535) metric (0-4294967295)",
|
||||
"redistribute <ospf|table|table-direct> (1-65535) metric (0-4294967295)",
|
||||
"Redistribute information from another routing protocol\n"
|
||||
"Open Shortest Path First (OSPFv2)\n"
|
||||
"Non-main Kernel Routing Table\n"
|
||||
"Non-main Kernel Routing Table - Direct\n"
|
||||
"Instance ID/Table ID\n"
|
||||
"Metric for redistributed routes\n"
|
||||
"Default metric\n")
|
||||
@ -16953,6 +16981,8 @@ DEFUN (bgp_redistribute_ipv4_ospf_metric,
|
||||
int protocol;
|
||||
bool changed;
|
||||
|
||||
instance = strtoul(argv[idx_number]->arg, NULL, 10);
|
||||
|
||||
if (strncmp(argv[idx_ospf_table]->arg, "o", 1) == 0)
|
||||
protocol = ZEBRA_ROUTE_OSPF;
|
||||
else {
|
||||
@ -16962,10 +16992,20 @@ DEFUN (bgp_redistribute_ipv4_ospf_metric,
|
||||
argv[idx_ospf_table]->arg);
|
||||
return CMD_WARNING_CONFIG_FAILED;
|
||||
}
|
||||
protocol = ZEBRA_ROUTE_TABLE;
|
||||
if (strncmp(argv[idx_ospf_table]->arg, "table-direct",
|
||||
strlen("table-direct")) == 0) {
|
||||
protocol = ZEBRA_ROUTE_TABLE_DIRECT;
|
||||
if (instance == RT_TABLE_MAIN ||
|
||||
instance == RT_TABLE_LOCAL) {
|
||||
vty_out(vty,
|
||||
"%% 'table-direct', can not use %u routing table\n",
|
||||
instance);
|
||||
return CMD_WARNING_CONFIG_FAILED;
|
||||
}
|
||||
} else
|
||||
protocol = ZEBRA_ROUTE_TABLE;
|
||||
}
|
||||
|
||||
instance = strtoul(argv[idx_number]->arg, NULL, 10);
|
||||
metric = strtoul(argv[idx_number_2]->arg, NULL, 10);
|
||||
|
||||
red = bgp_redist_add(bgp, AFI_IP, protocol, instance);
|
||||
@ -16976,20 +17016,22 @@ DEFUN (bgp_redistribute_ipv4_ospf_metric,
|
||||
|
||||
ALIAS_HIDDEN(bgp_redistribute_ipv4_ospf_metric,
|
||||
bgp_redistribute_ipv4_ospf_metric_hidden_cmd,
|
||||
"redistribute <ospf|table> (1-65535) metric (0-4294967295)",
|
||||
"redistribute <ospf|table|table-direct> (1-65535) metric (0-4294967295)",
|
||||
"Redistribute information from another routing protocol\n"
|
||||
"Open Shortest Path First (OSPFv2)\n"
|
||||
"Non-main Kernel Routing Table\n"
|
||||
"Non-main Kernel Routing Table - Direct\n"
|
||||
"Instance ID/Table ID\n"
|
||||
"Metric for redistributed routes\n"
|
||||
"Default metric\n")
|
||||
|
||||
DEFUN (bgp_redistribute_ipv4_ospf_rmap_metric,
|
||||
bgp_redistribute_ipv4_ospf_rmap_metric_cmd,
|
||||
"redistribute <ospf|table> (1-65535) route-map RMAP_NAME metric (0-4294967295)",
|
||||
"redistribute <ospf|table|table-direct> (1-65535) route-map RMAP_NAME metric (0-4294967295)",
|
||||
"Redistribute information from another routing protocol\n"
|
||||
"Open Shortest Path First (OSPFv2)\n"
|
||||
"Non-main Kernel Routing Table\n"
|
||||
"Non-main Kernel Routing Table - Direct\n"
|
||||
"Instance ID/Table ID\n"
|
||||
"Route map reference\n"
|
||||
"Pointer to route-map entries\n"
|
||||
@ -17009,6 +17051,8 @@ DEFUN (bgp_redistribute_ipv4_ospf_rmap_metric,
|
||||
struct route_map *route_map =
|
||||
route_map_lookup_warn_noexist(vty, argv[idx_word]->arg);
|
||||
|
||||
instance = strtoul(argv[idx_number]->arg, NULL, 10);
|
||||
|
||||
if (strncmp(argv[idx_ospf_table]->arg, "o", 1) == 0)
|
||||
protocol = ZEBRA_ROUTE_OSPF;
|
||||
else {
|
||||
@ -17018,10 +17062,20 @@ DEFUN (bgp_redistribute_ipv4_ospf_rmap_metric,
|
||||
argv[idx_ospf_table]->arg);
|
||||
return CMD_WARNING_CONFIG_FAILED;
|
||||
}
|
||||
protocol = ZEBRA_ROUTE_TABLE;
|
||||
if (strncmp(argv[idx_ospf_table]->arg, "table-direct",
|
||||
strlen("table-direct")) == 0) {
|
||||
protocol = ZEBRA_ROUTE_TABLE_DIRECT;
|
||||
if (instance == RT_TABLE_MAIN ||
|
||||
instance == RT_TABLE_LOCAL) {
|
||||
vty_out(vty,
|
||||
"%% 'table-direct', can not use %u routing table\n",
|
||||
instance);
|
||||
return CMD_WARNING_CONFIG_FAILED;
|
||||
}
|
||||
} else
|
||||
protocol = ZEBRA_ROUTE_TABLE;
|
||||
}
|
||||
|
||||
instance = strtoul(argv[idx_number]->arg, NULL, 10);
|
||||
metric = strtoul(argv[idx_number_2]->arg, NULL, 10);
|
||||
|
||||
red = bgp_redist_add(bgp, AFI_IP, protocol, instance);
|
||||
@ -17035,10 +17089,11 @@ DEFUN (bgp_redistribute_ipv4_ospf_rmap_metric,
|
||||
ALIAS_HIDDEN(
|
||||
bgp_redistribute_ipv4_ospf_rmap_metric,
|
||||
bgp_redistribute_ipv4_ospf_rmap_metric_hidden_cmd,
|
||||
"redistribute <ospf|table> (1-65535) route-map RMAP_NAME metric (0-4294967295)",
|
||||
"redistribute <ospf|table|table-direct> (1-65535) route-map RMAP_NAME metric (0-4294967295)",
|
||||
"Redistribute information from another routing protocol\n"
|
||||
"Open Shortest Path First (OSPFv2)\n"
|
||||
"Non-main Kernel Routing Table\n"
|
||||
"Non-main Kernel Routing Table - Direct\n"
|
||||
"Instance ID/Table ID\n"
|
||||
"Route map reference\n"
|
||||
"Pointer to route-map entries\n"
|
||||
@ -17047,10 +17102,11 @@ ALIAS_HIDDEN(
|
||||
|
||||
DEFUN (bgp_redistribute_ipv4_ospf_metric_rmap,
|
||||
bgp_redistribute_ipv4_ospf_metric_rmap_cmd,
|
||||
"redistribute <ospf|table> (1-65535) metric (0-4294967295) route-map RMAP_NAME",
|
||||
"redistribute <ospf|table|table-direct> (1-65535) metric (0-4294967295) route-map RMAP_NAME",
|
||||
"Redistribute information from another routing protocol\n"
|
||||
"Open Shortest Path First (OSPFv2)\n"
|
||||
"Non-main Kernel Routing Table\n"
|
||||
"Non-main Kernel Routing Table - Direct\n"
|
||||
"Instance ID/Table ID\n"
|
||||
"Metric for redistributed routes\n"
|
||||
"Default metric\n"
|
||||
@ -17070,6 +17126,8 @@ DEFUN (bgp_redistribute_ipv4_ospf_metric_rmap,
|
||||
struct route_map *route_map =
|
||||
route_map_lookup_warn_noexist(vty, argv[idx_word]->arg);
|
||||
|
||||
instance = strtoul(argv[idx_number]->arg, NULL, 10);
|
||||
|
||||
if (strncmp(argv[idx_ospf_table]->arg, "o", 1) == 0)
|
||||
protocol = ZEBRA_ROUTE_OSPF;
|
||||
else {
|
||||
@ -17078,8 +17136,18 @@ DEFUN (bgp_redistribute_ipv4_ospf_metric_rmap,
|
||||
"%% Only default BGP instance can use '%s'\n",
|
||||
argv[idx_ospf_table]->arg);
|
||||
return CMD_WARNING_CONFIG_FAILED;
|
||||
}
|
||||
protocol = ZEBRA_ROUTE_TABLE;
|
||||
} else if (strncmp(argv[idx_ospf_table]->arg, "table-direct",
|
||||
strlen("table-direct")) == 0) {
|
||||
protocol = ZEBRA_ROUTE_TABLE_DIRECT;
|
||||
if (instance == RT_TABLE_MAIN ||
|
||||
instance == RT_TABLE_LOCAL) {
|
||||
vty_out(vty,
|
||||
"%% 'table-direct', can not use %u routing table\n",
|
||||
instance);
|
||||
return CMD_WARNING_CONFIG_FAILED;
|
||||
}
|
||||
} else
|
||||
protocol = ZEBRA_ROUTE_TABLE;
|
||||
}
|
||||
|
||||
instance = strtoul(argv[idx_number]->arg, NULL, 10);
|
||||
@ -17096,10 +17164,11 @@ DEFUN (bgp_redistribute_ipv4_ospf_metric_rmap,
|
||||
ALIAS_HIDDEN(
|
||||
bgp_redistribute_ipv4_ospf_metric_rmap,
|
||||
bgp_redistribute_ipv4_ospf_metric_rmap_hidden_cmd,
|
||||
"redistribute <ospf|table> (1-65535) metric (0-4294967295) route-map RMAP_NAME",
|
||||
"redistribute <ospf|table|table-direct> (1-65535) metric (0-4294967295) route-map RMAP_NAME",
|
||||
"Redistribute information from another routing protocol\n"
|
||||
"Open Shortest Path First (OSPFv2)\n"
|
||||
"Non-main Kernel Routing Table\n"
|
||||
"Non-main Kernel Routing Table - Direct\n"
|
||||
"Instance ID/Table ID\n"
|
||||
"Metric for redistributed routes\n"
|
||||
"Default metric\n"
|
||||
@ -17108,11 +17177,12 @@ ALIAS_HIDDEN(
|
||||
|
||||
DEFUN (no_bgp_redistribute_ipv4_ospf,
|
||||
no_bgp_redistribute_ipv4_ospf_cmd,
|
||||
"no redistribute <ospf|table> (1-65535) [{metric (0-4294967295)|route-map RMAP_NAME}]",
|
||||
"no redistribute <ospf|table|table-direct> (1-65535) [{metric (0-4294967295)|route-map RMAP_NAME}]",
|
||||
NO_STR
|
||||
"Redistribute information from another routing protocol\n"
|
||||
"Open Shortest Path First (OSPFv2)\n"
|
||||
"Non-main Kernel Routing Table\n"
|
||||
"Non-main Kernel Routing Table - Direct\n"
|
||||
"Instance ID/Table ID\n"
|
||||
"Metric for redistributed routes\n"
|
||||
"Default metric\n"
|
||||
@ -17125,6 +17195,8 @@ DEFUN (no_bgp_redistribute_ipv4_ospf,
|
||||
unsigned short instance;
|
||||
int protocol;
|
||||
|
||||
instance = strtoul(argv[idx_number]->arg, NULL, 10);
|
||||
|
||||
if (strncmp(argv[idx_ospf_table]->arg, "o", 1) == 0)
|
||||
protocol = ZEBRA_ROUTE_OSPF;
|
||||
else {
|
||||
@ -17134,21 +17206,32 @@ DEFUN (no_bgp_redistribute_ipv4_ospf,
|
||||
argv[idx_ospf_table]->arg);
|
||||
return CMD_WARNING_CONFIG_FAILED;
|
||||
}
|
||||
protocol = ZEBRA_ROUTE_TABLE;
|
||||
if (strncmp(argv[idx_ospf_table]->arg, "table-direct",
|
||||
strlen("table-direct")) == 0) {
|
||||
protocol = ZEBRA_ROUTE_TABLE_DIRECT;
|
||||
if (instance == RT_TABLE_MAIN ||
|
||||
instance == RT_TABLE_LOCAL) {
|
||||
vty_out(vty,
|
||||
"%% 'table-direct', can not use %u routing table\n",
|
||||
instance);
|
||||
return CMD_WARNING_CONFIG_FAILED;
|
||||
}
|
||||
} else
|
||||
protocol = ZEBRA_ROUTE_TABLE;
|
||||
}
|
||||
|
||||
instance = strtoul(argv[idx_number]->arg, NULL, 10);
|
||||
bgp_redistribute_unset(bgp, AFI_IP, protocol, instance);
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
ALIAS_HIDDEN(
|
||||
no_bgp_redistribute_ipv4_ospf, no_bgp_redistribute_ipv4_ospf_hidden_cmd,
|
||||
"no redistribute <ospf|table> (1-65535) [{metric (0-4294967295)|route-map RMAP_NAME}]",
|
||||
"no redistribute <ospf|table|table-direct> (1-65535) [{metric (0-4294967295)|route-map RMAP_NAME}]",
|
||||
NO_STR
|
||||
"Redistribute information from another routing protocol\n"
|
||||
"Open Shortest Path First (OSPFv2)\n"
|
||||
"Non-main Kernel Routing Table\n"
|
||||
"Non-main Kernel Routing Table - Direct\n"
|
||||
"Instance ID/Table ID\n"
|
||||
"Metric for redistributed routes\n"
|
||||
"Default metric\n"
|
||||
|
@ -2051,7 +2051,8 @@ void bgp_redistribute_unset(struct bgp *bgp, afi_t afi, int type,
|
||||
struct listnode *node, *nnode;
|
||||
struct bgp_redist *red;
|
||||
|
||||
if (type != ZEBRA_ROUTE_TABLE || instance != 0)
|
||||
if ((type != ZEBRA_ROUTE_TABLE && type != ZEBRA_ROUTE_TABLE_DIRECT) ||
|
||||
instance != 0)
|
||||
return _bgp_redistribute_unset(bgp, afi, type, instance);
|
||||
|
||||
/* walk over instance */
|
||||
|
Loading…
Reference in New Issue
Block a user