LIMIT_NETDEBUG( printk(KERN_DEBUG "icmpv6: msg of unknown type\n")); 
LIMIT_NETDEBUG(KERN_DEBUG "icmpv6: msg of unknown type\n"); 
static int icmpv6_rcv(struct sk_buff **pskb, unsigned int *nhoffp){	struct sk_buff *skb = *pskb;	struct net_device *dev = skb->dev;	struct inet6_dev *idev = __in6_dev_get(dev);	struct in6_addr *saddr, *daddr;	struct ipv6hdr *orig_hdr;	struct icmp6hdr *hdr;	int type;	ICMP6_INC_STATS_BH(idev, ICMP6_MIB_INMSGS);	saddr = &skb->nh.ipv6h->saddr;	daddr = &skb->nh.ipv6h->daddr;	/* Perform checksum. */	if (skb->ip_summed == CHECKSUM_HW) {		skb->ip_summed = CHECKSUM_UNNECESSARY;		if (csum_ipv6_magic(saddr, daddr, skb->len, IPPROTO_ICMPV6,				    skb->csum)) {			LIMIT_NETDEBUG(				printk(KERN_DEBUG "ICMPv6 hw checksum failed\n"));			skb->ip_summed = CHECKSUM_NONE;		}	}	if (skb->ip_summed == CHECKSUM_NONE) {		if (csum_ipv6_magic(saddr, daddr, skb->len, IPPROTO_ICMPV6,				    skb_checksum(skb, 0, skb->len, 0))) {			LIMIT_NETDEBUG(				printk(KERN_DEBUG "ICMPv6 checksum failed [%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x > %04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x]\n",				       NIP6(*saddr), NIP6(*daddr)));			goto discard_it;		}	}	if (!pskb_pull(skb, sizeof(struct icmp6hdr)))		goto discard_it;	hdr = (struct icmp6hdr *) skb->h.raw;	type = hdr->icmp6_type;	if (type >= ICMPV6_DEST_UNREACH && type <= ICMPV6_PARAMPROB)		ICMP6_INC_STATS_OFFSET_BH(idev, ICMP6_MIB_INDESTUNREACHS, type - ICMPV6_DEST_UNREACH);	else if (type >= ICMPV6_ECHO_REQUEST && type <= NDISC_REDIRECT)		ICMP6_INC_STATS_OFFSET_BH(idev, ICMP6_MIB_INECHOS, type - ICMPV6_ECHO_REQUEST);	switch (type) {	case ICMPV6_ECHO_REQUEST:		icmpv6_echo_reply(skb);		break;	case ICMPV6_ECHO_REPLY:		/* we couldn't care less */		break;	case ICMPV6_PKT_TOOBIG:		/* BUGGG_FUTURE: if packet contains rthdr, we cannot update		   standard destination cache. Seems, only "advanced"		   destination cache will allow to solve this problem		   --ANK (980726)		 */		if (!pskb_may_pull(skb, sizeof(struct ipv6hdr)))			goto discard_it;		hdr = (struct icmp6hdr *) skb->h.raw;		orig_hdr = (struct ipv6hdr *) (hdr + 1);		rt6_pmtu_discovery(&orig_hdr->daddr, &orig_hdr->saddr, dev,				   ntohl(hdr->icmp6_mtu));		/*		 *	Drop through to notify		 */	case ICMPV6_DEST_UNREACH:	case ICMPV6_TIME_EXCEED:	case ICMPV6_PARAMPROB:		icmpv6_notify(skb, type, hdr->icmp6_code, hdr->icmp6_mtu);		break;	case NDISC_ROUTER_SOLICITATION:	case NDISC_ROUTER_ADVERTISEMENT:	case NDISC_NEIGHBOUR_SOLICITATION:	case NDISC_NEIGHBOUR_ADVERTISEMENT:	case NDISC_REDIRECT:		ndisc_rcv(skb);		break;	case ICMPV6_MGM_QUERY:		igmp6_event_query(skb);		break;	case ICMPV6_MGM_REPORT:		igmp6_event_report(skb);		break;	case ICMPV6_MGM_REDUCTION:	case ICMPV6_NI_QUERY:	case ICMPV6_NI_REPLY:	case ICMPV6_MLD2_REPORT:	case ICMPV6_DHAAD_REQUEST:	case ICMPV6_DHAAD_REPLY:	case ICMPV6_MOBILE_PREFIX_SOL:	case ICMPV6_MOBILE_PREFIX_ADV:		break;	default:		LIMIT_NETDEBUG(			printk(KERN_DEBUG "icmpv6: msg of unknown type\n"));		/* informational */		if (type & ICMPV6_INFOMSG_MASK)			break;		/* 		 * error of unknown type. 		 * must pass to upper level 		 */		icmpv6_notify(skb, type, hdr->icmp6_code, hdr->icmp6_mtu);	};	kfree_skb(skb);	return 0;discard_it:	ICMP6_INC_STATS_BH(idev, ICMP6_MIB_INERRORS);	kfree_skb(skb);	return 0;}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/64ce207306debd7157f47282be94770407bec01c/icmp.c/clean/net/ipv6/icmp.c