diff options
| author | Mark Stapp <mstapp@nvidia.com> | 2021-10-18 11:55:24 -0400 | 
|---|---|---|
| committer | Mark Stapp <mstapp@nvidia.com> | 2022-02-25 09:53:02 -0500 | 
| commit | 9f3f1486c8add83ee71a7dd73096e77dfd357a1f (patch) | |
| tree | 4f642a081ff195e63a6025554232582d8b0a20ea /zebra/kernel_netlink.c | |
| parent | 777f96503e434f3d466ecf97b374cd10ed27d944 (diff) | |
zebra: add xxxNETCONF messages to the netlink BPF filter
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>
Diffstat (limited to 'zebra/kernel_netlink.c')
| -rw-r--r-- | zebra/kernel_netlink.c | 35 | 
1 files changed, 25 insertions, 10 deletions
diff --git a/zebra/kernel_netlink.c b/zebra/kernel_netlink.c index 0cd69e6c2c..8e472b4728 100644 --- a/zebra/kernel_netlink.c +++ b/zebra/kernel_netlink.c @@ -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),  | 
