cxgb3: Added private MAC address and provisioning packet handler for iSCSI
This patch added support of private MAC address per port and provisioning packet handler for iSCSI traffic only. The above changes are isolated to the cxgb3 driver, independent of any scsi or iscsi driver changes. Acked-by: Karen Xie <kxie@chelsio.com> Acked-by: Divy Le Ray <divy@chelsio.com> Signed-off-by: Rakesh Ranjan <rakesh@chelsio.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
bcd5149ded
commit
f14d42f314
@@ -1946,10 +1946,9 @@ static void restart_tx(struct sge_qset *qs)
|
||||
* 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 adapter *adapter, struct sk_buff *skb)
|
||||
static void cxgb3_arp_process(struct port_info *pi, struct sk_buff *skb)
|
||||
{
|
||||
struct net_device *dev = skb->dev;
|
||||
struct port_info *pi;
|
||||
struct arphdr *arp;
|
||||
unsigned char *arp_ptr;
|
||||
unsigned char *sha;
|
||||
@@ -1972,12 +1971,11 @@ static void cxgb3_arp_process(struct adapter *adapter, struct sk_buff *skb)
|
||||
arp_ptr += dev->addr_len;
|
||||
memcpy(&tip, arp_ptr, sizeof(tip));
|
||||
|
||||
pi = netdev_priv(dev);
|
||||
if (tip != pi->iscsi_ipv4addr)
|
||||
return;
|
||||
|
||||
arp_send(ARPOP_REPLY, ETH_P_ARP, sip, dev, tip, sha,
|
||||
dev->dev_addr, sha);
|
||||
pi->iscsic.mac_addr, sha);
|
||||
|
||||
}
|
||||
|
||||
@@ -1986,6 +1984,19 @@ static inline int is_arp(struct sk_buff *skb)
|
||||
return skb->protocol == htons(ETH_P_ARP);
|
||||
}
|
||||
|
||||
static void cxgb3_process_iscsi_prov_pack(struct port_info *pi,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
if (is_arp(skb)) {
|
||||
cxgb3_arp_process(pi, skb);
|
||||
return;
|
||||
}
|
||||
|
||||
if (pi->iscsic.recv)
|
||||
pi->iscsic.recv(pi, skb);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* rx_eth - process an ingress ethernet packet
|
||||
* @adap: the adapter
|
||||
@@ -2024,13 +2035,12 @@ static void rx_eth(struct adapter *adap, struct sge_rspq *rq,
|
||||
vlan_gro_receive(&qs->napi, grp,
|
||||
ntohs(p->vlan), skb);
|
||||
else {
|
||||
if (unlikely(pi->iscsi_ipv4addr &&
|
||||
is_arp(skb))) {
|
||||
if (unlikely(pi->iscsic.flags)) {
|
||||
unsigned short vtag = ntohs(p->vlan) &
|
||||
VLAN_VID_MASK;
|
||||
skb->dev = vlan_group_get_device(grp,
|
||||
vtag);
|
||||
cxgb3_arp_process(adap, skb);
|
||||
cxgb3_process_iscsi_prov_pack(pi, skb);
|
||||
}
|
||||
__vlan_hwaccel_rx(skb, grp, ntohs(p->vlan),
|
||||
rq->polling);
|
||||
@@ -2041,8 +2051,8 @@ static void rx_eth(struct adapter *adap, struct sge_rspq *rq,
|
||||
if (lro)
|
||||
napi_gro_receive(&qs->napi, skb);
|
||||
else {
|
||||
if (unlikely(pi->iscsi_ipv4addr && is_arp(skb)))
|
||||
cxgb3_arp_process(adap, skb);
|
||||
if (unlikely(pi->iscsic.flags))
|
||||
cxgb3_process_iscsi_prov_pack(pi, skb);
|
||||
netif_receive_skb(skb);
|
||||
}
|
||||
} else
|
||||
|
Reference in New Issue
Block a user