|
@@ -128,6 +128,38 @@ pxenv_get_cached_info_name ( int packet_type ) {
|
128
|
128
|
static union pxe_cached_info __bss16_array ( cached_info, [NUM_CACHED_INFOS] );
|
129
|
129
|
#define cached_info __use_data16 ( cached_info )
|
130
|
130
|
|
|
131
|
+/**
|
|
132
|
+ * Construct cached DHCP packets
|
|
133
|
+ *
|
|
134
|
+ */
|
|
135
|
+void pxe_fake_cached_info ( void ) {
|
|
136
|
+ struct pxe_dhcp_packet_creator *creator;
|
|
137
|
+ union pxe_cached_info *info;
|
|
138
|
+ unsigned int i;
|
|
139
|
+ int rc;
|
|
140
|
+
|
|
141
|
+ /* Sanity check */
|
|
142
|
+ assert ( pxe_netdev != NULL );
|
|
143
|
+
|
|
144
|
+ /* Erase any stale packets */
|
|
145
|
+ memset ( cached_info, 0, sizeof ( cached_info ) );
|
|
146
|
+
|
|
147
|
+ /* Construct all DHCP packets */
|
|
148
|
+ for ( i = 0 ; i < ( sizeof ( pxe_dhcp_packet_creators ) /
|
|
149
|
+ sizeof ( pxe_dhcp_packet_creators[0] ) ) ; i++ ) {
|
|
150
|
+
|
|
151
|
+ /* Construct DHCP packet */
|
|
152
|
+ creator = &pxe_dhcp_packet_creators[i];
|
|
153
|
+ info = &cached_info[i];
|
|
154
|
+ if ( ( rc = creator->create ( pxe_netdev, info,
|
|
155
|
+ sizeof ( *info ) ) ) != 0 ) {
|
|
156
|
+ DBGC ( &pxe_netdev, " failed to build packet: %s\n",
|
|
157
|
+ strerror ( rc ) );
|
|
158
|
+ /* Continue constructing remaining packets */
|
|
159
|
+ }
|
|
160
|
+ }
|
|
161
|
+}
|
|
162
|
+
|
131
|
163
|
/**
|
132
|
164
|
* UNLOAD BASE CODE STACK
|
133
|
165
|
*
|
|
@@ -149,44 +181,26 @@ pxenv_unload_stack ( struct s_PXENV_UNLOAD_STACK *unload_stack ) {
|
149
|
181
|
*/
|
150
|
182
|
static PXENV_EXIT_t
|
151
|
183
|
pxenv_get_cached_info ( struct s_PXENV_GET_CACHED_INFO *get_cached_info ) {
|
152
|
|
- struct pxe_dhcp_packet_creator *creator;
|
153
|
184
|
union pxe_cached_info *info;
|
154
|
185
|
unsigned int idx;
|
155
|
186
|
size_t len;
|
156
|
187
|
userptr_t buffer;
|
157
|
|
- int rc;
|
158
|
188
|
|
159
|
189
|
DBGC ( &pxe_netdev, "PXENV_GET_CACHED_INFO %s to %04x:%04x+%x",
|
160
|
190
|
pxenv_get_cached_info_name ( get_cached_info->PacketType ),
|
161
|
191
|
get_cached_info->Buffer.segment,
|
162
|
192
|
get_cached_info->Buffer.offset, get_cached_info->BufferSize );
|
163
|
193
|
|
164
|
|
- /* Sanity check */
|
165
|
|
- if ( ! pxe_netdev ) {
|
166
|
|
- DBGC ( &pxe_netdev, "PXENV_GET_CACHED_INFO called with no "
|
167
|
|
- "network device\n" );
|
168
|
|
- get_cached_info->Status = PXENV_STATUS_UNDI_INVALID_STATE;
|
169
|
|
- return PXENV_EXIT_FAILURE;
|
170
|
|
- }
|
171
|
|
-
|
172
|
194
|
/* Sanity check */
|
173
|
195
|
idx = ( get_cached_info->PacketType - 1 );
|
174
|
196
|
if ( idx >= NUM_CACHED_INFOS ) {
|
175
|
197
|
DBGC ( &pxe_netdev, " bad PacketType %d\n",
|
176
|
198
|
get_cached_info->PacketType );
|
177
|
|
- goto err;
|
|
199
|
+ get_cached_info->Status = PXENV_STATUS_UNSUPPORTED;
|
|
200
|
+ return PXENV_EXIT_FAILURE;
|
178
|
201
|
}
|
179
|
202
|
info = &cached_info[idx];
|
180
|
203
|
|
181
|
|
- /* Construct DHCP packet */
|
182
|
|
- creator = &pxe_dhcp_packet_creators[idx];
|
183
|
|
- if ( ( rc = creator->create ( pxe_netdev, info,
|
184
|
|
- sizeof ( *info ) ) ) != 0 ) {
|
185
|
|
- DBGC ( &pxe_netdev, " failed to build packet: %s\n",
|
186
|
|
- strerror ( rc ) );
|
187
|
|
- goto err;
|
188
|
|
- }
|
189
|
|
-
|
190
|
204
|
/* Copy packet (if applicable) */
|
191
|
205
|
len = get_cached_info->BufferSize;
|
192
|
206
|
if ( len == 0 ) {
|
|
@@ -238,10 +252,6 @@ pxenv_get_cached_info ( struct s_PXENV_GET_CACHED_INFO *get_cached_info ) {
|
238
|
252
|
DBGC ( &pxe_netdev, "\n" );
|
239
|
253
|
get_cached_info->Status = PXENV_STATUS_SUCCESS;
|
240
|
254
|
return PXENV_EXIT_SUCCESS;
|
241
|
|
-
|
242
|
|
- err:
|
243
|
|
- get_cached_info->Status = PXENV_STATUS_OUT_OF_RESOURCES;
|
244
|
|
- return PXENV_EXIT_FAILURE;
|
245
|
255
|
}
|
246
|
256
|
|
247
|
257
|
/* PXENV_RESTART_TFTP
|