BZ 4037: Install EFI_DISCOVER_PROTOCOL on each network interface. This fixes the issue that causes the high-level Redfish driver on the network interface is stopped when: 1. EFI_DISCOVER_PROTOCOL is reinstalled on a new-found network interface, or 2. EFI_DISCOVER_PROTOCOL is stopped on the network interface other than the one which is used to communicate with Redfish service. Cc: Nickle Wang <nickle@csie.io> Cc: Igor Kulchytskyy <igork@ami.com> Signed-off-by: Abner Chang <abner.chang@amd.com> Reviewed-by: Nickle Wang <nickle@csie.io> Reviewed-by: Igor Kulchytskyy <igork@ami.com>
		
			
				
	
	
		
			242 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			242 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  This file defines the EFI Redfish Discover Protocol interface.
 | 
						|
 | 
						|
  (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>
 | 
						|
  Copyright (c) 2022, AMD Incorporated. All rights reserved.
 | 
						|
 | 
						|
  SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
						|
 | 
						|
**/
 | 
						|
 | 
						|
#ifndef EFI_REDFISH_DISCOVER_INTERNAL_H_
 | 
						|
#define EFI_REDFISH_DISCOVER_INTERNAL_H_
 | 
						|
 | 
						|
#include <Uefi.h>
 | 
						|
 | 
						|
#include <Protocol/ComponentName.h>
 | 
						|
#include <Protocol/ComponentName2.h>
 | 
						|
#include <Protocol/DriverBinding.h>
 | 
						|
#include <Protocol/RedfishDiscover.h>
 | 
						|
#include <Protocol/Smbios.h>
 | 
						|
#include <Protocol/Tcp4.h>
 | 
						|
#include <Protocol/Tcp6.h>
 | 
						|
 | 
						|
#include <Library/BaseLib.h>
 | 
						|
#include <Library/BaseMemoryLib.h>
 | 
						|
#include <Library/DebugLib.h>
 | 
						|
#include <Library/MemoryAllocationLib.h>
 | 
						|
#include <Library/NetLib.h>
 | 
						|
#include <Library/PrintLib.h>
 | 
						|
#include <Library/RestExLib.h>
 | 
						|
#include <Library/UefiLib.h>
 | 
						|
#include <Library/UefiBootServicesTableLib.h>
 | 
						|
#include <Library/UefiDriverEntryPoint.h>
 | 
						|
 | 
						|
#include <IndustryStandard/RedfishHostInterface.h>
 | 
						|
 | 
						|
#define REDFISH_DISCOVER_VERSION                    0x00010000
 | 
						|
#define EFI_REDFISH_DISCOVER_NETWORK_INTERFACE_TPL  TPL_NOTIFY
 | 
						|
 | 
						|
//
 | 
						|
// GUID definitions
 | 
						|
//
 | 
						|
 | 
						|
#define EFI_REDFISH_DISCOVER_TCP4_INSTANCE_GUID \
 | 
						|
  { \
 | 
						|
    0xfbab97a4, 0x4c6a, 0xf8e8, { 0xf2, 0x25, 0x42, 0x8a, 0x80, 0x3f, 0xb6, 0xaa } \
 | 
						|
  }
 | 
						|
 | 
						|
#define EFI_REDFISH_DISCOVER_TCP6_INSTANCE_GUID \
 | 
						|
  { \
 | 
						|
    0xbe513b6d, 0x41c1, 0x96Ed, { 0x8d, 0xaf, 0x3e, 0x89, 0xc5, 0xf5, 0x02, 0x25 } \
 | 
						|
  }
 | 
						|
 | 
						|
#define EFI_REDFISH_DISCOVER_REST_EX_INSTANCE_GUID \
 | 
						|
  { \
 | 
						|
    0xc44a6076, 0xd42a, 0x4d54, { 0x85, 0x6d, 0x98, 0x8a, 0x85, 0x8f, 0xa1, 0x11 } \
 | 
						|
  }
 | 
						|
 | 
						|
extern EFI_COMPONENT_NAME_PROTOCOL   gRedfishDiscoverComponentName;
 | 
						|
extern EFI_COMPONENT_NAME2_PROTOCOL  gRedfishDiscoverComponentName2;
 | 
						|
extern EFI_UNICODE_STRING_TABLE      *gRedfishDiscoverControllerNameTable;
 | 
						|
 | 
						|
//
 | 
						|
// Enumeration of network protocols
 | 
						|
// required for the Redfish service discovery.
 | 
						|
//
 | 
						|
typedef enum {
 | 
						|
  ProtocolTypeTcp4 = 0, ///< Network protocol TCPv4.
 | 
						|
  ProtocolTypeTcp6,     ///< Network protocol TCCv6.
 | 
						|
  ProtocolTypeRestEx,   ///< REST EX over network protocol.
 | 
						|
  MaxProtocolType
 | 
						|
} NETWORK_INTERFACE_PROTOCOL_TYPE;
 | 
						|
 | 
						|
//
 | 
						|
// Network protocol information installed on
 | 
						|
// the network interface.
 | 
						|
//
 | 
						|
typedef struct {
 | 
						|
  EFI_GUID      ProtocolGuid;              ///< Network protocol GUID.
 | 
						|
  EFI_GUID      ProtocolServiceGuid;       ///< Network protocol service GUID.
 | 
						|
  UINT32        ProtocolDiscoverId;        ///< The identifier installed on network protocol handle.
 | 
						|
  EFI_HANDLE    ProtocolControllerHandle;  ///< The controller handle on network protocol.
 | 
						|
  VOID          *NetworkProtocolInterface; ///< The protocol interface of network protocol.
 | 
						|
} REDFISH_DISCOVER_NETWORK_INTERFACE_PROTOCOL;
 | 
						|
 | 
						|
//
 | 
						|
// Internal structure used to maintain network
 | 
						|
// interface properties.
 | 
						|
//
 | 
						|
typedef struct {
 | 
						|
  LIST_ENTRY                                     Entry;                      ///< Link list entry.
 | 
						|
  EFI_HANDLE                                     OpenDriverAgentHandle;      ///< The agent to open network protocol.
 | 
						|
  EFI_HANDLE                                     OpenDriverControllerHandle; ///< The controller handle to open network protocol.
 | 
						|
  UINTN                                          HwAddressSize;              ///< The size of network interface hardware address.
 | 
						|
  EFI_MAC_ADDRESS                                MacAddress;                 ///< MAC address of network interface.
 | 
						|
  CHAR16                                         *StrMacAddr;                ///< String to MAC address of network interface.
 | 
						|
  BOOLEAN                                        GotSubnetInfo;              ///< Indicates sub net information is retrieved.
 | 
						|
  EFI_IP_ADDRESS                                 SubnetAddr;                 ///< Subnet ID.
 | 
						|
  EFI_IP_ADDRESS                                 SubnetMask;                 ///< Subnet mask (IPv4 only)
 | 
						|
  UINT8                                          SubnetPrefixLength;         ///< Subnet prefix.
 | 
						|
  UINT16                                         VlanId;                     ///< VLAN ID
 | 
						|
  UINT32                                         SubnetAddrInfoIPv6Number;   ///< IPv6 address info number.
 | 
						|
  EFI_IP6_ADDRESS_INFO                           *SubnetAddrInfoIPv6;        ///< IPv6 address info.
 | 
						|
  //
 | 
						|
  // Network interface protocol and REST EX infor.
 | 
						|
  //
 | 
						|
  UINT32                                         NetworkProtocolType;          ///< Network protocol type. Refer to
 | 
						|
                                                                               ///< NETWORK_INTERFACE_PROTOCOL_TYPE.
 | 
						|
  REDFISH_DISCOVER_NETWORK_INTERFACE_PROTOCOL    NetworkInterfaceProtocolInfo; ///< Network interface protocol information.
 | 
						|
  EFI_HANDLE                                     RestExHandle;                 ///< REST EX handle associated with this network interface.
 | 
						|
  //
 | 
						|
  // EFI_REDFISH_DISCOVER_PROTOCOL instance installed
 | 
						|
  // on this network interface.
 | 
						|
  //
 | 
						|
  EFI_HANDLE                                     EfiRedfishDiscoverProtocolHandle; ///< EFI_REDFISH_DISCOVER_PROTOTOCOL instance installed
 | 
						|
                                                                                   ///< on this network interface.
 | 
						|
} EFI_REDFISH_DISCOVER_NETWORK_INTERFACE_INTERNAL;
 | 
						|
 | 
						|
//
 | 
						|
// Internal structure used to maintain REST EX properties.
 | 
						|
//
 | 
						|
typedef struct {
 | 
						|
  LIST_ENTRY              Entry;                      ///< Link list entry.
 | 
						|
  EFI_HANDLE              OpenDriverAgentHandle;      ///< The agent to open network protocol.
 | 
						|
  EFI_HANDLE              OpenDriverControllerHandle; ///< The controller handle to open network protocol.
 | 
						|
  EFI_HANDLE              RestExChildHandle;          ///< The child handle created throught REST EX Service Protocol.
 | 
						|
  EFI_HANDLE              RestExControllerHandle;     ///< The controller handle which provide REST EX protocol.
 | 
						|
  EFI_REST_EX_PROTOCOL    *RestExProtocolInterface;   ///< Pointer to EFI_REST_EX_PROTOCOL.
 | 
						|
  UINT32                  RestExId;                   ///< The identifier installed on REST EX controller handle.
 | 
						|
} EFI_REDFISH_DISCOVER_REST_EX_INSTANCE_INTERNAL;
 | 
						|
 | 
						|
/**
 | 
						|
  This function to get subnet information.
 | 
						|
 | 
						|
  @param[in]            ImageHandle  EFI handle with this image.
 | 
						|
  @param[in]            Instance  Instance of Network interface.
 | 
						|
  @retval EFI_STATUS    Get subnet information successfully.
 | 
						|
  @retval Otherwise     Fail to get subnet information.
 | 
						|
**/
 | 
						|
typedef
 | 
						|
EFI_STATUS
 | 
						|
(EFIAPI *EFI_REDFISH_DISCOVER_GET_SUBNET_INFO)(
 | 
						|
  IN EFI_HANDLE ImageHandle,
 | 
						|
  IN EFI_REDFISH_DISCOVER_NETWORK_INTERFACE_INTERNAL *Instance
 | 
						|
  );
 | 
						|
 | 
						|
//
 | 
						|
// The require network protocol matrix.
 | 
						|
//
 | 
						|
typedef struct {
 | 
						|
  UINT32                                  ProtocolType;                        ///< Network protocol type,
 | 
						|
                                                                               ///< Refer to NETWORK_INTERFACE_PROTOCOL_TYPE.
 | 
						|
  CHAR16                                  *ProtocolName;                       ///< Protocol name.
 | 
						|
  EFI_GUID                                *RequiredProtocolGuid;               ///< Network protocol interface GUID.
 | 
						|
  EFI_GUID                                *RequiredServiceBindingProtocolGuid; ///< Network protocol service GUID.
 | 
						|
  EFI_GUID                                *DiscoveredProtocolGuid;             ///< Protocol interface GUID use to install identifier.
 | 
						|
  EFI_REDFISH_DISCOVER_GET_SUBNET_INFO    GetSubnetInfo;                       ///< Function of getting subnet information.
 | 
						|
} REDFISH_DISCOVER_REQUIRED_PROTOCOL;
 | 
						|
 | 
						|
//
 | 
						|
// Link list of Redfish discover instance.
 | 
						|
//
 | 
						|
typedef struct {
 | 
						|
  LIST_ENTRY                         NextInstance;      ///< Next list.
 | 
						|
  EFI_REDFISH_DISCOVERED_INSTANCE    *Instance;         ///< Pointer to EFI_REDFISH_DISCOVERED_INSTANCE.
 | 
						|
} EFI_REDFISH_DISCOVERED_INTERNAL_LIST;
 | 
						|
 | 
						|
//
 | 
						|
// Internal structure of Redfish discover instance.
 | 
						|
//
 | 
						|
typedef struct {
 | 
						|
  LIST_ENTRY                                         Entry;             ///< Link list entry.
 | 
						|
  EFI_HANDLE                                         Owner;             ///< The owner owns this Redfish service discovery.
 | 
						|
                                                                        ///< It's the EFI image handle of driver uses
 | 
						|
                                                                        ///< EFI Redfish Discover Protocol.
 | 
						|
  EFI_REDFISH_DISCOVER_FLAG                          DiscoverFlags;     ///< EFI_REDFISH_DISCOVER_FLAG
 | 
						|
  EFI_REDFISH_DISCOVERED_TOKEN                       *DiscoverToken;    ///< Token used to signal when Redfish service is discovered.
 | 
						|
  EFI_REDFISH_DISCOVER_NETWORK_INTERFACE_INTERNAL    *NetworkInterface; ///< EFI_REDFISH_DISCOVER_NETWORK_INTERFACE_INTERNAL
 | 
						|
                                                                        ///< instance used to discover Redfish service.
 | 
						|
  //
 | 
						|
  // Below for Host insterface discovery.
 | 
						|
  //
 | 
						|
  BOOLEAN                                            HostIntfValidation; ///< Indicates whether to validate Redfish Host interface.
 | 
						|
  EFI_IP_ADDRESS                                     TargetIpAddress;    ///< Target IP address reported in Redfish Host interface.
 | 
						|
} EFI_REDFISH_DISCOVERED_INTERNAL_INSTANCE;
 | 
						|
 | 
						|
/**
 | 
						|
  The function adds a new foudn Redfish service to internal list and
 | 
						|
  notify clinet.
 | 
						|
 | 
						|
  It simply frees the packet.
 | 
						|
 | 
						|
  @param[in]  Instance              EFI_REDFISH_DISCOVERED_INTERNAL_INSTANCE.
 | 
						|
  @param[in]  RedfishVersion        Redfish version.
 | 
						|
  @param[in]  RedfishLocation       Redfish location.
 | 
						|
  @param[in]  Uuid                  Service UUID string.
 | 
						|
  @param[in]  Os                    OS string.
 | 
						|
  @param[in]  OsVer                 OS version string.
 | 
						|
  @param[in]  Product               Product string.
 | 
						|
  @param[in]  ProductVer            Product verison string.
 | 
						|
  @param[in]  UseHttps              Redfish service requires secured connection.
 | 
						|
  @retval EFI_SUCCESS               Redfish service is added to list successfully.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
AddAndSignalNewRedfishService (
 | 
						|
  IN EFI_REDFISH_DISCOVERED_INTERNAL_INSTANCE  *Instance,
 | 
						|
  IN UINTN                                     *RedfishVersion OPTIONAL,
 | 
						|
  IN CHAR8                                     *RedfishLocation OPTIONAL,
 | 
						|
  IN CHAR8                                     *Uuid  OPTIONAL,
 | 
						|
  IN CHAR8                                     *Os  OPTIONAL,
 | 
						|
  IN CHAR8                                     *OsVer  OPTIONAL,
 | 
						|
  IN CHAR8                                     *Product  OPTIONAL,
 | 
						|
  IN CHAR8                                     *ProductVer  OPTIONAL,
 | 
						|
  IN BOOLEAN                                   UseHttps
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  The function gets information reported in Redfish Host Interface.
 | 
						|
 | 
						|
  It simply frees the packet.
 | 
						|
 | 
						|
  @param[in]  Smbios           SMBIOS protocol.
 | 
						|
  @param[out] DeviceDescriptor Pointer to REDFISH_INTERFACE_DATA.
 | 
						|
  @param[out] ProtocolData     Pointer to REDFISH_OVER_IP_PROTOCOL_DATA.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS    Get host interface succesfully.
 | 
						|
  @retval Otherwise      Fail to tet host interface.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
RedfishGetHostInterfaceProtocolData (
 | 
						|
  IN EFI_SMBIOS_PROTOCOL             *Smbios,
 | 
						|
  OUT REDFISH_INTERFACE_DATA         **DeviceDescriptor,
 | 
						|
  OUT REDFISH_OVER_IP_PROTOCOL_DATA  **ProtocolData
 | 
						|
  );
 | 
						|
 | 
						|
extern EFI_GUID  gRedfishDiscoverTcp4Instance;
 | 
						|
extern EFI_GUID  gRedfishDiscoverTcp6Instance;
 | 
						|
extern EFI_GUID  gRedfishDiscoverRestEXInstance;
 | 
						|
#endif
 |