fix: apply S4 transport padding to keepalive packets
Keepalive packets were excluded from S4 padding because the padding logic was nested inside the dataSent guard. The receiving side (DeterminePacketTypeAndPadding) expects S4 padding on all transport packets, so unpadded keepalives fail H4 header validation and are silently dropped. This prevents the responder from completing key confirmation — lastHandshakeNano stays 0 until real data flows through the tunnel.
This commit is contained in:
parent
12a012205e
commit
f4f4c99926
1 changed files with 8 additions and 9 deletions
|
|
@ -574,7 +574,7 @@ func (peer *Peer) RoutineSequentialSender(maxBatchSize int) {
|
||||||
for _, elem := range elemsContainer.elems {
|
for _, elem := range elemsContainer.elems {
|
||||||
if len(elem.packet) != MessageKeepaliveSize {
|
if len(elem.packet) != MessageKeepaliveSize {
|
||||||
dataSent = true
|
dataSent = true
|
||||||
|
}
|
||||||
if padding := device.paddings.transport; padding > 0 {
|
if padding := device.paddings.transport; padding > 0 {
|
||||||
// elem.packet is stored at the start of elem.buffer
|
// elem.packet is stored at the start of elem.buffer
|
||||||
// with zero padding
|
// with zero padding
|
||||||
|
|
@ -584,7 +584,6 @@ func (peer *Peer) RoutineSequentialSender(maxBatchSize int) {
|
||||||
rand.Read(elem.buffer[:padding])
|
rand.Read(elem.buffer[:padding])
|
||||||
elem.packet = elem.buffer[:padding+len(elem.packet)]
|
elem.packet = elem.buffer[:padding+len(elem.packet)]
|
||||||
}
|
}
|
||||||
}
|
|
||||||
bufs = append(bufs, elem.packet)
|
bufs = append(bufs, elem.packet)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue