Statistics
| Branch: | Revision:

root / slirp / slirp.c @ f932b6ce

History | View | Annotate | Download (29.6 kB)

1
/*
2
 * libslirp glue
3
 *
4
 * Copyright (c) 2004-2008 Fabrice Bellard
5
 *
6
 * Permission is hereby granted, free of charge, to any person obtaining a copy
7
 * of this software and associated documentation files (the "Software"), to deal
8
 * in the Software without restriction, including without limitation the rights
9
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
 * copies of the Software, and to permit persons to whom the Software is
11
 * furnished to do so, subject to the following conditions:
12
 *
13
 * The above copyright notice and this permission notice shall be included in
14
 * all copies or substantial portions of the Software.
15
 *
16
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
 * THE SOFTWARE.
23
 */
24
#include "qemu-common.h"
25
#include "qemu-char.h"
26
#include "slirp.h"
27
#include "hw/hw.h"
28

    
29
/* host address */
30
struct in_addr our_addr;
31
/* host dns address */
32
struct in_addr dns_addr;
33
/* host loopback address */
34
struct in_addr loopback_addr;
35

    
36
/* virtual network configuration */
37
struct in_addr vnetwork_addr;
38
struct in_addr vnetwork_mask;
39
struct in_addr vhost_addr;
40
struct in_addr vdhcp_startaddr;
41
struct in_addr vnameserver_addr;
42

    
43
/* emulated hosts use the MAC addr 52:55:IP:IP:IP:IP */
44
static const uint8_t special_ethaddr[6] = {
45
    0x52, 0x55, 0x00, 0x00, 0x00, 0x00
46
};
47

    
48
/* ARP cache for the guest IP addresses (XXX: allow many entries) */
49
uint8_t client_ethaddr[6];
50
static struct in_addr client_ipaddr;
51

    
52
static const uint8_t zero_ethaddr[6] = { 0, 0, 0, 0, 0, 0 };
53

    
54
int slirp_restrict;
55
static int do_slowtimo;
56
int link_up;
57
struct timeval tt;
58
FILE *lfd;
59
struct ex_list *exec_list;
60

    
61
/* XXX: suppress those select globals */
62
fd_set *global_readfds, *global_writefds, *global_xfds;
63

    
64
char slirp_hostname[33];
65

    
66
#ifdef _WIN32
67

    
68
static int get_dns_addr(struct in_addr *pdns_addr)
69
{
70
    FIXED_INFO *FixedInfo=NULL;
71
    ULONG    BufLen;
72
    DWORD    ret;
73
    IP_ADDR_STRING *pIPAddr;
74
    struct in_addr tmp_addr;
75

    
76
    FixedInfo = (FIXED_INFO *)GlobalAlloc(GPTR, sizeof(FIXED_INFO));
77
    BufLen = sizeof(FIXED_INFO);
78

    
79
    if (ERROR_BUFFER_OVERFLOW == GetNetworkParams(FixedInfo, &BufLen)) {
80
        if (FixedInfo) {
81
            GlobalFree(FixedInfo);
82
            FixedInfo = NULL;
83
        }
84
        FixedInfo = GlobalAlloc(GPTR, BufLen);
85
    }
86

    
87
    if ((ret = GetNetworkParams(FixedInfo, &BufLen)) != ERROR_SUCCESS) {
88
        printf("GetNetworkParams failed. ret = %08x\n", (u_int)ret );
89
        if (FixedInfo) {
90
            GlobalFree(FixedInfo);
91
            FixedInfo = NULL;
92
        }
93
        return -1;
94
    }
95

    
96
    pIPAddr = &(FixedInfo->DnsServerList);
97
    inet_aton(pIPAddr->IpAddress.String, &tmp_addr);
98
    *pdns_addr = tmp_addr;
99
#if 0
100
    printf( "DNS Servers:\n" );
101
    printf( "DNS Addr:%s\n", pIPAddr->IpAddress.String );
102

103
    pIPAddr = FixedInfo -> DnsServerList.Next;
104
    while ( pIPAddr ) {
105
            printf( "DNS Addr:%s\n", pIPAddr ->IpAddress.String );
106
            pIPAddr = pIPAddr ->Next;
107
    }
108
#endif
109
    if (FixedInfo) {
110
        GlobalFree(FixedInfo);
111
        FixedInfo = NULL;
112
    }
113
    return 0;
114
}
115

    
116
#else
117

    
118
static int get_dns_addr(struct in_addr *pdns_addr)
119
{
120
    char buff[512];
121
    char buff2[257];
122
    FILE *f;
123
    int found = 0;
124
    struct in_addr tmp_addr;
125

    
126
    f = fopen("/etc/resolv.conf", "r");
127
    if (!f)
128
        return -1;
129

    
130
#ifdef DEBUG
131
    lprint("IP address of your DNS(s): ");
132
#endif
133
    while (fgets(buff, 512, f) != NULL) {
134
        if (sscanf(buff, "nameserver%*[ \t]%256s", buff2) == 1) {
135
            if (!inet_aton(buff2, &tmp_addr))
136
                continue;
137
            if (tmp_addr.s_addr == loopback_addr.s_addr)
138
                tmp_addr = our_addr;
139
            /* If it's the first one, set it to dns_addr */
140
            if (!found)
141
                *pdns_addr = tmp_addr;
142
#ifdef DEBUG
143
            else
144
                lprint(", ");
145
#endif
146
            if (++found > 3) {
147
#ifdef DEBUG
148
                lprint("(more)");
149
#endif
150
                break;
151
            }
152
#ifdef DEBUG
153
            else
154
                lprint("%s", inet_ntoa(tmp_addr));
155
#endif
156
        }
157
    }
158
    fclose(f);
159
    if (!found)
160
        return -1;
161
    return 0;
162
}
163

    
164
#endif
165

    
166
#ifdef _WIN32
167
static void slirp_cleanup(void)
168
{
169
    WSACleanup();
170
}
171
#endif
172

    
173
static void slirp_state_save(QEMUFile *f, void *opaque);
174
static int slirp_state_load(QEMUFile *f, void *opaque, int version_id);
175

    
176
void slirp_init(int restricted, struct in_addr vnetwork,
177
                struct in_addr vnetmask, struct in_addr vhost,
178
                const char *vhostname, const char *tftp_path,
179
                const char *bootfile, struct in_addr vdhcp_start,
180
                struct in_addr vnameserver)
