| #ifndef __COMMON_H__ |
| #define __COMMON_H__ |
| |
| #define CONFIG_QEMU |
| |
| //#define DEBUG 1 |
| |
| // Uncomment the following line to enable SLIRP statistics printing in Qemu |
| //#define LOG_ENABLED |
| |
| #ifdef LOG_ENABLED |
| #define STAT(expr) expr |
| #else |
| #define STAT(expr) \ |
| do { \ |
| } while (0) |
| #endif |
| |
| #ifndef CONFIG_QEMU |
| #include "version.h" |
| #endif |
| #include "config-host.h" |
| #include "slirp_config.h" |
| |
| #ifdef _WIN32 |
| #include <inttypes.h> |
| |
| typedef uint8_t u_int8_t; |
| typedef uint16_t u_int16_t; |
| typedef uint32_t u_int32_t; |
| typedef uint64_t u_int64_t; |
| typedef char *caddr_t; |
| |
| #define WIN32_LEAN_AND_MEAN |
| #include <windows.h> |
| #include <winsock2.h> |
| #include <ws2tcpip.h> |
| #include <sys/timeb.h> |
| #include <iphlpapi.h> |
| |
| #define EWOULDBLOCK WSAEWOULDBLOCK |
| #define EINPROGRESS WSAEINPROGRESS |
| #define ENOTCONN WSAENOTCONN |
| #define EHOSTUNREACH WSAEHOSTUNREACH |
| #define ENETUNREACH WSAENETUNREACH |
| #define ECONNREFUSED WSAECONNREFUSED |
| #else |
| #define ioctlsocket ioctl |
| #define closesocket(s) close(s) |
| #define O_BINARY 0 |
| #endif |
| |
| #include <sys/types.h> |
| #ifdef HAVE_SYS_BITYPES_H |
| #include <sys/bitypes.h> |
| #endif |
| |
| #include <sys/time.h> |
| |
| #ifdef NEED_TYPEDEFS |
| typedef char int8_t; |
| typedef unsigned char u_int8_t; |
| |
| #if SIZEOF_SHORT == 2 |
| typedef short int16_t; |
| typedef unsigned short u_int16_t; |
| #else |
| #if SIZEOF_INT == 2 |
| typedef int int16_t; |
| typedef unsigned int u_int16_t; |
| #else |
| #error Cannot find a type with sizeof() == 2 |
| #endif |
| #endif |
| |
| #if SIZEOF_SHORT == 4 |
| typedef short int32_t; |
| typedef unsigned short u_int32_t; |
| #else |
| #if SIZEOF_INT == 4 |
| typedef int int32_t; |
| typedef unsigned int u_int32_t; |
| #else |
| #error Cannot find a type with sizeof() == 4 |
| #endif |
| #endif |
| #endif /* NEED_TYPEDEFS */ |
| |
| #ifdef HAVE_UNISTD_H |
| #include <unistd.h> |
| #endif |
| |
| #ifdef HAVE_STDLIB_H |
| #include <stdlib.h> |
| #endif |
| |
| #include <stdio.h> |
| #include <errno.h> |
| |
| #ifndef HAVE_MEMMOVE |
| #define memmove(x, y, z) bcopy(y, x, z) |
| #endif |
| |
| #if TIME_WITH_SYS_TIME |
| #include <sys/time.h> |
| #include <time.h> |
| #else |
| #ifdef HAVE_SYS_TIME_H |
| #include <sys/time.h> |
| #else |
| #include <time.h> |
| #endif |
| #endif |
| |
| #ifdef HAVE_STRING_H |
| #include <string.h> |
| #else |
| #include <strings.h> |
| #endif |
| |
| #ifndef _WIN32 |
| #include <sys/uio.h> |
| #endif |
| |
| #undef _P |
| #ifndef NO_PROTOTYPES |
| #define _P(x) x |
| #else |
| #define _P(x) () |
| #endif |
| |
| #ifndef _WIN32 |
| #include <netinet/in.h> |
| #include <arpa/inet.h> |
| #endif |
| |
| #ifdef GETTIMEOFDAY_ONE_ARG |
| #define gettimeofday(x, y) gettimeofday(x) |
| #endif |
| |
| /* Systems lacking strdup() definition in <string.h>. */ |
| #if defined(ultrix) |
| char *strdup _P((const char *)); |
| #endif |
| |
| /* Systems lacking malloc() definition in <stdlib.h>. */ |
| #if defined(ultrix) || defined(hcx) |
| void *malloc _P((size_t arg)); |
| void free _P((void *ptr)); |
| #endif |
| |
| #ifndef HAVE_INET_ATON |
| int inet_aton _P((const char *cp, struct in_addr *ia)); |
| #endif |
| |
| #include <fcntl.h> |
| #ifndef NO_UNIX_SOCKETS |
| #include <sys/un.h> |
| #endif |
| #include <signal.h> |
| #ifdef HAVE_SYS_SIGNAL_H |
| #include <sys/signal.h> |
| #endif |
| #ifndef _WIN32 |
| #include <sys/socket.h> |
| #endif |
| |
| #if defined(HAVE_SYS_IOCTL_H) |
| #include <sys/ioctl.h> |
| #endif |
| |
| #ifdef HAVE_SYS_SELECT_H |
| #include <sys/select.h> |
| #endif |
| |
| #ifdef HAVE_SYS_WAIT_H |
| #include <sys/wait.h> |
| #endif |
| |
| #ifdef HAVE_SYS_FILIO_H |
| #include <sys/filio.h> |
| #endif |
| |
| #ifdef USE_PPP |
| #include <ppp/slirppp.h> |
| #endif |
| |
| #ifdef __STDC__ |
| #include <stdarg.h> |
| #else |
| #include <varargs.h> |
| #endif |
| |
| #include <sys/stat.h> |
| |
| /* Avoid conflicting with the libc insque() and remque(), which |
| have different prototypes. */ |
| #define insque slirp_insque |
| #define remque slirp_remque |
| |
| #ifdef HAVE_SYS_STROPTS_H |
| #include <sys/stropts.h> |
| #endif |
| |
| #include "debug.h" |
| |
| #include "ip.h" |
| #include "tcp.h" |
| #include "tcp_timer.h" |
| #include "tcp_var.h" |
| #include "tcpip.h" |
| #include "udp.h" |
| #include "icmp_var.h" |
| #include "mbuf.h" |
| #include "sbuf.h" |
| #include "socket.h" |
| #include "if.h" |
| #include "main.h" |
| #include "misc.h" |
| #include "ctl.h" |
| #ifdef USE_PPP |
| #include "ppp/pppd.h" |
| #include "ppp/ppp.h" |
| #endif |
| |
| #include "bootp.h" |
| #include "tftp.h" |
| #include "libslirp.h" |
| |
| extern struct ttys *ttys_unit[MAX_INTERFACES]; |
| |
| #ifndef NULL |
| #define NULL (void *)0 |
| #endif |
| |
| #ifndef FULL_BOLT |
| void if_start _P((void)); |
| #else |
| void if_start _P((struct ttys *)); |
| #endif |
| |
| #ifdef BAD_SPRINTF |
| #define vsprintf vsprintf_len |
| #define sprintf sprintf_len |
| extern int vsprintf_len _P((char *, const char *, va_list)); |
| extern int sprintf_len _P((char *, const char *, ...)); |
| #endif |
| |
| #ifdef DECLARE_SPRINTF |
| #ifndef BAD_SPRINTF |
| extern int vsprintf _P((char *, const char *, va_list)); |
| #endif |
| extern int vfprintf _P((FILE *, const char *, va_list)); |
| #endif |
| |
| #ifndef HAVE_STRERROR |
| extern char *strerror _P((int error)); |
| #endif |
| |
| #ifndef HAVE_INDEX |
| char *index _P((const char *, int)); |
| #endif |
| |
| #ifndef HAVE_GETHOSTID |
| long gethostid _P((void)); |
| #endif |
| |
| void lprint _P((const char *, ...)); |
| |
| #ifndef _WIN32 |
| #include <netdb.h> |
| #endif |
| |
| #define DEFAULT_BAUD 115200 |
| |
| #define SO_OPTIONS DO_KEEPALIVE |
| #define TCP_MAXIDLE (TCPTV_KEEPCNT * TCPTV_KEEPINTVL) |
| |
| /* cksum.c */ |
| int cksum(struct mbuf *m, int len); |
| |
| /* if.c */ |
| void if_init _P((void)); |
| void if_output _P((struct socket *, struct mbuf *)); |
| |
| /* ip_input.c */ |
| void ip_init _P((void)); |
| void ip_input _P((struct mbuf *)); |
| void ip_slowtimo _P((void)); |
| void ip_stripoptions _P((register struct mbuf *, struct mbuf *)); |
| |
| /* ip_output.c */ |
| int ip_output _P((struct socket *, struct mbuf *)); |
| |
| /* tcp_input.c */ |
| void tcp_input _P((register struct mbuf *, int, struct socket *)); |
| int tcp_mss _P((register struct tcpcb *, u_int)); |
| |
| /* tcp_output.c */ |
| int tcp_output _P((register struct tcpcb *)); |
| void tcp_setpersist _P((register struct tcpcb *)); |
| |
| /* tcp_subr.c */ |
| void tcp_init _P((void)); |
| void tcp_template _P((struct tcpcb *)); |
| void tcp_respond _P((struct tcpcb *, register struct tcpiphdr *, |
| register struct mbuf *, tcp_seq, tcp_seq, int)); |
| struct tcpcb *tcp_newtcpcb _P((struct socket *)); |
| struct tcpcb *tcp_close _P((register struct tcpcb *)); |
| void tcp_sockclosed _P((struct tcpcb *)); |
| int tcp_fconnect _P((struct socket *)); |
| void tcp_connect _P((struct socket *)); |
| int tcp_attach _P((struct socket *)); |
| u_int8_t tcp_tos _P((struct socket *)); |
| int tcp_emu _P((struct socket *, struct mbuf *)); |
| int tcp_ctl _P((struct socket *)); |
| struct tcpcb *tcp_drop(struct tcpcb *tp, int err); |
| |
| #ifdef USE_PPP |
| #define MIN_MRU MINMRU |
| #define MAX_MRU MAXMRU |
| #else |
| #define MIN_MRU 128 |
| #define MAX_MRU 16384 |
| #endif |
| |
| #ifndef _WIN32 |
| #define min(x, y) ((x) < (y) ? (x) : (y)) |
| #define max(x, y) ((x) > (y) ? (x) : (y)) |
| #endif |
| |
| #ifdef _WIN32 |
| #undef errno |
| #define errno (WSAGetLastError()) |
| #endif |
| |
| #endif |