spin_lock_irqsave(&npinfo->rx_lock, flags); 
static void arp_reply(struct sk_buff *skb){	struct netpoll_info *npinfo = skb->dev->npinfo;	struct arphdr *arp;	unsigned char *arp_ptr;	int size, type = ARPOP_REPLY, ptype = ETH_P_ARP;	u32 sip, tip;	unsigned long flags;	struct sk_buff *send_skb;	struct netpoll *np = NULL;	spin_lock_irqsave(&npinfo->rx_lock, flags);	if (npinfo->rx_np && npinfo->rx_np->dev == skb->dev)		np = npinfo->rx_np;	spin_unlock_irqrestore(&npinfo->rx_lock, flags);	if (!np)		return;	/* No arp on this interface */	if (skb->dev->flags & IFF_NOARP)		return;	if (!pskb_may_pull(skb, (sizeof(struct arphdr) +				 (2 * skb->dev->addr_len) +				 (2 * sizeof(u32)))))		return;	skb->h.raw = skb->nh.raw = skb->data;	arp = skb->nh.arph;	if ((arp->ar_hrd != htons(ARPHRD_ETHER) &&	     arp->ar_hrd != htons(ARPHRD_IEEE802)) ||	    arp->ar_pro != htons(ETH_P_IP) ||	    arp->ar_op != htons(ARPOP_REQUEST))		return;	arp_ptr = (unsigned char *)(arp+1) + skb->dev->addr_len;	memcpy(&sip, arp_ptr, 4);	arp_ptr += 4 + skb->dev->addr_len;	memcpy(&tip, arp_ptr, 4);	/* Should we ignore arp? */	if (tip != htonl(np->local_ip) || LOOPBACK(tip) || MULTICAST(tip))		return;	size = sizeof(struct arphdr) + 2 * (skb->dev->addr_len + 4);	send_skb = find_skb(np, size + LL_RESERVED_SPACE(np->dev),			    LL_RESERVED_SPACE(np->dev));	if (!send_skb)		return;	send_skb->nh.raw = send_skb->data;	arp = (struct arphdr *) skb_put(send_skb, size);	send_skb->dev = skb->dev;	send_skb->protocol = htons(ETH_P_ARP);	/* Fill the device header for the ARP frame */	if (np->dev->hard_header &&	    np->dev->hard_header(send_skb, skb->dev, ptype,				       np->remote_mac, np->local_mac,				       send_skb->len) < 0) {		kfree_skb(send_skb);		return;	}	/*	 * Fill out the arp protocol part.	 *	 * we only support ethernet device type,	 * which (according to RFC 1390) should always equal 1 (Ethernet).	 */	arp->ar_hrd = htons(np->dev->type);	arp->ar_pro = htons(ETH_P_IP);	arp->ar_hln = np->dev->addr_len;	arp->ar_pln = 4;	arp->ar_op = htons(type);	arp_ptr=(unsigned char *)(arp + 1);	memcpy(arp_ptr, np->dev->dev_addr, np->dev->addr_len);	arp_ptr += np->dev->addr_len;	memcpy(arp_ptr, &tip, 4);	arp_ptr += 4;	memcpy(arp_ptr, np->remote_mac, np->dev->addr_len);	arp_ptr += np->dev->addr_len;	memcpy(arp_ptr, &sip, 4);	netpoll_send_skb(np, send_skb);}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/a636e1357911afdea7c8344ee65f78d36caf3c16/netpoll.c/buggy/net/core/netpoll.c