xref: /freebsd/contrib/netbsd-tests/net/if/t_compat.c (revision d370fd1cd8fc69e87dc63f4f4a82e5a8b4956c93)
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