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
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 */
38 * gettimeofday would be in sys/time.h but it is not
39 * visible if _KERNEL is defined
41 int gettimeofday(struct timeval *, struct timezone *);
43 int ticks; /* kernel ticks counter */
44 int hz = 1000; /* default clock time */
45 long tick = 1000; /* XXX is this 100000/hz ? */
47 time_t time_uptime = 0;
48 struct timeval boottime;
52 u_long in_ifaddrhmask; /* mask for hash table */
53 struct in_ifaddrhashhead *in_ifaddrhashtbl; /* inet addr hash table */
55 u_int rt_numfibs = RT_NUMFIBS;
59 * We make pfil_head_get return a non-null pointer, which is then ignored
60 * in our 'add-hook' routines.
63 typedef int (pfil_hook_t)
64 (void *, struct mbuf **, struct ifnet *, int, struct inpcb *);
67 pfil_head_get(int proto, u_long flags)
70 return (struct pfil_head *)&dummy;
74 pfil_add_hook(pfil_hook_t *func, void *arg, int dir, struct pfil_head *h)
80 pfil_remove_hook(pfil_hook_t *func, void *arg, int dir, struct pfil_head *h)
85 /* define empty body for kernel function */
87 priv_check(struct thread *td, int priv)
93 securelevel_ge(struct ucred *cr, int level)
99 sysctl_handle_int(SYSCTL_HANDLER_ARGS)
105 sysctl_handle_long(SYSCTL_HANDLER_ARGS)
111 ether_demux(struct ifnet *ifp, struct mbuf *m)
117 ether_output_frame(struct ifnet *ifp, struct mbuf *m)
123 in_rtalloc_ign(struct route *ro, u_long ignflags, u_int fibnum)
129 icmp_error(struct mbuf *n, int type, int code, uint32_t dest, int mtu)
135 in_cksum_skip(struct mbuf *m, int len, int skip)
141 in_cksum_hdr(struct ip *ip)
147 ip_reass(struct mbuf *clone)
151 #ifdef INP_LOCK_ASSERT
152 #undef INP_LOCK_ASSERT
153 #define INP_LOCK_ASSERT(a)
157 jailed(struct ucred *cred)
163 * Return 1 if an internet address is for a ``local'' host
164 * (one to which we have a connection). If subnetsarelocal
165 * is true, this includes other subnets of the local net.
166 * Otherwise, it includes only the directly-connected (sub)nets.
169 in_localaddr(struct in_addr in)
175 sooptcopyout(struct sockopt *sopt, const void *buf, size_t len)
177 size_t valsize = sopt->sopt_valsize;
180 sopt->sopt_valsize = valsize = len;
181 bcopy(buf, sopt->sopt_val, valsize);
186 * copy data from userland to kernel
189 sooptcopyin(struct sockopt *sopt, void *buf, size_t len, size_t minlen)
191 size_t valsize = sopt->sopt_valsize;
193 if (valsize < minlen)
196 sopt->sopt_valsize = valsize = len;
197 bcopy(sopt->sopt_val, buf, valsize);
202 getmicrouptime(struct timeval *tv)
211 #include <arpa/inet.h>
214 inet_ntoa_r(struct in_addr ina, char *buf)
218 unsigned char *ucp = (unsigned char *)&ina;
220 sprintf(buf, "%d.%d.%d.%d",
230 inet_ntoa(struct in_addr ina)
233 return inet_ntoa_r(ina, buf);
243 get_random_bytes(&r, sizeof(r));
244 return r & 0x7fffffff;
250 * do_div really does a u64 / u32 bit division.
251 * we save the sign and convert to uint befor calling.
252 * We are safe just because we always call it with small operands.
255 div64(int64_t a, int64_t b)
262 int sign = ((a>0)?1:-1) * ((b>0)?1:-1);
272 * compact version of fnmatch.
275 fnmatch(const char *pattern, const char *string, int flags)
279 if (!string || !pattern)
280 return 1; /* no match */
281 while ( (s = *string++) ) {
283 if (p == '\0') /* pattern is over, no match */
285 if (p == '*') /* wildcard, match */
287 if (p == '.' || p == s) /* char match, continue */
289 return 1; /* no match */
291 /* end of string, make sure the pattern is over too */
292 if (*pattern == '\0' || *pattern == '*')
294 return 1; /* no match */
299 * as good as anywhere, place here the missing calls
305 void *_ret = ExAllocatePoolWithTag(0, size, 'wfpi');
307 memset(_ret, 0, size);
312 panic(const char *fmt, ...)
320 extern int _vsnprintf(char *buf, int buf_size, char * fmt, va_list ap);
323 * Windows' _snprintf doesn't terminate buffer with zero if size > buf_size
326 snprintf(char *buf, int buf_size, char *fmt, ...)
330 if (_vsnprintf(buf, buf_size, fmt, ap) < 0)
331 buf[buf_size - 1] = '\0';