1*57718be8SEnji Cooper /* $NetBSD: t_compat.c,v 1.1 2010/11/07 19:53:42 pooka Exp $ */ 2*57718be8SEnji Cooper 3*57718be8SEnji Cooper #include <sys/socket.h> 4*57718be8SEnji Cooper #include <sys/ioctl.h> 5*57718be8SEnji Cooper #include <net/if.h> 6*57718be8SEnji Cooper #include <netinet/in.h> 7*57718be8SEnji Cooper 8*57718be8SEnji Cooper #include <string.h> 9*57718be8SEnji Cooper #include <stdio.h> 10*57718be8SEnji Cooper #include <stdlib.h> 11*57718be8SEnji Cooper 12*57718be8SEnji Cooper #include <rump/rump.h> 13*57718be8SEnji Cooper #include <rump/rump_syscalls.h> 14*57718be8SEnji Cooper 15*57718be8SEnji Cooper #include "../config/netconfig.c" 16*57718be8SEnji Cooper 17*57718be8SEnji Cooper /* 18*57718be8SEnji Cooper * Test for stack smashing in compat ioctl handling. Adapted as an 19*57718be8SEnji Cooper * atf test from code provided by Onno van der Linden in PR kern/44054 20*57718be8SEnji Cooper */ 21*57718be8SEnji Cooper 22*57718be8SEnji Cooper struct oifreq { 23*57718be8SEnji Cooper char ifr_name[IFNAMSIZ]; /* if name, e.g. "en0" */ 24*57718be8SEnji Cooper union { 25*57718be8SEnji Cooper struct sockaddr ifru_addr; 26*57718be8SEnji Cooper struct sockaddr ifru_dstaddr; 27*57718be8SEnji Cooper struct sockaddr ifru_broadaddr; 28*57718be8SEnji Cooper short ifru_flags; 29*57718be8SEnji Cooper int ifru_metric; 30*57718be8SEnji Cooper int ifru_mtu; 31*57718be8SEnji Cooper int ifru_dlt; 32*57718be8SEnji Cooper u_int ifru_value; 33*57718be8SEnji Cooper void * ifru_data; 34*57718be8SEnji Cooper struct { 35*57718be8SEnji Cooper uint32_t b_buflen; 36*57718be8SEnji Cooper void *b_buf; 37*57718be8SEnji Cooper } ifru_b; 38*57718be8SEnji Cooper } ifr_ifru; 39*57718be8SEnji Cooper }; 40*57718be8SEnji Cooper #define OOSIOCGIFBRDADDR _IOWR('i', 18, struct oifreq) 41*57718be8SEnji Cooper 42*57718be8SEnji Cooper ATF_TC(OOSIOCGIFBRDADDR); 43*57718be8SEnji Cooper ATF_TC_HEAD(OOSIOCGIFBRDADDR, tc) 44*57718be8SEnji Cooper { 45*57718be8SEnji Cooper 46*57718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Checks that OOSIOCGIFBRDADDR works " 47*57718be8SEnji Cooper "(PR kern/44054)"); 48*57718be8SEnji Cooper } 49*57718be8SEnji Cooper 50*57718be8SEnji Cooper ATF_TC_BODY(OOSIOCGIFBRDADDR, tc) 51*57718be8SEnji Cooper { 52*57718be8SEnji Cooper int fd, ifnum; 53*57718be8SEnji Cooper struct oifreq ifreq; 54*57718be8SEnji Cooper struct sockaddr_in *sin; 55*57718be8SEnji Cooper int rv; 56*57718be8SEnji Cooper 57*57718be8SEnji Cooper memset(&ifreq,'\0',sizeof ifreq); 58*57718be8SEnji Cooper 59*57718be8SEnji Cooper rump_init(); 60*57718be8SEnji Cooper 61*57718be8SEnji Cooper /* create an interface and give it netmask 0xffff0000 */ 62*57718be8SEnji Cooper rv = rump_pub_shmif_create("bus", &ifnum); 63*57718be8SEnji Cooper if (rv) 64*57718be8SEnji Cooper atf_tc_fail("failed to create shmif: %s", strerror(rv)); 65*57718be8SEnji Cooper sprintf(ifreq.ifr_name, "shmif%d", ifnum); 66*57718be8SEnji Cooper netcfg_rump_if(ifreq.ifr_name, "1.7.64.10", "255.255.0.0"); 67*57718be8SEnji Cooper 68*57718be8SEnji Cooper /* query kernel for iface bcast */ 69*57718be8SEnji Cooper RL(fd = rump_sys_socket(AF_INET, SOCK_DGRAM, 0)); 70*57718be8SEnji Cooper RL(rump_sys_ioctl(fd, OOSIOCGIFBRDADDR, &ifreq)); 71*57718be8SEnji Cooper 72*57718be8SEnji Cooper /* make sure we got what we deserve */ 73*57718be8SEnji Cooper sin = (struct sockaddr_in *)&ifreq.ifr_broadaddr; 74*57718be8SEnji Cooper ATF_REQUIRE_EQ(sin->sin_addr.s_addr, htonl(0x0107ffff)); 75*57718be8SEnji Cooper rump_sys_close(fd); 76*57718be8SEnji Cooper } 77*57718be8SEnji Cooper 78*57718be8SEnji Cooper ATF_TP_ADD_TCS(tp) 79*57718be8SEnji Cooper { 80*57718be8SEnji Cooper 81*57718be8SEnji Cooper ATF_TP_ADD_TC(tp, OOSIOCGIFBRDADDR); 82*57718be8SEnji Cooper return atf_no_error(); 83*57718be8SEnji Cooper } 84