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