#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. | |
Definition in file pxe_udp.c.
| 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.
| xfer | Data transfer interface | |
| iobuf | I/O buffer | |
| meta | Data transfer metadata |
| rc | Return status code |
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 }
struct xfer_interface_operations pxe_udp_xfer_operations [static] |
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,
}
struct pxe_udp_connection pxe_udp [static] |
Initial value:
{
.xfer = XFER_INIT ( &pxe_udp_xfer_operations ),
.local = {
.sin_family = AF_INET,
},
}
Definition at line 115 of file pxe_udp.c.
Referenced by pxe_udp_deliver_iob().
1.5.7.1