1#ifndef __COMMON_H__ 2#define __COMMON_H__ 3 4#define CONFIG_QEMU 5 6//#define DEBUG 1 7 8// Uncomment the following line to enable SLIRP statistics printing in Qemu 9//#define LOG_ENABLED 10 11#ifdef LOG_ENABLED 12#define STAT(expr) expr 13#else 14#define STAT(expr) do { } while(0) 15#endif 16 17#ifndef CONFIG_QEMU 18#include "version.h" 19#endif 20#include "config-host.h" 21#include "slirp_config.h" 22 23#ifdef _WIN32 24# include <inttypes.h> 25 26typedef uint8_t u_int8_t; 27typedef uint16_t u_int16_t; 28typedef uint32_t u_int32_t; 29typedef uint64_t u_int64_t; 30typedef char *caddr_t; 31 32# include <windows.h> 33# include <winsock2.h> 34# include <ws2tcpip.h> 35# include <sys/timeb.h> 36# include <iphlpapi.h> 37 38# define EWOULDBLOCK WSAEWOULDBLOCK 39# define EINPROGRESS WSAEINPROGRESS 40# define ENOTCONN WSAENOTCONN 41# define EHOSTUNREACH WSAEHOSTUNREACH 42# define ENETUNREACH WSAENETUNREACH 43# define ECONNREFUSED WSAECONNREFUSED 44#else 45# define ioctlsocket ioctl 46# define closesocket(s) close(s) 47# define O_BINARY 0 48#endif 49 50#include <sys/types.h> 51#ifdef HAVE_SYS_BITYPES_H 52# include <sys/bitypes.h> 53#endif 54 55#include <sys/time.h> 56 57#ifdef NEED_TYPEDEFS 58typedef char int8_t; 59typedef unsigned char u_int8_t; 60 61# if SIZEOF_SHORT == 2 62 typedef short int16_t; 63 typedef unsigned short u_int16_t; 64# else 65# if SIZEOF_INT == 2 66 typedef int int16_t; 67 typedef unsigned int u_int16_t; 68# else 69 #error Cannot find a type with sizeof() == 2 70# endif 71# endif 72 73# if SIZEOF_SHORT == 4 74 typedef short int32_t; 75 typedef unsigned short u_int32_t; 76# else 77# if SIZEOF_INT == 4 78 typedef int int32_t; 79 typedef unsigned int u_int32_t; 80# else 81 #error Cannot find a type with sizeof() == 4 82# endif 83# endif 84#endif /* NEED_TYPEDEFS */ 85 86#ifdef HAVE_UNISTD_H 87# include <unistd.h> 88#endif 89 90#ifdef HAVE_STDLIB_H 91# include <stdlib.h> 92#endif 93 94#include <stdio.h> 95#include <errno.h> 96 97#ifndef HAVE_MEMMOVE 98#define memmove(x, y, z) bcopy(y, x, z) 99#endif 100 101#if TIME_WITH_SYS_TIME 102# include <sys/time.h> 103# include <time.h> 104#else 105# ifdef HAVE_SYS_TIME_H 106# include <sys/time.h> 107# else 108# include <time.h> 109# endif 110#endif 111 112#ifdef HAVE_STRING_H 113# include <string.h> 114#else 115# include <strings.h> 116#endif 117 118#ifndef _WIN32 119#include <sys/uio.h> 120#endif 121 122#undef _P 123#ifndef NO_PROTOTYPES 124# define _P(x) x 125#else 126# define _P(x) () 127#endif 128 129#ifndef _WIN32 130#include <netinet/in.h> 131#include <arpa/inet.h> 132#endif 133 134#ifdef GETTIMEOFDAY_ONE_ARG 135#define gettimeofday(x, y) gettimeofday(x) 136#endif 137 138/* Systems lacking strdup() definition in <string.h>. */ 139#if defined(ultrix) 140char *strdup _P((const char *)); 141#endif 142 143/* Systems lacking malloc() definition in <stdlib.h>. */ 144#if defined(ultrix) || defined(hcx) 145void *malloc _P((size_t arg)); 146void free _P((void *ptr)); 147#endif 148 149#ifndef HAVE_INET_ATON 150int inet_aton _P((const char *cp, struct in_addr *ia)); 151#endif 152 153#include <fcntl.h> 154#ifndef NO_UNIX_SOCKETS 155#include <sys/un.h> 156#endif 157#include <signal.h> 158#ifdef HAVE_SYS_SIGNAL_H 159# include <sys/signal.h> 160#endif 161#ifndef _WIN32 162#include <sys/socket.h> 163#endif 164 165#if defined(HAVE_SYS_IOCTL_H) 166# include <sys/ioctl.h> 167#endif 168 169#ifdef HAVE_SYS_SELECT_H 170# include <sys/select.h> 171#endif 172 173#ifdef HAVE_SYS_WAIT_H 174# include <sys/wait.h> 175#endif 176 177#ifdef HAVE_SYS_FILIO_H 178# include <sys/filio.h> 179#endif 180 181#ifdef USE_PPP 182#include <ppp/slirppp.h> 183#endif 184 185#ifdef __STDC__ 186#include <stdarg.h> 187#else 188#include <varargs.h> 189#endif 190 191#include <sys/stat.h> 192 193/* Avoid conflicting with the libc insque() and remque(), which 194 have different prototypes. */ 195#define insque slirp_insque 196#define remque slirp_remque 197 198#ifdef HAVE_SYS_STROPTS_H 199#include <sys/stropts.h> 200#endif 201 202#include "debug.h" 203 204#include "ip.h" 205#include "tcp.h" 206#include "tcp_timer.h" 207#include "tcp_var.h" 208#include "tcpip.h" 209#include "udp.h" 210#include "icmp_var.h" 211#include "mbuf.h" 212#include "sbuf.h" 213#include "socket.h" 214#include "if.h" 215#include "main.h" 216#include "misc.h" 217#include "ctl.h" 218#ifdef USE_PPP 219#include "ppp/pppd.h" 220#include "ppp/ppp.h" 221#endif 222 223#include "bootp.h" 224#include "tftp.h" 225#include "libslirp.h" 226 227extern struct ttys *ttys_unit[MAX_INTERFACES]; 228 229#ifndef NULL 230#define NULL (void *)0 231#endif 232 233#ifndef FULL_BOLT 234void if_start _P((void)); 235#else 236void if_start _P((struct ttys *)); 237#endif 238 239#ifdef BAD_SPRINTF 240# define vsprintf vsprintf_len 241# define sprintf sprintf_len 242 extern int vsprintf_len _P((char *, const char *, va_list)); 243 extern int sprintf_len _P((char *, const char *, ...)); 244#endif 245 246#ifdef DECLARE_SPRINTF 247# ifndef BAD_SPRINTF 248 extern int vsprintf _P((char *, const char *, va_list)); 249# endif 250 extern int vfprintf _P((FILE *, const char *, va_list)); 251#endif 252 253#ifndef HAVE_STRERROR 254 extern char *strerror _P((int error)); 255#endif 256 257#ifndef HAVE_INDEX 258 char *index _P((const char *, int)); 259#endif 260 261#ifndef HAVE_GETHOSTID 262 long gethostid _P((void)); 263#endif 264 265void lprint _P((const char *, ...)); 266 267#ifndef _WIN32 268#include <netdb.h> 269#endif 270 271#define DEFAULT_BAUD 115200 272 273#define SO_OPTIONS DO_KEEPALIVE 274#define TCP_MAXIDLE (TCPTV_KEEPCNT * TCPTV_KEEPINTVL) 275 276/* cksum.c */ 277int cksum(struct mbuf *m, int len); 278 279/* if.c */ 280void if_init _P((void)); 281void if_output _P((struct socket *, struct mbuf *)); 282 283/* ip_input.c */ 284void ip_init _P((void)); 285void ip_input _P((struct mbuf *)); 286void ip_slowtimo _P((void)); 287void ip_stripoptions _P((register struct mbuf *, struct mbuf *)); 288 289/* ip_output.c */ 290int ip_output _P((struct socket *, struct mbuf *)); 291 292/* tcp_input.c */ 293void tcp_input _P((register struct mbuf *, int, struct socket *)); 294int tcp_mss _P((register struct tcpcb *, u_int)); 295 296/* tcp_output.c */ 297int tcp_output _P((register struct tcpcb *)); 298void tcp_setpersist _P((register struct tcpcb *)); 299 300/* tcp_subr.c */ 301void tcp_init _P((void)); 302void tcp_template _P((struct tcpcb *)); 303void tcp_respond _P((struct tcpcb *, register struct tcpiphdr *, register struct mbuf *, tcp_seq, tcp_seq, int)); 304struct tcpcb * tcp_newtcpcb _P((struct socket *)); 305struct tcpcb * tcp_close _P((register struct tcpcb *)); 306void tcp_sockclosed _P((struct tcpcb *)); 307int tcp_fconnect _P((struct socket *)); 308void tcp_connect _P((struct socket *)); 309int tcp_attach _P((struct socket *)); 310u_int8_t tcp_tos _P((struct socket *)); 311int tcp_emu _P((struct socket *, struct mbuf *)); 312int tcp_ctl _P((struct socket *)); 313struct tcpcb *tcp_drop(struct tcpcb *tp, int err); 314 315#ifdef USE_PPP 316#define MIN_MRU MINMRU 317#define MAX_MRU MAXMRU 318#else 319#define MIN_MRU 128 320#define MAX_MRU 16384 321#endif 322 323#ifndef _WIN32 324#define min(x,y) ((x) < (y) ? (x) : (y)) 325#define max(x,y) ((x) > (y) ? (x) : (y)) 326#endif 327 328#ifdef _WIN32 329#undef errno 330#define errno (WSAGetLastError()) 331#endif 332 333#endif 334