提交 74553b09 编写于 作者: V Ville Nuorvala 提交者: David S. Miller

[IPV6]: Don't forward packets to proxied link-local address.

Proxying router can't forward traffic sent to link-local address, so signal
the sender and discard the packet. This behavior is clarified by Mobile IPv6
specification (RFC3775) but might be required for all proxying router.
Based on MIPL2 kernel patch.
Signed-off-by: NVille Nuorvala <vnuorval@tcs.hut.fi>
Signed-off-by: NMasahide NAKAMURA <nakam@linux-ipv6.org>
Signed-off-by: NYOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
上级 e21e0b5f
...@@ -345,6 +345,16 @@ static int ip6_forward_proxy_check(struct sk_buff *skb) ...@@ -345,6 +345,16 @@ static int ip6_forward_proxy_check(struct sk_buff *skb)
} }
} }
/*
* The proxying router can't forward traffic sent to a link-local
* address, so signal the sender and discard the packet. This
* behavior is clarified by the MIPv6 specification.
*/
if (ipv6_addr_type(&hdr->daddr) & IPV6_ADDR_LINKLOCAL) {
dst_link_failure(skb);
return -1;
}
return 0; return 0;
} }
...@@ -403,8 +413,13 @@ int ip6_forward(struct sk_buff *skb) ...@@ -403,8 +413,13 @@ int ip6_forward(struct sk_buff *skb)
} }
if (pneigh_lookup(&nd_tbl, &hdr->daddr, skb->dev, 0)) { if (pneigh_lookup(&nd_tbl, &hdr->daddr, skb->dev, 0)) {
if (ip6_forward_proxy_check(skb)) int proxied = ip6_forward_proxy_check(skb);
if (proxied > 0)
return ip6_input(skb); return ip6_input(skb);
else if (proxied < 0) {
IP6_INC_STATS(IPSTATS_MIB_INDISCARDS);
goto drop;
}
} }
if (!xfrm6_route_forward(skb)) { if (!xfrm6_route_forward(skb)) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册