openvswitch: add ct_clear action
Subsystems (3)
PATCH v2 1/1 openvswitch: add ct_clear action
This adds a ct_clear action for clearing conntrack state. ct_clear is currently implemented in OVS userspace, but is not backed by an action in the kernel datapath. This is useful for flows that may modify a packet tuple after a ct lookup has already occurred.
---
v2:
- Use IP_CT_UNTRACKED for nf_ct_set()
- Only fill key if previously conntracked
include/uapi/linux/openvswitch.h | 2 ++ net/openvswitch/actions.c | 4 ++++ net/openvswitch/conntrack.c | 11 +++++++++++ net/openvswitch/conntrack.h | 7 +++++++ net/openvswitch/flow_netlink.c | 5 +++++ 5 files changed, 29 insertions(+)
include/uapi/linux/openvswitch.h +2 -0
@@ -807,6 +807,7 @@ struct ovs_action_push_eth {* packet. * @OVS_ACTION_ATTR_POP_ETH: Pop the outermost Ethernet header off the * packet. +* @OVS_ACTION_ATTR_CT_CLEAR: Clear conntrack state from the packet. * * Only a single header can be set with a single %OVS_ACTION_ATTR_SET. Not all * fields within a header are modifiable, e.g. the IPv4 protocol and fragment
@@ -836,6 +837,7 @@ enum ovs_action_attr {OVS_ACTION_ATTR_TRUNC ,/* u32 struct ovs_action_trunc. */ OVS_ACTION_ATTR_PUSH_ETH ,/* struct ovs_action_push_eth. */ OVS_ACTION_ATTR_POP_ETH ,/* No argument. */ +OVS_ACTION_ATTR_CT_CLEAR ,/* No argument. */ __OVS_ACTION_ATTR_MAX, /* Nothing past this will be accepted* from userspace. */
net/openvswitch/actions.c +4 -0
@@ -1203,6 +1203,10 @@ static int do_execute_actions(struct datapath *dp, struct sk_buff *skb,return err == -EINPROGRESS ?0 : err;break ; +case OVS_ACTION_ATTR_CT_CLEAR : + err =ovs_ct_clear (skb, key); +break ; +case OVS_ACTION_ATTR_PUSH_ETH : err =push_eth (skb, key,nla_data (a));break ;
net/openvswitch/conntrack.c +11 -0
@@ -1129,6 +1129,17 @@ int ovs_ct_execute(struct net *net, struct sk_buff *skb,return err; } +int ovs_ct_clear (struct sk_buff *skb,struct sw_flow_key *key) +{ +if (skb_nfct (skb)) { +nf_conntrack_put (skb_nfct (skb)); +nf_ct_set (skb,NULL ,IP_CT_UNTRACKED ); +ovs_ct_fill_key (skb, key); + } + +return 0 ; +} +static int ovs_ct_add_helper (struct ovs_conntrack_info *info,const char *name,const struct sw_flow_key *key,bool log) {
net/openvswitch/conntrack.h +7 -0
@@ -30,6 +30,7 @@ int ovs_ct_action_to_attr(const struct ovs_conntrack_info *, struct sk_buff *);int ovs_ct_execute (struct net *,struct sk_buff *,struct sw_flow_key *,const struct ovs_conntrack_info *); +int ovs_ct_clear (struct sk_buff *skb,struct sw_flow_key *key);void ovs_ct_fill_key (const struct sk_buff *skb,struct sw_flow_key *key); int ovs_ct_put_key(const struct sw_flow_key *swkey,
@@ -73,6 +74,12 @@ static inline int ovs_ct_execute(struct net *net, struct sk_buff *skb,return -ENOTSUPP ; } +static inline int ovs_ct_clear (struct sk_buff *skb, +struct sw_flow_key *key) +{ +return -ENOTSUPP ; +} +static inline void ovs_ct_fill_key (const struct sk_buff *skb,struct sw_flow_key *key) {
net/openvswitch/flow_netlink.c +5 -0
@@ -76,6 +76,7 @@ static bool actions_may_change_flow(const struct nlattr *actions)break ;case OVS_ACTION_ATTR_CT : +case OVS_ACTION_ATTR_CT_CLEAR :case OVS_ACTION_ATTR_HASH :case OVS_ACTION_ATTR_POP_ETH :case OVS_ACTION_ATTR_POP_MPLS :
@@ -2528,6 +2529,7 @@ static int __ovs_nla_copy_actions(struct net *net, const struct nlattr *attr, [OVS_ACTION_ATTR_SAMPLE] = (u32)-1, [OVS_ACTION_ATTR_HASH] = sizeof(struct ovs_action_hash), [OVS_ACTION_ATTR_CT] = (u32)-1, + [OVS_ACTION_ATTR_CT_CLEAR] = 0, [OVS_ACTION_ATTR_TRUNC] = sizeof(struct ovs_action_trunc), [OVS_ACTION_ATTR_PUSH_ETH] = sizeof(struct ovs_action_push_eth), [OVS_ACTION_ATTR_POP_ETH] = 0,
@@ -2669,6 +2671,9 @@ static int __ovs_nla_copy_actions(struct net *net, const struct nlattr *attr, skip_copy = true;break ; +case OVS_ACTION_ATTR_CT_CLEAR : +break ; +case OVS_ACTION_ATTR_PUSH_ETH :/* Disallow pushing an Ethernet header if one * is already present */
Signature · 1 line
2.12.0
Quoted 11 lines · Eric Garver
This adds a
ct_clearaction for clearing conntrack state.ct_clearis currently implemented in OVS userspace, but is not backed by an action in the kernel datapath. This is useful for flows that may modify a packet tuple after a ct lookup has already occurred.Signed-off-by Eric Garver <[email protected]>---
v2:
- UseIP_CT_UNTRACKEDfornf_ct_set()
- Only fill key if previously conntracked
Looks good.
From: Pravin Shelar <[email protected]>
Date: Tue, 10 Oct 2017 16:34:29 -0700
Quoted 6 lines · Eric Garver
Quoted 5 lines
This adds a
ct_clearaction for clearing conntrack state.ct_clearis currently implemented in OVS userspace, but is not backed by an action in the kernel datapath. This is useful for flows that may modify a packet tuple after a ct lookup has already occurred.
Quoted 8 lines
Quoted 6 lines
Signed-off-by Eric Garver <[email protected]>---
v2:
- UseIP_CT_UNTRACKEDfornf_ct_set()
- Only fill key if previously conntrackedLooks good.
Acked-by Pravin B Shelar <[email protected]>
Applied.