Path: blob/main/tests/sys/net/if_ovpn/if_ovpn_c.c
108736 views
//#include <sys/param.h>1#include <stdio.h>23#include <net/if.h>4#include <netinet/in.h>5#include <sys/param.h>6#include <sys/errno.h>7#include <sys/linker.h>8#include <sys/ioctl.h>9#include <sys/nv.h>10#include <sys/socket.h>11#include <sys/sockio.h>1213#include <atf-c.h>1415#define OVPN_NEW_PEER _IO ('D', 1)1617static nvlist_t *18fake_sockaddr(void)19{20uint32_t addr = htonl(INADDR_LOOPBACK);21nvlist_t *nvl;2223nvl = nvlist_create(0);2425nvlist_add_number(nvl, "af", AF_INET);26nvlist_add_binary(nvl, "address", &addr, 4);27nvlist_add_number(nvl, "port", 1024);2829return (nvl);30}3132static char ovpn_ifname[IFNAMSIZ];33static int ovpn_fd;3435static int36create_interface(int fd)37{38int ret;39struct ifreq ifr;4041bzero(&ifr, sizeof(ifr));4243/* Create ovpnx first, then rename it. */44snprintf(ifr.ifr_name, IFNAMSIZ, "ovpn");45ret = ioctl(fd, SIOCIFCREATE2, &ifr);46if (ret)47return (ret);4849snprintf(ovpn_ifname, IFNAMSIZ, "%s", ifr.ifr_name);50printf("Created %s\n", ovpn_ifname);5152return (0);53}5455static void56destroy_interface(int fd)57{58int ret;59struct ifreq ifr;6061if (ovpn_ifname[0] == 0)62return;6364printf("Destroy %s\n", ovpn_ifname);6566bzero(&ifr, sizeof(ifr));67snprintf(ifr.ifr_name, IFNAMSIZ, "%s", ovpn_ifname);6869ret = ioctl(fd, SIOCIFDESTROY, &ifr);70if (ret)71atf_tc_fail("Failed to destroy interface");7273ovpn_ifname[0] = 0;74}7576ATF_TC_WITH_CLEANUP(tcp);77ATF_TC_HEAD(tcp, tc)78{79atf_tc_set_md_var(tc, "require.user", "root");80atf_tc_set_md_var(tc, "require.kmods", "if_ovpn");81}8283ATF_TC_BODY(tcp, tc)84{85struct ifdrv drv;86struct sockaddr_in sock_in;87int ret;88nvlist_t *nvl;8990ovpn_fd = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0);9192/* Kick off a connect so there's a local address set, which we need for93* ovpn_new_peer() to get to the critical point. */94bzero(&sock_in, sizeof(sock_in));95sock_in.sin_family = AF_INET;96sock_in.sin_addr.s_addr = htonl(INADDR_LOOPBACK);97sock_in.sin_port = htons(1024);98connect(ovpn_fd, (struct sockaddr *)&sock_in, sizeof(sock_in));99100ret = create_interface(ovpn_fd);101if (ret)102atf_tc_fail("Failed to create interface");103104nvl = nvlist_create(0);105106nvlist_add_number(nvl, "peerid", 0);107nvlist_add_number(nvl, "fd", ovpn_fd);108nvlist_add_nvlist(nvl, "remote", fake_sockaddr());109110bzero(&drv, sizeof(drv));111snprintf(drv.ifd_name, IFNAMSIZ, "%s", ovpn_ifname);112drv.ifd_cmd = OVPN_NEW_PEER;113drv.ifd_data = nvlist_pack(nvl, &drv.ifd_len);114115ret = ioctl(ovpn_fd, SIOCSDRVSPEC, &drv);116ATF_CHECK_EQ(ret, -1);117ATF_CHECK_EQ(errno, EPROTOTYPE);118}119120ATF_TC_CLEANUP(tcp, tc)121{122destroy_interface(ovpn_fd);123close(ovpn_fd);124}125126ATF_TP_ADD_TCS(tp)127{128ATF_TP_ADD_TC(tp, tcp);129130return (atf_no_error());131}132133134