Skip to content

CVPN-2346 Implement GSO offload on lightway-server#413

Open
kp-samuel-tam wants to merge 10 commits into
mainfrom
gso-on-server
Open

CVPN-2346 Implement GSO offload on lightway-server#413
kp-samuel-tam wants to merge 10 commits into
mainfrom
gso-on-server

Conversation

@kp-samuel-tam
Copy link
Copy Markdown
Member

@kp-samuel-tam kp-samuel-tam commented May 4, 2026

Description

Implement GSO on server side on DTLS and Expresslane, specifically on bulk server->client traffic. This consistently halves the total syscalls used during bulk transfers, and also improves aggregated server throughput by 2x for multiple clients doing transfers.

When --enable-tun-offload is set, the server reads TSO superpackets from the TUN with IFF_VNET_HDR, segments them in userspace, and emits each superpacket as a single sendmsg(UDP_SEGMENT) instead of N per-segment syscalls. On a single-flow iperf3 reverse test the kernel UDP send path collapses near-completely: udp_sendmsg 0.71% → ~0.05%, sock_alloc_send_pskb 2.61% → ~0.13%, mlx5e_xmit 1.88% → ~0%.

Trade-off: kernel work is replaced with userspace work (per-segment IP/TCP/UDP checksum recomputation, segment assembly). Kernel-side wins are clear and measurable; userspace cost is now the dominant factor.

Pacing: each sendmsg(UDP_SEGMENT) produces a NIC burst of up to N segments. This can exceed receiver socket buffer depth and increase tail drops at peak rates. We will need to revisit better TX pacing under congested links.

Future work will focus on compatibility with TUN backends like io_uring, GRO on the server side, and full GSO/GRO on client side, where single-flow workloads should see the biggest visible speedup not in this PR.

Motivation and Context

See ticket CVPN-2346.

How Has This Been Tested?

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)

Checklist:

  • My change requires a change to the documentation.
  • I have updated the documentation accordingly.
  • The correct base branch is being used, if not main

@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 4, 2026

Code coverage summary for 8b7d704:

