hc
2023-12-09 b22da3d8526a935aa31e086e63f60ff3246cb61c
kernel/arch/um/drivers/vector_transports.c
....@@ -1,7 +1,7 @@
1
+// SPDX-License-Identifier: GPL-2.0
12 /*
23 * Copyright (C) 2017 - Cambridge Greys Limited
34 * Copyright (C) 2011 - 2014 Cisco Systems Inc
4
- * Licensed under the GPL.
55 */
66
77 #include <linux/etherdevice.h>
....@@ -418,7 +418,7 @@
418418 return 0;
419419 }
420420
421
-static int build_tap_transport_data(struct vector_private *vp)
421
+static int build_hybrid_transport_data(struct vector_private *vp)
422422 {
423423 if (uml_raw_enable_vnet_headers(vp->fds->rx_fd)) {
424424 vp->form_header = &raw_form_header;
....@@ -432,7 +432,7 @@
432432 NETIF_F_TSO | NETIF_F_GSO | NETIF_F_GRO);
433433 netdev_info(
434434 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"
436436 );
437437 } else {
438438 return 0; /* do not try to enable tap too if raw failed */
....@@ -440,6 +440,38 @@
440440 if (uml_tap_enable_vnet_headers(vp->fds->tx_fd))
441441 return 0;
442442 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;
443475 }
444476
445477 int build_transport_data(struct vector_private *vp)
....@@ -454,6 +486,10 @@
454486 return build_raw_transport_data(vp);
455487 if (strncmp(transport, TRANS_TAP, TRANS_TAP_LEN) == 0)
456488 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);
457493 return 0;
458494 }
459495