]>
Commit | Line | Data |
---|---|---|
f0cbd3ec FB |
1 | #ifndef __COMMON_H__ |
2 | #define __COMMON_H__ | |
3 | ||
5fa0ab8f | 4 | #include "config-host.h" |
f0cbd3ec FB |
5 | #include "slirp_config.h" |
6 | ||
379ff53d FB |
7 | #ifdef _WIN32 |
8 | # include <inttypes.h> | |
9 | ||
10 | typedef uint8_t u_int8_t; | |
11 | typedef uint16_t u_int16_t; | |
12 | typedef uint32_t u_int32_t; | |
13 | typedef uint64_t u_int64_t; | |
14 | typedef char *caddr_t; | |
15 | ||
34444131 | 16 | # include <windows.h> |
379ff53d | 17 | # include <winsock2.h> |
116842ee | 18 | # include <ws2tcpip.h> |
379ff53d FB |
19 | # include <sys/timeb.h> |
20 | # include <iphlpapi.h> | |
21 | ||
22 | # define EWOULDBLOCK WSAEWOULDBLOCK | |
23 | # define EINPROGRESS WSAEINPROGRESS | |
24 | # define ENOTCONN WSAENOTCONN | |
25 | # define EHOSTUNREACH WSAEHOSTUNREACH | |
26 | # define ENETUNREACH WSAENETUNREACH | |
27 | # define ECONNREFUSED WSAECONNREFUSED | |
28 | #else | |
29 | # define ioctlsocket ioctl | |
30 | # define closesocket(s) close(s) | |
6d46bf8a | 31 | # define O_BINARY 0 |
379ff53d FB |
32 | #endif |
33 | ||
f0cbd3ec FB |
34 | #include <sys/types.h> |
35 | #ifdef HAVE_SYS_BITYPES_H | |
36 | # include <sys/bitypes.h> | |
37 | #endif | |
38 | ||
170c6f87 FB |
39 | #include <sys/time.h> |
40 | ||
f0cbd3ec FB |
41 | #ifdef NEED_TYPEDEFS |
42 | typedef char int8_t; | |
43 | typedef unsigned char u_int8_t; | |
44 | ||
45 | # if SIZEOF_SHORT == 2 | |
46 | typedef short int16_t; | |
47 | typedef unsigned short u_int16_t; | |
48 | # else | |
49 | # if SIZEOF_INT == 2 | |
50 | typedef int int16_t; | |
51 | typedef unsigned int u_int16_t; | |
52 | # else | |
53 | #error Cannot find a type with sizeof() == 2 | |
54 | # endif | |
55 | # endif | |
56 | ||
57 | # if SIZEOF_SHORT == 4 | |
58 | typedef short int32_t; | |
59 | typedef unsigned short u_int32_t; | |
60 | # else | |
61 | # if SIZEOF_INT == 4 | |
62 | typedef int int32_t; | |
63 | typedef unsigned int u_int32_t; | |
64 | # else | |
65 | #error Cannot find a type with sizeof() == 4 | |
66 | # endif | |
67 | # endif | |
68 | #endif /* NEED_TYPEDEFS */ | |
69 | ||
70 | #ifdef HAVE_UNISTD_H | |
71 | # include <unistd.h> | |
72 | #endif | |
73 | ||
74 | #ifdef HAVE_STDLIB_H | |
75 | # include <stdlib.h> | |
76 | #endif | |
77 | ||
78 | #include <stdio.h> | |
79 | #include <errno.h> | |
80 | ||
81 | #ifndef HAVE_MEMMOVE | |
82 | #define memmove(x, y, z) bcopy(y, x, z) | |
83 | #endif | |
84 | ||
85 | #if TIME_WITH_SYS_TIME | |
86 | # include <sys/time.h> | |
87 | # include <time.h> | |
88 | #else | |
eb38c52c | 89 | # ifdef HAVE_SYS_TIME_H |
f0cbd3ec FB |
90 | # include <sys/time.h> |
91 | # else | |
92 | # include <time.h> | |
93 | # endif | |
94 | #endif | |
95 | ||
96 | #ifdef HAVE_STRING_H | |
97 | # include <string.h> | |
98 | #else | |
99 | # include <strings.h> | |
100 | #endif | |
101 | ||
379ff53d | 102 | #ifndef _WIN32 |
f0cbd3ec | 103 | #include <sys/uio.h> |
379ff53d | 104 | #endif |
f0cbd3ec | 105 | |
379ff53d | 106 | #ifndef _WIN32 |
f0cbd3ec FB |
107 | #include <netinet/in.h> |
108 | #include <arpa/inet.h> | |
379ff53d | 109 | #endif |
f0cbd3ec | 110 | |
f0cbd3ec FB |
111 | /* Systems lacking strdup() definition in <string.h>. */ |
112 | #if defined(ultrix) | |
6cb9c6d3 | 113 | char *strdup(const char *); |
f0cbd3ec FB |
114 | #endif |
115 | ||
116 | /* Systems lacking malloc() definition in <stdlib.h>. */ | |
117 | #if defined(ultrix) || defined(hcx) | |
6cb9c6d3 BS |
118 | void *malloc(size_t arg); |
119 | void free(void *ptr); | |
f0cbd3ec FB |
120 | #endif |
121 | ||
122 | #ifndef HAVE_INET_ATON | |
6cb9c6d3 | 123 | int inet_aton(const char *cp, struct in_addr *ia); |
f0cbd3ec FB |
124 | #endif |
125 | ||
126 | #include <fcntl.h> | |
127 | #ifndef NO_UNIX_SOCKETS | |
128 | #include <sys/un.h> | |
129 | #endif | |
130 | #include <signal.h> | |
131 | #ifdef HAVE_SYS_SIGNAL_H | |
132 | # include <sys/signal.h> | |
133 | #endif | |
379ff53d | 134 | #ifndef _WIN32 |
f0cbd3ec | 135 | #include <sys/socket.h> |
379ff53d | 136 | #endif |
f0cbd3ec | 137 | |
ee2654ac | 138 | #if defined(HAVE_SYS_IOCTL_H) |
f0cbd3ec | 139 | # include <sys/ioctl.h> |
f0cbd3ec FB |
140 | #endif |
141 | ||
f0cbd3ec FB |
142 | #ifdef HAVE_SYS_SELECT_H |
143 | # include <sys/select.h> | |
144 | #endif | |
145 | ||
146 | #ifdef HAVE_SYS_WAIT_H | |
147 | # include <sys/wait.h> | |
148 | #endif | |
149 | ||
150 | #ifdef HAVE_SYS_FILIO_H | |
151 | # include <sys/filio.h> | |
152 | #endif | |
153 | ||
154 | #ifdef USE_PPP | |
155 | #include <ppp/slirppp.h> | |
156 | #endif | |
157 | ||
158 | #ifdef __STDC__ | |
159 | #include <stdarg.h> | |
160 | #else | |
161 | #include <varargs.h> | |
162 | #endif | |
163 | ||
164 | #include <sys/stat.h> | |
165 | ||
166 | /* Avoid conflicting with the libc insque() and remque(), which | |
167 | have different prototypes. */ | |
168 | #define insque slirp_insque | |
169 | #define remque slirp_remque | |
170 | ||
171 | #ifdef HAVE_SYS_STROPTS_H | |
172 | #include <sys/stropts.h> | |
173 | #endif | |
174 | ||
175 | #include "debug.h" | |
176 | ||
b1c99fcd JK |
177 | #include "sys-queue.h" |
178 | ||
460fec67 | 179 | #include "libslirp.h" |
f0cbd3ec FB |
180 | #include "ip.h" |
181 | #include "tcp.h" | |
182 | #include "tcp_timer.h" | |
183 | #include "tcp_var.h" | |
184 | #include "tcpip.h" | |
185 | #include "udp.h" | |
f0cbd3ec FB |
186 | #include "mbuf.h" |
187 | #include "sbuf.h" | |
188 | #include "socket.h" | |
189 | #include "if.h" | |
190 | #include "main.h" | |
191 | #include "misc.h" | |
f0cbd3ec FB |
192 | #ifdef USE_PPP |
193 | #include "ppp/pppd.h" | |
194 | #include "ppp/ppp.h" | |
195 | #endif | |
196 | ||
197 | #include "bootp.h" | |
c7f74643 | 198 | #include "tftp.h" |
460fec67 JK |
199 | |
200 | struct Slirp { | |
b1c99fcd JK |
201 | TAILQ_ENTRY(Slirp) entry; |
202 | ||
460fec67 JK |
203 | /* virtual network configuration */ |
204 | struct in_addr vnetwork_addr; | |
205 | struct in_addr vnetwork_mask; | |
206 | struct in_addr vhost_addr; | |
207 | struct in_addr vdhcp_startaddr; | |
208 | struct in_addr vnameserver_addr; | |
209 | ||
210 | /* ARP cache for the guest IP addresses (XXX: allow many entries) */ | |
211 | uint8_t client_ethaddr[6]; | |
212 | ||
213 | struct in_addr client_ipaddr; | |
214 | char client_hostname[33]; | |
215 | ||
216 | int restricted; | |
217 | struct timeval tt; | |
218 | struct ex_list *exec_list; | |
219 | ||
220 | /* mbuf states */ | |
221 | struct mbuf m_freelist, m_usedlist; | |
222 | int mbuf_alloced; | |
223 | ||
224 | /* if states */ | |
225 | int if_queued; /* number of packets queued so far */ | |
226 | struct mbuf if_fastq; /* fast queue (for interactive data) */ | |
227 | struct mbuf if_batchq; /* queue for non-interactive data */ | |
228 | struct mbuf *next_m; /* pointer to next mbuf to output */ | |
229 | ||
230 | /* ip states */ | |
231 | struct ipq ipq; /* ip reass. queue */ | |
232 | u_int16_t ip_id; /* ip packet ctr, for ids */ | |
233 | ||
234 | /* bootp/dhcp states */ | |
235 | BOOTPClient bootp_clients[NB_BOOTP_CLIENTS]; | |
236 | char *bootp_filename; | |
237 | ||
238 | /* tcp states */ | |
239 | struct socket tcb; | |
240 | struct socket *tcp_last_so; | |
241 | tcp_seq tcp_iss; /* tcp initial send seq # */ | |
242 | u_int32_t tcp_now; /* for RFC 1323 timestamps */ | |
243 | ||
244 | /* udp states */ | |
245 | struct socket udb; | |
246 | struct socket *udp_last_so; | |
247 | ||
248 | /* tftp states */ | |
249 | char *tftp_prefix; | |
250 | struct tftp_session tftp_sessions[TFTP_SESSIONS_MAX]; | |
251 | ||
9f8bd042 | 252 | void *opaque; |
460fec67 JK |
253 | }; |
254 | ||
ad0d8c4c | 255 | extern Slirp *slirp_instance; |
f0cbd3ec | 256 | |
f0cbd3ec FB |
257 | #ifndef NULL |
258 | #define NULL (void *)0 | |
259 | #endif | |
260 | ||
261 | #ifndef FULL_BOLT | |
6cb9c6d3 | 262 | void if_start(Slirp *); |
f0cbd3ec | 263 | #else |
6cb9c6d3 | 264 | void if_start(struct ttys *); |
f0cbd3ec FB |
265 | #endif |
266 | ||
267 | #ifdef BAD_SPRINTF | |
268 | # define vsprintf vsprintf_len | |
269 | # define sprintf sprintf_len | |
6cb9c6d3 BS |
270 | extern int vsprintf_len(char *, const char *, va_list); |
271 | extern int sprintf_len(char *, const char *, ...); | |
f0cbd3ec FB |
272 | #endif |
273 | ||
274 | #ifdef DECLARE_SPRINTF | |
275 | # ifndef BAD_SPRINTF | |
6cb9c6d3 | 276 | extern int vsprintf(char *, const char *, va_list); |
f0cbd3ec | 277 | # endif |
6cb9c6d3 | 278 | extern int vfprintf(FILE *, const char *, va_list); |
f0cbd3ec FB |
279 | #endif |
280 | ||
281 | #ifndef HAVE_STRERROR | |
6cb9c6d3 | 282 | extern char *strerror(int error); |
f0cbd3ec FB |
283 | #endif |
284 | ||
285 | #ifndef HAVE_INDEX | |
6cb9c6d3 | 286 | char *index(const char *, int); |
f0cbd3ec FB |
287 | #endif |
288 | ||
289 | #ifndef HAVE_GETHOSTID | |
6cb9c6d3 | 290 | long gethostid(void); |
f0cbd3ec FB |
291 | #endif |
292 | ||
6cb9c6d3 | 293 | void lprint(const char *, ...); |
f0cbd3ec | 294 | |
379ff53d | 295 | #ifndef _WIN32 |
f0cbd3ec | 296 | #include <netdb.h> |
379ff53d | 297 | #endif |
f0cbd3ec FB |
298 | |
299 | #define DEFAULT_BAUD 115200 | |
300 | ||
9634d903 BS |
301 | #define SO_OPTIONS DO_KEEPALIVE |
302 | #define TCP_MAXIDLE (TCPTV_KEEPCNT * TCPTV_KEEPINTVL) | |
303 | ||
f0cbd3ec FB |
304 | /* cksum.c */ |
305 | int cksum(struct mbuf *m, int len); | |
306 | ||
307 | /* if.c */ | |
6cb9c6d3 BS |
308 | void if_init(Slirp *); |
309 | void if_output(struct socket *, struct mbuf *); | |
f0cbd3ec FB |
310 | |
311 | /* ip_input.c */ | |
6cb9c6d3 BS |
312 | void ip_init(Slirp *); |
313 | void ip_input(struct mbuf *); | |
314 | void ip_slowtimo(Slirp *); | |
315 | void ip_stripoptions(register struct mbuf *, struct mbuf *); | |
f0cbd3ec FB |
316 | |
317 | /* ip_output.c */ | |
6cb9c6d3 | 318 | int ip_output(struct socket *, struct mbuf *); |
f0cbd3ec FB |
319 | |
320 | /* tcp_input.c */ | |
6cb9c6d3 BS |
321 | void tcp_input(register struct mbuf *, int, struct socket *); |
322 | int tcp_mss(register struct tcpcb *, u_int); | |
f0cbd3ec FB |
323 | |
324 | /* tcp_output.c */ | |
6cb9c6d3 BS |
325 | int tcp_output(register struct tcpcb *); |
326 | void tcp_setpersist(register struct tcpcb *); | |
f0cbd3ec FB |
327 | |
328 | /* tcp_subr.c */ | |
6cb9c6d3 BS |
329 | void tcp_init(Slirp *); |
330 | void tcp_template(struct tcpcb *); | |
331 | void tcp_respond(struct tcpcb *, register struct tcpiphdr *, register struct mbuf *, tcp_seq, tcp_seq, int); | |
332 | struct tcpcb * tcp_newtcpcb(struct socket *); | |
333 | struct tcpcb * tcp_close(register struct tcpcb *); | |
334 | void tcp_sockclosed(struct tcpcb *); | |
335 | int tcp_fconnect(struct socket *); | |
336 | void tcp_connect(struct socket *); | |
337 | int tcp_attach(struct socket *); | |
338 | u_int8_t tcp_tos(struct socket *); | |
339 | int tcp_emu(struct socket *, struct mbuf *); | |
340 | int tcp_ctl(struct socket *); | |
9fafc9ea | 341 | struct tcpcb *tcp_drop(struct tcpcb *tp, int err); |
f0cbd3ec FB |
342 | |
343 | #ifdef USE_PPP | |
344 | #define MIN_MRU MINMRU | |
345 | #define MAX_MRU MAXMRU | |
346 | #else | |
347 | #define MIN_MRU 128 | |
348 | #define MAX_MRU 16384 | |
349 | #endif | |
350 | ||
379ff53d FB |
351 | #ifndef _WIN32 |
352 | #define min(x,y) ((x) < (y) ? (x) : (y)) | |
353 | #define max(x,y) ((x) > (y) ? (x) : (y)) | |
354 | #endif | |
355 | ||
02d2c54c | 356 | #ifdef _WIN32 |
ef6ff6b7 | 357 | #undef errno |
02d2c54c FB |
358 | #define errno (WSAGetLastError()) |
359 | #endif | |
360 | ||
f0cbd3ec | 361 | #endif |