summaryrefslogtreecommitdiffstats
path: root/src/conntrack
diff options
context:
space:
mode:
Diffstat (limited to 'src/conntrack')
-rw-r--r--src/conntrack/build.c16
-rw-r--r--src/conntrack/copy.c7
-rw-r--r--src/conntrack/getter.c6
-rw-r--r--src/conntrack/parse.c5
-rw-r--r--src/conntrack/setter.c6
5 files changed, 34 insertions, 6 deletions
diff --git a/src/conntrack/build.c b/src/conntrack/build.c
index 1738402..4c6a27e 100644
--- a/src/conntrack/build.c
+++ b/src/conntrack/build.c
@@ -160,16 +160,20 @@ static void __build_protoinfo(struct nfnlhdr *req, size_t size,
nfnl_nest_end(&req->nlh, nest);
break;
case IPPROTO_DCCP:
- if (!(test_bit(ATTR_DCCP_STATE, ct->set)))
+ if (!(test_bit(ATTR_DCCP_STATE, ct->set) &&
+ test_bit(ATTR_DCCP_ROLE, ct->set)))
break;
nest = nfnl_nest(&req->nlh, size, CTA_PROTOINFO);
nest_proto = nfnl_nest(&req->nlh, size, CTA_PROTOINFO_DCCP);
- if (test_bit(ATTR_DCCP_STATE, ct->set))
- nfnl_addattr_l(&req->nlh, size,
- CTA_PROTOINFO_DCCP_STATE,
- &ct->protoinfo.dccp.state,
- sizeof(u_int8_t));
+ nfnl_addattr_l(&req->nlh, size,
+ CTA_PROTOINFO_DCCP_STATE,
+ &ct->protoinfo.dccp.state,
+ sizeof(u_int8_t));
+ nfnl_addattr_l(&req->nlh, size,
+ CTA_PROTOINFO_DCCP_ROLE,
+ &ct->protoinfo.dccp.role,
+ sizeof(u_int8_t));
nfnl_nest_end(&req->nlh, nest_proto);
nfnl_nest_end(&req->nlh, nest);
default:
diff --git a/src/conntrack/copy.c b/src/conntrack/copy.c
index 16f9709..90eea03 100644
--- a/src/conntrack/copy.c
+++ b/src/conntrack/copy.c
@@ -250,6 +250,12 @@ static void copy_attr_dccp_state(struct nf_conntrack *dest,
dest->protoinfo.dccp.state = orig->protoinfo.dccp.state;
}
+static void copy_attr_dccp_role(struct nf_conntrack *dest,
+ const struct nf_conntrack *orig)
+{
+ dest->protoinfo.dccp.role = orig->protoinfo.dccp.role;
+}
+
static void copy_attr_snat_ipv4(struct nf_conntrack *dest,
const struct nf_conntrack *orig)
{
@@ -441,4 +447,5 @@ copy_attr copy_attr_array[ATTR_MAX] = {
[ATTR_SCTP_VTAG_REPL] = copy_attr_sctp_vtag_repl,
[ATTR_HELPER_NAME] = copy_attr_helper_name,
[ATTR_DCCP_STATE] = copy_attr_dccp_state,
+ [ATTR_DCCP_ROLE] = copy_attr_dccp_role,
};
diff --git a/src/conntrack/getter.c b/src/conntrack/getter.c
index 2338db2..6e50a5b 100644
--- a/src/conntrack/getter.c
+++ b/src/conntrack/getter.c
@@ -292,6 +292,11 @@ static const void *get_attr_dccp_state(const struct nf_conntrack *ct)
return &ct->protoinfo.dccp.state;
}
+static const void *get_attr_dccp_role(const struct nf_conntrack *ct)
+{
+ return &ct->protoinfo.dccp.role;
+}
+
get_attr get_attr_array[ATTR_MAX] = {
[ATTR_ORIG_IPV4_SRC] = get_attr_orig_ipv4_src,
[ATTR_ORIG_IPV4_DST] = get_attr_orig_ipv4_dst,
@@ -350,4 +355,5 @@ get_attr get_attr_array[ATTR_MAX] = {
[ATTR_SCTP_VTAG_REPL] = get_attr_sctp_vtag_repl,
[ATTR_HELPER_NAME] = get_attr_helper_name,
[ATTR_DCCP_STATE] = get_attr_dccp_state,
+ [ATTR_DCCP_ROLE] = get_attr_dccp_role,
};
diff --git a/src/conntrack/parse.c b/src/conntrack/parse.c
index 885532c..98e4d7d 100644
--- a/src/conntrack/parse.c
+++ b/src/conntrack/parse.c
@@ -256,6 +256,11 @@ static void __parse_protoinfo_dccp(const struct nfattr *attr,
*(u_int8_t *)NFA_DATA(tb[CTA_PROTOINFO_DCCP_STATE-1]);
set_bit(ATTR_DCCP_STATE, ct->set);
}
+ if (tb[CTA_PROTOINFO_DCCP_ROLE-1]) {
+ ct->protoinfo.dccp.role =
+ *(u_int8_t *)NFA_DATA(tb[CTA_PROTOINFO_DCCP_ROLE-1]);
+ set_bit(ATTR_DCCP_ROLE, ct->set);
+ }
}
static void __parse_protoinfo(const struct nfattr *attr,
diff --git a/src/conntrack/setter.c b/src/conntrack/setter.c
index 481fad1..3fe74c5 100644
--- a/src/conntrack/setter.c
+++ b/src/conntrack/setter.c
@@ -319,6 +319,11 @@ static void set_attr_dccp_state(struct nf_conntrack *ct, const void *value)
ct->protoinfo.dccp.state = *((u_int8_t *) value);
}
+static void set_attr_dccp_role(struct nf_conntrack *ct, const void *value)
+{
+ ct->protoinfo.dccp.role = *((u_int8_t *) value);
+}
+
static void set_attr_do_nothing(struct nf_conntrack *ct, const void *value) {}
set_attr set_attr_array[ATTR_MAX] = {
@@ -379,4 +384,5 @@ set_attr set_attr_array[ATTR_MAX] = {
[ATTR_SCTP_VTAG_REPL] = set_attr_sctp_vtag_repl,
[ATTR_HELPER_NAME] = set_attr_helper_name,
[ATTR_DCCP_STATE] = set_attr_dccp_state,
+ [ATTR_DCCP_ROLE] = set_attr_dccp_role,
};