diff options
Diffstat (limited to 'net/openvswitch/flow.c')
| -rw-r--r-- | net/openvswitch/flow.c | 16 | 
1 files changed, 13 insertions, 3 deletions
| diff --git a/net/openvswitch/flow.c b/net/openvswitch/flow.c index 6d262d9aa10e..02096f2ec678 100644 --- a/net/openvswitch/flow.c +++ b/net/openvswitch/flow.c @@ -859,7 +859,7 @@ int ovs_flow_key_extract(const struct ip_tunnel_info *tun_info,  #if IS_ENABLED(CONFIG_NET_TC_SKB_EXT)  	struct tc_skb_ext *tc_ext;  #endif -	bool post_ct = false; +	bool post_ct = false, post_ct_snat = false, post_ct_dnat = false;  	int res, err;  	u16 zone = 0; @@ -900,6 +900,8 @@ int ovs_flow_key_extract(const struct ip_tunnel_info *tun_info,  		key->recirc_id = tc_ext ? tc_ext->chain : 0;  		OVS_CB(skb)->mru = tc_ext ? tc_ext->mru : 0;  		post_ct = tc_ext ? tc_ext->post_ct : false; +		post_ct_snat = post_ct ? tc_ext->post_ct_snat : false; +		post_ct_dnat = post_ct ? tc_ext->post_ct_dnat : false;  		zone = post_ct ? tc_ext->zone : 0;  	} else {  		key->recirc_id = 0; @@ -911,8 +913,16 @@ int ovs_flow_key_extract(const struct ip_tunnel_info *tun_info,  	err = key_extract(skb, key);  	if (!err) {  		ovs_ct_fill_key(skb, key, post_ct);   /* Must be after key_extract(). */ -		if (post_ct && !skb_get_nfct(skb)) -			key->ct_zone = zone; +		if (post_ct) { +			if (!skb_get_nfct(skb)) { +				key->ct_zone = zone; +			} else { +				if (!post_ct_dnat) +					key->ct_state &= ~OVS_CS_F_DST_NAT; +				if (!post_ct_snat) +					key->ct_state &= ~OVS_CS_F_SRC_NAT; +			} +		}  	}  	return err;  } |