t_bpf.c revision 1.1 1 1.1 pooka /* $NetBSD: t_bpf.c,v 1.1 2010/12/06 11:32:01 pooka Exp $ */
2 1.1 pooka
3 1.1 pooka /*-
4 1.1 pooka * Copyright (c) 2010 Antti Kantee. All Rights Reserved.
5 1.1 pooka *
6 1.1 pooka * Redistribution and use in source and binary forms, with or without
7 1.1 pooka * modification, are permitted provided that the following conditions
8 1.1 pooka * are met:
9 1.1 pooka * 1. Redistributions of source code must retain the above copyright
10 1.1 pooka * notice, this list of conditions and the following disclaimer.
11 1.1 pooka * 2. Redistributions in binary form must reproduce the above copyright
12 1.1 pooka * notice, this list of conditions and the following disclaimer in the
13 1.1 pooka * documentation and/or other materials provided with the distribution.
14 1.1 pooka *
15 1.1 pooka * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
16 1.1 pooka * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17 1.1 pooka * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18 1.1 pooka * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 1.1 pooka * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 1.1 pooka * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
21 1.1 pooka * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 1.1 pooka * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 1.1 pooka * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 1.1 pooka * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 1.1 pooka * SUCH DAMAGE.
26 1.1 pooka */
27 1.1 pooka
28 1.1 pooka #include <sys/param.h>
29 1.1 pooka #include <sys/ioctl.h>
30 1.1 pooka #include <sys/socket.h>
31 1.1 pooka #include <sys/mbuf.h>
32 1.1 pooka #include <sys/sysctl.h>
33 1.1 pooka
34 1.1 pooka #include <net/if.h>
35 1.1 pooka #include <net/bpf.h>
36 1.1 pooka
37 1.1 pooka #include <fcntl.h>
38 1.1 pooka #include <stdio.h>
39 1.1 pooka #include <string.h>
40 1.1 pooka
41 1.1 pooka #include <rump/rump.h>
42 1.1 pooka #include <rump/rump_syscalls.h>
43 1.1 pooka
44 1.1 pooka /* XXX: atf-c.h has collisions with mbuf */
45 1.1 pooka #undef m_type
46 1.1 pooka #undef m_data
47 1.1 pooka #include <atf-c.h>
48 1.1 pooka
49 1.1 pooka #include "../../h_macros.h"
50 1.1 pooka
51 1.1 pooka ATF_TC(bpfwriteleak);
52 1.1 pooka ATF_TC_HEAD(bpfwriteleak, tc)
53 1.1 pooka {
54 1.1 pooka
55 1.1 pooka atf_tc_set_md_var(tc, "descr", "Checks that writing to /dev/bpf "
56 1.1 pooka "does not leak mbufs");
57 1.1 pooka }
58 1.1 pooka
59 1.1 pooka static int
60 1.1 pooka getmtdata(void)
61 1.1 pooka {
62 1.1 pooka struct mbstat mbstat;
63 1.1 pooka size_t mbstatlen = sizeof(mbstat);
64 1.1 pooka const int mbstat_mib[] = { CTL_KERN, KERN_MBUF, MBUF_STATS };
65 1.1 pooka
66 1.1 pooka RL(rump_sys___sysctl(mbstat_mib, __arraycount(mbstat_mib),
67 1.1 pooka &mbstat, &mbstatlen, NULL, 0));
68 1.1 pooka return mbstat.m_mtypes[MT_DATA];
69 1.1 pooka }
70 1.1 pooka
71 1.1 pooka ATF_TC_BODY(bpfwriteleak, tc)
72 1.1 pooka {
73 1.1 pooka char buf[28]; /* sizeof(garbage) > etherhdrlen */
74 1.1 pooka struct ifreq ifr;
75 1.1 pooka int ifnum, bpfd;
76 1.1 pooka u_int x;
77 1.1 pooka
78 1.1 pooka RZ(rump_init());
79 1.1 pooka RZ(rump_pub_shmif_create(NULL, &ifnum));
80 1.1 pooka sprintf(ifr.ifr_name, "shmif%d", ifnum);
81 1.1 pooka
82 1.1 pooka RL(bpfd = rump_sys_open("/dev/bpf", O_RDWR));
83 1.1 pooka RL(rump_sys_ioctl(bpfd, BIOCSETIF, &ifr));
84 1.1 pooka x = 1;
85 1.1 pooka RL(rump_sys_ioctl(bpfd, BIOCSFEEDBACK, &ifr));
86 1.1 pooka
87 1.1 pooka if (getmtdata() != 0)
88 1.1 pooka atf_tc_fail("test precondition failed: MT_DATA mbufs != 0");
89 1.1 pooka
90 1.1 pooka ATF_REQUIRE_ERRNO(ENETDOWN, rump_sys_write(bpfd, buf, sizeof(buf))==-1);
91 1.1 pooka
92 1.1 pooka atf_tc_expect_fail("PR kern/44196");
93 1.1 pooka ATF_REQUIRE_EQ(getmtdata(), 0);
94 1.1 pooka }
95 1.1 pooka
96 1.1 pooka ATF_TP_ADD_TCS(tp)
97 1.1 pooka {
98 1.1 pooka
99 1.1 pooka ATF_TP_ADD_TC(tp, bpfwriteleak);
100 1.1 pooka return atf_no_error();
101 1.1 pooka }
102