]> git.puffer.fish Git - mirror/frr.git/commitdiff
zebra: add xxxNETCONF messages to the netlink BPF filter
authorMark Stapp <mstapp@nvidia.com>
Mon, 18 Oct 2021 15:55:24 +0000 (11:55 -0400)
committerMark Stapp <mstapp@nvidia.com>
Fri, 25 Feb 2022 14:53:02 +0000 (09:53 -0500)
Allow self-produced xxxNETCONF netlink messages through the BPF
filter we use. Just like address-configuration actions, we'll
process NETCONF changes in one path, whether the changes were
generated by zebra or by something else in the host OS.

Signed-off-by: Mark Stapp <mstapp@nvidia.com>
zebra/kernel_netlink.c

index 0cd69e6c2c9241a2a26a40c33cf511a74521955b..8e472b4728498cf6ce17e2920b0e08d70ac366ec 100644 (file)
@@ -38,7 +38,6 @@
 #include "lib_errors.h"
 #include "hash.h"
 
-//#include "zebra/zserv.h"
 #include "zebra/zebra_router.h"
 #include "zebra/zebra_ns.h"
 #include "zebra/zebra_vrf.h"
@@ -414,7 +413,12 @@ static int dplane_netlink_information_fetch(struct nlmsghdr *h, ns_id_t ns_id,
        case RTM_DELADDR:
                return netlink_interface_addr_dplane(h, ns_id, startup);
 
-       /* TODO */
+       case RTM_NEWNETCONF:
+       case RTM_DELNETCONF:
+               return netlink_netconf_change(h, ns_id, startup);
+
+       /* TODO -- other messages for the dplane socket and pthread */
+
        case RTM_NEWLINK:
        case RTM_DELLINK:
 
@@ -463,8 +467,8 @@ int kernel_dplane_read(struct zebra_dplane_info *info)
  * then the normal course of operations).  We are intentionally
  * allowing some messages from ourselves through
  * ( I'm looking at you Interface based netlink messages )
- * so that we only had to write one way to handle incoming
- * address add/delete changes.
+ * so that we only have to write one way to handle incoming
+ * address add/delete and xxxNETCONF changes.
  */
 static void netlink_install_filter(int sock, uint32_t pid, uint32_t dplane_pid)
 {
@@ -480,7 +484,8 @@ static void netlink_install_filter(int sock, uint32_t pid, uint32_t dplane_pid)
                 *   if (nlmsg_pid == pid ||
                 *       nlmsg_pid == dplane_pid) {
                 *       if (the incoming nlmsg_type ==
-                *           RTM_NEWADDR | RTM_DELADDR)
+                *           RTM_NEWADDR || RTM_DELADDR || RTM_NEWNETCONF ||
+                *           RTM_DELNETCONF)
                 *           keep this message
                 *       else
                 *           skip this message
@@ -499,7 +504,7 @@ static void netlink_install_filter(int sock, uint32_t pid, uint32_t dplane_pid)
                /*
                 * 2: Compare to dplane pid
                 */
-               BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, htonl(dplane_pid), 0, 4),
+               BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, htonl(dplane_pid), 0, 6),
                /*
                 * 3: Load the nlmsg_type into BPF register
                 */
@@ -508,17 +513,27 @@ static void netlink_install_filter(int sock, uint32_t pid, uint32_t dplane_pid)
                /*
                 * 4: Compare to RTM_NEWADDR
                 */
-               BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, htons(RTM_NEWADDR), 2, 0),
+               BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, htons(RTM_NEWADDR), 4, 0),
                /*
                 * 5: Compare to RTM_DELADDR
                 */
-               BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, htons(RTM_DELADDR), 1, 0),
+               BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, htons(RTM_DELADDR), 3, 0),
+               /*
+                * 6: Compare to RTM_NEWNETCONF
+                */
+               BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, htons(RTM_NEWNETCONF), 2,
+                        0),
+               /*
+                * 7: Compare to RTM_DELNETCONF
+                */
+               BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, htons(RTM_DELNETCONF), 1,
+                        0),
                /*
-                * 6: This is the end state of we want to skip the
+                * 8: This is the end state of we want to skip the
                 *    message
                 */
                BPF_STMT(BPF_RET | BPF_K, 0),
-               /* 7: This is the end state of we want to keep
+               /* 9: This is the end state of we want to keep
                 *     the message
                 */
                BPF_STMT(BPF_RET | BPF_K, 0xffff),