Skip to content

Commit ece1278

Browse files
vvfedorenkodavem330
authored andcommitted
selftests: net: add ESP-in-UDP PMTU test
The case of ESP in UDP encapsulation was not covered before. Add cases of local changes of MTU and difference on routed path. Signed-off-by: Vadim Fedorenko <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 9bfce73 commit ece1278

File tree

2 files changed

+260
-7
lines changed

2 files changed

+260
-7
lines changed

tools/testing/selftests/net/nettest.c

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,11 @@
1111
#include <sys/socket.h>
1212
#include <sys/wait.h>
1313
#include <linux/tcp.h>
14+
#include <linux/udp.h>
1415
#include <arpa/inet.h>
1516
#include <net/if.h>
1617
#include <netinet/in.h>
18+
#include <netinet/ip.h>
1719
#include <netdb.h>
1820
#include <fcntl.h>
1921
#include <libgen.h>
@@ -27,6 +29,10 @@
2729
#include <time.h>
2830
#include <errno.h>
2931

32+
#include <linux/xfrm.h>
33+
#include <linux/ipsec.h>
34+
#include <linux/pfkeyv2.h>
35+
3036
#ifndef IPV6_UNICAST_IF
3137
#define IPV6_UNICAST_IF 76
3238
#endif
@@ -114,6 +120,9 @@ struct sock_args {
114120
struct in_addr in;
115121
struct in6_addr in6;
116122
} expected_raddr;
123+
124+
/* ESP in UDP encap test */
125+
int use_xfrm;
117126
};
118127

119128
static int server_mode;
@@ -1346,6 +1355,41 @@ static int bind_socket(int sd, struct sock_args *args)
13461355
return 0;
13471356
}
13481357

1358+
static int config_xfrm_policy(int sd, struct sock_args *args)
1359+
{
1360+
struct xfrm_userpolicy_info policy = {};
1361+
int type = UDP_ENCAP_ESPINUDP;
1362+
int xfrm_af = IP_XFRM_POLICY;
1363+
int level = SOL_IP;
1364+
1365+
if (args->type != SOCK_DGRAM) {
1366+
log_error("Invalid socket type. Only DGRAM could be used for XFRM\n");
1367+
return 1;
1368+
}
1369+
1370+
policy.action = XFRM_POLICY_ALLOW;
1371+
policy.sel.family = args->version;
1372+
if (args->version == AF_INET6) {
1373+
xfrm_af = IPV6_XFRM_POLICY;
1374+
level = SOL_IPV6;
1375+
}
1376+
1377+
policy.dir = XFRM_POLICY_OUT;
1378+
if (setsockopt(sd, level, xfrm_af, &policy, sizeof(policy)) < 0)
1379+
return 1;
1380+
1381+
policy.dir = XFRM_POLICY_IN;
1382+
if (setsockopt(sd, level, xfrm_af, &policy, sizeof(policy)) < 0)
1383+
return 1;
1384+
1385+
if (setsockopt(sd, IPPROTO_UDP, UDP_ENCAP, &type, sizeof(type)) < 0) {
1386+
log_err_errno("Failed to set xfrm encap");
1387+
return 1;
1388+
}
1389+
1390+
return 0;
1391+
}
1392+
13491393
static int lsock_init(struct sock_args *args)
13501394
{
13511395
long flags;
@@ -1389,6 +1433,11 @@ static int lsock_init(struct sock_args *args)
13891433
if (fcntl(sd, F_SETFD, FD_CLOEXEC) < 0)
13901434
log_err_errno("Failed to set close-on-exec flag");
13911435

1436+
if (args->use_xfrm && config_xfrm_policy(sd, args)) {
1437+
log_err_errno("Failed to set xfrm policy");
1438+
goto err;
1439+
}
1440+
13921441
out:
13931442
return sd;
13941443

@@ -1772,7 +1821,7 @@ static int ipc_parent(int cpid, int fd, struct sock_args *args)
17721821
return client_status;
17731822
}
17741823

1775-
#define GETOPT_STR "sr:l:c:p:t:g:P:DRn:M:X:m:d:I:BN:O:SCi6L:0:1:2:3:Fbq"
1824+
#define GETOPT_STR "sr:l:c:p:t:g:P:DRn:M:X:m:d:I:BN:O:SCi6xL:0:1:2:3:Fbq"
17761825

17771826
static void print_usage(char *prog)
17781827
{
@@ -1795,6 +1844,7 @@ static void print_usage(char *prog)
17951844
" -D|R datagram (D) / raw (R) socket (default stream)\n"
17961845
" -l addr local address to bind to in server mode\n"
17971846
" -c addr local address to bind to in client mode\n"
1847+
" -x configure XFRM policy on socket\n"
17981848
"\n"
17991849
" -d dev bind socket to given device name\n"
18001850
" -I dev bind socket to given device name - server mode\n"
@@ -1966,6 +2016,9 @@ int main(int argc, char *argv[])
19662016
case 'q':
19672017
quiet = 1;
19682018
break;
2019+
case 'x':
2020+
args.use_xfrm = 1;
2021+
break;
19692022
default:
19702023
print_usage(argv[0]);
19712024
return 1;

0 commit comments

Comments
 (0)