mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-10-31 16:54:21 +00:00 
			
		
		
		
	ipv6: Change skb->data before using icmpv6_notify() to propagate redirect
In function ndisc_redirect_rcv(), the skb->data points to the transport header, but function icmpv6_notify() need the skb->data points to the inner IP packet. So before using icmpv6_notify() to propagate redirect, change skb->data to point the inner IP packet that triggered the sending of the Redirect, and introduce struct rd_msg to make it easy. Signed-off-by: Duan Jiong <djduanjiong@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									1e9f954516
								
							
						
					
					
						commit
						093d04d42f
					
				
					 2 changed files with 24 additions and 0 deletions
				
			
		|  | @ -78,6 +78,13 @@ struct ra_msg { | |||
| 	__be32			retrans_timer; | ||||
| }; | ||||
| 
 | ||||
| struct rd_msg { | ||||
| 	struct icmp6hdr icmph; | ||||
| 	struct in6_addr	target; | ||||
| 	struct in6_addr	dest; | ||||
| 	__u8		opt[0]; | ||||
| }; | ||||
| 
 | ||||
| struct nd_opt_hdr { | ||||
| 	__u8		nd_opt_type; | ||||
| 	__u8		nd_opt_len; | ||||
|  |  | |||
|  | @ -1314,6 +1314,12 @@ out: | |||
| 
 | ||||
| static void ndisc_redirect_rcv(struct sk_buff *skb) | ||||
| { | ||||
| 	u8 *hdr; | ||||
| 	struct ndisc_options ndopts; | ||||
| 	struct rd_msg *msg = (struct rd_msg *)skb_transport_header(skb); | ||||
| 	u32 ndoptlen = skb->tail - (skb->transport_header + | ||||
| 				    offsetof(struct rd_msg, opt)); | ||||
| 
 | ||||
| #ifdef CONFIG_IPV6_NDISC_NODETYPE | ||||
| 	switch (skb->ndisc_nodetype) { | ||||
| 	case NDISC_NODETYPE_HOST: | ||||
|  | @ -1330,6 +1336,17 @@ static void ndisc_redirect_rcv(struct sk_buff *skb) | |||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	if (!ndisc_parse_options(msg->opt, ndoptlen, &ndopts)) | ||||
| 		return; | ||||
| 
 | ||||
| 	if (!ndopts.nd_opts_rh) | ||||
| 		return; | ||||
| 
 | ||||
| 	hdr = (u8 *)ndopts.nd_opts_rh; | ||||
| 	hdr += 8; | ||||
| 	if (!pskb_pull(skb, hdr - skb_transport_header(skb))) | ||||
| 		return; | ||||
| 
 | ||||
| 	icmpv6_notify(skb, NDISC_REDIRECT, 0, 0); | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Duan Jiong
						Duan Jiong