Deleted Added
full compact
unix_seqpacket_test.c (262871) unix_seqpacket_test.c (263572)
1/*-
2 * Copyright (c) 2014 Spectra Logic Corporation. All rights reserved.
3 * Redistribution and use in source and binary forms, with or without
4 * modification, are permitted provided that the following conditions
5 * are met:
6 * 1. Redistributions of source code must retain the above copyright
7 * notice, this list of conditions and the following disclaimer.
8 * 2. Redistributions in binary form must reproduce the above copyright

--- 9 unchanged lines hidden (view full) ---

18 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
19 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
20 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
21 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
22 * SUCH DAMAGE.
23 */
24
25#include <sys/cdefs.h>
1/*-
2 * Copyright (c) 2014 Spectra Logic Corporation. All rights reserved.
3 * Redistribution and use in source and binary forms, with or without
4 * modification, are permitted provided that the following conditions
5 * are met:
6 * 1. Redistributions of source code must retain the above copyright
7 * notice, this list of conditions and the following disclaimer.
8 * 2. Redistributions in binary form must reproduce the above copyright

--- 9 unchanged lines hidden (view full) ---

18 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
19 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
20 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
21 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
22 * SUCH DAMAGE.
23 */
24
25#include <sys/cdefs.h>
26__FBSDID("$FreeBSD: stable/10/tests/sys/kern/unix_seqpacket_test.c 262871 2014-03-06 21:47:22Z asomers $");
26__FBSDID("$FreeBSD: stable/10/tests/sys/kern/unix_seqpacket_test.c 263572 2014-03-21 22:43:00Z asomers $");
27
28#include <errno.h>
29#include <fcntl.h>
30#include <pthread.h>
31#include <signal.h>
32#include <sys/socket.h>
33#include <sys/un.h>
34
35#include <stdio.h>
36
37#include <atf-c.h>
38
39/*
40 * Helper functions
41 */
42
43#define MIN(x, y) ((x) < (y) ? (x) : (y))
44#define MAX(x, y) ((x) > (y) ? (x) : (y))
45
27
28#include <errno.h>
29#include <fcntl.h>
30#include <pthread.h>
31#include <signal.h>
32#include <sys/socket.h>
33#include <sys/un.h>
34
35#include <stdio.h>
36
37#include <atf-c.h>
38
39/*
40 * Helper functions
41 */
42
43#define MIN(x, y) ((x) < (y) ? (x) : (y))
44#define MAX(x, y) ((x) > (y) ? (x) : (y))
45
46void
46static void
47do_socketpair(int *sv)
48{
49 int s;
50
51 s = socketpair(PF_LOCAL, SOCK_SEQPACKET, 0, sv);
52 ATF_REQUIRE_EQ(0, s);
53 ATF_REQUIRE(sv[0] >= 0);
54 ATF_REQUIRE(sv[1] >= 0);
55 ATF_REQUIRE(sv[0] != sv[1]);
56}
57
47do_socketpair(int *sv)
48{
49 int s;
50
51 s = socketpair(PF_LOCAL, SOCK_SEQPACKET, 0, sv);
52 ATF_REQUIRE_EQ(0, s);
53 ATF_REQUIRE(sv[0] >= 0);
54 ATF_REQUIRE(sv[1] >= 0);
55 ATF_REQUIRE(sv[0] != sv[1]);
56}
57
58void
58static void
59do_socketpair_nonblocking(int *sv)
60{
61 int s;
62
63 s = socketpair(PF_LOCAL, SOCK_SEQPACKET, 0, sv);
64 ATF_REQUIRE_EQ(0, s);
65 ATF_REQUIRE(sv[0] >= 0);
66 ATF_REQUIRE(sv[1] >= 0);
67 ATF_REQUIRE(sv[0] != sv[1]);
68 ATF_REQUIRE(-1 != fcntl(sv[0], F_SETFL, O_NONBLOCK));
69 ATF_REQUIRE(-1 != fcntl(sv[1], F_SETFL, O_NONBLOCK));
70}
71
72/*
73 * Returns a pair of sockets made the hard way: bind, listen, connect & accept
74 * @return const char* The path to the socket
75 */
59do_socketpair_nonblocking(int *sv)
60{
61 int s;
62
63 s = socketpair(PF_LOCAL, SOCK_SEQPACKET, 0, sv);
64 ATF_REQUIRE_EQ(0, s);
65 ATF_REQUIRE(sv[0] >= 0);
66 ATF_REQUIRE(sv[1] >= 0);
67 ATF_REQUIRE(sv[0] != sv[1]);
68 ATF_REQUIRE(-1 != fcntl(sv[0], F_SETFL, O_NONBLOCK));
69 ATF_REQUIRE(-1 != fcntl(sv[1], F_SETFL, O_NONBLOCK));
70}
71
72/*
73 * Returns a pair of sockets made the hard way: bind, listen, connect & accept
74 * @return const char* The path to the socket
75 */
76const char*
76static const char*
77mk_pair_of_sockets(int *sv)
78{
79 struct sockaddr_un sun;
80 /* ATF's isolation mechanisms will guarantee uniqueness of this file */
81 const char *path = "sock";
82 int s, err, s2, s1;
83
84 s = socket(PF_LOCAL, SOCK_SEQPACKET, 0);

--- 26 unchanged lines hidden (view full) ---

111
112 sv[0] = s1;
113 sv[1] = s2;
114 return (path);
115}
116
117static volatile sig_atomic_t got_sigpipe = 0;
118static void
77mk_pair_of_sockets(int *sv)
78{
79 struct sockaddr_un sun;
80 /* ATF's isolation mechanisms will guarantee uniqueness of this file */
81 const char *path = "sock";
82 int s, err, s2, s1;
83
84 s = socket(PF_LOCAL, SOCK_SEQPACKET, 0);

--- 26 unchanged lines hidden (view full) ---

111
112 sv[0] = s1;
113 sv[1] = s2;
114 return (path);
115}
116
117static volatile sig_atomic_t got_sigpipe = 0;
118static void
119shutdown_send_sigpipe_handler(int x)
119shutdown_send_sigpipe_handler(int __unused x)
120{
121 got_sigpipe = 1;
122}
123
124/*
125 * Parameterized test function bodies
126 */
120{
121 got_sigpipe = 1;
122}
123
124/*
125 * Parameterized test function bodies
126 */
127void
127static void
128test_eagain(size_t sndbufsize, size_t rcvbufsize)
129{
130 int i;
131 int sv[2];
132 const size_t totalsize = (sndbufsize + rcvbufsize) * 2;
133 const size_t pktsize = MIN(sndbufsize, rcvbufsize) / 4;
128test_eagain(size_t sndbufsize, size_t rcvbufsize)
129{
130 int i;
131 int sv[2];
132 const size_t totalsize = (sndbufsize + rcvbufsize) * 2;
133 const size_t pktsize = MIN(sndbufsize, rcvbufsize) / 4;
134 const int numpkts = totalsize / pktsize;
134 char sndbuf[pktsize];
135 char sndbuf[pktsize];
135 char recv_buf[pktsize];
136 ssize_t ssize, rsize;
136 ssize_t ssize;
137
138 /* setup the socket pair */
139 do_socketpair_nonblocking(sv);
140 /* Setup the buffers */
141 ATF_REQUIRE_EQ(0, setsockopt(sv[0], SOL_SOCKET, SO_SNDBUF, &sndbufsize,
142 sizeof(sndbufsize)));
143 ATF_REQUIRE_EQ(0, setsockopt(sv[1], SOL_SOCKET, SO_RCVBUF, &rcvbufsize,
144 sizeof(rcvbufsize)));
145
146 bzero(sndbuf, pktsize);
147 /* Send data until we get EAGAIN */
137
138 /* setup the socket pair */
139 do_socketpair_nonblocking(sv);
140 /* Setup the buffers */
141 ATF_REQUIRE_EQ(0, setsockopt(sv[0], SOL_SOCKET, SO_SNDBUF, &sndbufsize,
142 sizeof(sndbufsize)));
143 ATF_REQUIRE_EQ(0, setsockopt(sv[1], SOL_SOCKET, SO_RCVBUF, &rcvbufsize,
144 sizeof(rcvbufsize)));
145
146 bzero(sndbuf, pktsize);
147 /* Send data until we get EAGAIN */
148 for(i=0; i < totalsize / pktsize; i++) {
148 for(i=0; i < numpkts; i++) {
149 ssize = send(sv[0], sndbuf, pktsize, MSG_EOR);
150 if (ssize == -1) {
151 if (errno == EAGAIN)
152 atf_tc_pass();
153 else {
154 perror("send");
155 atf_tc_fail("send returned < 0 but not EAGAIN");
156 }
157 }
158 }
159 atf_tc_fail("Never got EAGAIN");
160}
161
149 ssize = send(sv[0], sndbuf, pktsize, MSG_EOR);
150 if (ssize == -1) {
151 if (errno == EAGAIN)
152 atf_tc_pass();
153 else {
154 perror("send");
155 atf_tc_fail("send returned < 0 but not EAGAIN");
156 }
157 }
158 }
159 atf_tc_fail("Never got EAGAIN");
160}
161
162void
162static void
163test_sendrecv_symmetric_buffers(size_t bufsize, int blocking) {
164 int s;
165 int sv[2];
163test_sendrecv_symmetric_buffers(size_t bufsize, int blocking) {
164 int s;
165 int sv[2];
166 const size_t pktsize = bufsize / 2;
166 const ssize_t pktsize = bufsize / 2;
167 char sndbuf[pktsize];
168 char recv_buf[pktsize];
169 ssize_t ssize, rsize;
170
171 /* setup the socket pair */
172 if (blocking)
173 do_socketpair(sv);
174 else

--- 21 unchanged lines hidden (view full) ---

196 if (rsize < 0) {
197 perror("recv");
198 atf_tc_fail("recv returned < 0");
199 }
200 ATF_CHECK_EQ_MSG(pktsize, rsize, "expected %zd=send(...) but got %zd",
201 pktsize, rsize);
202}
203
167 char sndbuf[pktsize];
168 char recv_buf[pktsize];
169 ssize_t ssize, rsize;
170
171 /* setup the socket pair */
172 if (blocking)
173 do_socketpair(sv);
174 else

--- 21 unchanged lines hidden (view full) ---

196 if (rsize < 0) {
197 perror("recv");
198 atf_tc_fail("recv returned < 0");
199 }
200 ATF_CHECK_EQ_MSG(pktsize, rsize, "expected %zd=send(...) but got %zd",
201 pktsize, rsize);
202}
203
204void
204static void
205test_pipe_simulator(size_t sndbufsize, size_t rcvbufsize)
206{
205test_pipe_simulator(size_t sndbufsize, size_t rcvbufsize)
206{
207 int s, num_sent, num_received;
207 int num_sent, num_received;
208 int sv[2];
208 int sv[2];
209 const size_t pktsize = MIN(sndbufsize, rcvbufsize) / 4;
209 const ssize_t pktsize = MIN(sndbufsize, rcvbufsize) / 4;
210 int numpkts;
211 char sndbuf[pktsize];
212 char rcvbuf[pktsize];
213 char comparebuf[pktsize];
214 ssize_t ssize, rsize;
215 bool currently_sending = true;
216
217 /* setup the socket pair */

--- 108 unchanged lines hidden (view full) ---

326 d = memcmp(comparebuf, rcvbuf, td->pktsize);
327 ATF_CHECK_EQ_MSG(0, d,
328 "Received data miscompare on packet %d", i);
329 }
330 return (0);
331}
332
333
210 int numpkts;
211 char sndbuf[pktsize];
212 char rcvbuf[pktsize];
213 char comparebuf[pktsize];
214 ssize_t ssize, rsize;
215 bool currently_sending = true;
216
217 /* setup the socket pair */