181
{
182
    //    debug_init("/tmp/slirp.log", DEBUG_DEFAULT);
183

    
184
#ifdef _WIN32
185
    WSADATA Data;
186

    
187
    WSAStartup(MAKEWORD(2,0), &Data);
188
    atexit(slirp_cleanup);
189
#endif
190

    
191
    link_up = 1;
192
    slirp_restrict = restricted;
193

    
194
    if_init();
195
    ip_init();
196

    
197
    /* Initialise mbufs *after* setting the MTU */
198
    m_init();
199

    
200
    /* set default addresses */
201
    inet_aton("127.0.0.1", &loopback_addr);
202

    
203
    if (get_dns_addr(&dns_addr) < 0) {
204
        dns_addr = loopback_addr;
205
        fprintf (stderr, "Warning: No DNS servers found\n");
206
    }
207

    
208
    vnetwork_addr = vnetwork;
209
    vnetwork_mask = vnetmask;
210
    vhost_addr = vhost;
211
    if (vhostname) {
212
        pstrcpy(slirp_hostname, sizeof(slirp_hostname), vhostname);
213
    }
214
    qemu_free(tftp_prefix);
215
    tftp_prefix = NULL;
216
    if (tftp_path) {
217
        tftp_prefix = qemu_strdup(tftp_path);
218
    }
219
    qemu_free(bootp_filename);
220
    bootp_filename = NULL;
221
    if (bootfile) {
222
        bootp_filename = qemu_strdup(bootfile);
223
    }
224
    vdhcp_startaddr = vdhcp_start;
225
    vnameserver_addr = vnameserver;
226

    
227
    getouraddr();
228
    register_savevm("slirp", 0, 1, slirp_state_save, slirp_state_load, NULL);
229
}
230

    
231
#define CONN_CANFSEND(so) (((so)->so_state & (SS_FCANTSENDMORE|SS_ISFCONNECTED)) == SS_ISFCONNECTED)
232
#define CONN_CANFRCV(so) (((so)->so_state & (SS_FCANTRCVMORE|SS_ISFCONNECTED)) == SS_ISFCONNECTED)
233
#define UPD_NFDS(x) if (nfds < (x)) nfds = (x)
234

    
235
/*
236
 * curtime kept to an accuracy of 1ms
237
 */
238
#ifdef _WIN32
239
static void updtime(void)
240
{
241
    struct _timeb tb;
242

    
243
    _ftime(&tb);
244
    curtime = (u_int)tb.time * (u_int)1000;
245
    curtime += (u_int)tb.millitm;
246
}
247
#else
248
static void updtime(void)
249
{
250
        gettimeofday(&tt, NULL);
251

    
252
        curtime = (u_int)tt.tv_sec * (u_int)1000;
253
        curtime += (u_int)tt.tv_usec / (u_int)1000;
254

    
255
        if ((tt.tv_usec % 1000) >= 500)
256
           curtime++;
257
}
258
#endif
259

    
260
void slirp_select_fill(int *pnfds,
261
                       fd_set *readfds, fd_set *writefds, fd_set *xfds)
