|
28 | 28 | #include <linux/tcp.h> |
29 | 29 |
|
30 | 30 | static int pf = AF_INET; |
| 31 | +static int proto_tx = IPPROTO_MPTCP; |
| 32 | +static int proto_rx = IPPROTO_MPTCP; |
31 | 33 |
|
32 | 34 | #ifndef IPPROTO_MPTCP |
33 | 35 | #define IPPROTO_MPTCP 262 |
@@ -136,7 +138,7 @@ static void die_perror(const char *msg) |
136 | 138 |
|
137 | 139 | static void die_usage(int r) |
138 | 140 | { |
139 | | - fprintf(stderr, "Usage: mptcp_sockopt [-6]\n"); |
| 141 | + fprintf(stderr, "Usage: mptcp_sockopt [-6] [ -t tcp|mptcp ] [ -r tcp|mptcp]\n"); |
140 | 142 | exit(r); |
141 | 143 | } |
142 | 144 |
|
@@ -202,7 +204,7 @@ static int sock_listen_mptcp(const char * const listenaddr, |
202 | 204 | hints.ai_family = pf; |
203 | 205 |
|
204 | 206 | for (a = addr; a; a = a->ai_next) { |
205 | | - sock = socket(a->ai_family, a->ai_socktype, IPPROTO_MPTCP); |
| 207 | + sock = socket(a->ai_family, a->ai_socktype, proto_rx); |
206 | 208 | if (sock < 0) |
207 | 209 | continue; |
208 | 210 |
|
@@ -260,18 +262,35 @@ static int sock_connect_mptcp(const char * const remoteaddr, |
260 | 262 | return sock; |
261 | 263 | } |
262 | 264 |
|
| 265 | +static int protostr_to_num(const char *s) |
| 266 | +{ |
| 267 | + if (strcasecmp(s, "tcp") == 0) |
| 268 | + return IPPROTO_TCP; |
| 269 | + if (strcasecmp(s, "mptcp") == 0) |
| 270 | + return IPPROTO_MPTCP; |
| 271 | + |
| 272 | + die_usage(1); |
| 273 | + return 0; |
| 274 | +} |
| 275 | + |
263 | 276 | static void parse_opts(int argc, char **argv) |
264 | 277 | { |
265 | 278 | int c; |
266 | 279 |
|
267 | | - while ((c = getopt(argc, argv, "h6")) != -1) { |
| 280 | + while ((c = getopt(argc, argv, "h6t:r:")) != -1) { |
268 | 281 | switch (c) { |
269 | 282 | case 'h': |
270 | 283 | die_usage(0); |
271 | 284 | break; |
272 | 285 | case '6': |
273 | 286 | pf = AF_INET6; |
274 | 287 | break; |
| 288 | + case 't': |
| 289 | + proto_tx = protostr_to_num(optarg); |
| 290 | + break; |
| 291 | + case 'r': |
| 292 | + proto_rx = protostr_to_num(optarg); |
| 293 | + break; |
275 | 294 | default: |
276 | 295 | die_usage(1); |
277 | 296 | break; |
@@ -772,10 +791,10 @@ static int client(int pipefd) |
772 | 791 |
|
773 | 792 | switch (pf) { |
774 | 793 | case AF_INET: |
775 | | - fd = sock_connect_mptcp("127.0.0.1", "15432", IPPROTO_MPTCP); |
| 794 | + fd = sock_connect_mptcp("127.0.0.1", "15432", proto_tx); |
776 | 795 | break; |
777 | 796 | case AF_INET6: |
778 | | - fd = sock_connect_mptcp("::1", "15432", IPPROTO_MPTCP); |
| 797 | + fd = sock_connect_mptcp("::1", "15432", proto_tx); |
779 | 798 | break; |
780 | 799 | default: |
781 | 800 | xerror("Unknown pf %d\n", pf); |
|
0 commit comments