OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
StaticIp4.c
Go to the documentation of this file.
1
10
15
16#define STATIC4 L"static4:"
17
18#define NORMAL_MAC_ADDRESS_DIGIT_COUNT (NET_ETHER_ADDR_LEN * 2)
19#define MAX_MAC_ADDRESS_DIGIT_COUNT (sizeof (EFI_MAC_ADDRESS) * 2)
20#define VLAN_DIGIT_COUNT 4
21
22//
23// Variable length hex digit MAC string with no separators, follow by optional backslash then 4 digit hex VLAN id string.
24// REF: https://github.com/tianocore/edk2/blob/e99d532fd7224e68026543834ed9c0fe3cfaf88c/NetworkPkg/Library/DxeNetLib/DxeNetLib.c#L2363
25//
26STATIC
27EFI_STATUS
29 CHAR16 *MacString
30 )
31{
33 CHAR16 *Walker;
34 CHAR16 Ch;
35 UINTN Count;
36
38 Count = 0;
39 Walker = MacString;
40
41 for ( ; ;) {
42 Ch = *Walker;
43 switch (State) {
45 if ((Ch == CHAR_NULL) || (Ch == L'\\')) {
46 if (Count != NORMAL_MAC_ADDRESS_DIGIT_COUNT) {
47 DEBUG ((
48 DEBUG_INFO,
49 "NETB: Non-standard MAC address length %d!=%d (invalid unless iSCSI)!\n",
50 Count,
52 ));
53 }
54
55 if (Ch == CHAR_NULL) {
56 return EFI_SUCCESS;
57 }
58
59 State = MAC_STRING_VLAN;
60 Count = 0;
61 }
62
63 break;
64
65 case MAC_STRING_VLAN:
66 if (Ch == CHAR_NULL) {
67 if (Count != VLAN_DIGIT_COUNT) {
68 return EFI_INVALID_PARAMETER;
69 }
70
71 return EFI_SUCCESS;
72 }
73
74 break;
75 }
76
77 if (!(((Ch >= L'0') && (Ch <= L'9')) || ((Ch >= L'A') && (Ch <= L'F')) || ((Ch >= L'a') && (Ch <= L'f')))) {
78 if ((Ch == ':') || (Ch == '-')) {
79 DEBUG ((DEBUG_WARN, "NETB: Do not use : or - separators in %s{MAC}\n", STATIC4));
80 }
81
82 return EFI_INVALID_PARAMETER;
83 }
84
85 ++Walker;
86 ++Count;
87
89 return EFI_INVALID_PARAMETER;
90 }
91 }
92}
93
94//
95// Normalise in separate pass to avoid users complaining 'that's not my MAC string' and to avoid
96// showing half-converted MAC string in error messages.
97//
98STATIC
99VOID
101 CHAR16 *MacString
102 )
103{
104 CHAR16 *Walker;
105 CHAR16 Ch;
106
107 for (Walker = MacString; (Ch = *Walker) != CHAR_NULL; ++Walker) {
108 if ((Ch >= L'a') && (Ch <= L'f')) {
109 //
110 // All digits are upper cased.
111 // REF: https://github.com/tianocore/edk2/blob/e99d532fd7224e68026543834ed9c0fe3cfaf88c/NetworkPkg/Library/DxeNetLib/DxeNetLib.c#L2363
112 //
113 *Walker -= (L'a' - L'A');
114 }
115 }
116}
117
118STATIC
119CHAR16 *
121 CHAR16 *CurrentIP,
122 CHAR8 *RequiredName
123 )
124{
125 CHAR16 *NextIP;
126
127 NextIP = StrStr (CurrentIP, L",");
128 if (NextIP == NULL) {
129 if (RequiredName != NULL) {
130 DEBUG ((DEBUG_WARN, "NETB: Missing required %a\n", RequiredName));
131 }
132
133 return NULL;
134 }
135
136 *NextIP = CHAR_NULL;
137
138 return ++NextIP;
139}
140
141EFI_STATUS
143 OC_FLEX_ARRAY *ParsedLoadOptions
144 )
145{
146 EFI_STATUS Status;
147 UINTN Index;
148 OC_PARSED_VAR *Option;
149 CHAR16 *MacString;
151
152 //
153 // Find and apply static IP settings in driver arguments.
154 //
155 for (Index = 0; Index < ParsedLoadOptions->Count; ++Index) {
156 Option = OcFlexArrayItemAt (ParsedLoadOptions, Index);
157
158 if (OcUnicodeStartsWith (Option->Unicode.Name, STATIC4, FALSE)) {
159 MacString = &Option->Unicode.Name[L_STR_LEN (STATIC4)];
160 Status = ValidateMacString (MacString);
161 if (EFI_ERROR (Status)) {
162 DEBUG ((DEBUG_WARN, "NETB: Invalid MAC %s - %r\n", MacString, Status));
163 continue;
164 }
165
166 NormaliseMacString (MacString);
167 if (Option->Unicode.Value == NULL) {
169 } else {
170 ConfigData.StationAddress = Option->Unicode.Value;
171 ConfigData.SubnetMask = GetNextIp4 (ConfigData.StationAddress, "subnet mask");
172 if (ConfigData.SubnetMask == NULL) {
173 return EFI_INVALID_PARAMETER;
174 }
175
176 ConfigData.GatewayAddress = GetNextIp4 (ConfigData.SubnetMask, "gateway");
177 if (ConfigData.GatewayAddress == NULL) {
178 return EFI_INVALID_PARAMETER;
179 }
180
181 ConfigData.DnsAddress = GetNextIp4 (ConfigData.GatewayAddress, NULL);
182 Ip4Config2ConvertOcConfigDataToNvData (MacString, &ConfigData);
183 }
184 }
185 }
186
187 return EFI_SUCCESS;
188}
EFI_STATUS Ip4Config2ConvertOcConfigDataToNvData(IN CHAR16 *VarName, IN IP4_CONFIG2_OC_CONFIG_DATA *ConfigData)
EFI_STATUS Ip4Config2DeleteStaticIpNvData(IN CHAR16 *VarName)
VOID * OcFlexArrayItemAt(IN CONST OC_FLEX_ARRAY *FlexArray, IN CONST UINTN Index)
Definition FlexArray.c:189
#define L_STR_LEN(String)
Definition OcStringLib.h:26
BOOLEAN EFIAPI OcUnicodeStartsWith(IN CONST CHAR16 *String, IN CONST CHAR16 *SearchString, IN BOOLEAN CaseInsensitiveMatch)
PARSE_MAC_ADDRESS_STATE
Definition StaticIp4.c:11
@ MAC_STRING_MAC_ADDRESS
Definition StaticIp4.c:12
@ MAC_STRING_VLAN
Definition StaticIp4.c:13
EFI_STATUS AddRemoveStaticIPs(OC_FLEX_ARRAY *ParsedLoadOptions)
Definition StaticIp4.c:142
#define MAX_MAC_ADDRESS_DIGIT_COUNT
Definition StaticIp4.c:19
#define VLAN_DIGIT_COUNT
Definition StaticIp4.c:20
#define STATIC4
Definition StaticIp4.c:16
STATIC VOID NormaliseMacString(CHAR16 *MacString)
Definition StaticIp4.c:100
STATIC CHAR16 * GetNextIp4(CHAR16 *CurrentIP, CHAR8 *RequiredName)
Definition StaticIp4.c:120
STATIC EFI_STATUS ValidateMacString(CHAR16 *MacString)
Definition StaticIp4.c:28
#define NORMAL_MAC_ADDRESS_DIGIT_COUNT
Definition StaticIp4.c:18
OC_PARSED_VAR_UNICODE Unicode