Skip to content

Commit ef4cf39

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

4 files changed

Lines changed: 22 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: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ type NativeTun struct {
3535
ruleIndex6 []int
3636
gsoEnabled bool
3737
gsoBuffer []byte
38+
gsoToWrite []int
3839
tcpGROAccess sync.Mutex
3940
tcp4GROTable *tcpGROTable
4041
tcp6GROTable *tcpGROTable
@@ -105,7 +106,7 @@ func (t *NativeTun) Read(p []byte) (n int, err error) {
105106

106107
func (t *NativeTun) Write(p []byte) (n int, err error) {
107108
if t.gsoEnabled {
108-
err = t.BatchWrite([][]byte{p})
109+
err = t.BatchWrite([][]byte{p}, virtioNetHdrLen)
109110
if err != nil {
110111
return
111112
}
@@ -140,37 +141,29 @@ func (t *NativeTun) BatchSize() int {
140141
return batchSize
141142
}
142143

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-
144+
func (t *NativeTun) BatchRead(buffers [][]byte, offset int, readN []int) (n int, err error) {
145+
n, err = t.tunFile.Read(t.gsoBuffer)
146+
if err != nil {
154147
return
155-
} else {
156-
return 0, os.ErrInvalid
157148
}
149+
return handleVirtioRead(t.gsoBuffer[:n], buffers, readN, offset)
158150
}
159151

160-
func (t *NativeTun) BatchWrite(buffers [][]byte) error {
152+
func (t *NativeTun) BatchWrite(buffers [][]byte, offset int) error {
161153
t.tcpGROAccess.Lock()
162154
defer func() {
163155
t.tcp4GROTable.reset()
164156
t.tcp6GROTable.reset()
165157
t.tcpGROAccess.Unlock()
166158
}()
167-
var toWrite []int
168-
err := handleGRO(buffers, virtioNetHdrLen, t.tcp4GROTable, t.tcp6GROTable, &toWrite)
159+
t.gsoToWrite = t.gsoToWrite[:0]
160+
err := handleGRO(buffers, offset, t.tcp4GROTable, t.tcp6GROTable, &t.gsoToWrite)
169161
if err != nil {
170162
return err
171163
}
172-
for _, bufferIndex := range toWrite {
173-
_, err = t.tunFile.Write(buffers[bufferIndex])
164+
offset -= virtioNetHdrLen
165+
for _, bufferIndex := range t.gsoToWrite {
166+
_, err = t.tunFile.Write(buffers[bufferIndex][offset:])
174167
if err != nil {
175168
return err
176169
}

0 commit comments

Comments
 (0)