mirror of
https://github.com/ipxe/ipxe
synced 2025-12-25 09:01:24 +03:00
Partial migration of UDP to data-xfer interface. (Will not link at
present; DHCP is broken).
This commit is contained in:
@@ -14,7 +14,8 @@
|
||||
#include <gpxe/tcpip.h>
|
||||
#include <gpxe/if_ether.h>
|
||||
|
||||
struct net_device;
|
||||
struct xfer_interface;
|
||||
struct sockaddr;
|
||||
|
||||
/**
|
||||
* UDP constants
|
||||
@@ -24,147 +25,23 @@ struct net_device;
|
||||
#define UDP_MAX_TXIOB ETH_MAX_MTU
|
||||
#define UDP_MIN_TXIOB ETH_ZLEN
|
||||
|
||||
typedef uint16_t port_t;
|
||||
|
||||
/**
|
||||
* A UDP header
|
||||
*/
|
||||
struct udp_header {
|
||||
port_t source_port;
|
||||
port_t dest_port;
|
||||
/** Source port */
|
||||
uint16_t src;
|
||||
/** Destination port */
|
||||
uint16_t dest;
|
||||
/** Length */
|
||||
uint16_t len;
|
||||
/** Checksum */
|
||||
uint16_t chksum;
|
||||
};
|
||||
|
||||
struct udp_connection;
|
||||
|
||||
/**
|
||||
* UDP operations
|
||||
*
|
||||
*/
|
||||
struct udp_operations {
|
||||
|
||||
/**
|
||||
* Transmit data
|
||||
*
|
||||
* @v conn UDP connection
|
||||
* @v buf Temporary data buffer
|
||||
* @v len Length of temporary data buffer
|
||||
* @ret rc Return status code
|
||||
*
|
||||
* The application may use the temporary data buffer to
|
||||
* construct the data to be sent. Note that merely filling
|
||||
* the buffer will do nothing; the application must call
|
||||
* udp_send() in order to actually transmit the data. Use of
|
||||
* the buffer is not compulsory; the application may call
|
||||
* udp_send() on any block of data.
|
||||
*/
|
||||
int ( * senddata ) ( struct udp_connection *conn, void *buf,
|
||||
size_t len );
|
||||
/**
|
||||
* New data received
|
||||
*
|
||||
* @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,
|
||||
struct sockaddr_tcpip *st_dest );
|
||||
};
|
||||
|
||||
/**
|
||||
* A UDP connection
|
||||
*
|
||||
*/
|
||||
struct udp_connection {
|
||||
/** Address of the remote end of the connection */
|
||||
struct sockaddr_tcpip peer;
|
||||
/** Local port on which the connection receives packets */
|
||||
port_t local_port;
|
||||
/** Transmit buffer */
|
||||
struct io_buffer *tx_iob;
|
||||
/** List of registered connections */
|
||||
struct list_head list;
|
||||
/** Operations table for this connection */
|
||||
struct udp_operations *udp_op;
|
||||
};
|
||||
|
||||
/*
|
||||
* Functions provided to the application layer
|
||||
*/
|
||||
|
||||
/**
|
||||
* Bind UDP connection to all local ports
|
||||
*
|
||||
* @v conn UDP connection
|
||||
*
|
||||
* A promiscuous UDP connection will receive packets with any
|
||||
* destination UDP port. This is required in order to support the PXE
|
||||
* UDP API.
|
||||
*
|
||||
* If the promiscuous connection is not the only UDP connection, the
|
||||
* behaviour is undefined.
|
||||
*/
|
||||
static inline void udp_bind_promisc ( struct udp_connection *conn ) {
|
||||
conn->local_port = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Connect UDP connection to remote host and port
|
||||
*
|
||||
* @v conn UDP connection
|
||||
* @v peer Destination socket address
|
||||
*
|
||||
* This function sets the default address for transmitted packets,
|
||||
* i.e. the address used when udp_send() is called rather than
|
||||
* udp_sendto().
|
||||
*/
|
||||
static inline void udp_connect ( struct udp_connection *conn,
|
||||
struct sockaddr_tcpip *peer ) {
|
||||
memcpy ( &conn->peer, peer, sizeof ( conn->peer ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Connect UDP connection to remote port
|
||||
*
|
||||
* @v conn UDP connection
|
||||
* @v port Destination port
|
||||
*
|
||||
* This function sets only the port part of the default address for
|
||||
* transmitted packets.
|
||||
*/
|
||||
static inline void udp_connect_port ( struct udp_connection *conn,
|
||||
uint16_t port ) {
|
||||
conn->peer.st_port = port;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get default address for transmitted packets
|
||||
*
|
||||
* @v conn UDP connection
|
||||
* @ret peer Default destination socket address
|
||||
*/
|
||||
static inline struct sockaddr_tcpip *
|
||||
udp_peer ( struct udp_connection *conn ) {
|
||||
return &conn->peer;
|
||||
}
|
||||
|
||||
extern int udp_bind ( struct udp_connection *conn, uint16_t local_port );
|
||||
extern int udp_open ( struct udp_connection *conn, uint16_t local_port );
|
||||
extern void udp_close ( struct udp_connection *conn );
|
||||
|
||||
extern int udp_senddata ( struct udp_connection *conn );
|
||||
extern int udp_send ( struct udp_connection *conn,
|
||||
const void *data, size_t len );
|
||||
extern int udp_sendto ( struct udp_connection *conn,
|
||||
struct sockaddr_tcpip *peer,
|
||||
const void *data, size_t len );
|
||||
int udp_sendto_via ( struct udp_connection *conn, struct sockaddr_tcpip *peer,
|
||||
struct net_device *netdev, const void *data,
|
||||
size_t len );
|
||||
extern int udp_open_promisc ( struct xfer_interface *xfer );
|
||||
extern int udp_open ( struct xfer_interface *xfer, struct sockaddr *peer,
|
||||
struct sockaddr *local );
|
||||
|
||||
#endif /* _GPXE_UDP_H */
|
||||
|
||||
|
||||
Reference in New Issue
Block a user