mirror of
https://github.com/xcat2/xNBA.git
synced 2025-01-05 19:15:05 +00:00
101 lines
2.2 KiB
C
101 lines
2.2 KiB
C
|
#ifndef _TCP_H
|
||
|
#define _TCP_H
|
||
|
|
||
|
/** @file
|
||
|
*
|
||
|
* TCP protocol
|
||
|
*
|
||
|
* This file defines the gPXE TCP API.
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
#include <stddef.h>
|
||
|
#include <gpxe/in.h>
|
||
|
|
||
|
struct tcp_connection;
|
||
|
|
||
|
/**
|
||
|
* TCP operations
|
||
|
*
|
||
|
*/
|
||
|
struct tcp_operations {
|
||
|
/**
|
||
|
* Connection aborted (RST received)
|
||
|
*
|
||
|
* @v conn TCP connection
|
||
|
*/
|
||
|
void ( * aborted ) ( struct tcp_connection *conn );
|
||
|
/**
|
||
|
* Connection timed out
|
||
|
*
|
||
|
* @v conn TCP connection
|
||
|
*/
|
||
|
void ( * timedout ) ( struct tcp_connection *conn );
|
||
|
/**
|
||
|
* Connection aborted (FIN received)
|
||
|
*
|
||
|
* @v conn TCP connection
|
||
|
*
|
||
|
* Note that acked() and newdata() may be called after
|
||
|
* closed(), if the packet containing the FIN also
|
||
|
* acknowledged data or contained new data.
|
||
|
*/
|
||
|
void ( * closed ) ( struct tcp_connection *conn );
|
||
|
/**
|
||
|
* Connection established (SYNACK received)
|
||
|
*
|
||
|
* @v conn TCP connection
|
||
|
*/
|
||
|
void ( * connected ) ( struct tcp_connection *conn );
|
||
|
/**
|
||
|
* Data acknowledged
|
||
|
*
|
||
|
* @v conn TCP connection
|
||
|
* @v len Length of acknowledged data
|
||
|
*
|
||
|
* @c len is guaranteed to not exceed the outstanding amount
|
||
|
* of unacknowledged data.
|
||
|
*/
|
||
|
void ( * acked ) ( struct tcp_connection *conn, size_t len );
|
||
|
/**
|
||
|
* New data received
|
||
|
*
|
||
|
* @v conn TCP connection
|
||
|
* @v data Data
|
||
|
* @v len Length of data
|
||
|
*/
|
||
|
void ( * newdata ) ( struct tcp_connection *conn,
|
||
|
void *data, size_t len );
|
||
|
/**
|
||
|
* Transmit data
|
||
|
*
|
||
|
* @v conn TCP connection
|
||
|
*
|
||
|
* The application should transmit whatever it currently wants
|
||
|
* to send using tcp_send(). If retransmissions are required,
|
||
|
* senddata() will be called again and the application must
|
||
|
* regenerate the data. The easiest way to implement this is
|
||
|
* to ensure that senddata() never changes the application's
|
||
|
* state.
|
||
|
*/
|
||
|
void ( * senddata ) ( struct tcp_connection *conn );
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* A TCP connection
|
||
|
*
|
||
|
*/
|
||
|
struct tcp_connection {
|
||
|
/** Address of the remote end of the connection */
|
||
|
struct sockaddr_in sin;
|
||
|
/** Operations table for this connection */
|
||
|
struct tcp_operations *tcp_op;
|
||
|
};
|
||
|
|
||
|
extern int tcp_connect ( struct tcp_connection *conn );
|
||
|
extern void tcp_send ( struct tcp_connection *conn, const void *data,
|
||
|
size_t len );
|
||
|
extern void tcp_close ( struct tcp_connection *conn );
|
||
|
|
||
|
#endif /* _TCP_H */
|