Skip to content

Commit ec83d71

Browse files
committed
Update BatchTUN API for WireGuard
1 parent 0e13875 commit ec83d71

4 files changed

Lines changed: 25 additions & 33 deletions

File tree

stack_mixed.go

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -145,15 +145,13 @@ func (m *Mixed) wintunLoop(winTun WinTun) {
145145
func (m *Mixed) batchLoop(linuxTUN BatchTUN, batchSize int) {
146146
frontHeadroom := m.tun.FrontHeadroom()
147147
packetBuffers := make([][]byte, batchSize)
148-
readBuffers := make([][]byte, batchSize)
149148
writeBuffers := make([][]byte, batchSize)
150149
packetSizes := make([]int, batchSize)
151150
for i := range packetBuffers {
152-
packetBuffers[i] = make([]byte, m.mtu+frontHeadroom+PacketOffset)
153-
readBuffers[i] = packetBuffers[i][frontHeadroom:]
151+
packetBuffers[i] = make([]byte, m.mtu+frontHeadroom)
154152
}
155153
for {
156-
n, err := linuxTUN.BatchRead(readBuffers, packetSizes)
154+
n, err := linuxTUN.BatchRead(packetBuffers, frontHeadroom, packetSizes)
157155
if err != nil {
158156
if E.IsClosed(err) {
159157
return
@@ -169,13 +167,13 @@ func (m *Mixed) batchLoop(linuxTUN BatchTUN, batchSize int) {
169167
continue
170168
}
171169
packetBuffer := packetBuffers[i]
172-
packet := packetBuffer[frontHeadroom+PacketOffset : frontHeadroom+packetSize]
170+
packet := packetBuffer[frontHeadroom : frontHeadroom+packetSize]
173171
if m.processPacket(packet) {
174172
writeBuffers = append(writeBuffers, packetBuffer[:frontHeadroom+packetSize])
175173
}
176174
}
177175
if len(writeBuffers) > 0 {
178-
err = linuxTUN.BatchWrite(writeBuffers)
176+
err = linuxTUN.BatchWrite(writeBuffers, frontHeadroom)
179177
if err != nil {
180178
m.logger.Trace(E.Cause(err, "batch write packet"))
181179
}

stack_system.go

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -198,15 +198,13 @@ func (s *System) wintunLoop(winTun WinTun) {
198198
func (s *System) batchLoop(linuxTUN BatchTUN, batchSize int) {
199199
frontHeadroom := s.tun.FrontHeadroom()
200200
packetBuffers := make([][]byte, batchSize)
201-
readBuffers := make([][]byte, batchSize)
202201
writeBuffers := make([][]byte, batchSize)
203202
packetSizes := make([]int, batchSize)
204203
for i := range packetBuffers {
205-
packetBuffers[i] = make([]byte, s.mtu+frontHeadroom+PacketOffset)
206-
readBuffers[i] = packetBuffers[i][frontHeadroom:]
204+
packetBuffers[i] = make([]byte, s.mtu+frontHeadroom)
207205
}
208206
for {
209-
n, err := linuxTUN.BatchRead(readBuffers, packetSizes)
207+
n, err := linuxTUN.BatchRead(packetBuffers, frontHeadroom, packetSizes)
210208
if err != nil {
211209
if E.IsClosed(err) {
212210
return
@@ -222,13 +220,13 @@ func (s *System) batchLoop(linuxTUN BatchTUN, batchSize int) {
222220
continue
223221
}
224222
packetBuffer := packetBuffers[i]
225-
packet := packetBuffer[frontHeadroom+PacketOffset : frontHeadroom+packetSize]
223+
packet := packetBuffer[frontHeadroom : frontHeadroom+packetSize]
226224
if s.processPacket(packet) {
227225
writeBuffers = append(writeBuffers, packetBuffer[:frontHeadroom+packetSize])
228226
}
229227
}
230228
if len(writeBuffers) > 0 {
231-
err = linuxTUN.BatchWrite(writeBuffers)
229+
err = linuxTUN.BatchWrite(writeBuffers, frontHeadroom)
232230
if err != nil {
233231
s.logger.Trace(E.Cause(err, "batch write packet"))
234232
}

tun.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ type WinTun interface {
3636
type BatchTUN interface {
3737
Tun
3838
BatchSize() int
39-
BatchRead(buffers [][]byte, readN []int) (n int, err error)
40-
BatchWrite(buffers [][]byte) error
39+
BatchRead(buffers [][]byte, offset int, readN []int) (n int, err error)
40+
BatchWrite(buffers [][]byte, offset int) error
4141
}
4242

4343
type Options struct {

tun_linux.go

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ type NativeTun struct {
3535
ruleIndex6 []int
3636
gsoEnabled bool
3737
gsoBuffer []byte
38+
gsoToWrite []int
39+
gsoReadAccess sync.Mutex
3840
tcpGROAccess sync.Mutex
3941
tcp4GROTable *tcpGROTable
4042
tcp6GROTable *tcpGROTable
@@ -105,7 +107,7 @@ func (t *NativeTun) Read(p []byte) (n int, err error) {
105107

106108
func (t *NativeTun) Write(p []byte) (n int, err error) {
107109
if t.gsoEnabled {
108-
err = t.BatchWrite([][]byte{p})
110+
err = t.BatchWrite([][]byte{p}, virtioNetHdrLen)
109111
if err != nil {
110112
return
111113
}
@@ -140,37 +142,31 @@ func (t *NativeTun) BatchSize() int {
140142
return batchSize
141143
}
142144

143-
func (t *NativeTun) BatchRead(buffers [][]byte, readN []int) (n int, err error) {
144-
if t.gsoEnabled {
145-
n, err = t.tunFile.Read(t.gsoBuffer)
146-
if err != nil {
147-
return
148-
}
149-
n, err = handleVirtioRead(t.gsoBuffer[:n], buffers, readN, 0)
150-
if err != nil {
151-
return
152-
}
153-
145+
func (t *NativeTun) BatchRead(buffers [][]byte, offset int, readN []int) (n int, err error) {
146+
t.gsoReadAccess.Lock()
147+
defer t.gsoReadAccess.Unlock()
148+
n, err = t.tunFile.Read(t.gsoBuffer)
149+
if err != nil {
154150
return
155-
} else {
156-
return 0, os.ErrInvalid
157151
}
152+
return handleVirtioRead(t.gsoBuffer[:n], buffers, readN, offset)
158153
}
159154

160-
func (t *NativeTun) BatchWrite(buffers [][]byte) error {
155+
func (t *NativeTun) BatchWrite(buffers [][]byte, offset int) error {
161156
t.tcpGROAccess.Lock()
162157
defer func() {
163158
t.tcp4GROTable.reset()
164159
t.tcp6GROTable.reset()
165160
t.tcpGROAccess.Unlock()
166161
}()
167-
var toWrite []int
168-
err := handleGRO(buffers, virtioNetHdrLen, t.tcp4GROTable, t.tcp6GROTable, &toWrite)
162+
t.gsoToWrite = t.gsoToWrite[:0]
163+
err := handleGRO(buffers, offset, t.tcp4GROTable, t.tcp6GROTable, &t.gsoToWrite)
169164
if err != nil {
170165
return err
171166
}
172-
for _, bufferIndex := range toWrite {
173-
_, err = t.tunFile.Write(buffers[bufferIndex])
167+
offset -= virtioNetHdrLen
168+
for _, bufferIndex := range t.gsoToWrite {
169+
_, err = t.tunFile.Write(buffers[bufferIndex][offset:])
174170
if err != nil {
175171
return err
176172
}

0 commit comments

Comments
 (0)