aboutsummaryrefslogtreecommitdiff
path: root/conn/bind_std.go
diff options
context:
space:
mode:
authorJames Tucker <james@tailscale.com>2023-04-18 22:29:55 -0700
committerJason A. Donenfeld <Jason@zx2c4.com>2023-06-27 17:48:32 +0200
commit25eb973e00d2a5d69456c4156daafb8db56e7e0a (patch)
tree9213fbb3c1f59cafdad6c87ff2790fe43e94a362 /conn/bind_std.go
parentb7cd547315bed421a648d0a0f1ee5a0fc1b1151e (diff)
downloadwireguard-go-25eb973e00d2a5d69456c4156daafb8db56e7e0a.tar.gz
wireguard-go-25eb973e00d2a5d69456c4156daafb8db56e7e0a.zip
conn: store IP_PKTINFO cmsg in StdNetendpoint src
Replace the src storage inside StdNetEndpoint with a copy of the raw control message buffer, to reduce allocation and perform less work on a per-packet basis. Signed-off-by: James Tucker <james@tailscale.com> Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to 'conn/bind_std.go')
-rw-r--r--conn/bind_std.go27
1 files changed, 9 insertions, 18 deletions
diff --git a/conn/bind_std.go b/conn/bind_std.go
index 69789b3..c701ef8 100644
--- a/conn/bind_std.go
+++ b/conn/bind_std.go
@@ -81,11 +81,10 @@ func NewStdNetBind() Bind {
type StdNetEndpoint struct {
// AddrPort is the endpoint destination.
netip.AddrPort
- // src is the current sticky source address and interface index, if supported.
- src struct {
- netip.Addr
- ifidx int32
- }
+ // src is the current sticky source address and interface index, if
+ // supported. Typically this is a PKTINFO structure from/for control
+ // messages, see unix.PKTINFO for an example.
+ src []byte
}
var (
@@ -104,21 +103,17 @@ func (*StdNetBind) ParseEndpoint(s string) (Endpoint, error) {
}
func (e *StdNetEndpoint) ClearSrc() {
- e.src.ifidx = 0
- e.src.Addr = netip.Addr{}
+ if e.src != nil {
+ // Truncate src, no need to reallocate.
+ e.src = e.src[:0]
+ }
}
func (e *StdNetEndpoint) DstIP() netip.Addr {
return e.AddrPort.Addr()
}
-func (e *StdNetEndpoint) SrcIP() netip.Addr {
- return e.src.Addr
-}
-
-func (e *StdNetEndpoint) SrcIfidx() int32 {
- return e.src.ifidx
-}
+// See sticky_default,linux, etc for implementations of SrcIP and SrcIfidx.
func (e *StdNetEndpoint) DstToBytes() []byte {
b, _ := e.AddrPort.MarshalBinary()
@@ -129,10 +124,6 @@ func (e *StdNetEndpoint) DstToString() string {
return e.AddrPort.String()
}
-func (e *StdNetEndpoint) SrcToString() string {
- return e.src.Addr.String()
-}
-
func listenNet(network string, port int) (*net.UDPConn, int, error) {
conn, err := listenConfig().ListenPacket(context.Background(), network, ":"+strconv.Itoa(port))
if err != nil {