|
|
|
@ -3537,7 +3537,6 @@ func (c *Conn) bindSocket(ruc *RebindingUDPConn, network string, curPortFate cur
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
trySetSocketBuffer(pconn, c.logf)
|
|
|
|
|
|
|
|
trySetUDPSocketOptions(pconn, c.logf)
|
|
|
|
trySetUDPSocketOptions(pconn, c.logf)
|
|
|
|
|
|
|
|
|
|
|
|
// Success.
|
|
|
|
// Success.
|
|
|
|
@ -3858,11 +3857,7 @@ func (c *Conn) DebugForcePreferDERP(n int) {
|
|
|
|
c.netChecker.SetForcePreferredDERP(n)
|
|
|
|
c.netChecker.SetForcePreferredDERP(n)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// trySetSocketBuffer attempts to set SO_SNDBUFFORCE and SO_RECVBUFFORCE which
|
|
|
|
func trySetUDPSocketOptions(pconn nettype.PacketConn, logf logger.Logf) {
|
|
|
|
// can overcome the limit of net.core.{r,w}mem_max, but require CAP_NET_ADMIN.
|
|
|
|
|
|
|
|
// It falls back to the portable implementation if that fails, which may be
|
|
|
|
|
|
|
|
// silently capped to net.core.{r,w}mem_max.
|
|
|
|
|
|
|
|
func trySetSocketBuffer(pconn nettype.PacketConn, logf logger.Logf) {
|
|
|
|
|
|
|
|
directions := []sockopts.BufferDirection{sockopts.ReadDirection, sockopts.WriteDirection}
|
|
|
|
directions := []sockopts.BufferDirection{sockopts.ReadDirection, sockopts.WriteDirection}
|
|
|
|
for _, direction := range directions {
|
|
|
|
for _, direction := range directions {
|
|
|
|
forceErr, portableErr := sockopts.SetBufferSize(pconn, direction, socketBufferSize)
|
|
|
|
forceErr, portableErr := sockopts.SetBufferSize(pconn, direction, socketBufferSize)
|
|
|
|
@ -3873,6 +3868,11 @@ func trySetSocketBuffer(pconn nettype.PacketConn, logf logger.Logf) {
|
|
|
|
logf("magicsock: failed to set UDP %v buffer size to %d: %v", direction, socketBufferSize, portableErr)
|
|
|
|
logf("magicsock: failed to set UDP %v buffer size to %d: %v", direction, socketBufferSize, portableErr)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
err := sockopts.SetICMPErrImmunity(pconn)
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
|
|
logf("magicsock: %v", err)
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// derpStr replaces DERP IPs in s with "derp-".
|
|
|
|
// derpStr replaces DERP IPs in s with "derp-".
|
|
|
|
|