|
|
1.1 root 1: #ifndef __COMMON_H__
2: #define __COMMON_H__
3:
1.1.1.2 root 4: #include "config-host.h"
1.1 root 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>
1.1.1.3 root 14: # include <ws2tcpip.h>
1.1 root 15: # include <sys/timeb.h>
16: # include <iphlpapi.h>
17:
18: #else
19: # define ioctlsocket ioctl
20: # define closesocket(s) close(s)
1.1.1.7 root 21: # if !defined(__HAIKU__)
22: # define O_BINARY 0
23: # endif
1.1 root 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
1.1.1.3 root 52: # ifdef HAVE_SYS_TIME_H
1.1 root 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)
1.1.1.4 root 76: char *strdup(const char *);
1.1 root 77: #endif
78:
79: /* Systems lacking malloc() definition in <stdlib.h>. */
80: #if defined(ultrix) || defined(hcx)
1.1.1.4 root 81: void *malloc(size_t arg);
82: void free(void *ptr);
1.1 root 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:
1.1.1.5 root 136: #include "qemu-queue.h"
1.1.1.10! root 137: #include "qemu_socket.h"
1.1.1.4 root 138:
139: #include "libslirp.h"
1.1 root 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"
1.1.1.8 root 146: #include "ip_icmp.h"
1.1 root 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:
1.1.1.9 root 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]);
1.1.1.5 root 203:
1.1.1.4 root 204: struct Slirp {
1.1.1.5 root 205: QTAILQ_ENTRY(Slirp) entry;
1.1.1.4 root 206:
207: /* virtual network configuration */
208: struct in_addr vnetwork_addr;
209: struct in_addr vnetwork_mask;
210: struct in_addr vhost_addr;
211: struct in_addr vdhcp_startaddr;
212: struct in_addr vnameserver_addr;
213:
214: struct in_addr client_ipaddr;
215: char client_hostname[33];
216:
217: int restricted;
218: struct timeval tt;
219: struct ex_list *exec_list;
220:
221: /* mbuf states */
222: struct mbuf m_freelist, m_usedlist;
223: int mbuf_alloced;
224:
225: /* if states */
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 */
1.1.1.10! root 229: bool if_start_busy; /* avoid if_start recursion */
1.1.1.4 root 230:
231: /* ip states */
232: struct ipq ipq; /* ip reass. queue */
1.1.1.6 root 233: uint16_t ip_id; /* ip packet ctr, for ids */
1.1.1.4 root 234:
235: /* bootp/dhcp states */
236: BOOTPClient bootp_clients[NB_BOOTP_CLIENTS];
237: char *bootp_filename;
238:
239: /* tcp states */
240: struct socket tcb;
241: struct socket *tcp_last_so;
242: tcp_seq tcp_iss; /* tcp initial send seq # */
1.1.1.6 root 243: uint32_t tcp_now; /* for RFC 1323 timestamps */
1.1.1.4 root 244:
245: /* udp states */
246: struct socket udb;
247: struct socket *udp_last_so;
248:
1.1.1.8 root 249: /* icmp states */
250: struct socket icmp;
251: struct socket *icmp_last_so;
252:
1.1.1.4 root 253: /* tftp states */
254: char *tftp_prefix;
255: struct tftp_session tftp_sessions[TFTP_SESSIONS_MAX];
256:
1.1.1.9 root 257: ArpTable arp_table;
258:
1.1.1.4 root 259: void *opaque;
260: };
261:
262: extern Slirp *slirp_instance;
1.1 root 263:
264: #ifndef NULL
265: #define NULL (void *)0
266: #endif
267:
268: #ifndef FULL_BOLT
1.1.1.4 root 269: void if_start(Slirp *);
1.1 root 270: #else
1.1.1.4 root 271: void if_start(struct ttys *);
1.1 root 272: #endif
273:
274: #ifndef HAVE_STRERROR
1.1.1.7 root 275: char *strerror(int error);
1.1 root 276: #endif
277:
278: #ifndef HAVE_INDEX
1.1.1.4 root 279: char *index(const char *, int);
1.1 root 280: #endif
281:
282: #ifndef HAVE_GETHOSTID
1.1.1.4 root 283: long gethostid(void);
1.1 root 284: #endif
285:
1.1.1.7 root 286: void lprint(const char *, ...) GCC_FMT_ATTR(1, 2);
1.1 root 287:
288: #ifndef _WIN32
289: #include <netdb.h>
290: #endif
291:
292: #define DEFAULT_BAUD 115200
293:
1.1.1.2 root 294: #define SO_OPTIONS DO_KEEPALIVE
295: #define TCP_MAXIDLE (TCPTV_KEEPCNT * TCPTV_KEEPINTVL)
296:
1.1 root 297: /* cksum.c */
298: int cksum(struct mbuf *m, int len);
299:
300: /* if.c */
1.1.1.4 root 301: void if_init(Slirp *);
302: void if_output(struct socket *, struct mbuf *);
1.1 root 303:
304: /* ip_input.c */
1.1.1.4 root 305: void ip_init(Slirp *);
1.1.1.10! root 306: void ip_cleanup(Slirp *);
1.1.1.4 root 307: void ip_input(struct mbuf *);
308: void ip_slowtimo(Slirp *);
309: void ip_stripoptions(register struct mbuf *, struct mbuf *);
1.1 root 310:
311: /* ip_output.c */
1.1.1.4 root 312: int ip_output(struct socket *, struct mbuf *);
1.1 root 313:
314: /* tcp_input.c */
1.1.1.4 root 315: void tcp_input(register struct mbuf *, int, struct socket *);
316: int tcp_mss(register struct tcpcb *, u_int);
1.1 root 317:
318: /* tcp_output.c */
1.1.1.4 root 319: int tcp_output(register struct tcpcb *);
320: void tcp_setpersist(register struct tcpcb *);
1.1 root 321:
322: /* tcp_subr.c */
1.1.1.4 root 323: void tcp_init(Slirp *);
1.1.1.10! root 324: void tcp_cleanup(Slirp *);
1.1.1.4 root 325: void tcp_template(struct tcpcb *);
326: void tcp_respond(struct tcpcb *, register struct tcpiphdr *, register struct mbuf *, tcp_seq, tcp_seq, int);
327: struct tcpcb * tcp_newtcpcb(struct socket *);
328: struct tcpcb * tcp_close(register struct tcpcb *);
329: void tcp_sockclosed(struct tcpcb *);
330: int tcp_fconnect(struct socket *);
331: void tcp_connect(struct socket *);
332: int tcp_attach(struct socket *);
1.1.1.6 root 333: uint8_t tcp_tos(struct socket *);
1.1.1.4 root 334: int tcp_emu(struct socket *, struct mbuf *);
335: int tcp_ctl(struct socket *);
1.1 root 336: struct tcpcb *tcp_drop(struct tcpcb *tp, int err);
337:
338: #ifdef USE_PPP
339: #define MIN_MRU MINMRU
340: #define MAX_MRU MAXMRU
341: #else
342: #define MIN_MRU 128
343: #define MAX_MRU 16384
344: #endif
345:
346: #ifndef _WIN32
347: #define min(x,y) ((x) < (y) ? (x) : (y))
348: #define max(x,y) ((x) > (y) ? (x) : (y))
349: #endif
350:
351: #ifdef _WIN32
352: #undef errno
353: #define errno (WSAGetLastError())
354: #endif
355:
356: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.