(isRetry bool)
| 96 | } |
| 97 | |
| 98 | func (peer *Peer) SendHandshakeInitiation(isRetry bool) error { |
| 99 | if !isRetry { |
| 100 | peer.timers.handshakeAttempts.Store(0) |
| 101 | } |
| 102 | |
| 103 | peer.handshake.mutex.RLock() |
| 104 | if time.Since(peer.handshake.lastSentHandshake) < RekeyTimeout { |
| 105 | peer.handshake.mutex.RUnlock() |
| 106 | return nil |
| 107 | } |
| 108 | peer.handshake.mutex.RUnlock() |
| 109 | |
| 110 | peer.handshake.mutex.Lock() |
| 111 | if time.Since(peer.handshake.lastSentHandshake) < RekeyTimeout { |
| 112 | peer.handshake.mutex.Unlock() |
| 113 | return nil |
| 114 | } |
| 115 | peer.handshake.lastSentHandshake = time.Now() |
| 116 | peer.handshake.mutex.Unlock() |
| 117 | |
| 118 | peer.device.Log.Verbosef("%v - Sending handshake initiation", peer) |
| 119 | |
| 120 | msg, err := peer.device.CreateMessageInitiation(peer) |
| 121 | if err != nil { |
| 122 | peer.device.Log.Errorf("%v - Failed to create initiation message: %v", peer, err) |
| 123 | return err |
| 124 | } |
| 125 | |
| 126 | packet := make([]byte, MessageInitiationSize) |
| 127 | _ = msg.marshal(packet) |
| 128 | peer.cookieGenerator.AddMacs(packet) |
| 129 | |
| 130 | peer.timersAnyAuthenticatedPacketTraversal(false) |
| 131 | peer.timersAnyAuthenticatedPacketSent() |
| 132 | |
| 133 | // try a different index every time |
| 134 | peer.endpoints.Lock() |
| 135 | if len(peer.endpoints.val) == 0 { |
| 136 | peer.device.Log.Verbosef("%v - Cannot send handshake initiation, no endpoints available", peer) |
| 137 | peer.endpoints.Unlock() |
| 138 | return nil |
| 139 | } |
| 140 | peer.endpoints.lastInitIndex = (peer.endpoints.lastInitIndex + 1) % len(peer.endpoints.val) |
| 141 | selEp := []conn.Endpoint{peer.endpoints.val[peer.endpoints.lastInitIndex]} |
| 142 | peer.endpoints.Unlock() |
| 143 | |
| 144 | err = peer.SendBuffers([][]byte{packet}, selEp) |
| 145 | if err != nil { |
| 146 | peer.device.Log.Verbosef("%v - Failed to send handshake initiation: %v", peer, err) |
| 147 | } |
| 148 | peer.timersHandshakeInitiated() |
| 149 | |
| 150 | return err |
| 151 | } |
| 152 | |
| 153 | func (peer *Peer) SendHandshakeResponse(srcEndpoint conn.Endpoint) error { |
| 154 | peer.handshake.mutex.Lock() |
no test coverage detected