From 975ae9979ec73e8acb2c215ee9a84fded2f4357a Mon Sep 17 00:00:00 2001 From: Pablo Neira Ayuso Date: Fri, 24 Apr 2009 20:45:21 +0200 Subject: src: add DCCP role attribute This patch adds DCCP role attribute support. This needs Linux kernel >= 2.6.30. Signed-off-by: Pablo Neira Ayuso --- src/conntrack/build.c | 16 ++++++++++------ src/conntrack/copy.c | 7 +++++++ src/conntrack/getter.c | 6 ++++++ src/conntrack/parse.c | 5 +++++ src/conntrack/setter.c | 6 ++++++ 5 files changed, 34 insertions(+), 6 deletions(-) (limited to 'src/conntrack') 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, }; -- cgit v1.2.3