On Fri, 2010-06-18 at 10:01 -0700, Joe Eykholt wrote:
> When sending a FLOGI LS_ACC, which we only do in point-to-multipoint
> mode, the MAC descriptor should have the granted MAC set to
> 0x0efd00 || D_ID.
> 
Can you help me understand this a bit better? I'm not sure how this
patch is accomplishing the above statement.


> When sending an LS_RJT, there should be no MAC descriptor.
> 
> When sending either an LS_ACC or LS_RJT, the subcode should indicate
> an reply, not a request.
> 
> Signed-off-by: Joe Eykholt <[email protected]>
> ---
>  drivers/scsi/fcoe/libfcoe.c |   39 +++++++++++++++++++++++++--------------
>  1 files changed, 25 insertions(+), 14 deletions(-)
> 
> 
> diff --git a/drivers/scsi/fcoe/libfcoe.c b/drivers/scsi/fcoe/libfcoe.c
> index 79df78f..8cfe9e7 100644
> --- a/drivers/scsi/fcoe/libfcoe.c
> +++ b/drivers/scsi/fcoe/libfcoe.c
> @@ -469,11 +469,15 @@ static int fcoe_ctlr_encaps(struct fcoe_ctlr *fip, 
> struct fc_lport *lport,
>               struct fip_header fip;
>               struct fip_encaps encaps;
>       } __attribute__((packed)) *cap;
> +     struct fc_frame_header *fh;
>       struct fip_mac_desc *mac;
>       struct fcoe_fcf *fcf;
>       size_t dlen;
>       u16 fip_flags;
> +     u8 op;
>  
> +     fh = (struct fc_frame_header *)skb->data;
> +     op = *(u8 *)(fh + 1);
>       dlen = sizeof(struct fip_encaps) + skb->len;    /* len before push */
>       cap = (struct fip_encaps_head *)skb_push(skb, sizeof(*cap));
>       memset(cap, 0, sizeof(*cap));
> @@ -481,6 +485,7 @@ static int fcoe_ctlr_encaps(struct fcoe_ctlr *fip, struct 
> fc_lport *lport,
>       if (lport->point_to_multipoint) {
>               if (fcoe_ctlr_vn_lookup(fip, d_id, cap->eth.h_dest))
>                       return -ENODEV;
> +             fip_flags = 0;
>       } else {
>               fcf = fip->sel_fcf;
>               if (!fcf)
> @@ -497,26 +502,32 @@ static int fcoe_ctlr_encaps(struct fcoe_ctlr *fip, 
> struct fc_lport *lport,
>  
>       cap->fip.fip_ver = FIP_VER_ENCAPS(FIP_VER);
>       cap->fip.fip_op = htons(FIP_OP_LS);
> -     cap->fip.fip_subcode = FIP_SC_REQ;
> -     cap->fip.fip_dl_len = htons((dlen + sizeof(*mac)) / FIP_BPW);
> +     if (op == ELS_LS_ACC || op == ELS_LS_RJT)
> +             cap->fip.fip_subcode = FIP_SC_REP;
> +     else
> +             cap->fip.fip_subcode = FIP_SC_REQ;
>       cap->fip.fip_flags = htons(fip_flags);
>  
>       cap->encaps.fd_desc.fip_dtype = dtype;
>       cap->encaps.fd_desc.fip_dlen = dlen / FIP_BPW;
>  
> -     mac = (struct fip_mac_desc *)skb_put(skb, sizeof(*mac));
> -     memset(mac, 0, sizeof(*mac));
> -     mac->fd_desc.fip_dtype = FIP_DT_MAC;
> -     mac->fd_desc.fip_dlen = sizeof(*mac) / FIP_BPW;
> -     if (dtype != FIP_DT_FLOGI && dtype != FIP_DT_FDISC) {
> -             memcpy(mac->fd_mac, fip->get_src_addr(lport), ETH_ALEN);
> -     } else if (fip_flags & FIP_FL_SPMA) {
> -             LIBFCOE_FIP_DBG(fip, "FLOGI/FDISC sent with SPMA\n");
> -             memcpy(mac->fd_mac, fip->ctl_src_addr, ETH_ALEN);
> -     } else {
> -             LIBFCOE_FIP_DBG(fip, "FLOGI/FDISC sent with FPMA\n");
> -             /* FPMA only FLOGI must leave the MAC desc set to all 0s */
> +     if (op != ELS_LS_RJT) {
> +             dlen += sizeof(*mac);
> +             mac = (struct fip_mac_desc *)skb_put(skb, sizeof(*mac));
> +             memset(mac, 0, sizeof(*mac));
> +             mac->fd_desc.fip_dtype = FIP_DT_MAC;
> +             mac->fd_desc.fip_dlen = sizeof(*mac) / FIP_BPW;
> +             if (dtype != FIP_DT_FLOGI && dtype != FIP_DT_FDISC) {
> +                     memcpy(mac->fd_mac, fip->get_src_addr(lport), ETH_ALEN);
> +             } else if (fip_flags & FIP_FL_SPMA) {
> +                     LIBFCOE_FIP_DBG(fip, "FLOGI/FDISC sent with SPMA\n");
> +                     memcpy(mac->fd_mac, fip->ctl_src_addr, ETH_ALEN);
> +             } else {
> +                     LIBFCOE_FIP_DBG(fip, "FLOGI/FDISC sent with FPMA\n");
> +                     /* FPMA only FLOGI.  Must leave the MAC desc zeroed. */
> +             }
>       }
> +     cap->fip.fip_dl_len = htons(dlen / FIP_BPW);
>  
>       skb->protocol = htons(ETH_P_FIP);
>       skb_reset_mac_header(skb);
> 
> 
> _______________________________________________
> devel mailing list
> [email protected]
> http://www.open-fcoe.org/mailman/listinfo/devel


_______________________________________________
devel mailing list
[email protected]
http://www.open-fcoe.org/mailman/listinfo/devel

Reply via email to