Merge pull request #12898 from FRRouting/mergify/bp/dev/8.5/pr-12888

bgpd: Flags fixes (backport #12888)
This commit is contained in:
Donald Sharp 2023-02-27 13:40:06 -05:00 committed by GitHub
commit 63b643d1cf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 44 additions and 39 deletions

View File

@ -332,7 +332,7 @@ static unsigned int updgrp_hash_key_make(const void *p)
const struct update_group *updgrp; const struct update_group *updgrp;
const struct peer *peer; const struct peer *peer;
const struct bgp_filter *filter; const struct bgp_filter *filter;
uint32_t flags; uint64_t flags;
uint32_t key; uint32_t key;
afi_t afi; afi_t afi;
safi_t safi; safi_t safi;
@ -516,8 +516,8 @@ static bool updgrp_hash_cmp(const void *p1, const void *p2)
const struct update_group *grp2; const struct update_group *grp2;
const struct peer *pe1; const struct peer *pe1;
const struct peer *pe2; const struct peer *pe2;
uint32_t flags1; uint64_t flags1;
uint32_t flags2; uint64_t flags2;
const struct bgp_filter *fl1; const struct bgp_filter *fl1;
const struct bgp_filter *fl2; const struct bgp_filter *fl2;
afi_t afi; afi_t afi;

View File

@ -5555,7 +5555,7 @@ DEFUN (no_neighbor_capability_enhe,
} }
static int peer_af_flag_modify_vty(struct vty *vty, const char *peer_str, static int peer_af_flag_modify_vty(struct vty *vty, const char *peer_str,
afi_t afi, safi_t safi, uint32_t flag, afi_t afi, safi_t safi, uint64_t flag,
int set) int set)
{ {
int ret; int ret;
@ -5574,13 +5574,13 @@ static int peer_af_flag_modify_vty(struct vty *vty, const char *peer_str,
} }
static int peer_af_flag_set_vty(struct vty *vty, const char *peer_str, static int peer_af_flag_set_vty(struct vty *vty, const char *peer_str,
afi_t afi, safi_t safi, uint32_t flag) afi_t afi, safi_t safi, uint64_t flag)
{ {
return peer_af_flag_modify_vty(vty, peer_str, afi, safi, flag, 1); return peer_af_flag_modify_vty(vty, peer_str, afi, safi, flag, 1);
} }
static int peer_af_flag_unset_vty(struct vty *vty, const char *peer_str, static int peer_af_flag_unset_vty(struct vty *vty, const char *peer_str,
afi_t afi, safi_t safi, uint32_t flag) afi_t afi, safi_t safi, uint64_t flag)
{ {
return peer_af_flag_modify_vty(vty, peer_str, afi, safi, flag, 0); return peer_af_flag_modify_vty(vty, peer_str, afi, safi, flag, 0);
} }
@ -16912,7 +16912,7 @@ static bool peergroup_af_flag_check(struct peer *peer, afi_t afi, safi_t safi,
if (CHECK_FLAG(peer->af_flags_invert[afi][safi], flag)) if (CHECK_FLAG(peer->af_flags_invert[afi][safi], flag))
return !peer_af_flag_check(peer, afi, safi, flag); return !peer_af_flag_check(peer, afi, safi, flag);
else else
return !!peer_af_flag_check(peer, afi, safi, flag); return peer_af_flag_check(peer, afi, safi, flag);
} }
return !!CHECK_FLAG(peer->af_flags_override[afi][safi], flag); return !!CHECK_FLAG(peer->af_flags_override[afi][safi], flag);

View File

