diff options
Diffstat (limited to 'net/xfrm/xfrm_policy.c')
| -rw-r--r-- | net/xfrm/xfrm_policy.c | 16 | 
1 files changed, 11 insertions, 5 deletions
| diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index c5035a9bc3bb..62486f866975 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c @@ -2594,7 +2594,7 @@ xfrm_tmpl_resolve(struct xfrm_policy **pols, int npols, const struct flowi *fl,  static dscp_t xfrm_get_dscp(const struct flowi *fl, int family)  {  	if (family == AF_INET) -		return inet_dsfield_to_dscp(fl->u.ip4.flowi4_tos); +		return fl->u.ip4.flowi4_dscp;  	return 0;  } @@ -3462,7 +3462,7 @@ decode_session4(const struct xfrm_flow_keys *flkeys, struct flowi *fl, bool reve  	}  	fl4->flowi4_proto = flkeys->basic.ip_proto; -	fl4->flowi4_tos = flkeys->ip.tos & ~INET_ECN_MASK; +	fl4->flowi4_dscp = inet_dsfield_to_dscp(flkeys->ip.tos);  }  #if IS_ENABLED(CONFIG_IPV6) @@ -3594,7 +3594,7 @@ static bool xfrm_icmp_flow_decode(struct sk_buff *skb, unsigned short family,  	fl1->flowi_oif = fl->flowi_oif;  	fl1->flowi_mark = fl->flowi_mark; -	fl1->flowi_tos = fl->flowi_tos; +	fl1->flowi_dscp = fl->flowi_dscp;  	nf_nat_decode_session(newskb, fl1, family);  	ret = false; @@ -3881,12 +3881,18 @@ int __xfrm_route_forward(struct sk_buff *skb, unsigned short family)  	}  	skb_dst_force(skb); -	if (!skb_dst(skb)) { +	dst = skb_dst(skb); +	if (!dst) {  		XFRM_INC_STATS(net, LINUX_MIB_XFRMFWDHDRERROR);  		return 0;  	} -	dst = xfrm_lookup(net, skb_dst(skb), &fl, NULL, XFRM_LOOKUP_QUEUE); +	/* ignore return value from skb_dstref_steal, xfrm_lookup takes +	 * care of dropping the refcnt if needed. +	 */ +	skb_dstref_steal(skb); + +	dst = xfrm_lookup(net, dst, &fl, NULL, XFRM_LOOKUP_QUEUE);  	if (IS_ERR(dst)) {  		res = 0;  		dst = NULL; | 
