Loading include/net/dst.h +8 −6 Original line number Diff line number Diff line Loading @@ -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 Loading net/decnet/dn_route.c +10 −2 Original line number Diff line number Diff line Loading @@ -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; } Loading @@ -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; } Loading net/ipv4/icmp.c +14 −22 Original line number Diff line number Diff line Loading @@ -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) Loading Loading @@ -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: Loading net/ipv4/netfilter.c +4 −2 Original line number Diff line number Diff line Loading @@ -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); } Loading Loading @@ -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); Loading net/ipv4/route.c +6 −1 Original line number Diff line number Diff line Loading @@ -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 Loading
include/net/dst.h +8 −6 Original line number Diff line number Diff line Loading @@ -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 Loading
net/decnet/dn_route.c +10 −2 Original line number Diff line number Diff line Loading @@ -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; } Loading @@ -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; } Loading
net/ipv4/icmp.c +14 −22 Original line number Diff line number Diff line Loading @@ -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) Loading Loading @@ -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: Loading
net/ipv4/netfilter.c +4 −2 Original line number Diff line number Diff line Loading @@ -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); } Loading Loading @@ -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); Loading
net/ipv4/route.c +6 −1 Original line number Diff line number Diff line Loading @@ -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