1*cdebaff8SEnji Cooper /* $NetBSD: t_compat.c,v 1.4 2016/11/12 15:12:59 kre Exp $ */
257718be8SEnji Cooper
357718be8SEnji Cooper #include <sys/socket.h>
457718be8SEnji Cooper #include <sys/ioctl.h>
557718be8SEnji Cooper #include <net/if.h>
657718be8SEnji Cooper #include <netinet/in.h>
757718be8SEnji Cooper
857718be8SEnji Cooper #include <string.h>
957718be8SEnji Cooper #include <stdio.h>
1057718be8SEnji Cooper #include <stdlib.h>
1157718be8SEnji Cooper
1257718be8SEnji Cooper #include <rump/rump.h>
1357718be8SEnji Cooper #include <rump/rump_syscalls.h>
1457718be8SEnji Cooper
1557718be8SEnji Cooper #include "../config/netconfig.c"
1657718be8SEnji Cooper
1757718be8SEnji Cooper /*
1857718be8SEnji Cooper * Test for stack smashing in compat ioctl handling. Adapted as an
1957718be8SEnji Cooper * atf test from code provided by Onno van der Linden in PR kern/44054
2057718be8SEnji Cooper */
2157718be8SEnji Cooper
2257718be8SEnji Cooper struct oifreq {
2357718be8SEnji Cooper char ifr_name[IFNAMSIZ]; /* if name, e.g. "en0" */
2457718be8SEnji Cooper union {
2557718be8SEnji Cooper struct sockaddr ifru_addr;
2657718be8SEnji Cooper struct sockaddr ifru_dstaddr;
2757718be8SEnji Cooper struct sockaddr ifru_broadaddr;
2857718be8SEnji Cooper short ifru_flags;
2957718be8SEnji Cooper int ifru_metric;
3057718be8SEnji Cooper int ifru_mtu;
3157718be8SEnji Cooper int ifru_dlt;
3257718be8SEnji Cooper u_int ifru_value;
3357718be8SEnji Cooper void * ifru_data;
3457718be8SEnji Cooper struct {
3557718be8SEnji Cooper uint32_t b_buflen;
3657718be8SEnji Cooper void *b_buf;
3757718be8SEnji Cooper } ifru_b;
3857718be8SEnji Cooper } ifr_ifru;
3957718be8SEnji Cooper };
4057718be8SEnji Cooper #define OOSIOCGIFBRDADDR _IOWR('i', 18, struct oifreq)
4157718be8SEnji Cooper
4257718be8SEnji Cooper ATF_TC(OOSIOCGIFBRDADDR);
ATF_TC_HEAD(OOSIOCGIFBRDADDR,tc)4357718be8SEnji Cooper ATF_TC_HEAD(OOSIOCGIFBRDADDR, tc)
4457718be8SEnji Cooper {
4557718be8SEnji Cooper
4657718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Checks that OOSIOCGIFBRDADDR works "
4757718be8SEnji Cooper "(PR kern/44054)");
4857718be8SEnji Cooper }
4957718be8SEnji Cooper
ATF_TC_BODY(OOSIOCGIFBRDADDR,tc)5057718be8SEnji Cooper ATF_TC_BODY(OOSIOCGIFBRDADDR, tc)
5157718be8SEnji Cooper {
5257718be8SEnji Cooper int fd, ifnum;
5357718be8SEnji Cooper struct oifreq ifreq;
5457718be8SEnji Cooper struct sockaddr_in *sin;
5557718be8SEnji Cooper int rv;
5657718be8SEnji Cooper
5757718be8SEnji Cooper memset(&ifreq,'\0',sizeof ifreq);
5857718be8SEnji Cooper
5957718be8SEnji Cooper rump_init();
6057718be8SEnji Cooper
6157718be8SEnji Cooper /* create an interface and give it netmask 0xffff0000 */
6257718be8SEnji Cooper rv = rump_pub_shmif_create("bus", &ifnum);
6357718be8SEnji Cooper if (rv)
6457718be8SEnji Cooper atf_tc_fail("failed to create shmif: %s", strerror(rv));
6557718be8SEnji Cooper sprintf(ifreq.ifr_name, "shmif%d", ifnum);
6657718be8SEnji Cooper netcfg_rump_if(ifreq.ifr_name, "1.7.64.10", "255.255.0.0");
6757718be8SEnji Cooper
68*cdebaff8SEnji Cooper atf_tc_expect_fail("PR kern/51610: rump does not include COMPAT_43");
69*cdebaff8SEnji Cooper
7057718be8SEnji Cooper /* query kernel for iface bcast */
7157718be8SEnji Cooper RL(fd = rump_sys_socket(AF_INET, SOCK_DGRAM, 0));
7257718be8SEnji Cooper RL(rump_sys_ioctl(fd, OOSIOCGIFBRDADDR, &ifreq));
7357718be8SEnji Cooper
7457718be8SEnji Cooper /* make sure we got what we deserve */
7557718be8SEnji Cooper sin = (struct sockaddr_in *)&ifreq.ifr_broadaddr;
7657718be8SEnji Cooper ATF_REQUIRE_EQ(sin->sin_addr.s_addr, htonl(0x0107ffff));
7757718be8SEnji Cooper rump_sys_close(fd);
7857718be8SEnji Cooper }
7957718be8SEnji Cooper
ATF_TP_ADD_TCS(tp)8057718be8SEnji Cooper ATF_TP_ADD_TCS(tp)
8157718be8SEnji Cooper {
8257718be8SEnji Cooper
8357718be8SEnji Cooper ATF_TP_ADD_TC(tp, OOSIOCGIFBRDADDR);
8457718be8SEnji Cooper return atf_no_error();
8557718be8SEnji Cooper }
86