Skip to content

Commit

Permalink
[IPV6] NDISC: Set per-entry is_router flag in Proxy NA.
Browse files Browse the repository at this point in the history
We have sent NA with router flag from the node-wide forwarding
configuration.  This is not appropriate for proxy NA, and it should be
set according to each proxy entry's configuration.

This is used by Mobile IPv6 home agent to support physical home link
in acting as a proxy router for mobile node which is not a router,
for example.

Based on MIPL2 kernel patch.

Signed-off-by: Ville Nuorvala <[email protected]>
Signed-off-by: Masahide NAKAMURA <[email protected]>
Signed-off-by: YOSHIFUJI Hideaki <[email protected]>
  • Loading branch information
Ville Nuorvala authored and David S. Miller committed Sep 22, 2006
1 parent 5f3e6e9 commit 62dd931
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 6 deletions.
1 change: 1 addition & 0 deletions include/net/neighbour.h
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,7 @@ struct pneigh_entry
{
struct pneigh_entry *next;
struct net_device *dev;
u8 flags;
u8 key[0];
};

Expand Down
11 changes: 8 additions & 3 deletions net/core/neighbour.c
Original file line number Diff line number Diff line change
Expand Up @@ -1544,9 +1544,14 @@ int neigh_add(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
lladdr = tb[NDA_LLADDR] ? nla_data(tb[NDA_LLADDR]) : NULL;

if (ndm->ndm_flags & NTF_PROXY) {
err = 0;
if (pneigh_lookup(tbl, dst, dev, 1) == NULL)
err = -ENOBUFS;
struct pneigh_entry *pn;

err = -ENOBUFS;
pn = pneigh_lookup(tbl, dst, dev, 1);
if (pn) {
pn->flags = ndm->ndm_flags;
err = 0;
}
goto out_dev_put;
}

Expand Down
14 changes: 11 additions & 3 deletions net/ipv6/ndisc.c
Original file line number Diff line number Diff line change
Expand Up @@ -736,8 +736,10 @@ static void ndisc_recv_ns(struct sk_buff *skb)
struct inet6_ifaddr *ifp;
struct inet6_dev *idev = NULL;
struct neighbour *neigh;
struct pneigh_entry *pneigh = NULL;
int dad = ipv6_addr_any(saddr);
int inc;
int is_router;

if (ipv6_addr_is_multicast(&msg->target)) {
ND_PRINTK2(KERN_WARNING
Expand Down Expand Up @@ -822,7 +824,8 @@ static void ndisc_recv_ns(struct sk_buff *skb)

if (ipv6_chk_acast_addr(dev, &msg->target) ||
(idev->cnf.forwarding &&
pneigh_lookup(&nd_tbl, &msg->target, dev, 0))) {
(pneigh = pneigh_lookup(&nd_tbl,
&msg->target, dev, 0)) != NULL)) {
if (!(NEIGH_CB(skb)->flags & LOCALLY_ENQUEUED) &&
skb->pkt_type != PACKET_HOST &&
inc != 0 &&
Expand All @@ -843,12 +846,17 @@ static void ndisc_recv_ns(struct sk_buff *skb)
goto out;
}

if (pneigh)
is_router = pneigh->flags & NTF_ROUTER;
else
is_router = idev->cnf.forwarding;

if (dad) {
struct in6_addr maddr;

ipv6_addr_all_nodes(&maddr);
ndisc_send_na(dev, NULL, &maddr, &msg->target,
idev->cnf.forwarding, 0, (ifp != NULL), 1);
is_router, 0, (ifp != NULL), 1);
goto out;
}

Expand All @@ -869,7 +877,7 @@ static void ndisc_recv_ns(struct sk_buff *skb)
NEIGH_UPDATE_F_OVERRIDE);
if (neigh || !dev->hard_header) {
ndisc_send_na(dev, neigh, saddr, &msg->target,
idev->cnf.forwarding,
is_router,
1, (ifp != NULL && inc), inc);
if (neigh)
neigh_release(neigh);
Expand Down

0 comments on commit 62dd931

Please sign in to comment.