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 | 1 | #ifndef _NF_DEFRAG_IPV4_H |
| 2 | 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 | 7 | #endif /* _NF_DEFRAG_IPV4_H */ |
| @@ -1,7 +1,8 @@ | ||
| 1 | 1 | #ifndef _NF_DEFRAG_IPV6_H |
| 2 | 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 | 7 | int nf_ct_frag6_init(void); |
| 7 | 8 | void nf_ct_frag6_cleanup(void); |
| @@ -17,5 +17,11 @@ struct netns_nf { · 16 unmodified lines | ||
| 17 | 17 | struct ctl_table_header *nf_log_dir_header; |
| 18 | 18 | #endif |
| 19 | 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 | 27 | #endif |