david/ipxe
Archived
1
0
This repository has been archived on 2020-12-06. You can view files and clone it, but cannot push or open issues or pull requests.
ipxe/src/include/gpxe/udp.h

166 lines
3.8 KiB
C
Raw Normal View History

2006-06-18 01:34:48 +02:00
#ifndef _GPXE_UDP_H
#define _GPXE_UDP_H
/** @file
*
* UDP protocol
*
* This file defines the gPXE UDP API.
*
*/
#include <stddef.h>
2006-06-25 07:13:17 +02:00
#include <gpxe/pkbuff.h>
#include <gpxe/tcpip.h>
2006-06-25 07:13:17 +02:00
#include <gpxe/if_ether.h>
/**
* UDP constants
*/
#define UDP_MAX_HLEN 72
#define UDP_MAX_TXPKB ETH_MAX_MTU
#define UDP_MIN_TXPKB ETH_ZLEN
typedef uint16_t port_t;
/**
* A UDP header
*/
struct udp_header {
2006-06-28 09:46:28 +02:00
port_t source_port;
port_t dest_port;
uint16_t len;
uint16_t chksum;
2006-06-25 07:13:17 +02:00
};
2006-06-18 01:34:48 +02:00
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 );
2006-06-18 01:34:48 +02:00
/**
* 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
2006-06-18 01:34:48 +02:00
*/
int ( * newdata ) ( struct udp_connection *conn, void *data,
size_t len, struct sockaddr_tcpip *st_src,
struct sockaddr_tcpip *st_dest );
2006-06-18 01:34:48 +02:00
};
/**
* A UDP connection
*
*/
struct udp_connection {
2006-06-25 07:13:17 +02:00
/** Address of the remote end of the connection */
struct sockaddr_tcpip peer;
2006-06-28 09:46:28 +02:00
/** Local port on which the connection receives packets */
port_t local_port;
/** Transmit buffer */
struct pk_buff *tx_pkb;
/** List of registered connections */
struct list_head list;
/** Operations table for this connection */
struct udp_operations *udp_op;
2006-06-18 01:34:48 +02:00
};
/*
2006-06-25 07:13:17 +02:00
* 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 );
2006-06-25 07:13:17 +02:00
extern int udp_open ( struct udp_connection *conn, uint16_t local_port );
2006-06-18 01:34:48 +02:00
extern void udp_close ( struct udp_connection *conn );
2006-07-19 19:29:18 +02:00
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 );
2006-06-25 07:13:17 +02:00
2006-06-18 01:34:48 +02:00
#endif /* _GPXE_UDP_H */