fix: increase UDP read buffer length to max datagram size
Co-authored-by: Tom Moulard <tom.moulard@traefik.io>
This commit is contained in:
parent
9df053e3f5
commit
db4a92d877
4 changed files with 137 additions and 18 deletions
|
@ -8,7 +8,8 @@ import (
|
|||
"time"
|
||||
)
|
||||
|
||||
const receiveMTU = 8192
|
||||
// maxDatagramSize is the maximum size of a UDP datagram.
|
||||
const maxDatagramSize = 65535
|
||||
|
||||
const closeRetryInterval = 500 * time.Millisecond
|
||||
|
||||
|
@ -135,7 +136,8 @@ func (l *Listener) readLoop() {
|
|||
// Allocating a new buffer for every read avoids
|
||||
// overwriting data in c.msgs in case the next packet is received
|
||||
// before c.msgs is emptied via Read()
|
||||
buf := make([]byte, receiveMTU)
|
||||
buf := make([]byte, maxDatagramSize)
|
||||
|
||||
n, raddr, err := l.pConn.ReadFrom(buf)
|
||||
if err != nil {
|
||||
return
|
||||
|
@ -144,6 +146,7 @@ func (l *Listener) readLoop() {
|
|||
if err != nil {
|
||||
continue
|
||||
}
|
||||
|
||||
select {
|
||||
case conn.receiveCh <- buf[:n]:
|
||||
case <-conn.doneCh:
|
||||
|
@ -249,7 +252,9 @@ func (c *Conn) readLoop() {
|
|||
}
|
||||
}
|
||||
|
||||
// Read implements io.Reader for a Conn.
|
||||
// Read reads up to len(p) bytes into p from the connection.
|
||||
// Each call corresponds to at most one datagram.
|
||||
// If p is smaller than the datagram, the extra bytes will be discarded.
|
||||
func (c *Conn) Read(p []byte) (int, error) {
|
||||
select {
|
||||
case c.readCh <- p:
|
||||
|
@ -258,22 +263,21 @@ func (c *Conn) Read(p []byte) (int, error) {
|
|||
c.lastActivity = time.Now()
|
||||
c.muActivity.Unlock()
|
||||
return n, nil
|
||||
|
||||
case <-c.doneCh:
|
||||
return 0, io.EOF
|
||||
}
|
||||
}
|
||||
|
||||
// Write implements io.Writer for a Conn.
|
||||
// Write writes len(p) bytes from p to the underlying connection.
|
||||
// Each call sends at most one datagram.
|
||||
// It is an error to send a message larger than the system's max UDP datagram size.
|
||||
func (c *Conn) Write(p []byte) (n int, err error) {
|
||||
l := c.listener
|
||||
if l == nil {
|
||||
return 0, io.EOF
|
||||
}
|
||||
|
||||
c.muActivity.Lock()
|
||||
c.lastActivity = time.Now()
|
||||
c.muActivity.Unlock()
|
||||
return l.pConn.WriteTo(p, c.rAddr)
|
||||
|
||||
return c.listener.pConn.WriteTo(p, c.rAddr)
|
||||
}
|
||||
|
||||
func (c *Conn) close() {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue