Commit fbea49e1 authored by YOSHIFUJI Hideaki's avatar YOSHIFUJI Hideaki Committed by David S. Miller

[IPV6] NDISC: Add proxy_ndp sysctl.

We do not always need proxy NDP functionality even we
enable forwarding.
Signed-off-by: default avatarYOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 62dd9318
...@@ -765,6 +765,9 @@ conf/all/forwarding - BOOLEAN ...@@ -765,6 +765,9 @@ conf/all/forwarding - BOOLEAN
This referred to as global forwarding. This referred to as global forwarding.
proxy_ndp - BOOLEAN
Do proxy ndp.
conf/interface/*: conf/interface/*:
Change special settings per interface. Change special settings per interface.
......
...@@ -176,6 +176,7 @@ struct ipv6_devconf { ...@@ -176,6 +176,7 @@ struct ipv6_devconf {
__s32 accept_ra_rt_info_max_plen; __s32 accept_ra_rt_info_max_plen;
#endif #endif
#endif #endif
__s32 proxy_ndp;
void *sysctl; void *sysctl;
}; };
...@@ -203,6 +204,7 @@ enum { ...@@ -203,6 +204,7 @@ enum {
DEVCONF_ACCEPT_RA_RTR_PREF, DEVCONF_ACCEPT_RA_RTR_PREF,
DEVCONF_RTR_PROBE_INTERVAL, DEVCONF_RTR_PROBE_INTERVAL,
DEVCONF_ACCEPT_RA_RT_INFO_MAX_PLEN, DEVCONF_ACCEPT_RA_RT_INFO_MAX_PLEN,
DEVCONF_PROXY_NDP,
DEVCONF_MAX DEVCONF_MAX
}; };
......
...@@ -556,6 +556,7 @@ enum { ...@@ -556,6 +556,7 @@ enum {
NET_IPV6_ACCEPT_RA_RTR_PREF=20, NET_IPV6_ACCEPT_RA_RTR_PREF=20,
NET_IPV6_RTR_PROBE_INTERVAL=21, NET_IPV6_RTR_PROBE_INTERVAL=21,
NET_IPV6_ACCEPT_RA_RT_INFO_MAX_PLEN=22, NET_IPV6_ACCEPT_RA_RT_INFO_MAX_PLEN=22,
NET_IPV6_PROXY_NDP=23,
__NET_IPV6_MAX __NET_IPV6_MAX
}; };
......
...@@ -175,6 +175,7 @@ struct ipv6_devconf ipv6_devconf __read_mostly = { ...@@ -175,6 +175,7 @@ struct ipv6_devconf ipv6_devconf __read_mostly = {
.accept_ra_rt_info_max_plen = 0, .accept_ra_rt_info_max_plen = 0,
#endif #endif
#endif #endif
.proxy_ndp = 0,
}; };
static struct ipv6_devconf ipv6_devconf_dflt __read_mostly = { static struct ipv6_devconf ipv6_devconf_dflt __read_mostly = {
...@@ -205,6 +206,7 @@ static struct ipv6_devconf ipv6_devconf_dflt __read_mostly = { ...@@ -205,6 +206,7 @@ static struct ipv6_devconf ipv6_devconf_dflt __read_mostly = {
.accept_ra_rt_info_max_plen = 0, .accept_ra_rt_info_max_plen = 0,
#endif #endif
#endif #endif
.proxy_ndp = 0,
}; };
/* IPv6 Wildcard Address and Loopback Address defined by RFC2553 */ /* IPv6 Wildcard Address and Loopback Address defined by RFC2553 */
...@@ -3337,6 +3339,7 @@ static void inline ipv6_store_devconf(struct ipv6_devconf *cnf, ...@@ -3337,6 +3339,7 @@ static void inline ipv6_store_devconf(struct ipv6_devconf *cnf,
array[DEVCONF_ACCEPT_RA_RT_INFO_MAX_PLEN] = cnf->accept_ra_rt_info_max_plen; array[DEVCONF_ACCEPT_RA_RT_INFO_MAX_PLEN] = cnf->accept_ra_rt_info_max_plen;
#endif #endif
#endif #endif
array[DEVCONF_PROXY_NDP] = cnf->proxy_ndp;
} }
/* Maximum length of ifinfomsg attributes */ /* Maximum length of ifinfomsg attributes */
...@@ -3859,6 +3862,14 @@ static struct addrconf_sysctl_table ...@@ -3859,6 +3862,14 @@ static struct addrconf_sysctl_table
}, },
#endif #endif
#endif #endif
{
.ctl_name = NET_IPV6_PROXY_NDP,
.procname = "proxy_ndp",
.data = &ipv6_devconf.proxy_ndp,
.maxlen = sizeof(int),
.mode = 0644,
.proc_handler = &proc_dointvec,
},
{ {
.ctl_name = 0, /* sentinel */ .ctl_name = 0, /* sentinel */
} }
......
...@@ -412,7 +412,9 @@ int ip6_forward(struct sk_buff *skb) ...@@ -412,7 +412,9 @@ int ip6_forward(struct sk_buff *skb)
return -ETIMEDOUT; return -ETIMEDOUT;
} }
if (pneigh_lookup(&nd_tbl, &hdr->daddr, skb->dev, 0)) { /* XXX: idev->cnf.proxy_ndp? */
if (ipv6_devconf.proxy_ndp &&
pneigh_lookup(&nd_tbl, &hdr->daddr, skb->dev, 0)) {
int proxied = ip6_forward_proxy_check(skb); int proxied = ip6_forward_proxy_check(skb);
if (proxied > 0) if (proxied > 0)
return ip6_input(skb); return ip6_input(skb);
......
...@@ -824,6 +824,7 @@ static void ndisc_recv_ns(struct sk_buff *skb) ...@@ -824,6 +824,7 @@ static void ndisc_recv_ns(struct sk_buff *skb)
if (ipv6_chk_acast_addr(dev, &msg->target) || if (ipv6_chk_acast_addr(dev, &msg->target) ||
(idev->cnf.forwarding && (idev->cnf.forwarding &&
(ipv6_devconf.proxy_ndp || idev->cnf.proxy_ndp) &&
(pneigh = pneigh_lookup(&nd_tbl, (pneigh = pneigh_lookup(&nd_tbl,
&msg->target, dev, 0)) != NULL)) { &msg->target, dev, 0)) != NULL)) {
if (!(NEIGH_CB(skb)->flags & LOCALLY_ENQUEUED) && if (!(NEIGH_CB(skb)->flags & LOCALLY_ENQUEUED) &&
...@@ -966,8 +967,13 @@ static void ndisc_recv_na(struct sk_buff *skb) ...@@ -966,8 +967,13 @@ static void ndisc_recv_na(struct sk_buff *skb)
* has already sent a NA to us. * has already sent a NA to us.
*/ */
if (lladdr && !memcmp(lladdr, dev->dev_addr, dev->addr_len) && if (lladdr && !memcmp(lladdr, dev->dev_addr, dev->addr_len) &&
pneigh_lookup(&nd_tbl, &msg->target, dev, 0)) ipv6_devconf.forwarding && ipv6_devconf.proxy_ndp &&
pneigh_lookup(&nd_tbl, &msg->target, dev, 0)) {
/* XXX: idev->cnf.prixy_ndp */
WARN_ON(skb->dst != NULL &&
((struct rt6_info *)skb->dst)->rt6i_idev);
goto out; goto out;
}
neigh_update(neigh, lladdr, neigh_update(neigh, lladdr,
msg->icmph.icmp6_solicited ? NUD_REACHABLE : NUD_STALE, msg->icmph.icmp6_solicited ? NUD_REACHABLE : NUD_STALE,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment