LCOV - code coverage report
Current view: top level - lib/scsi - port.c (source / functions) Hit Total Coverage
Test: ut_cov_unit.info Lines: 22 43 51.2 %
Date: 2024-12-16 07:15:14 Functions: 2 6 33.3 %

          Line data    Source code
       1             : /*   SPDX-License-Identifier: BSD-3-Clause
       2             :  *   Copyright (C) 2008-2012 Daisuke Aoyama <aoyama@peach.ne.jp>.
       3             :  *   Copyright (C) 2016 Intel Corporation.
       4             :  *   All rights reserved.
       5             :  */
       6             : 
       7             : #include "scsi_internal.h"
       8             : 
       9             : #include "spdk/endian.h"
      10             : 
      11             : struct spdk_scsi_port *
      12           0 : spdk_scsi_port_create(uint64_t id, uint16_t index, const char *name)
      13             : {
      14             :         struct spdk_scsi_port *port;
      15             : 
      16           0 :         port = calloc(1, sizeof(struct spdk_scsi_port));
      17             : 
      18           0 :         if (!port) {
      19           0 :                 return NULL;
      20             :         }
      21             : 
      22           0 :         if (scsi_port_construct(port, id, index, name) != 0) {
      23           0 :                 spdk_scsi_port_free(&port);
      24           0 :                 return NULL;
      25             :         }
      26             : 
      27           0 :         return port;
      28             : }
      29             : 
      30             : void
      31           0 : spdk_scsi_port_free(struct spdk_scsi_port **pport)
      32             : {
      33             :         struct spdk_scsi_port *port;
      34             : 
      35           0 :         if (!pport) {
      36           0 :                 return;
      37             :         }
      38             : 
      39           0 :         port = *pport;
      40           0 :         *pport = NULL;
      41           0 :         free(port);
      42             : }
      43             : 
      44             : int
      45          42 : scsi_port_construct(struct spdk_scsi_port *port, uint64_t id, uint16_t index,
      46             :                     const char *name)
      47             : {
      48          42 :         if (strlen(name) >= sizeof(port->name)) {
      49           1 :                 SPDK_ERRLOG("port name too long\n");
      50           1 :                 return -1;
      51             :         }
      52             : 
      53          41 :         port->is_used = 1;
      54          41 :         port->id = id;
      55          41 :         port->index = index;
      56          41 :         snprintf(port->name, sizeof(port->name), "%s", name);
      57          41 :         return 0;
      58             : }
      59             : 
      60             : void
      61           0 : scsi_port_destruct(struct spdk_scsi_port *port)
      62             : {
      63           0 :         memset(port, 0, sizeof(struct spdk_scsi_port));
      64           0 : }
      65             : 
      66             : const char *
      67           0 : spdk_scsi_port_get_name(const struct spdk_scsi_port *port)
      68             : {
      69           0 :         return port->name;
      70             : }
      71             : 
      72             : /*
      73             :  * spc3r23 7.5.4.6 iSCSI initiator port TransportID,
      74             :  * using code format 0x01.
      75             :  */
      76             : void
      77          36 : spdk_scsi_port_set_iscsi_transport_id(struct spdk_scsi_port *port, char *iscsi_name,
      78             :                                       uint64_t isid)
      79             : {
      80             :         struct spdk_scsi_iscsi_transport_id *data;
      81             :         uint32_t len;
      82             :         char *name;
      83             : 
      84          36 :         memset(port->transport_id, 0, sizeof(port->transport_id));
      85          36 :         port->transport_id_len = 0;
      86             : 
      87          36 :         data = (struct spdk_scsi_iscsi_transport_id *)port->transport_id;
      88             : 
      89          36 :         data->protocol_id = (uint8_t)SPDK_SPC_PROTOCOL_IDENTIFIER_ISCSI;
      90          36 :         data->format = 0x1;
      91             : 
      92          36 :         name = data->name;
      93          36 :         len = snprintf(name, SPDK_SCSI_MAX_TRANSPORT_ID_LENGTH - sizeof(*data),
      94             :                        "%s,i,0x%12.12" PRIx64, iscsi_name, isid);
      95             :         do {
      96         108 :                 name[len++] = '\0';
      97         108 :         } while (len & 3);
      98             : 
      99          36 :         if (len < 20) {
     100           0 :                 SPDK_ERRLOG("The length of Transport ID should >= 20 bytes\n");
     101           0 :                 return;
     102             :         }
     103             : 
     104          36 :         to_be16(&data->additional_len, len);
     105          36 :         port->transport_id_len = len + sizeof(*data);
     106             : }

Generated by: LCOV version 1.15