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