From 8efd810610ba77230e7272c7e6a708571ceaac1b Mon Sep 17 00:00:00 2001 From: Patricio Whittingslow Date: Thu, 14 May 2026 13:15:16 -0300 Subject: [PATCH] more API touch ups --- ipv6/icmpv6/client.go | 4 ++++ x/xnet/stack-async.go | 20 +++++++++++++++++++- x/xnet/stack6.go | 16 ++++++++++++++-- 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/ipv6/icmpv6/client.go b/ipv6/icmpv6/client.go index 9103078..89e3cb4 100644 --- a/ipv6/icmpv6/client.go +++ b/ipv6/icmpv6/client.go @@ -76,6 +76,10 @@ func (client *Client) Configure(cfg ClientConfig) error { } return nil } +func (client *Client) SetAddr6(addr [16]byte) { + client.ourIP = addr + client.Reset() +} func (client *Client) Protocol() uint64 { return uint64(lneto.IPProtoIPv6ICMP) } func (client *Client) LocalPort() uint16 { return 0 } diff --git a/x/xnet/stack-async.go b/x/xnet/stack-async.go index b978236..6b910c3 100644 --- a/x/xnet/stack-async.go +++ b/x/xnet/stack-async.go @@ -359,6 +359,24 @@ func (s *StackAsync) Addr4() [4]byte { return s.ip4.Addr4() } +func (s *StackAsync) SetAddr6(addr [16]byte) error { + if s.ipv6enabled { + s.mu.Lock() + defer s.mu.Unlock() + return s.stack6.SetAddr6(addr) + } + return lneto.ErrUnsupported +} + +func (s *StackAsync) Addr6() [16]byte { + if s.ipv6enabled { + s.mu.Lock() + defer s.mu.Unlock() + return s.stack6.Addr6() + } + return [16]byte{} +} + func (s *StackAsync) SetSubnet4(addr [4]byte, prefixBits uint8) { s.mu.Lock() defer s.mu.Unlock() @@ -405,7 +423,7 @@ func (s *StackAsync) EnableICMP(enabled bool) (err error) { s.icmp.Abort() } if s.ipv6enabled { - if err2 := s.stack6.EnableICMP6(enabled); err2 != nil { + if err2 := s.stack6.EnableICMP6(enabled); err2 != nil && err == nil { err = err2 } } diff --git a/x/xnet/stack6.go b/x/xnet/stack6.go index d037b6d..60da6ff 100644 --- a/x/xnet/stack6.go +++ b/x/xnet/stack6.go @@ -20,7 +20,7 @@ func DefaultStack6() Stack6 { type Stack6 interface { Reset6(cfg *StackConfig) error Addr6() [16]byte - SetAddr6(addr [16]byte) + SetAddr6(addr [16]byte) error EnableICMP6(enabled bool) error Register6(node lneto.StackNode) error @@ -48,7 +48,12 @@ type stack6 struct { func (s *stack6) Register6(node lneto.StackNode) error { return s.ip6.Register6(node) } func (s *stack6) Addr6() [16]byte { return s.ip6.Addr6() } -func (s *stack6) SetAddr6(addr [16]byte) { s.ip6.SetAddr6(addr) } +func (s *stack6) SetAddr6(addr [16]byte) error { + s.ip6.SetAddr6(addr) + s.icmp6.SetAddr6(addr) + s.dropNDPPending() + return nil +} func (s *stack6) IPv6Stack() lneto.StackNode { return &s.ip6 } @@ -210,3 +215,10 @@ func (s *stack6) ndpDynamicResolve(raddr [16]byte) ([]byte, error) { e.macBuf = macBuf return macBuf, nil } + +func (s *stack6) dropNDPPending() { + for i := range s.ndpPending { + s.ndpPending[i].macBuf = nil + s.ndpPending[i].addr = [16]byte{} + } +}