@ -980,9 +980,10 @@ void peer_flag_inherit(struct peer *peer, uint64_t flag)
COND_FLAG(peer->flags, flag, group_val); COND_FLAG(peer->flags, flag, group_val);
} }
int peer_af_flag_check(struct peer *peer, afi_t afi, safi_t safi, uint32_t flag) bool peer_af_flag_check(struct peer *peer, afi_t afi, safi_t safi,
uint64_t flag)
{ {
return CHECK_FLAG(peer->af_flags[afi][safi], flag); return !!CHECK_FLAG(peer->af_flags[afi][safi], flag);
} }
void peer_af_flag_inherit(struct peer *peer, afi_t afi, safi_t safi, void peer_af_flag_inherit(struct peer *peer, afi_t afi, safi_t safi,
@ -2703,7 +2704,7 @@ struct peer_group *peer_group_get(struct bgp *bgp, const char *name)
static void peer_group2peer_config_copy(struct peer_group *group, static void peer_group2peer_config_copy(struct peer_group *group,
struct peer *peer) struct peer *peer)
{ {
uint32_t flags_tmp; uint64_t flags_tmp;
struct peer *conf; struct peer *conf;
bool config_node = !!CHECK_FLAG(peer->flags, PEER_FLAG_CONFIG_NODE); bool config_node = !!CHECK_FLAG(peer->flags, PEER_FLAG_CONFIG_NODE);
@ -4448,7 +4449,7 @@ static int peer_flag_action_set(const struct peer_flag_action *action_list,
return found; return found;
} }
static void peer_flag_modify_action(struct peer *peer, uint32_t flag) static void peer_flag_modify_action(struct peer *peer, uint64_t flag)
{ {
if (flag == PEER_FLAG_SHUTDOWN) { if (flag == PEER_FLAG_SHUTDOWN) {
if (CHECK_FLAG(peer->flags, flag)) { if (CHECK_FLAG(peer->flags, flag)) {

View File

@ -1435,14 +1435,14 @@ struct peer {
#define PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE (1ULL << 19) #define PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE (1ULL << 19)
#define PEER_FLAG_AS_OVERRIDE (1ULL << 20) #define PEER_FLAG_AS_OVERRIDE (1ULL << 20)
#define PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE (1ULL << 21) #define PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE (1ULL << 21)
#define PEER_FLAG_WEIGHT (1ULL << 24) #define PEER_FLAG_WEIGHT (1ULL << 22)
#define PEER_FLAG_ALLOWAS_IN_ORIGIN (1ULL << 25) #define PEER_FLAG_ALLOWAS_IN_ORIGIN (1ULL << 23)
#define PEER_FLAG_SEND_LARGE_COMMUNITY (1ULL << 26) #define PEER_FLAG_SEND_LARGE_COMMUNITY (1ULL << 24)
#define PEER_FLAG_MAX_PREFIX_OUT (1ULL << 27) #define PEER_FLAG_MAX_PREFIX_OUT (1ULL << 25)
#define PEER_FLAG_MAX_PREFIX_FORCE (1ULL << 28) #define PEER_FLAG_MAX_PREFIX_FORCE (1ULL << 26)
#define PEER_FLAG_DISABLE_ADDPATH_RX (1ULL << 29) #define PEER_FLAG_DISABLE_ADDPATH_RX (1ULL << 27)
#define PEER_FLAG_SOO (1ULL << 30) #define PEER_FLAG_SOO (1ULL << 28)
#define PEER_FLAG_ACCEPT_OWN (1ULL << 31) #define PEER_FLAG_ACCEPT_OWN (1ULL << 63)
enum bgp_addpath_strat addpath_type[AFI_MAX][SAFI_MAX]; enum bgp_addpath_strat addpath_type[AFI_MAX][SAFI_MAX];
@ -2227,7 +2227,8 @@ extern int peer_af_flag_set(struct peer *peer, afi_t afi, safi_t safi,
uint64_t flag); uint64_t flag);
extern int peer_af_flag_unset(struct peer *peer, afi_t afi, safi_t safi, extern int peer_af_flag_unset(struct peer *peer, afi_t afi, safi_t safi,
uint64_t flag); uint64_t flag);
extern int peer_af_flag_check(struct peer *, afi_t, safi_t, uint32_t); extern bool peer_af_flag_check(struct peer *peer, afi_t afi, safi_t safi,
uint64_t flag);
extern void peer_af_flag_inherit(struct peer *peer, afi_t afi, safi_t safi, extern void peer_af_flag_inherit(struct peer *peer, afi_t afi, safi_t safi,
uint64_t flag); uint64_t flag);
extern void peer_change_action(struct peer *peer, afi_t afi, safi_t safi, extern void peer_change_action(struct peer *peer, afi_t afi, safi_t safi,

View File

@ -176,9 +176,9 @@ struct test_peer_attr {
enum test_peer_attr_type type; enum test_peer_attr_type type;
union { union {
uint32_t flag; uint64_t flag;
struct { struct {
uint32_t flag; uint64_t flag;
size_t direct; size_t direct;
} filter; } filter;
} u; } u;
@ -640,6 +640,14 @@ static struct test_peer_attr test_peer_attrs[] = {
.u.flag = PEER_FLAG_WEIGHT, .u.flag = PEER_FLAG_WEIGHT,
.handlers[0] = TEST_HANDLER(weight), .handlers[0] = TEST_HANDLER(weight),
}, },
{
.cmd = "accept-own",
.peer_cmd = "accept-own",
.group_cmd = "accept-own",
.families[0] = {.afi = AFI_IP, .safi = SAFI_MPLS_VPN},
.families[1] = {.afi = AFI_IP6, .safi = SAFI_MPLS_VPN},
.u.flag = PEER_FLAG_ACCEPT_OWN,
},
{NULL} {NULL}
}; };
/* clang-format on */ /* clang-format on */
@ -651,21 +659,14 @@ static const char *str_from_afi(afi_t afi)
return "ipv4"; return "ipv4";
case AFI_IP6: case AFI_IP6:
return "ipv6"; return "ipv6";
default: case AFI_L2VPN:
return "<unknown AFI>"; return "l2vpn";
case AFI_MAX:
case AFI_UNSPEC:
return "bad-value";
} }
}
static const char *str_from_safi(safi_t safi) assert(!"Reached end of function we should never reach");
{
switch (safi) {
case SAFI_UNICAST:
return "unicast";
case SAFI_MULTICAST:
return "multicast";
default:
return "<unknown SAFI>";
}
} }
static const char *str_from_attr_type(enum test_peer_attr_type at) static const char *str_from_attr_type(enum test_peer_attr_type at)
@ -1151,7 +1152,7 @@ static void test_peer_attr(struct test *test, struct test_peer_attr *pa)
test_log(test, "prepare: switch address-family to [%s]", test_log(test, "prepare: switch address-family to [%s]",
get_afi_safi_str(pa->afi, pa->safi, false)); get_afi_safi_str(pa->afi, pa->safi, false));
test_execute(test, "address-family %s %s", test_execute(test, "address-family %s %s",
str_from_afi(pa->afi), str_from_safi(pa->safi)); str_from_afi(pa->afi), safi2str(pa->safi));
test_execute(test, "neighbor %s activate", g->name); test_execute(test, "neighbor %s activate", g->name);
test_execute(test, "neighbor %s activate", p->host); test_execute(test, "neighbor %s activate", p->host);
} }
@ -1218,7 +1219,7 @@ static void test_peer_attr(struct test *test, struct test_peer_attr *pa)
test_log(test, "prepare: switch address-family to [%s]", test_log(test, "prepare: switch address-family to [%s]",
get_afi_safi_str(pa->afi, pa->safi, false)); get_afi_safi_str(pa->afi, pa->safi, false));
test_execute(test, "address-family %s %s", test_execute(test, "address-family %s %s",
str_from_afi(pa->afi), str_from_safi(pa->safi)); str_from_afi(pa->afi), safi2str(pa->safi));
test_execute(test, "neighbor %s activate", g->name); test_execute(test, "neighbor %s activate", g->name);
test_execute(test, "neighbor %s activate", p->host); test_execute(test, "neighbor %s activate", p->host);
} }
@ -1266,7 +1267,7 @@ static void test_peer_attr(struct test *test, struct test_peer_attr *pa)
test_log(test, "prepare: switch address-family to [%s]", test_log(test, "prepare: switch address-family to [%s]",
get_afi_safi_str(pa->afi, pa->safi, false)); get_afi_safi_str(pa->afi, pa->safi, false));
test_execute(test, "address-family %s %s", test_execute(test, "address-family %s %s",
str_from_afi(pa->afi), str_from_safi(pa->safi)); str_from_afi(pa->afi), safi2str(pa->safi));
test_execute(test, "neighbor %s activate", g->name); test_execute(test, "neighbor %s activate", g->name);
test_execute(test, "neighbor %s activate", p->host); test_execute(test, "neighbor %s activate", p->host);
} }
@ -1465,7 +1466,7 @@ int main(void)
if (pa->afi && pa->safi) if (pa->afi && pa->safi)
desc = asprintfrr(MTYPE_TMP, "peer\\%s-%s\\%s", desc = asprintfrr(MTYPE_TMP, "peer\\%s-%s\\%s",
str_from_afi(pa->afi), str_from_afi(pa->afi),
str_from_safi(pa->safi), pa->cmd); safi2str(pa->safi), pa->cmd);
else else
desc = asprintfrr(MTYPE_TMP, "peer\\%s", pa->cmd); desc = asprintfrr(MTYPE_TMP, "peer\\%s", pa->cmd);

View File

@ -196,3 +196,5 @@ TestFlag.okfail("peer\\ipv4-unicast\\weight")
TestFlag.okfail("peer\\ipv4-multicast\\weight") TestFlag.okfail("peer\\ipv4-multicast\\weight")
TestFlag.okfail("peer\\ipv6-unicast\\weight") TestFlag.okfail("peer\\ipv6-unicast\\weight")
TestFlag.okfail("peer\\ipv6-multicast\\weight") TestFlag.okfail("peer\\ipv6-multicast\\weight")
TestFlag.okfail("peer\\ipv4-vpn\\accept-own")
TestFlag.okfail("peer\\ipv6-vpn\\accept-own")