forked from mirrors/linux
		
	[IPV6]: Find option offset by type.
This is a helper to search option offset from extension header which can carry TLV option like destination options header. Mobile IPv6 home address option will use it. Based on MIPL2 kernel patch. Signed-off-by: Masahide NAKAMURA <nakam@linux-ipv6.org> Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									280a9d3400
								
							
						
					
					
						commit
						c61a404325
					
				
					 2 changed files with 45 additions and 0 deletions
				
			
		|  | @ -506,6 +506,8 @@ extern int			ipv6_skip_exthdr(const struct sk_buff *, int start, | |||
| 
 | ||||
| extern int 			ipv6_ext_hdr(u8 nexthdr); | ||||
| 
 | ||||
| extern int ipv6_find_tlv(struct sk_buff *skb, int offset, int type); | ||||
| 
 | ||||
| extern struct ipv6_txoptions *	ipv6_invert_rthdr(struct sock *sk, | ||||
| 						  struct ipv6_rt_hdr *hdr); | ||||
| 
 | ||||
|  |  | |||
|  | @ -49,6 +49,49 @@ | |||
| 
 | ||||
| #include <asm/uaccess.h> | ||||
| 
 | ||||
| int ipv6_find_tlv(struct sk_buff *skb, int offset, int type) | ||||
| { | ||||
| 	int packet_len = skb->tail - skb->nh.raw; | ||||
| 	struct ipv6_opt_hdr *hdr; | ||||
| 	int len; | ||||
| 
 | ||||
| 	if (offset + 2 > packet_len) | ||||
| 		goto bad; | ||||
| 	hdr = (struct ipv6_opt_hdr*)(skb->nh.raw + offset); | ||||
| 	len = ((hdr->hdrlen + 1) << 3); | ||||
| 
 | ||||
| 	if (offset + len > packet_len) | ||||
| 		goto bad; | ||||
| 
 | ||||
| 	offset += 2; | ||||
| 	len -= 2; | ||||
| 
 | ||||
| 	while (len > 0) { | ||||
| 		int opttype = skb->nh.raw[offset]; | ||||
| 		int optlen; | ||||
| 
 | ||||
| 		if (opttype == type) | ||||
| 			return offset; | ||||
| 
 | ||||
| 		switch (opttype) { | ||||
| 		case IPV6_TLV_PAD0: | ||||
| 			optlen = 1; | ||||
| 			break; | ||||
| 		default: | ||||
| 			optlen = skb->nh.raw[offset + 1] + 2; | ||||
| 			if (optlen > len) | ||||
| 				goto bad; | ||||
| 			break; | ||||
| 		} | ||||
| 		offset += optlen; | ||||
| 		len -= optlen; | ||||
| 	} | ||||
| 	/* not_found */ | ||||
| 	return -1; | ||||
|  bad: | ||||
| 	return -1; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  *	Parsing tlv encoded headers. | ||||
|  * | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Masahide NAKAMURA
						Masahide NAKAMURA