aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/fcoe/fcoe.c
diff options
context:
space:
mode:
authorVasu Dev <vasu.dev@intel.com>2010-07-20 18:19:32 -0400
committerJames Bottomley <James.Bottomley@suse.de>2010-07-28 10:05:47 -0400
commit519e5135e2537c9dbc1cbcc0891b0a936ff5dcd2 (patch)
treef4b139d0e9288d65a33a43b54e74ef2a6e959d82 /drivers/scsi/fcoe/fcoe.c
parent9d4cbc05f32fc0a1024de2a9d5635bc9d180e4ae (diff)
[SCSI] fcoe: adds src and dest mac address checking for fcoe frames
This is per FC-BB-5 Annex-D recommendation and per that if address checking fails then drop the frame. FIP code paths are already doing this so only needed for fcoe frames. The src address checking is limited to only fip mode since this might break non-fip mode used in p2p due to used OUI based addressing in some p2p code paths, going forward FIP will be the only mode, therefore limited this to only FIP mode so that it won't break non-fip p2p mode for now. -v2 Removes FCOE packet type checking since fcoe_rcv is registered to receive only FCoE type packets from netdev and it is already checked by netdev. Signed-off-by: Vasu Dev <vasu.dev@intel.com> Signed-off-by: Robert Love <robert.w.love@intel.com> Signed-off-by: James Bottomley <James.Bottomley@suse.de>
Diffstat (limited to 'drivers/scsi/fcoe/fcoe.c')
-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