/** @file
This file defines the EFI Redfish Discover Protocol interface.
(C) Copyright 2021 Hewlett Packard Enterprise Development LP
Copyright (c) 2022, AMD Incorporated. All rights reserved.
Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#ifndef EFI_REDFISH_DISCOVER_INTERNAL_H_
#define EFI_REDFISH_DISCOVER_INTERNAL_H_
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define REDFISH_DISCOVER_VERSION 0x00010000
#define EFI_REDFISH_DISCOVER_NETWORK_INTERFACE_TPL TPL_NOTIFY
#define MAC_COMPARE(This, Target) (CompareMem ((VOID *)&(This)->MacAddress, &(Target)->MacAddress, (This)->HwAddressSize) == 0)
#define VALID_TCP6(Target, This) ((Target)->IsIpv6 && ((This)->NetworkProtocolType == ProtocolTypeTcp6))
#define VALID_TCP4(Target, This) (!(Target)->IsIpv6 && ((This)->NetworkProtocolType == ProtocolTypeTcp4))
#define REDFISH_HI_ITERFACE_SPECIFIC_DATA_LENGTH_OFFSET ((UINT16)(UINTN)(&((SMBIOS_TABLE_TYPE42 *)0)->InterfaceTypeSpecificDataLength))
#define REDFISH_HI_PROTOCOL_HOSTNAME_LENGTH_OFFSET ((UINT16)(UINTN)(&((REDFISH_OVER_IP_PROTOCOL_DATA *)0)->RedfishServiceHostnameLength))
//
// 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 info.
//
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_PROTOCOL instance installed
///< on this network interface.
} EFI_REDFISH_DISCOVER_NETWORK_INTERFACE_INTERNAL;
//
// Redfish Discover Instance signature
//
#define EFI_REDFISH_DISCOVER_DATA_SIGNATURE SIGNATURE_32 ('E', 'R', 'D', 'D')
#define EFI_REDFISH_DISOVER_DATA_FROM_DISCOVER_PROTOCOL(a) \
CR (a, EFI_REDFISH_DISCOVER_REST_EX_INSTANCE_INTERNAL, RedfishDiscoverProtocol, EFI_REDFISH_DISCOVER_DATA_SIGNATURE)
//
// Internal structure used to maintain REST EX properties.
//
typedef struct {
LIST_ENTRY Entry; ///< Link list entry.
UINT32 Signature; ///< Instance signature.
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 through 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.
UINTN NumberOfNetworkInterfaces; ///< Number of network interfaces can do Redfish service discovery.
EFI_REDFISH_DISCOVER_NETWORK_INTERFACE *NetworkInterfaceInstances; ///< Network interface instances. It's an array of instances. The number of entries
///< in array is indicated by NumberOfNetworkInterfaces.
EFI_REDFISH_DISCOVER_PROTOCOL RedfishDiscoverProtocol; ///< EFI_REDFISH_DISCOVER_PROTOCOL protocol.
} 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 interface discovery.
//
BOOLEAN HostIntfValidation; ///< Indicates whether to validate Redfish Host interface.
EFI_IP_ADDRESS TargetIpAddress; ///< Target IP address reported in Redfish Host interface.
UINT8 HostAddrFormat; ///< Unknown=00h, Ipv4=01h, Ipv6=02h.
EFI_IP_ADDRESS HostIpAddress; ///< Host IP address reported in Redfish Host interface.
EFI_IP_ADDRESS HostSubnetMask; ///< Host subnet mask address reported in Redfish Host interface.
} EFI_REDFISH_DISCOVERED_INTERNAL_INSTANCE;
/**
The function adds a new found Redfish service to internal list and
notify client.
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 version 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 successfully.
@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