summaryrefslogtreecommitdiff
path: root/net/openvswitch/actions.c
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2015-10-07 05:03:16 -0700
committerDavid S. Miller <davem@davemloft.net>2015-10-07 05:03:16 -0700
commit41747509b437dcca880b52a035453f5e4ba14aa4 (patch)
tree60bffa8ee121a82fcd16a55387a68cec62657ec9 /net/openvswitch/actions.c
parent60872867d83581635d7b2948a027449ef5c9be32 (diff)
parentab38a7b5a4493a3658d891a8e91f9ffcb3d2defb (diff)
Merge branch 'ovs-ct-fixes'
Joe Stringer says: ==================== OVS conntrack fixes for net The userspace side of the Open vSwitch conntrack changes is currently undergoing review, which has highlighted some minor bugs in the existing conntrack implementation in the kernel, as well as pointing out some future-proofing that can be done on the interface to reduce the need for additional compatibility code in future. The biggest changes here are to the userspace API for the ct_state match field and the CT action. This series proposes to firstly extend the ct_state match field to 32 bits, ensuring to reject any currently unsupported bits. Secondly, rather than representing CT action flags within a 32-bit field, simply use a netlink attribute as presence of the single flag that is defined today. This also serves to reject unsupported ct action flag bits. v4: Use 12-character abbreviated hashes in commit messages. v3: Fully acked. v2: Address minor style feedback, add acks. v1: Initial post. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/openvswitch/actions.c')
-rw-r--r--net/openvswitch/actions.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/net/openvswitch/actions.c b/net/openvswitch/actions.c
index e23a61cc3d5c..c6a39bf2c3b9 100644
--- a/net/openvswitch/actions.c
+++ b/net/openvswitch/actions.c
@@ -684,7 +684,7 @@ static void ovs_fragment(struct vport *vport, struct sk_buff *skb, u16 mru,
{
if (skb_network_offset(skb) > MAX_L2_LEN) {
OVS_NLERR(1, "L2 header too long to fragment");
- return;
+ goto err;
}
if (ethertype == htons(ETH_P_IP)) {
@@ -708,8 +708,7 @@ static void ovs_fragment(struct vport *vport, struct sk_buff *skb, u16 mru,
struct rt6_info ovs_rt;
if (!v6ops) {
- kfree_skb(skb);
- return;
+ goto err;
}
prepare_frag(vport, skb);
@@ -728,8 +727,12 @@ static void ovs_fragment(struct vport *vport, struct sk_buff *skb, u16 mru,
WARN_ONCE(1, "Failed fragment ->%s: eth=%04x, MRU=%d, MTU=%d.",
ovs_vport_name(vport), ntohs(ethertype), mru,
vport->dev->mtu);
- kfree_skb(skb);
+ goto err;
}
+
+ return;
+err:
+ kfree_skb(skb);
}
static void do_output(struct datapath *dp, struct sk_buff *skb, int out_port,
@@ -1099,6 +1102,12 @@ static int do_execute_actions(struct datapath *dp, struct sk_buff *skb,
break;
case OVS_ACTION_ATTR_CT:
+ if (!is_flow_key_valid(key)) {
+ err = ovs_flow_key_update(skb, key);
+ if (err)
+ return err;
+ }
+
err = ovs_ct_execute(ovs_dp_get_net(dp), skb, key,
nla_data(a));