Skip to content

Commit

Permalink
core: readd gPXE/iPXE support for HTTP on pxelinux.0
Browse files Browse the repository at this point in the history
When adding lwIP functionality, the gPXE/iPXE callback was broken.  This
prevented pxelinux.0 from calling gPXE/iPXE for HTTP and FTP URLs.  Re-add
for pxelinux.0 and add code to find file size.

Move to core/legacynet/core.c to access packet_buf and leave a dummy
function for lpxelinux.0.

Signed-off-by: Gene Cumm <gene.cumm@gmail.com>
  • Loading branch information
geneC committed Sep 27, 2015
1 parent 7d9c9ec commit 804efa7
Show file tree
Hide file tree
Showing 3 changed files with 108 additions and 81 deletions.
82 changes: 2 additions & 80 deletions core/fs/pxe/gpxeurl.c
@@ -1,88 +1,10 @@
#include "pxe.h"
#if GPXE

static void gpxe_close_file(struct inode *inode)
{
struct pxe_pvt_inode *socket = PVT(inode);
static __lowmem struct s_PXENV_FILE_CLOSE file_close;

file_close.FileHandle = socket->tftp_remoteport;
pxe_call(PXENV_FILE_CLOSE, &file_close);
}

/**
* Get a fresh packet from a gPXE socket
* @param: inode -> Inode pointer
*
*/
static void gpxe_get_packet(struct inode *inode)
{
struct pxe_pvt_inode *socket = PVT(inode);
static __lowmem struct s_PXENV_FILE_READ file_read;
int err;

while (1) {
file_read.FileHandle = socket->tftp_remoteport;
file_read.Buffer = FAR_PTR(packet_buf);
file_read.BufferSize = PKTBUF_SIZE;
err = pxe_call(PXENV_FILE_READ, &file_read);
if (!err) /* successed */
break;

if (file_read.Status != PXENV_STATUS_TFTP_OPEN)
kaboom();
}

memcpy(socket->tftp_pktbuf, packet_buf, file_read.BufferSize);

socket->tftp_dataptr = socket->tftp_pktbuf;
socket->tftp_bytesleft = file_read.BufferSize;
socket->tftp_filepos += file_read.BufferSize;

if (socket->tftp_bytesleft == 0)
inode->size = socket->tftp_filepos;

/* if we're done here, close the file */
if (inode->size > socket->tftp_filepos)
return;

/* Got EOF, close it */
socket->tftp_goteof = 1;
gpxe_close_file(inode);
}

/**
* Open a url using gpxe
*
* @param:inode, the inode to store our state in
* @param:url, the url we want to open
*
* @out: open_file_t structure, stores in file->open_file
* @out: the lenght of this file, stores in file->file_len
*
*/
void gpxe_open(struct inode *inode, const char *url)
{
static __lowmem struct s_PXENV_FILE_OPEN file_open;
static char lowurl[2*FILENAME_MAX];
struct pxe_pvt_inode *socket = PVT(inode);
int err;

socket->tftp_pktbuf = malloc(PKTBUF_SIZE);
if (!socket->tftp_pktbuf)
return;

snprintf(lowurl, sizeof lowurl, "%s", url);
file_open.Status = PXENV_STATUS_BAD_FUNC;
file_open.FileName = FAR_PTR(lowurl);
err = pxe_call(PXENV_FILE_OPEN, &file_open);
if (err)
return;

socket->fill_buffer = gpxe_get_packet;
socket->close = gpxe_close_file;
socket->tftp_remoteport = file_open.FileHandle;
inode->size = -1; /* This is not an error */
(void)inode;
(void)url;
}

#endif /* GPXE */
6 changes: 5 additions & 1 deletion core/fs/pxe/pxe.h
Expand Up @@ -244,7 +244,11 @@ void tftp_open(struct url_info *url, int flags, struct inode *inode,

/* gpxeurl.c */
void gpxe_open(struct inode *inode, const char *url);
#define GPXE 0
#ifdef __FIRMWARE_BIOS__
# define GPXE 1
#else
# define GPXE 0
#endif

/* http.c */
void http_open(struct url_info *url, int flags, struct inode *inode,
Expand Down
101 changes: 101 additions & 0 deletions core/legacynet/core.c
Expand Up @@ -220,3 +220,104 @@ int reset_pxe(void)

return err;
}

#if GPXE

static void gpxe_close_file(struct inode *inode)
{
struct pxe_pvt_inode *socket = PVT(inode);
static __lowmem struct s_PXENV_FILE_CLOSE file_close;

file_close.FileHandle = socket->tftp_remoteport;
pxe_call(PXENV_FILE_CLOSE, &file_close);
}

/**
* Get a fresh packet from a gPXE socket
* @param: inode -> Inode pointer
*
*/
static void gpxe_get_packet(struct inode *inode)
{
struct pxe_pvt_inode *socket = PVT(inode);
static __lowmem struct s_PXENV_FILE_READ file_read;
int err;

while (1) {
file_read.FileHandle = socket->tftp_remoteport;
file_read.Buffer = FAR_PTR(packet_buf);
file_read.BufferSize = PKTBUF_SIZE;
err = pxe_call(PXENV_FILE_READ, &file_read);
if (!err) /* successed */
break;

if (file_read.Status != PXENV_STATUS_TFTP_OPEN)
kaboom();
}

memcpy(socket->tftp_pktbuf, packet_buf, file_read.BufferSize);

socket->tftp_dataptr = socket->tftp_pktbuf;
socket->tftp_bytesleft = file_read.BufferSize;
socket->tftp_filepos += file_read.BufferSize;

if (socket->tftp_bytesleft == 0)
inode->size = socket->tftp_filepos;

/* if we're done here, close the file */
if (inode->size > socket->tftp_filepos)
return;

/* Got EOF, close it */
socket->tftp_goteof = 1;
gpxe_close_file(inode);
}

const struct pxe_conn_ops gpxe_conn_ops = {
.fill_buffer = gpxe_get_packet,
.close = gpxe_close_file,
};

/**
* Open a url using gpxe
*
* @param:inode, the inode to store our state in
* @param:url, the url we want to open
*
* @out: open_file_t structure, stores in file->open_file
* @out: the lenght of this file, stores in file->file_len
*
*/
void gpxe_open(struct inode *inode, const char *url)
{
static __lowmem struct s_PXENV_FILE_OPEN file_open;
static __lowmem struct s_PXENV_GET_FILE_SIZE file_size;
static __lowmem char lowurl[2*FILENAME_MAX];
struct pxe_pvt_inode *socket = PVT(inode);
int err;

socket->tftp_pktbuf = malloc(PKTBUF_SIZE);
if (!socket->tftp_pktbuf)
return;

snprintf(lowurl, sizeof lowurl, "%s", url);
file_open.Status = PXENV_STATUS_BAD_FUNC;
file_open.FileName = FAR_PTR(lowurl);
err = pxe_call(PXENV_FILE_OPEN, &file_open);
if (err)
return;


socket->ops = &gpxe_conn_ops;
socket->tftp_remoteport = file_open.FileHandle;
file_size.Status = PXENV_STATUS_BAD_FUNC;
file_size.FileHandle = file_open.FileHandle;
err = pxe_call(PXENV_GET_FILE_SIZE, &file_size);
if (err) {
inode->size = -1; /* fallback size; this shouldn't be an error */
} else {
inode->size = file_size.FileSize;
}
}

#endif /* GPXE */

0 comments on commit 804efa7

Please sign in to comment.