[PATCH] netfilter: CONNMARK: support save the mark of the master connection
From: Changli Gao <hidden>
Date: 2011-01-27 09:39:34
In some cases(Policy routing), it is expected that all the sub-connections share the same mark with their master. Signed-off-by: Changli Gao <redacted> --- include/linux/netfilter/xt_connmark.h | 3 ++- net/netfilter/xt_connmark.c | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/include/linux/netfilter/xt_connmark.h b/include/linux/netfilter/xt_connmark.h
index efc17a8..4b513f8 100644
--- a/include/linux/netfilter/xt_connmark.h
+++ b/include/linux/netfilter/xt_connmark.h@@ -15,7 +15,8 @@ enum { XT_CONNMARK_SET = 0, XT_CONNMARK_SAVE, - XT_CONNMARK_RESTORE + XT_CONNMARK_RESTORE, + XT_CONNMARK_SAVE_MASTER, }; struct xt_connmark_tginfo1 {
diff --git a/net/netfilter/xt_connmark.c b/net/netfilter/xt_connmark.c
index 7278145..4207bb6 100644
--- a/net/netfilter/xt_connmark.c
+++ b/net/netfilter/xt_connmark.c@@ -69,6 +69,21 @@ connmark_tg(struct sk_buff *skb, const struct xt_action_param *par) (ct->mark & info->ctmask); skb->mark = newmark; break; + case XT_CONNMARK_SAVE_MASTER: + if (ct->master) { + struct nf_conn *master; + + master = ct->master; + while (master->master) + master = master->master; + newmark = (ct->mark & ~info->ctmask) ^ + (master->mark & info->nfmask); + if (ct->mark != newmark) { + ct->mark = newmark; + nf_conntrack_event_cache(IPCT_MARK, ct); + } + } + break; } return XT_CONTINUE;