pxe_udp.c File Reference

PXE UDP API. More...

#include <string.h>
#include <byteswap.h>
#include <gpxe/xfer.h>
#include <gpxe/udp.h>
#include <gpxe/uaccess.h>
#include <gpxe/process.h>
#include <pxe.h>

Go to the source code of this file.

Data Structures

struct  pxe_udp_connection
 A PXE UDP connection. More...

Functions

 FILE_LICENCE (GPL2_OR_LATER)
static int pxe_udp_deliver_iob (struct xfer_interface *xfer, struct io_buffer *iobuf, struct xfer_metadata *meta)
 Receive PXE UDP data.
PXENV_EXIT_t pxenv_udp_open (struct s_PXENV_UDP_OPEN *pxenv_udp_open)
 UDP OPEN.
PXENV_EXIT_t pxenv_udp_close (struct s_PXENV_UDP_CLOSE *pxenv_udp_close)
 UDP CLOSE.
PXENV_EXIT_t pxenv_udp_write (struct s_PXENV_UDP_WRITE *pxenv_udp_write)
 UDP WRITE.
PXENV_EXIT_t pxenv_udp_read (struct s_PXENV_UDP_READ *pxenv_udp_read)
 UDP READ.

Variables

static struct
xfer_interface_operations 
pxe_udp_xfer_operations
 PXE UDP data transfer interface operations.
static struct pxe_udp_connection pxe_udp
 The PXE UDP connection.


Detailed Description

PXE UDP API.

Definition in file pxe_udp.c.


Function Documentation

FILE_LICENCE ( GPL2_OR_LATER   ) 

static int pxe_udp_deliver_iob ( struct xfer_interface xfer,
struct io_buffer iobuf,
struct xfer_metadata meta 
) [static]

Receive PXE UDP data.

Parameters:
xfer Data transfer interface
iobuf I/O buffer
meta Data transfer metadata
Return values:
rc Return status code
Receives a packet as part of the current pxenv_udp_read() operation.

Definition at line 56 of file pxe_udp.c.

References AF_INET, assert, s_PXENV_UDP_READ::buffer, s_PXENV_UDP_READ::buffer_size, container_of, copy_to_user(), s_PXENV_UDP_READ::d_port, io_buffer::data, DBG, xfer_metadata::dest, s_PXENV_UDP_READ::dest_ip, ENOBUFS, free_iob(), iob_len(), NULL, s_SEGOFF16::offset, pxe_udp, pxe_udp_connection::pxenv_udp_read, pxenv_udp_read(), real_to_user(), in_addr::s_addr, s_PXENV_UDP_READ::s_port, s_SEGOFF16::segment, sockaddr_in::sin_addr, sockaddr_in::sin_family, sockaddr_in::sin_port, xfer_metadata::src, and s_PXENV_UDP_READ::src_ip.

00058                                                               {
00059         struct pxe_udp_connection *pxe_udp = 
00060                 container_of ( xfer, struct pxe_udp_connection, xfer );
00061         struct s_PXENV_UDP_READ *pxenv_udp_read = pxe_udp->pxenv_udp_read;
00062         struct sockaddr_in *sin_src;
00063         struct sockaddr_in *sin_dest;
00064         userptr_t buffer;
00065         size_t len;
00066         int rc = 0;
00067 
00068         if ( ! pxenv_udp_read ) {
00069                 DBG ( "PXE discarded UDP packet\n" );
00070                 rc = -ENOBUFS;
00071                 goto done;
00072         }
00073 
00074         /* Copy packet to buffer and record length */
00075         buffer = real_to_user ( pxenv_udp_read->buffer.segment,
00076                                 pxenv_udp_read->buffer.offset );
00077         len = iob_len ( iobuf );
00078         if ( len > pxenv_udp_read->buffer_size )
00079                 len = pxenv_udp_read->buffer_size;
00080         copy_to_user ( buffer, 0, iobuf->data, len );
00081         pxenv_udp_read->buffer_size = len;
00082 
00083         /* Fill in source/dest information */
00084         assert ( meta );
00085         sin_src = ( struct sockaddr_in * ) meta->src;
00086         assert ( sin_src );
00087         assert ( sin_src->sin_family == AF_INET );
00088         pxenv_udp_read->src_ip = sin_src->sin_addr.s_addr;
00089         pxenv_udp_read->s_port = sin_src->sin_port;
00090         sin_dest = ( struct sockaddr_in * ) meta->dest;
00091         assert ( sin_dest );
00092         assert ( sin_dest->sin_family == AF_INET );
00093         pxenv_udp_read->dest_ip = sin_dest->sin_addr.s_addr;
00094         pxenv_udp_read->d_port = sin_dest->sin_port;
00095 
00096         /* Mark as received */
00097         pxe_udp->pxenv_udp_read = NULL;
00098 
00099  done:
00100         free_iob ( iobuf );
00101         return rc;
00102 }


Variable Documentation

Initial value:

 {
        .close          = ignore_xfer_close,
        .vredirect      = ignore_xfer_vredirect,
        .window         = unlimited_xfer_window,
        .alloc_iob      = default_xfer_alloc_iob,
        .deliver_iob    = pxe_udp_deliver_iob,
        .deliver_raw    = xfer_deliver_as_iob,
}
PXE UDP data transfer interface operations.

Definition at line 105 of file pxe_udp.c.

struct pxe_udp_connection pxe_udp [static]

Initial value:

 {
        .xfer = XFER_INIT ( &pxe_udp_xfer_operations ),
        .local = {
                .sin_family = AF_INET,
        },
}
The PXE UDP connection.

Definition at line 115 of file pxe_udp.c.

Referenced by pxe_udp_deliver_iob().


Generated on Tue Apr 6 20:01:13 2010 for gPXE by  doxygen 1.5.7.1