aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/fcoe
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/fcoe')
-rw-r--r--drivers/scsi/fcoe/fcoe.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/drivers/scsi/fcoe/fcoe.c b/drivers/scsi/fcoe/fcoe.c
index d340cf2d857a..a120962b25b8 100644
--- a/drivers/scsi/fcoe/fcoe.c
+++ b/drivers/scsi/fcoe/fcoe.c
@@ -1210,6 +1210,8 @@ int fcoe_rcv(struct sk_buff *skb, struct net_device *netdev,
1210 struct fcoe_interface *fcoe; 1210 struct fcoe_interface *fcoe;
1211 struct fc_frame_header *fh; 1211 struct fc_frame_header *fh;
1212 struct fcoe_percpu_s *fps; 1212 struct fcoe_percpu_s *fps;
1213 struct fcoe_port *port;
1214 struct ethhdr *eh;
1213 unsigned int cpu; 1215 unsigned int cpu;
1214 1216
1215 fcoe = container_of(ptype, struct fcoe_interface, fcoe_packet_type); 1217 fcoe = container_of(ptype, struct fcoe_interface, fcoe_packet_type);
@@ -1227,9 +1229,21 @@ int fcoe_rcv(struct sk_buff *skb, struct net_device *netdev,
1227 skb_tail_pointer(skb), skb_end_pointer(skb), 1229 skb_tail_pointer(skb), skb_end_pointer(skb),
1228 skb->csum, skb->dev ? skb->dev->name : "<NULL>"); 1230 skb->csum, skb->dev ? skb->dev->name : "<NULL>");
1229 1231
1230 /* check for FCOE packet type */ 1232 /* check for mac addresses */
1231 if (unlikely(eth_hdr(skb)->h_proto != htons(ETH_P_FCOE))) { 1233 eh = eth_hdr(skb);
1232 FCOE_NETDEV_DBG(netdev, "Wrong FC type frame"); 1234 port = lport_priv(lport);
1235 if (compare_ether_addr(eh->h_dest, port->data_src_addr) &&
1236 compare_ether_addr(eh->h_dest, fcoe->ctlr.ctl_src_addr) &&
1237 compare_ether_addr(eh->h_dest, (u8[6])FC_FCOE_FLOGI_MAC)) {
1238 FCOE_NETDEV_DBG(netdev, "wrong destination mac address:%pM\n",
1239 eh->h_dest);
1240 goto err;
1241 }
1242
1243 if (is_fip_mode(&fcoe->ctlr) &&
1244 compare_ether_addr(eh->h_source, fcoe->ctlr.dest_addr)) {
1245 FCOE_NETDEV_DBG(netdev, "wrong source mac address:%pM\n",
1246 eh->h_source);
1233 goto err; 1247 goto err;
1234 } 1248 }
1235 1249