Home | History | Annotate | Download | only in IScsiDxe
      1 /** @file
      2   Implementation for EFI iSCSI Initiator Name Protocol.
      3 
      4 Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>
      5 This program and the accompanying materials
      6 are licensed and made available under the terms and conditions of the BSD License
      7 which accompanies this distribution.  The full text of the license may be found at
      8 http://opensource.org/licenses/bsd-license.php
      9 
     10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     12 
     13 **/
     14 
     15 #include "IScsiImpl.h"
     16 
     17 EFI_ISCSI_INITIATOR_NAME_PROTOCOL gIScsiInitiatorName = {
     18   IScsiGetInitiatorName,
     19   IScsiSetInitiatorName
     20 };
     21 
     22 
     23 /**
     24   Retrieves the current set value of iSCSI Initiator Name.
     25 
     26   @param[in]       This          Pointer to the EFI_ISCSI_INITIATOR_NAME_PROTOCOL
     27                                  instance.
     28   @param[in, out]  BufferSize    Size of the buffer in bytes pointed to by Buffer /
     29                                  Actual size of the variable data buffer.
     30   @param[out]      Buffer        Pointer to the buffer for data to be read.
     31                                  The data is a null-terminated UTF-8 encoded string.
     32                                  The maximum length is 223 characters, including the null-terminator.
     33 
     34   @retval EFI_SUCCESS            Data was successfully retrieved into the provided
     35                                  buffer and the BufferSize was sufficient to handle
     36                                  the iSCSI initiator name.
     37   @retval EFI_BUFFER_TOO_SMALL   BufferSize is too small for the result. BufferSize
     38                                  will be updated with the size required to complete
     39                                  the request. Buffer will not be affected.
     40   @retval EFI_INVALID_PARAMETER  BufferSize is NULL. BufferSize and Buffer will not
     41                                  be affected.
     42   @retval EFI_INVALID_PARAMETER  Buffer is NULL. BufferSize and Buffer will not be
     43                                  affected.
     44   @retval EFI_DEVICE_ERROR       The iSCSI initiator name could not be retrieved
     45                                  due to a hardware error.
     46 
     47 **/
     48 EFI_STATUS
     49 EFIAPI
     50 IScsiGetInitiatorName (
     51   IN     EFI_ISCSI_INITIATOR_NAME_PROTOCOL  *This,
     52   IN OUT UINTN                              *BufferSize,
     53   OUT    VOID                               *Buffer
     54   )
     55 {
     56   EFI_STATUS  Status;
     57 
     58   if ((BufferSize == NULL) || (Buffer == NULL)) {
     59     return EFI_INVALID_PARAMETER;
     60   }
     61 
     62   Status = gRT->GetVariable (
     63                   ISCSI_INITIATOR_NAME_VAR_NAME,
     64                   &gEfiIScsiInitiatorNameProtocolGuid,
     65                   NULL,
     66                   BufferSize,
     67                   Buffer
     68                   );
     69 
     70   return Status;
     71 }
     72 
     73 
     74 /**
     75   Sets the iSSI Initiator Name.
     76 
     77   @param[in]       This          Pointer to the EFI_ISCSI_INITIATOR_NAME_PROTOCOL
     78                                  instance.
     79   @param[in, out]  BufferSize    Size of the buffer in bytes pointed to by Buffer.
     80   @param[in]       Buffer        Pointer to the buffer for data to be written.
     81                                  The data is a null-terminated UTF-8 encoded string.
     82                                  The maximum length is 223 characters, including the null-terminator.
     83 
     84   @retval EFI_SUCCESS            Data was successfully stored by the protocol.
     85   @retval EFI_UNSUPPORTED        Platform policies do not allow for data to be
     86                                  written.
     87   @retval EFI_INVALID_PARAMETER  BufferSize exceeds the maximum allowed limit.
     88                                  BufferSize will be updated with the maximum size
     89                                  required to complete the request.
     90   @retval EFI_INVALID_PARAMETER  Buffersize is NULL. BufferSize and Buffer will not
     91                                  be affected.
     92   @retval EFI_INVALID_PARAMETER  Buffer is NULL. BufferSize and Buffer will not be
     93                                  affected.
     94   @retval EFI_DEVICE_ERROR       The data could not be stored due to a hardware
     95                                  error.
     96   @retval EFI_OUT_OF_RESOURCES   Not enough storage is available to hold the data
     97   @retval EFI_PROTOCOL_ERROR     Input iSCSI initiator name does not adhere to RFC
     98                                  3720
     99 
    100 **/
    101 EFI_STATUS
    102 EFIAPI
    103 IScsiSetInitiatorName (
    104   IN     EFI_ISCSI_INITIATOR_NAME_PROTOCOL  *This,
    105   IN OUT UINTN                              *BufferSize,
    106   IN     VOID                               *Buffer
    107   )
    108 {
    109   EFI_STATUS  Status;
    110 
    111   if ((BufferSize == NULL) || (Buffer == NULL)) {
    112     return EFI_INVALID_PARAMETER;
    113   }
    114 
    115   if (*BufferSize > ISCSI_NAME_MAX_SIZE) {
    116     *BufferSize = ISCSI_NAME_MAX_SIZE;
    117     return EFI_INVALID_PARAMETER;
    118   }
    119   //
    120   // Only support iqn iSCSI names.
    121   //
    122   Status = IScsiNormalizeName ((CHAR8 *) Buffer, *BufferSize - 1);
    123   if (EFI_ERROR (Status)) {
    124     return Status;
    125   }
    126 
    127   Status = gRT->SetVariable (
    128                   ISCSI_INITIATOR_NAME_VAR_NAME,
    129                   &gEfiIScsiInitiatorNameProtocolGuid,
    130                   EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,
    131                   *BufferSize,
    132                   Buffer
    133                   );
    134 
    135   return Status;
    136 }
    137