From: Quentin Young Date: Tue, 14 Apr 2020 23:22:43 +0000 (-0400) Subject: lib, pimd: make implicit type conversions explicit X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=2091ac8af8c0f7adbe6a5dd591b6b43879435856;p=matthieu%2Ffrr.git lib, pimd: make implicit type conversions explicit In order to find meaningful truncations, overflows and underflows, we gotta get rid of all the intentional implicit ones Signed-off-by: Quentin Young --- diff --git a/lib/checksum.c b/lib/checksum.c index 3473370041..a0d776400c 100644 --- a/lib/checksum.c +++ b/lib/checksum.c @@ -42,7 +42,8 @@ int /* return checksum in low-order 16 bits */ sum = (sum >> 16) + (sum & 0xffff); /* add high-16 to low-16 */ sum += (sum >> 16); /* add carry */ - answer = ~sum; /* ones-complement, then truncate to 16 bits */ + /* ones-complement, then truncate to 16 bits */ + answer = (unsigned short)~sum; return (answer); } @@ -73,6 +74,7 @@ int in_cksum_with_ph6(struct ipv6_ph *ph, void *data, int nbytes) without modifying the buffer; a valid checksum returns 0 */ uint16_t fletcher_checksum(uint8_t *buffer, const size_t len, const uint16_t offset) + __attribute__((no_sanitize("unsigned-integer-overflow"))) { uint8_t *p; int x, y, c0, c1; diff --git a/lib/graph.c b/lib/graph.c index ba7314fb25..b58f966a1b 100644 --- a/lib/graph.c +++ b/lib/graph.c @@ -36,6 +36,7 @@ struct graph *graph_new(void) } void graph_delete_graph(struct graph *graph) + __attribute__((no_sanitize("unsigned-integer-overflow"))) { for (unsigned int i = vector_active(graph->nodes); i--; /**/) graph_delete_node(graph, vector_slot(graph->nodes, i)); @@ -75,6 +76,8 @@ static void graph_vector_remove(vector v, unsigned int ix) } void graph_delete_node(struct graph *graph, struct graph_node *node) + __attribute__((no_sanitize("unsigned-integer-overflow"))) + { if (!node) return; @@ -122,6 +125,7 @@ struct graph_node *graph_add_edge(struct graph_node *from, } void graph_remove_edge(struct graph_node *from, struct graph_node *to) + __attribute__((no_sanitize("unsigned-integer-overflow"))) { // remove from from to->from for (unsigned int i = vector_active(to->from); i--; /**/) @@ -138,6 +142,7 @@ void graph_remove_edge(struct graph_node *from, struct graph_node *to) } struct graph_node *graph_find_node(struct graph *graph, void *data) + __attribute__((no_sanitize("unsigned-integer-overflow"))) { struct graph_node *g; @@ -151,6 +156,7 @@ struct graph_node *graph_find_node(struct graph *graph, void *data) } bool graph_has_edge(struct graph_node *from, struct graph_node *to) + __attribute__((no_sanitize("unsigned-integer-overflow"))) { for (unsigned int i = vector_active(from->to); i--; /**/) if (vector_slot(from->to, i) == to) @@ -162,6 +168,7 @@ bool graph_has_edge(struct graph_node *from, struct graph_node *to) static void _graph_dfs(struct graph *graph, struct graph_node *start, vector visited, void (*dfs_cb)(struct graph_node *, void *), void *arg) + __attribute__((no_sanitize("unsigned-integer-overflow"))) { /* check that we have not visited this node */ for (unsigned int i = 0; i < vector_active(visited); i++) { diff --git a/lib/jhash.c b/lib/jhash.c index 0d561ef3a4..4342fbb804 100644 --- a/lib/jhash.c +++ b/lib/jhash.c @@ -60,6 +60,7 @@ * the input key. */ uint32_t jhash(const void *key, uint32_t length, uint32_t initval) + __attribute__((no_sanitize("unsigned-integer-overflow"))) { uint32_t a, b, c, len; const uint8_t *k = key; @@ -166,6 +167,7 @@ uint32_t jhash2(const uint32_t *k, uint32_t length, uint32_t initval) * done at the end is not done here. */ uint32_t jhash_3words(uint32_t a, uint32_t b, uint32_t c, uint32_t initval) + __attribute__((no_sanitize("unsigned-integer-overflow"))) { a += JHASH_GOLDEN_RATIO; b += JHASH_GOLDEN_RATIO; diff --git a/lib/prefix.c b/lib/prefix.c index df753fe10b..d8a9b1bd1a 100644 --- a/lib/prefix.c +++ b/lib/prefix.c @@ -663,7 +663,8 @@ void masklen2ip(const int masklen, struct in_addr *netmask) * has defined behaviour for << 32 (or has a 64-bit left shift) */ if (sizeof(unsigned long long) > 4) - netmask->s_addr = htonl(0xffffffffULL << (32 - masklen)); + netmask->s_addr = + htonl((uint32_t)(0xffffffffULL << (32 - masklen))); else netmask->s_addr = htonl(masklen ? 0xffffffffU << (32 - masklen) : 0); diff --git a/pimd/pim_iface.h b/pimd/pim_iface.h index 55c278d6e2..bd35434614 100644 --- a/pimd/pim_iface.h +++ b/pimd/pim_iface.h @@ -46,17 +46,24 @@ #define PIM_IF_TEST_PIM_CAN_DISABLE_JOIN_SUPPRESSION(options) \ (PIM_IF_MASK_PIM_CAN_DISABLE_JOIN_SUPPRESSION & (options)) -#define PIM_IF_DO_PIM(options) ((options) |= PIM_IF_MASK_PIM) -#define PIM_IF_DO_IGMP(options) ((options) |= PIM_IF_MASK_IGMP) -#define PIM_IF_DO_IGMP_LISTEN_ALLROUTERS(options) ((options) |= PIM_IF_MASK_IGMP_LISTEN_ALLROUTERS) +#define PIM_IF_DO_PIM(options) ((options) |= (typeof((options)))PIM_IF_MASK_PIM) +#define PIM_IF_DO_IGMP(options) \ + ((options) |= (typeof((options)))PIM_IF_MASK_IGMP) +#define PIM_IF_DO_IGMP_LISTEN_ALLROUTERS(options) \ + ((options) |= (typeof((options)))PIM_IF_MASK_IGMP_LISTEN_ALLROUTERS) #define PIM_IF_DO_PIM_CAN_DISABLE_JOIN_SUPPRESSION(options) \ - ((options) |= PIM_IF_MASK_PIM_CAN_DISABLE_JOIN_SUPPRESSION) - -#define PIM_IF_DONT_PIM(options) ((options) &= ~PIM_IF_MASK_PIM) -#define PIM_IF_DONT_IGMP(options) ((options) &= ~PIM_IF_MASK_IGMP) -#define PIM_IF_DONT_IGMP_LISTEN_ALLROUTERS(options) ((options) &= ~PIM_IF_MASK_IGMP_LISTEN_ALLROUTERS) + ((options) |= \ + (typeof((options)))PIM_IF_MASK_PIM_CAN_DISABLE_JOIN_SUPPRESSION) + +#define PIM_IF_DONT_PIM(options) \ + ((options) &= (typeof((options))) ~PIM_IF_MASK_PIM) +#define PIM_IF_DONT_IGMP(options) \ + ((options) &= (typeof((options))) ~PIM_IF_MASK_IGMP) +#define PIM_IF_DONT_IGMP_LISTEN_ALLROUTERS(options) \ + ((options) &= (typeof((options))) ~PIM_IF_MASK_IGMP_LISTEN_ALLROUTERS) #define PIM_IF_DONT_PIM_CAN_DISABLE_JOIN_SUPPRESSION(options) \ - ((options) &= ~PIM_IF_MASK_PIM_CAN_DISABLE_JOIN_SUPPRESSION) + ((options) &= \ + (typeof((options))) ~PIM_IF_MASK_PIM_CAN_DISABLE_JOIN_SUPPRESSION) #define PIM_I_am_DR(pim_ifp) (pim_ifp)->pim_dr_addr.s_addr == (pim_ifp)->primary_address.s_addr #define PIM_I_am_DualActive(pim_ifp) (pim_ifp)->activeactive == true diff --git a/pimd/pim_ifchannel.h b/pimd/pim_ifchannel.h index 52f02a660b..b3b2af1a2f 100644 --- a/pimd/pim_ifchannel.h +++ b/pimd/pim_ifchannel.h @@ -46,30 +46,37 @@ enum pim_ifjoin_state { */ #define PIM_IF_FLAG_MASK_COULD_ASSERT (1 << 0) #define PIM_IF_FLAG_TEST_COULD_ASSERT(flags) ((flags) & PIM_IF_FLAG_MASK_COULD_ASSERT) -#define PIM_IF_FLAG_SET_COULD_ASSERT(flags) ((flags) |= PIM_IF_FLAG_MASK_COULD_ASSERT) -#define PIM_IF_FLAG_UNSET_COULD_ASSERT(flags) ((flags) &= ~PIM_IF_FLAG_MASK_COULD_ASSERT) +#define PIM_IF_FLAG_SET_COULD_ASSERT(flags) \ + ((flags) |= (typeof((flags)))PIM_IF_FLAG_MASK_COULD_ASSERT) +#define PIM_IF_FLAG_UNSET_COULD_ASSERT(flags) \ + ((flags) &= (typeof((flags))) ~PIM_IF_FLAG_MASK_COULD_ASSERT) /* Flag to detect change in AssertTrackingDesired(S,G,I) */ #define PIM_IF_FLAG_MASK_ASSERT_TRACKING_DESIRED (1 << 1) #define PIM_IF_FLAG_TEST_ASSERT_TRACKING_DESIRED(flags) ((flags) & PIM_IF_FLAG_MASK_ASSERT_TRACKING_DESIRED) -#define PIM_IF_FLAG_SET_ASSERT_TRACKING_DESIRED(flags) ((flags) |= PIM_IF_FLAG_MASK_ASSERT_TRACKING_DESIRED) -#define PIM_IF_FLAG_UNSET_ASSERT_TRACKING_DESIRED(flags) ((flags) &= ~PIM_IF_FLAG_MASK_ASSERT_TRACKING_DESIRED) +#define PIM_IF_FLAG_SET_ASSERT_TRACKING_DESIRED(flags) \ + ((flags) |= (typeof((flags)))PIM_IF_FLAG_MASK_ASSERT_TRACKING_DESIRED) +#define PIM_IF_FLAG_UNSET_ASSERT_TRACKING_DESIRED(flags) \ + ((flags) &= (typeof((flags))) ~PIM_IF_FLAG_MASK_ASSERT_TRACKING_DESIRED) /* * Flag to tell us if the ifchannel is (S,G,rpt) */ #define PIM_IF_FLAG_MASK_S_G_RPT (1 << 2) #define PIM_IF_FLAG_TEST_S_G_RPT(flags) ((flags) & PIM_IF_FLAG_MASK_S_G_RPT) -#define PIM_IF_FLAG_SET_S_G_RPT(flags) ((flags) |= PIM_IF_FLAG_MASK_S_G_RPT) -#define PIM_IF_FLAG_UNSET_S_G_RPT(flags) ((flags) &= ~PIM_IF_FLAG_MASK_S_G_RPT) +#define PIM_IF_FLAG_SET_S_G_RPT(flags) \ + ((flags) |= (typeof((flags)))PIM_IF_FLAG_MASK_S_G_RPT) +#define PIM_IF_FLAG_UNSET_S_G_RPT(flags) \ + ((flags) &= (typeof((flags))) ~PIM_IF_FLAG_MASK_S_G_RPT) /* * Flag to tell us if the ifchannel is proto PIM */ #define PIM_IF_FLAG_MASK_PROTO_PIM (1 << 3) #define PIM_IF_FLAG_TEST_PROTO_PIM(flags) ((flags)&PIM_IF_FLAG_MASK_PROTO_PIM) -#define PIM_IF_FLAG_SET_PROTO_PIM(flags) ((flags) |= PIM_IF_FLAG_MASK_PROTO_PIM) +#define PIM_IF_FLAG_SET_PROTO_PIM(flags) \ + ((flags) |= (typeof((flags)))PIM_IF_FLAG_MASK_PROTO_PIM) #define PIM_IF_FLAG_UNSET_PROTO_PIM(flags) \ ((flags) &= ~PIM_IF_FLAG_MASK_PROTO_PIM) /* @@ -78,9 +85,9 @@ enum pim_ifjoin_state { #define PIM_IF_FLAG_MASK_PROTO_IGMP (1 << 4) #define PIM_IF_FLAG_TEST_PROTO_IGMP(flags) ((flags)&PIM_IF_FLAG_MASK_PROTO_IGMP) #define PIM_IF_FLAG_SET_PROTO_IGMP(flags) \ - ((flags) |= PIM_IF_FLAG_MASK_PROTO_IGMP) + ((flags) |= (typeof((flags)))PIM_IF_FLAG_MASK_PROTO_IGMP) #define PIM_IF_FLAG_UNSET_PROTO_IGMP(flags) \ - ((flags) &= ~PIM_IF_FLAG_MASK_PROTO_IGMP) + ((flags) &= (typeof((flags))) ~PIM_IF_FLAG_MASK_PROTO_IGMP) /* Per-interface (S,G) state */ diff --git a/pimd/pim_instance.h b/pimd/pim_instance.h index 68c5b9167b..9b92278ae3 100644 --- a/pimd/pim_instance.h +++ b/pimd/pim_instance.h @@ -120,7 +120,7 @@ struct pim_router { struct in_addr anycast_vtep_ip; struct in_addr local_vtep_ip; struct pim_mlag_stats mlag_stats; - enum pim_mlag_flags mlag_flags; + uint8_t mlag_flags; char peerlink_rif[INTERFACE_NAMSIZ]; struct interface *peerlink_rif_p; }; diff --git a/pimd/pim_mlag.c b/pimd/pim_mlag.c index 55d6e7e0fd..dc0f2f4d7b 100644 --- a/pimd/pim_mlag.c +++ b/pimd/pim_mlag.c @@ -899,10 +899,9 @@ int pim_zebra_mlag_process_up(ZAPI_CALLBACK_ARGS) static void pim_mlag_param_reset(void) { /* reset the cached params and stats */ - router->mlag_flags &= ~(PIM_MLAGF_STATUS_RXED | - PIM_MLAGF_LOCAL_CONN_UP | - PIM_MLAGF_PEER_CONN_UP | - PIM_MLAGF_PEER_ZEBRA_UP); + router->mlag_flags &= + (uint8_t) ~(PIM_MLAGF_STATUS_RXED | PIM_MLAGF_LOCAL_CONN_UP + | PIM_MLAGF_PEER_CONN_UP | PIM_MLAGF_PEER_ZEBRA_UP); router->local_vtep_ip.s_addr = INADDR_ANY; router->anycast_vtep_ip.s_addr = INADDR_ANY; router->mlag_role = MLAG_ROLE_NONE; diff --git a/pimd/pim_tlv.h b/pimd/pim_tlv.h index ef764656d3..f66cf72667 100644 --- a/pimd/pim_tlv.h +++ b/pimd/pim_tlv.h @@ -44,8 +44,10 @@ typedef uint32_t pim_hello_options; #define PIM_RPT_BIT_MASK (1 << 0) #define PIM_WILDCARD_BIT_MASK (1 << 1) -#define PIM_OPTION_SET(options, option_mask) ((options) |= (option_mask)) -#define PIM_OPTION_UNSET(options, option_mask) ((options) &= ~(option_mask)) +#define PIM_OPTION_SET(options, option_mask) \ + ((options) |= (typeof((options)))(option_mask)) +#define PIM_OPTION_UNSET(options, option_mask) \ + ((options) &= (typeof((options))) ~(option_mask)) #define PIM_OPTION_IS_SET(options, option_mask) ((options) & (option_mask)) #define PIM_TLV_GET_UINT16(buf) \ diff --git a/pimd/pim_upstream.h b/pimd/pim_upstream.h index ea3b564f8a..92cc8b9695 100644 --- a/pimd/pim_upstream.h +++ b/pimd/pim_upstream.h @@ -122,50 +122,96 @@ #define PIM_UPSTREAM_FLAG_TEST_CAN_BE_LHR(flags) ((flags) & (PIM_UPSTREAM_FLAG_MASK_SRC_IGMP | PIM_UPSTREAM_FLAG_MASK_SRC_VXLAN_TERM)) #define PIM_UPSTREAM_FLAG_TEST_MLAG_INTERFACE(flags) ((flags)&PIM_UPSTREAM_FLAG_MASK_MLAG_INTERFACE) -#define PIM_UPSTREAM_FLAG_SET_DR_JOIN_DESIRED(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_DR_JOIN_DESIRED) -#define PIM_UPSTREAM_FLAG_SET_DR_JOIN_DESIRED_UPDATED(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_DR_JOIN_DESIRED_UPDATED) -#define PIM_UPSTREAM_FLAG_SET_FHR(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_FHR) -#define PIM_UPSTREAM_FLAG_SET_SRC_IGMP(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_SRC_IGMP) -#define PIM_UPSTREAM_FLAG_SET_SRC_PIM(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_SRC_PIM) -#define PIM_UPSTREAM_FLAG_SET_SRC_STREAM(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_SRC_STREAM) -#define PIM_UPSTREAM_FLAG_SET_SRC_MSDP(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_SRC_MSDP) -#define PIM_UPSTREAM_FLAG_SET_SEND_SG_RPT_PRUNE(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_SEND_SG_RPT_PRUNE) -#define PIM_UPSTREAM_FLAG_SET_SRC_LHR(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_SRC_LHR) -#define PIM_UPSTREAM_FLAG_SET_DISABLE_KAT_EXPIRY(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_DISABLE_KAT_EXPIRY) -#define PIM_UPSTREAM_FLAG_SET_STATIC_IIF(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_STATIC_IIF) -#define PIM_UPSTREAM_FLAG_SET_ALLOW_IIF_IN_OIL(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_ALLOW_IIF_IN_OIL) -#define PIM_UPSTREAM_FLAG_SET_NO_PIMREG_DATA(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_NO_PIMREG_DATA) -#define PIM_UPSTREAM_FLAG_SET_FORCE_PIMREG(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_FORCE_PIMREG) -#define PIM_UPSTREAM_FLAG_SET_SRC_VXLAN_ORIG(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_SRC_VXLAN_ORIG) -#define PIM_UPSTREAM_FLAG_SET_SRC_VXLAN_TERM(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_SRC_VXLAN_TERM) -#define PIM_UPSTREAM_FLAG_SET_MLAG_VXLAN(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_MLAG_VXLAN) -#define PIM_UPSTREAM_FLAG_SET_MLAG_NON_DF(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_MLAG_NON_DF) -#define PIM_UPSTREAM_FLAG_SET_MLAG_PEER(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_MLAG_PEER) -#define PIM_UPSTREAM_FLAG_SET_USE_RPT(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_USE_RPT) -#define PIM_UPSTREAM_FLAG_SET_MLAG_INTERFACE(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_MLAG_INTERFACE) - -#define PIM_UPSTREAM_FLAG_UNSET_DR_JOIN_DESIRED(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_DR_JOIN_DESIRED) -#define PIM_UPSTREAM_FLAG_UNSET_DR_JOIN_DESIRED_UPDATED(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_DR_JOIN_DESIRED_UPDATED) -#define PIM_UPSTREAM_FLAG_UNSET_FHR(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_FHR) -#define PIM_UPSTREAM_FLAG_UNSET_SRC_IGMP(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_SRC_IGMP) -#define PIM_UPSTREAM_FLAG_UNSET_SRC_PIM(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_SRC_PIM) -#define PIM_UPSTREAM_FLAG_UNSET_SRC_STREAM(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_SRC_STREAM) -#define PIM_UPSTREAM_FLAG_UNSET_SRC_MSDP(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_SRC_MSDP) -#define PIM_UPSTREAM_FLAG_UNSET_SEND_SG_RPT_PRUNE(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_SEND_SG_RPT_PRUNE) -#define PIM_UPSTREAM_FLAG_UNSET_SRC_LHR(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_SRC_LHR) -#define PIM_UPSTREAM_FLAG_UNSET_DISABLE_KAT_EXPIRY(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_DISABLE_KAT_EXPIRY) -#define PIM_UPSTREAM_FLAG_UNSET_STATIC_IIF(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_STATIC_IIF) -#define PIM_UPSTREAM_FLAG_UNSET_ALLOW_IIF_IN_OIL(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_ALLOW_IIF_IN_OIL) -#define PIM_UPSTREAM_FLAG_UNSET_NO_PIMREG_DATA(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_NO_PIMREG_DATA) -#define PIM_UPSTREAM_FLAG_UNSET_FORCE_PIMREG(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_FORCE_PIMREG) -#define PIM_UPSTREAM_FLAG_UNSET_SRC_VXLAN_ORIG(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_SRC_VXLAN_ORIG) -#define PIM_UPSTREAM_FLAG_UNSET_SRC_VXLAN_TERM(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_SRC_VXLAN_TERM) -#define PIM_UPSTREAM_FLAG_UNSET_MLAG_VXLAN(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_MLAG_VXLAN) -#define PIM_UPSTREAM_FLAG_UNSET_MLAG_NON_DF(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_MLAG_NON_DF) -#define PIM_UPSTREAM_FLAG_UNSET_MLAG_PEER(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_MLAG_PEER) -#define PIM_UPSTREAM_FLAG_UNSET_SRC_NOCACHE(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_SRC_NOCACHE) -#define PIM_UPSTREAM_FLAG_UNSET_USE_RPT(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_USE_RPT) -#define PIM_UPSTREAM_FLAG_UNSET_MLAG_INTERFACE(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_MLAG_INTERFACE) +#define PIM_UPSTREAM_FLAG_SET_DR_JOIN_DESIRED(flags) \ + ((flags) |= (typeof((flags)))PIM_UPSTREAM_FLAG_MASK_DR_JOIN_DESIRED) +#define PIM_UPSTREAM_FLAG_SET_DR_JOIN_DESIRED_UPDATED(flags) \ + ((flags) |= \ + (typeof((flags)))PIM_UPSTREAM_FLAG_MASK_DR_JOIN_DESIRED_UPDATED) +#define PIM_UPSTREAM_FLAG_SET_FHR(flags) \ + ((flags) |= (typeof((flags)))PIM_UPSTREAM_FLAG_MASK_FHR) +#define PIM_UPSTREAM_FLAG_SET_SRC_IGMP(flags) \ + ((flags) |= (typeof((flags)))PIM_UPSTREAM_FLAG_MASK_SRC_IGMP) +#define PIM_UPSTREAM_FLAG_SET_SRC_PIM(flags) \ + ((flags) |= (typeof((flags)))PIM_UPSTREAM_FLAG_MASK_SRC_PIM) +#define PIM_UPSTREAM_FLAG_SET_SRC_STREAM(flags) \ + ((flags) |= (typeof((flags)))PIM_UPSTREAM_FLAG_MASK_SRC_STREAM) +#define PIM_UPSTREAM_FLAG_SET_SRC_MSDP(flags) \ + ((flags) |= (typeof((flags)))PIM_UPSTREAM_FLAG_MASK_SRC_MSDP) +#define PIM_UPSTREAM_FLAG_SET_SEND_SG_RPT_PRUNE(flags) \ + ((flags) |= (typeof((flags)))PIM_UPSTREAM_FLAG_MASK_SEND_SG_RPT_PRUNE) +#define PIM_UPSTREAM_FLAG_SET_SRC_LHR(flags) \ + ((flags) |= (typeof((flags)))PIM_UPSTREAM_FLAG_MASK_SRC_LHR) +#define PIM_UPSTREAM_FLAG_SET_DISABLE_KAT_EXPIRY(flags) \ + ((flags) |= (typeof((flags)))PIM_UPSTREAM_FLAG_MASK_DISABLE_KAT_EXPIRY) +#define PIM_UPSTREAM_FLAG_SET_STATIC_IIF(flags) \ + ((flags) |= (typeof((flags)))PIM_UPSTREAM_FLAG_MASK_STATIC_IIF) +#define PIM_UPSTREAM_FLAG_SET_ALLOW_IIF_IN_OIL(flags) \ + ((flags) |= (typeof((flags)))PIM_UPSTREAM_FLAG_MASK_ALLOW_IIF_IN_OIL) +#define PIM_UPSTREAM_FLAG_SET_NO_PIMREG_DATA(flags) \ + ((flags) |= (typeof((flags)))PIM_UPSTREAM_FLAG_MASK_NO_PIMREG_DATA) +#define PIM_UPSTREAM_FLAG_SET_FORCE_PIMREG(flags) \ + ((flags) |= (typeof((flags)))PIM_UPSTREAM_FLAG_MASK_FORCE_PIMREG) +#define PIM_UPSTREAM_FLAG_SET_SRC_VXLAN_ORIG(flags) \ + ((flags) |= (typeof((flags)))PIM_UPSTREAM_FLAG_MASK_SRC_VXLAN_ORIG) +#define PIM_UPSTREAM_FLAG_SET_SRC_VXLAN_TERM(flags) \ + ((flags) |= (typeof((flags)))PIM_UPSTREAM_FLAG_MASK_SRC_VXLAN_TERM) +#define PIM_UPSTREAM_FLAG_SET_MLAG_VXLAN(flags) \ + ((flags) |= (typeof((flags)))PIM_UPSTREAM_FLAG_MASK_MLAG_VXLAN) +#define PIM_UPSTREAM_FLAG_SET_MLAG_NON_DF(flags) \ + ((flags) |= (typeof((flags)))PIM_UPSTREAM_FLAG_MASK_MLAG_NON_DF) +#define PIM_UPSTREAM_FLAG_SET_MLAG_PEER(flags) \ + ((flags) |= (typeof((flags)))PIM_UPSTREAM_FLAG_MASK_MLAG_PEER) +#define PIM_UPSTREAM_FLAG_SET_USE_RPT(flags) \ + ((flags) |= (typeof((flags)))PIM_UPSTREAM_FLAG_MASK_USE_RPT) +#define PIM_UPSTREAM_FLAG_SET_MLAG_INTERFACE(flags) \ + ((flags) |= (typeof((flags)))PIM_UPSTREAM_FLAG_MASK_MLAG_INTERFACE) + +#define PIM_UPSTREAM_FLAG_UNSET_DR_JOIN_DESIRED(flags) \ + ((flags) &= (typeof((flags))) ~PIM_UPSTREAM_FLAG_MASK_DR_JOIN_DESIRED) +#define PIM_UPSTREAM_FLAG_UNSET_DR_JOIN_DESIRED_UPDATED(flags) \ + ((flags) &= \ + (typeof((flags))) ~PIM_UPSTREAM_FLAG_MASK_DR_JOIN_DESIRED_UPDATED) +#define PIM_UPSTREAM_FLAG_UNSET_FHR(flags) \ + ((flags) &= (typeof((flags))) ~PIM_UPSTREAM_FLAG_MASK_FHR) +#define PIM_UPSTREAM_FLAG_UNSET_SRC_IGMP(flags) \ + ((flags) &= (typeof((flags))) ~PIM_UPSTREAM_FLAG_MASK_SRC_IGMP) +#define PIM_UPSTREAM_FLAG_UNSET_SRC_PIM(flags) \ + ((flags) &= (typeof((flags))) ~PIM_UPSTREAM_FLAG_MASK_SRC_PIM) +#define PIM_UPSTREAM_FLAG_UNSET_SRC_STREAM(flags) \ + ((flags) &= (typeof((flags))) ~PIM_UPSTREAM_FLAG_MASK_SRC_STREAM) +#define PIM_UPSTREAM_FLAG_UNSET_SRC_MSDP(flags) \ + ((flags) &= (typeof((flags))) ~PIM_UPSTREAM_FLAG_MASK_SRC_MSDP) +#define PIM_UPSTREAM_FLAG_UNSET_SEND_SG_RPT_PRUNE(flags) \ + ((flags) &= (typeof((flags))) ~PIM_UPSTREAM_FLAG_MASK_SEND_SG_RPT_PRUNE) +#define PIM_UPSTREAM_FLAG_UNSET_SRC_LHR(flags) \ + ((flags) &= (typeof((flags))) ~PIM_UPSTREAM_FLAG_MASK_SRC_LHR) +#define PIM_UPSTREAM_FLAG_UNSET_DISABLE_KAT_EXPIRY(flags) \ + ((flags) &= \ + (typeof((flags))) ~PIM_UPSTREAM_FLAG_MASK_DISABLE_KAT_EXPIRY) +#define PIM_UPSTREAM_FLAG_UNSET_STATIC_IIF(flags) \ + ((flags) &= (typeof((flags))) ~PIM_UPSTREAM_FLAG_MASK_STATIC_IIF) +#define PIM_UPSTREAM_FLAG_UNSET_ALLOW_IIF_IN_OIL(flags) \ + ((flags) &= (typeof((flags))) ~PIM_UPSTREAM_FLAG_MASK_ALLOW_IIF_IN_OIL) +#define PIM_UPSTREAM_FLAG_UNSET_NO_PIMREG_DATA(flags) \ + ((flags) &= (typeof((flags))) ~PIM_UPSTREAM_FLAG_MASK_NO_PIMREG_DATA) +#define PIM_UPSTREAM_FLAG_UNSET_FORCE_PIMREG(flags) \ + ((flags) &= (typeof((flags))) ~PIM_UPSTREAM_FLAG_MASK_FORCE_PIMREG) +#define PIM_UPSTREAM_FLAG_UNSET_SRC_VXLAN_ORIG(flags) \ + ((flags) &= (typeof((flags))) ~PIM_UPSTREAM_FLAG_MASK_SRC_VXLAN_ORIG) +#define PIM_UPSTREAM_FLAG_UNSET_SRC_VXLAN_TERM(flags) \ + ((flags) &= (typeof((flags))) ~PIM_UPSTREAM_FLAG_MASK_SRC_VXLAN_TERM) +#define PIM_UPSTREAM_FLAG_UNSET_MLAG_VXLAN(flags) \ + ((flags) &= (typeof((flags))) ~PIM_UPSTREAM_FLAG_MASK_MLAG_VXLAN) +#define PIM_UPSTREAM_FLAG_UNSET_MLAG_NON_DF(flags) \ + ((flags) &= (typeof((flags))) ~PIM_UPSTREAM_FLAG_MASK_MLAG_NON_DF) +#define PIM_UPSTREAM_FLAG_UNSET_MLAG_PEER(flags) \ + ((flags) &= (typeof((flags))) ~PIM_UPSTREAM_FLAG_MASK_MLAG_PEER) +#define PIM_UPSTREAM_FLAG_UNSET_SRC_NOCACHE(flags) \ + ((flags) &= (typeof((flags))) ~PIM_UPSTREAM_FLAG_MASK_SRC_NOCACHE) +#define PIM_UPSTREAM_FLAG_UNSET_USE_RPT(flags) \ + ((flags) &= (typeof((flags))) ~PIM_UPSTREAM_FLAG_MASK_USE_RPT) +#define PIM_UPSTREAM_FLAG_UNSET_MLAG_INTERFACE(flags) \ + ((flags) &= (typeof((flags))) ~PIM_UPSTREAM_FLAG_MASK_MLAG_INTERFACE) /* The RPF cost is incremented by 10 if the RPF interface is the peerlink-rif. * This is used to force the MLAG switch with the lowest cost to the RPF