312-v4.16-netfilter-nf_tables-remove-hooks-from-family-definit.patch 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. From: Pablo Neira Ayuso <pablo@netfilter.org>
  2. Date: Sat, 9 Dec 2017 15:43:17 +0100
  3. Subject: [PATCH] netfilter: nf_tables: remove hooks from family definition
  4. They don't belong to the family definition, move them to the filter
  5. chain type definition instead.
  6. Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
  7. ---
  8. --- a/include/net/netfilter/nf_tables.h
  9. +++ b/include/net/netfilter/nf_tables.h
  10. @@ -878,7 +878,7 @@ enum nft_chain_type {
  11. * @family: address family
  12. * @owner: module owner
  13. * @hook_mask: mask of valid hooks
  14. - * @hooks: hookfn overrides
  15. + * @hooks: array of hook functions
  16. */
  17. struct nf_chain_type {
  18. const char *name;
  19. @@ -972,7 +972,6 @@ enum nft_af_flags {
  20. * @owner: module owner
  21. * @tables: used internally
  22. * @flags: family flags
  23. - * @hooks: hookfn overrides for packet validation
  24. */
  25. struct nft_af_info {
  26. struct list_head list;
  27. @@ -981,7 +980,6 @@ struct nft_af_info {
  28. struct module *owner;
  29. struct list_head tables;
  30. u32 flags;
  31. - nf_hookfn *hooks[NF_MAX_HOOKS];
  32. };
  33. int nft_register_afinfo(struct net *, struct nft_af_info *);
  34. --- a/net/bridge/netfilter/nf_tables_bridge.c
  35. +++ b/net/bridge/netfilter/nf_tables_bridge.c
  36. @@ -46,13 +46,6 @@ static struct nft_af_info nft_af_bridge
  37. .family = NFPROTO_BRIDGE,
  38. .nhooks = NF_BR_NUMHOOKS,
  39. .owner = THIS_MODULE,
  40. - .hooks = {
  41. - [NF_BR_PRE_ROUTING] = nft_do_chain_bridge,
  42. - [NF_BR_LOCAL_IN] = nft_do_chain_bridge,
  43. - [NF_BR_FORWARD] = nft_do_chain_bridge,
  44. - [NF_BR_LOCAL_OUT] = nft_do_chain_bridge,
  45. - [NF_BR_POST_ROUTING] = nft_do_chain_bridge,
  46. - },
  47. };
  48. static int nf_tables_bridge_init_net(struct net *net)
  49. @@ -93,6 +86,13 @@ static const struct nf_chain_type filter
  50. (1 << NF_BR_FORWARD) |
  51. (1 << NF_BR_LOCAL_OUT) |
  52. (1 << NF_BR_POST_ROUTING),
  53. + .hooks = {
  54. + [NF_BR_PRE_ROUTING] = nft_do_chain_bridge,
  55. + [NF_BR_LOCAL_IN] = nft_do_chain_bridge,
  56. + [NF_BR_FORWARD] = nft_do_chain_bridge,
  57. + [NF_BR_LOCAL_OUT] = nft_do_chain_bridge,
  58. + [NF_BR_POST_ROUTING] = nft_do_chain_bridge,
  59. + },
  60. };
  61. static int __init nf_tables_bridge_init(void)
  62. --- a/net/ipv4/netfilter/nf_tables_arp.c
  63. +++ b/net/ipv4/netfilter/nf_tables_arp.c
  64. @@ -31,10 +31,6 @@ static struct nft_af_info nft_af_arp __r
  65. .family = NFPROTO_ARP,
  66. .nhooks = NF_ARP_NUMHOOKS,
  67. .owner = THIS_MODULE,
  68. - .hooks = {
  69. - [NF_ARP_IN] = nft_do_chain_arp,
  70. - [NF_ARP_OUT] = nft_do_chain_arp,
  71. - },
  72. };
  73. static int nf_tables_arp_init_net(struct net *net)
  74. @@ -72,6 +68,10 @@ static const struct nf_chain_type filter
  75. .owner = THIS_MODULE,
  76. .hook_mask = (1 << NF_ARP_IN) |
  77. (1 << NF_ARP_OUT),
  78. + .hooks = {
  79. + [NF_ARP_IN] = nft_do_chain_arp,
  80. + [NF_ARP_OUT] = nft_do_chain_arp,
  81. + },
  82. };
  83. static int __init nf_tables_arp_init(void)
  84. --- a/net/ipv4/netfilter/nf_tables_ipv4.c
  85. +++ b/net/ipv4/netfilter/nf_tables_ipv4.c
  86. @@ -49,13 +49,6 @@ static struct nft_af_info nft_af_ipv4 __
  87. .family = NFPROTO_IPV4,
  88. .nhooks = NF_INET_NUMHOOKS,
  89. .owner = THIS_MODULE,
  90. - .hooks = {
  91. - [NF_INET_LOCAL_IN] = nft_do_chain_ipv4,
  92. - [NF_INET_LOCAL_OUT] = nft_ipv4_output,
  93. - [NF_INET_FORWARD] = nft_do_chain_ipv4,
  94. - [NF_INET_PRE_ROUTING] = nft_do_chain_ipv4,
  95. - [NF_INET_POST_ROUTING] = nft_do_chain_ipv4,
  96. - },
  97. };
  98. static int nf_tables_ipv4_init_net(struct net *net)
  99. @@ -96,6 +89,13 @@ static const struct nf_chain_type filter
  100. (1 << NF_INET_FORWARD) |
  101. (1 << NF_INET_PRE_ROUTING) |
  102. (1 << NF_INET_POST_ROUTING),
  103. + .hooks = {
  104. + [NF_INET_LOCAL_IN] = nft_do_chain_ipv4,
  105. + [NF_INET_LOCAL_OUT] = nft_ipv4_output,
  106. + [NF_INET_FORWARD] = nft_do_chain_ipv4,
  107. + [NF_INET_PRE_ROUTING] = nft_do_chain_ipv4,
  108. + [NF_INET_POST_ROUTING] = nft_do_chain_ipv4,
  109. + },
  110. };
  111. static int __init nf_tables_ipv4_init(void)
  112. --- a/net/ipv6/netfilter/nf_tables_ipv6.c
  113. +++ b/net/ipv6/netfilter/nf_tables_ipv6.c
  114. @@ -46,13 +46,6 @@ static struct nft_af_info nft_af_ipv6 __
  115. .family = NFPROTO_IPV6,
  116. .nhooks = NF_INET_NUMHOOKS,
  117. .owner = THIS_MODULE,
  118. - .hooks = {
  119. - [NF_INET_LOCAL_IN] = nft_do_chain_ipv6,
  120. - [NF_INET_LOCAL_OUT] = nft_ipv6_output,
  121. - [NF_INET_FORWARD] = nft_do_chain_ipv6,
  122. - [NF_INET_PRE_ROUTING] = nft_do_chain_ipv6,
  123. - [NF_INET_POST_ROUTING] = nft_do_chain_ipv6,
  124. - },
  125. };
  126. static int nf_tables_ipv6_init_net(struct net *net)
  127. @@ -93,6 +86,13 @@ static const struct nf_chain_type filter
  128. (1 << NF_INET_FORWARD) |
  129. (1 << NF_INET_PRE_ROUTING) |
  130. (1 << NF_INET_POST_ROUTING),
  131. + .hooks = {
  132. + [NF_INET_LOCAL_IN] = nft_do_chain_ipv6,
  133. + [NF_INET_LOCAL_OUT] = nft_ipv6_output,
  134. + [NF_INET_FORWARD] = nft_do_chain_ipv6,
  135. + [NF_INET_PRE_ROUTING] = nft_do_chain_ipv6,
  136. + [NF_INET_POST_ROUTING] = nft_do_chain_ipv6,
  137. + },
  138. };
  139. static int __init nf_tables_ipv6_init(void)
  140. --- a/net/netfilter/nf_tables_api.c
  141. +++ b/net/netfilter/nf_tables_api.c
  142. @@ -1398,7 +1398,6 @@ static int nf_tables_addchain(struct nft
  143. if (nla[NFTA_CHAIN_HOOK]) {
  144. struct nft_chain_hook hook;
  145. struct nf_hook_ops *ops;
  146. - nf_hookfn *hookfn;
  147. err = nft_chain_parse_hook(net, nla, afi, &hook, create);
  148. if (err < 0)
  149. @@ -1424,7 +1423,6 @@ static int nf_tables_addchain(struct nft
  150. static_branch_inc(&nft_counters_enabled);
  151. }
  152. - hookfn = hook.type->hooks[hook.num];
  153. basechain->type = hook.type;
  154. chain = &basechain->chain;
  155. @@ -1433,10 +1431,8 @@ static int nf_tables_addchain(struct nft
  156. ops->hooknum = hook.num;
  157. ops->priority = hook.priority;
  158. ops->priv = chain;
  159. - ops->hook = afi->hooks[ops->hooknum];
  160. + ops->hook = hook.type->hooks[ops->hooknum];
  161. ops->dev = hook.dev;
  162. - if (hookfn)
  163. - ops->hook = hookfn;
  164. if (basechain->type->type == NFT_CHAIN_T_NAT)
  165. ops->nat_hook = true;
  166. --- a/net/netfilter/nf_tables_inet.c
  167. +++ b/net/netfilter/nf_tables_inet.c
  168. @@ -74,13 +74,6 @@ static struct nft_af_info nft_af_inet __
  169. .family = NFPROTO_INET,
  170. .nhooks = NF_INET_NUMHOOKS,
  171. .owner = THIS_MODULE,
  172. - .hooks = {
  173. - [NF_INET_LOCAL_IN] = nft_do_chain_inet,
  174. - [NF_INET_LOCAL_OUT] = nft_inet_output,
  175. - [NF_INET_FORWARD] = nft_do_chain_inet,
  176. - [NF_INET_PRE_ROUTING] = nft_do_chain_inet,
  177. - [NF_INET_POST_ROUTING] = nft_do_chain_inet,
  178. - },
  179. };
  180. static int __net_init nf_tables_inet_init_net(struct net *net)
  181. @@ -121,6 +114,13 @@ static const struct nf_chain_type filter
  182. (1 << NF_INET_FORWARD) |
  183. (1 << NF_INET_PRE_ROUTING) |
  184. (1 << NF_INET_POST_ROUTING),
  185. + .hooks = {
  186. + [NF_INET_LOCAL_IN] = nft_do_chain_inet,
  187. + [NF_INET_LOCAL_OUT] = nft_inet_output,
  188. + [NF_INET_FORWARD] = nft_do_chain_inet,
  189. + [NF_INET_PRE_ROUTING] = nft_do_chain_inet,
  190. + [NF_INET_POST_ROUTING] = nft_do_chain_inet,
  191. + },
  192. };
  193. static int __init nf_tables_inet_init(void)
  194. --- a/net/netfilter/nf_tables_netdev.c
  195. +++ b/net/netfilter/nf_tables_netdev.c
  196. @@ -43,9 +43,6 @@ static struct nft_af_info nft_af_netdev
  197. .nhooks = NF_NETDEV_NUMHOOKS,
  198. .owner = THIS_MODULE,
  199. .flags = NFT_AF_NEEDS_DEV,
  200. - .hooks = {
  201. - [NF_NETDEV_INGRESS] = nft_do_chain_netdev,
  202. - },
  203. };
  204. static int nf_tables_netdev_init_net(struct net *net)
  205. @@ -82,6 +79,9 @@ static const struct nf_chain_type nft_fi
  206. .family = NFPROTO_NETDEV,
  207. .owner = THIS_MODULE,
  208. .hook_mask = (1 << NF_NETDEV_INGRESS),
  209. + .hooks = {
  210. + [NF_NETDEV_INGRESS] = nft_do_chain_netdev,
  211. + },
  212. };
  213. static void nft_netdev_event(unsigned long event, struct net_device *dev,