diff --git a/conn_linux.go b/conn_linux.go index bde4416..396c403 100644 --- a/conn_linux.go +++ b/conn_linux.go @@ -58,11 +58,12 @@ func (endpoint *NativeEndpoint) dst6() *unix.SockaddrInet6 { } type NativeBind struct { - sock4 int - sock6 int - netlinkSock int - netlinkCancel *rwcancel.RWCancel - lastMark uint32 + sock4 int + sock6 int + netlinkSock int + netlinkCancel *rwcancel.RWCancel + lastMark uint32 + clearSourceOnAllRouteChanges bool } var _ Endpoint = (*NativeEndpoint)(nil) @@ -582,6 +583,16 @@ func (bind *NativeBind) routineRouteListener(device *Device) { switch hdr.Type { case unix.RTM_NEWROUTE, unix.RTM_DELROUTE: + if bind.clearSourceOnAllRouteChanges { + for _, peer := range device.peers.keyMap { + peer.mutex.Lock() + if peer.endpoint != nil && peer.endpoint.(*NativeEndpoint) != nil { + peer.endpoint.(*NativeEndpoint).ClearSrc() + } + peer.mutex.Unlock() + } + break + } if hdr.Seq <= MaxPeers && hdr.Seq > 0 { if uint(len(remain)) < uint(hdr.Len) { break