Skip to content

Commit be7596d

Browse files
committed
store read size within the buffer carrier
Signed-off-by: Alex Valiushko <alexvaliushko@tailscale.com> Change-Id: I48217f8f461b17a01901cee9ab64d45e6a6a6964
1 parent e739e4b commit be7596d

21 files changed

Lines changed: 47 additions & 54 deletions

buffer/buffer.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ type Recycler interface {
4646
type Buffer struct {
4747
data []byte
4848
recycler Recycler
49+
50+
Size int // size of the read, excluding offset
4951
}
5052

5153
// New creates a standalone Buffer.

conn/bind_std.go

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,6 @@ func (s *StdNetBind) receiveIP(
235235
conn *net.UDPConn,
236236
rxOffload bool,
237237
bufs []*buffer.Buffer,
238-
sizes []int,
239238
eps []Endpoint,
240239
) (n int, err error) {
241240
msgs := s.getMessages()
@@ -288,8 +287,8 @@ func (s *StdNetBind) receiveIP(
288287
}
289288
for i := 0; i < numMsgs; i++ {
290289
msg := &(*msgs)[i]
291-
sizes[i] = msg.N
292-
if sizes[i] == 0 {
290+
bufs[i].Size = msg.N
291+
if bufs[i].Size == 0 {
293292
continue
294293
}
295294
addrPort := msg.Addr.(*net.UDPAddr).AddrPort()
@@ -301,14 +300,14 @@ func (s *StdNetBind) receiveIP(
301300
}
302301

303302
func (s *StdNetBind) makeReceiveIPv4(pc *ipv4.PacketConn, conn *net.UDPConn, rxOffload bool) ReceiveFunc {
304-
return func(bufs []*buffer.Buffer, sizes []int, eps []Endpoint) (n int, err error) {
305-
return s.receiveIP(pc, conn, rxOffload, bufs, sizes, eps)
303+
return func(bufs []*buffer.Buffer, eps []Endpoint) (n int, err error) {
304+
return s.receiveIP(pc, conn, rxOffload, bufs, eps)
306305
}
307306
}
308307

309308
func (s *StdNetBind) makeReceiveIPv6(pc *ipv6.PacketConn, conn *net.UDPConn, rxOffload bool) ReceiveFunc {
310-
return func(bufs []*buffer.Buffer, sizes []int, eps []Endpoint) (n int, err error) {
311-
return s.receiveIP(pc, conn, rxOffload, bufs, sizes, eps)
309+
return func(bufs []*buffer.Buffer, eps []Endpoint) (n int, err error) {
310+
return s.receiveIP(pc, conn, rxOffload, bufs, eps)
312311
}
313312
}
314313

conn/bind_std_test.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,12 @@ func TestStdNetBindReceiveFuncAfterClose(t *testing.T) {
1919
bind.Close()
2020
bufs := make([]*buffer.Buffer, IdealBatchSize)
2121
bufs[0] = buffer.New(make([]byte, buffer.MaxMessageSize), nil)
22-
sizes := make([]int, IdealBatchSize)
2322
eps := make([]Endpoint, IdealBatchSize)
2423
for _, fn := range fns {
2524
// The ReceiveFuncs must not access conn-related fields on StdNetBind
2625
// unguarded. Close() nils the conn-related fields resulting in a panic
2726
// if they violate the mutex.
28-
fn(bufs, sizes, eps)
27+
fn(bufs, eps)
2928
}
3029
}
3130

conn/bind_windows.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -417,20 +417,20 @@ retry:
417417
return n, &ep, nil
418418
}
419419

420-
func (bind *WinRingBind) receiveIPv4(bufs []*buffer.Buffer, sizes []int, eps []Endpoint) (int, error) {
420+
func (bind *WinRingBind) receiveIPv4(bufs []*buffer.Buffer, eps []Endpoint) (int, error) {
421421
bind.mu.RLock()
422422
defer bind.mu.RUnlock()
423423
n, ep, err := bind.v4.Receive(bufs[0].Data(), &bind.isOpen)
424-
sizes[0] = n
424+
bufs[0].Size = n
425425
eps[0] = ep
426426
return 1, err
427427
}
428428

429-
func (bind *WinRingBind) receiveIPv6(bufs []*buffer.Buffer, sizes []int, eps []Endpoint) (int, error) {
429+
func (bind *WinRingBind) receiveIPv6(bufs []*buffer.Buffer, eps []Endpoint) (int, error) {
430430
bind.mu.RLock()
431431
defer bind.mu.RUnlock()
432432
n, ep, err := bind.v6.Receive(bufs[0].Data(), &bind.isOpen)
433-
sizes[0] = n
433+
bufs[0].Size = n
434434
eps[0] = ep
435435
return 1, err
436436
}

conn/bindtest/bindtest.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ func (c *ChannelBind) BatchSize() int { return 1 }
9595
func (c *ChannelBind) SetMark(mark uint32) error { return nil }
9696

9797
func (c *ChannelBind) makeReceiveFunc(ch chan []byte) conn.ReceiveFunc {
98-
return func(bufs []*buffer.Buffer, sizes []int, eps []conn.Endpoint) (n int, err error) {
98+
return func(bufs []*buffer.Buffer, eps []conn.Endpoint) (n int, err error) {
9999
select {
100100
case <-c.closeSignal:
101101
return 0, net.ErrClosed
@@ -104,7 +104,7 @@ func (c *ChannelBind) makeReceiveFunc(ch chan []byte) conn.ReceiveFunc {
104104
bufs[0] = buffer.New(make([]byte, buffer.MaxMessageSize), nil)
105105
}
106106
copied := copy(bufs[0].Data(), rx)
107-
sizes[0] = copied
107+
bufs[0].Size = copied
108108
eps[0] = c.target6
109109
return 1, nil
110110
}

conn/conn.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ const (
2727
// sizes may be zero, and callers should ignore them. Callers must pass a sizes
2828
// and eps slice with a length greater than or equal to the length of packets.
2929
// These lengths must not exceed the length of the associated Bind.BatchSize().
30-
type ReceiveFunc func(bufs []*buffer.Buffer, sizes []int, eps []Endpoint) (n int, err error)
30+
type ReceiveFunc func(bufs []*buffer.Buffer, eps []Endpoint) (n int, err error)
3131

3232
// A Bind listens on a port for both IPv6 and IPv4 UDP traffic.
3333
//

conn/conn_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import (
1313

1414
func TestPrettyName(t *testing.T) {
1515
var (
16-
recvFunc ReceiveFunc = func(bufs []*buffer.Buffer, sizes []int, eps []Endpoint) (n int, err error) { return }
16+
recvFunc ReceiveFunc = func(bufs []*buffer.Buffer, eps []Endpoint) (n int, err error) { return }
1717
)
1818

1919
const want = "TestPrettyName"

device/device_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -438,7 +438,7 @@ type fakeTUNDeviceSized struct {
438438
}
439439

440440
func (t *fakeTUNDeviceSized) File() *os.File { return nil }
441-
func (t *fakeTUNDeviceSized) Read(bufs []*buffer.Buffer, sizes []int, offset int) (n int, err error) {
441+
func (t *fakeTUNDeviceSized) Read(bufs []*buffer.Buffer, offset int) (n int, err error) {
442442
return 0, nil
443443
}
444444
func (t *fakeTUNDeviceSized) Write(bufs [][]byte, offset int) (int, error) { return 0, nil }

device/receive.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,6 @@ func (device *Device) RoutineReceiveIncoming(maxBatchSize int, recv conn.Receive
8686

8787
var (
8888
bufs = make([]*buffer.Buffer, maxBatchSize) // nil entries; recv allocates
89-
sizes = make([]int, maxBatchSize)
9089
err error
9190
count int
9291
endpoints = make([]conn.Endpoint, maxBatchSize)
@@ -99,7 +98,7 @@ func (device *Device) RoutineReceiveIncoming(maxBatchSize int, recv conn.Receive
9998
}()
10099

101100
for {
102-
count, err = recv(bufs, sizes, endpoints)
101+
count, err = recv(bufs, endpoints)
103102
if err != nil {
104103
if errors.Is(err, net.ErrClosed) {
105104
return
@@ -118,14 +117,14 @@ func (device *Device) RoutineReceiveIncoming(maxBatchSize int, recv conn.Receive
118117
deathSpiral = 0
119118

120119
// handle each packet in the batch
121-
for i, size := range sizes[:count] {
122-
if size < MinMessageSize {
120+
for i := 0; i < count; i++ {
121+
if bufs[i].Size < MinMessageSize {
123122
continue
124123
}
125124

126125
// check size of packet
127126

128-
packet := bufs[i].Data()[:size]
127+
packet := bufs[i].Data()[:bufs[i].Size]
129128
msgType := binary.LittleEndian.Uint32(packet[:4])
130129

131130
switch msgType {

device/send.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,6 @@ func (device *Device) RoutineReadFromTUN() {
231231
bufs = make([]*buffer.Buffer, batchSize)
232232
elemsByPeer = make(map[*Peer]*QueueOutboundElementsContainer, batchSize)
233233
count = 0
234-
sizes = make([]int, batchSize)
235234
offset = MessageEncapsulatingTransportSize + MessageTransportHeaderSize
236235
)
237236

@@ -240,10 +239,10 @@ func (device *Device) RoutineReadFromTUN() {
240239
}()
241240

242241
for {
243-
count, readErr = device.tun.device.Read(bufs, sizes, offset)
242+
count, readErr = device.tun.device.Read(bufs, offset)
244243

245244
for i := 0; i < count; i++ {
246-
packet := bufs[i].Data()[offset : offset+sizes[i]]
245+
packet := bufs[i].Data()[offset : offset+bufs[i].Size]
247246
if len(packet) < 1 {
248247
continue
249248
}

0 commit comments

Comments
 (0)