1/*
2 * Miscellaneous definitions for PPP STREAMS modules.
3 */
4
5/*
6 * Macros for allocating and freeing kernel memory.
7 */
8#ifdef SVR4			/* SVR4, including Solaris 2 */
9#include <sys/kmem.h>
10#define ALLOC_SLEEP(n)		kmem_alloc((n), KM_SLEEP)
11#define ALLOC_NOSLEEP(n)	kmem_alloc((n), KM_NOSLEEP)
12#define FREE(p, n)		kmem_free((p), (n))
13#endif
14
15#ifdef SUNOS4
16#include <sys/kmem_alloc.h>	/* SunOS 4.x */
17#define ALLOC_SLEEP(n)		kmem_alloc((n), KMEM_SLEEP)
18#define ALLOC_NOSLEEP(n)	kmem_alloc((n), KMEM_NOSLEEP)
19#define FREE(p, n)		kmem_free((p), (n))
20#define NOTSUSER()		(suser()? 0: EPERM)
21#define bcanputnext(q, band)	canputnext((q))
22#endif /* SunOS 4 */
23
24#ifdef __osf__
25#include <sys/malloc.h>
26
27/* caution: this mirrors macros in sys/malloc.h, and uses interfaces
28 * which are subject to change.
29 * The problems are that:
30 *     - the official MALLOC macro wants the lhs of the assignment as an argument,
31 *	 and it takes care of the assignment itself (yuck.)
32 *     - PPP insists on using "FREE" which conflicts with a macro of the same name.
33 *
34 */
35#ifdef BUCKETINDX /* V2.0 */
36#define ALLOC_SLEEP(n)		(void *)malloc((u_long)(n), BUCKETP(n), M_DEVBUF, M_WAITOK)
37#define ALLOC_NOSLEEP(n)	(void *)malloc((u_long)(n), BUCKETP(n), M_DEVBUF, M_NOWAIT)
38#else
39#define ALLOC_SLEEP(n)		(void *)malloc((u_long)(n), BUCKETINDEX(n), M_DEVBUF, M_WAITOK)
40#define ALLOC_NOSLEEP(n)	(void *)malloc((u_long)(n), BUCKETINDEX(n), M_DEVBUF, M_NOWAIT)
41#endif
42
43#define bcanputnext(q, band)	canputnext((q))
44
45#ifdef FREE
46#undef FREE
47#endif
48#define FREE(p, n)		free((void *)(p), M_DEVBUF)
49
50#define NO_DLPI 1
51
52#ifndef IFT_PPP
53#define IFT_PPP 0x17
54#endif
55
56#include <sys/proc.h>
57#define NOTSUSER()		(suser(u.u_procp->p_rcred, &u.u_acflag) ? EPERM : 0)
58
59/* #include "ppp_osf.h" */
60
61#endif /* __osf__ */
62
63#ifdef AIX4
64#define ALLOC_SLEEP(n)		xmalloc((n), 0, pinned_heap)	/* AIX V4.x */
65#define ALLOC_NOSLEEP(n)	xmalloc((n), 0, pinned_heap)	/* AIX V4.x */
66#define FREE(p, n)		xmfree((p), pinned_heap)
67#define NOTSUSER()		(suser()? 0: EPERM)
68#endif /* AIX */
69
70/*
71 * Macros for printing debugging stuff.
72 */
73#ifdef DEBUG
74#if defined(SVR4) || defined(__osf__)
75#if defined(SNI)
76#include <sys/strlog.h>
77#define STRLOG_ID		4712
78#define DPRINT(f)		strlog(STRLOG_ID, 0, 0, SL_TRACE, f)
79#define DPRINT1(f, a1)		strlog(STRLOG_ID, 0, 0, SL_TRACE, f, a1)
80#define DPRINT2(f, a1, a2)	strlog(STRLOG_ID, 0, 0, SL_TRACE, f, a1, a2)
81#define DPRINT3(f, a1, a2, a3)	strlog(STRLOG_ID, 0, 0, SL_TRACE, f, a1, a2, a3)
82#else
83#define DPRINT(f)		cmn_err(CE_CONT, f)
84#define DPRINT1(f, a1)		cmn_err(CE_CONT, f, a1)
85#define DPRINT2(f, a1, a2)	cmn_err(CE_CONT, f, a1, a2)
86#define DPRINT3(f, a1, a2, a3)	cmn_err(CE_CONT, f, a1, a2, a3)
87#endif /* SNI */
88#else
89#define DPRINT(f)		printf(f)
90#define DPRINT1(f, a1)		printf(f, a1)
91#define DPRINT2(f, a1, a2)	printf(f, a1, a2)
92#define DPRINT3(f, a1, a2, a3)	printf(f, a1, a2, a3)
93#endif /* SVR4 or OSF */
94
95#else
96#define DPRINT(f)		0
97#define DPRINT1(f, a1)		0
98#define DPRINT2(f, a1, a2)	0
99#define DPRINT3(f, a1, a2, a3)	0
100#endif /* DEBUG */
101
102#ifndef SVR4
103typedef unsigned char uchar_t;
104typedef unsigned short ushort_t;
105#ifndef __osf__
106typedef int minor_t;
107#endif
108#endif
109
110/*
111 * If we don't have multithreading support, define substitutes.
112 */
113#ifndef D_MP
114# define qprocson(q)
115# define qprocsoff(q)
116# define put(q, mp)	((*(q)->q_qinfo->qi_putp)((q), (mp)))
117# define canputnext(q)	canput((q)->q_next)
118# define qwriter(q, mp, func, scope)	(func)((q), (mp))
119#endif
120
121#ifdef D_MP
122/* Use msgpullup if we have other multithreading support. */
123#define PULLUP(mp, len)				\
124    do {					\
125	mblk_t *np = msgpullup((mp), (len));	\
126	freemsg((mp));				\
127	mp = np;				\
128    } while (0)
129
130#else
131/* Use pullupmsg if we don't have any multithreading support. */
132#define PULLUP(mp, len)			\
133    do {				\
134	if (!pullupmsg((mp), (len))) {	\
135	    freemsg((mp));		\
136	    mp = 0;			\
137	}				\
138    } while (0)
139#endif
140
141/*
142 * How to declare the open and close procedures for a module.
143 */
144#ifdef SVR4
145#define MOD_OPEN_DECL(name)	\
146static int name __P((queue_t *, dev_t *, int, int, cred_t *))
147
148#define MOD_CLOSE_DECL(name)	\
149static int name __P((queue_t *, int, cred_t *))
150
151#define MOD_OPEN(name)				\
152static int name(q, devp, flag, sflag, credp)	\
153    queue_t *q;					\
154    dev_t *devp;				\
155    int flag, sflag;				\
156    cred_t *credp;
157
158#define MOD_CLOSE(name)		\
159static int name(q, flag, credp)	\
160    queue_t *q;			\
161    int flag;			\
162    cred_t *credp;
163
164#define OPEN_ERROR(x)		return (x)
165#define DRV_OPEN_OK(dev)	return 0
166
167#define NOTSUSER()		(drv_priv(credp))
168
169#else	/* not SVR4 */
170#define MOD_OPEN_DECL(name)	\
171static int name __P((queue_t *, int, int, int))
172
173#define MOD_CLOSE_DECL(name)	\
174static int name __P((queue_t *, int))
175
176#define MOD_OPEN(name)		\
177static int name(q, dev, flag, sflag)	\
178    queue_t *q;				\
179    int dev;				\
180    int flag, sflag;
181
182#define MOD_CLOSE(name)		\
183static int name(q, flag)	\
184    queue_t *q;			\
185    int flag;
186
187#define OPEN_ERROR(x)		{ u.u_error = (x); return OPENFAIL; }
188#define DRV_OPEN_OK(dev)	return (dev)
189
190#endif	/* SVR4 */
191