Revision 9634d903
b/slirp/bootp.c | ||
---|---|---|
149 | 149 |
|
150 | 150 |
if ((m = m_get()) == NULL) |
151 | 151 |
return; |
152 |
m->m_data += if_maxlinkhdr;
|
|
152 |
m->m_data += IF_MAXLINKHDR;
|
|
153 | 153 |
rbp = (struct bootp_t *)m->m_data; |
154 | 154 |
m->m_data += sizeof(struct udpiphdr); |
155 | 155 |
memset(rbp, 0, sizeof(struct bootp_t)); |
b/slirp/debug.c | ||
---|---|---|
92 | 92 |
|
93 | 93 |
lprint(" \r\n"); |
94 | 94 |
|
95 |
if (if_comp & IF_COMPRESS)
|
|
95 |
if (IF_COMP & IF_COMPRESS)
|
|
96 | 96 |
strcpy(buff, "on"); |
97 |
else if (if_comp & IF_NOCOMPRESS)
|
|
97 |
else if (IF_COMP & IF_NOCOMPRESS)
|
|
98 | 98 |
strcpy(buff, "off"); |
99 | 99 |
else |
100 | 100 |
strcpy(buff, "off (for now)"); |
b/slirp/if.c | ||
---|---|---|
7 | 7 |
|
8 | 8 |
#include <slirp.h> |
9 | 9 |
|
10 |
int if_mtu, if_mru; |
|
11 |
int if_comp; |
|
12 |
int if_maxlinkhdr; |
|
13 | 10 |
int if_queued = 0; /* Number of packets queued so far */ |
14 | 11 |
int if_thresh = 10; /* Number of packets queued before we start sending |
15 | 12 |
* (to prevent allocing too many mbufs) */ |
... | ... | |
41 | 38 |
void |
42 | 39 |
if_init() |
43 | 40 |
{ |
44 |
#if 0 |
|
45 |
/* |
|
46 |
* Set if_maxlinkhdr to 48 because it's 40 bytes for TCP/IP, |
|
47 |
* and 8 bytes for PPP, but need to have it on an 8byte boundary |
|
48 |
*/ |
|
49 |
#ifdef USE_PPP |
|
50 |
if_maxlinkhdr = 48; |
|
51 |
#else |
|
52 |
if_maxlinkhdr = 40; |
|
53 |
#endif |
|
54 |
#else |
|
55 |
/* 2 for alignment, 14 for ethernet, 40 for TCP/IP */ |
|
56 |
if_maxlinkhdr = 2 + 14 + 40; |
|
57 |
#endif |
|
58 |
if_mtu = 1500; |
|
59 |
if_mru = 1500; |
|
60 |
if_comp = IF_AUTOCOMP; |
|
61 | 41 |
if_fastq.ifq_next = if_fastq.ifq_prev = &if_fastq; |
62 | 42 |
if_batchq.ifq_next = if_batchq.ifq_prev = &if_batchq; |
63 | 43 |
// sl_compress_init(&comp_s); |
b/slirp/if.h | ||
---|---|---|
13 | 13 |
#define IF_AUTOCOMP 0x04 /* Autodetect (default) */ |
14 | 14 |
#define IF_NOCIDCOMP 0x08 /* CID compression */ |
15 | 15 |
|
16 |
/* Needed for FreeBSD */ |
|
17 |
#undef if_mtu |
|
18 |
extern int if_mtu; |
|
19 |
extern int if_mru; /* MTU and MRU */ |
|
20 |
extern int if_comp; /* Flags for compression */ |
|
21 |
extern int if_maxlinkhdr; |
|
16 |
#define IF_MTU 1500 |
|
17 |
#define IF_MRU 1500 |
|
18 |
#define IF_COMP IF_AUTOCOMP /* Flags for compression */ |
|
19 |
|
|
20 |
#if 0 |
|
21 |
/* |
|
22 |
* Set if_maxlinkhdr to 48 because it's 40 bytes for TCP/IP, |
|
23 |
* and 8 bytes for PPP, but need to have it on an 8byte boundary |
|
24 |
*/ |
|
25 |
#ifdef USE_PPP |
|
26 |
#define IF_MAXLINKHDR 48 |
|
27 |
#else |
|
28 |
#define IF_MAXLINKHDR 40 |
|
29 |
#endif |
|
30 |
#else |
|
31 |
/* 2 for alignment, 14 for ethernet, 40 for TCP/IP */ |
|
32 |
#define IF_MAXLINKHDR (2 + 14 + 40) |
|
33 |
#endif |
|
34 |
|
|
22 | 35 |
extern int if_queued; /* Number of packets queued so far */ |
23 | 36 |
extern int if_thresh; /* Number of packets queued before we start sending |
24 | 37 |
* (to prevent allocing too many mbufs) */ |
b/slirp/ip.h | ||
---|---|---|
312 | 312 |
extern struct ipq ipq; /* ip reass. queue */ |
313 | 313 |
extern u_int16_t ip_id; /* ip packet ctr, for ids */ |
314 | 314 |
|
315 |
extern int ip_defttl; /* default IP ttl */ |
|
316 |
|
|
317 | 315 |
#endif |
b/slirp/ip_icmp.c | ||
---|---|---|
46 | 46 |
char icmp_ping_msg[] = "This is a psuedo-PING packet used by Slirp to emulate ICMP ECHO-REQUEST packets.\n"; |
47 | 47 |
|
48 | 48 |
/* list of actions for icmp_error() on RX of an icmp message */ |
49 |
static int icmp_flush[19] = { |
|
49 |
static const int icmp_flush[19] = {
|
|
50 | 50 |
/* ECHO REPLY (0) */ 0, |
51 | 51 |
1, |
52 | 52 |
1, |
b/slirp/ip_input.c | ||
---|---|---|
45 | 45 |
#include <slirp.h> |
46 | 46 |
#include "ip_icmp.h" |
47 | 47 |
|
48 |
int ip_defttl; |
|
49 |
|
|
50 | 48 |
#ifdef LOG_ENABLED |
51 | 49 |
struct ipstat ipstat; |
52 | 50 |
#endif |
53 | 51 |
|
54 | 52 |
struct ipq ipq; |
55 | 53 |
|
54 |
static struct ip *ip_reass(register struct ipasfrag *ip, |
|
55 |
register struct ipq *fp); |
|
56 |
static void ip_freef(struct ipq *fp); |
|
57 |
static void ip_enq(register struct ipasfrag *p, |
|
58 |
register struct ipasfrag *prev); |
|
59 |
static void ip_deq(register struct ipasfrag *p); |
|
60 |
|
|
56 | 61 |
/* |
57 | 62 |
* IP initialization: fill in IP protocol switch table. |
58 | 63 |
* All protocols not implemented in kernel go to raw IP protocol handler. |
... | ... | |
64 | 69 |
ip_id = tt.tv_sec & 0xffff; |
65 | 70 |
udp_init(); |
66 | 71 |
tcp_init(); |
67 |
ip_defttl = IPDEFTTL; |
|
68 | 72 |
} |
69 | 73 |
|
70 | 74 |
/* |
... | ... | |
239 | 243 |
* reassembly of this datagram already exists, then it |
240 | 244 |
* is given as fp; otherwise have to make a chain. |
241 | 245 |
*/ |
242 |
struct ip * |
|
243 |
ip_reass(ip, fp) |
|
244 |
register struct ipasfrag *ip; |
|
245 |
register struct ipq *fp; |
|
246 |
static struct ip * |
|
247 |
ip_reass(register struct ipasfrag *ip, register struct ipq *fp) |
|
246 | 248 |
{ |
247 | 249 |
register struct mbuf *m = dtom(ip); |
248 | 250 |
register struct ipasfrag *q; |
... | ... | |
398 | 400 |
* Free a fragment reassembly header and all |
399 | 401 |
* associated datagrams. |
400 | 402 |
*/ |
401 |
void |
|
402 |
ip_freef(fp) |
|
403 |
struct ipq *fp; |
|
403 |
static void |
|
404 |
ip_freef(struct ipq *fp) |
|
404 | 405 |
{ |
405 | 406 |
register struct ipasfrag *q, *p; |
406 | 407 |
|
... | ... | |
418 | 419 |
* Put an ip fragment on a reassembly chain. |
419 | 420 |
* Like insque, but pointers in middle of structure. |
420 | 421 |
*/ |
421 |
void |
|
422 |
ip_enq(p, prev) |
|
423 |
register struct ipasfrag *p, *prev; |
|
422 |
static void |
|
423 |
ip_enq(register struct ipasfrag *p, register struct ipasfrag *prev) |
|
424 | 424 |
{ |
425 | 425 |
DEBUG_CALL("ip_enq"); |
426 | 426 |
DEBUG_ARG("prev = %lx", (long)prev); |
... | ... | |
433 | 433 |
/* |
434 | 434 |
* To ip_enq as remque is to insque. |
435 | 435 |
*/ |
436 |
void |
|
437 |
ip_deq(p) |
|
438 |
register struct ipasfrag *p; |
|
436 |
static void |
|
437 |
ip_deq(register struct ipasfrag *p) |
|
439 | 438 |
{ |
440 | 439 |
((struct ipasfrag *)(p->ipf_prev))->ipf_next = p->ipf_next; |
441 | 440 |
((struct ipasfrag *)(p->ipf_next))->ipf_prev = p->ipf_prev; |
b/slirp/ip_output.c | ||
---|---|---|
96 | 96 |
/* |
97 | 97 |
* If small enough for interface, can just send directly. |
98 | 98 |
*/ |
99 |
if ((u_int16_t)ip->ip_len <= if_mtu) {
|
|
99 |
if ((u_int16_t)ip->ip_len <= IF_MTU) {
|
|
100 | 100 |
ip->ip_len = htons((u_int16_t)ip->ip_len); |
101 | 101 |
ip->ip_off = htons((u_int16_t)ip->ip_off); |
102 | 102 |
ip->ip_sum = 0; |
... | ... | |
116 | 116 |
goto bad; |
117 | 117 |
} |
118 | 118 |
|
119 |
len = (if_mtu - hlen) &~ 7; /* ip databytes per packet */
|
|
119 |
len = (IF_MTU - hlen) &~ 7; /* ip databytes per packet */
|
|
120 | 120 |
if (len < 8) { |
121 | 121 |
error = -1; |
122 | 122 |
goto bad; |
... | ... | |
140 | 140 |
STAT(ipstat.ips_odropped++); |
141 | 141 |
goto sendorfree; |
142 | 142 |
} |
143 |
m->m_data += if_maxlinkhdr;
|
|
143 |
m->m_data += IF_MAXLINKHDR;
|
|
144 | 144 |
mhip = mtod(m, struct ip *); |
145 | 145 |
*mhip = *ip; |
146 | 146 |
|
b/slirp/main.h | ||
---|---|---|
42 | 42 |
extern char *socket_path; |
43 | 43 |
extern int towrite_max; |
44 | 44 |
extern int ppp_exit; |
45 |
extern int so_options; |
|
46 | 45 |
extern int tcp_keepintvl; |
47 | 46 |
extern uint8_t client_ethaddr[6]; |
48 | 47 |
|
b/slirp/mbuf.c | ||
---|---|---|
21 | 21 |
char *mclrefcnt; |
22 | 22 |
int mbuf_alloced = 0; |
23 | 23 |
struct mbuf m_freelist, m_usedlist; |
24 |
int mbuf_thresh = 30;
|
|
24 |
#define MBUF_THRESH 30
|
|
25 | 25 |
int mbuf_max = 0; |
26 |
int msize; |
|
26 |
|
|
27 |
/* |
|
28 |
* Find a nice value for msize |
|
29 |
* XXX if_maxlinkhdr already in mtu |
|
30 |
*/ |
|
31 |
#define MSIZE (IF_MTU + IF_MAXLINKHDR + sizeof(struct m_hdr ) + 6) |
|
27 | 32 |
|
28 | 33 |
void |
29 | 34 |
m_init() |
30 | 35 |
{ |
31 | 36 |
m_freelist.m_next = m_freelist.m_prev = &m_freelist; |
32 | 37 |
m_usedlist.m_next = m_usedlist.m_prev = &m_usedlist; |
33 |
msize_init(); |
|
34 |
} |
|
35 |
|
|
36 |
void |
|
37 |
msize_init() |
|
38 |
{ |
|
39 |
/* |
|
40 |
* Find a nice value for msize |
|
41 |
* XXX if_maxlinkhdr already in mtu |
|
42 |
*/ |
|
43 |
msize = (if_mtu>if_mru?if_mtu:if_mru) + |
|
44 |
if_maxlinkhdr + sizeof(struct m_hdr ) + 6; |
|
45 | 38 |
} |
46 | 39 |
|
47 | 40 |
/* |
... | ... | |
61 | 54 |
DEBUG_CALL("m_get"); |
62 | 55 |
|
63 | 56 |
if (m_freelist.m_next == &m_freelist) { |
64 |
m = (struct mbuf *)malloc(msize);
|
|
57 |
m = (struct mbuf *)malloc(MSIZE);
|
|
65 | 58 |
if (m == NULL) goto end_error; |
66 | 59 |
mbuf_alloced++; |
67 |
if (mbuf_alloced > mbuf_thresh)
|
|
60 |
if (mbuf_alloced > MBUF_THRESH)
|
|
68 | 61 |
flags = M_DOFREE; |
69 | 62 |
if (mbuf_alloced > mbuf_max) |
70 | 63 |
mbuf_max = mbuf_alloced; |
... | ... | |
78 | 71 |
m->m_flags = (flags | M_USEDLIST); |
79 | 72 |
|
80 | 73 |
/* Initialise it */ |
81 |
m->m_size = msize - sizeof(struct m_hdr);
|
|
74 |
m->m_size = MSIZE - sizeof(struct m_hdr);
|
|
82 | 75 |
m->m_data = m->m_dat; |
83 | 76 |
m->m_len = 0; |
84 | 77 |
m->m_nextpkt = 0; |
b/slirp/mbuf.h | ||
---|---|---|
135 | 135 |
extern int mbuf_max; |
136 | 136 |
|
137 | 137 |
void m_init _P((void)); |
138 |
void msize_init _P((void)); |
|
139 | 138 |
struct mbuf * m_get _P((void)); |
140 | 139 |
void m_free _P((struct mbuf *)); |
141 | 140 |
void m_cat _P((register struct mbuf *, register struct mbuf *)); |
b/slirp/misc.c | ||
---|---|---|
8 | 8 |
#define WANT_SYS_IOCTL_H |
9 | 9 |
#include <slirp.h> |
10 | 10 |
|
11 |
u_int curtime, time_fasttimo, last_slowtimo, detach_time; |
|
12 |
u_int detach_wait = 600000; /* 10 minutes */ |
|
11 |
u_int curtime, time_fasttimo, last_slowtimo; |
|
13 | 12 |
|
14 | 13 |
#if 0 |
15 | 14 |
int x_port = -1; |
... | ... | |
214 | 213 |
#ifdef _WIN32 |
215 | 214 |
|
216 | 215 |
int |
217 |
fork_exec(so, ex, do_pty) |
|
218 |
struct socket *so; |
|
219 |
char *ex; |
|
220 |
int do_pty; |
|
216 |
fork_exec(struct socket *so, const char *ex, int do_pty) |
|
221 | 217 |
{ |
222 | 218 |
/* not implemented */ |
223 | 219 |
return 0; |
... | ... | |
225 | 221 |
|
226 | 222 |
#else |
227 | 223 |
|
224 |
#ifndef CONFIG_QEMU |
|
228 | 225 |
int |
229 | 226 |
slirp_openpty(amaster, aslave) |
230 | 227 |
int *amaster, *aslave; |
... | ... | |
289 | 286 |
return (-1); |
290 | 287 |
#endif |
291 | 288 |
} |
289 |
#endif |
|
292 | 290 |
|
293 | 291 |
/* |
294 | 292 |
* XXX This is ugly |
... | ... | |
302 | 300 |
* do_ptr = 2 Fork/exec using pty |
303 | 301 |
*/ |
304 | 302 |
int |
305 |
fork_exec(so, ex, do_pty) |
|
306 |
struct socket *so; |
|
307 |
char *ex; |
|
308 |
int do_pty; |
|
303 |
fork_exec(struct socket *so, const char *ex, int do_pty) |
|
309 | 304 |
{ |
310 | 305 |
int s; |
311 | 306 |
struct sockaddr_in addr; |
312 | 307 |
int addrlen = sizeof(addr); |
313 | 308 |
int opt; |
314 |
int master; |
|
309 |
int master = -1;
|
|
315 | 310 |
char *argv[256]; |
316 | 311 |
#if 0 |
317 | 312 |
char buff[256]; |
318 | 313 |
#endif |
319 | 314 |
/* don't want to clobber the original */ |
320 | 315 |
char *bptr; |
321 |
char *curarg; |
|
316 |
const char *curarg;
|
|
322 | 317 |
int c, i, ret; |
323 | 318 |
|
324 | 319 |
DEBUG_CALL("fork_exec"); |
... | ... | |
327 | 322 |
DEBUG_ARG("do_pty = %lx", (long)do_pty); |
328 | 323 |
|
329 | 324 |
if (do_pty == 2) { |
325 |
#if 0 |
|
330 | 326 |
if (slirp_openpty(&master, &s) == -1) { |
331 | 327 |
lprint("Error: openpty failed: %s\n", strerror(errno)); |
332 | 328 |
return 0; |
333 | 329 |
} |
330 |
#endif |
|
334 | 331 |
} else { |
335 | 332 |
addr.sin_family = AF_INET; |
336 | 333 |
addr.sin_port = 0; |
... | ... | |
390 | 387 |
dup2(s, 0); |
391 | 388 |
dup2(s, 1); |
392 | 389 |
dup2(s, 2); |
393 |
for (s = 3; s <= 255; s++)
|
|
390 |
for (s = getdtablesize() - 1; s >= 3; s--)
|
|
394 | 391 |
close(s); |
395 | 392 |
|
396 | 393 |
i = 0; |
b/slirp/misc.h | ||
---|---|---|
12 | 12 |
int ex_pty; /* Do we want a pty? */ |
13 | 13 |
int ex_addr; /* The last byte of the address */ |
14 | 14 |
int ex_fport; /* Port to telnet to */ |
15 |
char *ex_exec; /* Command line of what to exec */
|
|
15 |
const char *ex_exec; /* Command line of what to exec */
|
|
16 | 16 |
struct ex_list *ex_next; |
17 | 17 |
}; |
18 | 18 |
|
19 | 19 |
extern struct ex_list *exec_list; |
20 |
extern u_int curtime, time_fasttimo, last_slowtimo, detach_time, detach_wait;
|
|
20 |
extern u_int curtime, time_fasttimo, last_slowtimo; |
|
21 | 21 |
|
22 | 22 |
extern int (*lprint_print) _P((void *, const char *, va_list)); |
23 | 23 |
extern char *lprint_ptr, *lprint_ptr2, **lprint_arg; |
... | ... | |
74 | 74 |
inline void slirp_remque _P((void *)); |
75 | 75 |
int add_exec _P((struct ex_list **, int, char *, int, int)); |
76 | 76 |
int slirp_openpty _P((int *, int *)); |
77 |
int fork_exec _P((struct socket *, char *, int));
|
|
77 |
int fork_exec(struct socket *so, const char *ex, int do_pty);
|
|
78 | 78 |
void snooze_hup _P((int)); |
79 | 79 |
void snooze _P((void)); |
80 | 80 |
void relay _P((int)); |
b/slirp/sbuf.c | ||
---|---|---|
7 | 7 |
|
8 | 8 |
#include <slirp.h> |
9 | 9 |
|
10 |
static void sbappendsb(struct sbuf *sb, struct mbuf *m); |
|
11 |
|
|
10 | 12 |
/* Done as a macro in socket.h */ |
11 | 13 |
/* int |
12 | 14 |
* sbspace(struct sockbuff *sb) |
... | ... | |
133 | 135 |
* Copy the data from m into sb |
134 | 136 |
* The caller is responsible to make sure there's enough room |
135 | 137 |
*/ |
136 |
void |
|
137 |
sbappendsb(sb, m) |
|
138 |
struct sbuf *sb; |
|
139 |
struct mbuf *m; |
|
138 |
static void |
|
139 |
sbappendsb(struct sbuf *sb, struct mbuf *m) |
|
140 | 140 |
{ |
141 | 141 |
int len, n, nn; |
142 | 142 |
|
b/slirp/sbuf.h | ||
---|---|---|
25 | 25 |
void sbdrop _P((struct sbuf *, int)); |
26 | 26 |
void sbreserve _P((struct sbuf *, int)); |
27 | 27 |
void sbappend _P((struct socket *, struct mbuf *)); |
28 |
void sbappendsb _P((struct sbuf *, struct mbuf *)); |
|
29 | 28 |
void sbcopy _P((struct sbuf *, int, int, char *)); |
30 | 29 |
|
31 | 30 |
#endif |
b/slirp/slirp.c | ||
---|---|---|
12 | 12 |
/* virtual address alias for host */ |
13 | 13 |
struct in_addr alias_addr; |
14 | 14 |
|
15 |
const uint8_t special_ethaddr[6] = { |
|
15 |
static const uint8_t special_ethaddr[6] = {
|
|
16 | 16 |
0x52, 0x54, 0x00, 0x12, 0x35, 0x00 |
17 | 17 |
}; |
18 | 18 |
|
... | ... | |
130 | 130 |
#endif |
131 | 131 |
|
132 | 132 |
#ifdef _WIN32 |
133 |
void slirp_cleanup(void) |
|
133 |
static void slirp_cleanup(void)
|
|
134 | 134 |
{ |
135 | 135 |
WSACleanup(); |
136 | 136 |
} |
b/slirp/slirp.h | ||
---|---|---|
280 | 280 |
|
281 | 281 |
#define DEFAULT_BAUD 115200 |
282 | 282 |
|
283 |
#define SO_OPTIONS DO_KEEPALIVE |
|
284 |
#define TCP_MAXIDLE (TCPTV_KEEPCNT * TCPTV_KEEPINTVL) |
|
285 |
|
|
283 | 286 |
/* cksum.c */ |
284 | 287 |
int cksum(struct mbuf *m, int len); |
285 | 288 |
|
... | ... | |
290 | 293 |
/* ip_input.c */ |
291 | 294 |
void ip_init _P((void)); |
292 | 295 |
void ip_input _P((struct mbuf *)); |
293 |
struct ip * ip_reass _P((register struct ipasfrag *, register struct ipq *)); |
|
294 |
void ip_freef _P((struct ipq *)); |
|
295 |
void ip_enq _P((register struct ipasfrag *, register struct ipasfrag *)); |
|
296 |
void ip_deq _P((register struct ipasfrag *)); |
|
297 | 296 |
void ip_slowtimo _P((void)); |
298 | 297 |
void ip_stripoptions _P((register struct mbuf *, struct mbuf *)); |
299 | 298 |
|
... | ... | |
301 | 300 |
int ip_output _P((struct socket *, struct mbuf *)); |
302 | 301 |
|
303 | 302 |
/* tcp_input.c */ |
304 |
int tcp_reass _P((register struct tcpcb *, register struct tcpiphdr *, struct mbuf *)); |
|
305 | 303 |
void tcp_input _P((register struct mbuf *, int, struct socket *)); |
306 |
void tcp_dooptions _P((struct tcpcb *, u_char *, int, struct tcpiphdr *)); |
|
307 |
void tcp_xmit_timer _P((register struct tcpcb *, int)); |
|
308 | 304 |
int tcp_mss _P((register struct tcpcb *, u_int)); |
309 | 305 |
|
310 | 306 |
/* tcp_output.c */ |
... | ... | |
317 | 313 |
void tcp_respond _P((struct tcpcb *, register struct tcpiphdr *, register struct mbuf *, tcp_seq, tcp_seq, int)); |
318 | 314 |
struct tcpcb * tcp_newtcpcb _P((struct socket *)); |
319 | 315 |
struct tcpcb * tcp_close _P((register struct tcpcb *)); |
320 |
void tcp_drain _P((void)); |
|
321 | 316 |
void tcp_sockclosed _P((struct tcpcb *)); |
322 | 317 |
int tcp_fconnect _P((struct socket *)); |
323 | 318 |
void tcp_connect _P((struct socket *)); |
b/slirp/socket.c | ||
---|---|---|
13 | 13 |
#include <sys/filio.h> |
14 | 14 |
#endif |
15 | 15 |
|
16 |
void |
|
16 |
static void sofcantrcvmore(struct socket *so); |
|
17 |
static void sofcantsendmore(struct socket *so); |
|
18 |
|
|
19 |
#if 0 |
|
20 |
static void |
|
17 | 21 |
so_init() |
18 | 22 |
{ |
19 | 23 |
/* Nothing yet */ |
20 | 24 |
} |
21 |
|
|
25 |
#endif |
|
22 | 26 |
|
23 | 27 |
struct socket * |
24 | 28 |
solookup(head, laddr, lport, faddr, fport) |
... | ... | |
421 | 425 |
int len, n; |
422 | 426 |
|
423 | 427 |
if (!(m = m_get())) return; |
424 |
m->m_data += if_maxlinkhdr;
|
|
428 |
m->m_data += IF_MAXLINKHDR;
|
|
425 | 429 |
|
426 | 430 |
/* |
427 | 431 |
* XXX Shouldn't FIONREAD packets destined for port 53, |
... | ... | |
604 | 608 |
return so; |
605 | 609 |
} |
606 | 610 |
|
611 |
#if 0 |
|
607 | 612 |
/* |
608 | 613 |
* Data is available in so_rcv |
609 | 614 |
* Just write() the data to the socket |
610 | 615 |
* XXX not yet... |
611 | 616 |
*/ |
612 |
void |
|
617 |
static void
|
|
613 | 618 |
sorwakeup(so) |
614 | 619 |
struct socket *so; |
615 | 620 |
{ |
... | ... | |
622 | 627 |
* We have room for a read() if we want to |
623 | 628 |
* For now, don't read, it'll be done in the main loop |
624 | 629 |
*/ |
625 |
void |
|
630 |
static void
|
|
626 | 631 |
sowwakeup(so) |
627 | 632 |
struct socket *so; |
628 | 633 |
{ |
629 | 634 |
/* Nothing, yet */ |
630 | 635 |
} |
636 |
#endif |
|
631 | 637 |
|
632 | 638 |
/* |
633 | 639 |
* Various session state calls |
... | ... | |
652 | 658 |
so->so_state |= SS_ISFCONNECTED; /* Clobber other states */ |
653 | 659 |
} |
654 | 660 |
|
655 |
void |
|
656 |
sofcantrcvmore(so) |
|
657 |
struct socket *so; |
|
661 |
static void |
|
662 |
sofcantrcvmore(struct socket *so) |
|
658 | 663 |
{ |
659 | 664 |
if ((so->so_state & SS_NOFDREF) == 0) { |
660 | 665 |
shutdown(so->s,0); |
... | ... | |
669 | 674 |
so->so_state |= SS_FCANTRCVMORE; |
670 | 675 |
} |
671 | 676 |
|
672 |
void |
|
673 |
sofcantsendmore(so) |
|
674 |
struct socket *so; |
|
677 |
static void |
|
678 |
sofcantsendmore(struct socket *so) |
|
675 | 679 |
{ |
676 | 680 |
if ((so->so_state & SS_NOFDREF) == 0) { |
677 | 681 |
shutdown(so->s,1); /* send FIN to fhost */ |
b/slirp/socket.h | ||
---|---|---|
81 | 81 |
}; |
82 | 82 |
#endif |
83 | 83 |
|
84 |
void so_init _P((void)); |
|
85 | 84 |
struct socket * solookup _P((struct socket *, struct in_addr, u_int, struct in_addr, u_int)); |
86 | 85 |
struct socket * socreate _P((void)); |
87 | 86 |
void sofree _P((struct socket *)); |
... | ... | |
92 | 91 |
void sorecvfrom _P((struct socket *)); |
93 | 92 |
int sosendto _P((struct socket *, struct mbuf *)); |
94 | 93 |
struct socket * solisten _P((u_int, u_int32_t, u_int, int)); |
95 |
void sorwakeup _P((struct socket *)); |
|
96 |
void sowwakeup _P((struct socket *)); |
|
97 | 94 |
void soisfconnecting _P((register struct socket *)); |
98 | 95 |
void soisfconnected _P((register struct socket *)); |
99 |
void sofcantrcvmore _P((struct socket *)); |
|
100 |
void sofcantsendmore _P((struct socket *)); |
|
101 | 96 |
void soisfdisconnected _P((struct socket *)); |
102 | 97 |
void sofwdrain _P((struct socket *)); |
103 | 98 |
|
b/slirp/tcp.h | ||
---|---|---|
42 | 42 |
#define PR_SLOWHZ 2 /* 2 slow timeouts per second (approx) */ |
43 | 43 |
#define PR_FASTHZ 5 /* 5 fast timeouts per second (not important) */ |
44 | 44 |
|
45 |
extern int tcp_rcvspace; |
|
46 |
extern int tcp_sndspace; |
|
47 | 45 |
extern struct socket *tcp_last_so; |
48 | 46 |
|
49 | 47 |
#define TCP_SNDSPACE 8192 |
... | ... | |
172 | 170 |
|
173 | 171 |
extern tcp_seq tcp_iss; /* tcp initial send seq # */ |
174 | 172 |
|
175 |
extern char *tcpstates[];
|
|
173 |
extern const char * const tcpstates[];
|
|
176 | 174 |
|
177 | 175 |
#endif |
b/slirp/tcp_input.c | ||
---|---|---|
47 | 47 |
|
48 | 48 |
struct socket tcb; |
49 | 49 |
|
50 |
int tcprexmtthresh = 3;
|
|
50 |
#define TCPREXMTTHRESH 3
|
|
51 | 51 |
struct socket *tcp_last_so = &tcb; |
52 | 52 |
|
53 | 53 |
tcp_seq tcp_iss; /* tcp initial send seq # */ |
... | ... | |
112 | 112 |
} \ |
113 | 113 |
} |
114 | 114 |
#endif |
115 |
static void tcp_dooptions(struct tcpcb *tp, u_char *cp, int cnt, |
|
116 |
struct tcpiphdr *ti); |
|
117 |
static void tcp_xmit_timer(register struct tcpcb *tp, int rtt); |
|
115 | 118 |
|
116 |
int |
|
117 |
tcp_reass(tp, ti, m) |
|
118 |
register struct tcpcb *tp; |
|
119 |
register struct tcpiphdr *ti; |
|
120 |
struct mbuf *m; |
|
119 |
static int |
|
120 |
tcp_reass(register struct tcpcb *tp, register struct tcpiphdr *ti, |
|
121 |
struct mbuf *m) |
|
121 | 122 |
{ |
122 | 123 |
register struct tcpiphdr *q; |
123 | 124 |
struct socket *so = tp->t_socket; |
... | ... | |
402 | 403 |
goto dropwithreset; |
403 | 404 |
} |
404 | 405 |
|
405 |
sbreserve(&so->so_snd, tcp_sndspace);
|
|
406 |
sbreserve(&so->so_rcv, tcp_rcvspace);
|
|
406 |
sbreserve(&so->so_snd, TCP_SNDSPACE);
|
|
407 |
sbreserve(&so->so_rcv, TCP_RCVSPACE);
|
|
407 | 408 |
|
408 | 409 |
/* tcp_last_so = so; */ /* XXX ? */ |
409 | 410 |
/* tp = sototcpcb(so); */ |
... | ... | |
448 | 449 |
* Reset idle time and keep-alive timer. |
449 | 450 |
*/ |
450 | 451 |
tp->t_idle = 0; |
451 |
if (so_options)
|
|
452 |
tp->t_timer[TCPT_KEEP] = tcp_keepintvl;
|
|
452 |
if (SO_OPTIONS)
|
|
453 |
tp->t_timer[TCPT_KEEP] = TCPTV_KEEPINTVL;
|
|
453 | 454 |
else |
454 |
tp->t_timer[TCPT_KEEP] = tcp_keepidle;
|
|
455 |
tp->t_timer[TCPT_KEEP] = TCPTV_KEEP_IDLE;
|
|
455 | 456 |
|
456 | 457 |
/* |
457 | 458 |
* Process options if not in LISTEN state, |
... | ... | |
1102 | 1103 |
if (tp->t_timer[TCPT_REXMT] == 0 || |
1103 | 1104 |
ti->ti_ack != tp->snd_una) |
1104 | 1105 |
tp->t_dupacks = 0; |
1105 |
else if (++tp->t_dupacks == tcprexmtthresh) {
|
|
1106 |
else if (++tp->t_dupacks == TCPREXMTTHRESH) {
|
|
1106 | 1107 |
tcp_seq onxt = tp->snd_nxt; |
1107 | 1108 |
u_int win = |
1108 | 1109 |
min(tp->snd_wnd, tp->snd_cwnd) / 2 / |
... | ... | |
1121 | 1122 |
if (SEQ_GT(onxt, tp->snd_nxt)) |
1122 | 1123 |
tp->snd_nxt = onxt; |
1123 | 1124 |
goto drop; |
1124 |
} else if (tp->t_dupacks > tcprexmtthresh) {
|
|
1125 |
} else if (tp->t_dupacks > TCPREXMTTHRESH) {
|
|
1125 | 1126 |
tp->snd_cwnd += tp->t_maxseg; |
1126 | 1127 |
(void) tcp_output(tp); |
1127 | 1128 |
goto drop; |
... | ... | |
1135 | 1136 |
* If the congestion window was inflated to account |
1136 | 1137 |
* for the other side's cached packets, retract it. |
1137 | 1138 |
*/ |
1138 |
if (tp->t_dupacks > tcprexmtthresh &&
|
|
1139 |
if (tp->t_dupacks > TCPREXMTTHRESH &&
|
|
1139 | 1140 |
tp->snd_cwnd > tp->snd_ssthresh) |
1140 | 1141 |
tp->snd_cwnd = tp->snd_ssthresh; |
1141 | 1142 |
tp->t_dupacks = 0; |
... | ... | |
1227 | 1228 |
*/ |
1228 | 1229 |
if (so->so_state & SS_FCANTRCVMORE) { |
1229 | 1230 |
soisfdisconnected(so); |
1230 |
tp->t_timer[TCPT_2MSL] = tcp_maxidle;
|
|
1231 |
tp->t_timer[TCPT_2MSL] = TCP_MAXIDLE;
|
|
1231 | 1232 |
} |
1232 | 1233 |
tp->t_state = TCPS_FIN_WAIT_2; |
1233 | 1234 |
} |
... | ... | |
1490 | 1491 |
/* int *ts_present; |
1491 | 1492 |
* u_int32_t *ts_val, *ts_ecr; |
1492 | 1493 |
*/ |
1493 |
void |
|
1494 |
tcp_dooptions(tp, cp, cnt, ti) |
|
1495 |
struct tcpcb *tp; |
|
1496 |
u_char *cp; |
|
1497 |
int cnt; |
|
1498 |
struct tcpiphdr *ti; |
|
1494 |
static void |
|
1495 |
tcp_dooptions(struct tcpcb *tp, u_char *cp, int cnt, struct tcpiphdr *ti) |
|
1499 | 1496 |
{ |
1500 | 1497 |
u_int16_t mss; |
1501 | 1498 |
int opt, optlen; |
... | ... | |
1605 | 1602 |
* and update averages and current timeout. |
1606 | 1603 |
*/ |
1607 | 1604 |
|
1608 |
void |
|
1609 |
tcp_xmit_timer(tp, rtt) |
|
1610 |
register struct tcpcb *tp; |
|
1611 |
int rtt; |
|
1605 |
static void |
|
1606 |
tcp_xmit_timer(register struct tcpcb *tp, int rtt) |
|
1612 | 1607 |
{ |
1613 | 1608 |
register short delta; |
1614 | 1609 |
|
... | ... | |
1707 | 1702 |
DEBUG_ARG("tp = %lx", (long)tp); |
1708 | 1703 |
DEBUG_ARG("offer = %d", offer); |
1709 | 1704 |
|
1710 |
mss = min(if_mtu, if_mru) - sizeof(struct tcpiphdr);
|
|
1705 |
mss = min(IF_MTU, IF_MRU) - sizeof(struct tcpiphdr);
|
|
1711 | 1706 |
if (offer) |
1712 | 1707 |
mss = min(mss, offer); |
1713 | 1708 |
mss = max(mss, 32); |
... | ... | |
1716 | 1711 |
|
1717 | 1712 |
tp->snd_cwnd = mss; |
1718 | 1713 |
|
1719 |
sbreserve(&so->so_snd, tcp_sndspace+((tcp_sndspace%mss)?(mss-(tcp_sndspace%mss)):0)); |
|
1720 |
sbreserve(&so->so_rcv, tcp_rcvspace+((tcp_rcvspace%mss)?(mss-(tcp_rcvspace%mss)):0)); |
|
1714 |
sbreserve(&so->so_snd, TCP_SNDSPACE + ((TCP_SNDSPACE % mss) ? |
|
1715 |
(mss - (TCP_SNDSPACE % mss)) : |
|
1716 |
0)); |
|
1717 |
sbreserve(&so->so_rcv, TCP_RCVSPACE + ((TCP_RCVSPACE % mss) ? |
|
1718 |
(mss - (TCP_RCVSPACE % mss)) : |
|
1719 |
0)); |
|
1721 | 1720 |
|
1722 | 1721 |
DEBUG_MISC((dfd, " returning mss = %d\n", mss)); |
1723 | 1722 |
|
b/slirp/tcp_output.c | ||
---|---|---|
48 | 48 |
* Since this is only used in "stats socket", we give meaning |
49 | 49 |
* names instead of the REAL names |
50 | 50 |
*/ |
51 |
char *tcpstates[] = {
|
|
51 |
const char * const tcpstates[] = {
|
|
52 | 52 |
/* "CLOSED", "LISTEN", "SYN_SENT", "SYN_RCVD", */ |
53 | 53 |
"REDIRECT", "LISTEN", "SYN_SENT", "SYN_RCVD", |
54 | 54 |
"ESTABLISHED", "CLOSE_WAIT", "FIN_WAIT_1", "CLOSING", |
55 | 55 |
"LAST_ACK", "FIN_WAIT_2", "TIME_WAIT", |
56 | 56 |
}; |
57 | 57 |
|
58 |
u_char tcp_outflags[TCP_NSTATES] = { |
|
58 |
static const u_char tcp_outflags[TCP_NSTATES] = {
|
|
59 | 59 |
TH_RST|TH_ACK, 0, TH_SYN, TH_SYN|TH_ACK, |
60 | 60 |
TH_ACK, TH_ACK, TH_FIN|TH_ACK, TH_FIN|TH_ACK, |
61 | 61 |
TH_FIN|TH_ACK, TH_ACK, TH_ACK, |
... | ... | |
354 | 354 |
error = 1; |
355 | 355 |
goto out; |
356 | 356 |
} |
357 |
m->m_data += if_maxlinkhdr;
|
|
357 |
m->m_data += IF_MAXLINKHDR;
|
|
358 | 358 |
m->m_len = hdrlen; |
359 | 359 |
|
360 | 360 |
/* |
... | ... | |
396 | 396 |
error = 1; |
397 | 397 |
goto out; |
398 | 398 |
} |
399 |
m->m_data += if_maxlinkhdr;
|
|
399 |
m->m_data += IF_MAXLINKHDR;
|
|
400 | 400 |
m->m_len = hdrlen; |
401 | 401 |
} |
402 | 402 |
|
... | ... | |
536 | 536 |
|
537 | 537 |
((struct ip *)ti)->ip_len = m->m_len; |
538 | 538 |
|
539 |
((struct ip *)ti)->ip_ttl = ip_defttl;
|
|
539 |
((struct ip *)ti)->ip_ttl = IPDEFTTL;
|
|
540 | 540 |
((struct ip *)ti)->ip_tos = so->so_iptos; |
541 | 541 |
|
542 | 542 |
/* #if BSD >= 43 */ |
b/slirp/tcp_subr.c | ||
---|---|---|
46 | 46 |
#include <slirp.h> |
47 | 47 |
|
48 | 48 |
/* patchable/settable parameters for tcp */ |
49 |
int tcp_mssdflt = TCP_MSS; |
|
50 |
int tcp_rttdflt = TCPTV_SRTTDFLT / PR_SLOWHZ; |
|
51 |
int tcp_do_rfc1323 = 0; /* Don't do rfc1323 performance enhancements */ |
|
52 |
int tcp_rcvspace; /* You may want to change this */ |
|
53 |
int tcp_sndspace; /* Keep small if you have an error prone link */ |
|
49 |
/* Don't do rfc1323 performance enhancements */ |
|
50 |
#define TCP_DO_RFC1323 0 |
|
54 | 51 |
|
55 | 52 |
/* |
56 | 53 |
* Tcp initialization |
... | ... | |
60 | 57 |
{ |
61 | 58 |
tcp_iss = 1; /* wrong */ |
62 | 59 |
tcb.so_next = tcb.so_prev = &tcb; |
63 |
|
|
64 |
/* tcp_rcvspace = our Window we advertise to the remote */ |
|
65 |
tcp_rcvspace = TCP_RCVSPACE; |
|
66 |
tcp_sndspace = TCP_SNDSPACE; |
|
67 |
|
|
68 |
/* Make sure tcp_sndspace is at least 2*MSS */ |
|
69 |
if (tcp_sndspace < 2*(min(if_mtu, if_mru) - sizeof(struct tcpiphdr))) |
|
70 |
tcp_sndspace = 2*(min(if_mtu, if_mru) - sizeof(struct tcpiphdr)); |
|
71 | 60 |
} |
72 | 61 |
|
73 | 62 |
/* |
... | ... | |
145 | 134 |
#else |
146 | 135 |
tlen = 0; |
147 | 136 |
#endif |
148 |
m->m_data += if_maxlinkhdr;
|
|
137 |
m->m_data += IF_MAXLINKHDR;
|
|
149 | 138 |
*mtod(m, struct tcpiphdr *) = *ti; |
150 | 139 |
ti = mtod(m, struct tcpiphdr *); |
151 | 140 |
flags = TH_ACK; |
... | ... | |
186 | 175 |
if(flags & TH_RST) |
187 | 176 |
((struct ip *)ti)->ip_ttl = MAXTTL; |
188 | 177 |
else |
189 |
((struct ip *)ti)->ip_ttl = ip_defttl;
|
|
178 |
((struct ip *)ti)->ip_ttl = IPDEFTTL;
|
|
190 | 179 |
|
191 | 180 |
(void) ip_output((struct socket *)0, m); |
192 | 181 |
} |
... | ... | |
208 | 197 |
|
209 | 198 |
memset((char *) tp, 0, sizeof(struct tcpcb)); |
210 | 199 |
tp->seg_next = tp->seg_prev = (tcpiphdrp_32)tp; |
211 |
tp->t_maxseg = tcp_mssdflt;
|
|
200 |
tp->t_maxseg = TCP_MSS;
|
|
212 | 201 |
|
213 |
tp->t_flags = tcp_do_rfc1323 ? (TF_REQ_SCALE|TF_REQ_TSTMP) : 0;
|
|
202 |
tp->t_flags = TCP_DO_RFC1323 ? (TF_REQ_SCALE|TF_REQ_TSTMP) : 0;
|
|
214 | 203 |
tp->t_socket = so; |
215 | 204 |
|
216 | 205 |
/* |
... | ... | |
219 | 208 |
* reasonable initial retransmit time. |
220 | 209 |
*/ |
221 | 210 |
tp->t_srtt = TCPTV_SRTTBASE; |
222 |
tp->t_rttvar = tcp_rttdflt * PR_SLOWHZ << 2;
|
|
211 |
tp->t_rttvar = TCPTV_SRTTDFLT << 2;
|
|
223 | 212 |
tp->t_rttmin = TCPTV_MIN; |
224 | 213 |
|
225 | 214 |
TCPT_RANGESET(tp->t_rxtcur, |
... | ... | |
309 | 298 |
return ((struct tcpcb *)0); |
310 | 299 |
} |
311 | 300 |
|
301 |
#ifdef notdef |
|
312 | 302 |
void |
313 | 303 |
tcp_drain() |
314 | 304 |
{ |
... | ... | |
319 | 309 |
* When a source quench is received, close congestion window |
320 | 310 |
* to one segment. We will gradually open it again as we proceed. |
321 | 311 |
*/ |
322 |
|
|
323 |
#ifdef notdef |
|
324 |
|
|
325 | 312 |
void |
326 | 313 |
tcp_quench(i, errno) |
327 | 314 |
|
... | ... | |
556 | 543 |
/* |
557 | 544 |
* Set the socket's type of service field |
558 | 545 |
*/ |
559 |
struct tos_t tcptos[] = { |
|
546 |
static const struct tos_t tcptos[] = {
|
|
560 | 547 |
{0, 20, IPTOS_THROUGHPUT, 0}, /* ftp data */ |
561 | 548 |
{21, 21, IPTOS_LOWDELAY, EMU_FTP}, /* ftp control */ |
562 | 549 |
{0, 23, IPTOS_LOWDELAY, 0}, /* telnet */ |
... | ... | |
572 | 559 |
{0, 0, 0, 0} |
573 | 560 |
}; |
574 | 561 |
|
575 |
struct emu_t *tcpemu = 0; |
|
562 |
static struct emu_t *tcpemu = 0;
|
|
576 | 563 |
|
577 | 564 |
/* |
578 | 565 |
* Return TOS according to the above table |
... | ... | |
665 | 652 |
so_rcv->sb_rptr += m->m_len; |
666 | 653 |
m->m_data[m->m_len] = 0; /* NULL terminate */ |
667 | 654 |
if (strchr(m->m_data, '\r') || strchr(m->m_data, '\n')) { |
668 |
if (sscanf(so_rcv->sb_data, "%d%*[ ,]%d", &n1, &n2) == 2) {
|
|
655 |
if (sscanf(so_rcv->sb_data, "%u%*[ ,]%u", &n1, &n2) == 2) {
|
|
669 | 656 |
HTONS(n1); |
670 | 657 |
HTONS(n2); |
671 | 658 |
/* n2 is the one on our host */ |
... | ... | |
991 | 978 |
/* |
992 | 979 |
* Need to emulate the PORT command |
993 | 980 |
*/ |
994 |
x = sscanf(bptr, "ORT %d,%d,%d,%d,%d,%d\r\n%256[^\177]",
|
|
981 |
x = sscanf(bptr, "ORT %u,%u,%u,%u,%u,%u\r\n%256[^\177]",
|
|
995 | 982 |
&n1, &n2, &n3, &n4, &n5, &n6, buff); |
996 | 983 |
if (x < 6) |
997 | 984 |
return 1; |
... | ... | |
1022 | 1009 |
/* |
1023 | 1010 |
* Need to emulate the PASV response |
1024 | 1011 |
*/ |
1025 |
x = sscanf(bptr, "27 Entering Passive Mode (%d,%d,%d,%d,%d,%d)\r\n%256[^\177]",
|
|
1012 |
x = sscanf(bptr, "27 Entering Passive Mode (%u,%u,%u,%u,%u,%u)\r\n%256[^\177]",
|
|
1026 | 1013 |
&n1, &n2, &n3, &n4, &n5, &n6, buff); |
1027 | 1014 |
if (x < 6) |
1028 | 1015 |
return 1; |
b/slirp/tcp_timer.c | ||
---|---|---|
36 | 36 |
|
37 | 37 |
#include <slirp.h> |
38 | 38 |
|
39 |
int tcp_keepidle = TCPTV_KEEP_IDLE; |
|
40 |
int tcp_keepintvl = TCPTV_KEEPINTVL; |
|
41 |
int tcp_maxidle; |
|
42 |
int so_options = DO_KEEPALIVE; |
|
43 |
|
|
44 | 39 |
#ifdef LOG_ENABLED |
45 | 40 |
struct tcpstat tcpstat; /* tcp statistics */ |
46 | 41 |
#endif |
47 | 42 |
|
48 | 43 |
u_int32_t tcp_now; /* for RFC 1323 timestamps */ |
49 | 44 |
|
45 |
static struct tcpcb *tcp_timers(register struct tcpcb *tp, int timer); |
|
46 |
|
|
50 | 47 |
/* |
51 | 48 |
* Fast timeout routine for processing delayed acks |
52 | 49 |
*/ |
... | ... | |
84 | 81 |
|
85 | 82 |
DEBUG_CALL("tcp_slowtimo"); |
86 | 83 |
|
87 |
tcp_maxidle = TCPTV_KEEPCNT * tcp_keepintvl; |
|
88 | 84 |
/* |
89 | 85 |
* Search through tcb's and update active timers. |
90 | 86 |
*/ |
... | ... | |
130 | 126 |
tp->t_timer[i] = 0; |
131 | 127 |
} |
132 | 128 |
|
133 |
int tcp_backoff[TCP_MAXRXTSHIFT + 1] =
|
|
129 |
const int tcp_backoff[TCP_MAXRXTSHIFT + 1] =
|
|
134 | 130 |
{ 1, 2, 4, 8, 16, 32, 64, 64, 64, 64, 64, 64, 64 }; |
135 | 131 |
|
136 | 132 |
/* |
137 | 133 |
* TCP timer processing. |
138 | 134 |
*/ |
139 |
struct tcpcb * |
|
140 |
tcp_timers(tp, timer) |
|
141 |
register struct tcpcb *tp; |
|
142 |
int timer; |
|
135 |
static struct tcpcb * |
|
136 |
tcp_timers(register struct tcpcb *tp, int timer) |
|
143 | 137 |
{ |
144 | 138 |
register int rexmt; |
145 | 139 |
|
... | ... | |
155 | 149 |
*/ |
156 | 150 |
case TCPT_2MSL: |
157 | 151 |
if (tp->t_state != TCPS_TIME_WAIT && |
158 |
tp->t_idle <= tcp_maxidle)
|
|
159 |
tp->t_timer[TCPT_2MSL] = tcp_keepintvl;
|
|
152 |
tp->t_idle <= TCP_MAXIDLE)
|
|
153 |
tp->t_timer[TCPT_2MSL] = TCPTV_KEEPINTVL;
|
|
160 | 154 |
else |
161 | 155 |
tp = tcp_close(tp); |
162 | 156 |
break; |
... | ... | |
287 | 281 |
goto dropit; |
288 | 282 |
|
289 | 283 |
/* if (tp->t_socket->so_options & SO_KEEPALIVE && */ |
290 |
if ((so_options) && tp->t_state <= TCPS_CLOSE_WAIT) {
|
|
291 |
if (tp->t_idle >= tcp_keepidle + tcp_maxidle)
|
|
284 |
if ((SO_OPTIONS) && tp->t_state <= TCPS_CLOSE_WAIT) {
|
|
285 |
if (tp->t_idle >= TCPTV_KEEP_IDLE + TCP_MAXIDLE)
|
|
292 | 286 |
goto dropit; |
293 | 287 |
/* |
294 | 288 |
* Send a packet designed to force a response |
... | ... | |
314 | 308 |
tcp_respond(tp, &tp->t_template, (struct mbuf *)NULL, |
315 | 309 |
tp->rcv_nxt, tp->snd_una - 1, 0); |
316 | 310 |
#endif |
317 |
tp->t_timer[TCPT_KEEP] = tcp_keepintvl;
|
|
311 |
tp->t_timer[TCPT_KEEP] = TCPTV_KEEPINTVL;
|
|
318 | 312 |
} else |
319 |
tp->t_timer[TCPT_KEEP] = tcp_keepidle;
|
|
313 |
tp->t_timer[TCPT_KEEP] = TCPTV_KEEP_IDLE;
|
|
320 | 314 |
break; |
321 | 315 |
|
322 | 316 |
dropit: |
b/slirp/tcp_timer.h | ||
---|---|---|
126 | 126 |
(tv) = (tvmax); \ |
127 | 127 |
} |
128 | 128 |
|
129 |
extern int tcp_keepidle; /* time before keepalive probes begin */ |
|
130 |
extern int tcp_keepintvl; /* time between keepalive probes */ |
|
131 |
extern int tcp_maxidle; /* time to drop after starting probes */ |
|
132 |
extern int tcp_ttl; /* time to live for TCP segs */ |
|
133 |
extern int tcp_backoff[]; |
|
129 |
extern const int tcp_backoff[]; |
|
134 | 130 |
|
135 | 131 |
struct tcpcb; |
136 | 132 |
|
137 | 133 |
void tcp_fasttimo _P((void)); |
138 | 134 |
void tcp_slowtimo _P((void)); |
139 | 135 |
void tcp_canceltimers _P((struct tcpcb *)); |
140 |
struct tcpcb * tcp_timers _P((register struct tcpcb *, int)); |
|
141 | 136 |
|
142 | 137 |
#endif |
b/slirp/tftp.c | ||
---|---|---|
34 | 34 |
int timestamp; |
35 | 35 |
}; |
36 | 36 |
|
37 |
struct tftp_session tftp_sessions[TFTP_SESSIONS_MAX]; |
|
37 |
static struct tftp_session tftp_sessions[TFTP_SESSIONS_MAX];
|
|
38 | 38 |
|
39 | 39 |
const char *tftp_prefix; |
40 | 40 |
|
... | ... | |
143 | 143 |
|
144 | 144 |
memset(m->m_data, 0, m->m_size); |
145 | 145 |
|
146 |
m->m_data += if_maxlinkhdr;
|
|
146 |
m->m_data += IF_MAXLINKHDR;
|
|
147 | 147 |
tp = (void *)m->m_data; |
148 | 148 |
m->m_data += sizeof(struct udpiphdr); |
149 | 149 |
|
... | ... | |
183 | 183 |
|
184 | 184 |
memset(m->m_data, 0, m->m_size); |
185 | 185 |
|
186 |
m->m_data += if_maxlinkhdr;
|
|
186 |
m->m_data += IF_MAXLINKHDR;
|
|
187 | 187 |
tp = (void *)m->m_data; |
188 | 188 |
m->m_data += sizeof(struct udpiphdr); |
189 | 189 |
|
... | ... | |
230 | 230 |
|
231 | 231 |
memset(m->m_data, 0, m->m_size); |
232 | 232 |
|
233 |
m->m_data += if_maxlinkhdr;
|
|
233 |
m->m_data += IF_MAXLINKHDR;
|
|
234 | 234 |
tp = (void *)m->m_data; |
235 | 235 |
m->m_data += sizeof(struct udpiphdr); |
236 | 236 |
|
b/slirp/udp.c | ||
---|---|---|
51 | 51 |
|
52 | 52 |
struct socket udb; |
53 | 53 |
|
54 |
static u_int8_t udp_tos(struct socket *so); |
|
55 |
static void udp_emu(struct socket *so, struct mbuf *m); |
|
56 |
|
|
54 | 57 |
/* |
55 | 58 |
* UDP protocol implementation. |
56 | 59 |
* Per RFC 768, August, 1980. |
57 | 60 |
*/ |
58 | 61 |
#ifndef COMPAT_42 |
59 |
int udpcksum = 1;
|
|
62 |
#define UDPCKSUM 1
|
|
60 | 63 |
#else |
61 |
int udpcksum = 0; /* XXX */
|
|
64 |
#define UDPCKSUM 0 /* XXX */
|
|
62 | 65 |
#endif |
63 | 66 |
|
64 | 67 |
struct socket *udp_last_so = &udb; |
... | ... | |
132 | 135 |
/* |
133 | 136 |
* Checksum extended UDP header and data. |
134 | 137 |
*/ |
135 |
if (udpcksum && uh->uh_sum) {
|
|
138 |
if (UDPCKSUM && uh->uh_sum) {
|
|
136 | 139 |
((struct ipovly *)ip)->ih_next = 0; |
137 | 140 |
((struct ipovly *)ip)->ih_prev = 0; |
138 | 141 |
((struct ipovly *)ip)->ih_x1 = 0; |
... | ... | |
292 | 295 |
* Stuff checksum and output datagram. |
293 | 296 |
*/ |
294 | 297 |
ui->ui_sum = 0; |
295 |
if (udpcksum) {
|
|
298 |
if (UDPCKSUM) {
|
|
296 | 299 |
if ((ui->ui_sum = cksum(m, /* sizeof (struct udpiphdr) + */ m->m_len)) == 0) |
297 | 300 |
ui->ui_sum = 0xffff; |
298 | 301 |
} |
299 | 302 |
((struct ip *)ui)->ip_len = m->m_len; |
300 | 303 |
|
301 |
((struct ip *)ui)->ip_ttl = ip_defttl;
|
|
304 |
((struct ip *)ui)->ip_ttl = IPDEFTTL;
|
|
302 | 305 |
((struct ip *)ui)->ip_tos = iptos; |
303 | 306 |
|
304 | 307 |
STAT(udpstat.udps_opackets++); |
... | ... | |
369 | 372 |
sofree(so); |
370 | 373 |
} |
371 | 374 |
|
372 |
struct tos_t udptos[] = { |
|
375 |
static const struct tos_t udptos[] = {
|
|
373 | 376 |
{0, 53, IPTOS_LOWDELAY, 0}, /* DNS */ |
374 | 377 |
{517, 517, IPTOS_LOWDELAY, EMU_TALK}, /* talk */ |
375 | 378 |
{518, 518, IPTOS_LOWDELAY, EMU_NTALK}, /* ntalk */ |
... | ... | |
377 | 380 |
{0, 0, 0, 0} |
378 | 381 |
}; |
379 | 382 |
|
380 |
u_int8_t |
|
381 |
udp_tos(so) |
|
382 |
struct socket *so; |
|
383 |
static u_int8_t |
|
384 |
udp_tos(struct socket *so) |
|
383 | 385 |
{ |
384 | 386 |
int i = 0; |
385 | 387 |
|
... | ... | |
402 | 404 |
/* |
403 | 405 |
* Here, talk/ytalk/ntalk requests must be emulated |
404 | 406 |
*/ |
405 |
void |
|
406 |
udp_emu(so, m) |
|
407 |
struct socket *so; |
|
408 |
struct mbuf *m; |
|
407 |
static void |
|
408 |
udp_emu(struct socket *so, struct mbuf *m) |
|
409 | 409 |
{ |
410 | 410 |
struct sockaddr_in addr; |
411 | 411 |
int addrlen = sizeof(addr); |
b/slirp/udp.h | ||
---|---|---|
106 | 106 |
int udp_output _P((struct socket *, struct mbuf *, struct sockaddr_in *)); |
107 | 107 |
int udp_attach _P((struct socket *)); |
108 | 108 |
void udp_detach _P((struct socket *)); |
109 |
u_int8_t udp_tos _P((struct socket *)); |
|
110 |
void udp_emu _P((struct socket *, struct mbuf *)); |
|
111 | 109 |
struct socket * udp_listen _P((u_int, u_int32_t, u_int, int)); |
112 | 110 |
int udp_output2(struct socket *so, struct mbuf *m, |
113 | 111 |
struct sockaddr_in *saddr, struct sockaddr_in *daddr, |
Also available in: Unified diff