Filename                                                          Regions    Missed Regions     Cover   Functions  Missed Functions  Executed       Lines      Missed Lines     Cover    Branches   Missed Branches     Cover
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
lightway-app-utils/src/args/cipher.rs                                   5                 5     0.00%           1                 1     0.00%           5                 5     0.00%           0                 0         -
lightway-app-utils/src/args/connection_type.rs                          8                 8     0.00%           2                 2     0.00%           8                 8     0.00%           0                 0         -
lightway-app-utils/src/args/duration.rs                               121                22    81.82%          11                 5    54.55%          64                15    76.56%           0                 0         -
lightway-app-utils/src/args/ip_map.rs                                  27                27     0.00%           5                 5     0.00%          19                19     0.00%           0                 0         -
lightway-app-utils/src/args/keyshare.rs                                 5                 5     0.00%           1                 1     0.00%           5                 5     0.00%           0                 0         -
lightway-app-utils/src/args/logging.rs                                 37                37     0.00%           3                 3     0.00%          31                31     0.00%           0                 0         -
lightway-app-utils/src/args/nonzero_duration.rs                       128                24    81.25%          10                 4    60.00%          68                16    76.47%           0                 0         -
lightway-app-utils/src/connection_ticker.rs                           229                17    92.58%          28                 4    85.71%         126                15    88.10%           0                 0         -
lightway-app-utils/src/dplpmtud_timer.rs                              209                13    93.78%          22                 4    81.82%         117                11    90.60%           0                 0         -
lightway-app-utils/src/event_stream.rs                                 19                 0   100.00%           3                 0   100.00%          11                 0   100.00%           0                 0         -
lightway-app-utils/src/packet_codec.rs                                  2                 2     0.00%           1                 1     0.00%           1                 1     0.00%           0                 0         -
lightway-app-utils/src/sockopt/ip_mtu_discover.rs                      81                81     0.00%           6                 6     0.00%          72                72     0.00%           0                 0         -
lightway-app-utils/src/sockopt/ip_pktinfo.rs                           14                14     0.00%           1                 1     0.00%          16                16     0.00%           0                 0         -
lightway-app-utils/src/tun.rs                                         341               341     0.00%          36                36     0.00%         208               208     0.00%           0                 0         -
lightway-app-utils/src/utils.rs                                        21                21     0.00%           1                 1     0.00%          11                11     0.00%           0                 0         -
lightway-client/src/config.rs                                         292                96    67.12%          13                 6    53.85%         198                59    70.20%           0                 0         -
lightway-client/src/dns_manager.rs                                     18                18     0.00%           4                 4     0.00%          16                16     0.00%           0                 0         -
lightway-client/src/io/inside/tun.rs                                   82                82     0.00%          12                12     0.00%          60                60     0.00%           0                 0         -
lightway-client/src/io/outside.rs                                      14                14     0.00%           2                 2     0.00%          12                12     0.00%           0                 0         -
lightway-client/src/io/outside/tcp.rs                                  92                92     0.00%          13                13     0.00%          59                59     0.00%           0                 0         -
lightway-client/src/io/outside/udp.rs                                 170               170     0.00%          18                18     0.00%         111               111     0.00%           0                 0         -
lightway-client/src/io/outside/udp_batch_receiver.rs                   61                11    81.97%           6                 1    83.33%          56                12    78.57%           0                 0         -
lightway-client/src/keepalive.rs                                      615                44    92.85%          55                 6    89.09%         330                25    92.42%           0                 0         -
lightway-client/src/lib.rs                                           1246               670    46.23%         102                53    48.04%         835               489    41.44%           0                 0         -
lightway-client/src/main.rs                                           351               351     0.00%          20                20     0.00%         233               233     0.00%           0                 0         -
lightway-client/src/platform/linux/dns_manager.rs                     118                91    22.88%          14                 9    35.71%          87                62    28.74%           0                 0         -
lightway-client/src/platform/linux/dns_manager/direct_file.rs         106                42    60.38%          12                 6    50.00%          65                29    55.38%           0                 0         -
lightway-client/src/platform/linux/dns_manager/resolvconf.rs           61                61     0.00%           8                 8     0.00%          52                52     0.00%           0                 0         -
lightway-client/src/platform/linux/dns_manager/resolvectl.rs           41                41     0.00%           5                 5     0.00%          34                34     0.00%           0                 0         -
lightway-client/src/route_manager.rs                                 1190               212    82.18%          77                 8    89.61%         663               117    82.35%           0                 0         -
lightway-core/src/borrowed_bytesmut.rs                                373                 0   100.00%          24                 0   100.00%         185                 0   100.00%           0                 0         -
lightway-core/src/builder_predicates.rs                                24                12    50.00%           4                 2    50.00%          24                12    50.00%           0                 0         -
lightway-core/src/cipher.rs                                            13                 0   100.00%           2                 0   100.00%          10                 0   100.00%           0                 0         -
lightway-core/src/connection.rs                                      1767               925    47.65%          74                29    60.81%        1246               622    50.08%           0                 0         -
lightway-core/src/connection/builders.rs                              254                46    81.89%          22                 8    63.64%         263                53    79.85%           0                 0         -
lightway-core/src/connection/dplpmtud.rs                             1741                81    95.35%          63                 0   100.00%         830                 7    99.16%           0                 0         -
lightway-core/src/connection/expresslane.rs                            27                11    59.26%           4                 1    75.00%          36                 7    80.56%           0                 0         -
lightway-core/src/connection/fragment_map.rs                          366                 6    98.36%          25                 0   100.00%         254                 3    98.82%           0                 0         -
lightway-core/src/connection/io_adapter.rs                            657               152    76.86%          37                 8    78.38%         355                97    72.68%           0                 0         -
lightway-core/src/connection/key_update.rs                             34                13    61.76%           5                 0   100.00%          38                19    50.00%           0                 0         -
lightway-core/src/context.rs                                          214                51    76.17%          28                11    60.71%         235                64    72.77%           0                 0         -
lightway-core/src/context/ip_pool.rs                                    8                 3    62.50%           1                 0   100.00%           5                 0   100.00%           0                 0         -
lightway-core/src/context/server_auth.rs                               37                37     0.00%           4                 4     0.00%          26                26     0.00%           0                 0         -
lightway-core/src/encoding_request_states.rs                            3                 0   100.00%           1                 0   100.00%           3                 0   100.00%           0                 0         -
lightway-core/src/gso.rs                                              694                41    94.09%          31                 2    93.55%         383                30    92.17%           0                 0         -
lightway-core/src/io.rs                                                10                10     0.00%           3                 3     0.00%           9                 9     0.00%           0                 0         -
lightway-core/src/keyshare.rs                                           5                 0   100.00%           1                 0   100.00%           5                 0   100.00%           0                 0         -
lightway-core/src/lib.rs                                                9                 0   100.00%           3                 0   100.00%           9                 0   100.00%           0                 0         -
lightway-core/src/metrics.rs                                           51                41    19.61%          21                17    19.05%          47                37    21.28%           0                 0         -
lightway-core/src/packet.rs                                            38                10    73.68%           4                 1    75.00%          30                 6    80.00%           0                 0         -
lightway-core/src/plugin.rs                                           307                17    94.46%          22                 4    81.82%         148                10    93.24%           0                 0         -
lightway-core/src/tls/mod.rs                                            4                 4     0.00%           1                 1     0.00%           3                 3     0.00%           0                 0         -
lightway-core/src/utils.rs                                            334                26    92.22%          22                 2    90.91%         165                17    89.70%           0                 0         -
lightway-core/src/version.rs                                           93                 0   100.00%          17                 0   100.00%          82                 0   100.00%           0                 0         -
lightway-core/src/wire.rs                                             438                42    90.41%          29                 1    96.55%         235                12    94.89%           0                 0         -
lightway-core/src/wire/auth_failure.rs                                 27                 1    96.30%           3                 0   100.00%          17                 0   100.00%           0                 0         -
lightway-core/src/wire/auth_request.rs                                684                57    91.67%          34                 1    97.06%         351                24    93.16%           0                 0         -
lightway-core/src/wire/auth_success_with_config_ipv4.rs               222                 3    98.65%          11                 0   100.00%         124                 0   100.00%           0                 0         -
lightway-core/src/wire/data.rs                                         51                 1    98.04%           5                 0   100.00%          33                 0   100.00%           0                 0         -
lightway-core/src/wire/data_frag.rs                                   127                 1    99.21%          14                 0   100.00%          80                 0   100.00%           0                 0         -
lightway-core/src/wire/encoding_request.rs                             82                 2    97.56%           6                 0   100.00%          42                 1    97.62%           0                 0         -
lightway-core/src/wire/encoding_response.rs                            82                 2    97.56%           6                 0   100.00%          42                 1    97.62%           0                 0         -
lightway-core/src/wire/expresslane_config.rs                          192                 1    99.48%          10                 0   100.00%         110                 0   100.00%           0                 0         -
lightway-core/src/wire/expresslane_data.rs                           1330                69    94.81%          48                 5    89.58%         679                37    94.55%           0                 0         -
lightway-core/src/wire/ping.rs                                         95                 2    97.89%           7                 0   100.00%          59                 0   100.00%           0                 0         -
lightway-core/src/wire/pong.rs                                        109                 2    98.17%           8                 0   100.00%          72                 0   100.00%           0                 0         -
lightway-core/src/wire/server_config.rs                                69                 2    97.10%           4                 0   100.00%          37                 0   100.00%           0                 0         -
lightway-server/src/auth.rs                                           273                49    82.05%          22                 6    72.73%         171                28    83.63%           0                 0         -
lightway-server/src/config.rs                                          26                26     0.00%           1                 1     0.00%          45                45     0.00%           0                 0         -
lightway-server/src/connection.rs                                     137               137     0.00%          11                11     0.00%         110               110     0.00%           0                 0         -
lightway-server/src/connection_manager.rs                             339               339     0.00%          40                40     0.00%         294               294     0.00%           0                 0         -
lightway-server/src/connection_manager/connection_map.rs              407                16    96.07%          21                 1    95.24%         228                 7    96.93%           0                 0         -
lightway-server/src/io/inside/tun.rs                                   46                46     0.00%          10                10     0.00%          32                32     0.00%           0                 0         -
lightway-server/src/io/outside/tcp.rs                                  93                93     0.00%          10                10     0.00%          68                68     0.00%           0                 0         -
lightway-server/src/io/outside/udp.rs                                 342               342     0.00%          17                17     0.00%         235               235     0.00%           0                 0         -
lightway-server/src/io/outside/udp/cmsg.rs                            197                53    73.10%          14                 5    64.29%         158                43    72.78%           0                 0         -
lightway-server/src/ip_manager.rs                                     542                50    90.77%          22                 4    81.82%         242                23    90.50%           0                 0         -
lightway-server/src/ip_manager/ip_pool.rs                             545                 0   100.00%          28                 0   100.00%         257                 0   100.00%           0                 0         -
lightway-server/src/lib.rs                                            393               393     0.00%          18                18     0.00%         264               264     0.00%           0                 0         -
lightway-server/src/main.rs                                           247               247     0.00%          10                10     0.00%         130               130     0.00%           0                 0         -
lightway-server/src/metrics.rs                                        254               250     1.57%          85                83     2.35%         215               211     1.86%           0                 0         -
lightway-server/src/statistics.rs                                     132                59    55.30%           8                 4    50.00%          90                39    56.67%           0                 0         -
uniffi-bindgen/src/uniffi-bindgen.rs                                    3                 3     0.00%           1                 1     0.00%           3                 3     0.00%           0                 0         -
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
TOTAL                                                               20251              6386    68.47%        1414               566    59.97%       12387              4432    64.22%           0                 0         -

