]>
Commit | Line | Data |
---|---|---|
1 | #ifndef __COMMON_H__ | |
2 | #define __COMMON_H__ | |
3 | ||
4 | #include "config-host.h" | |
5 | #include "slirp_config.h" | |
6 | ||
7 | #ifdef _WIN32 | |
8 | # include <inttypes.h> | |
9 | ||
10 | typedef char *caddr_t; | |
11 | ||
12 | # include <windows.h> | |
13 | # include <winsock2.h> | |
14 | # include <ws2tcpip.h> | |
15 | # include <sys/timeb.h> | |
16 | # include <iphlpapi.h> | |
17 | ||
18 | #else | |
19 | # define ioctlsocket ioctl | |
20 | # define closesocket(s) close(s) | |
21 | # if !defined(__HAIKU__) | |
22 | # define O_BINARY 0 | |
23 | # endif | |
24 | #endif | |
25 | ||
26 | #include <sys/types.h> | |
27 | #ifdef HAVE_SYS_BITYPES_H | |
28 | # include <sys/bitypes.h> | |
29 | #endif | |
30 | ||
31 | #include <sys/time.h> | |
32 | ||
33 | #ifdef HAVE_UNISTD_H | |
34 | # include <unistd.h> | |
35 | #endif | |
36 | ||
37 | #ifdef HAVE_STDLIB_H | |
38 | # include <stdlib.h> | |
39 | #endif | |
40 | ||
41 | #include <stdio.h> | |
42 | #include <errno.h> | |
43 | ||
44 | #ifndef HAVE_MEMMOVE | |
45 | #define memmove(x, y, z) bcopy(y, x, z) | |
46 | #endif | |
47 | ||
48 | #if TIME_WITH_SYS_TIME | |
49 | # include <sys/time.h> | |
50 | # include <time.h> | |
51 | #else | |
52 | # ifdef HAVE_SYS_TIME_H | |
53 | # include <sys/time.h> | |
54 | # else | |
55 | # include <time.h> | |
56 | # endif | |
57 | #endif | |
58 | ||
59 | #ifdef HAVE_STRING_H | |
60 | # include <string.h> | |
61 | #else | |
62 | # include <strings.h> | |
63 | #endif | |
64 | ||
65 | #ifndef _WIN32 | |
66 | #include <sys/uio.h> | |
67 | #endif | |
68 | ||
69 | #ifndef _WIN32 | |
70 | #include <netinet/in.h> | |
71 | #include <arpa/inet.h> | |
72 | #endif | |
73 | ||
74 | /* Systems lacking strdup() definition in <string.h>. */ | |
75 | #if defined(ultrix) | |
76 | char *strdup(const char *); | |
77 | #endif | |
78 | ||
79 | /* Systems lacking malloc() definition in <stdlib.h>. */ | |
80 | #if defined(ultrix) || defined(hcx) | |
81 | void *malloc(size_t arg); | |
82 | void free(void *ptr); | |
83 | #endif | |
84 | ||
85 | #include <fcntl.h> | |
86 | #ifndef NO_UNIX_SOCKETS | |
87 | #include <sys/un.h> | |
88 | #endif | |
89 | #include <signal.h> | |
90 | #ifdef HAVE_SYS_SIGNAL_H | |
91 | # include <sys/signal.h> | |
92 | #endif | |
93 | #ifndef _WIN32 | |
94 | #include <sys/socket.h> | |
95 | #endif | |
96 | ||
97 | #if defined(HAVE_SYS_IOCTL_H) | |
98 | # include <sys/ioctl.h> | |
99 | #endif | |
100 | ||
101 | #ifdef HAVE_SYS_SELECT_H | |
102 | # include <sys/select.h> | |
103 | #endif | |
104 | ||
105 | #ifdef HAVE_SYS_WAIT_H | |
106 | # include <sys/wait.h> | |
107 | #endif | |
108 | ||
109 | #ifdef HAVE_SYS_FILIO_H | |
110 | # include <sys/filio.h> | |
111 | #endif | |
112 | ||
113 | #ifdef USE_PPP | |
114 | #include <ppp/slirppp.h> | |
115 | #endif | |
116 | ||
117 | #ifdef __STDC__ | |
118 | #include <stdarg.h> | |
119 | #else | |
120 | #include <varargs.h> | |
121 | #endif | |
122 | ||
123 | #include <sys/stat.h> | |
124 | ||
125 | /* Avoid conflicting with the libc insque() and remque(), which | |
126 | have different prototypes. */ | |
127 | #define insque slirp_insque | |
128 | #define remque slirp_remque | |
129 | ||
130 | #ifdef HAVE_SYS_STROPTS_H | |
131 | #include <sys/stropts.h> | |
132 | #endif | |
133 | ||
134 | #include "debug.h" | |
135 | ||
136 | #include "qemu/queue.h" | |
137 | #include "qemu/sockets.h" | |
138 | ||
139 | #include "libslirp.h" | |
140 | #include "ip.h" | |
141 | #include "tcp.h" | |
142 | #include "tcp_timer.h" | |
143 | #include "tcp_var.h" | |
144 | #include "tcpip.h" | |
145 | #include "udp.h" | |
146 | #include "ip_icmp.h" | |
147 | #include "mbuf.h" | |
148 | #include "sbuf.h" | |
149 | #include "socket.h" | |
150 | #include "if.h" | |
151 | #include "main.h" | |
152 | #include "misc.h" | |
153 | #ifdef USE_PPP | |
154 | #include "ppp/pppd.h" | |
155 | #include "ppp/ppp.h" | |
156 | #endif | |
157 | ||
158 | #include "bootp.h" | |
159 | #include "tftp.h" | |
160 | ||
161 | #define ETH_ALEN 6 | |
162 | #define ETH_HLEN 14 | |
163 | ||
164 | #define ETH_P_IP 0x0800 /* Internet Protocol packet */ | |
165 | #define ETH_P_ARP 0x0806 /* Address Resolution packet */ | |
166 | ||
167 | #define ARPOP_REQUEST 1 /* ARP request */ | |
168 | #define ARPOP_REPLY 2 /* ARP reply */ | |
169 | ||
170 | struct ethhdr { | |
171 | unsigned char h_dest[ETH_ALEN]; /* destination eth addr */ | |
172 | unsigned char h_source[ETH_ALEN]; /* source ether addr */ | |
173 | unsigned short h_proto; /* packet type ID field */ | |
174 | }; | |
175 | ||
176 | struct arphdr { | |
177 | unsigned short ar_hrd; /* format of hardware address */ | |
178 | unsigned short ar_pro; /* format of protocol address */ | |
179 | unsigned char ar_hln; /* length of hardware address */ | |
180 | unsigned char ar_pln; /* length of protocol address */ | |
181 | unsigned short ar_op; /* ARP opcode (command) */ | |
182 | ||
183 | /* | |
184 | * Ethernet looks like this : This bit is variable sized however... | |
185 | */ | |
186 | unsigned char ar_sha[ETH_ALEN]; /* sender hardware address */ | |
187 | uint32_t ar_sip; /* sender IP address */ | |
188 | unsigned char ar_tha[ETH_ALEN]; /* target hardware address */ | |
189 | uint32_t ar_tip; /* target IP address */ | |
190 | } QEMU_PACKED; | |
191 | ||
192 | #define ARP_TABLE_SIZE 16 | |
193 | ||
194 | typedef struct ArpTable { | |
195 | struct arphdr table[ARP_TABLE_SIZE]; | |
196 | int next_victim; | |
197 | } ArpTable; | |
198 | ||
199 | void arp_table_add(Slirp *slirp, uint32_t ip_addr, uint8_t ethaddr[ETH_ALEN]); | |
200 | ||
201 | bool arp_table_search(Slirp *slirp, uint32_t ip_addr, | |
202 | uint8_t out_ethaddr[ETH_ALEN]); | |
203 | ||
204 | struct Slirp { | |
205 | QTAILQ_ENTRY(Slirp) entry; | |
206 | u_int time_fasttimo; | |
207 | u_int last_slowtimo; | |
208 | bool do_slowtimo; | |
209 | ||
210 | /* virtual network configuration */ | |
211 | struct in_addr vnetwork_addr; | |
212 | struct in_addr vnetwork_mask; | |
213 | struct in_addr vhost_addr; | |
214 | struct in_addr vdhcp_startaddr; | |
215 | struct in_addr vnameserver_addr; | |
216 | ||
217 | struct in_addr client_ipaddr; | |
218 | char client_hostname[33]; | |
219 | ||
220 | int restricted; | |
221 | struct ex_list *exec_list; | |
222 | ||
223 | /* mbuf states */ | |
224 | struct mbuf m_freelist, m_usedlist; | |
225 | int mbuf_alloced; | |
226 | ||
227 | /* if states */ | |
228 | struct mbuf if_fastq; /* fast queue (for interactive data) */ | |
229 | struct mbuf if_batchq; /* queue for non-interactive data */ | |
230 | struct mbuf *next_m; /* pointer to next mbuf to output */ | |
231 | bool if_start_busy; /* avoid if_start recursion */ | |
232 | ||
233 | /* ip states */ | |
234 | struct ipq ipq; /* ip reass. queue */ | |
235 | uint16_t ip_id; /* ip packet ctr, for ids */ | |
236 | ||
237 | /* bootp/dhcp states */ | |
238 | BOOTPClient bootp_clients[NB_BOOTP_CLIENTS]; | |
239 | char *bootp_filename; | |
240 | size_t vdnssearch_len; | |
241 | uint8_t *vdnssearch; | |
242 | ||
243 | /* tcp states */ | |
244 | struct socket tcb; | |
245 | struct socket *tcp_last_so; | |
246 | tcp_seq tcp_iss; /* tcp initial send seq # */ | |
247 | uint32_t tcp_now; /* for RFC 1323 timestamps */ | |
248 | ||
249 | /* udp states */ | |
250 | struct socket udb; | |
251 | struct socket *udp_last_so; | |
252 | ||
253 | /* icmp states */ | |
254 | struct socket icmp; | |
255 | struct socket *icmp_last_so; | |
256 | ||
257 | /* tftp states */ | |
258 | char *tftp_prefix; | |
259 | struct tftp_session tftp_sessions[TFTP_SESSIONS_MAX]; | |
260 | ||
261 | ArpTable arp_table; | |
262 | ||
263 | void *opaque; | |
264 | }; | |
265 | ||
266 | extern Slirp *slirp_instance; | |
267 | ||
268 | #ifndef NULL | |
269 | #define NULL (void *)0 | |
270 | #endif | |
271 | ||
272 | #ifndef FULL_BOLT | |
273 | void if_start(Slirp *); | |
274 | #else | |
275 | void if_start(struct ttys *); | |
276 | #endif | |
277 | ||
278 | #ifndef HAVE_STRERROR | |
279 | char *strerror(int error); | |
280 | #endif | |
281 | ||
282 | #ifndef HAVE_INDEX | |
283 | char *index(const char *, int); | |
284 | #endif | |
285 | ||
286 | #ifndef HAVE_GETHOSTID | |
287 | long gethostid(void); | |
288 | #endif | |
289 | ||
290 | void lprint(const char *, ...) GCC_FMT_ATTR(1, 2); | |
291 | ||
292 | #ifndef _WIN32 | |
293 | #include <netdb.h> | |
294 | #endif | |
295 | ||
296 | #define DEFAULT_BAUD 115200 | |
297 | ||
298 | #define SO_OPTIONS DO_KEEPALIVE | |
299 | #define TCP_MAXIDLE (TCPTV_KEEPCNT * TCPTV_KEEPINTVL) | |
300 | ||
301 | /* dnssearch.c */ | |
302 | int translate_dnssearch(Slirp *s, const char ** names); | |
303 | ||
304 | /* cksum.c */ | |
305 | int cksum(struct mbuf *m, int len); | |
306 | ||
307 | /* if.c */ | |
308 | void if_init(Slirp *); | |
309 | void if_output(struct socket *, struct mbuf *); | |
310 | ||
311 | /* ip_input.c */ | |
312 | void ip_init(Slirp *); | |
313 | void ip_cleanup(Slirp *); | |
314 | void ip_input(struct mbuf *); | |
315 | void ip_slowtimo(Slirp *); | |
316 | void ip_stripoptions(register struct mbuf *, struct mbuf *); | |
317 | ||
318 | /* ip_output.c */ | |
319 | int ip_output(struct socket *, struct mbuf *); | |
320 | ||
321 | /* tcp_input.c */ | |
322 | void tcp_input(register struct mbuf *, int, struct socket *); | |
323 | int tcp_mss(register struct tcpcb *, u_int); | |
324 | ||
325 | /* tcp_output.c */ | |
326 | int tcp_output(register struct tcpcb *); | |
327 | void tcp_setpersist(register struct tcpcb *); | |
328 | ||
329 | /* tcp_subr.c */ | |
330 | void tcp_init(Slirp *); | |
331 | void tcp_cleanup(Slirp *); | |
332 | void tcp_template(struct tcpcb *); | |
333 | void tcp_respond(struct tcpcb *, register struct tcpiphdr *, register struct mbuf *, tcp_seq, tcp_seq, int); | |
334 | struct tcpcb * tcp_newtcpcb(struct socket *); | |
335 | struct tcpcb * tcp_close(register struct tcpcb *); | |
336 | void tcp_sockclosed(struct tcpcb *); | |
337 | int tcp_fconnect(struct socket *); | |
338 | void tcp_connect(struct socket *); | |
339 | int tcp_attach(struct socket *); | |
340 | uint8_t tcp_tos(struct socket *); | |
341 | int tcp_emu(struct socket *, struct mbuf *); | |
342 | int tcp_ctl(struct socket *); | |
343 | struct tcpcb *tcp_drop(struct tcpcb *tp, int err); | |
344 | ||
345 | #ifdef USE_PPP | |
346 | #define MIN_MRU MINMRU | |
347 | #define MAX_MRU MAXMRU | |
348 | #else | |
349 | #define MIN_MRU 128 | |
350 | #define MAX_MRU 16384 | |
351 | #endif | |
352 | ||
353 | #ifndef _WIN32 | |
354 | #define min(x,y) ((x) < (y) ? (x) : (y)) | |
355 | #define max(x,y) ((x) > (y) ? (x) : (y)) | |
356 | #endif | |
357 | ||
358 | #ifdef _WIN32 | |
359 | #undef errno | |
360 | #define errno (WSAGetLastError()) | |
361 | #endif | |
362 | ||
363 | #endif |