• Joe Eykholt's avatar
    [SCSI] libfcoe: fcoe: fnic: add FIP VN2VN point-to-multipoint support · e10f8c66
    Joe Eykholt authored
    The FC-BB-6 committee is proposing a new FIP usage model called
    VN_port to VN_port mode.  It allows VN_ports to discover each other
    over a loss-free L2 Ethernet without any FCF or Fibre-channel fabric
    services.  This is point-to-multipoint.  There is also a variant
    of this called point-to-point which provides for making sure there
    is just one pair of ports operating over the Ethernet fabric.
    
    We add these new states:  VNMP_START, _PROBE1, _PROBE2, _CLAIM, and _UP.
    These usually go quickly in that sequence.  After waiting a random
    amount of time up to 100 ms in START, we select a pseudo-random
    proposed locally-unique port ID and send out probes in states PROBE1
    and PROBE2, 100 ms apart.  If no probe responses are heard, we
    proceed to CLAIM state 400 ms later and send a claim notification.
    We wait another 400 ms to receive claim responses, which give us
    a list of the other nodes on the network, including their FC-4
    capabilities.  After another 400 ms we go to VNMP_UP state and
    should start interoperating with any of the nodes for whic we
    receivec claim responses.  More details are in the spec.j
    
    Add the new mode as FIP_MODE_VN2VN.  The driver must specify
    explicitly that it wants to operate in this mode.  There is
    no automatic detection between point-to-multipoint and fabric
    mode, and the local port initialization is affected, so it isn't
    anticipated that there will ever be any such automatic switchover.
    
    It may eventually be possible to have both fabric and VN2VN
    modes on the same L2 network, which may be done by two separate
    local VN_ports (lports).
    
    When in VN2VN mode, FIP replaces libfc's fabric-oriented discovery
    module with its own simple code that adds remote ports as they
    are discovered from incoming claim notifications and responses.
    These hooks are placed by fcoe_disc_init().
    
    A linear list of discovered vn_ports is maintained under the
    fcoe_ctlr struct.  It is expected to be short for now, and
    accessed infrequently.  It is kept under RCU for lock-ordering
    reasons.  The lport and/or rport mutexes may be held when we
    need to lookup a fcoe_vnport during an ELS send.
    
    Change fcoe_ctlr_encaps() to lookup the destination vn_port in
    the list of peers for the destination MAC address of the
    FIP-encapsulated frame.
    
    Add a new function fcoe_disc_init() to initialize just the
    discovery portion of libfcoe for VN2VN mode.
    Signed-off-by: default avatarJoe Eykholt <jeykholt@cisco.com>
    Signed-off-by: default avatarRobert Love <robert.w.love@intel.com>
    Signed-off-by: default avatarJames Bottomley <James.Bottomley@suse.de>
    e10f8c66
fcoe.c 71.4 KB