Skip to content

Commit bdde081

Browse files
kmaloordavem330
authored andcommitted
selftests: mptcp: create listeners to receive MPJs
This change updates the "pm_nl_ctl" testing sample with a "listen" option to bind a MPTCP listening socket to the provided addr+port. This option is exercised in testing subflow initiation scenarios in conjunction with userspace path managers where the MPTCP application does not hold an active listener to accept requests for new subflows. Acked-by: Paolo Abeni <[email protected]> Signed-off-by: Kishen Maloor <[email protected]> Signed-off-by: Mat Martineau <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent b3e5fd6 commit bdde081

File tree

1 file changed

+54
-0
lines changed

1 file changed

+54
-0
lines changed

tools/testing/selftests/net/mptcp/pm_nl_ctl.c

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@
2525
#ifndef MPTCP_PM_EVENTS
2626
#define MPTCP_PM_EVENTS "mptcp_pm_events"
2727
#endif
28+
#ifndef IPPROTO_MPTCP
29+
#define IPPROTO_MPTCP 262
30+
#endif
2831

2932
static void syntax(char *argv[])
3033
{
@@ -41,6 +44,7 @@ static void syntax(char *argv[])
4144
fprintf(stderr, "\tdump\n");
4245
fprintf(stderr, "\tlimits [<rcv addr max> <subflow max>]\n");
4346
fprintf(stderr, "\tevents\n");
47+
fprintf(stderr, "\tlisten <local-ip> <local-port>\n");
4448
exit(0);
4549
}
4650

@@ -1219,6 +1223,54 @@ int get_set_limits(int fd, int pm_family, int argc, char *argv[])
12191223
return 0;
12201224
}
12211225

1226+
int add_listener(int argc, char *argv[])
1227+
{
1228+
struct sockaddr_storage addr;
1229+
struct sockaddr_in6 *a6;
1230+
struct sockaddr_in *a4;
1231+
u_int16_t family;
1232+
int enable = 1;
1233+
int sock;
1234+
int err;
1235+
1236+
if (argc < 4)
1237+
syntax(argv);
1238+
1239+
memset(&addr, 0, sizeof(struct sockaddr_storage));
1240+
a4 = (struct sockaddr_in *)&addr;
1241+
a6 = (struct sockaddr_in6 *)&addr;
1242+
1243+
if (inet_pton(AF_INET, argv[2], &a4->sin_addr)) {
1244+
family = AF_INET;
1245+
a4->sin_family = family;
1246+
a4->sin_port = htons(atoi(argv[3]));
1247+
} else if (inet_pton(AF_INET6, argv[2], &a6->sin6_addr)) {
1248+
family = AF_INET6;
1249+
a6->sin6_family = family;
1250+
a6->sin6_port = htons(atoi(argv[3]));
1251+
} else
1252+
error(1, errno, "can't parse ip %s", argv[2]);
1253+
1254+
sock = socket(family, SOCK_STREAM, IPPROTO_MPTCP);
1255+
if (sock < 0)
1256+
error(1, errno, "can't create listener sock\n");
1257+
1258+
if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(enable))) {
1259+
close(sock);
1260+
error(1, errno, "can't set SO_REUSEADDR on listener sock\n");
1261+
}
1262+
1263+
err = bind(sock, (struct sockaddr *)&addr,
1264+
((family == AF_INET) ? sizeof(struct sockaddr_in) :
1265+
sizeof(struct sockaddr_in6)));
1266+
1267+
if (err == 0 && listen(sock, 30) == 0)
1268+
pause();
1269+
1270+
close(sock);
1271+
return 0;
1272+
}
1273+
12221274
int set_flags(int fd, int pm_family, int argc, char *argv[])
12231275
{
12241276
char data[NLMSG_ALIGN(sizeof(struct nlmsghdr)) +
@@ -1375,6 +1427,8 @@ int main(int argc, char *argv[])
13751427
return set_flags(fd, pm_family, argc, argv);
13761428
else if (!strcmp(argv[1], "events"))
13771429
return capture_events(fd, events_mcast_grp);
1430+
else if (!strcmp(argv[1], "listen"))
1431+
return add_listener(argc, argv);
13781432

13791433
fprintf(stderr, "unknown sub-command: %s", argv[1]);
13801434
syntax(argv);

0 commit comments

Comments
 (0)