✅ Region coverage 68% passes
✅ Line coverage 64% passes

@kp-samuel-tam kp-samuel-tam changed the title Implement GSO offload on lightway-server CVPN-2346 Implement GSO offload on lightway-server May 11, 2026
@kp-samuel-tam kp-samuel-tam force-pushed the gso-on-server branch 7 times, most recently from b5849fe to c62619f Compare May 13, 2026 11:41
@kp-samuel-tam kp-samuel-tam marked this pull request as ready for review May 13, 2026 12:48
@kp-samuel-tam kp-samuel-tam requested a review from a team as a code owner May 13, 2026 12:48
Comment thread lightway-core/src/plugin.rs Outdated
}

impl PluginList {
#[cfg(target_os = "linux")]
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This need not be a linux specific method. Looks generic

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Failed lint because the function is unused on other platforms, needed to add back #[allow(dead_code)].

Comment thread lightway-server/src/lib.rs Outdated
// Expose the full slab to `recv_gso` as `&mut [u8]`.
// SAFETY: every byte of the slab was zero-initialized at
// construction; subsequent iters only ever shrunk `len` or
// overwrote bytes. We never hand out uninitialized memory.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This does not sound safe, as pkt is mutable we could also create new BytesMut and replace it.
So now if you reserve, it might be unintialized.

I think what you want is https://docs.rs/bytes/latest/bytes/struct.BytesMut.html#method.spare_capacity_mut which gives pointer to spare buffer which you can sent to recv_gso

Copy link
Copy Markdown
Member Author

@kp-samuel-tam kp-samuel-tam May 21, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Because spare_capacity_mut(&mut self) -> &mut [MaybeUninit<u8>], I think we ultimately still need a unsafe cast on the &mut [MaybeUninit<u8>] because tun_rs::AsyncDevice::recv() only takes &mut [u8] in the end. I will think about it.

Interestingly there's also std::io::Read::read_buf in the nightly std which takes MaybeUninit<u8> (which tun-rs could use) but it is never stabilized.

Edit: I changed recv signatures to accept MaybeUninit and do one unsafe cast in the end, I am hoping to drop it once tun-rs accepts MaybeUninit. Please take a look at e995ffa 👀

Comment thread lightway-server/src/lib.rs Outdated
@kp-samuel-tam kp-samuel-tam force-pushed the gso-on-server branch 7 times, most recently from 45e2ed8 to 4642134 Compare May 27, 2026 13:37
Add the `gso` module to lightway-core with VirtioNetHdr definition,
checksum helpers, and segment build/count functions for splitting GSO
superpackets into individual segments with correct per-segment header
fixups (IP ID, TCP seq, checksums).

Also add tun-rs workspace dependency to lightway-core and
lightway-server Cargo.toml.
Add the `send_gso` method to the OutsideIOSendCallback trait for
sending concatenated wire packets via kernel GSO (UDP_SEGMENT).

Include todo!() stub implementations in client TCP/UDP, server TCP,
and test harnesses to satisfy the trait contract.
Add gso_buf/gso_size fields to TlsIOAdapter so the wolfssl send()
callback can buffer raw encrypted segments during GSO processing.
Add udp_send_gso to wrap buffered segments with wire headers and
send as one sendmsg via the vectored send_gso callback.

The implementation uses a zero-copy fast path when no outside
plugins are configured: scatter-gather via iovec with a shared
header buffer and borrowed slices of the encrypted segment buffer.
The plugin path builds each segment as its own BytesMut and enforces
the uniform-stride requirement of UDP_SEGMENT.
Add inside_data_received_gso and send_to_outside_gso methods to
Connection. These process a GSO superpacket as a single packet through
plugins/encoder, then split into per-segment encrypted frames and
collect into a wire buffer for batch send via UDP_SEGMENT.
Add offload config field to TunConfig to enable IFF_VNET_HDR on TUN
devices. Add recv_gso for raw reads that include the virtio_net_hdr
prefix, and prepend a zeroed virtio header on try_send when offload
is enabled.
Extend send_to_socket to accept an optional gso_size parameter and
build UDP_SEGMENT cmsg for kernel-level segmentation. Implement the
real send_gso on UdpSocket using this path.
Add enable_tun_offload config option and wire it through ServerConfig
to main. Extract the default inside IO loop into its own function and
add inside_io_loop_gso that reads virtio-framed superpackets from TUN,
dispatches GSO vs single-packet paths, and sets gso_max_size on the
TUN device.
Lets the GSO recv loop use BytesMut::spare_capacity_mut() directly,
dropping the one-time 65 KB zero-init and one of the two call-site
unsafe blocks. The cast back to &mut [u8] now lives only at the
syscall boundary in TunDirect::recv_gso, with a comment pointing at
the tun-rs upstream gap to track for cleanup.
Switch build_segment to take `&mut [MaybeUninit<u8>]` and return the
initialized prefix as `&mut [u8]`. The function fully overwrites
bytes 0..total_len through `<[MaybeUninit<u8>]>::write_copy_of_slice`
before any read, so no `&mut [u8]` is ever constructed over uninit
memory; the `&mut [u8]` reborrow at the end is a single local
`unsafe` covering bytes the prior writes initialized.

On the send side, this lets send_to_outside_gso drop the up-front
65 KB-equivalent zero-init (`BytesMut::zeroed(mtu)`) and the per-iter
`set_len(mtu)` unsafe block. The loop now uses `clear()` +
`spare_capacity_mut()`, identical in shape to `inside_io_loop_gso`'s
recv buffer — one unsafe `set_len(total_len)` per segment, no cast.
New Earthfile target `run-udp-tun-offload-test` runs the standard UDP
e2e against a server started with `--enable-tun-offload`, exercising
the TUN IFF_VNET_HDR + UDP_SEGMENT + GRO path end-to-end. Wired into
`run-all-tests` so CI picks it up alongside the other UDP variants.
Copy link
Copy Markdown
Member Author

@kp-samuel-tam kp-samuel-tam left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some updates and comments to help with reviews.

Tun::Direct(t) => t.recv_gso(buf).await,
#[cfg(feature = "io-uring")]
Tun::IoUring(_) => {
IOCallbackResult::Err(std::io::Error::from(std::io::ErrorKind::Unsupported))
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I changed from todo!() to this.

Comment on lines +441 to +451
// SAFETY: `tun_rs::AsyncDevice::recv` takes `&mut [u8]` and forwards
// to `libc::read(2)`. The kernel only writes — it never dereferences
// userspace memory for reading — so handing it our uninitialized slab
// is sound at the syscall boundary. The unsoundness lives in *Rust*:
// constructing a `&mut [u8]` over uninitialized bytes is UB per strict
// aliasing rules, even if no one reads them. This cast is the only
// place we paper over that gap. Delete it (and revert this signature)
// once `tun-rs` exposes a `MaybeUninit`-aware recv.
#[allow(unsafe_code)]
let raw =
unsafe { std::slice::from_raw_parts_mut(buf.as_mut_ptr().cast::<u8>(), buf.len()) };
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is new to cast MaybeUninit away for tun.recv() which doesn't support MaybeUninit yet.


/// Raw read from Tun, returning the full virtio frame (header + payload).
#[cfg(target_os = "linux")]
pub async fn recv_gso(&self, buf: &mut [std::mem::MaybeUninit<u8>]) -> IOCallbackResult<usize> {
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A lot of read/recv signatures are changed from &mut [u8] to &mut [MaybeUninit<u8>].

Comment on lines +468 to +474
// IFF_VNET_HDR requires a zeroed `virtio_net_hdr` prefix
// on every write (NEEDS_CSUM=0, GSO_NONE).
let hdr_len = tun_rs::VIRTIO_NET_HDR_LEN;
let mut prefixed = bytes::BytesMut::zeroed(hdr_len);
prefixed.extend_from_slice(&buf[..]);
tun.try_send(&prefixed[..])
.map(|n| n.saturating_sub(hdr_len))
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This can be optimized to be writev but I'd defer it for now.

Comment on lines +103 to +107
/// When `Some`, the wolfssl IO callback `send()` appends raw
/// encrypted segments here instead of sending to the socket.
/// After all segments are collected, `udp_send_gso` wraps each
/// with `wire::Header`, runs plugins, and sends via `send_gso`.
pub(crate) gso_buf: Option<BytesMut>,
Copy link
Copy Markdown
Member Author

@kp-samuel-tam kp-samuel-tam May 28, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not new but this is a buffer to "intercept" wolfssl doing send immediately after the packet is encrypted. Now when this is Some(_) it will store packets here and return early; for us to do GSO instead of shooting individual packets out right away.

Edit: A future plan is to do streaming/in-place encryption on the original superpacket, so this would not be needed... but deferred

@@ -48,32 +49,45 @@ impl std::fmt::Display for BindMode {

fn send_to_socket(
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not new, but did additional refactoring on fn send_to_socket, now .with_control() is unconditional but kernel handles a cmsg_len = 0 cmsg just fine.

send_to_socket(&self.sock, buf, &peer_addr.1, self.reply_pktinfo)
send_to_socket(
&self.sock,
&[IoSlice::new(buf)],
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not new, but this is changed buf -> &[IoSlice::new(buf)] because send_to_socket signature changed for iovec aka scatter/gather IO.

}
}

async fn inside_io_loop_default(
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is pulled directly from the inside_io_loop tokio::spawn code and unchanged.

}

#[cfg(target_os = "linux")]
async fn inside_io_loop_gso(
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is the GSO replacement for original inside_io_loop to handle the vnet_hdr and other GSO stuff.

# headers per segment can exceed what sendmsg(UDP_SEGMENT) accepts, causing the
# kernel to return EMSGSIZE ("Message too long") on the outside socket.
ip link set dev "${tunname}" gso_max_size 60300
ip link set dev "${tunname}" up
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is new to cap gso_max_size to not blow up sendmsg(UDP_SEGMENT) later. We also need this in deployment scripts because it's not in the lightway code anymore.

Comment thread lightway-core/src/gso.rs
/// `out` holds exactly the one segment's wire bytes.
///
/// `out.capacity()` must be ≥ one segment's maximum wire length.
pub(crate) fn build_segment(
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I added some new tests below for this function - this is run to construct a complete, checksum-computed packet for wolfssl to encrypt. Could be written in IO scatter/gather style and avoid the copies if we use the wolfssl streaming/in-place encrypt APIs.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants