Blame view
net/ipv4/netfilter/nft_masq_ipv4.c
2.35 KB
9ba1f726b
|
1 |
/* |
cd7275146
|
2 |
* Copyright (c) 2014 Arturo Borrero Gonzalez <arturo@debian.org> |
9ba1f726b
|
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ #include <linux/kernel.h> #include <linux/init.h> #include <linux/module.h> #include <linux/netlink.h> #include <linux/netfilter.h> #include <linux/netfilter/nf_tables.h> #include <net/netfilter/nf_tables.h> #include <net/netfilter/nft_masq.h> #include <net/netfilter/ipv4/nf_nat_masquerade.h> static void nft_masq_ipv4_eval(const struct nft_expr *expr, |
a55e22e92
|
20 |
struct nft_regs *regs, |
9ba1f726b
|
21 22 23 24 |
const struct nft_pktinfo *pkt) { struct nft_masq *priv = nft_expr_priv(expr); struct nf_nat_range range; |
9ba1f726b
|
25 |
|
6b96686ec
|
26 |
memset(&range, 0, sizeof(range)); |
9ba1f726b
|
27 |
range.flags = priv->flags; |
8a6bf5da1
|
28 |
if (priv->sreg_proto_min) { |
10596608c
|
29 30 31 32 |
range.min_proto.all = (__force __be16)nft_reg_load16( ®s->data[priv->sreg_proto_min]); range.max_proto.all = (__force __be16)nft_reg_load16( ®s->data[priv->sreg_proto_max]); |
8a6bf5da1
|
33 |
} |
0e5a1c7eb
|
34 35 |
regs->verdict.code = nf_nat_masquerade_ipv4(pkt->skb, nft_hook(pkt), &range, nft_out(pkt)); |
9ba1f726b
|
36 |
} |
20afd4239
|
37 38 39 40 41 |
static void nft_masq_ipv4_destroy(const struct nft_ctx *ctx, const struct nft_expr *expr) { nf_ct_netns_put(ctx->net, NFPROTO_IPV4); } |
9ba1f726b
|
42 43 44 45 46 |
static struct nft_expr_type nft_masq_ipv4_type; static const struct nft_expr_ops nft_masq_ipv4_ops = { .type = &nft_masq_ipv4_type, .size = NFT_EXPR_SIZE(sizeof(struct nft_masq)), .eval = nft_masq_ipv4_eval, |
8da4cc1b1
|
47 |
.init = nft_masq_init, |
20afd4239
|
48 |
.destroy = nft_masq_ipv4_destroy, |
9ba1f726b
|
49 |
.dump = nft_masq_dump, |
7210e4e38
|
50 |
.validate = nft_masq_validate, |
9ba1f726b
|
51 52 53 54 55 56 57 58 59 60 61 62 63 |
}; static struct nft_expr_type nft_masq_ipv4_type __read_mostly = { .family = NFPROTO_IPV4, .name = "masq", .ops = &nft_masq_ipv4_ops, .policy = nft_masq_policy, .maxattr = NFTA_MASQ_MAX, .owner = THIS_MODULE, }; static int __init nft_masq_ipv4_module_init(void) { |
8da4cc1b1
|
64 65 66 67 68 69 70 71 72 |
int ret; ret = nft_register_expr(&nft_masq_ipv4_type); if (ret < 0) return ret; nf_nat_masquerade_ipv4_register_notifier(); return ret; |
9ba1f726b
|
73 74 75 76 77 |
} static void __exit nft_masq_ipv4_module_exit(void) { nft_unregister_expr(&nft_masq_ipv4_type); |
8da4cc1b1
|
78 |
nf_nat_masquerade_ipv4_unregister_notifier(); |
9ba1f726b
|
79 80 81 82 83 84 |
} module_init(nft_masq_ipv4_module_init); module_exit(nft_masq_ipv4_module_exit); MODULE_LICENSE("GPL"); |
cd7275146
|
85 |
MODULE_AUTHOR("Arturo Borrero Gonzalez <arturo@debian.org"); |
9ba1f726b
|
86 |
MODULE_ALIAS_NFT_AF_EXPR(AF_INET, "masq"); |