Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 452edd59 authored by David S. Miller's avatar David S. Miller
Browse files

xfrm: Return dst directly from xfrm_lookup()



Instead of on the stack.

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 3872b284
Loading
Loading
Loading
Loading
+8 −6
Original line number Diff line number Diff line
@@ -426,15 +426,17 @@ enum {

struct flowi;
#ifndef CONFIG_XFRM
static inline int xfrm_lookup(struct net *net, struct dst_entry **dst_p,
static inline struct dst_entry *xfrm_lookup(struct net *net,
					    struct dst_entry *dst_orig,
					    const struct flowi *fl, struct sock *sk,
					    int flags)
{
	return 0;
	return dst_orig;
} 
#else
extern int xfrm_lookup(struct net *net, struct dst_entry **dst_p,
		       const struct flowi *fl, struct sock *sk, int flags);
extern struct dst_entry *xfrm_lookup(struct net *net, struct dst_entry *dst_orig,
				     const struct flowi *fl, struct sock *sk,
				     int flags);
#endif
#endif

+10 −2
Original line number Diff line number Diff line
@@ -1222,7 +1222,11 @@ static int dn_route_output_key(struct dst_entry **pprt, struct flowi *flp, int f

	err = __dn_route_output_key(pprt, flp, flags);
	if (err == 0 && flp->proto) {
		err = xfrm_lookup(&init_net, pprt, flp, NULL, 0);
		*pprt = xfrm_lookup(&init_net, *pprt, flp, NULL, 0);
		if (IS_ERR(*pprt)) {
			err = PTR_ERR(*pprt);
			*pprt = NULL;
		}
	}
	return err;
}
@@ -1235,7 +1239,11 @@ int dn_route_output_sock(struct dst_entry **pprt, struct flowi *fl, struct sock
	if (err == 0 && fl->proto) {
		if (!(flags & MSG_DONTWAIT))
			fl->flags |= FLOWI_FLAG_CAN_SLEEP;
		err = xfrm_lookup(&init_net, pprt, fl, sk, 0);
		*pprt = xfrm_lookup(&init_net, *pprt, fl, sk, 0);
		if (IS_ERR(*pprt)) {
			err = PTR_ERR(*pprt);
			*pprt = NULL;
		}
	}
	return err;
}
+14 −22
Original line number Diff line number Diff line
@@ -398,18 +398,14 @@ static struct rtable *icmp_route_lookup(struct net *net, struct sk_buff *skb_in,
	if (!fl.fl4_src)
		fl.fl4_src = rt->rt_src;

	err = xfrm_lookup(net, (struct dst_entry **)&rt, &fl, NULL, 0);
	switch (err) {
	case 0:
	rt = (struct rtable *) xfrm_lookup(net, &rt->dst, &fl, NULL, 0);
	if (!IS_ERR(rt)) {
		if (rt != rt2)
			return rt;
		break;
	case -EPERM:
	} else if (PTR_ERR(rt) == -EPERM) {
		rt = NULL;
		break;
	default:
		return ERR_PTR(err);
	}
	} else
		return rt;

	err = xfrm_decode_session_reverse(skb_in, &fl, AF_INET);
	if (err)
@@ -438,22 +434,18 @@ static struct rtable *icmp_route_lookup(struct net *net, struct sk_buff *skb_in,
	if (err)
		goto relookup_failed;

	err = xfrm_lookup(net, (struct dst_entry **)&rt2, &fl, NULL,
			  XFRM_LOOKUP_ICMP);
	switch (err) {
	case 0:
	rt2 = (struct rtable *) xfrm_lookup(net, &rt2->dst, &fl, NULL, XFRM_LOOKUP_ICMP);
	if (!IS_ERR(rt2)) {
		dst_release(&rt->dst);
		rt = rt2;
		break;
	case -EPERM:
		return ERR_PTR(err);
	default:
		if (!rt)
			return ERR_PTR(err);
		break;
	} else if (PTR_ERR(rt2) == -EPERM) {
		if (rt)
			dst_release(&rt->dst);
		return rt2;
	} else {
		err = PTR_ERR(rt2);
		goto relookup_failed;
	}


	return rt;

relookup_failed:
+4 −2
Original line number Diff line number Diff line
@@ -69,7 +69,8 @@ int ip_route_me_harder(struct sk_buff *skb, unsigned addr_type)
	    xfrm_decode_session(skb, &fl, AF_INET) == 0) {
		struct dst_entry *dst = skb_dst(skb);
		skb_dst_set(skb, NULL);
		if (xfrm_lookup(net, &dst, &fl, skb->sk, 0))
		dst = xfrm_lookup(net, dst, &fl, skb->sk, 0);
		if (IS_ERR(dst))
			return -1;
		skb_dst_set(skb, dst);
	}
@@ -102,7 +103,8 @@ int ip_xfrm_me_harder(struct sk_buff *skb)
		dst = ((struct xfrm_dst *)dst)->route;
	dst_hold(dst);

	if (xfrm_lookup(dev_net(dst->dev), &dst, &fl, skb->sk, 0) < 0)
	dst = xfrm_lookup(dev_net(dst->dev), dst, &fl, skb->sk, 0);
	if (IS_ERR(dst))
		return -1;

	skb_dst_drop(skb);
+6 −1
Original line number Diff line number Diff line
@@ -2730,7 +2730,12 @@ int ip_route_output_flow(struct net *net, struct rtable **rp, struct flowi *flp,
			flp->fl4_src = (*rp)->rt_src;
		if (!flp->fl4_dst)
			flp->fl4_dst = (*rp)->rt_dst;
		return xfrm_lookup(net, (struct dst_entry **)rp, flp, sk, 0);
		*rp = (struct rtable *) xfrm_lookup(net, &(*rp)->dst, flp, sk, 0);
		if (IS_ERR(*rp)) {
			err = PTR_ERR(*rp);
			*rp = NULL;
			return err;
		}
	}

	return 0;
Loading