Skip to content

Commit

Permalink
datapath: backport: openvswitch: fix conntrack netlink event delivery
Browse files Browse the repository at this point in the history
Upstream commit:

    commit d913d3a763a6f66a862a6eafcf6da89a7905832a
    Author: Samuel Gauthier <[email protected]>
    Date:   Tue Jun 28 17:22:26 2016 +0200

    openvswitch: fix conntrack netlink event delivery

    Only the first and last netlink message for a particular conntrack are
    actually sent. The first message is sent through nf_conntrack_confirm when
    the conntrack is committed. The last one is sent when the conntrack is
    destroyed on timeout. The other conntrack state change messages are not
    advertised.

    When the conntrack subsystem is used from netfilter, nf_conntrack_confirm
    is called for each packet, from the postrouting hook, which in turn calls
    nf_ct_deliver_cached_events to send the state change netlink messages.

    This commit fixes the problem by calling nf_ct_deliver_cached_events in the
    non-commit case as well.

    Fixes: 7f8a436eaa2c ("openvswitch: Add conntrack action")
    CC: Joe Stringer <[email protected]>
    CC: Justin Pettit <[email protected]>
    CC: Andy Zhou <[email protected]>
    CC: Thomas Graf <[email protected]>
    Signed-off-by: Samuel Gauthier <[email protected]>
    Acked-by: Joe Stringer <[email protected]>
    Signed-off-by: David S. Miller <[email protected]>

Signed-off-by: Pravin B Shelar <[email protected]>
Acked-by: Jesse Gross <[email protected]>
  • Loading branch information
pshelar committed Aug 3, 2016
1 parent db4b697 commit f325530
Showing 1 changed file with 12 additions and 2 deletions.
14 changes: 12 additions & 2 deletions datapath/conntrack.c
Original file line number Diff line number Diff line change
Expand Up @@ -862,8 +862,18 @@ static int ovs_ct_lookup(struct net *net, struct sw_flow_key *key,
*/
state = OVS_CS_F_TRACKED | OVS_CS_F_NEW | OVS_CS_F_RELATED;
__ovs_ct_update_key(key, state, &info->zone, exp->master);
} else
return __ovs_ct_lookup(net, key, info, skb);
} else {
struct nf_conn *ct;
int err;

err = __ovs_ct_lookup(net, key, info, skb);
if (err)
return err;

ct = (struct nf_conn *)skb->nfct;
if (ct)
nf_ct_deliver_cached_events(ct);
}

return 0;
}
Expand Down

0 comments on commit f325530

Please sign in to comment.