diff options
Diffstat (limited to 'src/recv_worker.rs')
-rw-r--r-- | src/recv_worker.rs | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/src/recv_worker.rs b/src/recv_worker.rs index 316bb48..83b3273 100644 --- a/src/recv_worker.rs +++ b/src/recv_worker.rs @@ -135,7 +135,9 @@ impl<R: UdpReceiver, S: UdpSender> RecvWorker<R, S> { PktType::Ctl => match cursor.read_u8()?.try_into()? { CtlType::Ack => { let seqnum = cursor.read_u16::<BigEndian>()?; - self.share.ack_chans.lock().await.remove(&seqnum); + if let Some((tx, _)) = self.share.ack_chans.lock().await.remove(&seqnum) { + tx.send(true).ok(); + } } CtlType::SetPeerID => { let mut id = self.share.remote_id.write().await; @@ -212,6 +214,21 @@ impl<R: UdpReceiver, S: UdpSender> RecvWorker<R, S> { let seqnum = cursor.read_u16::<BigEndian>()?; chan.packets[to_seqnum(seqnum)].set(Some(cursor.remaining_slice().into())); + let mut ack_data = Vec::with_capacity(3); + ack_data.write_u8(CtlType::Ack as u8)?; + ack_data.write_u16::<BigEndian>(seqnum)?; + + self.share + .send( + PktType::Ctl, + Pkt { + unrel: true, + chan: chan.num, + data: &ack_data, + }, + ) + .await?; + fn next_pkt(chan: &mut Chan) -> Option<Vec<u8>> { chan.packets[to_seqnum(chan.seqnum)].take() } |