X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=net%2Fipv6%2Froute.c;h=8d9a93ed9c5926924b809b5bb68b267c07f3ca61;hb=2d31b15b868b5369eb326464e6634ea5afba7a44;hp=b70f8979003b5e23c4b1e78e44713ba3d3520de9;hpb=69b4a3a030df04e0b8961070fc33da6a5c0a19bb;p=~andy%2Flinux diff --git a/net/ipv6/route.c b/net/ipv6/route.c index b70f8979003..8d9a93ed9c5 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c @@ -1178,6 +1178,27 @@ void ip6_redirect(struct sk_buff *skb, struct net *net, int oif, u32 mark) } EXPORT_SYMBOL_GPL(ip6_redirect); +void ip6_redirect_no_header(struct sk_buff *skb, struct net *net, int oif, + u32 mark) +{ + const struct ipv6hdr *iph = ipv6_hdr(skb); + const struct rd_msg *msg = (struct rd_msg *)icmp6_hdr(skb); + struct dst_entry *dst; + struct flowi6 fl6; + + memset(&fl6, 0, sizeof(fl6)); + fl6.flowi6_oif = oif; + fl6.flowi6_mark = mark; + fl6.flowi6_flags = 0; + fl6.daddr = msg->dest; + fl6.saddr = iph->daddr; + + dst = ip6_route_output(net, NULL, &fl6); + if (!dst->error) + rt6_do_redirect(dst, NULL, skb); + dst_release(dst); +} + void ip6_sk_redirect(struct sk_buff *skb, struct sock *sk) { ip6_redirect(skb, sock_net(sk), sk->sk_bound_dev_if, sk->sk_mark);