lib: extract lost frame processing to own method
diff --git a/quiche/src/lib.rs b/quiche/src/lib.rs
index 83a2e72..ab54035 100644
--- a/quiche/src/lib.rs
+++ b/quiche/src/lib.rs
@@ -3321,102 +3321,7 @@
         };
 
         let epoch = pkt_type.to_epoch()?;
-        let pkt_space = &mut self.pkt_num_spaces[epoch];
-
-        // Process lost frames. There might be several paths having lost frames.
-        for (_, p) in self.paths.iter_mut() {
-            for lost in p.recovery.lost[epoch].drain(..) {
-                match lost {
-                    frame::Frame::CryptoHeader { offset, length } => {
-                        pkt_space.crypto_stream.send.retransmit(offset, length);
-
-                        self.stream_retrans_bytes += length as u64;
-                        p.stream_retrans_bytes += length as u64;
-
-                        self.retrans_count += 1;
-                        p.retrans_count += 1;
-                    },
-
-                    frame::Frame::StreamHeader {
-                        stream_id,
-                        offset,
-                        length,
-                        fin,
-                    } => {
-                        let stream = match self.streams.get_mut(stream_id) {
-                            Some(v) => v,
-
-                            None => continue,
-                        };
-
-                        let was_flushable = stream.is_flushable();
-
-                        let empty_fin = length == 0 && fin;
-
-                        stream.send.retransmit(offset, length);
-
-                        // If the stream is now flushable push it to the
-                        // flushable queue, but only if it wasn't already
-                        // queued.
-                        //
-                        // Consider the stream flushable also when we are
-                        // sending a zero-length frame that has the fin flag
-                        // set.
-                        if (stream.is_flushable() || empty_fin) && !was_flushable
-                        {
-                            let priority_key = Arc::clone(&stream.priority_key);
-                            self.streams.insert_flushable(&priority_key);
-                        }
-
-                        self.stream_retrans_bytes += length as u64;
-                        p.stream_retrans_bytes += length as u64;
-
-                        self.retrans_count += 1;
-                        p.retrans_count += 1;
-                    },
-
-                    frame::Frame::ACK { .. } => {
-                        pkt_space.ack_elicited = true;
-                    },
-
-                    frame::Frame::ResetStream {
-                        stream_id,
-                        error_code,
-                        final_size,
-                    } =>
-                        if self.streams.get(stream_id).is_some() {
-                            self.streams
-                                .insert_reset(stream_id, error_code, final_size);
-                        },
-
-                    // Retransmit HANDSHAKE_DONE only if it hasn't been acked at
-                    // least once already.
-                    frame::Frame::HandshakeDone if !self.handshake_done_acked => {
-                        self.handshake_done_sent = false;
-                    },
-
-                    frame::Frame::MaxStreamData { stream_id, .. } => {
-                        if self.streams.get(stream_id).is_some() {
-                            self.streams.insert_almost_full(stream_id);
-                        }
-                    },
-
-                    frame::Frame::MaxData { .. } => {
-                        self.almost_full = true;
-                    },
-
-                    frame::Frame::NewConnectionId { seq_num, .. } => {
-                        self.ids.mark_advertise_new_scid_seq(seq_num, true);
-                    },
-
-                    frame::Frame::RetireConnectionId { seq_num } => {
-                        self.ids.mark_retire_dcid_seq(seq_num, true);
-                    },
-
-                    _ => (),
-                }
-            }
-        }
+        self.process_lost_frames(epoch);
 
         let is_app_limited = self.delivery_rate_check_if_app_limited();
         let n_paths = self.paths.len();
@@ -4393,6 +4298,105 @@
         Ok((pkt_type, written))
     }
 
+    fn process_lost_frames(&mut self, epoch: packet::Epoch) {
+        let pkt_space = &mut self.pkt_num_spaces[epoch];
+
+        // There might be several paths having lost frames.
+        for (_, p) in self.paths.iter_mut() {
+            for lost in p.recovery.lost[epoch].drain(..) {
+                match lost {
+                    frame::Frame::CryptoHeader { offset, length } => {
+                        pkt_space.crypto_stream.send.retransmit(offset, length);
+
+                        self.stream_retrans_bytes += length as u64;
+                        p.stream_retrans_bytes += length as u64;
+
+                        self.retrans_count += 1;
+                        p.retrans_count += 1;
+                    },
+
+                    frame::Frame::StreamHeader {
+                        stream_id,
+                        offset,
+                        length,
+                        fin,
+                    } => {
+                        let stream = match self.streams.get_mut(stream_id) {
+                            Some(v) => v,
+
+                            None => continue,
+                        };
+
+                        let was_flushable = stream.is_flushable();
+
+                        let empty_fin = length == 0 && fin;
+
+                        stream.send.retransmit(offset, length);
+
+                        // If the stream is now flushable push it to the
+                        // flushable queue, but only if it wasn't already
+                        // queued.
+                        //
+                        // Consider the stream flushable also when we are
+                        // sending a zero-length frame that has the fin flag
+                        // set.
+                        if (stream.is_flushable() || empty_fin) && !was_flushable
+                        {
+                            let priority_key = Arc::clone(&stream.priority_key);
+                            self.streams.insert_flushable(&priority_key);
+                        }
+
+                        self.stream_retrans_bytes += length as u64;
+                        p.stream_retrans_bytes += length as u64;
+
+                        self.retrans_count += 1;
+                        p.retrans_count += 1;
+                    },
+
+                    frame::Frame::ACK { .. } => {
+                        pkt_space.ack_elicited = true;
+                    },
+
+                    frame::Frame::ResetStream {
+                        stream_id,
+                        error_code,
+                        final_size,
+                    } =>
+                        if self.streams.get(stream_id).is_some() {
+                            self.streams
+                                .insert_reset(stream_id, error_code, final_size);
+                        },
+
+                    // Retransmit HANDSHAKE_DONE only if it hasn't been acked at
+                    // least once already.
+                    frame::Frame::HandshakeDone if !self.handshake_done_acked => {
+                        self.handshake_done_sent = false;
+                    },
+
+                    frame::Frame::MaxStreamData { stream_id, .. } => {
+                        if self.streams.get(stream_id).is_some() {
+                            self.streams.insert_almost_full(stream_id);
+                        }
+                    },
+
+                    frame::Frame::MaxData { .. } => {
+                        self.almost_full = true;
+                    },
+
+                    frame::Frame::NewConnectionId { seq_num, .. } => {
+                        self.ids.mark_advertise_new_scid_seq(seq_num, true);
+                    },
+
+                    frame::Frame::RetireConnectionId { seq_num } => {
+                        self.ids.mark_retire_dcid_seq(seq_num, true);
+                    },
+
+                    _ => (),
+                }
+            }
+        }
+    }
+
     /// Returns the size of the send quantum, in bytes.
     ///
     /// This represents the maximum size of a packet burst as determined by the