262
{
263
    struct socket *so, *so_next;
264
    struct timeval timeout;
265
    int nfds;
266
    int tmp_time;
267

    
268
    /* fail safe */
269
    global_readfds = NULL;
270
    global_writefds = NULL;
271
    global_xfds = NULL;
272

    
273
    nfds = *pnfds;
274
        /*
275
         * First, TCP sockets
276
         */
277
        do_slowtimo = 0;
278
        if (link_up) {
279
                /*
280
                 * *_slowtimo needs calling if there are IP fragments
281
                 * in the fragment queue, or there are TCP connections active
282
                 */
283
                do_slowtimo = ((tcb.so_next != &tcb) ||
284
                (&ipq.ip_link != ipq.ip_link.next));
285

    
286
                for (so = tcb.so_next; so != &tcb; so = so_next) {
287
                        so_next = so->so_next;
288

    
289
                        /*
290
                         * See if we need a tcp_fasttimo
291
                         */
292
                        if (time_fasttimo == 0 && so->so_tcpcb->t_flags & TF_DELACK)
293
                           time_fasttimo = curtime; /* Flag when we want a fasttimo */
294

    
295
                        /*
296
                         * NOFDREF can include still connecting to local-host,
297
                         * newly socreated() sockets etc. Don't want to select these.
298
                          */
299
                        if (so->so_state & SS_NOFDREF || so->s == -1)
300
                           continue;
301

    
302
                        /*
303
                         * Set for reading sockets which are accepting
304
                         */
305
                        if (so->so_state & SS_FACCEPTCONN) {
306
                                FD_SET(so->s, readfds);
307
                                UPD_NFDS(so->s);
308
                                continue;
309
                        }
310

    
311
                        /*
312
                         * Set for writing sockets which are connecting
313
                         */
314
                        if (so->so_state & SS_ISFCONNECTING) {
315
                                FD_SET(so->s, writefds);
316
                                UPD_NFDS(so->s);
317
                                continue;
318
                        }
319

    
320
                        /*
321
                         * Set for writing if we are connected, can send more, and
322
                         * we have something to send
323
                         */
324
                        if (CONN_CANFSEND(so) && so->so_rcv.sb_cc) {
325
                                FD_SET(so->s, writefds);
326
                                UPD_NFDS(so->s);
327
                        }
328

    
329
                        /*
330
                         * Set for reading (and urgent data) if we are connected, can
331
                         * receive more, and we have room for it XXX /2 ?
332
                         */
333
                        if (CONN_CANFRCV(so) && (so->so_snd.sb_cc < (so->so_snd.sb_datalen/2))) {
334
                                FD_SET(so->s, readfds);
335
                                FD_SET(so->s, xfds);
336
                                UPD_NFDS(so->s);
337
                        }
338
                }
339

    
340
                /*
341
                 * UDP sockets
342
                 */
343
                for (so = udb.so_next; so != &udb; so = so_next) {
344
                        so_next = so->so_next;
345

    
346
                        /*
347
                         * See if it's timed out
348
                         */
349
                        if (so->so_expire) {
350
                                if (so->so_expire <= curtime) {
351
                                        udp_detach(so);
352
                                        continue;
353
                                } else
354
                                        do_slowtimo = 1; /* Let socket expire */
355
                        }
356

    
357
                        /*
358
                         * When UDP packets are received from over the
359
                         * link, they're sendto()'d straight away, so
360
                         * no need for setting for writing
361
                         * Limit the number of packets queued by this session
362
                         * to 4.  Note that even though we try and limit this
363
                         * to 4 packets, the session could have more queued
364
                         * if the packets needed to be fragmented
365
                         * (XXX <= 4 ?)
366
                         */
367
                        if ((so->so_state & SS_ISFCONNECTED) && so->so_queued <= 4) {
368
                                FD_SET(so->s, readfds);
369
                                UPD_NFDS(so->s);
370
                        }
371
                }
372
        }
373

    
374
        /*
375
         * Setup timeout to use minimum CPU usage, especially when idle
376
         */
377

    
378
        /*
379
         * First, see the timeout needed by *timo
380
         */
381
        timeout.tv_sec = 0;
382
        timeout.tv_usec = -1;
383
        /*
384
         * If a slowtimo is needed, set timeout to 500ms from the last
385
         * slow timeout. If a fast timeout is needed, set timeout within
386
         * 200ms of when it was requested.
387
         */
388
        if (do_slowtimo) {
389
                /* XXX + 10000 because some select()'s aren't that accurate */
390
                timeout.tv_usec = ((500 - (curtime - last_slowtimo)) * 1000) + 10000;
391
                if (timeout.tv_usec < 0)
392
                   timeout.tv_usec = 0;
393
                else if (timeout.tv_usec > 510000)
394
                   timeout.tv_usec = 510000;
395

    
396
                /* Can only fasttimo if we also slowtimo */
397
                if (time_fasttimo) {
398
                        tmp_time = (200 - (curtime - time_fasttimo)) * 1000;
399
                        if (tmp_time < 0)
400
                           tmp_time = 0;
401

    
402
                        /* Choose the smallest of the 2 */
403
                        if (tmp_time < timeout.tv_usec)
404
                           timeout.tv_usec = (u_int)tmp_time;
405
                }
406
        }
407
        *pnfds = nfds;
408
}
409

    
410
void slirp_select_poll(fd_set *readfds, fd_set *writefds, fd_set *xfds)
411
{
412
    struct socket *so, *so_next;
413
    int ret;
414

    
415
    global_readfds = readfds;
416
    global_writefds = writefds;
417
    global_xfds = xfds;
418

    
419
        /* Update time */
420
        updtime();
421

    
422
        /*
423
         * See if anything has timed out
424
         */
425
        if (link_up) {
426
                if (time_fasttimo && ((curtime - time_fasttimo) >= 2)) {
427
                        tcp_fasttimo();
428
                        time_fasttimo = 0;
429
                }
430
                if (do_slowtimo && ((curtime - last_slowtimo) >= 499)) {
431
                        ip_slowtimo();
432
                        tcp_slowtimo();
433
                        last_slowtimo = curtime;
434
                }
435
        }
436

    
437
        /*
438
         * Check sockets
439
         */
440
        if (link_up) {
441
                /*
442
                 * Check TCP sockets
443
                 */
444
                for (so = tcb.so_next; so != &tcb; so = so_next) {
445
                        so_next = so->so_next;
446

    
447
                        /*
448
                         * FD_ISSET is meaningless on these sockets
449
                         * (and they can crash the program)
450
                         */
451
                        if (so->so_state & SS_NOFDREF || so->s == -1)
452
                           continue;
453

    
454
                        /*
455
                         * Check for URG data
456
                         * This will soread as well, so no need to
457
                         * test for readfds below if this succeeds
458
                         */
459
                        if (FD_ISSET(so->s, xfds))
460
                           sorecvoob(so);
461
                        /*
462
                         * Check sockets for reading
463
                         */
464
                        else if (FD_ISSET(so->s, readfds)) {
465
                                /*
466
                                 * Check for incoming connections
467
                                 */
468
                                if (so->so_state & SS_FACCEPTCONN) {
469
                                        tcp_connect(so);
470
                                        continue;
471
                                } /* else */
472
                                ret = soread(so);
473

    
474
                                /* Output it if we read something */
475
                                if (ret > 0)
476
                                   tcp_output(sototcpcb(so));
477
                        }
478

    
479
                        /*
480
                         * Check sockets for writing
481
                         */
482
                        if (FD_ISSET(so->s, writefds)) {
483
                          /*
484
                           * Check for non-blocking, still-connecting sockets
485
                           */
486
                          if (so->so_state & SS_ISFCONNECTING) {
487
                            /* Connected */
488
                            so->so_state &= ~SS_ISFCONNECTING;
489

    
490
                            ret = send(so->s, (const void *) &ret, 0, 0);
491
                            if (ret < 0) {
492
                              /* XXXXX Must fix, zero bytes is a NOP */
493
                              if (errno == EAGAIN || errno == EWOULDBLOCK ||
494
                                  errno == EINPROGRESS || errno == ENOTCONN)
495
                                continue;
496

    
497
                              /* else failed */
498
                              so->so_state &= SS_PERSISTENT_MASK;
499
                              so->so_state |= SS_NOFDREF;
500
                            }
501
                            /* else so->so_state &= ~SS_ISFCONNECTING; */
502

    
503
                            /*
504
                             * Continue tcp_input
505
                             */
506
                            tcp_input((struct mbuf *)NULL, sizeof(struct ip), so);
507
                            /* continue; */
508
                          } else
509
                            ret = sowrite(so);
510
                          /*
511
                           * XXXXX If we wrote something (a lot), there
512
                           * could be a need for a window update.
513
                           * In the worst case, the remote will send
514
                           * a window probe to get things going again
515
                           */
516
                        }
517

    
518
                        /*
519
                         * Probe a still-connecting, non-blocking socket
520
                         * to check if it's still alive
521
                           */
522
#ifdef PROBE_CONN
523
                        if (so->so_state & SS_ISFCONNECTING) {
524
                          ret = recv(so->s, (char *)&ret, 0,0);
525

    
526
                          if (ret < 0) {
527
                            /* XXX */
528
                            if (errno == EAGAIN || errno == EWOULDBLOCK ||
529
                                errno == EINPROGRESS || errno == ENOTCONN)
530
                              continue; /* Still connecting, continue */
531

    
532
                            /* else failed */
533
                            so->so_state &= SS_PERSISTENT_MASK;
534
                            so->so_state |= SS_NOFDREF;
535

    
536
                            /* tcp_input will take care of it */
537
                          } else {
538
                            ret = send(so->s, &ret, 0,0);
539
                            if (ret < 0) {
540
                              /* XXX */
541
                              if (errno == EAGAIN || errno == EWOULDBLOCK ||
542
                                  errno == EINPROGRESS || errno == ENOTCONN)
543
                                continue;
544
                              /* else failed */
545
                              so->so_state &= SS_PERSISTENT_MASK;
546
                              so->so_state |= SS_NOFDREF;
547
                            } else
548
                              so->so_state &= ~SS_ISFCONNECTING;
549

    
550
                          }
551
                          tcp_input((struct mbuf *)NULL, sizeof(struct ip),so);
552
                        } /* SS_ISFCONNECTING */
553
#endif
554
                }
555

    
556
                /*
557
                 * Now UDP sockets.
558
                 * Incoming packets are sent straight away, they're not buffered.
559
                 * Incoming UDP data isn't buffered either.
560
                 */
561
                for (so = udb.so_next; so != &udb; so = so_next) {
562
                        so_next = so->so_next;
563

    
564
                        if (so->s != -1 && FD_ISSET(so->s, readfds)) {
565
                            sorecvfrom(so);
566
                        }
567
                }
568
        }
569

    
570
        /*
571
         * See if we can start outputting
572
         */
573
        if (if_queued && link_up)
574
           if_start();
575

    
576
        /* clear global file descriptor sets.
577
         * these reside on the stack in vl.c
578
         * so they're unusable if we're not in
579
         * slirp_select_fill or slirp_select_poll.
580
         */
581
         global_readfds = NULL;
582
         global_writefds = NULL;
583
         global_xfds = NULL;
584
}
585

    
586
#define ETH_ALEN 6
587
#define ETH_HLEN 14
588

    
589
#define ETH_P_IP        0x0800                /* Internet Protocol packet        */
590
#define ETH_P_ARP        0x0806                /* Address Resolution packet        */
591

    
592
#define        ARPOP_REQUEST        1                /* ARP request                        */
593
#define        ARPOP_REPLY        2                /* ARP reply                        */
594

    
595
struct ethhdr
596
{
597
        unsigned char        h_dest[ETH_ALEN];        /* destination eth addr        */
598
        unsigned char        h_source[ETH_ALEN];        /* source ether addr        */
599
        unsigned short        h_proto;                /* packet type ID field        */
600
};
601

    
602
struct arphdr
603
{
604
        unsigned short        ar_hrd;                /* format of hardware address        */
605
        unsigned short        ar_pro;                /* format of protocol address        */
606
        unsigned char        ar_hln;                /* length of hardware address        */
607
        unsigned char        ar_pln;                /* length of protocol address        */
608
        unsigned short        ar_op;                /* ARP opcode (command)                */
609

    
610
         /*
611
          *         Ethernet looks like this : This bit is variable sized however...
612
          */
613
        unsigned char                ar_sha[ETH_ALEN];        /* sender hardware address        */
614
        uint32_t                ar_sip;                        /* sender IP address                */
615
        unsigned char                ar_tha[ETH_ALEN];        /* target hardware address        */
616
        uint32_t                ar_tip        ;                /* target IP address                */
617
} __attribute__((packed));
618

    
619
static void arp_input(const uint8_t *pkt, int pkt_len)
620
{
621
    struct ethhdr *eh = (struct ethhdr *)pkt;
622
    struct arphdr *ah = (struct arphdr *)(pkt + ETH_HLEN);
623
    uint8_t arp_reply[ETH_HLEN + sizeof(struct arphdr)];
624
    struct ethhdr *reh = (struct ethhdr *)arp_reply;
625
    struct arphdr *rah = (struct arphdr *)(arp_reply + ETH_HLEN);
626
    int ar_op;
627
    struct ex_list *ex_ptr;
628

    
629
    ar_op = ntohs(ah->ar_op);
630
    switch(ar_op) {
631
    case ARPOP_REQUEST:
632
        if ((ah->ar_tip & vnetwork_mask.s_addr) == vnetwork_addr.s_addr) {
633
            if (ah->ar_tip == vnameserver_addr.s_addr ||
634
                ah->ar_tip == vhost_addr.s_addr)
635
                goto arp_ok;
636
            for (ex_ptr = exec_list; ex_ptr; ex_ptr = ex_ptr->ex_next) {
637
                if (ex_ptr->ex_addr.s_addr == ah->ar_tip)
638
                    goto arp_ok;
639
            }
640
            return;
641
        arp_ok:
642
            /* XXX: make an ARP request to have the client address */
643
            memcpy(client_ethaddr, eh->h_source, ETH_ALEN);
644

    
645
            /* ARP request for alias/dns mac address */
646
            memcpy(reh->h_dest, pkt + ETH_ALEN, ETH_ALEN);
647
            memcpy(reh->h_source, special_ethaddr, ETH_ALEN - 4);
648
            memcpy(&reh->h_source[2], &ah->ar_tip, 4);
649
            reh->h_proto = htons(ETH_P_ARP);
650

    
651
            rah->ar_hrd = htons(1);
652
            rah->ar_pro = htons(ETH_P_IP);
653
            rah->ar_hln = ETH_ALEN;
654
            rah->ar_pln = 4;
655
            rah->ar_op = htons(ARPOP_REPLY);
656
            memcpy(rah->ar_sha, reh->h_source, ETH_ALEN);
657
            rah->ar_sip = ah->ar_tip;
658
            memcpy(rah->ar_tha, ah->ar_sha, ETH_ALEN);
659
            rah->ar_tip = ah->ar_sip;
660
            slirp_output(arp_reply, sizeof(arp_reply));
661
        }
662
        break;
663
    case ARPOP_REPLY:
664
        /* reply to request of client mac address ? */
665
        if (!memcmp(client_ethaddr, zero_ethaddr, ETH_ALEN) &&
666
            ah->ar_sip == client_ipaddr.s_addr) {
667
            memcpy(client_ethaddr, ah->ar_sha, ETH_ALEN);
668
        }
669
        break;
670
    default:
671
        break;
672
    }
673
}
674

    
675
void slirp_input(const uint8_t *pkt, int pkt_len)
676
{
677
    struct mbuf *m;
678
    int proto;
679

    
680
    if (pkt_len < ETH_HLEN)
681
        return;
682

    
683
    proto = ntohs(*(uint16_t *)(pkt + 12));
684
    switch(proto) {
685
    case ETH_P_ARP:
686
        arp_input(pkt, pkt_len);
687
        break;
688
    case ETH_P_IP:
689
        m = m_get();
690
        if (!m)
691
            return;
692
        /* Note: we add to align the IP header */
693
        if (M_FREEROOM(m) < pkt_len + 2) {
694
            m_inc(m, pkt_len + 2);
695
        }
696
        m->m_len = pkt_len + 2;
697
        memcpy(m->m_data + 2, pkt, pkt_len);
698

    
699
        m->m_data += 2 + ETH_HLEN;
700
        m->m_len -= 2 + ETH_HLEN;
701

    
702
        ip_input(m);
703
        break;
704
    default:
705
        break;
706
    }
707
}
708

    
709
/* output the IP packet to the ethernet device */
710
void if_encap(const uint8_t *ip_data, int ip_data_len)
711
{
712
    uint8_t buf[1600];
713
    struct ethhdr *eh = (struct ethhdr *)buf;
714

    
715
    if (ip_data_len + ETH_HLEN > sizeof(buf))
716
        return;
717
    
718
    if (!memcmp(client_ethaddr, zero_ethaddr, ETH_ALEN)) {
719
        uint8_t arp_req[ETH_HLEN + sizeof(struct arphdr)];
720
        struct ethhdr *reh = (struct ethhdr *)arp_req;
721
        struct arphdr *rah = (struct arphdr *)(arp_req + ETH_HLEN);
722
        const struct ip *iph = (const struct ip *)ip_data;
723

    
724
        /* If the client addr is not known, there is no point in
725
           sending the packet to it. Normally the sender should have
726
           done an ARP request to get its MAC address. Here we do it
727
           in place of sending the packet and we hope that the sender
728
           will retry sending its packet. */
729
        memset(reh->h_dest, 0xff, ETH_ALEN);
730
        memcpy(reh->h_source, special_ethaddr, ETH_ALEN - 4);
731
        memcpy(&reh->h_source[2], &vhost_addr, 4);
732
        reh->h_proto = htons(ETH_P_ARP);
733
        rah->ar_hrd = htons(1);
734
        rah->ar_pro = htons(ETH_P_IP);
735
        rah->ar_hln = ETH_ALEN;
736
        rah->ar_pln = 4;
737
        rah->ar_op = htons(ARPOP_REQUEST);
738
        /* source hw addr */
739
        memcpy(rah->ar_sha, special_ethaddr, ETH_ALEN - 4);
740
        memcpy(&rah->ar_sha[2], &vhost_addr, 4);
741
        /* source IP */
742
        rah->ar_sip = vhost_addr.s_addr;
743
        /* target hw addr (none) */
744
        memset(rah->ar_tha, 0, ETH_ALEN);
745
        /* target IP */
746
        rah->ar_tip = iph->ip_dst.s_addr;
747
        client_ipaddr = iph->ip_dst;
748
        slirp_output(arp_req, sizeof(arp_req));
749
    } else {
750
        memcpy(eh->h_dest, client_ethaddr, ETH_ALEN);
751
        memcpy(eh->h_source, special_ethaddr, ETH_ALEN - 4);
752
        /* XXX: not correct */
753
        memcpy(&eh->h_source[2], &vhost_addr, 4);
754
        eh->h_proto = htons(ETH_P_IP);
755
        memcpy(buf + sizeof(struct ethhdr), ip_data, ip_data_len);
756
        slirp_output(buf, ip_data_len + ETH_HLEN);
757
    }
758
}
759

    
760
/* Unlistens a redirection
761
 *
762
 * Return value: number of redirs removed */
