Viktor Liu
938e8b40e2
Merge remote-tracking branch 'upstream/master' into sync-upstream
2025-11-15 12:08:21 +01:00
Viktor Liu and GitHub
cc2acf4607
Add IPv6 support to receiver creator
2025-07-09 12:43:00 +02:00
Viktor Liu
3247b60668
Use existing interface
2025-07-09 12:18:33 +02:00
Viktor Liu
8c9a58056a
Add IPv6 support to receiver creator
2025-07-09 11:50:34 +02:00
Jason A. Donenfeld
f333402bd9
version: bump snapshot
...
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com >
2025-05-22 01:45:02 +02:00
Jason A. Donenfeld
c92064f1ce
conn: don't enable GRO on Linux < 5.12
...
Kernels below 5.12 are missing this:
commit 98184612aca0a9ee42b8eb0262a49900ee9eef0d
Author: Norman Maurer <norman_maurer@apple.com >
Date: Thu Apr 1 08:59:17 2021
net: udp: Add support for getsockopt(..., ..., UDP_GRO, ..., ...);
Support for UDP_GRO was added in the past but the implementation for
getsockopt was missed which did lead to an error when we tried to
retrieve the setting for UDP_GRO. This patch adds the missing switch
case for UDP_GRO
Fixes: e20cf8d3f1f7 ("udp: implement GRO for plain UDP sockets.")
Signed-off-by: Norman Maurer <norman_maurer@apple.com >
Reviewed-by: David Ahern <dsahern@kernel.org >
Signed-off-by: David S. Miller <davem@davemloft.net >
That means we can't set the option and then read it back later. Given
how buggy UDP_GRO is in general on odd kernels, just disable it on older
kernels all together.
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com >
2025-05-22 01:43:39 +02:00
Alexander Yastrebov and Jason A. Donenfeld
264889f0bb
device: optimize message encoding
...
Optimize message encoding by eliminating binary.Write (which internally
uses reflection) in favour of hand-rolled encoding.
This is companion to 9e7529c3d2 .
Synthetic benchmark:
var packetSink []byte
func BenchmarkMessageInitiationMarshal(b *testing.B) {
var msg MessageInitiation
b.Run("binary.Write", func(b *testing.B) {
b.ReportAllocs()
for range b.N {
var buf [MessageInitiationSize]byte
writer := bytes.NewBuffer(buf[:0])
_ = binary.Write(writer, binary.LittleEndian, msg)
packetSink = writer.Bytes()
}
})
b.Run("binary.Encode", func(b *testing.B) {
b.ReportAllocs()
for range b.N {
packet := make([]byte, MessageInitiationSize)
_, _ = binary.Encode(packet, binary.LittleEndian, msg)
packetSink = packet
}
})
b.Run("marshal", func(b *testing.B) {
b.ReportAllocs()
for range b.N {
packet := make([]byte, MessageInitiationSize)
_ = msg.marshal(packet)
packetSink = packet
}
})
}
Results:
│ - │
│ sec/op │
MessageInitiationMarshal/binary.Write-8 1.337µ ± 0%
MessageInitiationMarshal/binary.Encode-8 1.242µ ± 0%
MessageInitiationMarshal/marshal-8 53.05n ± 1%
│ - │
│ B/op │
MessageInitiationMarshal/binary.Write-8 368.0 ± 0%
MessageInitiationMarshal/binary.Encode-8 160.0 ± 0%
MessageInitiationMarshal/marshal-8 160.0 ± 0%
│ - │
│ allocs/op │
MessageInitiationMarshal/binary.Write-8 3.000 ± 0%
MessageInitiationMarshal/binary.Encode-8 1.000 ± 0%
MessageInitiationMarshal/marshal-8 1.000 ± 0%
Signed-off-by: Alexander Yastrebov <yastrebov.alex@gmail.com >
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com >
2025-05-21 00:09:36 +02:00
Jason A. Donenfeld
256bcbd70d
device: add support for removing allowedips individually
...
This pairs with the recent change in wireguard-tools.
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com >
2025-05-20 23:03:06 +02:00
Jason A. Donenfeld
1571e0fbae
version: bump snapshot
...
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com >
2025-05-15 16:54:03 +02:00
Jason A. Donenfeld
842888ac5c
device: make unmarshall length checks exact
...
This is already enforced in receive.go, but if these unmarshallers are
to have error return values anyway, make them as explicit as possible.
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com >
2025-05-15 16:48:14 +02:00
Alexander Yastrebov and Jason A. Donenfeld
9e7529c3d2
device: reduce RoutineHandshake allocations
...
Reduce allocations by eliminating byte reader, hand-rolled decoding and
reusing message structs.
Synthetic benchmark:
var msgSink MessageInitiation
func BenchmarkMessageInitiationUnmarshal(b *testing.B) {
packet := make([]byte, MessageInitiationSize)
reader := bytes.NewReader(packet)
err := binary.Read(reader, binary.LittleEndian, &msgSink)
if err != nil {
b.Fatal(err)
}
b.Run("binary.Read", func(b *testing.B) {
b.ReportAllocs()
for range b.N {
reader := bytes.NewReader(packet)
_ = binary.Read(reader, binary.LittleEndian, &msgSink)
}
})
b.Run("unmarshal", func(b *testing.B) {
b.ReportAllocs()
for range b.N {
_ = msgSink.unmarshal(packet)
}
})
}
Results:
│ - │
│ sec/op │
MessageInitiationUnmarshal/binary.Read-8 1.508µ ± 2%
MessageInitiationUnmarshal/unmarshal-8 12.66n ± 2%
│ - │
│ B/op │
MessageInitiationUnmarshal/binary.Read-8 208.0 ± 0%
MessageInitiationUnmarshal/unmarshal-8 0.000 ± 0%
│ - │
│ allocs/op │
MessageInitiationUnmarshal/binary.Read-8 2.000 ± 0%
MessageInitiationUnmarshal/unmarshal-8 0.000 ± 0%
Signed-off-by: Alexander Yastrebov <yastrebov.alex@gmail.com >
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com >
2025-05-15 16:42:06 +02:00
Kurnia D Win and Jason A. Donenfeld
436f7fdc16
rwcancel: fix wrong poll event flag on ReadyWrite
...
It should be POLLIN because closeFd is read-only file.
Signed-off-by: Kurnia D Win <kurnia.d.win@gmail.com >
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com >
2025-05-05 15:10:08 +02:00
Tom Holford and Jason A. Donenfeld
0e4482a086
device: use rand.NewSource instead of rand.Seed
...
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com >
2025-05-05 15:10:08 +02:00
Tom Holford and Jason A. Donenfeld
77b6c824a8
global: replaced unused function params with _
...
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com >
2025-05-05 15:10:08 +02:00
ruokeqx and Jason A. Donenfeld
bc30fee374
tun: darwin: fetch flags and mtu from if_msghdr directly
...
Signed-off-by: ruokeqx <ruokeqx@gmail.com >
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com >
2025-05-05 15:10:08 +02:00
Tu Dinh Ngoc and Jason A. Donenfeld
b82c016264
tun: use add-with-carry in checksumNoFold()
...
Use parallel summation with native byte order per RFC 1071.
add-with-carry operation is used to add 4 words per operation. Byteswap
is performed before and after checksumming for compatibility with old
`checksumNoFold()`. With this we get a 30-80% speedup in `checksum()`
depending on packet sizes.
Add unit tests with comparison to a per-word implementation.
**Intel(R) Xeon(R) Silver 4210R CPU @ 2.40GHz**
| Size | OldTime | NewTime | Speedup |
|------|---------|---------|----------|
| 64 | 12.64 | 9.183 | 1.376456 |
| 128 | 18.52 | 12.72 | 1.455975 |
| 256 | 31.01 | 18.13 | 1.710425 |
| 512 | 54.46 | 29.03 | 1.87599 |
| 1024 | 102 | 52.2 | 1.954023 |
| 1500 | 146.8 | 81.36 | 1.804326 |
| 2048 | 196.9 | 102.5 | 1.920976 |
| 4096 | 389.8 | 200.8 | 1.941235 |
| 8192 | 767.3 | 413.3 | 1.856521 |
| 9000 | 851.7 | 448.8 | 1.897727 |
| 9001 | 854.8 | 451.9 | 1.891569 |
**AMD EPYC 7352 24-Core Processor**
| Size | OldTime | NewTime | Speedup |
|------|---------|---------|----------|
| 64 | 9.159 | 6.949 | 1.318031 |
| 128 | 13.59 | 10.59 | 1.283286 |
| 256 | 22.37 | 14.91 | 1.500335 |
| 512 | 41.42 | 24.22 | 1.710157 |
| 1024 | 81.59 | 45.05 | 1.811099 |
| 1500 | 120.4 | 68.35 | 1.761522 |
| 2048 | 162.8 | 90.14 | 1.806079 |
| 4096 | 321.4 | 180.3 | 1.782585 |
| 8192 | 650.4 | 360.8 | 1.802661 |
| 9000 | 706.3 | 398.1 | 1.774177 |
| 9001 | 712.4 | 398.2 | 1.789051 |
Signed-off-by: Tu Dinh Ngoc <dinhngoc.tu@irit.fr >
[Jason: simplified and cleaned up unit tests]
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com >
2025-05-05 15:10:08 +02:00
Jason A. Donenfeld
45916071ba
tun/netstack: cleanup network stack at closing time
...
Colin's commit went a step further and protected tun.incomingPacket with
a lock on shutdown, but let's see if the tun.stack.Close() call actually
solves that on its own.
Suggested-by: kshangx <hikeshang@hotmail.com >
Suggested-by: Colin Adler <colin1adler@gmail.com >
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com >
2025-05-05 15:09:09 +02:00
Jason A. Donenfeld
e3c1354d27
tun/netstack: remove usage of pkt.IsNil()
...
Since 3c75945fd ("netstack: remove PacketBuffer.IsNil()") this has been
invalid. Follow the replacement pattern of that commit.
The old definition inlined to the same code anyway:
func (pk *PacketBuffer) IsNil() bool {
return pk == nil
}
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com >
2025-05-05 15:05:35 +02:00
Jason A. Donenfeld
32546a15a8
mod: bump deps
...
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com >
2025-05-05 15:05:35 +02:00
Jason A. Donenfeld
9eb3221f1d
global: bump copyright notice
...
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com >
2025-05-05 15:05:35 +02:00
Jordan Whited and Jason A. Donenfeld
867a4c4a3f
device: fix missed return of QueueOutboundElementsContainer to its WaitPool
...
Fixes: 3bb8fec ("conn, device, tun: implement vectorized I/O plumbing")
Reviewed-by: Brad Fitzpatrick <bradfitz@tailscale.com >
Signed-off-by: Jordan Whited <jordan@tailscale.com >
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com >
2025-05-04 18:11:00 +02:00
Jordan Whited and Jason A. Donenfeld
113c8f1340
device: fix WaitPool sync.Cond usage
...
The sync.Locker used with a sync.Cond must be acquired when changing
the associated condition, otherwise there is a window within
sync.Cond.Wait() where a wake-up may be missed.
Fixes: 4846070 ("device: use a waiting sync.Pool instead of a channel")
Reviewed-by: Brad Fitzpatrick <bradfitz@tailscale.com >
Signed-off-by: Jordan Whited <jordan@tailscale.com >
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com >
2025-05-04 18:11:00 +02:00
Viktor Liu and GitHub
505e232447
Add CreateOutboundPacket method for direct packet injection ( #8 )
...
Add CreateOutboundPacket method for direct packet injection
2025-01-30 19:54:45 +01:00
Viktor Liu
6a676aebaa
Add CreateOutboundPacket method for direct packet injection
2024-12-30 13:03:07 +01:00
Zoltan Papp and GitHub
f9cdce5e32
Merge pull request #7 from netbirdio/export-control
...
Export list of control functions
2024-11-25 16:01:34 +01:00