2 * Copyright (C) 2009 Luigi Rizzo, Marta Carbone, Universita` di Pisa
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * $Id: bsd_compat.c 4665 2010-01-04 12:35:39Z luigi $
29 * kernel variables and functions that are not available in linux.
32 #include <sys/cdefs.h>
33 #include <asm/div64.h> /* do_div on 2.4 */
34 #include <linux/random.h> /* get_random_bytes on 2.4 */
37 * gettimeofday would be in sys/time.h but it is not
38 * visible if _KERNEL is defined
40 int gettimeofday(struct timeval *, struct timezone *);
42 int ticks; /* kernel ticks counter */
43 int hz = 1000; /* default clock time */
44 long tick = 1000; /* XXX is this 100000/hz ? */
46 time_t time_uptime = 0;
47 struct timeval boottime;
51 u_long in_ifaddrhmask; /* mask for hash table */
52 struct in_ifaddrhashhead *in_ifaddrhashtbl; /* inet addr hash table */
54 u_int rt_numfibs = RT_NUMFIBS;
58 * We make pfil_head_get return a non-null pointer, which is then ignored
59 * in our 'add-hook' routines.
62 typedef int (pfil_hook_t)
63 (void *, struct mbuf **, struct ifnet *, int, struct inpcb *);
66 pfil_head_get(int proto, u_long flags)
69 return (struct pfil_head *)&dummy;
73 pfil_add_hook(pfil_hook_t *func, void *arg, int dir, struct pfil_head *h)
79 pfil_remove_hook(pfil_hook_t *func, void *arg, int dir, struct pfil_head *h)
84 /* define empty body for kernel function */
86 priv_check(struct thread *td, int priv)
92 securelevel_ge(struct ucred *cr, int level)
98 sysctl_handle_int(SYSCTL_HANDLER_ARGS)
104 sysctl_handle_long(SYSCTL_HANDLER_ARGS)
110 ether_demux(struct ifnet *ifp, struct mbuf *m)
116 ether_output_frame(struct ifnet *ifp, struct mbuf *m)
122 in_rtalloc_ign(struct route *ro, u_long ignflags, u_int fibnum)
128 icmp_error(struct mbuf *n, int type, int code, uint32_t dest, int mtu)
134 in_cksum_skip(struct mbuf *m, int len, int skip)
140 in_cksum_hdr(struct ip *ip)
146 * we don't really reassemble, just return whatever we had.
149 ip_reass(struct mbuf *clone)
153 #ifdef INP_LOCK_ASSERT
154 #undef INP_LOCK_ASSERT
155 #define INP_LOCK_ASSERT(a)
158 /* credentials check */
159 #include <netinet/ip_fw.h>
161 cred_check(void *_insn, int proto, struct ifnet *oif,
162 struct in_addr dst_ip, u_int16_t dst_port, struct in_addr src_ip,
163 u_int16_t src_port, struct bsd_ucred *u, int *ugid_lookupp,
167 ipfw_insn_u32 *insn = (ipfw_insn_u32 *)_insn;
169 if (*ugid_lookupp == 0) { /* actively lookup and copy in cache */
170 /* returns null if any element of the chain up to file is null.
171 * if sk != NULL then we also have a reference
173 *ugid_lookupp = linux_lookup(proto,
174 src_ip.s_addr, htons(src_port),
175 dst_ip.s_addr, htons(dst_port),
176 skb, oif ? 1 : 0, u);
178 if (*ugid_lookupp < 0)
181 if (insn->o.opcode == O_UID)
182 match = (u->uid == (uid_t)insn->d[0]);
183 else if (insn->o.opcode == O_JAIL)
184 match = (u->xid == (uid_t)insn->d[0]);
185 else if (insn->o.opcode == O_GID)
186 match = (u->gid == (uid_t)insn->d[0]);
191 jailed(struct ucred *cred)
197 * Return 1 if an internet address is for a ``local'' host
198 * (one to which we have a connection). If subnetsarelocal
199 * is true, this includes other subnets of the local net.
200 * Otherwise, it includes only the directly-connected (sub)nets.
203 in_localaddr(struct in_addr in)
209 sooptcopyout(struct sockopt *sopt, const void *buf, size_t len)
211 size_t valsize = sopt->sopt_valsize;
214 sopt->sopt_valsize = valsize = len;
215 bcopy(buf, sopt->sopt_val, valsize);
220 * copy data from userland to kernel
223 sooptcopyin(struct sockopt *sopt, void *buf, size_t len, size_t minlen)
225 size_t valsize = sopt->sopt_valsize;
227 if (valsize < minlen)
230 sopt->sopt_valsize = valsize = len;
231 bcopy(sopt->sopt_val, buf, valsize);
236 getmicrouptime(struct timeval *tv)
245 #include <arpa/inet.h>
248 inet_ntoa_r(struct in_addr ina, char *buf)
252 unsigned char *ucp = (unsigned char *)&ina;
254 sprintf(buf, "%d.%d.%d.%d",
264 inet_ntoa(struct in_addr ina)
267 return inet_ntoa_r(ina, buf);
277 get_random_bytes(&r, sizeof(r));
278 return r & 0x7fffffff;
284 * do_div really does a u64 / u32 bit division.
285 * we save the sign and convert to uint befor calling.
286 * We are safe just because we always call it with small operands.
289 div64(int64_t a, int64_t b)
296 int sign = ((a>0)?1:-1) * ((b>0)?1:-1);
306 * compact version of fnmatch.
309 fnmatch(const char *pattern, const char *string, int flags)
313 if (!string || !pattern)
314 return 1; /* no match */
315 while ( (s = *string++) ) {
317 if (p == '\0') /* pattern is over, no match */
319 if (p == '*') /* wildcard, match */
321 if (p == '.' || p == s) /* char match, continue */
323 return 1; /* no match */
325 /* end of string, make sure the pattern is over too */
326 if (*pattern == '\0' || *pattern == '*')
328 return 1; /* no match */
333 * as good as anywhere, place here the missing calls
339 void *_ret = ExAllocatePoolWithTag(0, size, 'wfpi');
341 memset(_ret, 0, size);
346 panic(const char *fmt, ...)
354 extern int _vsnprintf(char *buf, int buf_size, char * fmt, va_list ap);
357 * Windows' _snprintf doesn't terminate buffer with zero if size > buf_size
360 snprintf(char *buf, int buf_size, char *fmt, ...)
364 if (_vsnprintf(buf, buf_size, fmt, ap) < 0)
365 buf[buf_size - 1] = '\0';