763
int slirp_remove_hostfwd(int is_udp, struct in_addr host_addr, int host_port)
764
{
765
    struct socket *so;
766
    struct socket *head = (is_udp ? &udb : &tcb);
767
    struct sockaddr_in addr;
768
    int port = htons(host_port);
769
    socklen_t addr_len;
770
    int n = 0;
771

    
772
 loop_again:
773
    for (so = head->so_next; so != head; so = so->so_next) {
774
        addr_len = sizeof(addr);
775
        if (getsockname(so->s, (struct sockaddr *)&addr, &addr_len) == 0 &&
776
            addr.sin_addr.s_addr == host_addr.s_addr &&
777
            addr.sin_port == port) {
778
            close(so->s);
779
            sofree(so);
780
            n++;
781
            goto loop_again;
782
        }
783
    }
784

    
785
    return n;
786
}
787

    
788
int slirp_add_hostfwd(int is_udp, struct in_addr host_addr, int host_port,
789
                      struct in_addr guest_addr, int guest_port)
790
{
791
    if (!guest_addr.s_addr) {
792
        guest_addr = vdhcp_startaddr;
793
    }
794
    if (is_udp) {
795
        if (!udp_listen(host_addr.s_addr, htons(host_port), guest_addr.s_addr,
796
                        htons(guest_port), 0))
797
            return -1;
798
    } else {
799
        if (!tcp_listen(host_addr.s_addr, htons(host_port), guest_addr.s_addr,
800
                        htons(guest_port), 0))
801
            return -1;
802
    }
803
    return 0;
804
}
805

    
806
int slirp_add_exec(int do_pty, const void *args, struct in_addr guest_addr,
807
                   int guest_port)
