|
1 | 1 | /* |
2 | 2 | * Copyright (c) 2008-2009 Patrick McHardy <kaber@trash.net> |
| 3 | + * Copyright (c) 2012 Pablo Neira Ayuso <pablo@netfilter.org> |
3 | 4 | * |
4 | 5 | * This program is free software; you can redistribute it and/or modify |
5 | 6 | * it under the terms of the GNU General Public License version 2 as |
@@ -167,7 +168,7 @@ static struct nft_expr_type nft_nat_type __read_mostly = { |
167 | 168 | }; |
168 | 169 |
|
169 | 170 | /* |
170 | | - * NAT table |
| 171 | + * NAT chains |
171 | 172 | */ |
172 | 173 |
|
173 | 174 | static unsigned int nf_nat_fn(const struct nf_hook_ops *ops, |
@@ -301,115 +302,52 @@ static unsigned int nf_nat_output(const struct nf_hook_ops *ops, |
301 | 302 | return ret; |
302 | 303 | } |
303 | 304 |
|
304 | | -static struct nft_base_chain nf_chain_nat_prerouting __read_mostly = { |
305 | | - .chain = { |
306 | | - .name = "PREROUTING", |
307 | | - .rules = LIST_HEAD_INIT(nf_chain_nat_prerouting.chain.rules), |
308 | | - .flags = NFT_BASE_CHAIN | NFT_CHAIN_BUILTIN, |
309 | | - }, |
310 | | - .ops = { |
311 | | - .hook = nf_nat_prerouting, |
312 | | - .owner = THIS_MODULE, |
313 | | - .pf = NFPROTO_IPV4, |
314 | | - .hooknum = NF_INET_PRE_ROUTING, |
315 | | - .priority = NF_IP_PRI_NAT_DST, |
316 | | - .priv = &nf_chain_nat_prerouting.chain, |
317 | | - }, |
318 | | -}; |
319 | | - |
320 | | -static struct nft_base_chain nf_chain_nat_postrouting __read_mostly = { |
321 | | - .chain = { |
322 | | - .name = "POSTROUTING", |
323 | | - .rules = LIST_HEAD_INIT(nf_chain_nat_postrouting.chain.rules), |
324 | | - .flags = NFT_BASE_CHAIN | NFT_CHAIN_BUILTIN, |
325 | | - }, |
326 | | - .ops = { |
327 | | - .hook = nf_nat_postrouting, |
328 | | - .owner = THIS_MODULE, |
329 | | - .pf = NFPROTO_IPV4, |
330 | | - .hooknum = NF_INET_POST_ROUTING, |
331 | | - .priority = NF_IP_PRI_NAT_SRC, |
332 | | - .priv = &nf_chain_nat_postrouting.chain, |
333 | | - }, |
334 | | -}; |
335 | | - |
336 | | -static struct nft_base_chain nf_chain_nat_output __read_mostly = { |
337 | | - .chain = { |
338 | | - .name = "OUTPUT", |
339 | | - .rules = LIST_HEAD_INIT(nf_chain_nat_output.chain.rules), |
340 | | - .flags = NFT_BASE_CHAIN | NFT_CHAIN_BUILTIN, |
341 | | - }, |
342 | | - .ops = { |
343 | | - .hook = nf_nat_output, |
344 | | - .owner = THIS_MODULE, |
345 | | - .pf = NFPROTO_IPV4, |
346 | | - .hooknum = NF_INET_LOCAL_OUT, |
347 | | - .priority = NF_IP_PRI_NAT_DST, |
348 | | - .priv = &nf_chain_nat_output.chain, |
349 | | - }, |
350 | | -}; |
351 | | - |
352 | | -static struct nft_base_chain nf_chain_nat_input __read_mostly = { |
353 | | - .chain = { |
354 | | - .name = "INPUT", |
355 | | - .rules = LIST_HEAD_INIT(nf_chain_nat_input.chain.rules), |
356 | | - .flags = NFT_BASE_CHAIN | NFT_CHAIN_BUILTIN, |
357 | | - }, |
358 | | - .ops = { |
359 | | - .hook = nf_nat_fn, |
360 | | - .owner = THIS_MODULE, |
361 | | - .pf = NFPROTO_IPV4, |
362 | | - .hooknum = NF_INET_LOCAL_IN, |
363 | | - .priority = NF_IP_PRI_NAT_SRC, |
364 | | - .priv = &nf_chain_nat_input.chain, |
| 305 | +struct nf_chain_type nft_chain_nat_ipv4 = { |
| 306 | + .family = NFPROTO_IPV4, |
| 307 | + .name = "nat", |
| 308 | + .type = NFT_CHAIN_T_NAT, |
| 309 | + .hook_mask = (1 << NF_INET_PRE_ROUTING) | |
| 310 | + (1 << NF_INET_POST_ROUTING) | |
| 311 | + (1 << NF_INET_LOCAL_OUT) | |
| 312 | + (1 << NF_INET_LOCAL_IN), |
| 313 | + .fn = { |
| 314 | + [NF_INET_PRE_ROUTING] = nf_nat_prerouting, |
| 315 | + [NF_INET_POST_ROUTING] = nf_nat_postrouting, |
| 316 | + [NF_INET_LOCAL_OUT] = nf_nat_output, |
| 317 | + [NF_INET_LOCAL_IN] = nf_nat_fn, |
365 | 318 | }, |
| 319 | + .me = THIS_MODULE, |
366 | 320 | }; |
367 | 321 |
|
368 | | - |
369 | | -static struct nft_table nf_table_nat_ipv4 __read_mostly = { |
370 | | - .name = "nat", |
371 | | - .chains = LIST_HEAD_INIT(nf_table_nat_ipv4.chains), |
372 | | -}; |
373 | | - |
374 | | -static int __init nf_table_nat_init(void) |
| 322 | +static int __init nft_chain_nat_init(void) |
375 | 323 | { |
376 | 324 | int err; |
377 | 325 |
|
378 | | - list_add_tail(&nf_chain_nat_prerouting.chain.list, |
379 | | - &nf_table_nat_ipv4.chains); |
380 | | - list_add_tail(&nf_chain_nat_postrouting.chain.list, |
381 | | - &nf_table_nat_ipv4.chains); |
382 | | - list_add_tail(&nf_chain_nat_output.chain.list, |
383 | | - &nf_table_nat_ipv4.chains); |
384 | | - list_add_tail(&nf_chain_nat_input.chain.list, |
385 | | - &nf_table_nat_ipv4.chains); |
386 | | - |
387 | | - err = nft_register_table(&nf_table_nat_ipv4, NFPROTO_IPV4); |
| 326 | + err = nft_register_chain_type(&nft_chain_nat_ipv4); |
388 | 327 | if (err < 0) |
389 | | - goto err1; |
| 328 | + return err; |
390 | 329 |
|
391 | 330 | err = nft_register_expr(&nft_nat_type); |
392 | 331 | if (err < 0) |
393 | | - goto err2; |
| 332 | + goto err; |
394 | 333 |
|
395 | 334 | return 0; |
396 | 335 |
|
397 | | -err2: |
398 | | - nft_unregister_table(&nf_table_nat_ipv4, NFPROTO_IPV4); |
399 | | -err1: |
| 336 | +err: |
| 337 | + nft_unregister_chain_type(&nft_chain_nat_ipv4); |
400 | 338 | return err; |
401 | 339 | } |
402 | 340 |
|
403 | | -static void __exit nf_table_nat_exit(void) |
| 341 | +static void __exit nft_chain_nat_exit(void) |
404 | 342 | { |
405 | 343 | nft_unregister_expr(&nft_nat_type); |
406 | | - nft_unregister_table(&nf_table_nat_ipv4, AF_INET); |
| 344 | + nft_unregister_chain_type(&nft_chain_nat_ipv4); |
407 | 345 | } |
408 | 346 |
|
409 | | -module_init(nf_table_nat_init); |
410 | | -module_exit(nf_table_nat_exit); |
| 347 | +module_init(nft_chain_nat_init); |
| 348 | +module_exit(nft_chain_nat_exit); |
411 | 349 |
|
412 | 350 | MODULE_LICENSE("GPL"); |
413 | 351 | MODULE_AUTHOR("Patrick McHardy <kaber@trash.net>"); |
414 | | -MODULE_ALIAS_NFT_TABLE(AF_INET, "nat"); |
| 352 | +MODULE_ALIAS_NFT_CHAIN(AF_INET, "nat"); |
415 | 353 | MODULE_ALIAS_NFT_EXPR("nat"); |
0 commit comments