Updated PXE UDP implementation to use the new Etherboot UDP API.

Updated PXE API dispatcher to use copy_{to,from}_user, and moved to
arch/i386 since the implementation is quite architecture-dependent.
(The individual PXE API calls can be largely
architecture-independent.)
This commit is contained in:
Michael Brown
2006-08-02 23:08:10 +00:00
parent e24a6cb525
commit a0a872f7f1
10 changed files with 559 additions and 324 deletions

View File

@@ -64,6 +64,9 @@ struct udp_operations {
* @v conn UDP connection
* @v data Data
* @v len Length of data
* @v st_src Source address
* @v st_dest Destination address
* @ret rc Return status code
*/
int ( * newdata ) ( struct udp_connection *conn, void *data,
size_t len, struct sockaddr_tcpip *st_src,
@@ -92,8 +95,10 @@ struct udp_connection {
*/
extern int udp_bind ( struct udp_connection *conn, uint16_t local_port );
extern void udp_bind_promisc ( struct udp_connection *conn );
extern void udp_connect ( struct udp_connection *conn,
struct sockaddr_tcpip *peer );
extern void udp_connect_promisc ( struct udp_connection *conn );
extern int udp_open ( struct udp_connection *conn, uint16_t local_port );
extern void udp_close ( struct udp_connection *conn );

View File

@@ -3,8 +3,13 @@
#include "pxe_types.h"
#include "pxe_api.h"
#include "etherboot.h"
#include "tftp.h"
/* Parameter block for pxenv_unknown() */
struct s_PXENV_UNKNOWN {
PXENV_STATUS_t Status; /**< PXE status code */
} PACKED;
typedef struct s_PXENV_UNKNOWN PXENV_UNKNOWN_t;
/* Union used for PXE API calls; we don't know the type of the
* structure until we interpret the opcode. Also, Status is available
@@ -14,6 +19,7 @@
union u_PXENV_ANY {
/* Make it easy to read status for any operation */
PXENV_STATUS_t Status;
struct s_PXENV_UNKNOWN unknown;
struct s_PXENV_UNLOAD_STACK unload_stack;
struct s_PXENV_GET_CACHED_INFO get_cached_info;
struct s_PXENV_TFTP_READ_FILE restart_tftp;
@@ -81,29 +87,11 @@ typedef enum {
typedef struct pxe_stack {
struct s_PXE pxe __attribute__ ((aligned(16)));
struct s_PXENV pxenv __attribute__ ((aligned(16)));
pxe_stack_state_t state;
union {
BOOTPLAYER_t cached_info;
char packet[ETH_FRAME_LEN];
struct {
uint32_t magic_cookie;
unsigned int len;
int eof;
char data[TFTP_MAX_BLKSIZE];
} tftpdata;
struct {
char *buffer;
uint32_t offset;
uint32_t bufferlen;
} readfile;
};
struct {} arch_data __attribute__ ((aligned(16)));
pxe_stack_state_t state;
} pxe_stack_t;
extern int ensure_pxe_state ( pxe_stack_state_t wanted );
extern pxe_stack_t *pxe_stack;
extern PXENV_EXIT_t pxe_api_call ( int opcode, union u_PXENV_ANY *any );
#endif /* PXE_H */