/* Check if the ARP request is probing the private IP address dedicated to iSCSI, generate an ARP reply if so.  */
static void cxgb3_arp_process(struct port_info *pi, struct sk_buff *skb)
/* Check if the ARP request is probing the private IP address dedicated to iSCSI, generate an ARP reply if so.  */
static void cxgb3_arp_process(struct port_info *pi, struct sk_buff *skb)
{
	struct net_device *dev = skb->dev;
	struct arphdr *arp;
	unsigned char *arp_ptr;
	unsigned char *sha;
	__be32 sip, tip;
	if (!dev)
		return;
	skb_reset_network_header(skb);
	arp = arp_hdr(skb);
	if (arp->ar_op != htons(ARPOP_REQUEST))
		return;
	arp_ptr = (unsigned char *)(arp + 1);
	sha = arp_ptr;
	arp_ptr += dev->addr_len;
	memcpy(&sip, arp_ptr, sizeof(sip));
	arp_ptr += sizeof(sip);
	arp_ptr += dev->addr_len;
	memcpy(&tip, arp_ptr, sizeof(tip));
	if (tip != pi->iscsi_ipv4addr)
		return;
	arp_send(ARPOP_REPLY, ETH_P_ARP, sip, dev, tip, sha,
		 pi->iscsic.mac_addr, sha);
}