Commit de357cc0 authored by YOSHIFUJI Hideaki's avatar YOSHIFUJI Hideaki

[IPV6] NDISC: Don't rely on node-type hint from L2 unless required.

Signed-off-by: default avatarYOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
parent 52eeeb84
...@@ -313,7 +313,9 @@ struct sk_buff { ...@@ -313,7 +313,9 @@ struct sk_buff {
__u16 tc_verd; /* traffic control verdict */ __u16 tc_verd; /* traffic control verdict */
#endif #endif
#endif #endif
#ifdef CONFIG_IPV6_NDISC_NODETYPE
__u8 ndisc_nodetype:2; __u8 ndisc_nodetype:2;
#endif
/* 14 bit hole */ /* 14 bit hole */
#ifdef CONFIG_NET_DMA #ifdef CONFIG_NET_DMA
......
...@@ -168,6 +168,7 @@ config IPV6_SIT ...@@ -168,6 +168,7 @@ config IPV6_SIT
tristate "IPv6: IPv6-in-IPv4 tunnel (SIT driver)" tristate "IPv6: IPv6-in-IPv4 tunnel (SIT driver)"
depends on IPV6 depends on IPV6
select INET_TUNNEL select INET_TUNNEL
select IPV6_NDISC_NODETYPE
default y default y
---help--- ---help---
Tunneling means encapsulating data of one protocol type within Tunneling means encapsulating data of one protocol type within
...@@ -178,6 +179,9 @@ config IPV6_SIT ...@@ -178,6 +179,9 @@ config IPV6_SIT
Saying M here will produce a module called sit.ko. If unsure, say Y. Saying M here will produce a module called sit.ko. If unsure, say Y.
config IPV6_NDISC_NODETYPE
bool
config IPV6_TUNNEL config IPV6_TUNNEL
tristate "IPv6: IP-in-IPv6 tunnel (RFC2473)" tristate "IPv6: IP-in-IPv6 tunnel (RFC2473)"
select INET6_TUNNEL select INET6_TUNNEL
......
...@@ -1092,11 +1092,13 @@ static void ndisc_router_discovery(struct sk_buff *skb) ...@@ -1092,11 +1092,13 @@ static void ndisc_router_discovery(struct sk_buff *skb)
return; return;
} }
#ifdef CONFIG_IPV6_NDISC_NODETYPE
if (skb->ndisc_nodetype == NDISC_NODETYPE_HOST) { if (skb->ndisc_nodetype == NDISC_NODETYPE_HOST) {
ND_PRINTK2(KERN_WARNING ND_PRINTK2(KERN_WARNING
"ICMPv6 RA: from host or unauthorized router\n"); "ICMPv6 RA: from host or unauthorized router\n");
return; return;
} }
#endif
/* /*
* set the RA_RECV flag in the interface * set the RA_RECV flag in the interface
...@@ -1121,9 +1123,11 @@ static void ndisc_router_discovery(struct sk_buff *skb) ...@@ -1121,9 +1123,11 @@ static void ndisc_router_discovery(struct sk_buff *skb)
return; return;
} }
#ifdef CONFIG_IPV6_NDISC_NODETYPE
/* skip link-specific parameters from interior routers */ /* skip link-specific parameters from interior routers */
if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT) if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT)
goto skip_linkparms; goto skip_linkparms;
#endif
if (in6_dev->if_flags & IF_RS_SENT) { if (in6_dev->if_flags & IF_RS_SENT) {
/* /*
...@@ -1239,7 +1243,9 @@ skip_defrtr: ...@@ -1239,7 +1243,9 @@ skip_defrtr:
} }
} }
#ifdef CONFIG_IPV6_NDISC_NODETYPE
skip_linkparms: skip_linkparms:
#endif
/* /*
* Process options. * Process options.
...@@ -1286,9 +1292,11 @@ skip_linkparms: ...@@ -1286,9 +1292,11 @@ skip_linkparms:
} }
#endif #endif
#ifdef CONFIG_IPV6_NDISC_NODETYPE
/* skip link-specific ndopts from interior routers */ /* skip link-specific ndopts from interior routers */
if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT) if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT)
goto out; goto out;
#endif
if (in6_dev->cnf.accept_ra_pinfo && ndopts.nd_opts_pi) { if (in6_dev->cnf.accept_ra_pinfo && ndopts.nd_opts_pi) {
struct nd_opt_hdr *p; struct nd_opt_hdr *p;
...@@ -1353,6 +1361,7 @@ static void ndisc_redirect_rcv(struct sk_buff *skb) ...@@ -1353,6 +1361,7 @@ static void ndisc_redirect_rcv(struct sk_buff *skb)
int optlen; int optlen;
u8 *lladdr = NULL; u8 *lladdr = NULL;
#ifdef CONFIG_IPV6_NDISC_NODETYPE
switch (skb->ndisc_nodetype) { switch (skb->ndisc_nodetype) {
case NDISC_NODETYPE_HOST: case NDISC_NODETYPE_HOST:
case NDISC_NODETYPE_NODEFAULT: case NDISC_NODETYPE_NODEFAULT:
...@@ -1360,6 +1369,7 @@ static void ndisc_redirect_rcv(struct sk_buff *skb) ...@@ -1360,6 +1369,7 @@ static void ndisc_redirect_rcv(struct sk_buff *skb)
"ICMPv6 Redirect: from host or unauthorized router\n"); "ICMPv6 Redirect: from host or unauthorized router\n");
return; return;
} }
#endif
if (!(ipv6_addr_type(&ipv6_hdr(skb)->saddr) & IPV6_ADDR_LINKLOCAL)) { if (!(ipv6_addr_type(&ipv6_hdr(skb)->saddr) & IPV6_ADDR_LINKLOCAL)) {
ND_PRINTK2(KERN_WARNING ND_PRINTK2(KERN_WARNING
......
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