masscan-mark-ii/src/stack-tcp-api.h

81 lines
2.0 KiB
C

#ifndef STACK_HANDLE_H
#define STACK_HANDLE_H
#include <stdio.h>
#include "util-bool.h" /* <stdbool.h> */
struct ProtocolParserStream;
enum TCP__flags {
TCP__static,/* it's static data, so the send function can point to it */
TCP__copy, /* the send function must copy the data */
TCP__adopt, /* the buffer was just allocated, so the send function can adopt the pointer */
TCP__close_fin /* close connection */
};
enum {
SOCKERR_NONE=0, /* no error */
SOCKERR_EBADF=10, /* bad socket descriptor */
};
typedef struct stack_handle_t {
void *tcpcon;
void *tcb;
unsigned secs;
unsigned usecs;
} stack_handle_t;
/**
* Set a new default timeout.
*/
int
tcpapi_set_timeout(struct stack_handle_t *socket,
unsigned secs,
unsigned usecs
);
/**
* Change from the "send" state to the "receive" state.
* Has no effect if in any state other than "send".
* This is none-blocking, an event will be triggered
* later that has the data.
*/
int
tcpapi_recv(struct stack_handle_t *socket);
int
tcpapi_send(struct stack_handle_t *socket,
const void *buf, size_t length,
enum TCP__flags flags);
/**
* Re-connect to the target, same IP and port, creating a new connection
* from a different port on this side.
*/
int
tcpapi_reconnect(struct stack_handle_t *old_socket,
struct ProtocolParserStream *new_stream,
unsigned new_app_state);
/**
* The "app state" variable is stored opaquely in the `tcb` structure, so
* to reset it, we need an access function.
*/
unsigned
tcpapi_change_app_state(struct stack_handle_t *socket, unsigned new_app_state);
/** Perform the sockets half-close function (calling `close()`). This
* doesn't actually get rid of the socket, but only stops sending.
* It sends a FIN packet to the other side, and transitions to the
* TCP CLOSE-WAIT state.
* The socket will continue to receive from the opposing side until they
* give us a FIN packet. */
int
tcpapi_close(struct stack_handle_t *socket);
#endif