Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit de357cc0 authored by YOSHIFUJI Hideaki's avatar YOSHIFUJI Hideaki
Browse files

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

parent 52eeeb84
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -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
+4 −0
Original line number Diff line number Diff line
@@ -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
+10 −0
Original line number Diff line number Diff line
@@ -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