]> git.puffer.fish Git - matthieu/frr.git/commitdiff
lib, pimd: make implicit type conversions explicit
authorQuentin Young <qlyoung@cumulusnetworks.com>
Tue, 14 Apr 2020 23:22:43 +0000 (19:22 -0400)
committerQuentin Young <qlyoung@nvidia.com>
Mon, 15 Nov 2021 22:12:33 +0000 (17:12 -0500)
In order to find meaningful truncations, overflows and underflows, we
gotta get rid of all the intentional implicit ones

Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
lib/checksum.c
lib/graph.c
lib/jhash.c
lib/prefix.c
pimd/pim_iface.h
pimd/pim_ifchannel.h
pimd/pim_instance.h
pimd/pim_mlag.c
pimd/pim_tlv.h
pimd/pim_upstream.h

index 34733700417f1f3020df37dc71aab0e1957129ff..a0d776400c31d93df51b3ae88a02d3e4a36ab162 100644 (file)
@@ -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;
index ba7314fb25b11684553145fae07d51e6a31f0b9e..b58f966a1b0efc536e65d9fed4596a45fb7f77d1 100644 (file)
@@ -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++) {
index 0d561ef3a4f25db2b60725e9fdb63a0ff2b6af45..4342fbb804361a43d928cc1a612ccec0a52380e1 100644 (file)
@@ -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;
index df753fe10b812a94a11f0eb27be0ccd897581db0..d8a9b1bd1a1b7e6c8e1a642f11ea134c36c4b21b 100644 (file)
@@ -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);
index 55c278d6e2381f970032707dfadee4e5d54403fb..bd35434614021feda64761f80ada95451268c052 100644 (file)
 #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
index 52f02a660b7e4681a63863c76e2a8d601d335524..b3b2af1a2f40399d8e9bfdcc01154893c9c58b53 100644 (file)
@@ -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
 */
index 68c5b9167bb0c7cc2ca6f8576ea8e94cb2bf5f82..9b92278ae3e2e04e04fa89f120e402c7693767be 100644 (file)
@@ -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;
 };
index 55d6e7e0fd5d7bc2f1c2015b640ea9d49370ceba..dc0f2f4d7bfed511cf821030af332f05752a26b4 100644 (file)
@@ -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;
index ef764656d3cf10773dc6f0a2effa26f72079627c..f66cf72667bc6aaced76433117c3e28729783215 100644 (file)
@@ -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)                                                \
index ea3b564f8a380dc7679663a82acd781c4a391dde..92cc8b969598aa807bfe3c2384d679dde2b26aa3 100644 (file)
 #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