808
{
809
    if (!guest_addr.s_addr) {
810
        guest_addr.s_addr =
811
            vnetwork_addr.s_addr | (htonl(0x0204) & ~vnetwork_mask.s_addr);
812
    }
813
    if ((guest_addr.s_addr & vnetwork_mask.s_addr) != vnetwork_addr.s_addr ||
814
        guest_addr.s_addr == vhost_addr.s_addr ||
815
        guest_addr.s_addr == vnameserver_addr.s_addr) {
816
        return -1;
817
    }
818
    return add_exec(&exec_list, do_pty, (char *)args, guest_addr,
819
                    htons(guest_port));
820
}
821

    
822
ssize_t slirp_send(struct socket *so, const void *buf, size_t len, int flags)
823
{
824
        if (so->s == -1 && so->extra) {
825
                qemu_chr_write(so->extra, buf, len);
826
                return len;
827
        }
828

    
829
        return send(so->s, buf, len, flags);
830
}
831

    
832
static struct socket *
833
slirp_find_ctl_socket(struct in_addr guest_addr, int guest_port)
834
{
835
    struct socket *so;
836

    
837
    for (so = tcb.so_next; so != &tcb; so = so->so_next) {
838
        if (so->so_faddr.s_addr == guest_addr.s_addr &&
839
            htons(so->so_fport) == guest_port) {
840
            return so;
841
        }
842
    }
843
    return NULL;
844
}
845

    
846
size_t slirp_socket_can_recv(struct in_addr guest_addr, int guest_port)
847
{
848
        struct iovec iov[2];
849
        struct socket *so;
850

    
851
    if (!link_up)
852
        return 0;
853

    
854
        so = slirp_find_ctl_socket(guest_addr, guest_port);
855

    
856
        if (!so || so->so_state & SS_NOFDREF)
857
                return 0;
858

    
859
        if (!CONN_CANFRCV(so) || so->so_snd.sb_cc >= (so->so_snd.sb_datalen/2))
860
                return 0;
861

    
862
        return sopreprbuf(so, iov, NULL);
863
}
864

    
865
void slirp_socket_recv(struct in_addr guest_addr, int guest_port,
866
                       const uint8_t *buf, int size)
