Przeglądaj źródła

DatagramPeerIO: add max_frames argument for FragmentProtoAssembler. Change it from 1 to 4.

ambrop7 15 lat temu
rodzic
commit
cc5313d26d
4 zmienionych plików z 14 dodań i 11 usunięć
  1. 6 5
      client/DatagramPeerIO.c
  2. 2 1
      client/DatagramPeerIO.h
  3. 3 4
      client/client.c
  4. 3 1
      client/client.h

+ 6 - 5
client/DatagramPeerIO.c

@@ -36,7 +36,7 @@
 #define DATAGRAMPEERIO_COMPONENT_SINK 1
 #define DATAGRAMPEERIO_COMPONENT_SOURCE 2
 
-static int init_persistent_io (DatagramPeerIO *o, btime_t latency, PacketPassInterface *recv_userif);
+static int init_persistent_io (DatagramPeerIO *o, btime_t latency, int num_frames, PacketPassInterface *recv_userif);
 static void free_persistent_io (DatagramPeerIO *o);
 static void init_sending (DatagramPeerIO *o, BAddr addr, BIPAddr local_addr);
 static void free_sending (DatagramPeerIO *o);
@@ -47,7 +47,7 @@ static void reset_mode (DatagramPeerIO *o);
 static void recv_decoder_notifier_handler (DatagramPeerIO *o, uint8_t *data, int data_len);
 static void send_encoder_notifier_handler (DatagramPeerIO *o, uint8_t *data, int data_len);
 
-int init_persistent_io (DatagramPeerIO *o, btime_t latency, PacketPassInterface *recv_userif)
+int init_persistent_io (DatagramPeerIO *o, btime_t latency, int num_frames, PacketPassInterface *recv_userif)
 {
     // init error domain
     FlowErrorDomain_Init(&o->domain, (FlowErrorDomain_handler)error_handler, o);
@@ -55,7 +55,7 @@ int init_persistent_io (DatagramPeerIO *o, btime_t latency, PacketPassInterface
     // init receiving
     
     // init assembler
-    if (!FragmentProtoAssembler_Init(&o->recv_assembler, o->spproto_payload_mtu, recv_userif, 1, fragmentproto_max_chunks_for_frame(o->spproto_payload_mtu, o->payload_mtu), BReactor_PendingGroup(o->reactor))) {
+    if (!FragmentProtoAssembler_Init(&o->recv_assembler, o->spproto_payload_mtu, recv_userif, num_frames, fragmentproto_max_chunks_for_frame(o->spproto_payload_mtu, o->payload_mtu), BReactor_PendingGroup(o->reactor))) {
         BLog(BLOG_ERROR, "FragmentProtoAssembler_Init failed");
         goto fail0;
     }
@@ -277,11 +277,12 @@ void send_encoder_notifier_handler (DatagramPeerIO *o, uint8_t *data, int data_l
     }
 }
 
-int DatagramPeerIO_Init (DatagramPeerIO *o, BReactor *reactor, int payload_mtu, int socket_mtu, struct spproto_security_params sp_params, btime_t latency, PacketPassInterface *recv_userif)
+int DatagramPeerIO_Init (DatagramPeerIO *o, BReactor *reactor, int payload_mtu, int socket_mtu, struct spproto_security_params sp_params, btime_t latency, int num_frames, PacketPassInterface *recv_userif)
 {
     ASSERT(payload_mtu >= 0)
     ASSERT(socket_mtu >= 0)
     spproto_assert_security_params(sp_params);
+    ASSERT(num_frames > 0)
     ASSERT(PacketPassInterface_GetMTU(recv_userif) >= payload_mtu)
     
     // set parameters
@@ -316,7 +317,7 @@ int DatagramPeerIO_Init (DatagramPeerIO *o, BReactor *reactor, int payload_mtu,
     o->mode = DATAGRAMPEERIO_MODE_NONE;
     
     // init persistent I/O objects
-    if (!init_persistent_io(o, latency, recv_userif)) {
+    if (!init_persistent_io(o, latency, num_frames, recv_userif)) {
         goto fail1;
     }
     

+ 2 - 1
client/DatagramPeerIO.h

@@ -136,10 +136,11 @@ typedef struct {
  *                   spproto_payload_mtu_for_carrier_mtu(sp_params, socket_mtu) > sizeof(struct fragmentproto_chunk_header)
  * @param sp_params SPProto security parameters
  * @param latency latency parameter to {@link FragmentProtoDisassembler_Init}.
+ * @param num_frames num_frames parameter to {@link FragmentProtoAssembler_Init}. Must be >0.
  * @param recv_userif interface to pass received packets to the user. Its MTU must be >=payload_mtu.
  * @return 1 on success, 0 on failure
  */
-int DatagramPeerIO_Init (DatagramPeerIO *o, BReactor *reactor, int payload_mtu, int socket_mtu, struct spproto_security_params sp_params, btime_t latency, PacketPassInterface *recv_userif) WARN_UNUSED;
+int DatagramPeerIO_Init (DatagramPeerIO *o, BReactor *reactor, int payload_mtu, int socket_mtu, struct spproto_security_params sp_params, btime_t latency, int num_frames, PacketPassInterface *recv_userif) WARN_UNUSED;
 
 /**
  * Frees the object.

+ 3 - 4
client/client.c

@@ -684,7 +684,7 @@ int parse_arguments (int argc, char *argv[])
     options.encryption_mode = -1;
     options.hash_mode = -1;
     options.otp_mode = SPPROTO_OTP_MODE_NONE;
-    options.fragmentation_latency = PEER_DEFAULT_FRAGMENTATION_LATENCY;
+    options.fragmentation_latency = PEER_UDP_DEFAULT_FRAGMENTATION_LATENCY;
     options.peer_ssl = 0;
     options.send_buffer_size = PEER_DEFAULT_SEND_BUFFER_SIZE;
     options.send_buffer_relay_size = PEER_DEFAULT_SEND_BUFFER_RELAY_SIZE;
@@ -1398,9 +1398,8 @@ int peer_init_link (struct peer_data *peer)
     if (options.transport_mode == TRANSPORT_MODE_UDP) {
         // init DatagramPeerIO
         if (!DatagramPeerIO_Init(
-            &peer->pio.udp.pio, &ss, data_mtu, CLIENT_UDP_MTU,
-            sp_params, options.fragmentation_latency,
-            &peer->recv_ppi
+            &peer->pio.udp.pio, &ss, data_mtu, CLIENT_UDP_MTU, sp_params,
+            options.fragmentation_latency, PEER_UDP_ASSEMBLER_NUM_FRAMES, &peer->recv_ppi
         )) {
             peer_log(peer, BLOG_ERROR, "DatagramPeerIO_Init failed");
             goto fail1;

+ 3 - 1
client/client.h

@@ -52,7 +52,9 @@
 // maximum number of multicast addresses per peer
 #define PEER_MAX_GROUPS 16
 // how long we wait for a packet to reach full size before sending it (see FragmentProtoDisassembler latency argument)
-#define PEER_DEFAULT_FRAGMENTATION_LATENCY 0
+#define PEER_UDP_DEFAULT_FRAGMENTATION_LATENCY 0
+// value related to how much out-of-order input we tolerate (see FragmentProtoAssembler num_frames argument)
+#define PEER_UDP_ASSEMBLER_NUM_FRAMES 4
 // keep-alive packet interval for p2p communication
 #define PEER_KEEPALIVE_INTERVAL 10000
 // keep-alive receive timer for p2p communication (after how long to consider the link down)