summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
author/C=EU/ST=EU/CN=Pablo Neira Ayuso/emailAddress=pablo@netfilter.org </C=EU/ST=EU/CN=Pablo Neira Ayuso/emailAddress=pablo@netfilter.org>2007-06-04 17:00:24 +0000
committer/C=EU/ST=EU/CN=Pablo Neira Ayuso/emailAddress=pablo@netfilter.org </C=EU/ST=EU/CN=Pablo Neira Ayuso/emailAddress=pablo@netfilter.org>2007-06-04 17:00:24 +0000
commit25e5b78e44726f8f7b79e41bf33193ef21e51a36 (patch)
treeaba318c1a82864e7fadbdc587ffa47bf6334cdaa /src
parent7cb0af04381383ca6aa0853130076c59ce5ef764 (diff)
introduce NFCT_SOPT_SETUP_* options to simplify object setup
Diffstat (limited to 'src')
-rw-r--r--src/conntrack/objopt.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/src/conntrack/objopt.c b/src/conntrack/objopt.c
index e525b2e..2f00005 100644
--- a/src/conntrack/objopt.c
+++ b/src/conntrack/objopt.c
@@ -7,6 +7,24 @@
#include "internal.h"
+static int __autocomplete(struct nf_conntrack *ct, int dir)
+{
+ int other = (dir == __DIR_ORIG) ? __DIR_REPL : __DIR_ORIG;
+
+ ct->tuple[dir].l3protonum = ct->tuple[other].l3protonum;
+ ct->tuple[dir].protonum = ct->tuple[other].protonum;
+
+ memcpy(&ct->tuple[dir].src.v6,
+ &ct->tuple[other].dst.v6,
+ sizeof(union __nfct_address));
+ memcpy(&ct->tuple[dir].dst.v6,
+ &ct->tuple[other].src.v6,
+ sizeof(union __nfct_address));
+
+ ct->tuple[dir].l4src.all = ct->tuple[other].l4dst.all;
+ ct->tuple[dir].l4dst.all = ct->tuple[other].l4src.all;
+}
+
int __setobjopt(struct nf_conntrack *ct, unsigned int option)
{
switch(option) {
@@ -36,6 +54,12 @@ int __setobjopt(struct nf_conntrack *ct, unsigned int option)
ct->tuple[__DIR_ORIG].l4dst.tcp.port;
set_bit(ATTR_DNAT_PORT, ct->set);
break;
+ case NFCT_SOPT_SETUP_ORIGINAL:
+ __autocomplete(ct, __DIR_ORIG);
+ break;
+ case NFCT_SOPT_SETUP_REPLY:
+ __autocomplete(ct, __DIR_REPL);
+ break;
}
return 0;
}