mirror of
https://github.com/slackhq/nebula.git
synced 2026-11-15 13:26:52 +01:00
Take a hybrid tunnel on msg3 even over a newer one, the initiator has committed to it
This commit is contained in:
1 parent
cbf8146bda
commit
bbade4dc9a
2 files changed
+12
-2
No files matched your search
@@ -495,6 +495,13 @@ var (
|
||||
// ErrLocalIndexCollision if we already have an entry in the main or pending
|
||||
// hostmap for the hostinfo.localIndexId.
|
||||
func (hm *HandshakeManager) CheckAndComplete(hostinfo *HostInfo, handshakePacket uint8, f *Interface) (*HostInfo, error) {
|
||||
return hm.checkAndComplete(hostinfo, handshakePacket, f, false)
|
||||
}
|
||||
|
||||
// checkAndComplete is CheckAndComplete. committed means the initiator has shown it
|
||||
// uses this tunnel, as a hybrid msg3 does, so an existing tunnel is replaced even
|
||||
// when its handshake is newer.
|
||||
func (hm *HandshakeManager) checkAndComplete(hostinfo *HostInfo, handshakePacket uint8, f *Interface, committed bool) (*HostInfo, error) {
|
||||
hm.mainHostMap.Lock()
|
||||
defer hm.mainHostMap.Unlock()
|
||||
hm.Lock()
|
||||
@@ -511,7 +518,7 @@ func (hm *HandshakeManager) CheckAndComplete(hostinfo *HostInfo, handshakePacket
|
||||
}
|
||||
|
||||
// Is this a newer handshake?
|
||||
if existingHostInfo.lastHandshakeTime >= hostinfo.lastHandshakeTime && !existingHostInfo.ConnectionState.initiator {
|
||||
if !committed && existingHostInfo.lastHandshakeTime >= hostinfo.lastHandshakeTime && !existingHostInfo.ConnectionState.initiator {
|
||||
return existingHostInfo, ErrExistingHostInfo
|
||||
}
|
||||
|
||||
|
||||
@@ -214,7 +214,10 @@ func (hm *HandshakeManager) completeHybridResponder(via ViaSender, hh *Handshake
|
||||
remoteCert := result.RemoteCert
|
||||
hostinfo.buildNetworks(f.myVpnNetworksTable, remoteCert.Certificate)
|
||||
|
||||
existing, err := hm.CheckAndComplete(hostinfo, handshakePacketStage0, f)
|
||||
// The initiator only sends msg3 once it settled on this handshake, so this
|
||||
// tunnel wins even over a newer one: a classical attempt that crossed it, say,
|
||||
// which the initiator has already given up on.
|
||||
existing, err := hm.checkAndComplete(hostinfo, handshakePacketStage0, f, true)
|
||||
if err != nil {
|
||||
hm.handleCheckAndCompleteError(err, existing, hostinfo, via, machine.Subtype(), 0)
|
||||
return
|
||||
|
||||
Reference in new issue
Block a user