| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0 |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * Copyright (C) 2017 - Cambridge Greys Limited |
|---|
| 3 | 4 | * Copyright (C) 2011 - 2014 Cisco Systems Inc |
|---|
| 4 | | - * Licensed under the GPL. |
|---|
| 5 | 5 | */ |
|---|
| 6 | 6 | |
|---|
| 7 | 7 | #include <linux/etherdevice.h> |
|---|
| .. | .. |
|---|
| 418 | 418 | return 0; |
|---|
| 419 | 419 | } |
|---|
| 420 | 420 | |
|---|
| 421 | | -static int build_tap_transport_data(struct vector_private *vp) |
|---|
| 421 | +static int build_hybrid_transport_data(struct vector_private *vp) |
|---|
| 422 | 422 | { |
|---|
| 423 | 423 | if (uml_raw_enable_vnet_headers(vp->fds->rx_fd)) { |
|---|
| 424 | 424 | vp->form_header = &raw_form_header; |
|---|
| .. | .. |
|---|
| 432 | 432 | NETIF_F_TSO | NETIF_F_GSO | NETIF_F_GRO); |
|---|
| 433 | 433 | netdev_info( |
|---|
| 434 | 434 | vp->dev, |
|---|
| 435 | | - "tap/raw: using vnet headers for tso and tx/rx checksum" |
|---|
| 435 | + "tap/raw hybrid: using vnet headers for tso and tx/rx checksum" |
|---|
| 436 | 436 | ); |
|---|
| 437 | 437 | } else { |
|---|
| 438 | 438 | return 0; /* do not try to enable tap too if raw failed */ |
|---|
| .. | .. |
|---|
| 440 | 440 | if (uml_tap_enable_vnet_headers(vp->fds->tx_fd)) |
|---|
| 441 | 441 | return 0; |
|---|
| 442 | 442 | return -1; |
|---|
| 443 | +} |
|---|
| 444 | + |
|---|
| 445 | +static int build_tap_transport_data(struct vector_private *vp) |
|---|
| 446 | +{ |
|---|
| 447 | + /* "Pure" tap uses the same fd for rx and tx */ |
|---|
| 448 | + if (uml_tap_enable_vnet_headers(vp->fds->tx_fd)) { |
|---|
| 449 | + vp->form_header = &raw_form_header; |
|---|
| 450 | + vp->verify_header = &raw_verify_header; |
|---|
| 451 | + vp->header_size = sizeof(struct virtio_net_hdr); |
|---|
| 452 | + vp->rx_header_size = sizeof(struct virtio_net_hdr); |
|---|
| 453 | + vp->dev->hw_features |= |
|---|
| 454 | + (NETIF_F_TSO | NETIF_F_GSO | NETIF_F_GRO); |
|---|
| 455 | + vp->dev->features |= |
|---|
| 456 | + (NETIF_F_RXCSUM | NETIF_F_HW_CSUM | |
|---|
| 457 | + NETIF_F_TSO | NETIF_F_GSO | NETIF_F_GRO); |
|---|
| 458 | + netdev_info( |
|---|
| 459 | + vp->dev, |
|---|
| 460 | + "tap: using vnet headers for tso and tx/rx checksum" |
|---|
| 461 | + ); |
|---|
| 462 | + return 0; |
|---|
| 463 | + } |
|---|
| 464 | + return -1; |
|---|
| 465 | +} |
|---|
| 466 | + |
|---|
| 467 | + |
|---|
| 468 | +static int build_bess_transport_data(struct vector_private *vp) |
|---|
| 469 | +{ |
|---|
| 470 | + vp->form_header = NULL; |
|---|
| 471 | + vp->verify_header = NULL; |
|---|
| 472 | + vp->header_size = 0; |
|---|
| 473 | + vp->rx_header_size = 0; |
|---|
| 474 | + return 0; |
|---|
| 443 | 475 | } |
|---|
| 444 | 476 | |
|---|
| 445 | 477 | int build_transport_data(struct vector_private *vp) |
|---|
| .. | .. |
|---|
| 454 | 486 | return build_raw_transport_data(vp); |
|---|
| 455 | 487 | if (strncmp(transport, TRANS_TAP, TRANS_TAP_LEN) == 0) |
|---|
| 456 | 488 | return build_tap_transport_data(vp); |
|---|
| 489 | + if (strncmp(transport, TRANS_HYBRID, TRANS_HYBRID_LEN) == 0) |
|---|
| 490 | + return build_hybrid_transport_data(vp); |
|---|
| 491 | + if (strncmp(transport, TRANS_BESS, TRANS_BESS_LEN) == 0) |
|---|
| 492 | + return build_bess_transport_data(vp); |
|---|
| 457 | 493 | return 0; |
|---|
| 458 | 494 | } |
|---|
| 459 | 495 | |
|---|