nf_defrag modules for ipv4 and ipv6 export an empty stub function. Any module that needs the defragmentation hooks registered simply 'calls' this empty function to create a phony module dependency -- modprobe will then load the defrag module too. This extends netfilter ipv4/ipv6 defragmentation modules to delay the hook registration until the functionality is requested within a network namespace instead of module load time for all namespaces. Hooks are only un-registered on module unload or when a namespace that used such defrag functionality exits. We have to use struct net for this as the register hooks can be called before netns initialization here from the ipv4/ipv6 conntrack module init path. There is no unregister functionality support, defrag will always be active once it was requested inside a net namespace. The reason is that defrag has impact on nft and iptables rulesets (without defrag we might see framents).
Showing the changes to include/net (3 of 9 files). Show all
Unified · Split
| @@ -1,6 +1,7 @@ | |||
| 1 | #ifndef _NF_DEFRAG_IPV4_H | 1 | #ifndef _NF_DEFRAG_IPV4_H |
| 2 | #define _NF_DEFRAG_IPV4_H | 2 | #define _NF_DEFRAG_IPV4_H |
| 3 | 3 | ||
| 4 | void nf_defrag_ipv4_enable(void); | 4 | struct net; |
| 5 | int nf_defrag_ipv4_enable(struct net *); | ||
| 5 | 6 | ||
| 6 | #endif /* _NF_DEFRAG_IPV4_H */ | 7 | #endif /* _NF_DEFRAG_IPV4_H */ |
| @@ -1,7 +1,8 @@ | |||
| 1 | #ifndef _NF_DEFRAG_IPV6_H | 1 | #ifndef _NF_DEFRAG_IPV6_H |
| 2 | #define _NF_DEFRAG_IPV6_H | 2 | #define _NF_DEFRAG_IPV6_H |
| 3 | 3 | ||
| 4 | void nf_defrag_ipv6_enable(void); | 4 | struct net; |
| 5 | int nf_defrag_ipv6_enable(struct net *); | ||
| 5 | 6 | ||
| 6 | int nf_ct_frag6_init(void); | 7 | int nf_ct_frag6_init(void); |
| 7 | void nf_ct_frag6_cleanup(void); | 8 | void nf_ct_frag6_cleanup(void); |
| @@ -17,5 +17,11 @@ struct netns_nf { · 16 unmodified lines | |||
| 17 | struct ctl_table_header *nf_log_dir_header; | 17 | struct ctl_table_header *nf_log_dir_header; |
| 18 | #endif | 18 | #endif |
| 19 | struct nf_hook_entry __rcu *hooks[NFPROTO_NUMPROTO][NF_MAX_HOOKS]; | 19 | struct nf_hook_entry __rcu *hooks[NFPROTO_NUMPROTO][NF_MAX_HOOKS]; |
| 20 | #if IS_ENABLED(CONFIG_NF_DEFRAG_IPV4) | ||
| 21 | bool defrag_ipv4; | ||
| 22 | #endif | ||
| 23 | #if IS_ENABLED(CONFIG_NF_DEFRAG_IPV6) | ||
| 24 | bool defrag_ipv6; | ||
| 25 | #endif | ||
| 20 | }; | 26 | }; |
| 21 | #endif | 27 | #endif |