--- 108 unchanged lines hidden (view full) ---

326 d = memcmp(comparebuf, rcvbuf, td->pktsize);
327 ATF_CHECK_EQ_MSG(0, d,
328 "Received data miscompare on packet %d", i);
329 }
330 return (0);
331}
332
333
334void
334static void
335test_pipe(size_t sndbufsize, size_t rcvbufsize)
336{
337 test_pipe_thread_data_t writer_data, reader_data;
338 pthread_t writer, reader;
335test_pipe(size_t sndbufsize, size_t rcvbufsize)
336{
337 test_pipe_thread_data_t writer_data, reader_data;
338 pthread_t writer, reader;
339 int num_sent, num_received;
340 int sv[2];
341 const size_t pktsize = MIN(sndbufsize, rcvbufsize) / 4;
342 int numpkts;
343
344 /* setup the socket pair */
345 do_socketpair(sv);
346 /* Setup the buffers */
347 ATF_REQUIRE_EQ(0, setsockopt(sv[0], SOL_SOCKET, SO_SNDBUF, &sndbufsize,

--- 252 unchanged lines hidden (view full) ---

600 ls, lr, rs, rr);
601}
602
603
604/* send(2) and recv(2) a single short record */
605ATF_TC_WITHOUT_HEAD(send_recv);
606ATF_TC_BODY(send_recv, tc)
607{
339 int sv[2];
340 const size_t pktsize = MIN(sndbufsize, rcvbufsize) / 4;
341 int numpkts;
342
343 /* setup the socket pair */
344 do_socketpair(sv);
345 /* Setup the buffers */
346 ATF_REQUIRE_EQ(0, setsockopt(sv[0], SOL_SOCKET, SO_SNDBUF, &sndbufsize,

--- 252 unchanged lines hidden (view full) ---

599 ls, lr, rs, rr);
600}
601
602
603/* send(2) and recv(2) a single short record */
604ATF_TC_WITHOUT_HEAD(send_recv);
605ATF_TC_BODY(send_recv, tc)
606{
608 int s;
609 int sv[2];
610 const int bufsize = 64;
611 const char *data = "data";
612 char recv_buf[bufsize];
607 int sv[2];
608 const int bufsize = 64;
609 const char *data = "data";
610 char recv_buf[bufsize];
613 size_t datalen;
611 ssize_t datalen;
614 ssize_t ssize, rsize;
615
616 /* setup the socket pair */
617 do_socketpair(sv);
618
619 /* send and receive a small packet */
620 datalen = strlen(data) + 1; /* +1 for the null */
621 ssize = send(sv[0], data, datalen, MSG_EOR);

--- 15 unchanged lines hidden (view full) ---

637 * According to the same spec, not all protocols are required to provide the
638 * source addres in recvfrom(2).
639 */
640ATF_TC_WITHOUT_HEAD(sendto_recvfrom);
641ATF_TC_BODY(sendto_recvfrom, tc)
642{
643 const char* path;
644 struct sockaddr_storage from;
612 ssize_t ssize, rsize;
613
614 /* setup the socket pair */
615 do_socketpair(sv);
616
617 /* send and receive a small packet */
618 datalen = strlen(data) + 1; /* +1 for the null */
619 ssize = send(sv[0], data, datalen, MSG_EOR);

--- 15 unchanged lines hidden (view full) ---

635 * According to the same spec, not all protocols are required to provide the
636 * source addres in recvfrom(2).
637 */
638ATF_TC_WITHOUT_HEAD(sendto_recvfrom);
639ATF_TC_BODY(sendto_recvfrom, tc)
640{
641 const char* path;
642 struct sockaddr_storage from;
645 int s;
646 int sv[2];
647 const int bufsize = 64;
648 const char *data = "data";
649 char recv_buf[bufsize];
643 int sv[2];
644 const int bufsize = 64;
645 const char *data = "data";
646 char recv_buf[bufsize];
650 size_t datalen;
647 ssize_t datalen;
651 ssize_t ssize, rsize;
652 socklen_t fromlen;
653
654 /* setup the socket pair */
655 path = mk_pair_of_sockets(sv);
656
657 /* send and receive a small packet */
658 datalen = strlen(data) + 1; /* +1 for the null */

--- 26 unchanged lines hidden (view full) ---

685
686/*
687 * send(2) and recv(2) a single short record with sockets created the
688 * traditional way, involving bind, listen, connect, and accept
689 */
690ATF_TC_WITHOUT_HEAD(send_recv_with_connect);
691ATF_TC_BODY(send_recv_with_connect, tc)
692{
648 ssize_t ssize, rsize;
649 socklen_t fromlen;
650
651 /* setup the socket pair */
652 path = mk_pair_of_sockets(sv);
653
654 /* send and receive a small packet */
655 datalen = strlen(data) + 1; /* +1 for the null */

--- 26 unchanged lines hidden (view full) ---

682
683/*
684 * send(2) and recv(2) a single short record with sockets created the
685 * traditional way, involving bind, listen, connect, and accept
686 */
687ATF_TC_WITHOUT_HEAD(send_recv_with_connect);
688ATF_TC_BODY(send_recv_with_connect, tc)
689{
693 const char* path;
694 int sv[2];
695 const int bufsize = 64;
696 const char *data = "data";
697 char recv_buf[bufsize];
690 int sv[2];
691 const int bufsize = 64;
692 const char *data = "data";
693 char recv_buf[bufsize];
698 size_t datalen;
694 ssize_t datalen;
699 ssize_t ssize, rsize;
700
701 mk_pair_of_sockets(sv);
702
703 /* send and receive a small packet */
704 datalen = strlen(data) + 1; /* +1 for the null */
705 ssize = send(sv[0], data, datalen, MSG_EOR);
706 if (ssize < 0) {

--- 39 unchanged lines hidden (view full) ---

746 ssize = send(s, data, sizeof(data), MSG_EOR);
747 ATF_CHECK_EQ(1, got_sigpipe);
748}
749
750/* nonblocking send(2) and recv(2) a single short record */
751ATF_TC_WITHOUT_HEAD(send_recv_nonblocking);
752ATF_TC_BODY(send_recv_nonblocking, tc)
753{
695 ssize_t ssize, rsize;
696
697 mk_pair_of_sockets(sv);
698
699 /* send and receive a small packet */
700 datalen = strlen(data) + 1; /* +1 for the null */
701 ssize = send(sv[0], data, datalen, MSG_EOR);
702 if (ssize < 0) {

--- 39 unchanged lines hidden (view full) ---

742 ssize = send(s, data, sizeof(data), MSG_EOR);
743 ATF_CHECK_EQ(1, got_sigpipe);
744}
745
746/* nonblocking send(2) and recv(2) a single short record */
747ATF_TC_WITHOUT_HEAD(send_recv_nonblocking);
748ATF_TC_BODY(send_recv_nonblocking, tc)
749{
754 int s;
755 int sv[2];
756 const int bufsize = 64;
757 const char *data = "data";
758 char recv_buf[bufsize];
750 int sv[2];
751 const int bufsize = 64;
752 const char *data = "data";
753 char recv_buf[bufsize];
759 size_t datalen;
754 ssize_t datalen;
760 ssize_t ssize, rsize;
761
762 /* setup the socket pair */
763 do_socketpair_nonblocking(sv);
764
765 /* Verify that there is nothing to receive */
766 rsize = recv(sv[1], recv_buf, bufsize, MSG_WAITALL);
767 ATF_CHECK_EQ(EAGAIN, errno);

--- 15 unchanged lines hidden (view full) ---

783
784/*
785 * We should get EMSGSIZE if we try to send a message larger than the socket
786 * buffer, with blocking sockets
787 */
788ATF_TC_WITHOUT_HEAD(emsgsize);
789ATF_TC_BODY(emsgsize, tc)
790{
755 ssize_t ssize, rsize;
756
757 /* setup the socket pair */
758 do_socketpair_nonblocking(sv);
759
760 /* Verify that there is nothing to receive */
761 rsize = recv(sv[1], recv_buf, bufsize, MSG_WAITALL);
762 ATF_CHECK_EQ(EAGAIN, errno);

--- 15 unchanged lines hidden (view full) ---

778
779/*
780 * We should get EMSGSIZE if we try to send a message larger than the socket
781 * buffer, with blocking sockets
782 */
783ATF_TC_WITHOUT_HEAD(emsgsize);
784ATF_TC_BODY(emsgsize, tc)
785{
791 int s;
792 int sv[2];
793 const size_t sndbufsize = 8192;
794 const size_t rcvbufsize = 8192;
795 const size_t pktsize = (sndbufsize + rcvbufsize) * 2;
796 char sndbuf[pktsize];
786 int sv[2];
787 const size_t sndbufsize = 8192;
788 const size_t rcvbufsize = 8192;
789 const size_t pktsize = (sndbufsize + rcvbufsize) * 2;
790 char sndbuf[pktsize];
797 char recv_buf[pktsize];
798 ssize_t ssize, rsize;
791 ssize_t ssize;
799
800 /* setup the socket pair */
801 do_socketpair(sv);
802 /* Setup the buffers */
803 ATF_REQUIRE_EQ(0, setsockopt(sv[0], SOL_SOCKET, SO_SNDBUF, &sndbufsize,
804 sizeof(sndbufsize)));
805 ATF_REQUIRE_EQ(0, setsockopt(sv[1], SOL_SOCKET, SO_RCVBUF, &rcvbufsize,
806 sizeof(rcvbufsize)));

--- 5 unchanged lines hidden (view full) ---

812
813/*
814 * We should get EMSGSIZE if we try to send a message larger than the socket
815 * buffer, with nonblocking sockets
816 */
817ATF_TC_WITHOUT_HEAD(emsgsize_nonblocking);
818ATF_TC_BODY(emsgsize_nonblocking, tc)
819{
792
793 /* setup the socket pair */
794 do_socketpair(sv);
795 /* Setup the buffers */
796 ATF_REQUIRE_EQ(0, setsockopt(sv[0], SOL_SOCKET, SO_SNDBUF, &sndbufsize,
797 sizeof(sndbufsize)));
798 ATF_REQUIRE_EQ(0, setsockopt(sv[1], SOL_SOCKET, SO_RCVBUF, &rcvbufsize,
799 sizeof(rcvbufsize)));

--- 5 unchanged lines hidden (view full) ---

805
806/*
807 * We should get EMSGSIZE if we try to send a message larger than the socket
808 * buffer, with nonblocking sockets
809 */
810ATF_TC_WITHOUT_HEAD(emsgsize_nonblocking);
811ATF_TC_BODY(emsgsize_nonblocking, tc)
812{
820 int s;
821 int sv[2];
822 const size_t sndbufsize = 8192;
823 const size_t rcvbufsize = 8192;
824 const size_t pktsize = (sndbufsize + rcvbufsize) * 2;
825 char sndbuf[pktsize];
813 int sv[2];
814 const size_t sndbufsize = 8192;
815 const size_t rcvbufsize = 8192;
816 const size_t pktsize = (sndbufsize + rcvbufsize) * 2;
817 char sndbuf[pktsize];
826 char recv_buf[pktsize];
827 ssize_t ssize, rsize;
818 ssize_t ssize;
828
829 /* setup the socket pair */
830 do_socketpair_nonblocking(sv);
831 /* Setup the buffers */
832 ATF_REQUIRE_EQ(0, setsockopt(sv[0], SOL_SOCKET, SO_SNDBUF, &sndbufsize,
833 sizeof(sndbufsize)));
834 ATF_REQUIRE_EQ(0, setsockopt(sv[1], SOL_SOCKET, SO_RCVBUF, &rcvbufsize,
835 sizeof(rcvbufsize)));

--- 36 unchanged lines hidden (view full) ---

872
873/*
874 * nonblocking send(2) and recv(2) of several records, which should collectively
875 * fill up the send buffer but not the receive buffer
876 */
877ATF_TC_WITHOUT_HEAD(rcvbuf_oversized);
878ATF_TC_BODY(rcvbuf_oversized, tc)
879{
819
820 /* setup the socket pair */
821 do_socketpair_nonblocking(sv);
822 /* Setup the buffers */
823 ATF_REQUIRE_EQ(0, setsockopt(sv[0], SOL_SOCKET, SO_SNDBUF, &sndbufsize,
824 sizeof(sndbufsize)));
825 ATF_REQUIRE_EQ(0, setsockopt(sv[1], SOL_SOCKET, SO_RCVBUF, &rcvbufsize,
826 sizeof(rcvbufsize)));

--- 36 unchanged lines hidden (view full) ---

863
864/*
865 * nonblocking send(2) and recv(2) of several records, which should collectively
866 * fill up the send buffer but not the receive buffer
867 */
868ATF_TC_WITHOUT_HEAD(rcvbuf_oversized);
869ATF_TC_BODY(rcvbuf_oversized, tc)
870{
880 int s, i, j;
871 int i;
881 int sv[2];
872 int sv[2];
873 const int pktsize = 1024;
882 const size_t sndbufsize = 8192;
883 const size_t rcvbufsize = 131072;
874 const size_t sndbufsize = 8192;
875 const size_t rcvbufsize = 131072;
884 const size_t geom_mean_bufsize = 32768;
885 const int pktsize = 1024;
876 const size_t geometric_mean_bufsize = 32768;
877 const int numpkts = geometric_mean_bufsize / pktsize;
886 char sndbuf[pktsize];
887 char recv_buf[pktsize];
878 char sndbuf[pktsize];
879 char recv_buf[pktsize];
888 size_t datalen;
889 ssize_t ssize, rsize;
890
891 /* setup the socket pair */
892 do_socketpair_nonblocking(sv);
880 ssize_t ssize, rsize;
881
882 /* setup the socket pair */
883 do_socketpair_nonblocking(sv);
884 ATF_REQUIRE_EQ(0, setsockopt(sv[0], SOL_SOCKET, SO_SNDBUF, &sndbufsize,
885 sizeof(sndbufsize)));
886 ATF_REQUIRE_EQ(0, setsockopt(sv[1], SOL_SOCKET, SO_RCVBUF, &rcvbufsize,
887 sizeof(rcvbufsize)));
893
894 /*
895 * Send and receive packets that are collectively greater than the send
896 * buffer, but less than the receive buffer
897 */
888
889 /*
890 * Send and receive packets that are collectively greater than the send
891 * buffer, but less than the receive buffer
892 */
898 for (i=0; i < geom_mean_bufsize / pktsize; i++) {
893 for (i=0; i < numpkts; i++) {
899 /* Fill the buffer */
900 memset(sndbuf, i, pktsize);
901
902 /* send the packet */
903 ssize = send(sv[0], sndbuf, pktsize, MSG_EOR);
904 if (ssize < 0) {
905 perror("send");
906 atf_tc_fail("send returned < 0");

--- 211 unchanged lines hidden ---
894 /* Fill the buffer */
895 memset(sndbuf, i, pktsize);
896
897 /* send the packet */
898 ssize = send(sv[0], sndbuf, pktsize, MSG_EOR);
899 if (ssize < 0) {
900 perror("send");
901 atf_tc_fail("send returned < 0");

--- 211 unchanged lines hidden ---