lib, zebra, pimd: clean up/fix VRF DECLVAR macros

There's a common pattern of "get VRF context for CLI node" here, which
first got a helper macro in zebra that then permeated into pimd.

Unfortunately the pimd copy wasn't quite adjusted correctly and thus
caused two coverity warnings (CID 1517453, CID 1517454).

Fix the PIM one, and clean up by providing a common base macro in
`lib/vty.h`.

Also rename the macros (add `_VRF`) to make more clear what they do.

Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
This commit is contained in:
David Lamparter 2022-04-28 11:06:20 +02:00
parent 633a50d11c
commit 0cbed9511a
8 changed files with 47 additions and 36 deletions

View File

@ -266,6 +266,15 @@ static inline void vty_push_context(struct vty *vty, int node, uint64_t id)
struct structname *ptr = VTY_GET_CONTEXT(structname); \ struct structname *ptr = VTY_GET_CONTEXT(structname); \
VTY_CHECK_CONTEXT(ptr); VTY_CHECK_CONTEXT(ptr);
#define VTY_DECLVAR_CONTEXT_VRF(vrfptr) \
struct vrf *vrfptr; \
if (vty->node == CONFIG_NODE) \
vrfptr = vrf_lookup_by_id(VRF_DEFAULT); \
else \
vrfptr = VTY_GET_CONTEXT(vrf); \
VTY_CHECK_CONTEXT(vrfptr); \
MACRO_REQUIRE_SEMICOLON() /* end */
/* XPath macros. */ /* XPath macros. */
#define VTY_PUSH_XPATH(nodeval, value) \ #define VTY_PUSH_XPATH(nodeval, value) \
do { \ do { \

View File

@ -660,8 +660,11 @@ DEFPY (ipv6_mld_group_watermark,
"Configure group limit for watermark warning\n" "Configure group limit for watermark warning\n"
"Group count to generate watermark warning\n") "Group count to generate watermark warning\n")
{ {
PIM_DECLVAR_CONTEXT(vrf, pim); PIM_DECLVAR_CONTEXT_VRF(vrf, pim);
/* TBD Depends on MLD data structure changes */ /* TBD Depends on MLD data structure changes */
(void)pim;
return CMD_SUCCESS; return CMD_SUCCESS;
} }
@ -674,8 +677,11 @@ DEFPY (no_ipv6_mld_group_watermark,
"Unconfigure group limit for watermark warning\n" "Unconfigure group limit for watermark warning\n"
IGNORED_IN_NO_STR) IGNORED_IN_NO_STR)
{ {
PIM_DECLVAR_CONTEXT(vrf, pim); PIM_DECLVAR_CONTEXT_VRF(vrf, pim);
/* TBD Depends on MLD data structure changes */ /* TBD Depends on MLD data structure changes */
(void)pim;
return CMD_SUCCESS; return CMD_SUCCESS;
} }

View File

