فهرست منبع

client: don't Done received frame before DataProtoDest_SubmitRelayFrame is done with it

ambrop7 15 سال پیش
والد
کامیت
9fbf6ec4f7
1فایلهای تغییر یافته به همراه6 افزوده شده و 7 حذف شده
  1. 6 7
      client/client.c

+ 6 - 7
client/client.c

@@ -2208,8 +2208,12 @@ void peer_recv_handler_send (struct peer_data *peer, uint8_t *data, int data_len
     }
     }
     
     
 out:
 out:
-    // accept packet
-    if (!local) {
+    // pass packet to device, or accept immediately
+    // NOTE: this must be done first, because DataProtoDest_SubmitRelayFrame needs the frame
+    // while it is evaluating!
+    if (local) {
+        PacketPassInterface_Sender_Send(peer->local_recv_if, data, data_len);
+    } else {
         PacketPassInterface_Done(&peer->recv_ppi);
         PacketPassInterface_Done(&peer->recv_ppi);
     }
     }
     
     
@@ -2218,11 +2222,6 @@ out:
         DataProtoDest_SubmitRelayFrame(&relay_dest->send_dp, &src_peer->relay_source, data, data_len, options.send_buffer_relay_size);
         DataProtoDest_SubmitRelayFrame(&relay_dest->send_dp, &src_peer->relay_source, data, data_len, options.send_buffer_relay_size);
     }
     }
     
     
-    // submit to device
-    if (local) {
-        PacketPassInterface_Sender_Send(peer->local_recv_if, data, data_len);
-    }
-    
     // inform DataProto of received packet
     // inform DataProto of received packet
     if (dp_good) {
     if (dp_good) {
         DataProtoDest_Received(&peer->send_dp, !!(flags & DATAPROTO_FLAGS_RECEIVING_KEEPALIVES));
         DataProtoDest_Received(&peer->send_dp, !!(flags & DATAPROTO_FLAGS_RECEIVING_KEEPALIVES));