Path: blob/main/tests/sys/netinet/tcp_md5_getsockopt.c
39483 views
/*-1* SPDX-License-Identifier: BSD-2-Clause2*3* Copyright (c) 2022, Klara Inc.4* Copyright (c) 2022, Claudio Jeker <[email protected]>5*6* Redistribution and use in source and binary forms, with or without7* modification, are permitted provided that the following conditions are8* met:9* 1. Redistributions of source code must retain the above copyright10* notice, this list of conditions and the following disclaimer.11* 2. Redistributions in binary form must reproduce the above copyright12* notice, this list of conditions and the following disclaimer in13* the documentation and/or other materials provided with the14* distribution.15*16* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND17* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE18* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE19* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE20* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL21* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS22* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)23* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT24* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY25* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF26* SUCH DAMAGE.27*/2829#include <sys/param.h>30#include <sys/linker.h>31#include <sys/socket.h>3233#include <netinet/in.h>34#include <netinet/tcp.h>3536#include <fcntl.h>37#include <unistd.h>38#include <err.h>3940#include <atf-c.h>4142void test_tcp_md5_getsockopt(int);4344void45test_tcp_md5_getsockopt(int v6)46{47struct sockaddr_in *s;48struct sockaddr_in6 s6 = { 0 };49struct sockaddr_in s4 = { 0 };50socklen_t len;51int csock, ssock, opt;52int pf;5354if (v6) {55pf = PF_INET6;56len = sizeof(s6);5758s6.sin6_family = pf;59s6.sin6_len = sizeof(s6);60s6.sin6_addr = in6addr_loopback;61s6.sin6_port = 0;6263s = (struct sockaddr_in *)&s6;64} else {65pf = PF_INET;66len = sizeof(s4);6768s4.sin_family = pf;69s4.sin_len = sizeof(s4);70s4.sin_addr.s_addr = htonl(INADDR_LOOPBACK);71s4.sin_port = 0;7273s = &s4;74}7576if ((ssock = socket(pf, SOCK_STREAM, 0)) == -1)77atf_tc_fail("creating server socket");7879fcntl(ssock, F_SETFL, O_NONBLOCK);8081if ((bind(ssock, (struct sockaddr *)s, len) == -1))82atf_tc_fail("binding to localhost");8384getsockname(ssock, (struct sockaddr *)s, &len);8586listen(ssock, 1);8788if ((csock = socket(pf, SOCK_STREAM, 0)) == -1)89atf_tc_fail("creating client socket");9091if (connect(csock, (struct sockaddr *)s, len) == -1)92atf_tc_fail("connecting to server instance");9394if (getsockopt(csock, IPPROTO_TCP, TCP_MD5SIG, &opt, &len) == -1)95atf_tc_fail("getsockopt");9697close(csock);98close(ssock);99100atf_tc_pass();101}102103ATF_TC(tcp_md5_getsockopt_v4);104ATF_TC_HEAD(tcp_md5_getsockopt_v4, tc)105{106atf_tc_set_md_var(tc, "descr", "Test getsockopt for TCP MD5 SIG (IPv4)");107atf_tc_set_md_var(tc, "require.kmods", "tcpmd5");108}109110ATF_TC_BODY(tcp_md5_getsockopt_v4, tc)111{112test_tcp_md5_getsockopt(0);113}114115ATF_TC(tcp_md5_getsockopt_v6);116ATF_TC_HEAD(tcp_md5_getsockopt_v6, tc)117{118atf_tc_set_md_var(tc, "descr", "Test getsockopt for TCP MD5 SIG (IPv6)");119atf_tc_set_md_var(tc, "require.kmods", "tcpmd5");120}121122ATF_TC_BODY(tcp_md5_getsockopt_v6, tc)123{124test_tcp_md5_getsockopt(1);125}126127ATF_TP_ADD_TCS(tp)128{129ATF_TP_ADD_TC(tp, tcp_md5_getsockopt_v4);130ATF_TP_ADD_TC(tp, tcp_md5_getsockopt_v6);131132return atf_no_error();133}134135136