Просмотр исходного кода

client, StreamPeerIO: allow specifying socket send buffer (SO_SNDBUF)

ambrop7 14 лет назад
Родитель
Сommit
896860f605
4 измененных файлов с 33 добавлено и 5 удалено
  1. 6 2
      client/StreamPeerIO.c
  2. 3 2
      client/StreamPeerIO.h
  3. 22 1
      client/client.c
  4. 2 0
      client/client.h

+ 6 - 2
client/StreamPeerIO.c

@@ -304,8 +304,10 @@ int init_io (StreamPeerIO *pio, sslsocket *sock)
     ASSERT(!pio->sock)
     
     // limit socket send buffer, else our scheduling is pointless
-    if (!BConnection_SetSendBuffer(&sock->con, STREAMPEERIO_SOCKET_SEND_BUFFER)) {
-        BLog(BLOG_WARNING, "BConnection_SetSendBuffer failed");
+    if (pio->sock_sndbuf > 0) {
+        if (!BConnection_SetSendBuffer(&sock->con, pio->sock_sndbuf)) {
+            BLog(BLOG_WARNING, "BConnection_SetSendBuffer failed");
+        }
     }
     
     if (pio->ssl) {
@@ -534,6 +536,7 @@ int StreamPeerIO_Init (
     uint8_t *ssl_peer_cert,
     int ssl_peer_cert_len,
     int payload_mtu,
+    int sock_sndbuf,
     PacketPassInterface *user_recv_if,
     StreamPeerIO_handler_error handler_error,
     void *user
@@ -552,6 +555,7 @@ int StreamPeerIO_Init (
         pio->ssl_peer_cert_len = ssl_peer_cert_len;
     }
     pio->payload_mtu = payload_mtu;
+    pio->sock_sndbuf = sock_sndbuf;
     pio->handler_error = handler_error;
     pio->user = user;
     

+ 3 - 2
client/StreamPeerIO.h

@@ -47,8 +47,6 @@
 #include <flow/SingleStreamSender.h>
 #include <client/PasswordListener.h>
 
-#define STREAMPEERIO_SOCKET_SEND_BUFFER 4096
-
 /**
  * Callback function invoked when an error occurs with the peer connection.
  * The object has entered default state.
@@ -72,6 +70,7 @@ typedef struct {
     uint8_t *ssl_peer_cert;
     int ssl_peer_cert_len;
     int payload_mtu;
+    int sock_sndbuf;
     StreamPeerIO_handler_error handler_error;
     void *user;
     
@@ -134,6 +133,7 @@ typedef struct {
  * @param ssl_peer_cert if using SSL, the certificate we expect the peer to have
  * @param ssl_peer_cert_len if using SSL, the length of the certificate
  * @param payload_mtu maximum packet size as seen from the user. Must be >=0.
+ * @param sock_sndbuf socket SO_SNDBUF option. Specify <=0 to not set it.
  * @param user_recv_if interface to use for submitting received packets. Its MTU
  *                     must be >=payload_mtu.
  * @param handler_error handler function invoked when a connection error occurs
@@ -147,6 +147,7 @@ int StreamPeerIO_Init (
     uint8_t *ssl_peer_cert,
     int ssl_peer_cert_len,
     int payload_mtu,
+    int sock_sndbuf,
     PacketPassInterface *user_recv_if,
     StreamPeerIO_handler_error handler_error,
     void *user

+ 22 - 1
client/client.c

@@ -102,6 +102,7 @@ struct {
     int otp_num_warn;
     int fragmentation_latency;
     int peer_ssl;
+    int peer_tcp_sndbuf;
     char *scopes[MAX_SCOPES];
     int num_scopes;
     int send_buffer_size;
@@ -625,6 +626,7 @@ void print_help (const char *name)
         "        )\n"
         "        (transport-mode=tcp?\n"
         "            (ssl? [--peer-ssl])\n"
+        "            [--peer-tcp-sndbuf <bytes / 0>]\n"
         "        )\n"
         "        [--send-buffer-size <num-packets>]\n"
         "        [--send-buffer-relay-size <num-packets>]\n"
@@ -674,6 +676,7 @@ int parse_arguments (int argc, char *argv[])
     options.otp_mode = SPPROTO_OTP_MODE_NONE;
     options.fragmentation_latency = PEER_DEFAULT_UDP_FRAGMENTATION_LATENCY;
     options.peer_ssl = 0;
+    options.peer_tcp_sndbuf = -1;
     options.send_buffer_size = PEER_DEFAULT_SEND_BUFFER_SIZE;
     options.send_buffer_relay_size = PEER_DEFAULT_SEND_BUFFER_RELAY_SIZE;
     options.max_macs = PEER_DEFAULT_MAX_MACS;
@@ -976,6 +979,17 @@ int parse_arguments (int argc, char *argv[])
         else if (!strcmp(arg, "--peer-ssl")) {
             options.peer_ssl = 1;
         }
+        else if (!strcmp(arg, "--peer-tcp-sndbuf")) {
+            if (1 >= argc - i) {
+                fprintf(stderr, "%s: requires an argument\n", arg);
+                return 0;
+            }
+            if ((options.peer_tcp_sndbuf = atoi(argv[i + 1])) < 0) {
+                fprintf(stderr, "%s: wrong argument\n", arg);
+                return 0;
+            }
+            i++;
+        }
         else if (!strcmp(arg, "--send-buffer-size")) {
             if (1 >= argc - i) {
                 fprintf(stderr, "%s: requires an argument\n", arg);
@@ -1097,6 +1111,11 @@ int parse_arguments (int argc, char *argv[])
         return 0;
     }
     
+    if (!(!(options.peer_tcp_sndbuf >= 0) || options.transport_mode == TRANSPORT_MODE_TCP)) {
+        fprintf(stderr, "False: --peer-tcp-sndbuf => TCP\n");
+        return 0;
+    }
+    
     return 1;
 }
 
@@ -1476,7 +1495,9 @@ int peer_init_link (struct peer_data *peer)
             &peer->pio.tcp.pio, &ss, options.peer_ssl,
             (options.peer_ssl ? peer->cert : NULL),
             (options.peer_ssl ? peer->cert_len : -1),
-            data_mtu, recv_if,
+            data_mtu,
+            (options.peer_tcp_sndbuf >= 0 ? options.peer_tcp_sndbuf : PEER_DEFAULT_TCP_SNDBUF),
+            recv_if,
             (StreamPeerIO_handler_error)peer_tcp_pio_handler_error, peer
         )) {
             peer_log(peer, BLOG_ERROR, "StreamPeerIO_Init failed");

+ 2 - 0
client/client.h

@@ -52,6 +52,8 @@
 #define PEER_DEFAULT_UDP_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
+// socket send buffer (SO_SNDBUF) for peer TCP connections, <=0 to not set
+#define PEER_DEFAULT_TCP_SNDBUF 4096
 // 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)