فهرست منبع

client: make FrameDecider parameters tunable

ambrop7 15 سال پیش
والد
کامیت
fca94bd6c8
3فایلهای تغییر یافته به همراه85 افزوده شده و 9 حذف شده
  1. 22 0
      badvpn-client.8
  2. 58 2
      client/client.c
  3. 5 7
      client/client.h

+ 22 - 0
badvpn-client.8

@@ -75,6 +75,14 @@ badvpn-client \- VPN node daemon for the BadVPN peer-to-peer VPN system
 .br
 .RB "[" --send-buffer-relay-size " <num-packets>]"
 .br
+.RB "[" --max-macs " <num>]"
+.br
+.RB "[" --max-groups " <num>]"
+.br
+.RB "[" --igmp-group-membership-interval " <ms>]"
+.br
+.RB "[" --igmp-last-member-query-time " <ms>]"
+.br
 .RE
 .SH INTRODUCTION
 .P
@@ -205,6 +213,20 @@ number of packets.
 .BR --send-buffer-relay-size " <num-packets>"
 Sets the minimum size of the peers' send buffers for relaying frames from other peers, in number of
 packets.
+.TP
+.BR --max-macs " <num>"
+Sets the maximum number of MAC addresses to remember for a peer. When the number is exceeded, the least
+recently used slot will be reused.
+.TP
+.BR --max-groups " <num>"
+Sets the maximum number of IGMP group memberships to remember for a peer. When the number is exceeded,
+the least recently used slot will be reused.
+.TP
+.BR --igmp-group-membership-interval " <ms>"
+Sets the Group Membership Interval parameter for IGMP snooping, in milliseconds.
+.TP
+.BR --igmp-last-member-query-time " <ms>"
+Sets the Last Member Query Time parameter for IGMP snooping, in milliseconds.
 .SH "EXIT CODE"
 .P
 If initialization fails, exits with code 1. Otherwise runs until termination is requested or server connection

+ 58 - 2
client/client.c

@@ -114,6 +114,10 @@ struct {
     int num_scopes;
     int send_buffer_size;
     int send_buffer_relay_size;
+    int max_macs;
+    int max_groups;
+    int igmp_group_membership_interval;
+    int igmp_last_member_query_time;
 } options;
 
 // bind addresses
@@ -513,7 +517,7 @@ int main (int argc, char *argv[])
     BAVL_Init(&peers_tree, OFFSET_DIFF(struct peer_data, id, tree_node), (BAVL_comparator)peerid_comparator, NULL);
     
     // init frame decider
-    FrameDecider_Init(&frame_decider, PEER_MAX_MACS, PEER_MAX_GROUPS, IGMP_GROUP_MEMBERSHIP_INTERVAL, IGMP_LAST_MEMBER_QUERY_TIME, &ss);
+    FrameDecider_Init(&frame_decider, options.max_macs, options.max_groups, options.igmp_group_membership_interval, options.igmp_last_member_query_time, &ss);
     
     // init relays list
     LinkedList2_Init(&relays);
@@ -656,6 +660,10 @@ void print_help (const char *name)
         "        )\n"
         "        [--send-buffer-size <num-packets>]\n"
         "        [--send-buffer-relay-size <num-packets>]\n"
+        "        [--max-macs <num>]\n"
+        "        [--max-groups <num>]\n"
+        "        [--igmp-group-membership-interval <ms>]\n"
+        "        [--igmp-last-member-query-time <ms>]\n"
         "Address format is a.b.c.d:port (IPv4) or [addr]:port (IPv6).\n",
         name
     );
@@ -695,10 +703,14 @@ 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_UDP_DEFAULT_FRAGMENTATION_LATENCY;
+    options.fragmentation_latency = PEER_DEFAULT_UDP_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;
+    options.max_macs = PEER_DEFAULT_MAX_MACS;
+    options.max_groups = PEER_DEFAULT_MAX_GROUPS;
+    options.igmp_group_membership_interval = DEFAULT_IGMP_GROUP_MEMBERSHIP_INTERVAL;
+    options.igmp_last_member_query_time = DEFAULT_IGMP_LAST_MEMBER_QUERY_TIME;
     
     int have_fragmentation_latency = 0;
     
@@ -1009,6 +1021,50 @@ int parse_arguments (int argc, char *argv[])
             }
             i++;
         }
+        else if (!strcmp(arg, "--max-macs")) {
+            if (1 >= argc - i) {
+                fprintf(stderr, "%s: requires an argument\n", arg);
+                return 0;
+            }
+            if ((options.max_macs = atoi(argv[i + 1])) <= 0) {
+                fprintf(stderr, "%s: wrong argument\n", arg);
+                return 0;
+            }
+            i++;
+        }
+        else if (!strcmp(arg, "--max-groups")) {
+            if (1 >= argc - i) {
+                fprintf(stderr, "%s: requires an argument\n", arg);
+                return 0;
+            }
+            if ((options.max_groups = atoi(argv[i + 1])) <= 0) {
+                fprintf(stderr, "%s: wrong argument\n", arg);
+                return 0;
+            }
+            i++;
+        }
+        else if (!strcmp(arg, "--igmp-group-membership-interval")) {
+            if (1 >= argc - i) {
+                fprintf(stderr, "%s: requires an argument\n", arg);
+                return 0;
+            }
+            if ((options.igmp_group_membership_interval = atoi(argv[i + 1])) <= 0) {
+                fprintf(stderr, "%s: wrong argument\n", arg);
+                return 0;
+            }
+            i++;
+        }
+        else if (!strcmp(arg, "--igmp-last-member-query-time")) {
+            if (1 >= argc - i) {
+                fprintf(stderr, "%s: requires an argument\n", arg);
+                return 0;
+            }
+            if ((options.igmp_last_member_query_time = atoi(argv[i + 1])) <= 0) {
+                fprintf(stderr, "%s: wrong argument\n", arg);
+                return 0;
+            }
+            i++;
+        }
         else {
             fprintf(stderr, "unknown option: %s\n", arg);
             return 0;

+ 5 - 7
client/client.h

@@ -49,11 +49,11 @@
 // maximum number of peers
 #define MAX_PEERS 256
 // maximum number of peer's MAC addresses to remember
-#define PEER_MAX_MACS 16
+#define PEER_DEFAULT_MAX_MACS 16
 // maximum number of multicast addresses per peer
-#define PEER_MAX_GROUPS 16
+#define PEER_DEFAULT_MAX_GROUPS 16
 // how long we wait for a packet to reach full size before sending it (see FragmentProtoDisassembler latency argument)
-#define PEER_UDP_DEFAULT_FRAGMENTATION_LATENCY 0
+#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
 // keep-alive packet interval for p2p communication
@@ -71,17 +71,15 @@
 
 // for how long a peer can send no Membership Reports for a group
 // before the peer and group are disassociated
-#define IGMP_GROUP_MEMBERSHIP_INTERVAL 260000
+#define DEFAULT_IGMP_GROUP_MEMBERSHIP_INTERVAL 260000
 // how long to wait for joins after a Group Specific query has been
 // forwarded to a peer before assuming there are no listeners at the peer
-#define IGMP_LAST_MEMBER_QUERY_TIME 2000
+#define DEFAULT_IGMP_LAST_MEMBER_QUERY_TIME 2000
 
 // maximum bind addresses
 #define MAX_BIND_ADDRS 8
-
 // maximum external addresses per bind address
 #define MAX_EXT_ADDRS 8
-
 // maximum scopes
 #define MAX_SCOPES 8