Skip to content

Commit 519a6f7

Browse files
committed
Add network stack configuration options
This allows enabling/disabling various parts of the UEFI network stack: - Entire stack - IPv4 stack - IPv6 stack - PXE boot - HTTP boot All options are enabled by default. Signed-off-by: Mario Bălănică <[email protected]>
1 parent b959fe9 commit 519a6f7

16 files changed

+590
-2
lines changed
Lines changed: 186 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,186 @@
1+
/** @file
2+
3+
Copyright (c) 2025, Mario Bălănică <[email protected]>
4+
5+
SPDX-License-Identifier: BSD-2-Clause-Patent
6+
7+
**/
8+
9+
#include <Uefi.h>
10+
#include <Library/DebugLib.h>
11+
#include <Library/DevicePathLib.h>
12+
#include <Library/HiiLib.h>
13+
#include <Library/UefiBootServicesTableLib.h>
14+
#include <Library/UefiRuntimeServicesTableLib.h>
15+
16+
#include "NetworkStackConfigDxe.h"
17+
18+
extern UINT8 NetworkStackConfigDxeHiiBin[];
19+
extern UINT8 NetworkStackConfigDxeStrings[];
20+
21+
typedef struct {
22+
VENDOR_DEVICE_PATH VendorDevicePath;
23+
EFI_DEVICE_PATH_PROTOCOL End;
24+
} HII_VENDOR_DEVICE_PATH;
25+
26+
STATIC HII_VENDOR_DEVICE_PATH mVendorDevicePath = {
27+
{
28+
{
29+
HARDWARE_DEVICE_PATH,
30+
HW_VENDOR_DP,
31+
{
32+
(UINT8)(sizeof (VENDOR_DEVICE_PATH)),
33+
(UINT8)((sizeof (VENDOR_DEVICE_PATH)) >> 8)
34+
}
35+
},
36+
NETWORK_STACK_CONFIG_FORMSET_GUID
37+
},
38+
{
39+
END_DEVICE_PATH_TYPE,
40+
END_ENTIRE_DEVICE_PATH_SUBTYPE,
41+
{
42+
(UINT8)(END_DEVICE_PATH_LENGTH),
43+
(UINT8)((END_DEVICE_PATH_LENGTH) >> 8)
44+
}
45+
}
46+
};
47+
48+
/**
49+
Installs HII page for user configuration.
50+
51+
@retval EFI_SUCCESS The operation completed successfully.
52+
53+
**/
54+
STATIC
55+
EFI_STATUS
56+
EFIAPI
57+
InstallHiiPages (
58+
VOID
59+
)
60+
{
61+
EFI_STATUS Status;
62+
EFI_HII_HANDLE HiiHandle;
63+
EFI_HANDLE DriverHandle;
64+
65+
DriverHandle = NULL;
66+
Status = gBS->InstallMultipleProtocolInterfaces (
67+
&DriverHandle,
68+
&gEfiDevicePathProtocolGuid,
69+
&mVendorDevicePath,
70+
NULL
71+
);
72+
if (EFI_ERROR (Status)) {
73+
return Status;
74+
}
75+
76+
HiiHandle = HiiAddPackages (
77+
&gNetworkStackConfigFormSetGuid,
78+
DriverHandle,
79+
NetworkStackConfigDxeStrings,
80+
NetworkStackConfigDxeHiiBin,
81+
NULL
82+
);
83+
84+
if (HiiHandle == NULL) {
85+
gBS->UninstallMultipleProtocolInterfaces (
86+
DriverHandle,
87+
&gEfiDevicePathProtocolGuid,
88+
&mVendorDevicePath,
89+
NULL
90+
);
91+
return EFI_OUT_OF_RESOURCES;
92+
}
93+
94+
return EFI_SUCCESS;
95+
}
96+
97+
STATIC
98+
VOID
99+
NetworkStackConfigApply (
100+
IN NETWORK_STACK_CONFIG_VARSTORE_DATA *Config
101+
)
102+
{
103+
EFI_STATUS Status;
104+
UINT32 Index;
105+
EFI_HANDLE Handle = NULL;
106+
107+
struct {
108+
EFI_GUID *Protocol;
109+
CHAR8 *Name;
110+
BOOLEAN Enabled;
111+
} States[] = {
112+
{ &gNetworkStackEnabledProtocolGuid, "Network Stack", Config->Enabled },
113+
{ &gNetworkStackIpv4EnabledProtocolGuid, "IPv4 Stack", Config->Ipv4Enabled },
114+
{ &gNetworkStackIpv6EnabledProtocolGuid, "IPv6 Stack", Config->Ipv6Enabled },
115+
{ &gNetworkStackPxeBootEnabledProtocolGuid, "PXE Boot", Config->PxeBootEnabled },
116+
{ &gNetworkStackHttpBootEnabledProtocolGuid, "HTTP Boot", Config->HttpBootEnabled },
117+
};
118+
119+
for (Index = 0; Index < ARRAY_SIZE (States); Index++) {
120+
if (States[Index].Enabled) {
121+
Status = gBS->InstallMultipleProtocolInterfaces (
122+
&Handle,
123+
States[Index].Protocol,
124+
NULL,
125+
NULL
126+
);
127+
ASSERT_EFI_ERROR (Status);
128+
} else {
129+
DEBUG ((DEBUG_INFO, "%a: %a disabled!\n", __func__, States[Index].Name));
130+
131+
if (Index == 0) {
132+
break;
133+
}
134+
}
135+
}
136+
}
137+
138+
/**
139+
The entry point for NetworkStackConfigDxe driver.
140+
141+
@param[in] ImageHandle The image handle of the driver.
142+
@param[in] SystemTable The system table.
143+
144+
@retval EFI_SUCCESS The operation completed successfully.
145+
146+
**/
147+
EFI_STATUS
148+
EFIAPI
149+
NetworkStackConfigInitialize (
150+
IN EFI_HANDLE ImageHandle,
151+
IN EFI_SYSTEM_TABLE *SystemTable
152+
)
153+
{
154+
EFI_STATUS Status;
155+
UINTN Size;
156+
NETWORK_STACK_CONFIG_VARSTORE_DATA Config;
157+
158+
Config.Enabled = NETWORK_STACK_ENABLED_DEFAULT;
159+
Config.Ipv4Enabled = NETWORK_STACK_IPV4_ENABLED_DEFAULT;
160+
Config.Ipv6Enabled = NETWORK_STACK_IPV6_ENABLED_DEFAULT;
161+
Config.PxeBootEnabled = NETWORK_STACK_PXE_BOOT_ENABLED_DEFAULT;
162+
Config.HttpBootEnabled = NETWORK_STACK_HTTP_BOOT_ENABLED_DEFAULT;
163+
164+
Size = sizeof (NETWORK_STACK_CONFIG_VARSTORE_DATA);
165+
Status = gRT->GetVariable (
166+
NETWORK_STACK_CONFIG_DATA_VAR_NAME,
167+
&gNetworkStackConfigFormSetGuid,
168+
NULL,
169+
&Size,
170+
&Config
171+
);
172+
if (EFI_ERROR (Status)) {
173+
Status = gRT->SetVariable (
174+
NETWORK_STACK_CONFIG_DATA_VAR_NAME,
175+
&gNetworkStackConfigFormSetGuid,
176+
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,
177+
Size,
178+
&Config
179+
);
180+
ASSERT_EFI_ERROR (Status);
181+
}
182+
183+
NetworkStackConfigApply (&Config);
184+
185+
return InstallHiiPages ();
186+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/** @file
2+
3+
Copyright (c) 2025, Mario Bălănică <[email protected]>
4+
5+
SPDX-License-Identifier: BSD-2-Clause-Patent
6+
7+
**/
8+
9+
#ifndef NETWORK_STACK_CONFIG_DXE_H_
10+
#define NETWORK_STACK_CONFIG_DXE_H_
11+
12+
#include <Guid/NetworkStackConfigFormSet.h>
13+
14+
#define NETWORK_STACK_ENABLED_DEFAULT FixedPcdGetBool(PcdNetworkStackEnabledDefault)
15+
#define NETWORK_STACK_IPV4_ENABLED_DEFAULT FixedPcdGetBool(PcdNetworkStackIpv4EnabledDefault)
16+
#define NETWORK_STACK_IPV6_ENABLED_DEFAULT FixedPcdGetBool(PcdNetworkStackIpv6EnabledDefault)
17+
#define NETWORK_STACK_PXE_BOOT_ENABLED_DEFAULT FixedPcdGetBool(PcdNetworkStackPxeBootEnabledDefault)
18+
#define NETWORK_STACK_HTTP_BOOT_ENABLED_DEFAULT FixedPcdGetBool(PcdNetworkStackHttpBootEnabledDefault)
19+
20+
#define NETWORK_STACK_CONFIG_DATA_VAR_NAME L"NetworkStackConfigData"
21+
22+
#pragma pack (1)
23+
24+
typedef struct {
25+
BOOLEAN Enabled;
26+
BOOLEAN Ipv4Enabled;
27+
BOOLEAN Ipv6Enabled;
28+
BOOLEAN PxeBootEnabled;
29+
BOOLEAN HttpBootEnabled;
30+
} NETWORK_STACK_CONFIG_VARSTORE_DATA;
31+
32+
#pragma pack ()
33+
34+
#endif // __NETWORK_STACK_CONFIG_DXE_H__
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
## @file
2+
#
3+
# Copyright (c) 2025, Mario Bălănică <[email protected]>
4+
#
5+
# SPDX-License-Identifier: BSD-2-Clause-Patent
6+
#
7+
##
8+
9+
[Defines]
10+
INF_VERSION = 0x0001001B
11+
BASE_NAME = NetworkStackConfigDxe
12+
FILE_GUID = e82260af-0b20-43ab-8a33-7fd0c0937656
13+
MODULE_TYPE = DXE_DRIVER
14+
VERSION_STRING = 1.0
15+
ENTRY_POINT = NetworkStackConfigInitialize
16+
17+
[Sources]
18+
NetworkStackConfigDxe.c
19+
NetworkStackConfigDxe.h
20+
NetworkStackConfigDxeHii.uni
21+
NetworkStackConfigDxeHii.vfr
22+
23+
[Packages]
24+
MdePkg/MdePkg.dec
25+
MdeModulePkg/MdeModulePkg.dec
26+
Silicon/Rockchip/RockchipPkg.dec
27+
28+
[LibraryClasses]
29+
DebugLib
30+
DevicePathLib
31+
HiiLib
32+
UefiBootServicesTableLib
33+
UefiRuntimeServicesTableLib
34+
UefiDriverEntryPoint
35+
36+
[Guids]
37+
gNetworkStackConfigFormSetGuid
38+
39+
[Protocols]
40+
gNetworkStackEnabledProtocolGuid
41+
gNetworkStackIpv4EnabledProtocolGuid
42+
gNetworkStackIpv6EnabledProtocolGuid
43+
gNetworkStackPxeBootEnabledProtocolGuid
44+
gNetworkStackHttpBootEnabledProtocolGuid
45+
46+
[Pcd]
47+
gRockchipTokenSpaceGuid.PcdNetworkStackEnabledDefault
48+
gRockchipTokenSpaceGuid.PcdNetworkStackIpv4EnabledDefault
49+
gRockchipTokenSpaceGuid.PcdNetworkStackIpv6EnabledDefault
50+
gRockchipTokenSpaceGuid.PcdNetworkStackPxeBootEnabledDefault
51+
gRockchipTokenSpaceGuid.PcdNetworkStackHttpBootEnabledDefault
52+
53+
[Depex]
54+
gEfiVariableArchProtocolGuid AND
55+
gEfiVariableWriteArchProtocolGuid
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/** @file
2+
3+
Copyright (c) 2025, Mario Bălănică <[email protected]>
4+
5+
SPDX-License-Identifier: BSD-2-Clause-Patent
6+
7+
**/
8+
9+
#langdef en-US "English"
10+
11+
#string STR_NULL #language en-US ""
12+
13+
#string STR_FORM_SET_TITLE #language en-US "Network Stack Configuration"
14+
#string STR_FORM_SET_TITLE_HELP #language en-US "Configure the network stack support."
15+
16+
#string STR_NETWORK_STACK_STATE_PROMPT #language en-US "Network Stack"
17+
#string STR_NETWORK_STACK_STATE_HELP #language en-US "Enable or disable the UEFI network stack."
18+
#string STR_NETWORK_STACK_IPV4_STATE_PROMPT #language en-US " IPv4 Stack"
19+
#string STR_NETWORK_STACK_IPV4_STATE_HELP #language en-US "Enable or disable the UEFI IPv4 network stack."
20+
#string STR_NETWORK_STACK_IPV6_STATE_PROMPT #language en-US " IPv6 Stack"
21+
#string STR_NETWORK_STACK_IPV6_STATE_HELP #language en-US "Enable or disable the UEFI IPv6 network stack."
22+
#string STR_NETWORK_STACK_PXE_BOOT_STATE_PROMPT #language en-US " PXE Boot"
23+
#string STR_NETWORK_STACK_PXE_BOOT_STATE_HELP #language en-US "Enable or disable the UEFI PXE boot support."
24+
#string STR_NETWORK_STACK_HTTP_BOOT_STATE_PROMPT #language en-US " HTTP Boot"
25+
#string STR_NETWORK_STACK_HTTP_BOOT_STATE_HELP #language en-US "Enable or disable the UEFI HTTP boot support."
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
/** @file
2+
3+
Copyright (c) 2025, Mario Bălănică <[email protected]>
4+
5+
SPDX-License-Identifier: BSD-2-Clause-Patent
6+
7+
**/
8+
9+
#include <Uefi/UefiMultiPhase.h>
10+
#include <Guid/HiiPlatformSetupFormset.h>
11+
12+
#include "NetworkStackConfigDxe.h"
13+
14+
formset
15+
guid = NETWORK_STACK_CONFIG_FORMSET_GUID,
16+
title = STRING_TOKEN(STR_FORM_SET_TITLE),
17+
help = STRING_TOKEN(STR_FORM_SET_TITLE_HELP),
18+
classguid = EFI_HII_PLATFORM_SETUP_FORMSET_GUID,
19+
20+
efivarstore NETWORK_STACK_CONFIG_VARSTORE_DATA,
21+
attribute = EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,
22+
name = NetworkStackConfigData,
23+
guid = NETWORK_STACK_CONFIG_FORMSET_GUID;
24+
25+
form formid = 1,
26+
title = STRING_TOKEN(STR_FORM_SET_TITLE);
27+
28+
checkbox varid = NetworkStackConfigData.Enabled,
29+
prompt = STRING_TOKEN(STR_NETWORK_STACK_STATE_PROMPT),
30+
help = STRING_TOKEN(STR_NETWORK_STACK_STATE_HELP),
31+
flags = RESET_REQUIRED,
32+
default = NETWORK_STACK_ENABLED_DEFAULT,
33+
endcheckbox;
34+
grayoutif ideqval NetworkStackConfigData.Enabled == 0;
35+
checkbox varid = NetworkStackConfigData.Ipv4Enabled,
36+
prompt = STRING_TOKEN(STR_NETWORK_STACK_IPV4_STATE_PROMPT),
37+
help = STRING_TOKEN(STR_NETWORK_STACK_IPV4_STATE_HELP),
38+
flags = RESET_REQUIRED,
39+
default = NETWORK_STACK_IPV4_ENABLED_DEFAULT,
40+
endcheckbox;
41+
checkbox varid = NetworkStackConfigData.Ipv6Enabled,
42+
prompt = STRING_TOKEN(STR_NETWORK_STACK_IPV6_STATE_PROMPT),
43+
help = STRING_TOKEN(STR_NETWORK_STACK_IPV6_STATE_HELP),
44+
flags = RESET_REQUIRED,
45+
default = NETWORK_STACK_IPV6_ENABLED_DEFAULT,
46+
endcheckbox;
47+
checkbox varid = NetworkStackConfigData.PxeBootEnabled,
48+
prompt = STRING_TOKEN(STR_NETWORK_STACK_PXE_BOOT_STATE_PROMPT),
49+
help = STRING_TOKEN(STR_NETWORK_STACK_PXE_BOOT_STATE_HELP),
50+
flags = RESET_REQUIRED,
51+
default = NETWORK_STACK_PXE_BOOT_ENABLED_DEFAULT,
52+
endcheckbox;
53+
checkbox varid = NetworkStackConfigData.HttpBootEnabled,
54+
prompt = STRING_TOKEN(STR_NETWORK_STACK_HTTP_BOOT_STATE_PROMPT),
55+
help = STRING_TOKEN(STR_NETWORK_STACK_HTTP_BOOT_STATE_HELP),
56+
flags = RESET_REQUIRED,
57+
default = NETWORK_STACK_HTTP_BOOT_ENABLED_DEFAULT,
58+
endcheckbox;
59+
endif;
60+
endform;
61+
endformset;
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/** @file
2+
3+
Copyright (c) 2025, Mario Bălănică <[email protected]>
4+
5+
SPDX-License-Identifier: BSD-2-Clause-Patent
6+
7+
**/
8+
9+
#include <Base.h>
10+
11+
RETURN_STATUS
12+
EFIAPI
13+
NetworkStackEnabledLibInitialize (
14+
VOID
15+
)
16+
{
17+
return RETURN_SUCCESS;
18+
}

0 commit comments

Comments
 (0)