--- libaitio/inc/aitio.h 2013/06/04 12:44:46 1.31 +++ libaitio/inc/aitio.h 2013/08/13 00:17:28 1.34 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: aitio.h,v 1.31 2013/06/04 12:44:46 misho Exp $ +* $Id: aitio.h,v 1.34 2013/08/13 00:17:28 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -59,14 +59,33 @@ SUCH DAMAGE. #include #include #include +#include #include +#include #ifndef STRSIZ -#define STRSIZ 256 +#define STRSIZ 256 #endif +#define IO_SOCK_ROLE_CLIENT 0 +#define IO_SOCK_ROLE_SERVER 1 + +typedef struct { + int sock_role; + int sock_backq; + int sock_type; + int sock_proto; + int sock_fd; + sockaddr_t sock_addr; + + sockaddr_t sock_peer; + + ait_val_t sock_buf; +} sock_t; + + // io_GetErrno() Get error code of last operation int io_GetErrno(); // io_GetError() Get error text of last operation @@ -74,6 +93,35 @@ const char *io_GetError(); /* + * ioInitSocket() - Init socket and allocate resources + * + * @role = Socket role + * @type = Socket type + * @proto = Socket protocol + * @addr = Bind to address + * @port = Bind to port + * @buflen = Socket buffer, optional if =0 == BUFSIZ + * return: NULL error or !=NULL created socket + */ +sock_t *ioInitSocket(int role, int type, int proto, + const char *addr, unsigned short port, size_t buflen); +/* + * ioCloseSocket() - Close socket and free resources + * + * @s = Socket + * return: none + */ +void ioCloseSocket(sock_t ** __restrict s); +/* + * ioUpSocket() - Setup socket for use + * + * @s = Socket + * @arg = Server role = listen backlog queue and Client role = peer address + * return: -1 error or 0 ok + */ +int ioUpSocket(sock_t * __restrict s, void *arg); + +/* * ioPromptRead() - Read data from input h[0] with prompt to output h[1] * * @h = file handles h[0] = input, h[1] = output, if NULL use stdin, stdout @@ -385,6 +433,58 @@ FILE *io_fd2buf(int fd, const char *mode); * return: -1 error or open file handle */ int io_dumbFile(const char *csFile, int mode, off_t size); + + +/* + * io_get1stiface() - Get first interface of host + * + * @szIface = interface string buffer + * @iflen = size of interface buffer + * return: -1 error or 0 ok + */ +int io_get1stiface(char *szIface, int iflen); +/* + * io_etherOpen() - Open BPF interface to device + * + * @csIface = interface name + * @flags = open flags + * @whdr = with complete headers + * @wdlt = with data link type + * @buflen = buffer length + * @zcbuf = zero copy buffer, if BPF supports it and isn't NULL + * return: -1 error or >-1 bpf handle + */ +int io_etherOpen(const char *csIface, int flags, int whdr, int wdlt, + unsigned int *buflen, void **zcbuf); +/* + * io_etherClose() - Close BPF interface + * + * @eth = bpf handle + * @zcbuf = zero copy buffer, if BPF supports it and isn't NULL + * return: none + */ +void io_etherClose(int eth, void **zcbuf); + +/* + * io_etherSend() - Send packet to bpf + * + * @eth = bpf handle + * @buf = buffer + * @buflen = buffer length + * return: -1 error or !=-1 written bytes + */ +ssize_t io_etherSend(int eth, const void *buf, size_t buflen); +/* + * io_etherRecv() - Receive packet from bpf + * + * @eth = bpf handle + * @buf = buffer + * @buflen = buffer length + * @zcbuf = zero copy buffer, if BPF supports it and isn't NULL + * return: -1 error or !=-1 readed bytes + */ +ssize_t io_etherRecv(int eth, void * __restrict buf, + size_t buflen, void * __restrict zcbuf); #endif