Skip to content

Commit 62dd931

Browse files
Ville NuorvalaDavid S. Miller
authored andcommitted
[IPV6] NDISC: Set per-entry is_router flag in Proxy NA.
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]>
1 parent 5f3e6e9 commit 62dd931

File tree

3 files changed

+20
-6
lines changed

3 files changed

+20
-6
lines changed

include/net/neighbour.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ struct pneigh_entry
126126
{
127127
struct pneigh_entry *next;
128128
struct net_device *dev;
129+
u8 flags;
129130
u8 key[0];
130131
};
131132

net/core/neighbour.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1544,9 +1544,14 @@ int neigh_add(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
15441544
lladdr = tb[NDA_LLADDR] ? nla_data(tb[NDA_LLADDR]) : NULL;
15451545

15461546
if (ndm->ndm_flags & NTF_PROXY) {
1547-
err = 0;
1548-
if (pneigh_lookup(tbl, dst, dev, 1) == NULL)
1549-
err = -ENOBUFS;
1547+
struct pneigh_entry *pn;
1548+
1549+
err = -ENOBUFS;
1550+
pn = pneigh_lookup(tbl, dst, dev, 1);
1551+
if (pn) {
1552+
pn->flags = ndm->ndm_flags;
1553+
err = 0;
1554+
}
15501555
goto out_dev_put;
15511556
}
15521557

net/ipv6/ndisc.c

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -736,8 +736,10 @@ static void ndisc_recv_ns(struct sk_buff *skb)
736736
struct inet6_ifaddr *ifp;
737737
struct inet6_dev *idev = NULL;
738738
struct neighbour *neigh;
739+
struct pneigh_entry *pneigh = NULL;
739740
int dad = ipv6_addr_any(saddr);
740741
int inc;
742+
int is_router;
741743

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

823825
if (ipv6_chk_acast_addr(dev, &msg->target) ||
824826
(idev->cnf.forwarding &&
825-
pneigh_lookup(&nd_tbl, &msg->target, dev, 0))) {
827+
(pneigh = pneigh_lookup(&nd_tbl,
828+
&msg->target, dev, 0)) != NULL)) {
826829
if (!(NEIGH_CB(skb)->flags & LOCALLY_ENQUEUED) &&
827830
skb->pkt_type != PACKET_HOST &&
828831
inc != 0 &&
@@ -843,12 +846,17 @@ static void ndisc_recv_ns(struct sk_buff *skb)
843846
goto out;
844847
}
845848

849+
if (pneigh)
850+
is_router = pneigh->flags & NTF_ROUTER;
851+
else
852+
is_router = idev->cnf.forwarding;
853+
846854
if (dad) {
847855
struct in6_addr maddr;
848856

849857
ipv6_addr_all_nodes(&maddr);
850858
ndisc_send_na(dev, NULL, &maddr, &msg->target,
851-
idev->cnf.forwarding, 0, (ifp != NULL), 1);
859+
is_router, 0, (ifp != NULL), 1);
852860
goto out;
853861
}
854862

@@ -869,7 +877,7 @@ static void ndisc_recv_ns(struct sk_buff *skb)
869877
NEIGH_UPDATE_F_OVERRIDE);
870878
if (neigh || !dev->hard_header) {
871879
ndisc_send_na(dev, neigh, saddr, &msg->target,
872-
idev->cnf.forwarding,
880+
is_router,
873881
1, (ifp != NULL && inc), inc);
874882
if (neigh)
875883
neigh_release(neigh);

0 commit comments

Comments
 (0)