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