• Robert Love's avatar
    [SCSI] fcoe: Fix broken NPIV with correction to MAC validation · 0ee31cb5
    Robert Love authored
    A previous patch attempted to validate the destination
    MAC address of a FCoE frame by checking that MAC
    address against the received port's MAC address. The
    implementation seems fine on the surface, but any
    VN_Ports added using the NPIV feature will have their
    own MAC addresses and these MACs were not being checked,
    which prevented any NPIV VN_Ports from receiving frames.
    
    In other words, the following patch has broken NPIV.
    
    519e5135
     [SCSI] fcoe: adds src and dest mac address
                  checking for fcoe frames
    
    Part of the offending patch is correct, but the part
    that broke NPIV was attempting to satisfy FC-BB-5
    section D.5, 2.1-
    
    (discard frames that) "contain a destination MAC
    address/destination N_Port_ID pair that was not
    assigned by an FCF to one of the VN_Ports on the ENode"
    
    The language does _not_ say to compare the destination
    FC-MAP/destination N_Port_ID, but instead to compare
    the destination MAC address/destination N_Port_ID.
    
    >From the FC-BB-5 specification,
    
    "A properly formed FPMA is one in which the 24 most
    significant bits equal the Fabric’s FC-MAP value and
    the least significant 24 bits equal the N_Port_ID
    assigned to the VN_Port by the FCF."
    
    This means that we need to compare the FC Frame's
    destination FCID against the embedded FCID in the
    destination MAC address. This patch checks the lower
    24 bits of the destination MAC address against
    destination FCID in the Fibre Channel frame.
    
    For MAC validation the first line of defense is the
    hardware MAC filtering. Each VN_Port will have a
    unicast MAC addresses added to the hardware's
    filtering table. The Ethernet driver should drop any
    MACs not destined for a programmed MAC. This patch
    adds a second line of defense that very specfically
    compares an element in the FC frame against an element
    in the Ethernet header, which is appropriate for the
    FCoE layer.
    
    Many alternative approaches were considered, including
    a LLD callback from libfc. The second most reasonable
    approach seemed to be walking the list of NPIV ports
    and check each of their MAC addresses against the
    destination MAC address of the received frame. The
    problem with this approach was that it is likely that
    performance would suffer with the more NPIV ports added
    to the system since every received frame would need to
    walk this list, comparing each entry's MAC.
    Signed-off-by: default avatarRobert Love <robert.w.love@intel.com>
    Signed-off-by: default avatarJames Bottomley <James.Bottomley@suse.de>
    0ee31cb5
fcoe.c 71.9 KB