mirror of
https://github.com/tailscale/tailscale.git
synced 2025-02-21 12:28:39 +00:00
fixup! wgengine/magicsock: actually use AF_PACKET socket for raw disco
Signed-off-by: Andrew Dunham <andrew@du.nham.ca> Change-Id: I769276478e5b2e62ee0cb25ccc76e96d34fadc88
This commit is contained in:
parent
85bc5dd3b3
commit
35b91cb66a
@ -11,6 +11,7 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
"net"
|
"net"
|
||||||
"net/netip"
|
"net/netip"
|
||||||
|
"strings"
|
||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@ -364,7 +365,7 @@ func (c *Conn) receiveDisco(pc *socket.Conn, isIPV6 bool) {
|
|||||||
for {
|
for {
|
||||||
n, src, err := pc.Recvfrom(ctx, buf[:], 0)
|
n, src, err := pc.Recvfrom(ctx, buf[:], 0)
|
||||||
if debugRawDiscoReads() {
|
if debugRawDiscoReads() {
|
||||||
logf("read from %v = (%v, %v)", src, n, err)
|
logf("read from %s = (%v, %v)", printSockaddr(src), n, err)
|
||||||
}
|
}
|
||||||
if err != nil && (errors.Is(err, net.ErrClosed) || err.Error() == "use of closed file") {
|
if err != nil && (errors.Is(err, net.ErrClosed) || err.Error() == "use of closed file") {
|
||||||
// EOF; no need to print an error
|
// EOF; no need to print an error
|
||||||
@ -420,6 +421,33 @@ func (c *Conn) receiveDisco(pc *socket.Conn, isIPV6 bool) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// printSockaddr is a helper function to pretty-print various sockaddr types.
|
||||||
|
func printSockaddr(sa unix.Sockaddr) string {
|
||||||
|
switch sa := sa.(type) {
|
||||||
|
case *unix.SockaddrInet4:
|
||||||
|
addr := netip.AddrFrom4(sa.Addr)
|
||||||
|
return netip.AddrPortFrom(addr, uint16(sa.Port)).String()
|
||||||
|
case *unix.SockaddrInet6:
|
||||||
|
addr := netip.AddrFrom16(sa.Addr)
|
||||||
|
return netip.AddrPortFrom(addr, uint16(sa.Port)).String()
|
||||||
|
case *unix.SockaddrLinklayer:
|
||||||
|
hwaddr := sa.Addr[:sa.Halen]
|
||||||
|
|
||||||
|
var buf strings.Builder
|
||||||
|
fmt.Fprintf(&buf, "link(%d):[", sa.Protocol)
|
||||||
|
for i, b := range hwaddr {
|
||||||
|
if i > 0 {
|
||||||
|
buf.WriteByte(':')
|
||||||
|
}
|
||||||
|
fmt.Fprintf(&buf, "%02x", b)
|
||||||
|
}
|
||||||
|
buf.WriteByte(']')
|
||||||
|
return buf.String()
|
||||||
|
default:
|
||||||
|
return fmt.Sprintf("unknown(%T)", sa)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// trySetSocketBuffer attempts to set SO_SNDBUFFORCE and SO_RECVBUFFORCE which
|
// trySetSocketBuffer attempts to set SO_SNDBUFFORCE and SO_RECVBUFFORCE which
|
||||||
// can overcome the limit of net.core.{r,w}mem_max, but require CAP_NET_ADMIN.
|
// 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
|
// It falls back to the portable implementation if that fails, which may be
|
||||||
|
Loading…
x
Reference in New Issue
Block a user