867
{
868
    int ret;
869
    struct socket *so = slirp_find_ctl_socket(guest_addr, guest_port);
870

    
871
    if (!so)
872
        return;
873

    
874
    ret = soreadbuf(so, (const char *)buf, size);
875

    
876
    if (ret > 0)
877
        tcp_output(sototcpcb(so));
878
}
879

    
880
static void slirp_tcp_save(QEMUFile *f, struct tcpcb *tp)
881
{
882
    int i;
883

    
884
    qemu_put_sbe16(f, tp->t_state);
885
    for (i = 0; i < TCPT_NTIMERS; i++)
886
        qemu_put_sbe16(f, tp->t_timer[i]);
887
    qemu_put_sbe16(f, tp->t_rxtshift);
888
    qemu_put_sbe16(f, tp->t_rxtcur);
889
    qemu_put_sbe16(f, tp->t_dupacks);
890
    qemu_put_be16(f, tp->t_maxseg);
891
    qemu_put_sbyte(f, tp->t_force);
892
    qemu_put_be16(f, tp->t_flags);
893
    qemu_put_be32(f, tp->snd_una);
894
    qemu_put_be32(f, tp->snd_nxt);
895
    qemu_put_be32(f, tp->snd_up);
896
    qemu_put_be32(f, tp->snd_wl1);
897
    qemu_put_be32(f, tp->snd_wl2);
898
    qemu_put_be32(f, tp->iss);
899
    qemu_put_be32(f, tp->snd_wnd);
900
    qemu_put_be32(f, tp->rcv_wnd);
901
    qemu_put_be32(f, tp->rcv_nxt);
902
    qemu_put_be32(f, tp->rcv_up);
903
    qemu_put_be32(f, tp->irs);
904
    qemu_put_be32(f, tp->rcv_adv);
905
    qemu_put_be32(f, tp->snd_max);
906
    qemu_put_be32(f, tp->snd_cwnd);
907
    qemu_put_be32(f, tp->snd_ssthresh);
908
    qemu_put_sbe16(f, tp->t_idle);
909
    qemu_put_sbe16(f, tp->t_rtt);
910
    qemu_put_be32(f, tp->t_rtseq);
911
    qemu_put_sbe16(f, tp->t_srtt);
912
    qemu_put_sbe16(f, tp->t_rttvar);
913
    qemu_put_be16(f, tp->t_rttmin);
914
    qemu_put_be32(f, tp->max_sndwnd);
915
    qemu_put_byte(f, tp->t_oobflags);
916
    qemu_put_byte(f, tp->t_iobc);
917
    qemu_put_sbe16(f, tp->t_softerror);
918
    qemu_put_byte(f, tp->snd_scale);
919
    qemu_put_byte(f, tp->rcv_scale);
920
    qemu_put_byte(f, tp->request_r_scale);
921
    qemu_put_byte(f, tp->requested_s_scale);
922
    qemu_put_be32(f, tp->ts_recent);
923
    qemu_put_be32(f, tp->ts_recent_age);
924
    qemu_put_be32(f, tp->last_ack_sent);
925
}
926

    
927
static void slirp_sbuf_save(QEMUFile *f, struct sbuf *sbuf)
928
{
929
    uint32_t off;
930

    
931
    qemu_put_be32(f, sbuf->sb_cc);
932
    qemu_put_be32(f, sbuf->sb_datalen);
933
    off = (uint32_t)(sbuf->sb_wptr - sbuf->sb_data);
934
    qemu_put_sbe32(f, off);
935
    off = (uint32_t)(sbuf->sb_rptr - sbuf->sb_data);
936
    qemu_put_sbe32(f, off);
937
    qemu_put_buffer(f, (unsigned char*)sbuf->sb_data, sbuf->sb_datalen);
938
}
939

    
940
static void slirp_socket_save(QEMUFile *f, struct socket *so)
941
{
942
    qemu_put_be32(f, so->so_urgc);
943
    qemu_put_be32(f, so->so_faddr.s_addr);
944
    qemu_put_be32(f, so->so_laddr.s_addr);
945
    qemu_put_be16(f, so->so_fport);
946
    qemu_put_be16(f, so->so_lport);
947
    qemu_put_byte(f, so->so_iptos);
948
    qemu_put_byte(f, so->so_emu);
949
    qemu_put_byte(f, so->so_type);
950
    qemu_put_be32(f, so->so_state);
951
    slirp_sbuf_save(f, &so->so_rcv);
952
    slirp_sbuf_save(f, &so->so_snd);
953
    slirp_tcp_save(f, so->so_tcpcb);
954
}
955

    
956
static void slirp_state_save(QEMUFile *f, void *opaque)
957
{
958
    struct ex_list *ex_ptr;
959

    
960
    for (ex_ptr = exec_list; ex_ptr; ex_ptr = ex_ptr->ex_next)
961
        if (ex_ptr->ex_pty == 3) {
962
            struct socket *so;
963
            so = slirp_find_ctl_socket(ex_ptr->ex_addr, ntohs(ex_ptr->ex_fport));
964
            if (!so)
965
                continue;
966

    
967
            qemu_put_byte(f, 42);
968
            slirp_socket_save(f, so);
969
        }
970
    qemu_put_byte(f, 0);
971
}
972

    
973
static void slirp_tcp_load(QEMUFile *f, struct tcpcb *tp)
974
{
975
    int i;
976

    
977
    tp->t_state = qemu_get_sbe16(f);
978
    for (i = 0; i < TCPT_NTIMERS; i++)
979
        tp->t_timer[i] = qemu_get_sbe16(f);
980
    tp->t_rxtshift = qemu_get_sbe16(f);
981
    tp->t_rxtcur = qemu_get_sbe16(f);
982
    tp->t_dupacks = qemu_get_sbe16(f);
983
    tp->t_maxseg = qemu_get_be16(f);
984
    tp->t_force = qemu_get_sbyte(f);
985
    tp->t_flags = qemu_get_be16(f);
986
    tp->snd_una = qemu_get_be32(f);
987
    tp->snd_nxt = qemu_get_be32(f);
988
    tp->snd_up = qemu_get_be32(f);
989
    tp->snd_wl1 = qemu_get_be32(f);
990
    tp->snd_wl2 = qemu_get_be32(f);
991
    tp->iss = qemu_get_be32(f);
992
    tp->snd_wnd = qemu_get_be32(f);
993
    tp->rcv_wnd = qemu_get_be32(f);
994
    tp->rcv_nxt = qemu_get_be32(f);
995
    tp->rcv_up = qemu_get_be32(f);
996
    tp->irs = qemu_get_be32(f);
997
    tp->rcv_adv = qemu_get_be32(f);
998
    tp->snd_max = qemu_get_be32(f);
999
    tp->snd_cwnd = qemu_get_be32(f);
1000
    tp->snd_ssthresh = qemu_get_be32(f);
1001
    tp->t_idle = qemu_get_sbe16(f);
1002
    tp->t_rtt = qemu_get_sbe16(f);
1003
    tp->t_rtseq = qemu_get_be32(f);
1004
    tp->t_srtt = qemu_get_sbe16(f);
1005
    tp->t_rttvar = qemu_get_sbe16(f);
1006
    tp->t_rttmin = qemu_get_be16(f);
1007
    tp->max_sndwnd = qemu_get_be32(f);
1008
    tp->t_oobflags = qemu_get_byte(f);
1009
    tp->t_iobc = qemu_get_byte(f);
1010
    tp->t_softerror = qemu_get_sbe16(f);
1011
    tp->snd_scale = qemu_get_byte(f);
1012
    tp->rcv_scale = qemu_get_byte(f);
1013
    tp->request_r_scale = qemu_get_byte(f);
1014
    tp->requested_s_scale = qemu_get_byte(f);
1015
    tp->ts_recent = qemu_get_be32(f);
1016
    tp->ts_recent_age = qemu_get_be32(f);
1017
    tp->last_ack_sent = qemu_get_be32(f);
1018
    tcp_template(tp);
1019
}
1020

    
1021
static int slirp_sbuf_load(QEMUFile *f, struct sbuf *sbuf)
1022
{
1023
    uint32_t off, sb_cc, sb_datalen;
1024

    
1025
    sb_cc = qemu_get_be32(f);
1026
    sb_datalen = qemu_get_be32(f);
1027

    
1028
    sbreserve(sbuf, sb_datalen);
1029

    
1030
    if (sbuf->sb_datalen != sb_datalen)
1031
        return -ENOMEM;
1032

    
1033
    sbuf->sb_cc = sb_cc;
1034

    
1035
    off = qemu_get_sbe32(f);
1036
    sbuf->sb_wptr = sbuf->sb_data + off;
1037
    off = qemu_get_sbe32(f);
1038
    sbuf->sb_rptr = sbuf->sb_data + off;
1039
    qemu_get_buffer(f, (unsigned char*)sbuf->sb_data, sbuf->sb_datalen);
1040

    
1041
    return 0;
1042
}
1043

    
1044
static int slirp_socket_load(QEMUFile *f, struct socket *so)
1045
{
1046
    if (tcp_attach(so) < 0)
1047
        return -ENOMEM;
1048

    
1049
    so->so_urgc = qemu_get_be32(f);
1050
    so->so_faddr.s_addr = qemu_get_be32(f);
1051
    so->so_laddr.s_addr = qemu_get_be32(f);
1052
    so->so_fport = qemu_get_be16(f);
1053
    so->so_lport = qemu_get_be16(f);
1054
    so->so_iptos = qemu_get_byte(f);
1055
    so->so_emu = qemu_get_byte(f);
1056
    so->so_type = qemu_get_byte(f);
1057
    so->so_state = qemu_get_be32(f);
1058
    if (slirp_sbuf_load(f, &so->so_rcv) < 0)
1059
        return -ENOMEM;
1060
    if (slirp_sbuf_load(f, &so->so_snd) < 0)
1061
        return -ENOMEM;
1062
    slirp_tcp_load(f, so->so_tcpcb);
1063

    
1064
    return 0;
1065
}
1066

    
1067
static int slirp_state_load(QEMUFile *f, void *opaque, int version_id)
1068
{
1069
    struct ex_list *ex_ptr;
1070
    int r;
1071

    
1072
    while ((r = qemu_get_byte(f))) {
1073
        int ret;
1074
        struct socket *so = socreate();
1075

    
1076
        if (!so)
1077
            return -ENOMEM;
1078

    
1079
        ret = slirp_socket_load(f, so);
1080

    
1081
        if (ret < 0)
1082
            return ret;
1083

    
1084
        if ((so->so_faddr.s_addr & vnetwork_mask.s_addr) !=
1085
            vnetwork_addr.s_addr) {
1086
            return -EINVAL;
1087
        }
1088
        for (ex_ptr = exec_list; ex_ptr; ex_ptr = ex_ptr->ex_next) {
1089
            if (ex_ptr->ex_pty == 3 &&
1090
                so->so_faddr.s_addr == ex_ptr->ex_addr.s_addr &&
1091
                so->so_fport == ex_ptr->ex_fport) {
1092
                break;
1093
            }
1094
        }
1095
        if (!ex_ptr)
1096
            return -EINVAL;
1097

    
1098
        so->extra = (void *)ex_ptr->ex_exec;
1099
    }
1100

    
1101
    return 0;
1102
}