.. | .. |
---|
| 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 | |
---|