FIx batched InputPackets
This commit is contained in:
parent
57baac9504
commit
2c27bbf4f9
2 changed files with 23 additions and 11 deletions
|
|
@ -408,6 +408,13 @@ func (e ErrUDPGSODisabled) Unwrap() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *StdNetBind) Send(bufs [][]byte, endpoint Endpoint, offset int) error {
|
func (s *StdNetBind) Send(bufs [][]byte, endpoint Endpoint, offset int) error {
|
||||||
|
for len(bufs) > IdealBatchSize {
|
||||||
|
err := s.Send(bufs[:IdealBatchSize], endpoint, offset)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
bufs = bufs[IdealBatchSize:]
|
||||||
|
}
|
||||||
s.mu.Lock()
|
s.mu.Lock()
|
||||||
blackhole := s.blackhole4
|
blackhole := s.blackhole4
|
||||||
conn := s.ipv4
|
conn := s.ipv4
|
||||||
|
|
|
||||||
|
|
@ -374,7 +374,7 @@ type InputPacketRef struct {
|
||||||
|
|
||||||
func (device *Device) InputPackets(packets []*InputPacketRef) []*InputPacketRef {
|
func (device *Device) InputPackets(packets []*InputPacketRef) []*InputPacketRef {
|
||||||
var unmatched []*InputPacketRef
|
var unmatched []*InputPacketRef
|
||||||
elemsByPeer := make(map[*Peer]*QueueOutboundElementsContainer, len(packets))
|
elemsByPeer := make(map[*Peer][]*QueueOutboundElementsContainer, len(packets))
|
||||||
for _, packetRef := range packets {
|
for _, packetRef := range packets {
|
||||||
peer := device.allowedips.Lookup(packetRef.Destination)
|
peer := device.allowedips.Lookup(packetRef.Destination)
|
||||||
if peer == nil {
|
if peer == nil {
|
||||||
|
|
@ -401,18 +401,22 @@ func (device *Device) InputPackets(packets []*InputPacketRef) []*InputPacketRef
|
||||||
n += copy(packet[n:], packetSlice)
|
n += copy(packet[n:], packetSlice)
|
||||||
}
|
}
|
||||||
elem.packet = packet[:n]
|
elem.packet = packet[:n]
|
||||||
elemsForPeer, ok := elemsByPeer[peer]
|
containers := elemsByPeer[peer]
|
||||||
if !ok {
|
if len(containers) == 0 || len(containers[len(containers)-1].elems) >= conn.IdealBatchSize {
|
||||||
elemsForPeer = device.GetOutboundElementsContainer()
|
containers = append(containers, device.GetOutboundElementsContainer())
|
||||||
elemsByPeer[peer] = elemsForPeer
|
elemsByPeer[peer] = containers
|
||||||
}
|
}
|
||||||
|
elemsForPeer := containers[len(containers)-1]
|
||||||
elemsForPeer.elems = append(elemsForPeer.elems, elem)
|
elemsForPeer.elems = append(elemsForPeer.elems, elem)
|
||||||
}
|
}
|
||||||
for peer, elemsForPeer := range elemsByPeer {
|
for peer, containers := range elemsByPeer {
|
||||||
if peer.isRunning.Load() {
|
if peer.isRunning.Load() {
|
||||||
|
for _, elemsForPeer := range containers {
|
||||||
peer.StagePackets(elemsForPeer)
|
peer.StagePackets(elemsForPeer)
|
||||||
|
}
|
||||||
peer.SendStagedPackets()
|
peer.SendStagedPackets()
|
||||||
} else {
|
} else {
|
||||||
|
for _, elemsForPeer := range containers {
|
||||||
for _, elem := range elemsForPeer.elems {
|
for _, elem := range elemsForPeer.elems {
|
||||||
device.PutOutboundBuffer(elem.buffer)
|
device.PutOutboundBuffer(elem.buffer)
|
||||||
device.PutOutboundElement(elem)
|
device.PutOutboundElement(elem)
|
||||||
|
|
@ -420,6 +424,7 @@ func (device *Device) InputPackets(packets []*InputPacketRef) []*InputPacketRef
|
||||||
device.PutOutboundElementsContainer(elemsForPeer)
|
device.PutOutboundElementsContainer(elemsForPeer)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return unmatched
|
return unmatched
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue