diff options
author | Pablo Neira Ayuso <pablo@netfilter.org> | 2007-12-18 01:28:41 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-01-28 17:58:52 -0500 |
commit | 37fccd8577d38e249dde71512fb38d2f6a4d9d3c (patch) | |
tree | ede873cf656ad872b94bc88e6530831f4f2dfb01 /net | |
parent | 0f417ce989f84cfd5418e3b316064bfbb2708196 (diff) |
[NETFILTER]: ctnetlink: add support for secmark
This patch adds support for James Morris' connsecmark.
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r-- | net/netfilter/nf_conntrack_netlink.c | 22 | ||||
-rw-r--r-- | net/netfilter/xt_CONNSECMARK.c | 5 |
2 files changed, 26 insertions, 1 deletions
diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c index 94027c84be52..d4eedc68cc76 100644 --- a/net/netfilter/nf_conntrack_netlink.c +++ b/net/netfilter/nf_conntrack_netlink.c | |||
@@ -254,6 +254,22 @@ nla_put_failure: | |||
254 | #define ctnetlink_dump_mark(a, b) (0) | 254 | #define ctnetlink_dump_mark(a, b) (0) |
255 | #endif | 255 | #endif |
256 | 256 | ||
257 | #ifdef CONFIG_NF_CONNTRACK_SECMARK | ||
258 | static inline int | ||
259 | ctnetlink_dump_secmark(struct sk_buff *skb, const struct nf_conn *ct) | ||
260 | { | ||
261 | __be32 mark = htonl(ct->secmark); | ||
262 | |||
263 | NLA_PUT(skb, CTA_SECMARK, sizeof(u_int32_t), &mark); | ||
264 | return 0; | ||
265 | |||
266 | nla_put_failure: | ||
267 | return -1; | ||
268 | } | ||
269 | #else | ||
270 | #define ctnetlink_dump_secmark(a, b) (0) | ||
271 | #endif | ||
272 | |||
257 | #define master_tuple(ct) &(ct->master->tuplehash[IP_CT_DIR_ORIGINAL].tuple) | 273 | #define master_tuple(ct) &(ct->master->tuplehash[IP_CT_DIR_ORIGINAL].tuple) |
258 | 274 | ||
259 | static inline int | 275 | static inline int |
@@ -392,6 +408,7 @@ ctnetlink_fill_info(struct sk_buff *skb, u32 pid, u32 seq, | |||
392 | ctnetlink_dump_protoinfo(skb, ct) < 0 || | 408 | ctnetlink_dump_protoinfo(skb, ct) < 0 || |
393 | ctnetlink_dump_helpinfo(skb, ct) < 0 || | 409 | ctnetlink_dump_helpinfo(skb, ct) < 0 || |
394 | ctnetlink_dump_mark(skb, ct) < 0 || | 410 | ctnetlink_dump_mark(skb, ct) < 0 || |
411 | ctnetlink_dump_secmark(skb, ct) < 0 || | ||
395 | ctnetlink_dump_id(skb, ct) < 0 || | 412 | ctnetlink_dump_id(skb, ct) < 0 || |
396 | ctnetlink_dump_use(skb, ct) < 0 || | 413 | ctnetlink_dump_use(skb, ct) < 0 || |
397 | ctnetlink_dump_master(skb, ct) < 0 || | 414 | ctnetlink_dump_master(skb, ct) < 0 || |
@@ -493,6 +510,11 @@ static int ctnetlink_conntrack_event(struct notifier_block *this, | |||
493 | && ctnetlink_dump_mark(skb, ct) < 0) | 510 | && ctnetlink_dump_mark(skb, ct) < 0) |
494 | goto nla_put_failure; | 511 | goto nla_put_failure; |
495 | #endif | 512 | #endif |
513 | #ifdef CONFIG_NF_CONNTRACK_SECMARK | ||
514 | if ((events & IPCT_SECMARK || ct->secmark) | ||
515 | && ctnetlink_dump_secmark(skb, ct) < 0) | ||
516 | goto nla_put_failure; | ||
517 | #endif | ||
496 | 518 | ||
497 | if (events & IPCT_COUNTER_FILLING && | 519 | if (events & IPCT_COUNTER_FILLING && |
498 | (ctnetlink_dump_counters(skb, ct, IP_CT_DIR_ORIGINAL) < 0 || | 520 | (ctnetlink_dump_counters(skb, ct, IP_CT_DIR_ORIGINAL) < 0 || |
diff --git a/net/netfilter/xt_CONNSECMARK.c b/net/netfilter/xt_CONNSECMARK.c index 2c265e87f396..2333f7e29bc9 100644 --- a/net/netfilter/xt_CONNSECMARK.c +++ b/net/netfilter/xt_CONNSECMARK.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <linux/netfilter/x_tables.h> | 20 | #include <linux/netfilter/x_tables.h> |
21 | #include <linux/netfilter/xt_CONNSECMARK.h> | 21 | #include <linux/netfilter/xt_CONNSECMARK.h> |
22 | #include <net/netfilter/nf_conntrack.h> | 22 | #include <net/netfilter/nf_conntrack.h> |
23 | #include <net/netfilter/nf_conntrack_ecache.h> | ||
23 | 24 | ||
24 | #define PFX "CONNSECMARK: " | 25 | #define PFX "CONNSECMARK: " |
25 | 26 | ||
@@ -40,8 +41,10 @@ static void secmark_save(const struct sk_buff *skb) | |||
40 | enum ip_conntrack_info ctinfo; | 41 | enum ip_conntrack_info ctinfo; |
41 | 42 | ||
42 | ct = nf_ct_get(skb, &ctinfo); | 43 | ct = nf_ct_get(skb, &ctinfo); |
43 | if (ct && !ct->secmark) | 44 | if (ct && !ct->secmark) { |
44 | ct->secmark = skb->secmark; | 45 | ct->secmark = skb->secmark; |
46 | nf_conntrack_event_cache(IPCT_SECMARK, skb); | ||
47 | } | ||
45 | } | 48 | } |
46 | } | 49 | } |
47 | 50 | ||