scsi: lpfc: Reject received PRLIs with only initiator fcn role for NPIV ports
authorJustin Tee <justin.tee@broadcom.com>
Mon, 9 Oct 2023 16:18:09 +0000 (09:18 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Fri, 13 Oct 2023 20:58:27 +0000 (16:58 -0400)
Currently, NPIV ports send PRLI_ACC to all received unsolicited PRLI
requests.  For an NPIV port, there is no point to PRLI_ACC if the received
PRLI request has the initiator function bit set and the target function bit
unset.  Modify the lpfc_rcv_prli_support_check() routine to send a PRLI_RJT
in such cases.  NPIV ports are expected to send PRLI_ACC only if the Target
function bit is set.

Signed-off-by: Justin Tee <justin.tee@broadcom.com>
Link: https://lore.kernel.org/r/20231009161812.97232-4-justintee8345@gmail.com
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/lpfc/lpfc_nportdisc.c

index 1eb7f7e60bba553a01bccc940cc1a72c893dc9e2..d9074929fbab85d15e35a22ad1c0868601c715de 100644 (file)
@@ -934,25 +934,35 @@ lpfc_rcv_prli_support_check(struct lpfc_vport *vport,
        struct ls_rjt stat;
        uint32_t *payload;
        uint32_t cmd;
+       PRLI *npr;
 
        payload = cmdiocb->cmd_dmabuf->virt;
        cmd = *payload;
+       npr = (PRLI *)((uint8_t *)payload + sizeof(uint32_t));
+
        if (vport->phba->nvmet_support) {
                /* Must be a NVME PRLI */
-               if (cmd ==  ELS_CMD_PRLI)
+               if (cmd == ELS_CMD_PRLI)
                        goto out;
        } else {
                /* Initiator mode. */
                if (!vport->nvmei_support && (cmd == ELS_CMD_NVMEPRLI))
                        goto out;
+
+               /* NPIV ports will RJT initiator only functions */
+               if (vport->port_type == LPFC_NPIV_PORT &&
+                   npr->initiatorFunc && !npr->targetFunc)
+                       goto out;
        }
        return 1;
 out:
-       lpfc_printf_vlog(vport, KERN_WARNING, LOG_NVME_DISC,
+       lpfc_printf_vlog(vport, KERN_WARNING, LOG_DISCOVERY,
                         "6115 Rcv PRLI (%x) check failed: ndlp rpi %d "
-                        "state x%x flags x%x\n",
+                        "state x%x flags x%x port_type: x%x "
+                        "npr->initfcn: x%x npr->tgtfcn: x%x\n",
                         cmd, ndlp->nlp_rpi, ndlp->nlp_state,
-                        ndlp->nlp_flag);
+                        ndlp->nlp_flag, vport->port_type,
+                        npr->initiatorFunc, npr->targetFunc);
        memset(&stat, 0, sizeof(struct ls_rjt));
        stat.un.b.lsRjtRsnCode = LSRJT_CMD_UNSUPPORTED;
        stat.un.b.lsRjtRsnCodeExp = LSEXP_REQ_UNSUPPORTED;