mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-09 22:50:41 +00:00
netfilter: conntrack: add support for DCCP handshake sequence to ctnetlink
This patch adds CTA_PROTOINFO_DCCP_HANDSHAKE_SEQ that exposes the u64 handshake sequence number to user-space. Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org> Signed-off-by: Patrick McHardy <kaber@trash.net>
This commit is contained in:
parent
a2a804cddf
commit
a17c859849
@ -101,6 +101,7 @@ enum ctattr_protoinfo_dccp {
|
|||||||
CTA_PROTOINFO_DCCP_UNSPEC,
|
CTA_PROTOINFO_DCCP_UNSPEC,
|
||||||
CTA_PROTOINFO_DCCP_STATE,
|
CTA_PROTOINFO_DCCP_STATE,
|
||||||
CTA_PROTOINFO_DCCP_ROLE,
|
CTA_PROTOINFO_DCCP_ROLE,
|
||||||
|
CTA_PROTOINFO_DCCP_HANDSHAKE_SEQ,
|
||||||
__CTA_PROTOINFO_DCCP_MAX,
|
__CTA_PROTOINFO_DCCP_MAX,
|
||||||
};
|
};
|
||||||
#define CTA_PROTOINFO_DCCP_MAX (__CTA_PROTOINFO_DCCP_MAX - 1)
|
#define CTA_PROTOINFO_DCCP_MAX (__CTA_PROTOINFO_DCCP_MAX - 1)
|
||||||
|
@ -939,6 +939,15 @@ static inline u64 nla_get_u64(const struct nlattr *nla)
|
|||||||
return tmp;
|
return tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* nla_get_be64 - return payload of __be64 attribute
|
||||||
|
* @nla: __be64 netlink attribute
|
||||||
|
*/
|
||||||
|
static inline __be64 nla_get_be64(const struct nlattr *nla)
|
||||||
|
{
|
||||||
|
return *(__be64 *) nla_data(nla);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* nla_get_flag - return payload of flag attribute
|
* nla_get_flag - return payload of flag attribute
|
||||||
* @nla: flag netlink attribute
|
* @nla: flag netlink attribute
|
||||||
|
@ -635,6 +635,8 @@ static int dccp_to_nlattr(struct sk_buff *skb, struct nlattr *nla,
|
|||||||
NLA_PUT_U8(skb, CTA_PROTOINFO_DCCP_STATE, ct->proto.dccp.state);
|
NLA_PUT_U8(skb, CTA_PROTOINFO_DCCP_STATE, ct->proto.dccp.state);
|
||||||
NLA_PUT_U8(skb, CTA_PROTOINFO_DCCP_ROLE,
|
NLA_PUT_U8(skb, CTA_PROTOINFO_DCCP_ROLE,
|
||||||
ct->proto.dccp.role[IP_CT_DIR_ORIGINAL]);
|
ct->proto.dccp.role[IP_CT_DIR_ORIGINAL]);
|
||||||
|
NLA_PUT_BE64(skb, CTA_PROTOINFO_DCCP_HANDSHAKE_SEQ,
|
||||||
|
cpu_to_be64(ct->proto.dccp.handshake_seq));
|
||||||
nla_nest_end(skb, nest_parms);
|
nla_nest_end(skb, nest_parms);
|
||||||
read_unlock_bh(&dccp_lock);
|
read_unlock_bh(&dccp_lock);
|
||||||
return 0;
|
return 0;
|
||||||
@ -647,6 +649,7 @@ nla_put_failure:
|
|||||||
static const struct nla_policy dccp_nla_policy[CTA_PROTOINFO_DCCP_MAX + 1] = {
|
static const struct nla_policy dccp_nla_policy[CTA_PROTOINFO_DCCP_MAX + 1] = {
|
||||||
[CTA_PROTOINFO_DCCP_STATE] = { .type = NLA_U8 },
|
[CTA_PROTOINFO_DCCP_STATE] = { .type = NLA_U8 },
|
||||||
[CTA_PROTOINFO_DCCP_ROLE] = { .type = NLA_U8 },
|
[CTA_PROTOINFO_DCCP_ROLE] = { .type = NLA_U8 },
|
||||||
|
[CTA_PROTOINFO_DCCP_HANDSHAKE_SEQ] = { .type = NLA_U64 },
|
||||||
};
|
};
|
||||||
|
|
||||||
static int nlattr_to_dccp(struct nlattr *cda[], struct nf_conn *ct)
|
static int nlattr_to_dccp(struct nlattr *cda[], struct nf_conn *ct)
|
||||||
@ -679,6 +682,10 @@ static int nlattr_to_dccp(struct nlattr *cda[], struct nf_conn *ct)
|
|||||||
ct->proto.dccp.role[IP_CT_DIR_ORIGINAL] = CT_DCCP_ROLE_SERVER;
|
ct->proto.dccp.role[IP_CT_DIR_ORIGINAL] = CT_DCCP_ROLE_SERVER;
|
||||||
ct->proto.dccp.role[IP_CT_DIR_REPLY] = CT_DCCP_ROLE_CLIENT;
|
ct->proto.dccp.role[IP_CT_DIR_REPLY] = CT_DCCP_ROLE_CLIENT;
|
||||||
}
|
}
|
||||||
|
if (tb[CTA_PROTOINFO_DCCP_HANDSHAKE_SEQ]) {
|
||||||
|
ct->proto.dccp.handshake_seq =
|
||||||
|
be64_to_cpu(nla_get_be64(tb[CTA_PROTOINFO_DCCP_HANDSHAKE_SEQ]));
|
||||||
|
}
|
||||||
write_unlock_bh(&dccp_lock);
|
write_unlock_bh(&dccp_lock);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user