@@ -351,24 +351,66 @@ func (vp *VpnPeer) backgroundOutboundHandler(t *Tunnel) {
351351}
352352
353353func (vp * VpnPeer ) backgroundInboundHandler (t * Tunnel ) {
354+ batchSize := t .device .BatchSize ()
355+ bytesBufs := make ([][]byte , 0 , batchSize )
356+ packetsBufs := make ([]* vpn.Packet , batchSize )
357+
354358 for {
355- packet , open := <- vp .inboundCh
359+ firstPacket , open := <- vp .inboundCh
356360 if ! open {
357361 return
358362 }
359363 localIP := * vp .localIP .Load ()
360- ok := packet .Parse ()
361- if ! ok {
362- t .logger .Warnf ("got invalid packet from peerID (%s) local ip (%s)" , vp .peerID , localIP )
363- t .device .PutTempPacket (packet )
364- continue
364+
365+ packetsBufs [0 ] = firstPacket
366+ packetsBatch := readBatchFromChan (vp .inboundCh , packetsBufs , 1 )
367+
368+ newLen := 0
369+ for i , packet := range packetsBatch {
370+ ok := packet .Parse ()
371+ if ! ok {
372+ t .logger .Warnf ("got invalid packet from peerID (%s) local ip (%s)" , vp .peerID , localIP )
373+ t .device .PutTempPacket (packet )
374+ packetsBatch [i ] = nil
375+ continue
376+ }
377+ packetsBatch [newLen ] = packet
378+ newLen ++
365379 }
366- // TODO: add batching
367- err := t .device .WritePacket (packet , localIP )
368- if err != nil {
369- t .logger .Warnf ("write packet to vpn: %v" , err )
380+ filteredPackets := packetsBatch [:newLen ]
381+
382+ if len (filteredPackets ) > 0 {
383+ err := t .device .WritePacketsBatch (filteredPackets , bytesBufs , localIP )
384+ if err != nil {
385+ t .logger .Warnf ("write packets batch to vpn for local ip %s: %v" , localIP , err )
386+ }
370387 }
371388
372- t .device .PutTempPacket (packet )
389+ for i , packet := range packetsBatch {
390+ if packet == nil {
391+ continue
392+ }
393+ t .device .PutTempPacket (packet )
394+ packetsBatch [i ] = nil
395+ }
396+ }
397+ }
398+
399+ func readBatchFromChan (ch chan * vpn.Packet , buf []* vpn.Packet , offset int ) []* vpn.Packet {
400+ i := offset
401+ for {
402+ if i == len (buf ) {
403+ return buf [:i ]
404+ }
405+ select {
406+ case packet , ok := <- ch :
407+ if ! ok {
408+ return buf [:i ]
409+ }
410+ buf [i ] = packet
411+ i ++
412+ default :
413+ return buf [:i ]
414+ }
373415 }
374416}
0 commit comments