1 /* 2 * QEMU System Emulator 3 * 4 * Copyright (c) 2003-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 "config-host.h" 25 26 #include "net/net.h" 27 #include "clients.h" 28 #include "hub.h" 29 #include "net/slirp.h" 30 #include "util.h" 31 32 #include "monitor/monitor.h" 33 #include "qemu-common.h" 34 #include "qemu/sockets.h" 35 #include "qemu/config-file.h" 36 #include "qmp-commands.h" 37 #include "hw/qdev.h" 38 #include "qemu/iov.h" 39 #include "qapi-visit.h" 40 #include "qapi/opts-visitor.h" 41 #include "qapi/dealloc-visitor.h" 42 43 /* Net bridge is currently not supported for W32. */ 44 #if !defined(_WIN32) 45 # define CONFIG_NET_BRIDGE 46 #endif 47 48 static QTAILQ_HEAD(, NetClientState) net_clients; 49 50 int default_net = 1; 51 52 /***********************************************************/ 53 /* network device redirectors */ 54 55 #if defined(DEBUG_NET) 56 static void hex_dump(FILE *f, const uint8_t *buf, int size) 57 { 58 int len, i, j, c; 59 60 for(i=0;i<size;i+=16) { 61 len = size - i; 62 if (len > 16) 63 len = 16; 64 fprintf(f, "%08x ", i); 65 for(j=0;j<16;j++) { 66 if (j < len) 67 fprintf(f, " %02x", buf[i+j]); 68 else 69 fprintf(f, " "); 70 } 71 fprintf(f, " "); 72 for(j=0;j<len;j++) { 73 c = buf[i+j]; 74 if (c < ' ' || c > '~') 75 c = '.'; 76 fprintf(f, "%c", c); 77 } 78 fprintf(f, "\n"); 79 } 80 } 81 #endif 82 83 static int get_str_sep(char *buf, int buf_size, const char **pp, int sep) 84 { 85 const char *p, *p1; 86 int len; 87 p = *pp; 88 p1 = strchr(p, sep); 89 if (!p1) 90 return -1; 91 len = p1 - p; 92 p1++; 93 if (buf_size > 0) { 94 if (len > buf_size - 1) 95 len = buf_size - 1; 96 memcpy(buf, p, len); 97 buf[len] = '\0'; 98 } 99 *pp = p1; 100 return 0; 101 } 102 103 int parse_host_port(struct sockaddr_in *saddr, const char *str) 104 { 105 char buf[512]; 106 struct hostent *he; 107 const char *p, *r; 108 int port; 109 110 p = str; 111 if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) 112 return -1; 113 saddr->sin_family = AF_INET; 114 if (buf[0] == '\0') { 115 saddr->sin_addr.s_addr = 0; 116 } else { 117 if (qemu_isdigit(buf[0])) { 118 if (!inet_aton(buf, &saddr->sin_addr)) 119 return -1; 120 } else { 121 if ((he = gethostbyname(buf)) == NULL) 122 return - 1; 123 saddr->sin_addr = *(struct in_addr *)he->h_addr; 124 } 125 } 126 port = strtol(p, (char **)&r, 0); 127 if (r == p) 128 return -1; 129 saddr->sin_port = htons(port); 130 return 0; 131 } 132 133 void qemu_format_nic_info_str(NetClientState *nc, uint8_t macaddr[6]) 134 { 135 snprintf(nc->info_str, sizeof(nc->info_str), 136 "model=%s,macaddr=%02x:%02x:%02x:%02x:%02x:%02x", 137 nc->model, 138 macaddr[0], macaddr[1], macaddr[2], 139 macaddr[3], macaddr[4], macaddr[5]); 140 } 141 142 void qemu_macaddr_default_if_unset(MACAddr *macaddr) 143 { 144 static int index = 0; 145 static const MACAddr zero = { .a = { 0,0,0,0,0,0 } }; 146 147 if (memcmp(macaddr, &zero, sizeof(zero)) != 0) 148 return; 149 macaddr->a[0] = 0x52; 150 macaddr->a[1] = 0x54; 151 macaddr->a[2] = 0x00; 152 macaddr->a[3] = 0x12; 153 macaddr->a[4] = 0x34; 154 macaddr->a[5] = 0x56 + index++; 155 } 156 157 /** 158 * Generate a name for net client 159 * 160 * Only net clients created with the legacy -net option need this. Naming is 161 * mandatory for net clients created with -netdev. 162 */ 163 static char *assign_name(NetClientState *nc1, const char *model) 164 { 165 NetClientState *nc; 166 char buf[256]; 167 int id = 0; 168 169 QTAILQ_FOREACH(nc, &net_clients, next) { 170 if (nc == nc1) { 171 continue; 172 } 173 /* For compatibility only bump id for net clients on a vlan */ 174 if (strcmp(nc->model, model) == 0 && 175 net_hub_id_for_client(nc, NULL) == 0) { 176 id++; 177 } 178 } 179 180 snprintf(buf, sizeof(buf), "%s.%d", model, id); 181 182 return g_strdup(buf); 183 } 184 185 static void qemu_net_client_destructor(NetClientState *nc) 186 { 187 g_free(nc); 188 } 189 190 static void qemu_net_client_setup(NetClientState *nc, 191 NetClientInfo *info, 192 NetClientState *peer, 193 const char *model, 194 const char *name, 195 NetClientDestructor *destructor) 196 { 197 nc->info = info; 198 nc->model = g_strdup(model); 199 if (name) { 200 nc->name = g_strdup(name); 201 } else { 202 nc->name = assign_name(nc, model); 203 } 204 205 if (peer) { 206 assert(!peer->peer); 207 nc->peer = peer; 208 peer->peer = nc; 209 } 210 QTAILQ_INSERT_TAIL(&net_clients, nc, next); 211 212 nc->send_queue = qemu_new_net_queue(nc); 213 nc->destructor = destructor; 214 } 215 216 NetClientState *qemu_new_net_client(NetClientInfo *info, 217 NetClientState *peer, 218 const char *model, 219 const char *name) 220 { 221 NetClientState *nc; 222 223 assert(info->size >= sizeof(NetClientState)); 224 225 nc = g_malloc0(info->size); 226 qemu_net_client_setup(nc, info, peer, model, name, 227 qemu_net_client_destructor); 228 229 return nc; 230 } 231 232 NICState *qemu_new_nic(NetClientInfo *info, 233 NICConf *conf, 234 const char *model, 235 const char *name, 236 void *opaque) 237 { 238 NetClientState **peers = conf->peers.ncs; 239 NICState *nic; 240 int i, queues = MAX(1, conf->queues); 241 242 assert(info->type == NET_CLIENT_OPTIONS_KIND_NIC); 243 assert(info->size >= sizeof(NICState)); 244 245 nic = g_malloc0(info->size + sizeof(NetClientState) * queues); 246 nic->ncs = (void *)nic + info->size; 247 nic->conf = conf; 248 nic->opaque = opaque; 249 250 for (i = 0; i < queues; i++) { 251 qemu_net_client_setup(&nic->ncs[i], info, peers[i], model, name, 252 NULL); 253 nic->ncs[i].queue_index = i; 254 } 255 256 return nic; 257 } 258 259 NetClientState *qemu_get_subqueue(NICState *nic, int queue_index) 260 { 261 return nic->ncs + queue_index; 262 } 263 264 NetClientState *qemu_get_queue(NICState *nic) 265 { 266 return qemu_get_subqueue(nic, 0); 267 } 268 269 NICState *qemu_get_nic(NetClientState *nc) 270 { 271 NetClientState *nc0 = nc - nc->queue_index; 272 273 return (NICState *)((void *)nc0 - nc->info->size); 274 } 275 276 void *qemu_get_nic_opaque(NetClientState *nc) 277 { 278 NICState *nic = qemu_get_nic(nc); 279 280 return nic->opaque; 281 } 282 283 static void qemu_cleanup_net_client(NetClientState *nc) 284 { 285 QTAILQ_REMOVE(&net_clients, nc, next); 286 287 if (nc->info->cleanup) { 288 nc->info->cleanup(nc); 289 } 290 } 291 292 static void qemu_free_net_client(NetClientState *nc) 293 { 294 if (nc->send_queue) { 295 qemu_del_net_queue(nc->send_queue); 296 } 297 if (nc->peer) { 298 nc->peer->peer = NULL; 299 } 300 g_free(nc->name); 301 g_free(nc->model); 302 if (nc->destructor) { 303 nc->destructor(nc); 304 } 305 } 306 307 void qemu_del_net_client(NetClientState *nc) 308 { 309 NetClientState *ncs[MAX_QUEUE_NUM]; 310 int queues, i; 311 312 /* If the NetClientState belongs to a multiqueue backend, we will change all 313 * other NetClientStates also. 314 */ 315 queues = qemu_find_net_clients_except(nc->name, ncs, 316 NET_CLIENT_OPTIONS_KIND_NIC, 317 MAX_QUEUE_NUM); 318 assert(queues != 0); 319 320 /* If there is a peer NIC, delete and cleanup client, but do not free. */ 321 if (nc->peer && nc->peer->info->type == NET_CLIENT_OPTIONS_KIND_NIC) { 322 NICState *nic = qemu_get_nic(nc->peer); 323 if (nic->peer_deleted) { 324 return; 325 } 326 nic->peer_deleted = true; 327 328 for (i = 0; i < queues; i++) { 329 ncs[i]->peer->link_down = true; 330 } 331 332 if (nc->peer->info->link_status_changed) { 333 nc->peer->info->link_status_changed(nc->peer); 334 } 335 336 for (i = 0; i < queues; i++) { 337 qemu_cleanup_net_client(ncs[i]); 338 } 339 340 return; 341 } 342 343 assert(nc->info->type != NET_CLIENT_OPTIONS_KIND_NIC); 344 345 for (i = 0; i < queues; i++) { 346 qemu_cleanup_net_client(ncs[i]); 347 qemu_free_net_client(ncs[i]); 348 } 349 } 350 351 void qemu_del_nic(NICState *nic) 352 { 353 int i, queues = MAX(nic->conf->queues, 1); 354 355 /* If this is a peer NIC and peer has already been deleted, free it now. */ 356 if (nic->peer_deleted) { 357 for (i = 0; i < queues; i++) { 358 qemu_free_net_client(qemu_get_subqueue(nic, i)->peer); 359 } 360 } 361 362 for (i = queues - 1; i >= 0; i--) { 363 NetClientState *nc = qemu_get_subqueue(nic, i); 364 365 qemu_cleanup_net_client(nc); 366 qemu_free_net_client(nc); 367 } 368 369 g_free(nic); 370 } 371 372 void qemu_foreach_nic(qemu_nic_foreach func, void *opaque) 373 { 374 NetClientState *nc; 375 376 QTAILQ_FOREACH(nc, &net_clients, next) { 377 if (nc->info->type == NET_CLIENT_OPTIONS_KIND_NIC) { 378 if (nc->queue_index == 0) { 379 func(qemu_get_nic(nc), opaque); 380 } 381 } 382 } 383 } 384 385 int qemu_can_send_packet(NetClientState *sender) 386 { 387 if (!sender->peer) { 388 return 1; 389 } 390 391 if (sender->peer->receive_disabled) { 392 return 0; 393 } else if (sender->peer->info->can_receive && 394 !sender->peer->info->can_receive(sender->peer)) { 395 return 0; 396 } 397 return 1; 398 } 399 400 ssize_t qemu_deliver_packet(NetClientState *sender, 401 unsigned flags, 402 const uint8_t *data, 403 size_t size, 404 void *opaque) 405 { 406 NetClientState *nc = opaque; 407 ssize_t ret; 408 409 if (nc->link_down) { 410 return size; 411 } 412 413 if (nc->receive_disabled) { 414 return 0; 415 } 416 417 if (flags & QEMU_NET_PACKET_FLAG_RAW && nc->info->receive_raw) { 418 ret = nc->info->receive_raw(nc, data, size); 419 } else { 420 ret = nc->info->receive(nc, data, size); 421 } 422 423 if (ret == 0) { 424 nc->receive_disabled = 1; 425 }; 426 427 return ret; 428 } 429 430 void qemu_purge_queued_packets(NetClientState *nc) 431 { 432 if (!nc->peer) { 433 return; 434 } 435 436 qemu_net_queue_purge(nc->peer->send_queue, nc); 437 } 438 439 void qemu_flush_queued_packets(NetClientState *nc) 440 { 441 nc->receive_disabled = 0; 442 443 if (nc->peer && nc->peer->info->type == NET_CLIENT_OPTIONS_KIND_HUBPORT) { 444 if (net_hub_flush(nc->peer)) { 445 qemu_notify_event(); 446 } 447 return; 448 } 449 if (qemu_net_queue_flush(nc->send_queue)) { 450 /* We emptied the queue successfully, signal to the IO thread to repoll 451 * the file descriptor (for tap, for example). 452 */ 453 qemu_notify_event(); 454 } 455 } 456 457 static ssize_t qemu_send_packet_async_with_flags(NetClientState *sender, 458 unsigned flags, 459 const uint8_t *buf, int size, 460 NetPacketSent *sent_cb) 461 { 462 NetQueue *queue; 463 464 #ifdef DEBUG_NET 465 printf("qemu_send_packet_async:\n"); 466 hex_dump(stdout, buf, size); 467 #endif 468 469 if (sender->link_down || !sender->peer) { 470 return size; 471 } 472 473 queue = sender->peer->send_queue; 474 475 return qemu_net_queue_send(queue, sender, flags, buf, size, sent_cb); 476 } 477 478 ssize_t qemu_send_packet_async(NetClientState *sender, 479 const uint8_t *buf, int size, 480 NetPacketSent *sent_cb) 481 { 482 return qemu_send_packet_async_with_flags(sender, QEMU_NET_PACKET_FLAG_NONE, 483 buf, size, sent_cb); 484 } 485 486 void qemu_send_packet(NetClientState *nc, const uint8_t *buf, int size) 487 { 488 qemu_send_packet_async(nc, buf, size, NULL); 489 } 490 491 ssize_t qemu_send_packet_raw(NetClientState *nc, const uint8_t *buf, int size) 492 { 493 return qemu_send_packet_async_with_flags(nc, QEMU_NET_PACKET_FLAG_RAW, 494 buf, size, NULL); 495 } 496 497 static ssize_t nc_sendv_compat(NetClientState *nc, const struct iovec *iov, 498 int iovcnt) 499 { 500 uint8_t buffer[NET_BUFSIZE]; 501 size_t offset; 502 503 offset = iov_to_buf(iov, iovcnt, 0, buffer, sizeof(buffer)); 504 505 return nc->info->receive(nc, buffer, offset); 506 } 507 508 ssize_t qemu_deliver_packet_iov(NetClientState *sender, 509 unsigned flags, 510 const struct iovec *iov, 511 int iovcnt, 512 void *opaque) 513 { 514 NetClientState *nc = opaque; 515 int ret; 516 517 if (nc->link_down) { 518 return iov_size(iov, iovcnt); 519 } 520 521 if (nc->receive_disabled) { 522 return 0; 523 } 524 525 if (nc->info->receive_iov) { 526 ret = nc->info->receive_iov(nc, iov, iovcnt); 527 } else { 528 ret = nc_sendv_compat(nc, iov, iovcnt); 529 } 530 531 if (ret == 0) { 532 nc->receive_disabled = 1; 533 } 534 535 return ret; 536 } 537 538 ssize_t qemu_sendv_packet_async(NetClientState *sender, 539 const struct iovec *iov, int iovcnt, 540 NetPacketSent *sent_cb) 541 { 542 NetQueue *queue; 543 544 if (sender->link_down || !sender->peer) { 545 return iov_size(iov, iovcnt); 546 } 547 548 queue = sender->peer->send_queue; 549 550 return qemu_net_queue_send_iov(queue, sender, 551 QEMU_NET_PACKET_FLAG_NONE, 552 iov, iovcnt, sent_cb); 553 } 554 555 ssize_t 556 qemu_sendv_packet(NetClientState *nc, const struct iovec *iov, int iovcnt) 557 { 558 return qemu_sendv_packet_async(nc, iov, iovcnt, NULL); 559 } 560 561 NetClientState *qemu_find_netdev(const char *id) 562 { 563 NetClientState *nc; 564 565 QTAILQ_FOREACH(nc, &net_clients, next) { 566 if (nc->info->type == NET_CLIENT_OPTIONS_KIND_NIC) 567 continue; 568 if (!strcmp(nc->name, id)) { 569 return nc; 570 } 571 } 572 573 return NULL; 574 } 575 576 int qemu_find_net_clients_except(const char *id, NetClientState **ncs, 577 NetClientOptionsKind type, int max) 578 { 579 NetClientState *nc; 580 int ret = 0; 581 582 QTAILQ_FOREACH(nc, &net_clients, next) { 583 if (nc->info->type == type) { 584 continue; 585 } 586 if (!strcmp(nc->name, id)) { 587 if (ret < max) { 588 ncs[ret] = nc; 589 } 590 ret++; 591 } 592 } 593 594 return ret; 595 } 596 597 static int nic_get_free_idx(void) 598 { 599 int index; 600 601 for (index = 0; index < MAX_NICS; index++) 602 if (!nd_table[index].used) 603 return index; 604 return -1; 605 } 606 607 int qemu_show_nic_models(const char *arg, const char *const *models) 608 { 609 int i; 610 611 if (!arg || !is_help_option(arg)) { 612 return 0; 613 } 614 615 fprintf(stderr, "qemu: Supported NIC models: "); 616 for (i = 0 ; models[i]; i++) 617 fprintf(stderr, "%s%c", models[i], models[i+1] ? ',' : '\n'); 618 return 1; 619 } 620 621 void qemu_check_nic_model(NICInfo *nd, const char *model) 622 { 623 const char *models[2]; 624 625 models[0] = model; 626 models[1] = NULL; 627 628 if (qemu_show_nic_models(nd->model, models)) 629 exit(0); 630 if (qemu_find_nic_model(nd, models, model) < 0) 631 exit(1); 632 } 633 634 int qemu_find_nic_model(NICInfo *nd, const char * const *models, 635 const char *default_model) 636 { 637 int i; 638 639 if (!nd->model) 640 nd->model = g_strdup(default_model); 641 642 for (i = 0 ; models[i]; i++) { 643 if (strcmp(nd->model, models[i]) == 0) 644 return i; 645 } 646 647 error_report("Unsupported NIC model: %s", nd->model); 648 return -1; 649 } 650 651 static int net_init_nic(const NetClientOptions *opts, const char *name, 652 NetClientState *peer) 653 { 654 int idx; 655 NICInfo *nd; 656 const NetLegacyNicOptions *nic; 657 658 assert(opts->kind == NET_CLIENT_OPTIONS_KIND_NIC); 659 nic = opts->nic; 660 661 idx = nic_get_free_idx(); 662 if (idx == -1 || nb_nics >= MAX_NICS) { 663 error_report("Too Many NICs"); 664 return -1; 665 } 666 667 nd = &nd_table[idx]; 668 669 memset(nd, 0, sizeof(*nd)); 670 671 if (nic->has_netdev) { 672 nd->netdev = qemu_find_netdev(nic->netdev); 673 if (!nd->netdev) { 674 error_report("netdev '%s' not found", nic->netdev); 675 return -1; 676 } 677 } else { 678 assert(peer); 679 nd->netdev = peer; 680 } 681 nd->name = g_strdup(name); 682 if (nic->has_model) { 683 nd->model = g_strdup(nic->model); 684 } 685 if (nic->has_addr) { 686 nd->devaddr = g_strdup(nic->addr); 687 } 688 689 if (nic->has_macaddr && 690 net_parse_macaddr(nd->macaddr.a, nic->macaddr) < 0) { 691 error_report("invalid syntax for ethernet address"); 692 return -1; 693 } 694 qemu_macaddr_default_if_unset(&nd->macaddr); 695 696 if (nic->has_vectors) { 697 if (nic->vectors > 0x7ffffff) { 698 error_report("invalid # of vectors: %"PRIu32, nic->vectors); 699 return -1; 700 } 701 nd->nvectors = nic->vectors; 702 } else { 703 nd->nvectors = DEV_NVECTORS_UNSPECIFIED; 704 } 705 706 nd->used = 1; 707 nb_nics++; 708 709 return idx; 710 } 711 712 713 static int (* const net_client_init_fun[NET_CLIENT_OPTIONS_KIND_MAX])( 714 const NetClientOptions *opts, 715 const char *name, 716 NetClientState *peer) = { 717 [NET_CLIENT_OPTIONS_KIND_NIC] = net_init_nic, 718 #ifdef CONFIG_SLIRP 719 [NET_CLIENT_OPTIONS_KIND_USER] = net_init_slirp, 720 #endif 721 [NET_CLIENT_OPTIONS_KIND_TAP] = net_init_tap, 722 [NET_CLIENT_OPTIONS_KIND_SOCKET] = net_init_socket, 723 #ifdef CONFIG_VDE 724 [NET_CLIENT_OPTIONS_KIND_VDE] = net_init_vde, 725 #endif 726 [NET_CLIENT_OPTIONS_KIND_DUMP] = net_init_dump, 727 #ifdef CONFIG_NET_BRIDGE 728 [NET_CLIENT_OPTIONS_KIND_BRIDGE] = net_init_bridge, 729 #endif 730 [NET_CLIENT_OPTIONS_KIND_HUBPORT] = net_init_hubport, 731 }; 732 733 734 static int net_client_init1(const void *object, int is_netdev, Error **errp) 735 { 736 union { 737 const Netdev *netdev; 738 const NetLegacy *net; 739 } u; 740 const NetClientOptions *opts; 741 const char *name; 742 743 if (is_netdev) { 744 u.netdev = object; 745 opts = u.netdev->opts; 746 name = u.netdev->id; 747 748 switch (opts->kind) { 749 #ifdef CONFIG_SLIRP 750 case NET_CLIENT_OPTIONS_KIND_USER: 751 #endif 752 case NET_CLIENT_OPTIONS_KIND_TAP: 753 case NET_CLIENT_OPTIONS_KIND_SOCKET: 754 #ifdef CONFIG_VDE 755 case NET_CLIENT_OPTIONS_KIND_VDE: 756 #endif 757 #ifdef CONFIG_NET_BRIDGE 758 case NET_CLIENT_OPTIONS_KIND_BRIDGE: 759 #endif 760 case NET_CLIENT_OPTIONS_KIND_HUBPORT: 761 break; 762 763 default: 764 error_set(errp, QERR_INVALID_PARAMETER_VALUE, "type", 765 "a netdev backend type"); 766 return -1; 767 } 768 } else { 769 u.net = object; 770 opts = u.net->opts; 771 /* missing optional values have been initialized to "all bits zero" */ 772 name = u.net->has_id ? u.net->id : u.net->name; 773 } 774 775 if (net_client_init_fun[opts->kind]) { 776 NetClientState *peer = NULL; 777 778 /* Do not add to a vlan if it's a -netdev or a nic with a netdev= 779 * parameter. */ 780 if (!is_netdev && 781 (opts->kind != NET_CLIENT_OPTIONS_KIND_NIC || 782 !opts->nic->has_netdev)) { 783 peer = net_hub_add_port(u.net->has_vlan ? u.net->vlan : 0, NULL); 784 } 785 786 if (net_client_init_fun[opts->kind](opts, name, peer) < 0) { 787 /* TODO push error reporting into init() methods */ 788 error_set(errp, QERR_DEVICE_INIT_FAILED, 789 NetClientOptionsKind_lookup[opts->kind]); 790 return -1; 791 } 792 } 793 return 0; 794 } 795 796 797 static void net_visit(Visitor *v, int is_netdev, void **object, Error **errp) 798 { 799 if (is_netdev) { 800 visit_type_Netdev(v, (Netdev **)object, NULL, errp); 801 } else { 802 visit_type_NetLegacy(v, (NetLegacy **)object, NULL, errp); 803 } 804 } 805 806 807 int net_client_init(QemuOpts *opts, int is_netdev, Error **errp) 808 { 809 void *object = NULL; 810 Error *err = NULL; 811 int ret = -1; 812 813 { 814 OptsVisitor *ov = opts_visitor_new(opts); 815 816 net_visit(opts_get_visitor(ov), is_netdev, &object, &err); 817 opts_visitor_cleanup(ov); 818 } 819 820 if (!err) { 821 ret = net_client_init1(object, is_netdev, &err); 822 } 823 824 if (object) { 825 QapiDeallocVisitor *dv = qapi_dealloc_visitor_new(); 826 827 net_visit(qapi_dealloc_get_visitor(dv), is_netdev, &object, NULL); 828 qapi_dealloc_visitor_cleanup(dv); 829 } 830 831 error_propagate(errp, err); 832 return ret; 833 } 834 835 836 static int net_host_check_device(const char *device) 837 { 838 int i; 839 const char *valid_param_list[] = { "tap", "socket", "dump" 840 #ifdef CONFIG_NET_BRIDGE 841 , "bridge" 842 #endif 843 #ifdef CONFIG_SLIRP 844 ,"user" 845 #endif 846 #ifdef CONFIG_VDE 847 ,"vde" 848 #endif 849 }; 850 for (i = 0; i < sizeof(valid_param_list) / sizeof(char *); i++) { 851 if (!strncmp(valid_param_list[i], device, 852 strlen(valid_param_list[i]))) 853 return 1; 854 } 855 856 return 0; 857 } 858 859 void net_host_device_add(Monitor *mon, const QDict *qdict) 860 { 861 const char *device = qdict_get_str(qdict, "device"); 862 const char *opts_str = qdict_get_try_str(qdict, "opts"); 863 Error *local_err = NULL; 864 QemuOpts *opts; 865 866 if (!net_host_check_device(device)) { 867 monitor_printf(mon, "invalid host network device %s\n", device); 868 return; 869 } 870 871 opts = qemu_opts_parse(qemu_find_opts("net"), opts_str ? opts_str : "", 0); 872 if (!opts) { 873 return; 874 } 875 876 qemu_opt_set(opts, "type", device); 877 878 net_client_init(opts, 0, &local_err); 879 if (error_is_set(&local_err)) { 880 qerror_report_err(local_err); 881 error_free(local_err); 882 monitor_printf(mon, "adding host network device %s failed\n", device); 883 } 884 } 885 886 void net_host_device_remove(Monitor *mon, const QDict *qdict) 887 { 888 NetClientState *nc; 889 int vlan_id = qdict_get_int(qdict, "vlan_id"); 890 const char *device = qdict_get_str(qdict, "device"); 891 892 nc = net_hub_find_client_by_name(vlan_id, device); 893 if (!nc) { 894 return; 895 } 896 if (!net_host_check_device(nc->model)) { 897 monitor_printf(mon, "invalid host network device %s\n", device); 898 return; 899 } 900 qemu_del_net_client(nc); 901 } 902 903 void netdev_add(QemuOpts *opts, Error **errp) 904 { 905 net_client_init(opts, 1, errp); 906 } 907 908 int qmp_netdev_add(Monitor *mon, const QDict *qdict, QObject **ret) 909 { 910 Error *local_err = NULL; 911 QemuOptsList *opts_list; 912 QemuOpts *opts; 913 914 opts_list = qemu_find_opts_err("netdev", &local_err); 915 if (error_is_set(&local_err)) { 916 goto exit_err; 917 } 918 919 opts = qemu_opts_from_qdict(opts_list, qdict, &local_err); 920 if (error_is_set(&local_err)) { 921 goto exit_err; 922 } 923 924 netdev_add(opts, &local_err); 925 if (error_is_set(&local_err)) { 926 qemu_opts_del(opts); 927 goto exit_err; 928 } 929 930 return 0; 931 932 exit_err: 933 qerror_report_err(local_err); 934 error_free(local_err); 935 return -1; 936 } 937 938 void qmp_netdev_del(const char *id, Error **errp) 939 { 940 NetClientState *nc; 941 QemuOpts *opts; 942 943 nc = qemu_find_netdev(id); 944 if (!nc) { 945 error_set(errp, QERR_DEVICE_NOT_FOUND, id); 946 return; 947 } 948 949 opts = qemu_opts_find(qemu_find_opts_err("netdev", NULL), id); 950 if (!opts) { 951 error_setg(errp, "Device '%s' is not a netdev", id); 952 return; 953 } 954 955 qemu_del_net_client(nc); 956 qemu_opts_del(opts); 957 } 958 959 void print_net_client(Monitor *mon, NetClientState *nc) 960 { 961 monitor_printf(mon, "%s: index=%d,type=%s,%s\n", nc->name, 962 nc->queue_index, 963 NetClientOptionsKind_lookup[nc->info->type], 964 nc->info_str); 965 } 966 967 void do_info_network(Monitor *mon, const QDict *qdict) 968 { 969 NetClientState *nc, *peer; 970 NetClientOptionsKind type; 971 972 net_hub_info(mon); 973 974 QTAILQ_FOREACH(nc, &net_clients, next) { 975 peer = nc->peer; 976 type = nc->info->type; 977 978 /* Skip if already printed in hub info */ 979 if (net_hub_id_for_client(nc, NULL) == 0) { 980 continue; 981 } 982 983 if (!peer || type == NET_CLIENT_OPTIONS_KIND_NIC) { 984 print_net_client(mon, nc); 985 } /* else it's a netdev connected to a NIC, printed with the NIC */ 986 if (peer && type == NET_CLIENT_OPTIONS_KIND_NIC) { 987 monitor_printf(mon, " \\ "); 988 print_net_client(mon, peer); 989 } 990 } 991 } 992 993 void qmp_set_link(const char *name, bool up, Error **errp) 994 { 995 NetClientState *ncs[MAX_QUEUE_NUM]; 996 NetClientState *nc; 997 int queues, i; 998 999 queues = qemu_find_net_clients_except(name, ncs, 1000 NET_CLIENT_OPTIONS_KIND_MAX, 1001 MAX_QUEUE_NUM); 1002 1003 if (queues == 0) { 1004 error_set(errp, QERR_DEVICE_NOT_FOUND, name); 1005 return; 1006 } 1007 nc = ncs[0]; 1008 1009 for (i = 0; i < queues; i++) { 1010 ncs[i]->link_down = !up; 1011 } 1012 1013 if (nc->info->link_status_changed) { 1014 nc->info->link_status_changed(nc); 1015 } 1016 1017 /* Notify peer. Don't update peer link status: this makes it possible to 1018 * disconnect from host network without notifying the guest. 1019 * FIXME: is disconnected link status change operation useful? 1020 * 1021 * Current behaviour is compatible with qemu vlans where there could be 1022 * multiple clients that can still communicate with each other in 1023 * disconnected mode. For now maintain this compatibility. */ 1024 if (nc->peer && nc->peer->info->link_status_changed) { 1025 nc->peer->info->link_status_changed(nc->peer); 1026 } 1027 } 1028 1029 void net_cleanup(void) 1030 { 1031 NetClientState *nc; 1032 1033 /* We may del multiple entries during qemu_del_net_client(), 1034 * so QTAILQ_FOREACH_SAFE() is also not safe here. 1035 */ 1036 while (!QTAILQ_EMPTY(&net_clients)) { 1037 nc = QTAILQ_FIRST(&net_clients); 1038 if (nc->info->type == NET_CLIENT_OPTIONS_KIND_NIC) { 1039 qemu_del_nic(qemu_get_nic(nc)); 1040 } else { 1041 qemu_del_net_client(nc); 1042 } 1043 } 1044 } 1045 1046 void net_check_clients(void) 1047 { 1048 NetClientState *nc; 1049 int i; 1050 1051 /* Don't warn about the default network setup that you get if 1052 * no command line -net or -netdev options are specified. There 1053 * are two cases that we would otherwise complain about: 1054 * (1) board doesn't support a NIC but the implicit "-net nic" 1055 * requested one 1056 * (2) CONFIG_SLIRP not set, in which case the implicit "-net nic" 1057 * sets up a nic that isn't connected to anything. 1058 */ 1059 if (default_net) { 1060 return; 1061 } 1062 1063 net_hub_check_clients(); 1064 1065 QTAILQ_FOREACH(nc, &net_clients, next) { 1066 if (!nc->peer) { 1067 fprintf(stderr, "Warning: %s %s has no peer\n", 1068 nc->info->type == NET_CLIENT_OPTIONS_KIND_NIC ? 1069 "nic" : "netdev", nc->name); 1070 } 1071 } 1072 1073 /* Check that all NICs requested via -net nic actually got created. 1074 * NICs created via -device don't need to be checked here because 1075 * they are always instantiated. 1076 */ 1077 for (i = 0; i < MAX_NICS; i++) { 1078 NICInfo *nd = &nd_table[i]; 1079 if (nd->used && !nd->instantiated) { 1080 fprintf(stderr, "Warning: requested NIC (%s, model %s) " 1081 "was not created (not supported by this machine?)\n", 1082 nd->name ? nd->name : "anonymous", 1083 nd->model ? nd->model : "unspecified"); 1084 } 1085 } 1086 } 1087 1088 static int net_init_client(QemuOpts *opts, void *dummy) 1089 { 1090 Error *local_err = NULL; 1091 1092 net_client_init(opts, 0, &local_err); 1093 if (error_is_set(&local_err)) { 1094 qerror_report_err(local_err); 1095 error_free(local_err); 1096 return -1; 1097 } 1098 1099 return 0; 1100 } 1101 1102 static int net_init_netdev(QemuOpts *opts, void *dummy) 1103 { 1104 Error *local_err = NULL; 1105 int ret; 1106 1107 ret = net_client_init(opts, 1, &local_err); 1108 if (error_is_set(&local_err)) { 1109 qerror_report_err(local_err); 1110 error_free(local_err); 1111 return -1; 1112 } 1113 1114 return ret; 1115 } 1116 1117 int net_init_clients(void) 1118 { 1119 QemuOptsList *net = qemu_find_opts("net"); 1120 1121 if (default_net) { 1122 /* if no clients, we use a default config */ 1123 qemu_opts_set(net, NULL, "type", "nic"); 1124 #ifdef CONFIG_SLIRP 1125 qemu_opts_set(net, NULL, "type", "user"); 1126 #endif 1127 } 1128 1129 QTAILQ_INIT(&net_clients); 1130 1131 if (qemu_opts_foreach(qemu_find_opts("netdev"), net_init_netdev, NULL, 1) == -1) 1132 return -1; 1133 1134 if (qemu_opts_foreach(net, net_init_client, NULL, 1) == -1) { 1135 return -1; 1136 } 1137 1138 return 0; 1139 } 1140 1141 int net_client_parse(QemuOptsList *opts_list, const char *optarg) 1142 { 1143 #if defined(CONFIG_SLIRP) 1144 int ret; 1145 if (net_slirp_parse_legacy(opts_list, optarg, &ret)) { 1146 return ret; 1147 } 1148 #endif 1149 1150 if (!qemu_opts_parse(opts_list, optarg, 1)) { 1151 return -1; 1152 } 1153 1154 default_net = 0; 1155 return 0; 1156 } 1157 1158 /* From FreeBSD */ 1159 /* XXX: optimize */ 1160 unsigned compute_mcast_idx(const uint8_t *ep) 1161 { 1162 uint32_t crc; 1163 int carry, i, j; 1164 uint8_t b; 1165 1166 crc = 0xffffffff; 1167 for (i = 0; i < 6; i++) { 1168 b = *ep++; 1169 for (j = 0; j < 8; j++) { 1170 carry = ((crc & 0x80000000L) ? 1 : 0) ^ (b & 0x01); 1171 crc <<= 1; 1172 b >>= 1; 1173 if (carry) { 1174 crc = ((crc ^ POLYNOMIAL) | carry); 1175 } 1176 } 1177 } 1178 return crc >> 26; 1179 } 1180 1181 QemuOptsList qemu_netdev_opts = { 1182 .name = "netdev", 1183 .implied_opt_name = "type", 1184 .head = QTAILQ_HEAD_INITIALIZER(qemu_netdev_opts.head), 1185 .desc = { 1186 /* 1187 * no elements => accept any params 1188 * validation will happen later 1189 */ 1190 { /* end of list */ } 1191 }, 1192 }; 1193 1194 QemuOptsList qemu_net_opts = { 1195 .name = "net", 1196 .implied_opt_name = "type", 1197 .head = QTAILQ_HEAD_INITIALIZER(qemu_net_opts.head), 1198 .desc = { 1199 /* 1200 * no elements => accept any params 1201 * validation will happen later 1202 */ 1203 { /* end of list */ } 1204 }, 1205 }; 1206