Skip to content

Commit b16ac92

Browse files
sowminivdavem330
authored andcommitted
selftests/net: add support for PF_RDS sockets
Add support for basic PF_RDS client-server testing in msg_zerocopy Signed-off-by: Sowmini Varadhan <[email protected]> Acked-by: Willem de Bruijn <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 0cebacc commit b16ac92

File tree

1 file changed

+64
-1
lines changed

1 file changed

+64
-1
lines changed

tools/testing/selftests/net/msg_zerocopy.c

Lines changed: 64 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@
1414
* - SOCK_DGRAM
1515
* - SOCK_RAW
1616
*
17+
* PF_RDS
18+
* - SOCK_SEQPACKET
19+
*
1720
* Start this program on two connected hosts, one in send mode and
1821
* the other with option '-r' to put it in receiver mode.
1922
*
@@ -53,6 +56,7 @@
5356
#include <sys/types.h>
5457
#include <sys/wait.h>
5558
#include <unistd.h>
59+
#include <linux/rds.h>
5660

5761
#ifndef SO_EE_ORIGIN_ZEROCOPY
5862
#define SO_EE_ORIGIN_ZEROCOPY 5
@@ -300,10 +304,15 @@ static int do_setup_tx(int domain, int type, int protocol)
300304
if (cfg_zerocopy)
301305
do_setsockopt(fd, SOL_SOCKET, SO_ZEROCOPY, 1);
302306

303-
if (domain != PF_PACKET)
307+
if (domain != PF_PACKET && domain != PF_RDS)
304308
if (connect(fd, (void *) &cfg_dst_addr, cfg_alen))
305309
error(1, errno, "connect");
306310

311+
if (domain == PF_RDS) {
312+
if (bind(fd, (void *) &cfg_src_addr, cfg_alen))
313+
error(1, errno, "bind");
314+
}
315+
307316
return fd;
308317
}
309318

@@ -444,6 +453,13 @@ static void do_tx(int domain, int type, int protocol)
444453
msg.msg_iovlen++;
445454
}
446455

456+
if (domain == PF_RDS) {
457+
msg.msg_name = &cfg_dst_addr;
458+
msg.msg_namelen = (cfg_dst_addr.ss_family == AF_INET ?
459+
sizeof(struct sockaddr_in) :
460+
sizeof(struct sockaddr_in6));
461+
}
462+
447463
iov[2].iov_base = payload;
448464
iov[2].iov_len = cfg_payload_len;
449465
msg.msg_iovlen++;
@@ -555,6 +571,40 @@ static void do_flush_datagram(int fd, int type)
555571
bytes += cfg_payload_len;
556572
}
557573

574+
575+
static void do_recvmsg(int fd)
576+
{
577+
int ret, off = 0;
578+
char *buf;
579+
struct iovec iov;
580+
struct msghdr msg;
581+
struct sockaddr_storage din;
582+
583+
buf = calloc(cfg_payload_len, sizeof(char));
584+
iov.iov_base = buf;
585+
iov.iov_len = cfg_payload_len;
586+
587+
memset(&msg, 0, sizeof(msg));
588+
msg.msg_name = &din;
589+
msg.msg_namelen = sizeof(din);
590+
msg.msg_iov = &iov;
591+
msg.msg_iovlen = 1;
592+
593+
ret = recvmsg(fd, &msg, MSG_TRUNC);
594+
595+
if (ret == -1)
596+
error(1, errno, "recv");
597+
if (ret != cfg_payload_len)
598+
error(1, 0, "recv: ret=%u != %u", ret, cfg_payload_len);
599+
600+
if (memcmp(buf + off, payload, ret))
601+
error(1, 0, "recv: data mismatch");
602+
603+
free(buf);
604+
packets++;
605+
bytes += cfg_payload_len;
606+
}
607+
558608
static void do_rx(int domain, int type, int protocol)
559609
{
560610
uint64_t tstop;
@@ -566,6 +616,8 @@ static void do_rx(int domain, int type, int protocol)
566616
do {
567617
if (type == SOCK_STREAM)
568618
do_flush_tcp(fd);
619+
else if (domain == PF_RDS)
620+
do_recvmsg(fd);
569621
else
570622
do_flush_datagram(fd, type);
571623

@@ -610,6 +662,7 @@ static void parse_opts(int argc, char **argv)
610662
40 /* max tcp options */;
611663
int c;
612664
char *daddr = NULL, *saddr = NULL;
665+
char *cfg_test;
613666

614667
cfg_payload_len = max_payload_len;
615668

@@ -667,6 +720,14 @@ static void parse_opts(int argc, char **argv)
667720
break;
668721
}
669722
}
723+
724+
cfg_test = argv[argc - 1];
725+
if (strcmp(cfg_test, "rds") == 0) {
726+
if (!daddr)
727+
error(1, 0, "-D <server addr> required for PF_RDS\n");
728+
if (!cfg_rx && !saddr)
729+
error(1, 0, "-S <client addr> required for PF_RDS\n");
730+
}
670731
setup_sockaddr(cfg_family, daddr, &cfg_dst_addr);
671732
setup_sockaddr(cfg_family, saddr, &cfg_src_addr);
672733

@@ -699,6 +760,8 @@ int main(int argc, char **argv)
699760
do_test(cfg_family, SOCK_STREAM, 0);
700761
else if (!strcmp(cfg_test, "udp"))
701762
do_test(cfg_family, SOCK_DGRAM, 0);
763+
else if (!strcmp(cfg_test, "rds"))
764+
do_test(PF_RDS, SOCK_SEQPACKET, 0);
702765
else
703766
error(1, 0, "unknown cfg_test %s", cfg_test);
704767

0 commit comments

Comments
 (0)