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 "sysemu/char.h" 26 #include "slirp.h" 27 #include "proxy_common.h" 28 #include "hw/hw.h" 29 30 #include "android/utils/debug.h" /* for dprint */ 31 #include "android/utils/bufprint.h" 32 #include "android/android.h" 33 #include "android/sockets.h" 34 35 #include "qemu/queue.h" 36 37 /* proto types */ 38 static void slirp_net_forward_init(void); 39 40 41 #define D(...) VERBOSE_PRINT(slirp,__VA_ARGS__) 42 #define DN(...) do { if (VERBOSE_CHECK(slirp)) dprintn(__VA_ARGS__); } while (0) 43 44 /* host address */ 45 uint32_t our_addr_ip; 46 /* host dns address */ 47 uint32_t dns_addr[DNS_ADDR_MAX]; 48 int dns_addr_count; 49 50 /* host loopback address */ 51 uint32_t loopback_addr_ip; 52 53 /* address for slirp virtual addresses */ 54 uint32_t special_addr_ip; 55 56 /* virtual address alias for host */ 57 uint32_t alias_addr_ip; 58 59 static const uint8_t special_ethaddr[6] = { 60 0x52, 0x54, 0x00, 0x12, 0x35, 0x00 61 }; 62 63 /* ARP cache for the guest IP addresses (XXX: allow many entries) */ 64 uint8_t client_ethaddr[6]; 65 static ipaddr_t client_ip; 66 67 static const uint8_t zero_ethaddr[6] = { 0, 0, 0, 0, 0, 0 }; 68 69 const char *slirp_special_ip = CTL_SPECIAL; 70 int slirp_restrict; 71 static int do_slowtimo; 72 int link_up; 73 struct timeval tt; 74 FILE *lfd; 75 struct ex_list *exec_list; 76 77 /* XXX: suppress those select globals */ 78 fd_set *global_readfds, *global_writefds, *global_xfds; 79 80 char slirp_hostname[33]; 81 82 int slirp_add_dns_server(const SockAddress* new_dns_addr) 83 { 84 int dns_ip; 85 86 if (dns_addr_count >= DNS_ADDR_MAX) 87 return -1; 88 89 dns_ip = sock_address_get_ip(new_dns_addr); 90 if (dns_ip == -1) 91 return -1; 92 93 dns_addr[dns_addr_count++] = dns_ip; 94 return 0; 95 } 96 97 98 #ifdef _WIN32 99 100 int slirp_get_system_dns_servers(void) 101 { 102 FIXED_INFO *FixedInfo=NULL; 103 ULONG BufLen; 104 DWORD ret; 105 IP_ADDR_STRING *pIPAddr; 106 107 if (dns_addr_count > 0) 108 return dns_addr_count; 109 110 FixedInfo = (FIXED_INFO *)GlobalAlloc(GPTR, sizeof(FIXED_INFO)); 111 BufLen = sizeof(FIXED_INFO); 112 113 if (ERROR_BUFFER_OVERFLOW == GetNetworkParams(FixedInfo, &BufLen)) { 114 if (FixedInfo) { 115 GlobalFree(FixedInfo); 116 FixedInfo = NULL; 117 } 118 FixedInfo = GlobalAlloc(GPTR, BufLen); 119 } 120 121 if ((ret = GetNetworkParams(FixedInfo, &BufLen)) != ERROR_SUCCESS) { 122 printf("GetNetworkParams failed. ret = %08x\n", (u_int)ret ); 123 if (FixedInfo) { 124 GlobalFree(FixedInfo); 125 FixedInfo = NULL; 126 } 127 return -1; 128 } 129 130 D( "DNS Servers:"); 131 pIPAddr = &(FixedInfo->DnsServerList); 132 while (pIPAddr && dns_addr_count < DNS_ADDR_MAX) { 133 uint32_t ip; 134 D( " %s", pIPAddr->IpAddress.String ); 135 if (inet_strtoip(pIPAddr->IpAddress.String, &ip) == 0) { 136 if (ip == loopback_addr_ip) 137 ip = our_addr_ip; 138 if (dns_addr_count < DNS_ADDR_MAX) 139 dns_addr[dns_addr_count++] = ip; 140 } 141 pIPAddr = pIPAddr->Next; 142 } 143 144 if (FixedInfo) { 145 GlobalFree(FixedInfo); 146 FixedInfo = NULL; 147 } 148 if (dns_addr_count <= 0) 149 return -1; 150 151 return dns_addr_count; 152 } 153 154 #else 155 156 int slirp_get_system_dns_servers(void) 157 { 158 char buff[512]; 159 char buff2[257]; 160 FILE *f; 161 162 if (dns_addr_count > 0) 163 return dns_addr_count; 164 165 #ifdef CONFIG_DARWIN 166 /* on Darwin /etc/resolv.conf is a symlink to /private/var/run/resolv.conf 167 * in some siutations, the symlink can be destroyed and the system will not 168 * re-create it. Darwin-aware applications will continue to run, but "legacy" 169 * Unix ones will not. 170 */ 171 f = fopen("/private/var/run/resolv.conf", "r"); 172 if (!f) 173 f = fopen("/etc/resolv.conf", "r"); /* desperate attempt to sanity */ 174 #else 175 f = fopen("/etc/resolv.conf", "r"); 176 #endif 177 if (!f) 178 return -1; 179 180 DN("emulator: IP address of your DNS(s): "); 181 while (fgets(buff, 512, f) != NULL) { 182 if (sscanf(buff, "nameserver%*[ \t]%256s", buff2) == 1) { 183 uint32_t tmp_ip; 184 185 if (inet_strtoip(buff2, &tmp_ip) < 0) 186 continue; 187 if (tmp_ip == loopback_addr_ip) 188 tmp_ip = our_addr_ip; 189 if (dns_addr_count < DNS_ADDR_MAX) { 190 dns_addr[dns_addr_count++] = tmp_ip; 191 if (dns_addr_count > 1) 192 DN(", "); 193 DN("%s", inet_iptostr(tmp_ip)); 194 } else { 195 DN("(more)"); 196 break; 197 } 198 } 199 } 200 DN("\n"); 201 fclose(f); 202 203 if (!dns_addr_count) 204 return -1; 205 206 return dns_addr_count; 207 } 208 209 #endif 210 211 static void slirp_state_save(QEMUFile *f, void *opaque); 212 static int slirp_state_load(QEMUFile *f, void *opaque, int version_id); 213 214 void slirp_init(int restricted, const char *special_ip) 215 { 216 #if DEBUG 217 int slirp_logmask = 0; 218 char slirp_logfile[512]; 219 { 220 const char* env = getenv( "ANDROID_SLIRP_LOGMASK" ); 221 if (env != NULL) 222 slirp_logmask = atoi(env); 223 else if (VERBOSE_CHECK(slirp)) 224 slirp_logmask = DEBUG_DEFAULT; 225 } 226 227 { 228 char* p = slirp_logfile; 229 char* end = p + sizeof(slirp_logfile); 230 231 p = bufprint_temp_file( p, end, "slirp.log" ); 232 if (p >= end) { 233 dprint( "cannot create slirp log file in temporary directory" ); 234 slirp_logmask = 0; 235 } 236 } 237 if (slirp_logmask) { 238 dprint( "sending slirp logs with mask %x to %s", slirp_logmask, slirp_logfile ); 239 debug_init( slirp_logfile, slirp_logmask ); 240 } 241 #endif 242 243 link_up = 1; 244 slirp_restrict = restricted; 245 246 if_init(); 247 ip_init(); 248 249 /* Initialise mbufs *after* setting the MTU */ 250 m_init(); 251 252 /* set default addresses */ 253 inet_strtoip("127.0.0.1", &loopback_addr_ip); 254 255 if (dns_addr_count == 0) { 256 if (slirp_get_system_dns_servers() < 0) { 257 dns_addr[0] = loopback_addr_ip; 258 dns_addr_count = 1; 259 fprintf (stderr, "Warning: No DNS servers found\n"); 260 } 261 } 262 263 inet_strtoip(CTL_SPECIAL, &special_addr_ip); 264 265 alias_addr_ip = special_addr_ip | CTL_ALIAS; 266 getouraddr(); 267 register_savevm(NULL, "slirp", 0, 1, slirp_state_save, slirp_state_load, NULL); 268 269 slirp_net_forward_init(); 270 } 271 272 #define CONN_CANFSEND(so) (((so)->so_state & (SS_FCANTSENDMORE|SS_ISFCONNECTED)) == SS_ISFCONNECTED) 273 #define CONN_CANFRCV(so) (((so)->so_state & (SS_FCANTRCVMORE|SS_ISFCONNECTED)) == SS_ISFCONNECTED) 274 #define UPD_NFDS(x) if (nfds < (x)) nfds = (x) 275 276 /* 277 * curtime kept to an accuracy of 1ms 278 */ 279 #ifdef _WIN32 280 static void updtime(void) 281 { 282 struct _timeb tb; 283 284 _ftime(&tb); 285 curtime = (u_int)tb.time * (u_int)1000; 286 curtime += (u_int)tb.millitm; 287 } 288 #else 289 static void updtime(void) 290 { 291 gettimeofday(&tt, NULL); 292 293 curtime = (u_int)tt.tv_sec * (u_int)1000; 294 curtime += (u_int)tt.tv_usec / (u_int)1000; 295 296 if ((tt.tv_usec % 1000) >= 500) 297 curtime++; 298 } 299 #endif 300 301 void slirp_select_fill(int *pnfds, 302 fd_set *readfds, fd_set *writefds, fd_set *xfds) 303 { 304 struct socket *so, *so_next; 305 struct timeval timeout; 306 int nfds; 307 int tmp_time; 308 309 /* fail safe */ 310 global_readfds = NULL; 311 global_writefds = NULL; 312 global_xfds = NULL; 313 314 nfds = *pnfds; 315 /* 316 * First, TCP sockets 317 */ 318 do_slowtimo = 0; 319 if (link_up) { 320 /* 321 * *_slowtimo needs calling if there are IP fragments 322 * in the fragment queue, or there are TCP connections active 323 */ 324 do_slowtimo = ((tcb.so_next != &tcb) || 325 (&ipq.ip_link != ipq.ip_link.next)); 326 327 for (so = tcb.so_next; so != &tcb; so = so_next) { 328 so_next = so->so_next; 329 330 /* 331 * See if we need a tcp_fasttimo 332 */ 333 if (time_fasttimo == 0 && so->so_tcpcb->t_flags & TF_DELACK) 334 time_fasttimo = curtime; /* Flag when we want a fasttimo */ 335 336 /* 337 * NOFDREF can include still connecting to local-host, 338 * newly socreated() sockets etc. Don't want to select these. 339 */ 340 if (so->so_state & SS_NOFDREF || so->s == -1) 341 continue; 342 343 /* 344 * don't register proxified socked connections here 345 */ 346 if ((so->so_state & SS_PROXIFIED) != 0) 347 continue; 348 349 /* 350 * Set for reading sockets which are accepting 351 */ 352 if (so->so_state & SS_FACCEPTCONN) { 353 FD_SET(so->s, readfds); 354 UPD_NFDS(so->s); 355 continue; 356 } 357 358 /* 359 * Set for writing sockets which are connecting 360 */ 361 if (so->so_state & SS_ISFCONNECTING) { 362 FD_SET(so->s, writefds); 363 UPD_NFDS(so->s); 364 continue; 365 } 366 367 /* 368 * Set for writing if we are connected, can send more, and 369 * we have something to send 370 */ 371 if (CONN_CANFSEND(so) && so->so_rcv.sb_cc) { 372 FD_SET(so->s, writefds); 373 UPD_NFDS(so->s); 374 } 375 376 /* 377 * Set for reading (and urgent data) if we are connected, can 378 * receive more, and we have room for it XXX /2 ? 379 */ 380 if (CONN_CANFRCV(so) && (so->so_snd.sb_cc < (so->so_snd.sb_datalen/2))) { 381 FD_SET(so->s, readfds); 382 FD_SET(so->s, xfds); 383 UPD_NFDS(so->s); 384 } 385 } 386 387 /* 388 * UDP sockets 389 */ 390 for (so = udb.so_next; so != &udb; so = so_next) { 391 so_next = so->so_next; 392 393 if ((so->so_state & SS_PROXIFIED) != 0) 394 continue; 395 396 /* 397 * See if it's timed out 398 */ 399 if (so->so_expire) { 400 if (so->so_expire <= curtime) { 401 udp_detach(so); 402 continue; 403 } else 404 do_slowtimo = 1; /* Let socket expire */ 405 } 406 407 /* 408 * When UDP packets are received from over the 409 * link, they're sendto()'d straight away, so 410 * no need for setting for writing 411 * Limit the number of packets queued by this session 412 * to 4. Note that even though we try and limit this 413 * to 4 packets, the session could have more queued 414 * if the packets needed to be fragmented 415 * (XXX <= 4 ?) 416 */ 417 if ((so->so_state & SS_ISFCONNECTED) && so->so_queued <= 4) { 418 FD_SET(so->s, readfds); 419 UPD_NFDS(so->s); 420 } 421 } 422 } 423 424 /* 425 * Setup timeout to use minimum CPU usage, especially when idle 426 */ 427 428 /* 429 * First, see the timeout needed by *timo 430 */ 431 timeout.tv_sec = 0; 432 timeout.tv_usec = -1; 433 /* 434 * If a slowtimo is needed, set timeout to 500ms from the last 435 * slow timeout. If a fast timeout is needed, set timeout within 436 * 200ms of when it was requested. 437 */ 438 if (do_slowtimo) { 439 /* XXX + 10000 because some select()'s aren't that accurate */ 440 timeout.tv_usec = ((500 - (curtime - last_slowtimo)) * 1000) + 10000; 441 if (timeout.tv_usec < 0) 442 timeout.tv_usec = 0; 443 else if (timeout.tv_usec > 510000) 444 timeout.tv_usec = 510000; 445 446 /* Can only fasttimo if we also slowtimo */ 447 if (time_fasttimo) { 448 tmp_time = (200 - (curtime - time_fasttimo)) * 1000; 449 if (tmp_time < 0) 450 tmp_time = 0; 451 452 /* Choose the smallest of the 2 */ 453 if (tmp_time < timeout.tv_usec) 454 timeout.tv_usec = (u_int)tmp_time; 455 } 456 } 457 /* 458 * now, the proxified sockets 459 */ 460 proxy_manager_select_fill(&nfds, readfds, writefds, xfds); 461 462 *pnfds = nfds; 463 } 464 465 void slirp_select_poll(fd_set *readfds, fd_set *writefds, fd_set *xfds) 466 { 467 struct socket *so, *so_next; 468 int ret; 469 470 global_readfds = readfds; 471 global_writefds = writefds; 472 global_xfds = xfds; 473 474 /* Update time */ 475 updtime(); 476 477 /* 478 * See if anything has timed out 479 */ 480 if (link_up) { 481 if (time_fasttimo && ((curtime - time_fasttimo) >= 2)) { 482 tcp_fasttimo(); 483 time_fasttimo = 0; 484 } 485 if (do_slowtimo && ((curtime - last_slowtimo) >= 499)) { 486 ip_slowtimo(); 487 tcp_slowtimo(); 488 last_slowtimo = curtime; 489 } 490 } 491 492 /* 493 * Check sockets 494 */ 495 if (link_up) { 496 /* 497 * Check TCP sockets 498 */ 499 for (so = tcb.so_next; so != &tcb; so = so_next) { 500 so_next = so->so_next; 501 502 /* 503 * FD_ISSET is meaningless on these sockets 504 * (and they can crash the program) 505 */ 506 if (so->so_state & SS_NOFDREF || so->s == -1) 507 continue; 508 509 /* 510 * proxified sockets are polled later in this 511 * function. 512 */ 513 if ((so->so_state & SS_PROXIFIED) != 0) 514 continue; 515 516 /* 517 * Check for URG data 518 * This will soread as well, so no need to 519 * test for readfds below if this succeeds 520 */ 521 if (FD_ISSET(so->s, xfds)) 522 sorecvoob(so); 523 /* 524 * Check sockets for reading 525 */ 526 else if (FD_ISSET(so->s, readfds)) { 527 /* 528 * Check for incoming connections 529 */ 530 if (so->so_state & SS_FACCEPTCONN) { 531 tcp_connect(so); 532 continue; 533 } /* else */ 534 ret = soread(so); 535 536 /* Output it if we read something */ 537 if (ret > 0) 538 tcp_output(sototcpcb(so)); 539 } 540 541 /* 542 * Check sockets for writing 543 */ 544 if (FD_ISSET(so->s, writefds)) { 545 /* 546 * Check for non-blocking, still-connecting sockets 547 */ 548 if (so->so_state & SS_ISFCONNECTING) { 549 /* Connected */ 550 so->so_state &= ~SS_ISFCONNECTING; 551 552 ret = socket_send(so->s, (const void *)&ret, 0); 553 if (ret < 0) { 554 /* XXXXX Must fix, zero bytes is a NOP */ 555 if (errno == EAGAIN || errno == EWOULDBLOCK || 556 errno == EINPROGRESS || errno == ENOTCONN) 557 continue; 558 559 /* else failed */ 560 so->so_state = SS_NOFDREF; 561 } 562 /* else so->so_state &= ~SS_ISFCONNECTING; */ 563 564 /* 565 * Continue tcp_input 566 */ 567 tcp_input((struct mbuf *)NULL, sizeof(struct ip), so); 568 /* continue; */ 569 } else 570 ret = sowrite(so); 571 /* 572 * XXXXX If we wrote something (a lot), there 573 * could be a need for a window update. 574 * In the worst case, the remote will send 575 * a window probe to get things going again 576 */ 577 } 578 579 /* 580 * Probe a still-connecting, non-blocking socket 581 * to check if it's still alive 582 */ 583 #ifdef PROBE_CONN 584 if (so->so_state & SS_ISFCONNECTING) { 585 ret = socket_recv(so->s, (char *)&ret, 0); 586 587 if (ret < 0) { 588 /* XXX */ 589 if (errno == EAGAIN || errno == EWOULDBLOCK || 590 errno == EINPROGRESS || errno == ENOTCONN) 591 continue; /* Still connecting, continue */ 592 593 /* else failed */ 594 so->so_state = SS_NOFDREF; 595 596 /* tcp_input will take care of it */ 597 } else { 598 ret = socket_send(so->s, &ret, 0); 599 if (ret < 0) { 600 /* XXX */ 601 if (errno == EAGAIN || errno == EWOULDBLOCK || 602 errno == EINPROGRESS || errno == ENOTCONN) 603 continue; 604 /* else failed */ 605 so->so_state = SS_NOFDREF; 606 } else 607 so->so_state &= ~SS_ISFCONNECTING; 608 609 } 610 tcp_input((struct mbuf *)NULL, sizeof(struct ip),so); 611 } /* SS_ISFCONNECTING */ 612 #endif 613 } 614 615 /* 616 * Now UDP sockets. 617 * Incoming packets are sent straight away, they're not buffered. 618 * Incoming UDP data isn't buffered either. 619 */ 620 for (so = udb.so_next; so != &udb; so = so_next) { 621 so_next = so->so_next; 622 623 if ((so->so_state & SS_PROXIFIED) != 0) 624 continue; 625 626 if (so->s != -1 && FD_ISSET(so->s, readfds)) { 627 sorecvfrom(so); 628 } 629 } 630 } 631 632 /* 633 * Now the proxified sockets 634 */ 635 proxy_manager_poll(readfds, writefds, xfds); 636 637 /* 638 * See if we can start outputting 639 */ 640 if (if_queued && link_up) 641 if_start(); 642 643 /* clear global file descriptor sets. 644 * these reside on the stack in vl.c 645 * so they're unusable if we're not in 646 * slirp_select_fill or slirp_select_poll. 647 */ 648 global_readfds = NULL; 649 global_writefds = NULL; 650 global_xfds = NULL; 651 } 652 653 #define ETH_ALEN 6 654 #define ETH_HLEN 14 655 656 #define ETH_P_IP 0x0800 /* Internet Protocol packet */ 657 #define ETH_P_ARP 0x0806 /* Address Resolution packet */ 658 659 #define ARPOP_REQUEST 1 /* ARP request */ 660 #define ARPOP_REPLY 2 /* ARP reply */ 661 662 struct ethhdr 663 { 664 unsigned char h_dest[ETH_ALEN]; /* destination eth addr */ 665 unsigned char h_source[ETH_ALEN]; /* source ether addr */ 666 unsigned short h_proto; /* packet type ID field */ 667 }; 668 669 struct arphdr 670 { 671 unsigned short ar_hrd; /* format of hardware address */ 672 unsigned short ar_pro; /* format of protocol address */ 673 unsigned char ar_hln; /* length of hardware address */ 674 unsigned char ar_pln; /* length of protocol address */ 675 unsigned short ar_op; /* ARP opcode (command) */ 676 677 /* 678 * Ethernet looks like this : This bit is variable sized however... 679 */ 680 unsigned char ar_sha[ETH_ALEN]; /* sender hardware address */ 681 unsigned char ar_sip[4]; /* sender IP address */ 682 unsigned char ar_tha[ETH_ALEN]; /* target hardware address */ 683 unsigned char ar_tip[4]; /* target IP address */ 684 }; 685 686 static void arp_input(const uint8_t *pkt, int pkt_len) 687 { 688 struct ethhdr *eh = (struct ethhdr *)pkt; 689 struct arphdr *ah = (struct arphdr *)(pkt + ETH_HLEN); 690 uint8_t arp_reply[ETH_HLEN + sizeof(struct arphdr)]; 691 struct ethhdr *reh = (struct ethhdr *)arp_reply; 692 struct arphdr *rah = (struct arphdr *)(arp_reply + ETH_HLEN); 693 int ar_op; 694 struct ex_list *ex_ptr; 695 696 ar_op = ntohs(ah->ar_op); 697 switch(ar_op) { 698 uint32_t ar_tip_ip; 699 700 case ARPOP_REQUEST: 701 ar_tip_ip = ip_read32h(ah->ar_tip); 702 if ((ar_tip_ip & 0xffffff00) == special_addr_ip) { 703 uint32_t ar_tip_low = ar_tip_ip & 0xff; 704 if ( CTL_IS_DNS(ar_tip_low) || ar_tip_low == CTL_ALIAS) 705 goto arp_ok; 706 for (ex_ptr = exec_list; ex_ptr; ex_ptr = ex_ptr->ex_next) { 707 if (ex_ptr->ex_addr == ar_tip_low) 708 goto arp_ok; 709 } 710 return; 711 arp_ok: 712 /* XXX: make an ARP request to have the client address */ 713 memcpy(client_ethaddr, eh->h_source, ETH_ALEN); 714 715 /* ARP request for alias/dns mac address */ 716 memcpy(reh->h_dest, pkt + ETH_ALEN, ETH_ALEN); 717 memcpy(reh->h_source, special_ethaddr, ETH_ALEN - 1); 718 reh->h_source[5] = ar_tip_low; 719 reh->h_proto = htons(ETH_P_ARP); 720 721 rah->ar_hrd = htons(1); 722 rah->ar_pro = htons(ETH_P_IP); 723 rah->ar_hln = ETH_ALEN; 724 rah->ar_pln = 4; 725 rah->ar_op = htons(ARPOP_REPLY); 726 memcpy(rah->ar_sha, reh->h_source, ETH_ALEN); 727 memcpy(rah->ar_sip, ah->ar_tip, 4); 728 memcpy(rah->ar_tha, ah->ar_sha, ETH_ALEN); 729 memcpy(rah->ar_tip, ah->ar_sip, 4); 730 slirp_output(arp_reply, sizeof(arp_reply)); 731 } 732 break; 733 case ARPOP_REPLY: 734 /* reply to request of client mac address ? */ 735 if (!memcmp(client_ethaddr, zero_ethaddr, ETH_ALEN) && 736 ip_equal( ip_read(ah->ar_sip), client_ip )) { 737 memcpy(client_ethaddr, ah->ar_sha, ETH_ALEN); 738 } 739 break; 740 default: 741 break; 742 } 743 } 744 745 void slirp_input(const uint8_t *pkt, int pkt_len) 746 { 747 struct mbuf *m; 748 int proto; 749 750 if (pkt_len < ETH_HLEN) 751 return; 752 753 proto = ntohs(*(uint16_t *)(pkt + 12)); 754 switch(proto) { 755 case ETH_P_ARP: 756 arp_input(pkt, pkt_len); 757 break; 758 case ETH_P_IP: 759 m = m_get(); 760 if (!m) 761 return; 762 /* Note: we add to align the IP header */ 763 if (M_FREEROOM(m) < pkt_len + 2) { 764 m_inc(m, pkt_len + 2); 765 } 766 m->m_len = pkt_len + 2; 767 memcpy(m->m_data + 2, pkt, pkt_len); 768 769 m->m_data += 2 + ETH_HLEN; 770 m->m_len -= 2 + ETH_HLEN; 771 772 ip_input(m); 773 break; 774 default: 775 break; 776 } 777 } 778 779 /* output the IP packet to the ethernet device */ 780 void if_encap(const uint8_t *ip_data, int ip_data_len) 781 { 782 uint8_t buf[1600]; 783 struct ethhdr *eh = (struct ethhdr *)buf; 784 785 if (ip_data_len + ETH_HLEN > sizeof(buf)) 786 return; 787 788 if (!memcmp(client_ethaddr, zero_ethaddr, ETH_ALEN)) { 789 uint8_t arp_req[ETH_HLEN + sizeof(struct arphdr)]; 790 struct ethhdr *reh = (struct ethhdr *)arp_req; 791 struct arphdr *rah = (struct arphdr *)(arp_req + ETH_HLEN); 792 const struct ip *iph = (const struct ip *)ip_data; 793 794 /* If the client addr is not known, there is no point in 795 sending the packet to it. Normally the sender should have 796 done an ARP request to get its MAC address. Here we do it 797 in place of sending the packet and we hope that the sender 798 will retry sending its packet. */ 799 memset(reh->h_dest, 0xff, ETH_ALEN); 800 memcpy(reh->h_source, special_ethaddr, ETH_ALEN - 1); 801 reh->h_source[5] = CTL_ALIAS; 802 reh->h_proto = htons(ETH_P_ARP); 803 rah->ar_hrd = htons(1); 804 rah->ar_pro = htons(ETH_P_IP); 805 rah->ar_hln = ETH_ALEN; 806 rah->ar_pln = 4; 807 rah->ar_op = htons(ARPOP_REQUEST); 808 /* source hw addr */ 809 memcpy(rah->ar_sha, special_ethaddr, ETH_ALEN - 1); 810 rah->ar_sha[5] = CTL_ALIAS; 811 /* source IP */ 812 ip_write32h(alias_addr_ip, rah->ar_sip); 813 /* target hw addr (none) */ 814 memset(rah->ar_tha, 0, ETH_ALEN); 815 /* target IP */ 816 ip_write( iph->ip_dst, rah->ar_tip ); 817 client_ip = iph->ip_dst; 818 slirp_output(arp_req, sizeof(arp_req)); 819 } else { 820 memcpy(eh->h_dest, client_ethaddr, ETH_ALEN); 821 memcpy(eh->h_source, special_ethaddr, ETH_ALEN - 1); 822 /* XXX: not correct */ 823 eh->h_source[5] = CTL_ALIAS; 824 eh->h_proto = htons(ETH_P_IP); 825 memcpy(buf + sizeof(struct ethhdr), ip_data, ip_data_len); 826 slirp_output(buf, ip_data_len + ETH_HLEN); 827 } 828 } 829 830 831 /*---------------------------------------------------*/ 832 /* User mode network stack restrictions */ 833 struct fw_allow_entry { 834 struct fw_allow_entry* next; 835 unsigned long dst_addr; /* host byte order */ 836 /* Allowed port range. dst_lport should be the same as dst_hport for a 837 * single port. */ 838 unsigned short dst_lport; /* host byte order */ 839 unsigned short dst_hport; /* host byte order */ 840 }; 841 842 static int drop_udp = 0; 843 static int drop_tcp = 0; 844 static struct fw_allow_entry* allow_tcp_entries = NULL; 845 static struct fw_allow_entry* allow_udp_entries = NULL; 846 static FILE* drop_log_fd = NULL; 847 static FILE* dns_log_fd = NULL; 848 static int max_dns_conns = -1; /* unlimited max DNS connections by default */ 849 static int slirp_net_forward_inited = 0; 850 851 void slirp_drop_udp() { 852 drop_udp = 1; 853 } 854 855 void slirp_drop_tcp() { 856 drop_tcp = 1; 857 } 858 859 /* TCP traffic forwarding to a sink - If enabled, all TCP traffic to any 860 * ip/port that is not explicitly forwared using '-net-forward', and which would 861 * otherwise be dropped if '-drop-tcp' has been specified, is redirected to the 862 * specified ip:port 863 */ 864 int forward_dropped_tcp2sink = 0; 865 static unsigned long tcp_sink_ip; 866 int tcp_sink_port; 867 868 void slirp_forward_dropped_tcp2sink(unsigned long sink_ip, int sink_port) { 869 tcp_sink_ip = sink_ip; 870 tcp_sink_port = sink_port; 871 forward_dropped_tcp2sink = 1; 872 } 873 874 int slirp_should_forward_dropped_tcp2sink() { 875 return forward_dropped_tcp2sink; 876 } 877 878 unsigned long slirp_get_tcp_sink_ip() { 879 return tcp_sink_ip; 880 } 881 int slirp_get_tcp_sink_port() { 882 return tcp_sink_port; 883 } 884 885 /* Fill in the firewall rules. dst_lport and dst_hport are in host byte order */ 886 void slirp_add_allow(unsigned long dst_addr, 887 int dst_lport, int dst_hport, 888 u_int8_t proto) { 889 890 struct fw_allow_entry** ate; 891 switch (proto) { 892 case IPPROTO_TCP: 893 ate = &allow_tcp_entries; 894 break; 895 case IPPROTO_UDP: 896 ate = &allow_udp_entries; 897 break; 898 default: 899 return; // unknown protocol for the FW 900 } 901 902 while(*ate != NULL) 903 ate = &(*ate)->next; 904 905 *ate = malloc(sizeof(**ate)); 906 if (*ate == NULL) { 907 DEBUG_MISC((dfd, 908 "Unable to create new firewall record, malloc failed\n")); 909 exit(-1); 910 } 911 912 (*ate)->next = NULL; 913 (*ate)->dst_addr = dst_addr; 914 (*ate)->dst_lport = dst_lport; 915 (*ate)->dst_hport = dst_hport; 916 } 917 918 void slirp_drop_log_fd(FILE* fd) { 919 drop_log_fd = fd; 920 } 921 922 void slirp_dns_log_fd(FILE* fd) { 923 dns_log_fd = fd; 924 } 925 926 FILE* get_slirp_drop_log_fd(void) { 927 return drop_log_fd; 928 } 929 930 FILE* get_slirp_dns_log_fd(void) { 931 return dns_log_fd; 932 } 933 934 /* Address and ports are in host byte order */ 935 int slirp_should_drop(unsigned long dst_addr, 936 int dst_port, 937 u_int8_t proto) { 938 939 struct fw_allow_entry* ate; 940 941 switch (proto) { 942 case IPPROTO_TCP: 943 if (drop_tcp != 0) 944 ate = allow_tcp_entries; 945 else 946 return 0; 947 break; 948 case IPPROTO_UDP: 949 if (drop_udp != 0) 950 ate = allow_udp_entries; 951 else 952 return 0; 953 break; 954 default: 955 return 1; // unknown protocol for the FW 956 } 957 958 while(ate) { 959 if ((ate->dst_lport <= dst_port) && (dst_port <= ate->dst_hport)) { 960 // allow any destination if 0 961 if (ate->dst_addr == 0 || ate->dst_addr == dst_addr) 962 return 0; 963 } 964 ate = ate->next; 965 } 966 967 return 1; 968 } 969 970 /* 971 * log DNS requests in a separate log 972 */ 973 int 974 slirp_log_dns(struct mbuf* m, int dropped) { 975 char dns_query[256]; // max allowable dns name size 976 int c = 0; 977 int i= 0; 978 int index = 0; 979 int offset = 40 + 1; // udp/ip headers length + 1; 980 int trim_bytes = 4; 981 982 if (!dns_log_fd) 983 return -1; 984 985 /* We assume one DNS name per query: 300 = 255 (max dns name length) 986 * + 40 (udp/ip hdr) + 1 byte DNS peamble + 4 bytes DNS suffix 987 */ 988 if (m->m_len < offset || m->m_len > 300) { 989 DEBUG_MISC((dfd,"Malformed DNS qeury, length %d \n", (int)m->m_len)); 990 return -1; 991 } 992 for (i = offset; i < m->m_len - trim_bytes && index < sizeof(dns_query); i++, index++) { 993 c = m->m_data[i]; 994 if (c < ' ' || c > '~') 995 c = '.'; 996 997 dns_query[index] = (char)c; 998 } 999 dns_query[index] = '\0'; 1000 if (!dropped) { 1001 fprintf(dns_log_fd, "Sent DNS query for, %s\n" , dns_query); 1002 } else { 1003 fprintf(dns_log_fd, "Dropped DNS query for, %s\n" , dns_query); 1004 } 1005 fflush(dns_log_fd); 1006 return 1; 1007 } 1008 1009 /* 1010 * log DNS requests in a separate log 1011 */ 1012 int 1013 slirp_dump_dns(struct mbuf* m) { 1014 1015 if (!dns_log_fd) 1016 return 0; 1017 // first we write the length of the record then the record (IP packet) 1018 if (!fwrite(&(m->m_len), sizeof(int), 1, dns_log_fd) || 1019 !fwrite(m->m_data, m->m_len, 1, dns_log_fd)) { 1020 return 0; 1021 } 1022 1023 fflush(dns_log_fd); 1024 return 1; 1025 } 1026 1027 /* Log dropped/accepted packet info */ 1028 int slirp_drop_log(const char* format, ...) { 1029 va_list args; 1030 1031 if (!drop_log_fd) 1032 return 0; 1033 1034 va_start(args, format); 1035 vfprintf(drop_log_fd, format, args); 1036 va_end(args); 1037 1038 fflush(drop_log_fd); 1039 1040 return 1; 1041 } 1042 1043 1044 /* Set max DNS requests allowed to be issued from the VM */ 1045 void slirp_set_max_dns_conns(int num_conns) { 1046 max_dns_conns = num_conns; 1047 } 1048 1049 int slirp_get_max_dns_conns() { 1050 return max_dns_conns; 1051 } 1052 1053 /* generic guest network redirection functionality for ipv4 */ 1054 struct net_forward_entry { 1055 QTAILQ_ENTRY(net_forward_entry) next; 1056 /* ip addresses are also in host byte order */ 1057 unsigned long dest_ip; /* the destination address they try to contact */ 1058 unsigned long dest_mask; /* the mask to apply to the address for matching */ 1059 /* Range of ports they were trying to contact. In case of a single port, 1060 * dest_lport should be the same as dest_hport */ 1061 int dest_lport; /* Host byte order */ 1062 int dest_hport; /* Host byte order */ 1063 1064 unsigned long redirect_ip; 1065 int redirect_port; /* Host byte order */ 1066 }; 1067 1068 static QTAILQ_HEAD(net_forwardq, net_forward_entry) net_forwards; 1069 1070 static void slirp_net_forward_init(void) 1071 { 1072 if (!slirp_net_forward_inited) { 1073 QTAILQ_INIT(&net_forwards); 1074 slirp_net_forward_inited = 1; 1075 } 1076 } 1077 1078 /* all addresses and ports ae in host byte order */ 1079 void slirp_add_net_forward(unsigned long dest_ip, unsigned long dest_mask, 1080 int dest_lport, int dest_hport, 1081 unsigned long redirect_ip, int redirect_port) 1082 { 1083 slirp_net_forward_init(); 1084 1085 struct net_forward_entry *entry = malloc(sizeof(*entry)); 1086 if (entry == NULL) { 1087 DEBUG_MISC((dfd, "Unable to create new forwarding entry, malloc failed\n")); 1088 exit(-1); 1089 } 1090 1091 entry->dest_ip = dest_ip; 1092 entry->dest_mask = dest_mask; 1093 entry->dest_lport = dest_lport; 1094 entry->dest_hport = dest_hport; 1095 entry->redirect_ip = redirect_ip; 1096 entry->redirect_port = redirect_port; 1097 1098 QTAILQ_INSERT_TAIL(&net_forwards, entry, next); 1099 } 1100 1101 /* remote_port and redir_port arguments 1102 * are in network byte order (tcp_subr.c) */ 1103 int slirp_should_net_forward(unsigned long remote_ip, int remote_port, 1104 unsigned long *redirect_ip, int *redirect_port) 1105 { 1106 struct net_forward_entry *entry; 1107 1108 for (entry = net_forwards.tqh_first; 1109 entry != NULL; entry = entry->next.tqe_next) { 1110 1111 if ((entry->dest_lport <= remote_port) 1112 && (remote_port <= entry->dest_hport)) { 1113 if ((entry->dest_ip & entry->dest_mask) 1114 == (remote_ip & entry->dest_mask)) { 1115 *redirect_ip = entry->redirect_ip; 1116 *redirect_port = entry->redirect_port; 1117 return 1; 1118 } 1119 } 1120 } 1121 1122 return 0; 1123 } 1124 1125 /*---------------------------------------------------*/ 1126 1127 1128 1129 1130 static void _slirp_redir_loop(void (*func)(void *opaque, int is_udp, 1131 const SockAddress *laddr, 1132 const SockAddress *faddr), 1133 void *opaque, int is_udp) 1134 { 1135 struct socket *head = (is_udp ? &udb : &tcb); 1136 struct socket *so; 1137 1138 for (so = head->so_next; so != head; so = so->so_next) { 1139 SockAddress local, foreign; 1140 1141 sock_address_init_inet(&local, so->so_laddr_ip, so->so_laddr_port); 1142 sock_address_init_inet(&foreign, so->so_faddr_ip, so->so_faddr_port); 1143 func(opaque, is_udp, 1144 &local, &foreign); 1145 } 1146 } 1147 1148 void slirp_redir_loop(void (*func)(void *opaque, int is_udp, 1149 const SockAddress *laddr, 1150 const SockAddress *faddr), 1151 void *opaque) 1152 { 1153 _slirp_redir_loop(func, opaque, 0); 1154 _slirp_redir_loop(func, opaque, 1); 1155 } 1156 1157 /* Unlistens a redirection 1158 * 1159 * Return value: number of redirs removed */ 1160 int slirp_redir_rm(int is_udp, int host_port) 1161 { 1162 struct socket *so; 1163 struct socket *head = (is_udp ? &udb : &tcb); 1164 int n = 0; 1165 1166 loop_again: 1167 for (so = head->so_next; so != head; so = so->so_next) { 1168 if (so->so_faddr_port == host_port) { 1169 close(so->s); 1170 sofree(so); 1171 n++; 1172 goto loop_again; 1173 } 1174 } 1175 1176 return n; 1177 } 1178 1179 int slirp_redir(int is_udp, int host_port, 1180 uint32_t guest_ip, int guest_port) 1181 { 1182 if (is_udp) { 1183 if (!udp_listen(host_port, 1184 guest_ip, 1185 guest_port, 0)) 1186 return -1; 1187 } else { 1188 if (!solisten(host_port, guest_ip, guest_port, 0)) 1189 return -1; 1190 } 1191 return 0; 1192 } 1193 1194 int slirp_unredir(int is_udp, int host_port) 1195 { 1196 if (is_udp) 1197 return udp_unlisten( host_port ); 1198 else 1199 return sounlisten( host_port ); 1200 } 1201 1202 int slirp_add_exec(int do_pty, const void *args, int addr_low_byte, 1203 int guest_port) 1204 { 1205 return add_exec(&exec_list, do_pty, (char *)args, 1206 addr_low_byte, htons(guest_port)); 1207 } 1208 1209 ssize_t slirp_send(struct socket *so, const void *buf, size_t len, int flags) 1210 { 1211 if (so->s == -1 && so->extra) { 1212 qemu_chr_write(so->extra, buf, len); 1213 return len; 1214 } 1215 1216 return send(so->s, buf, len, flags); 1217 } 1218 1219 static struct socket *slirp_find_ctl_socket(int addr_low_byte, int guest_port) 1220 { 1221 struct socket *so; 1222 1223 for (so = tcb.so_next; so != &tcb; so = so->so_next) { 1224 if ((so->so_faddr_ip & 0xffffff00) == 1225 special_addr_ip 1226 && ((so->so_faddr_port & 0xff) == 1227 addr_low_byte) 1228 && so->so_faddr_port == guest_port) 1229 return so; 1230 } 1231 1232 return NULL; 1233 } 1234 1235 size_t slirp_socket_can_recv(int addr_low_byte, int guest_port) 1236 { 1237 struct iovec iov[2]; 1238 struct socket *so; 1239 1240 if (!link_up) 1241 return 0; 1242 1243 so = slirp_find_ctl_socket(addr_low_byte, guest_port); 1244 1245 if (!so || so->so_state & SS_NOFDREF) 1246 return 0; 1247 1248 if (!CONN_CANFRCV(so) || so->so_snd.sb_cc >= (so->so_snd.sb_datalen/2)) 1249 return 0; 1250 1251 return sopreprbuf(so, iov, NULL); 1252 } 1253 1254 void slirp_socket_recv(int addr_low_byte, int guest_port, const uint8_t *buf, 1255 int size) 1256 { 1257 int ret; 1258 struct socket *so = slirp_find_ctl_socket(addr_low_byte, guest_port); 1259 1260 if (!so) 1261 return; 1262 1263 ret = soreadbuf(so, (const char *)buf, size); 1264 1265 if (ret > 0) 1266 tcp_output(sototcpcb(so)); 1267 } 1268 1269 static void slirp_tcp_save(QEMUFile *f, struct tcpcb *tp) 1270 { 1271 int i; 1272 1273 qemu_put_sbe16(f, tp->t_state); 1274 for (i = 0; i < TCPT_NTIMERS; i++) 1275 qemu_put_sbe16(f, tp->t_timer[i]); 1276 qemu_put_sbe16(f, tp->t_rxtshift); 1277 qemu_put_sbe16(f, tp->t_rxtcur); 1278 qemu_put_sbe16(f, tp->t_dupacks); 1279 qemu_put_be16(f, tp->t_maxseg); 1280 qemu_put_sbyte(f, tp->t_force); 1281 qemu_put_be16(f, tp->t_flags); 1282 qemu_put_be32(f, tp->snd_una); 1283 qemu_put_be32(f, tp->snd_nxt); 1284 qemu_put_be32(f, tp->snd_up); 1285 qemu_put_be32(f, tp->snd_wl1); 1286 qemu_put_be32(f, tp->snd_wl2); 1287 qemu_put_be32(f, tp->iss); 1288 qemu_put_be32(f, tp->snd_wnd); 1289 qemu_put_be32(f, tp->rcv_wnd); 1290 qemu_put_be32(f, tp->rcv_nxt); 1291 qemu_put_be32(f, tp->rcv_up); 1292 qemu_put_be32(f, tp->irs); 1293 qemu_put_be32(f, tp->rcv_adv); 1294 qemu_put_be32(f, tp->snd_max); 1295 qemu_put_be32(f, tp->snd_cwnd); 1296 qemu_put_be32(f, tp->snd_ssthresh); 1297 qemu_put_sbe16(f, tp->t_idle); 1298 qemu_put_sbe16(f, tp->t_rtt); 1299 qemu_put_be32(f, tp->t_rtseq); 1300 qemu_put_sbe16(f, tp->t_srtt); 1301 qemu_put_sbe16(f, tp->t_rttvar); 1302 qemu_put_be16(f, tp->t_rttmin); 1303 qemu_put_be32(f, tp->max_sndwnd); 1304 qemu_put_byte(f, tp->t_oobflags); 1305 qemu_put_byte(f, tp->t_iobc); 1306 qemu_put_sbe16(f, tp->t_softerror); 1307 qemu_put_byte(f, tp->snd_scale); 1308 qemu_put_byte(f, tp->rcv_scale); 1309 qemu_put_byte(f, tp->request_r_scale); 1310 qemu_put_byte(f, tp->requested_s_scale); 1311 qemu_put_be32(f, tp->ts_recent); 1312 qemu_put_be32(f, tp->ts_recent_age); 1313 qemu_put_be32(f, tp->last_ack_sent); 1314 } 1315 1316 static void slirp_sbuf_save(QEMUFile *f, struct sbuf *sbuf) 1317 { 1318 uint32_t off; 1319 1320 qemu_put_be32(f, sbuf->sb_cc); 1321 qemu_put_be32(f, sbuf->sb_datalen); 1322 off = (uint32_t)(sbuf->sb_wptr - sbuf->sb_data); 1323 qemu_put_sbe32(f, off); 1324 off = (uint32_t)(sbuf->sb_rptr - sbuf->sb_data); 1325 qemu_put_sbe32(f, off); 1326 qemu_put_buffer(f, (unsigned char*)sbuf->sb_data, sbuf->sb_datalen); 1327 } 1328 1329 static void slirp_socket_save(QEMUFile *f, struct socket *so) 1330 { 1331 qemu_put_be32(f, so->so_urgc); 1332 qemu_put_be32(f, so->so_faddr_ip); 1333 qemu_put_be32(f, so->so_laddr_ip); 1334 qemu_put_be16(f, so->so_faddr_port); 1335 qemu_put_be16(f, so->so_laddr_port); 1336 qemu_put_byte(f, so->so_iptos); 1337 qemu_put_byte(f, so->so_emu); 1338 qemu_put_byte(f, so->so_type); 1339 qemu_put_be32(f, so->so_state); 1340 slirp_sbuf_save(f, &so->so_rcv); 1341 slirp_sbuf_save(f, &so->so_snd); 1342 slirp_tcp_save(f, so->so_tcpcb); 1343 } 1344 1345 static void slirp_state_save(QEMUFile *f, void *opaque) 1346 { 1347 struct ex_list *ex_ptr; 1348 1349 for (ex_ptr = exec_list; ex_ptr; ex_ptr = ex_ptr->ex_next) 1350 if (ex_ptr->ex_pty == 3) { 1351 struct socket *so; 1352 so = slirp_find_ctl_socket(ex_ptr->ex_addr, ntohs(ex_ptr->ex_fport)); 1353 if (!so) 1354 continue; 1355 1356 qemu_put_byte(f, 42); 1357 slirp_socket_save(f, so); 1358 } 1359 qemu_put_byte(f, 0); 1360 } 1361 1362 static void slirp_tcp_load(QEMUFile *f, struct tcpcb *tp) 1363 { 1364 int i; 1365 1366 tp->t_state = qemu_get_sbe16(f); 1367 for (i = 0; i < TCPT_NTIMERS; i++) 1368 tp->t_timer[i] = qemu_get_sbe16(f); 1369 tp->t_rxtshift = qemu_get_sbe16(f); 1370 tp->t_rxtcur = qemu_get_sbe16(f); 1371 tp->t_dupacks = qemu_get_sbe16(f); 1372 tp->t_maxseg = qemu_get_be16(f); 1373 tp->t_force = qemu_get_sbyte(f); 1374 tp->t_flags = qemu_get_be16(f); 1375 tp->snd_una = qemu_get_be32(f); 1376 tp->snd_nxt = qemu_get_be32(f); 1377 tp->snd_up = qemu_get_be32(f); 1378 tp->snd_wl1 = qemu_get_be32(f); 1379 tp->snd_wl2 = qemu_get_be32(f); 1380 tp->iss = qemu_get_be32(f); 1381 tp->snd_wnd = qemu_get_be32(f); 1382 tp->rcv_wnd = qemu_get_be32(f); 1383 tp->rcv_nxt = qemu_get_be32(f); 1384 tp->rcv_up = qemu_get_be32(f); 1385 tp->irs = qemu_get_be32(f); 1386 tp->rcv_adv = qemu_get_be32(f); 1387 tp->snd_max = qemu_get_be32(f); 1388 tp->snd_cwnd = qemu_get_be32(f); 1389 tp->snd_ssthresh = qemu_get_be32(f); 1390 tp->t_idle = qemu_get_sbe16(f); 1391 tp->t_rtt = qemu_get_sbe16(f); 1392 tp->t_rtseq = qemu_get_be32(f); 1393 tp->t_srtt = qemu_get_sbe16(f); 1394 tp->t_rttvar = qemu_get_sbe16(f); 1395 tp->t_rttmin = qemu_get_be16(f); 1396 tp->max_sndwnd = qemu_get_be32(f); 1397 tp->t_oobflags = qemu_get_byte(f); 1398 tp->t_iobc = qemu_get_byte(f); 1399 tp->t_softerror = qemu_get_sbe16(f); 1400 tp->snd_scale = qemu_get_byte(f); 1401 tp->rcv_scale = qemu_get_byte(f); 1402 tp->request_r_scale = qemu_get_byte(f); 1403 tp->requested_s_scale = qemu_get_byte(f); 1404 tp->ts_recent = qemu_get_be32(f); 1405 tp->ts_recent_age = qemu_get_be32(f); 1406 tp->last_ack_sent = qemu_get_be32(f); 1407 tcp_template(tp); 1408 } 1409 1410 static int slirp_sbuf_load(QEMUFile *f, struct sbuf *sbuf) 1411 { 1412 uint32_t off, sb_cc, sb_datalen; 1413 1414 sb_cc = qemu_get_be32(f); 1415 sb_datalen = qemu_get_be32(f); 1416 1417 sbreserve(sbuf, sb_datalen); 1418 1419 if (sbuf->sb_datalen != sb_datalen) 1420 return -ENOMEM; 1421 1422 sbuf->sb_cc = sb_cc; 1423 1424 off = qemu_get_sbe32(f); 1425 sbuf->sb_wptr = sbuf->sb_data + off; 1426 off = qemu_get_sbe32(f); 1427 sbuf->sb_rptr = sbuf->sb_data + off; 1428 qemu_get_buffer(f, (unsigned char*)sbuf->sb_data, sbuf->sb_datalen); 1429 1430 return 0; 1431 } 1432 1433 static int slirp_socket_load(QEMUFile *f, struct socket *so) 1434 { 1435 if (tcp_attach(so) < 0) 1436 return -ENOMEM; 1437 1438 so->so_urgc = qemu_get_be32(f); 1439 so->so_faddr_ip = qemu_get_be32(f); 1440 so->so_laddr_ip = qemu_get_be32(f); 1441 so->so_faddr_port = qemu_get_be16(f); 1442 so->so_laddr_port = qemu_get_be16(f); 1443 so->so_iptos = qemu_get_byte(f); 1444 so->so_emu = qemu_get_byte(f); 1445 so->so_type = qemu_get_byte(f); 1446 so->so_state = qemu_get_be32(f); 1447 if (slirp_sbuf_load(f, &so->so_rcv) < 0) 1448 return -ENOMEM; 1449 if (slirp_sbuf_load(f, &so->so_snd) < 0) 1450 return -ENOMEM; 1451 slirp_tcp_load(f, so->so_tcpcb); 1452 1453 return 0; 1454 } 1455 1456 static int slirp_state_load(QEMUFile *f, void *opaque, int version_id) 1457 { 1458 struct ex_list *ex_ptr; 1459 int r; 1460 1461 while ((r = qemu_get_byte(f))) { 1462 int ret; 1463 struct socket *so = socreate(); 1464 1465 if (!so) 1466 return -ENOMEM; 1467 1468 ret = slirp_socket_load(f, so); 1469 1470 if (ret < 0) 1471 return ret; 1472 1473 if ((so->so_faddr_ip & 0xffffff00) != special_addr_ip) 1474 return -EINVAL; 1475 1476 for (ex_ptr = exec_list; ex_ptr; ex_ptr = ex_ptr->ex_next) 1477 if (ex_ptr->ex_pty == 3 && 1478 (so->so_faddr_ip & 0xff) == ex_ptr->ex_addr && 1479 so->so_faddr_port == ex_ptr->ex_fport) 1480 break; 1481 1482 if (!ex_ptr) 1483 return -EINVAL; 1484 1485 so->extra = (void *)ex_ptr->ex_exec; 1486 } 1487 1488 return 0; 1489 } 1490