@ -4848,7 +4848,7 @@ DEFPY (ip_igmp_group_watermark,
"Configure group limit for watermark warning\n" "Configure group limit for watermark warning\n"
"Group count to generate watermark warning\n") "Group count to generate watermark warning\n")
{ {
PIM_DECLVAR_CONTEXT(vrf, pim); PIM_DECLVAR_CONTEXT_VRF(vrf, pim);
pim->igmp_watermark_limit = limit; pim->igmp_watermark_limit = limit;
return CMD_SUCCESS; return CMD_SUCCESS;
@ -4863,7 +4863,7 @@ DEFPY (no_ip_igmp_group_watermark,
"Unconfigure group limit for watermark warning\n" "Unconfigure group limit for watermark warning\n"
IGNORED_IN_NO_STR) IGNORED_IN_NO_STR)
{ {
PIM_DECLVAR_CONTEXT(vrf, pim); PIM_DECLVAR_CONTEXT_VRF(vrf, pim);
pim->igmp_watermark_limit = 0; pim->igmp_watermark_limit = 0;
return CMD_SUCCESS; return CMD_SUCCESS;

View File

@ -112,9 +112,9 @@ void show_multicast_interfaces(struct pim_instance *pim, struct vty *vty,
/* /*
* Special Macro to allow us to get the correct pim_instance; * Special Macro to allow us to get the correct pim_instance;
*/ */
#define PIM_DECLVAR_CONTEXT(A, B) \ #define PIM_DECLVAR_CONTEXT_VRF(vrfptr, pimptr) \
struct vrf *A = VTY_GET_CONTEXT(vrf); \ VTY_DECLVAR_CONTEXT_VRF(vrfptr); \
struct pim_instance *B = \ struct pim_instance *pimptr = vrfptr->info; \
(vrf) ? vrf->info : pim_get_pim_instance(VRF_DEFAULT); \ MACRO_REQUIRE_SEMICOLON() /* end */
vrf = (vrf) ? vrf : pim->vrf
#endif /* PIM_CMD_COMMON_H */ #endif /* PIM_CMD_COMMON_H */

View File

@ -342,7 +342,7 @@ DEFUN (ip_router_id_in_vrf,
"Manually set the router-id\n" "Manually set the router-id\n"
"IP address to use for router-id\n") "IP address to use for router-id\n")
{ {
ZEBRA_DECLVAR_CONTEXT(vrf, zvrf); ZEBRA_DECLVAR_CONTEXT_VRF(vrf, zvrf);
int idx = 0; int idx = 0;
struct prefix rid; struct prefix rid;
@ -372,7 +372,7 @@ DEFUN (ipv6_router_id_in_vrf,
"Manually set the IPv6 router-id\n" "Manually set the IPv6 router-id\n"
"IPV6 address to use for router-id\n") "IPV6 address to use for router-id\n")
{ {
ZEBRA_DECLVAR_CONTEXT(vrf, zvrf); ZEBRA_DECLVAR_CONTEXT_VRF(vrf, zvrf);
int idx = 0; int idx = 0;
struct prefix rid; struct prefix rid;
@ -458,7 +458,7 @@ DEFUN (no_ip_router_id_in_vrf,
"Remove the manually configured router-id\n" "Remove the manually configured router-id\n"
"IP address to use for router-id\n") "IP address to use for router-id\n")
{ {
ZEBRA_DECLVAR_CONTEXT(vrf, zvrf); ZEBRA_DECLVAR_CONTEXT_VRF(vrf, zvrf);
struct prefix rid; struct prefix rid;
@ -486,7 +486,7 @@ DEFUN (no_ipv6_router_id_in_vrf,
"Remove the manually configured IPv6 router-id\n" "Remove the manually configured IPv6 router-id\n"
"IPv6 address to use for router-id\n") "IPv6 address to use for router-id\n")
{ {
ZEBRA_DECLVAR_CONTEXT(vrf, zvrf); ZEBRA_DECLVAR_CONTEXT_VRF(vrf, zvrf);
struct prefix rid; struct prefix rid;

View File

@ -638,7 +638,7 @@ DEFPY_YANG (ip_protocol,
assert(proto); assert(proto);
assert(rmap); assert(rmap);
ZEBRA_DECLVAR_CONTEXT(vrf, zvrf); ZEBRA_DECLVAR_CONTEXT_VRF(vrf, zvrf);
if (!zvrf) if (!zvrf)
return CMD_WARNING; return CMD_WARNING;
@ -672,7 +672,7 @@ DEFPY_YANG (no_ip_protocol,
assert(proto); assert(proto);
ZEBRA_DECLVAR_CONTEXT(vrf, zvrf); ZEBRA_DECLVAR_CONTEXT_VRF(vrf, zvrf);
if (!zvrf) if (!zvrf)
return CMD_WARNING; return CMD_WARNING;
@ -719,7 +719,7 @@ DEFPY_YANG (ipv6_protocol,
assert(rmap); assert(rmap);
assert(proto); assert(proto);
ZEBRA_DECLVAR_CONTEXT(vrf, zvrf); ZEBRA_DECLVAR_CONTEXT_VRF(vrf, zvrf);
if (!zvrf) if (!zvrf)
return CMD_WARNING; return CMD_WARNING;
@ -753,7 +753,7 @@ DEFPY_YANG (no_ipv6_protocol,
assert(proto); assert(proto);
ZEBRA_DECLVAR_CONTEXT(vrf, zvrf); ZEBRA_DECLVAR_CONTEXT_VRF(vrf, zvrf);
if (!zvrf) if (!zvrf)
return CMD_WARNING; return CMD_WARNING;
@ -801,7 +801,7 @@ DEFPY_YANG (ip_protocol_nht_rmap,
assert(proto); assert(proto);
assert(rmap); assert(rmap);
ZEBRA_DECLVAR_CONTEXT(vrf, zvrf); ZEBRA_DECLVAR_CONTEXT_VRF(vrf, zvrf);
if (!zvrf) if (!zvrf)
return CMD_WARNING; return CMD_WARNING;
@ -835,7 +835,7 @@ DEFPY_YANG (no_ip_protocol_nht_rmap,
assert(proto); assert(proto);
ZEBRA_DECLVAR_CONTEXT(vrf, zvrf); ZEBRA_DECLVAR_CONTEXT_VRF(vrf, zvrf);
if (!zvrf) if (!zvrf)
return CMD_WARNING; return CMD_WARNING;
@ -883,7 +883,7 @@ DEFPY_YANG (ipv6_protocol_nht_rmap,
assert(rmap); assert(rmap);
assert(proto); assert(proto);
ZEBRA_DECLVAR_CONTEXT(vrf, zvrf); ZEBRA_DECLVAR_CONTEXT_VRF(vrf, zvrf);
if (!zvrf) if (!zvrf)
return CMD_WARNING; return CMD_WARNING;
@ -917,7 +917,7 @@ DEFPY_YANG (no_ipv6_protocol_nht_rmap,
assert(proto); assert(proto);
ZEBRA_DECLVAR_CONTEXT(vrf, zvrf); ZEBRA_DECLVAR_CONTEXT_VRF(vrf, zvrf);
if (!zvrf) if (!zvrf)
return CMD_WARNING; return CMD_WARNING;

View File

@ -192,14 +192,10 @@ struct zebra_vrf {
/* /*
* special macro to allow us to get the correct zebra_vrf * special macro to allow us to get the correct zebra_vrf
*/ */
#define ZEBRA_DECLVAR_CONTEXT(A, B) \ #define ZEBRA_DECLVAR_CONTEXT_VRF(vrfptr, zvrfptr) \
struct vrf *A; \ VTY_DECLVAR_CONTEXT_VRF(vrfptr); \
if (vty->node == CONFIG_NODE) \ struct zebra_vrf *zvrfptr = vrfptr->info; \
A = vrf_lookup_by_id(VRF_DEFAULT); \ MACRO_REQUIRE_SEMICOLON() /* end */
else \
A = VTY_GET_CONTEXT(vrf); \
VTY_CHECK_CONTEXT(A); \
struct zebra_vrf *B = A->info
static inline vrf_id_t zvrf_id(struct zebra_vrf *zvrf) static inline vrf_id_t zvrf_id(struct zebra_vrf *zvrf)
{ {

View File

@ -1413,7 +1413,7 @@ DEFUN (ip_nht_default_route,
"Filter Next Hop tracking route resolution\n" "Filter Next Hop tracking route resolution\n"
"Resolve via default route\n") "Resolve via default route\n")
{ {
ZEBRA_DECLVAR_CONTEXT(vrf, zvrf); ZEBRA_DECLVAR_CONTEXT_VRF(vrf, zvrf);
if (!zvrf) if (!zvrf)
return CMD_WARNING; return CMD_WARNING;
@ -1752,7 +1752,7 @@ DEFUN (no_ip_nht_default_route,
"Filter Next Hop tracking route resolution\n" "Filter Next Hop tracking route resolution\n"
"Resolve via default route\n") "Resolve via default route\n")
{ {
ZEBRA_DECLVAR_CONTEXT(vrf, zvrf); ZEBRA_DECLVAR_CONTEXT_VRF(vrf, zvrf);
if (!zvrf) if (!zvrf)
return CMD_WARNING; return CMD_WARNING;
@ -1772,7 +1772,7 @@ DEFUN (ipv6_nht_default_route,
"Filter Next Hop tracking route resolution\n" "Filter Next Hop tracking route resolution\n"
"Resolve via default route\n") "Resolve via default route\n")
{ {
ZEBRA_DECLVAR_CONTEXT(vrf, zvrf); ZEBRA_DECLVAR_CONTEXT_VRF(vrf, zvrf);
if (!zvrf) if (!zvrf)
return CMD_WARNING; return CMD_WARNING;
@ -1793,7 +1793,7 @@ DEFUN (no_ipv6_nht_default_route,
"Filter Next Hop tracking route resolution\n" "Filter Next Hop tracking route resolution\n"
"Resolve via default route\n") "Resolve via default route\n")
{ {
ZEBRA_DECLVAR_CONTEXT(vrf, zvrf); ZEBRA_DECLVAR_CONTEXT_VRF(vrf, zvrf);
if (!zvrf) if (!zvrf)
return CMD_WARNING; return CMD_WARNING;
@ -2950,7 +2950,7 @@ DEFUN (vrf_vni_mapping,
{ {
int filter = 0; int filter = 0;
ZEBRA_DECLVAR_CONTEXT(vrf, zvrf); ZEBRA_DECLVAR_CONTEXT_VRF(vrf, zvrf);
assert(vrf); assert(vrf);
assert(zvrf); assert(zvrf);
@ -2979,7 +2979,7 @@ DEFUN (no_vrf_vni_mapping,
{ {
int filter = 0; int filter = 0;
ZEBRA_DECLVAR_CONTEXT(vrf, zvrf); ZEBRA_DECLVAR_CONTEXT_VRF(vrf, zvrf);
vni_t vni = strtoul(argv[2]->arg, NULL, 10); vni_t vni = strtoul(argv[2]->arg, NULL, 10);
assert(vrf); assert(vrf);
@ -4395,7 +4395,7 @@ DEFUN(ip_table_range, ip_table_range_cmd,
"Start Routing Table\n" "Start Routing Table\n"
"End Routing Table\n") "End Routing Table\n")
{ {
ZEBRA_DECLVAR_CONTEXT(vrf, zvrf); ZEBRA_DECLVAR_CONTEXT_VRF(vrf, zvrf);
if (!zvrf) if (!zvrf)
return CMD_WARNING; return CMD_WARNING;