Skip to content

Commit

Permalink
[IPV6] NDISC: Handle NDP messages to proxied addresses.
Browse files Browse the repository at this point in the history
It is required to respond to NDP messages sent directly to the "target"
unicast address.  Proxying node (router) is required to handle such
messages.  To achieve this, check if the packet in forwarding patch is
NDP message.

With this patch, the proxy neighbor entries are always looked up in
forwarding path.  We may want to optimize further.

Based on MIPL2 kernel patch.

Signed-off-by: Ville Nuorvala <vnuorval@tcs.hut.fi>
Signed-off-by: Masahide NAKAMURA <nakam@linux-ipv6.org>
Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
  • Loading branch information
Ville Nuorvala authored and David S. Miller committed Sep 22, 2006
1 parent 4c5de69 commit e21e0b5
Showing 1 changed file with 45 additions and 0 deletions.
45 changes: 45 additions & 0 deletions net/ipv6/ip6_output.c
Original file line number Diff line number Diff line change
Expand Up @@ -308,6 +308,46 @@ static int ip6_call_ra_chain(struct sk_buff *skb, int sel)
return 0;
}

static int ip6_forward_proxy_check(struct sk_buff *skb)
{
struct ipv6hdr *hdr = skb->nh.ipv6h;
u8 nexthdr = hdr->nexthdr;
int offset;

if (ipv6_ext_hdr(nexthdr)) {
offset = ipv6_skip_exthdr(skb, sizeof(*hdr), &nexthdr);
if (offset < 0)
return 0;
} else
offset = sizeof(struct ipv6hdr);

if (nexthdr == IPPROTO_ICMPV6) {
struct icmp6hdr *icmp6;

if (!pskb_may_pull(skb, skb->nh.raw + offset + 1 - skb->data))
return 0;

icmp6 = (struct icmp6hdr *)(skb->nh.raw + offset);

switch (icmp6->icmp6_type) {
case NDISC_ROUTER_SOLICITATION:
case NDISC_ROUTER_ADVERTISEMENT:
case NDISC_NEIGHBOUR_SOLICITATION:
case NDISC_NEIGHBOUR_ADVERTISEMENT:
case NDISC_REDIRECT:
/* For reaction involving unicast neighbor discovery
* message destined to the proxied address, pass it to
* input function.
*/
return 1;
default:
break;
}
}

return 0;
}

static inline int ip6_forward_finish(struct sk_buff *skb)
{
return dst_output(skb);
Expand Down Expand Up @@ -362,6 +402,11 @@ int ip6_forward(struct sk_buff *skb)
return -ETIMEDOUT;
}

if (pneigh_lookup(&nd_tbl, &hdr->daddr, skb->dev, 0)) {
if (ip6_forward_proxy_check(skb))
return ip6_input(skb);
}

if (!xfrm6_route_forward(skb)) {
IP6_INC_STATS(IPSTATS_MIB_INDISCARDS);
goto drop;
Expand Down

0 comments on commit e21e0b5

Please sign in to comment.