diff options
author | Jarno Rajahalme <jarno@ovn.org> | 2016-06-20 18:51:08 -0700 |
---|---|---|
committer | Jarno Rajahalme <jarno@ovn.org> | 2016-06-20 18:51:08 -0700 |
commit | 9f1de150bbc74d430b520d8176b9ad723f2af1e4 (patch) | |
tree | 82fc741319a2780c275f59bcef75a8ea223f4705 /datapath | |
parent | 4cc85f28f13039efbc16ac84e85cc7d5d9723476 (diff) | |
download | openvswitch-9f1de150bbc74d430b520d8176b9ad723f2af1e4.tar.gz |
datapath: conntrack NF_NAT_RANGE_PROTO_RANDOM_FULLY compat code.
Linux kernel 3.13 and older do not have
NF_NAT_RANGE_PROTO_RANDOM_FULLY (unless backported by the
distribution). Silently fall back to NF_NAT_RANGE_PROTO_RANDOM to
maintain OVS API compatibility.
Signed-off-by: Jarno Rajahalme <jarno@ovn.org>
Acked-by: Jesse Gross <jesse@kernel.org>
Diffstat (limited to 'datapath')
-rw-r--r-- | datapath/conntrack.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/datapath/conntrack.c b/datapath/conntrack.c index df60fa512..7d7982b7b 100644 --- a/datapath/conntrack.c +++ b/datapath/conntrack.c @@ -71,6 +71,7 @@ struct ovs_conntrack_info { struct nf_conn *ct; u8 commit : 1; u8 nat : 3; /* enum ovs_ct_nat */ + u8 random_fully_compat : 1; /* bool */ u16 family; struct md_mark mark; struct md_labels labels; @@ -1048,7 +1049,12 @@ static int parse_nat(const struct nlattr *attr, break; case OVS_NAT_ATTR_PROTO_RANDOM: +#ifdef NF_NAT_RANGE_PROTO_RANDOM_FULLY info->range.flags |= NF_NAT_RANGE_PROTO_RANDOM_FULLY; +#else + info->range.flags |= NF_NAT_RANGE_PROTO_RANDOM; + info->random_fully_compat = true; +#endif break; default: @@ -1322,11 +1328,15 @@ static bool ovs_ct_nat_to_attr(const struct ovs_conntrack_info *info, nla_put_flag(skb, OVS_NAT_ATTR_PERSISTENT)) return false; if (info->range.flags & NF_NAT_RANGE_PROTO_RANDOM && - nla_put_flag(skb, OVS_NAT_ATTR_PROTO_HASH)) + nla_put_flag(skb, info->random_fully_compat + ? OVS_NAT_ATTR_PROTO_RANDOM + : OVS_NAT_ATTR_PROTO_HASH)) return false; +#ifdef NF_NAT_RANGE_PROTO_RANDOM_FULLY if (info->range.flags & NF_NAT_RANGE_PROTO_RANDOM_FULLY && nla_put_flag(skb, OVS_NAT_ATTR_PROTO_RANDOM)) return false; +#endif out: nla_nest_end(skb, start); |