inner_offset = ipv6_skip_exthdr(skb, sizeof(struct ipv6hdr), &nexthdr, skb->len - sizeof(struct ipv6hdr)); 
inner_offset = ipv6_skip_exthdr(skb, sizeof(struct ipv6hdr), &nexthdr); 
static void icmpv6_notify(struct sk_buff *skb, int type, int code, u32 info){	struct in6_addr *saddr, *daddr;	struct inet6_protocol *ipprot;	struct sock *sk;	int inner_offset;	int hash;	u8 nexthdr;	if (!pskb_may_pull(skb, sizeof(struct ipv6hdr)))		return;	nexthdr = ((struct ipv6hdr *)skb->data)->nexthdr;	if (ipv6_ext_hdr(nexthdr)) {		/* now skip over extension headers */		inner_offset = ipv6_skip_exthdr(skb, sizeof(struct ipv6hdr), &nexthdr, skb->len - sizeof(struct ipv6hdr));		if (inner_offset<0)			return;	} else {		inner_offset = sizeof(struct ipv6hdr);	}	/* Checkin header including 8 bytes of inner protocol header. */	if (!pskb_may_pull(skb, inner_offset+8))		return;	saddr = &skb->nh.ipv6h->saddr;	daddr = &skb->nh.ipv6h->daddr;	/* BUGGG_FUTURE: we should try to parse exthdrs in this packet.	   Without this we will not able f.e. to make source routed	   pmtu discovery.	   Corresponding argument (opt) to notifiers is already added.	   --ANK (980726)	 */	hash = nexthdr & (MAX_INET_PROTOS - 1);	rcu_read_lock();	ipprot = rcu_dereference(inet6_protos[hash]);	if (ipprot && ipprot->err_handler)		ipprot->err_handler(skb, NULL, type, code, inner_offset, info);	rcu_read_unlock();	read_lock(&raw_v6_lock);	if ((sk = sk_head(&raw_v6_htable[hash])) != NULL) {		while((sk = __raw_v6_lookup(sk, nexthdr, daddr, saddr))) {			rawv6_err(sk, skb, NULL, type, code, inner_offset, info);			sk = sk_next(sk);		}	}	read_unlock(&raw_v6_lock);}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/0d3d077cd4f1154e63a9858e47fe3fb1ad0c03e5/icmp.c/clean/net/ipv6/icmp.c