Skip to content

Commit

Permalink
Merge pull request #14274 from opensourcerouting/fix/staticd_with_bla…
Browse files Browse the repository at this point in the history
…ckhole_nexthop_handling

staticd: Accept full blackhole typed keywords for ip_route_cmd
  • Loading branch information
riw777 authored Aug 29, 2023
2 parents 6486741 + 76b2bc9 commit 2c2b16f
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 3 deletions.
19 changes: 18 additions & 1 deletion staticd/static_nb_config.c
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,8 @@ static bool static_nexthop_create(struct nb_cb_create_args *args)
switch (args->event) {
case NB_EV_VALIDATE:
ifname = yang_dnode_get_string(args->dnode, "./interface");
if (ifname != NULL) {
nh_type = yang_dnode_get_enum(args->dnode, "./nh-type");
if (ifname != NULL && nh_type != STATIC_BLACKHOLE) {
if (strcasecmp(ifname, "Null0") == 0
|| strcasecmp(ifname, "reject") == 0
|| strcasecmp(ifname, "blackhole") == 0) {
Expand Down Expand Up @@ -371,10 +372,26 @@ static int static_nexthop_bh_type_modify(struct nb_cb_modify_args *args)
{
struct static_nexthop *nh;
enum static_nh_type nh_type;
const char *nh_ifname;
const char *nh_vrf;

switch (args->event) {
case NB_EV_VALIDATE:
nh_type = yang_dnode_get_enum(args->dnode, "../nh-type");
nh_ifname = yang_dnode_get_string(args->dnode, "../interface");
nh_vrf = yang_dnode_get_string(args->dnode, "../vrf");
if (nh_ifname && nh_vrf) {
struct vrf *vrf = vrf_lookup_by_name(nh_vrf);
struct interface *ifp = if_lookup_by_name(nh_ifname,
vrf->vrf_id);

if (ifp && (!strmatch(nh_ifname, "blackhole") ||
!strmatch(nh_ifname, "reject"))) {
snprintf(args->errmsg, args->errmsg_len,
"nexthop interface name must be (reject, blackhole)");
return NB_ERR_VALIDATION;
}
}
if (nh_type != STATIC_BLACKHOLE) {
snprintf(args->errmsg, args->errmsg_len,
"nexthop type is not the blackhole type");
Expand Down
37 changes: 35 additions & 2 deletions staticd/static_vty.c
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@ struct static_route_args {
bool bfd_multi_hop;
const char *bfd_source;
const char *bfd_profile;

const char *input;
};

static int static_route_nb_run(struct vty *vty, struct static_route_args *args)
Expand Down Expand Up @@ -145,9 +147,20 @@ static int static_route_nb_run(struct vty *vty, struct static_route_args *args)
else
buf_gate_str = "";

if (args->gateway == NULL && args->interface_name == NULL)
if (args->gateway == NULL && args->interface_name == NULL) {
type = STATIC_BLACKHOLE;
else if (args->gateway && args->interface_name) {
/* If this is blackhole/reject flagged route, then
* specify interface_name with the value of what was really
* entered.
* interface_name will be validated later in NB functions
* to check if we don't create blackhole/reject routes that
* match the real interface names.
* E.g.: `ip route 10.0.0.1/32 bla` will create a blackhole
* route despite the real interface named `bla` exists.
*/
if (args->input)
args->interface_name = args->input;
} else if (args->gateway && args->interface_name) {
if (args->afi == AFI_IP)
type = STATIC_IPV4_GATEWAY_IFNAME;
else
Expand Down Expand Up @@ -499,6 +512,8 @@ DEFPY_YANG(ip_route_blackhole,
"Table to configure\n"
"The table number to configure\n")
{
int idx_flag = 0;

struct static_route_args args = {
.delete = !!no,
.afi = AFI_IP,
Expand All @@ -513,6 +528,9 @@ DEFPY_YANG(ip_route_blackhole,
.vrf = vrf,
};

if (flag && argv_find(argv, argc, flag, &idx_flag))
args.input = argv[idx_flag]->arg;

return static_route_nb_run(vty, &args);
}

Expand Down Expand Up @@ -541,6 +559,8 @@ DEFPY_YANG(ip_route_blackhole_vrf,
"Table to configure\n"
"The table number to configure\n")
{
int idx_flag = 0;

struct static_route_args args = {
.delete = !!no,
.afi = AFI_IP,
Expand All @@ -562,6 +582,9 @@ DEFPY_YANG(ip_route_blackhole_vrf,
*/
assert(args.prefix);

if (flag && argv_find(argv, argc, flag, &idx_flag))
args.input = argv[idx_flag]->arg;

return static_route_nb_run(vty, &args);
}

Expand Down Expand Up @@ -852,6 +875,8 @@ DEFPY_YANG(ipv6_route_blackhole,
"Table to configure\n"
"The table number to configure\n")
{
int idx_flag = 0;

struct static_route_args args = {
.delete = !!no,
.afi = AFI_IP6,
Expand All @@ -866,6 +891,9 @@ DEFPY_YANG(ipv6_route_blackhole,
.vrf = vrf,
};

if (flag && argv_find(argv, argc, flag, &idx_flag))
args.input = argv[idx_flag]->arg;

return static_route_nb_run(vty, &args);
}

Expand Down Expand Up @@ -894,6 +922,8 @@ DEFPY_YANG(ipv6_route_blackhole_vrf,
"Table to configure\n"
"The table number to configure\n")
{
int idx_flag = 0;

struct static_route_args args = {
.delete = !!no,
.afi = AFI_IP6,
Expand All @@ -915,6 +945,9 @@ DEFPY_YANG(ipv6_route_blackhole_vrf,
*/
assert(args.prefix);

if (flag && argv_find(argv, argc, flag, &idx_flag))
args.input = argv[idx_flag]->arg;

return static_route_nb_run(vty, &args);
}

Expand Down

0 comments on commit 2c2b16f

Please sign in to comment.