summaryrefslogtreecommitdiff
path: root/sys/netinet6/osdep.h
blob: 13f87c7c9e27b579624ea095c7be600b2d853cf1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
/*
%%% copyright-nrl-97
This software is Copyright 1997-1998 by Randall Atkinson, Ronald Lee,
Daniel McDonald, Bao Phan, and Chris Winters. All Rights Reserved. All
rights under this copyright have been assigned to the US Naval Research
Laboratory (NRL). The NRL Copyright Notice and License Agreement Version
1.1 (January 17, 1995) applies to this software.
You should have received a copy of the license with this software. If you
didn't get a copy, you may request one from <license@ipv6.nrl.navy.mil>.

%%% copyright-cmetz-97
This software is Copyright 1997-1998 by Craig Metz, All Rights Reserved.
The Inner Net License Version 2 applies to this software.
You should have received a copy of the license with this software. If
you didn't get a copy, you may request one from <license@inner.net>.

*/
#ifndef __OSDEP_H
#define __OSDEP_H 1

#if __linux__
#ifdef __KERNEL__
#define KERNEL 1
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/socket.h>
#include <net/sock.h>
#include <linux/random.h>
#include <asm/uaccess.h>
#include <linux/malloc.h>

#define printf printk

/* XXX */
#define OSDEP_CRITICALDCL unsigned long flags;
#define OSDEP_CRITICALSTART save_flags(flags); cli()
#define OSDEP_CRITICALEND restore_flags(flags)

#define OSDEP_TIMESECONDS (xtime.tv_sec)

#define OSDEP_PROCESS struct task_struct
#define OSDEP_PROCESSCURRENT (current)
#define OSDEP_PROCESSPARENT(x) ((x)->p_pptr)
#define OSDEP_PROCESSPID(x) ((x)->pid)

#define OSDEP_PCAST(x) ((unsigned int)(x) & 0xffffffff)
#define OSDEP_SOCKET struct sock
#define OSDEP_PACKET struct sk_buff
struct sk_buff;

#define OSDEP_REAL_MALLOC(n) kmalloc(n, GFP_ATOMIC)
#define OSDEP_REAL_FREE(p) kfree(p)

#define OSDEP_SOCKETFAMILY(socket) (socket->family)
#define OSDEP_SOCKETPRIVELEGED(socket) (suser())

static inline uint32_t __osdep_pseudorandom(void)
{
  static uint32_t seed=152;
  seed=seed*69069+1;
  return seed^jiffies;
};
#define OSDEP_PSEUDORANDOM __osdep_pseudorandom()

static inline int __osdep_datatopacket(void *data, int len, OSDEP_PACKET **packet)
{
  if (!(*packet = alloc_skb(len, GFP_ATOMIC)))
    return -ENOMEM;

  memcpy((*packet)->h.raw = skb_put(*packet, len), data, len);

  return 0;
};
#define OSDEP_DATATOPACKET(data, len, packet) __osdep_datatopacket(data, len, packet)
#define OSDEP_ZEROPACKET(packet) memset(packet->head, 0, packet->end - packet->head)
#define OSDEP_FREEPACKET(packet) kfree_skb(packet)

#define OSDEP_COPYFROMUSER(dst, src, len) \
        (copy_from_user(dst, src, len) ? -EFAULT : 0)

#define OSDEP_COPYTOUSER(dst, src, len) \
        (copy_to_user(dst, src, len) ? -EFAULT : 0)

#define __P(x) x
#else /* __KERNEL__ */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>
#endif /* __KERNEL__ */

#define OSDEP_SALEN 0
#define OSDEP_ERROR(x) (-(x))

#ifndef IN6_IS_ADDR_UNSPECIFIED
#define IN6_IS_ADDR_UNSPECIFIED(a) \
        ((((uint32_t *)(a))[0] == 0) && (((uint32_t *)(a))[1] == 0) && \
         (((uint32_t *)(a))[2] == 0) && (((uint32_t *)(a))[3] == 0))
#endif /* IN6_IS_ADDR_UNSPECIFIED */

/* Stupid C trick: We can define the structures that are members of union
   sockaddr_union as empty and later redefine them as non-empty. We CAN'T,
   however, define them as non-empty and later redefine them as empty. So
   the empty declarations must be wrapped to ensure that we don't do that.

   WARNING: gcc < 2.8 generates incorrect debugging information for this;
   the symptom is that gdb thinks that all struct sockaddr_*'s are empty
   structures. gcc >= 2.8 correctly figures out what's going on. - cmetz
*/

#ifdef KERNEL
#ifndef _NETINET_IN_H_
/* struct sockaddr_in {}; */
#endif /* _NETINET_IN_H_ */
#ifndef _NETINET6_IN6_H
/* struct sockaddr_in6 {}; */
#endif /* _NETINET6_IN6_H */
#ifndef _SYS_UN_H_
struct sockaddr_un {};
#endif /* _SYS_UN_H_ */

union sockaddr_union {
	struct sockaddr		sa;
	struct sockaddr_in	sin;
	struct sockaddr_in6	sin6;
	struct sockaddr_un	sun;
	char __maxsize[128];		/* should probably be MHLEN on BSD */
};

