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   Retrieves the current set value of iSCSI Initiator Name.
     24 
     25   @param[in]       This       Pointer to the EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance.
     26   @param[in, out]  BufferSize Size of the buffer in bytes pointed to by Buffer / Actual size of the
     27                               variable data buffer.
     28   @param[out]      Buffer     Pointer to the buffer for data to be read. The data is a null-terminated UTF-8 encoded string.
     29                               The maximum length is 223 characters, including the null-terminator.
     30 
     31   @retval EFI_SUCCESS           Data was successfully retrieved into the provided buffer and the
     32                                 BufferSize was sufficient to handle the iSCSI initiator name.
     33   @retval EFI_BUFFER_TOO_SMALL  BufferSize is too small for the result.
     34   @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL.
     35   @retval EFI_DEVICE_ERROR      The iSCSI initiator name could not be retrieved due to a hardware error.
     36   @retval Others                Other errors as indicated.
     37 **/
     38 EFI_STATUS
     39 EFIAPI
     40 IScsiGetInitiatorName (
     41   IN     EFI_ISCSI_INITIATOR_NAME_PROTOCOL  *This,
     42   IN OUT UINTN                              *BufferSize,
     43   OUT    VOID                               *Buffer
     44   )
     45 {
     46   EFI_STATUS  Status;
     47 
     48   if ((BufferSize == NULL) || (Buffer == NULL)) {
     49     return EFI_INVALID_PARAMETER;
     50   }
     51 
     52   Status = gRT->GetVariable (
     53                   ISCSI_INITIATOR_NAME_VAR_NAME,
     54                   &gEfiIScsiInitiatorNameProtocolGuid,
     55                   NULL,
     56                   BufferSize,
     57                   Buffer
     58                   );
     59 
     60   return Status;
     61 }
     62 
     63 /**
     64   Sets the iSCSI Initiator Name.
     65 
     66   @param[in]       This       Pointer to the EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance.
     67   @param[in, out]  BufferSize Size of the buffer in bytes pointed to by Buffer.
     68   @param[in]       Buffer     Pointer to the buffer for data to be written. The data is a null-terminated UTF-8 encoded string.
     69                               The maximum length is 223 characters, including the null-terminator.
     70 
     71   @retval EFI_SUCCESS           Data was successfully stored by the protocol.
     72   @retval EFI_UNSUPPORTED       Platform policies do not allow for data to be written.
     73                                 Currently not implemented.
     74   @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL, or BufferSize exceeds the maximum allowed limit.
     75   @retval EFI_DEVICE_ERROR      The data could not be stored due to a hardware error.
     76   @retval EFI_OUT_OF_RESOURCES  Not enough storage is available to hold the data.
     77   @retval EFI_PROTOCOL_ERROR    Input iSCSI initiator name does not adhere to RFC 3720
     78                                 (and other related protocols).
     79   @retval Others                Other errors as indicated.
     80 **/
     81 EFI_STATUS
     82 EFIAPI
     83 IScsiSetInitiatorName (
     84   IN     EFI_ISCSI_INITIATOR_NAME_PROTOCOL  *This,
     85   IN OUT UINTN                              *BufferSize,
     86   IN     VOID                               *Buffer
     87   )
     88 {
     89   EFI_STATUS  Status;
     90 
     91   if ((BufferSize == NULL) || (Buffer == NULL)) {
     92     return EFI_INVALID_PARAMETER;
     93   }
     94 
     95   if (*BufferSize > ISCSI_NAME_MAX_SIZE) {
     96     *BufferSize = ISCSI_NAME_MAX_SIZE;
     97     return EFI_INVALID_PARAMETER;
     98   }
     99   //
    100   // only support iqn iSCSI names.
    101   //
    102   Status = IScsiNormalizeName ((CHAR8 *) Buffer, *BufferSize - 1);
    103   if (EFI_ERROR (Status)) {
    104     return Status;
    105   }
    106 
    107   Status = gRT->SetVariable (
    108                   ISCSI_INITIATOR_NAME_VAR_NAME,
    109                   &gEfiIScsiInitiatorNameProtocolGuid,
    110                   EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,
    111                   *BufferSize,
    112                   Buffer
    113                   );
    114 
    115   return Status;
    116 }
    117