1 | /* SPDX-License-Identifier: BSD-3-Clause */ |
2 | #ifndef SLIRP_H |
3 | #define SLIRP_H |
4 | |
5 | #ifdef _WIN32 |
6 | |
7 | /* as defined in sdkddkver.h */ |
8 | #ifndef _WIN32_WINNT |
9 | #define _WIN32_WINNT 0x0600 /* Vista */ |
10 | #endif |
11 | /* reduces the number of implicitly included headers */ |
12 | #ifndef WIN32_LEAN_AND_MEAN |
13 | #define WIN32_LEAN_AND_MEAN |
14 | #endif |
15 | |
16 | #include <winsock2.h> |
17 | #include <windows.h> |
18 | #include <ws2tcpip.h> |
19 | #include <sys/timeb.h> |
20 | #include <iphlpapi.h> |
21 | |
22 | #else |
23 | #if !defined(__HAIKU__) |
24 | #define O_BINARY 0 |
25 | #endif |
26 | #endif |
27 | |
28 | #ifndef _WIN32 |
29 | #include <sys/uio.h> |
30 | #include <netinet/in.h> |
31 | #include <arpa/inet.h> |
32 | #include <sys/socket.h> |
33 | #include <sys/ioctl.h> |
34 | #endif |
35 | |
36 | #ifdef __APPLE__ |
37 | #include <sys/filio.h> |
38 | #endif |
39 | |
40 | /* Avoid conflicting with the libc insque() and remque(), which |
41 | have different prototypes. */ |
42 | #define insque slirp_insque |
43 | #define remque slirp_remque |
44 | #define quehead slirp_quehead |
45 | |
46 | #include "debug.h" |
47 | #include "util.h" |
48 | |
49 | #include "libslirp.h" |
50 | #include "ip.h" |
51 | #include "ip6.h" |
52 | #include "tcp.h" |
53 | #include "tcp_timer.h" |
54 | #include "tcp_var.h" |
55 | #include "tcpip.h" |
56 | #include "udp.h" |
57 | #include "ip_icmp.h" |
58 | #include "ip6_icmp.h" |
59 | #include "mbuf.h" |
60 | #include "sbuf.h" |
61 | #include "socket.h" |
62 | #include "if.h" |
63 | #include "main.h" |
64 | #include "misc.h" |
65 | |
66 | #include "bootp.h" |
67 | #include "tftp.h" |
68 | |
69 | #define ARPOP_REQUEST 1 /* ARP request */ |
70 | #define ARPOP_REPLY 2 /* ARP reply */ |
71 | |
72 | struct ethhdr { |
73 | unsigned char h_dest[ETH_ALEN]; /* destination eth addr */ |
74 | unsigned char h_source[ETH_ALEN]; /* source ether addr */ |
75 | unsigned short h_proto; /* packet type ID field */ |
76 | }; |
77 | |
78 | struct slirp_arphdr { |
79 | unsigned short ar_hrd; /* format of hardware address */ |
80 | unsigned short ar_pro; /* format of protocol address */ |
81 | unsigned char ar_hln; /* length of hardware address */ |
82 | unsigned char ar_pln; /* length of protocol address */ |
83 | unsigned short ar_op; /* ARP opcode (command) */ |
84 | |
85 | /* |
86 | * Ethernet looks like this : This bit is variable sized however... |
87 | */ |
88 | unsigned char ar_sha[ETH_ALEN]; /* sender hardware address */ |
89 | uint32_t ar_sip; /* sender IP address */ |
90 | unsigned char ar_tha[ETH_ALEN]; /* target hardware address */ |
91 | uint32_t ar_tip; /* target IP address */ |
92 | } SLIRP_PACKED; |
93 | |
94 | #define ARP_TABLE_SIZE 16 |
95 | |
96 | typedef struct ArpTable { |
97 | struct slirp_arphdr table[ARP_TABLE_SIZE]; |
98 | int next_victim; |
99 | } ArpTable; |
100 | |
101 | void arp_table_add(Slirp *slirp, uint32_t ip_addr, uint8_t ethaddr[ETH_ALEN]); |
102 | |
103 | bool arp_table_search(Slirp *slirp, uint32_t ip_addr, |
104 | uint8_t out_ethaddr[ETH_ALEN]); |
105 | |
106 | struct ndpentry { |
107 | unsigned char eth_addr[ETH_ALEN]; /* sender hardware address */ |
108 | struct in6_addr ip_addr; /* sender IP address */ |
109 | }; |
110 | |
111 | #define NDP_TABLE_SIZE 16 |
112 | |
113 | typedef struct NdpTable { |
114 | struct ndpentry table[NDP_TABLE_SIZE]; |
115 | int next_victim; |
116 | } NdpTable; |
117 | |
118 | void ndp_table_add(Slirp *slirp, struct in6_addr ip_addr, |
119 | uint8_t ethaddr[ETH_ALEN]); |
120 | bool ndp_table_search(Slirp *slirp, struct in6_addr ip_addr, |
121 | uint8_t out_ethaddr[ETH_ALEN]); |
122 | |
123 | struct Slirp { |
124 | unsigned time_fasttimo; |
125 | unsigned last_slowtimo; |
126 | bool do_slowtimo; |
127 | |
128 | bool in_enabled, in6_enabled; |
129 | |
130 | /* virtual network configuration */ |
131 | struct in_addr vnetwork_addr; |
132 | struct in_addr vnetwork_mask; |
133 | struct in_addr vhost_addr; |
134 | struct in6_addr vprefix_addr6; |
135 | uint8_t vprefix_len; |
136 | struct in6_addr vhost_addr6; |
137 | struct in_addr vdhcp_startaddr; |
138 | struct in_addr vnameserver_addr; |
139 | struct in6_addr vnameserver_addr6; |
140 | |
141 | struct in_addr client_ipaddr; |
142 | char client_hostname[33]; |
143 | |
144 | int restricted; |
145 | struct gfwd_list *guestfwd_list; |
146 | |
147 | /* mbuf states */ |
148 | struct quehead m_freelist; |
149 | struct quehead m_usedlist; |
150 | int mbuf_alloced; |
151 | |
152 | /* if states */ |
153 | struct quehead if_fastq; /* fast queue (for interactive data) */ |
154 | struct quehead if_batchq; /* queue for non-interactive data */ |
155 | bool if_start_busy; /* avoid if_start recursion */ |
156 | |
157 | /* ip states */ |
158 | struct ipq ipq; /* ip reass. queue */ |
159 | uint16_t ip_id; /* ip packet ctr, for ids */ |
160 | |
161 | /* bootp/dhcp states */ |
162 | BOOTPClient bootp_clients[NB_BOOTP_CLIENTS]; |
163 | char *bootp_filename; |
164 | size_t vdnssearch_len; |
165 | uint8_t *vdnssearch; |
166 | char *vdomainname; |
167 | |
168 | /* tcp states */ |
169 | struct socket tcb; |
170 | struct socket *tcp_last_so; |
171 | tcp_seq tcp_iss; /* tcp initial send seq # */ |
172 | uint32_t tcp_now; /* for RFC 1323 timestamps */ |
173 | |
174 | /* udp states */ |
175 | struct socket udb; |
176 | struct socket *udp_last_so; |
177 | |
178 | /* icmp states */ |
179 | struct socket icmp; |
180 | struct socket *icmp_last_so; |
181 | |
182 | /* tftp states */ |
183 | char *tftp_prefix; |
184 | struct tftp_session tftp_sessions[TFTP_SESSIONS_MAX]; |
185 | char *tftp_server_name; |
186 | |
187 | ArpTable arp_table; |
188 | NdpTable ndp_table; |
189 | |
190 | GRand *grand; |
191 | void *ra_timer; |
192 | |
193 | const SlirpCb *cb; |
194 | void *opaque; |
195 | }; |
196 | |
197 | void if_start(Slirp *); |
198 | |
199 | int get_dns_addr(struct in_addr *pdns_addr); |
200 | int get_dns6_addr(struct in6_addr *pdns6_addr, uint32_t *scope_id); |
201 | |
202 | /* ncsi.c */ |
203 | void ncsi_input(Slirp *slirp, const uint8_t *pkt, int pkt_len); |
204 | |
205 | #ifndef _WIN32 |
206 | #include <netdb.h> |
207 | #endif |
208 | |
209 | |
210 | extern bool slirp_do_keepalive; |
211 | |
212 | #define TCP_MAXIDLE (TCPTV_KEEPCNT * TCPTV_KEEPINTVL) |
213 | |
214 | /* dnssearch.c */ |
215 | int translate_dnssearch(Slirp *s, const char **names); |
216 | |
217 | /* cksum.c */ |
218 | int cksum(struct mbuf *m, int len); |
219 | int ip6_cksum(struct mbuf *m); |
220 | |
221 | /* if.c */ |
222 | void if_init(Slirp *); |
223 | void if_output(struct socket *, struct mbuf *); |
224 | |
225 | /* ip_input.c */ |
226 | void ip_init(Slirp *); |
227 | void ip_cleanup(Slirp *); |
228 | void ip_input(struct mbuf *); |
229 | void ip_slowtimo(Slirp *); |
230 | void ip_stripoptions(register struct mbuf *, struct mbuf *); |
231 | |
232 | /* ip_output.c */ |
233 | int ip_output(struct socket *, struct mbuf *); |
234 | |
235 | /* ip6_input.c */ |
236 | void ip6_init(Slirp *); |
237 | void ip6_cleanup(Slirp *); |
238 | void ip6_input(struct mbuf *); |
239 | |
240 | /* ip6_output */ |
241 | int ip6_output(struct socket *, struct mbuf *, int fast); |
242 | |
243 | /* tcp_input.c */ |
244 | void tcp_input(register struct mbuf *, int, struct socket *, unsigned short af); |
245 | int tcp_mss(register struct tcpcb *, unsigned); |
246 | |
247 | /* tcp_output.c */ |
248 | int tcp_output(register struct tcpcb *); |
249 | void tcp_setpersist(register struct tcpcb *); |
250 | |
251 | /* tcp_subr.c */ |
252 | void tcp_init(Slirp *); |
253 | void tcp_cleanup(Slirp *); |
254 | void tcp_template(struct tcpcb *); |
255 | void tcp_respond(struct tcpcb *, register struct tcpiphdr *, |
256 | register struct mbuf *, tcp_seq, tcp_seq, int, unsigned short); |
257 | struct tcpcb *tcp_newtcpcb(struct socket *); |
258 | struct tcpcb *tcp_close(register struct tcpcb *); |
259 | void tcp_sockclosed(struct tcpcb *); |
260 | int tcp_fconnect(struct socket *, unsigned short af); |
261 | void tcp_connect(struct socket *); |
262 | int tcp_attach(struct socket *); |
263 | uint8_t tcp_tos(struct socket *); |
264 | int tcp_emu(struct socket *, struct mbuf *); |
265 | int tcp_ctl(struct socket *); |
266 | struct tcpcb *tcp_drop(struct tcpcb *tp, int err); |
267 | |
268 | struct socket *slirp_find_ctl_socket(Slirp *slirp, struct in_addr guest_addr, |
269 | int guest_port); |
270 | |
271 | void slirp_send_packet_all(Slirp *slirp, const void *buf, size_t len); |
272 | |
273 | #endif |
274 | |