static inline uint8_t __osdep_sa_len(struct sockaddr *sockaddr)
{
  switch(sockaddr->sa_family) {
    case AF_INET:
      return 16; /* sizeof(struct sockaddr_in); */
    case AF_INET6:
      return 24; /* sizeof(struct sockaddr_in6); */
    default:
      return 0;
  };
};
#define SA_LEN(sockaddr) __osdep_sa_len(sockaddr)
#endif /* KERNEL */
#endif /* __linux__ */

#if __NetBSD__ || __bsdi__ || __OpenBSD__ || __FreeBSD__
#define OSDEP_BSD 1

#include <sys/types.h>
#include <sys/param.h>
#include <sys/socket.h>
#ifdef KERNEL
#ifndef ATSH_ADD
#include <sys/systm.h>
#endif /* ATSH_ADD */
#ifndef MLEN
#include <sys/mbuf.h>
#endif /* MLEN */
#include <sys/kernel.h>
#include <sys/malloc.h>
#ifndef SB_MAX
#include <sys/socketvar.h>
#endif /* SB_MAX */
#include <sys/proc.h>
#ifndef RTM_RTTUNIT
#include <net/route.h>
#endif /* RTM_RTTUNIT */
#endif /* KERNEL */
struct ifnet;
struct mbuf;
#include <netinet/in.h>
struct route6;

#ifdef KERNEL
/* XXX */
#define OSDEP_CRITICALDCL int __s;
#define OSDEP_CRITICALSTART __s = splnet()
#define OSDEP_CRITICALEND splx(__s)

#ifdef __FreeBSD__
#define OSDEP_TIMESECONDS (time_second)
#else /* __FreeBSD__ */
#define OSDEP_TIMESECONDS (time.tv_sec)
#endif /* __FreeBSD__ */

#define OSDEP_PROCESS struct proc
#if !defined(_BSDI_VERSION) || (_BSDI_VERSION < 199802)
#define OSDEP_PROCESSCURRENT (curproc)
#else /* !defined(_BSDI_VERSION) || (_BSDI_VERSION < 199802) */
#include <machine/pcpu.h>
#define OSDEP_PROCESSCURRENT (PCPU(curproc))
#endif /* !defined(_BSDI_VERSION) || (_BSDI_VERSION < 199802) */
#define OSDEP_PROCESSPARENT(x) ((x)->p_pptr)
#define OSDEP_PROCESSPID(x) ((x)->p_pid)

#ifdef SS_PRIV
#define OSDEP_SOCKETPRIVELEGED(socket) (socket->so_state & SS_PRIV)
#else /* SS_PRIV */
/* XXX? */
#define OSDEP_SOCKETPRIVELEGED(socket) (!curproc || !curproc->p_ucred || !curproc->p_ucred->cr_uid)
#endif /* SS_PRIV */
#define OSDEP_PCAST(x) ((unsigned int)(x) & 0xffffffff)
#define OSDEP_SOCKET struct socket
#define OSDEP_PACKET struct mbuf
struct mbuf;

#define OSDEP_REAL_MALLOC(n) malloc((unsigned long)(n), M_TEMP, M_DONTWAIT)
#define OSDEP_REAL_FREE(p) free((void *)p, M_TEMP)
#define OSDEP_FAMILY(socket) (socket->so_proto->pr_domain->dom_family)
#define OSDEP_PSEUDORANDOM (uint32_t)random()

#if !__FreeBSD__
struct ifnet;
struct mbuf *m_devget(char *, int, int, struct ifnet *, void (*)(const void *, void *, size_t));
#endif /* !__FreeBSD__ */

static __inline__ int __osdep_datatopacket(void *data, int len, OSDEP_PACKET **packet)
{
  if (!(*packet = m_devget(data, len, 0, NULL, NULL)))
    return -ENOMEM;

  return 0;
};

#define OSDEP_DATATOPACKET(data, len, packet) __osdep_datatopacket(data, len, packet)

#define OSDEP_ZEROPACKET(packet) m_zero(packet)
#define OSDEP_FREEPACKET(packet) m_freem(packet)

#define memcpy(dst, src, len) bcopy(src, dst, len)
#define memmove(dst, src, len) bcopy(src, dst, len)
#define memset(p, zero, len) bzero(p, len) /* XXX */
#define memcmp(p1, p2, len) bcmp(p1, p2, len)

#define OSDEP_COPYFROMUSER(dst, src, len) copyin(src, dst, len)
#define OSDEP_COPYTOUSER(dst, src, len) copyout(src, dst, len)

#if __FreeBSD__
#define M_SOCKET M_TEMP
#define MT_SOOPTS MT_DATA
#endif /* __FreeBSD__ */
#endif /* KERNEL */
#define OSDEP_SALEN 1
#define OSDEP_ERROR(x) (x)
#endif /* __NetBSD__ || __bsdi__ || __OpenBSD__ || __FreeBSD__ */

#define ENETSECURITYPOLICY -ECOMM

#ifdef DEBUG_MALLOC
#undef OSDEP_MALLOC
#undef OSDEP_FREE
#define OSDEP_MALLOC(n) debug_malloc_malloc(n, DEBUG_STATUS)
#define OSDEP_FREE(p) debug_malloc_free(p)
#else /* DEBUG_MALLOC */
#undef OSDEP_MALLOC
#define OSDEP_MALLOC(n) OSDEP_REAL_MALLOC(n)
#undef OSDEP_FREE
#define OSDEP_FREE(p) OSDEP_REAL_FREE(p)
#endif /* DEBUG_MALLOC */

#endif /* __OSDEP_H */