Implement SEQUENCE_LAST flag

This commit is contained in:
Kleissner
2021-04-19 15:05:17 +02:00
parent b2db81143e
commit 1eb4f4083b
3 changed files with 24 additions and 2 deletions

View File

@@ -51,6 +51,11 @@ const (
ActionInfoStore = 3 // INFO_STORE Sender indicates storing provided data
)
// Actions in Response message
const (
ActionSequenceLast = 0 // SEQUENCE_LAST Last response to the announcement in the sequence
)
// Features are sent as bit array in the Announcement message.
const (
FeatureIPv4Listen = 0 // Sender listens on IPv4
@@ -726,9 +731,10 @@ createPacketLoop:
hashesNotFound = nil
}
raw[2] |= 1 << ActionSequenceLast // Indicate that no more responses will be sent in this sequence
packetsRaw = append(packetsRaw, raw[:packetSize])
if len(hash2Peers) == 0 && len(filesEmbed) == 0 && len(hashesNotFound) == 0 {
if len(hash2Peers) == 0 && len(filesEmbed) == 0 && len(hashesNotFound) == 0 { // this should always be the case here
return
}
}

View File

@@ -124,4 +124,16 @@ func msgValidateSequence(raw *MessageRaw) (valid bool, rtt time.Duration) {
return sequence.expires.After(time.Now()), rtt
}
// TODO: Manual invalidation of sequence number from high-level (once information request is considered handled).
// msgInvalidateSequence invalidates the sequence number.
func msgInvalidateSequence(raw *MessageRaw) {
// Only Response
if raw.Command != CommandResponse {
return
}
key := string(raw.SenderPublicKey.SerializeCompressed()) + strconv.FormatUint(uint64(raw.Sequence), 10)
sequencesMutex.Lock()
delete(sequences, key)
sequencesMutex.Unlock()
}

View File

@@ -174,6 +174,10 @@ func packetWorker(packets <-chan networkWire) {
case CommandResponse: // Response
if response, _ := msgDecodeResponse(raw); response != nil {
if (response.Actions & (1 << ActionSequenceLast)) > 0 {
msgInvalidateSequence(raw)
}
peer.cmdResponse(response)
}