summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/io/ppp/sppp/sppp.h
blob: 71911c231e80772603ac74415f98b78fbe17e5f4 (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
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
/*
 * sppp.h - Solaris STREAMS PPP multiplexing pseudo-driver definitions
 *
 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 *
 * Permission to use, copy, modify, and distribute this software and its
 * documentation is hereby granted, provided that the above copyright
 * notice appears in all copies.
 *
 * SUN MAKES NO REPRESENTATION OR WARRANTIES ABOUT THE SUITABILITY OF
 * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
 * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
 * PARTICULAR PURPOSE, OR NON-INFRINGEMENT.  SUN SHALL NOT BE LIABLE FOR
 * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
 * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES
 *
 * Copyright (c) 1994 The Australian National University.
 * All rights reserved.
 *
 * Permission to use, copy, modify, and distribute this software and its
 * documentation is hereby granted, provided that the above copyright
 * notice appears in all copies.  This software is provided without any
 * warranty, express or implied. The Australian National University
 * makes no representations about the suitability of this software for
 * any purpose.
 *
 * IN NO EVENT SHALL THE AUSTRALIAN NATIONAL UNIVERSITY BE LIABLE TO ANY
 * PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
 * THE AUSTRALIAN NATIONAL UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY
 * OF SUCH DAMAGE.
 *
 * THE AUSTRALIAN NATIONAL UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES,
 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
 * ON AN "AS IS" BASIS, AND THE AUSTRALIAN NATIONAL UNIVERSITY HAS NO
 * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
 * OR MODIFICATIONS.
 *
 * This driver is derived from the original SVR4 STREAMS PPP driver
 * originally written by Paul Mackerras <paul.mackerras@cs.anu.edu.au>.
 *
 * Adi Masputra <adi.masputra@sun.com> rewrote and restructured the code
 * for improved performance and scalability.
 *
 * $Id: sppp.h,v 1.0 2000/05/08 01:10:12 masputra Exp $
 */

#ifndef __SPPP_H
#define	__SPPP_H

#include <sys/dlpi.h>
#include <net/ppp_defs.h>

#ifdef	__cplusplus
extern "C" {
#endif

#if !defined(ETHERTYPE_IP)
#define	ETHERTYPE_IP	0x800
#endif

#if !defined(ETHERTYPE_IPV6)
#define	ETHERTYPE_IPV6	0x86dd
#endif

#if !defined(ETHERTYPE_PPP)
#define	ETHERTYPE_PPP	0x880b
#endif

#if !defined(ETHERTYPE_ALLSAP)
#define	ETHERTYPE_ALLSAP	0
#endif

#if !defined(PPP_ALLSAP)
#define	PPP_ALLSAP	PPP_ALLSTATIONS
#endif

/*
 * DLPI handler (function table item).
 */
struct  sppp_dlpi_pinfo_t {
	int	pi_minlen;		/* minimum primitive length */
	int	pi_state;		/* acceptable starting state */
	int	(*pi_funcp)();		/* function() to call */
};

#ifndef DL_MAXPRIM
#define	DL_MAXPRIM DL_GET_STATISTICS_ACK
#endif

/*
 * Per-attachment kstats.
 */
typedef struct sppp_kstats {
	kstat_named_t	allocbfail;
	kstat_named_t	rbytes;
	kstat_named_t	ierrors;
	kstat_named_t	ierrors_lower;
	kstat_named_t	ioctlsfwd;
	kstat_named_t	ioctlsfwdok;
	kstat_named_t	ioctlsfwderr;
	kstat_named_t	ipackets;
	kstat_named_t	ipackets_ctl;
	kstat_named_t	iqdropped;
	kstat_named_t	irunts;
	kstat_named_t	itoolongs;
	kstat_named_t	lsneedup;
	kstat_named_t	lsdown;
	kstat_named_t	mctlsfwd;
	kstat_named_t	mctlsfwderr;
	kstat_named_t	mctlsknown;
	kstat_named_t	mctlsunknown;
	kstat_named_t	obytes;
	kstat_named_t	oerrors;
	kstat_named_t	oerrors_lower;
	kstat_named_t	opackets;
	kstat_named_t	opackets_ctl;
	kstat_named_t	oqdropped;
	kstat_named_t	otoolongs;
	kstat_named_t	orunts;

	/* 64 bit entries */
	kstat_named_t	ipackets64;
	kstat_named_t	opackets64;
	kstat_named_t	rbytes64;
	kstat_named_t	obytes64;
} sppp_kstats_t;

/*
 * Same order as above.  Note that for netstat -i to work, there needs
 * to be "ipackets", "opackets", "ierrors", and "oerrors" kstat named
 * variables.
 */
#define	SPPP_KSTATS_NAMES	\
	"allocbfail", "rbytes", "ierrors", "ierrors_lower", "ioctlsfwd", \
	"ioctlsfwdok", "ioctlsfwderr", "ipackets", "ipkts_ctl", \
	"ipkts_qdropped", "ipkts_runts", "ipkts_toolong", "lsneedup", \
	"lsdown", "mctlsfwd", "mctlsfwderr", "mctlsknown", "mctlsunknown", \
	"obytes", "oerrors", "oerrors_lower", "opackets", "opkts_ctl", \
	"opkts_qdropped", "opkts_toolong", "opkts_runts"

#define	SPPP_KSTATS64_NAMES	\
	"ipackets64", "opackets64", "rbytes64", "obytes64"

/*
 * dl_addr_length needs to be equal to the absolute value of dl_sap_length,
 * in order for IP to derive a default setting for IFF_POINTOPOINT flag.
 */
typedef t_uscalar_t	spppreqsap_t;
#define	SPPP_SAPL	sizeof (spppreqsap_t)
#define	SPPP_ADDRL	SPPP_SAPL

/*
 * Per-Stream instance state information.
 *
 * Each instance is dynamically allocated at open() and free'd at close().
 * Each per-Stream instance points to at most one per-attachment structure
 * using the sps_ppa field. All instances are threaded together into one
 * list of active instances ordered on minor device number, using the
 * sps_nextmn field.
 */
typedef struct spppstr {
	/*
	 * Note that EX_st_nextmn field should never be referenced other
	 * than by the routines manipulating the global upper streams list,
	 * by first obtaining exclusive access at the outer perimeter.
	 */
	struct spppstr	*sps_nextmn;	/* next minor in global list */
	/*
	 * These fields are common to all upper streams. If this stream
	 * is attached to a ppa, then the sps_ppa field will point to the
	 * ppa structure associated with this particular upper stream.
	 */
	minor_t		sps_mn_id;	/* minor device number of this stream */
	queue_t		*sps_rq;	/* pointer to the read queue */
	uint32_t	sps_flags;	/* miscellaneous flags */
	uint32_t	sps_ioc_id;	/* last ioctl ID for this stream */
	struct sppa	*sps_ppa;	/* pointer to ppa structure */
	/*
	 * sps_nextsib is protected by the ppa's sibling lock (ppa_sib_lock),
	 * and access made to it should only be done by first ensuring that
	 * the sps_ppa field is valid, i.e., this stream has been attached.
	 */
	struct spppstr	*sps_nextsib;	/* next stream of same ppa (sibling) */
	/*
	 * These fields are common to all non-control streams, i.e., those
	 * in which a PPPIO_NEWPPA has not been issued on. Non-control
	 * streams are valid candidates for network streams, and they can
	 * only be considered network streams (ones which carry IP packets)
	 * if they are attached and bound. The only mandatory requirement
	 * for control stream is that its sps_npmode field should always
	 * be equal to NPMODE_PASS, as we obviously will never block the
	 * control stream from sending or receiving packets.
	 */
	t_scalar_t	sps_sap;	/* bound sap */
	spppreqsap_t	sps_req_sap;	/* requested sap */
	enum NPmode	sps_npmode;	/* network protocol mode */
	/*
	 * sps_dlstate is only valid for network streams in which DLPI
	 * is intended to be used to transfer network-layer data. It is set
	 * to DL_UNATTACHED for all other streams.
	 */
	t_uscalar_t	sps_dlstate;	/* current DLPI state */
	mblk_t		*sps_hangup;	/* preallocated M_HANGUP message */

	zoneid_t	sps_zoneid;	/* zone in which we were opened */
} spppstr_t;

/*
 * Values for sps_flags, and their descriptions.
 */
/*			0x00000001	unused */
#define	SPS_CONTROL	0x00000002	/* stream is a control stream */
#define	SPS_FASTPATH	0x00000004	/* stream uses IP fastpath */
#define	SPS_PROMISC	0x00000008	/* stream is promiscuous */
#define	SPS_RAWDATA	0x00000010	/* raw M_DATA, no DLPI header */
#define	SPS_PIOATTACH	0x00000020	/* attached using PPPIO_ATTACH */
#define	SPS_KDEBUG	0x00000040	/* stream has kdebug turned on */
#define	SPS_CACHED	0x00000080	/* network stream pointer is cached */
#define	SPS_IOCQ	0x00000100	/* queue ioctls */

#define	IS_SPS_CONTROL(x)	\
	((x)->sps_flags & SPS_CONTROL)
#define	IS_SPS_FASTPATH(x)	\
	((x)->sps_flags & SPS_FASTPATH)
#define	IS_SPS_PROMISC(x)	\
	((x)->sps_flags & SPS_PROMISC)
#define	IS_SPS_RAWDATA(x)	\
	((x)->sps_flags & SPS_RAWDATA)
#define	IS_SPS_PIOATTACH(x)	\
	((x)->sps_flags & SPS_PIOATTACH)
#define	IS_SPS_KDEBUG(x)	\
	((x)->sps_flags & SPS_KDEBUG)
#define	IS_SPS_CACHED(x)	\
	((x)->sps_flags & SPS_CACHED)
#define	IS_SPS_IOCQ(x)		\
	((x)->sps_flags & SPS_IOCQ)

/*
 * Bit format (octal based) string for cmn_err, which represents the flags.
 */
#define	SPS_FLAGS_STR	\
	"\020"		\
	"\1priv"	\
	"\2control"	\
	"\3fastpath"	\
	"\4promisc"	\
	"\5rawdata"	\
	"\6pioattach"	\
	"\7kdebug"	\
	"\10cached"

/*
 * Per-Attachment instance state information.
 *
 * Each instance is dynamically allocated on first attach (PPPIO_NEWPPA).
 * Allocation of this structure is only done once per control stream. A ppa
 * instance may be shared by two or more upper streams, and it is always
 * linked to the upper stream marked as the control stream (SPS_CONTROL)
 * via the ppa_ctl field.  Non-control streams are linked to ppa_streams.
 */
typedef struct sppa {
	/*
	 * Note that EX_st_nextppa field should only be accessed (walked)
	 * by the ppa manipulation routines, i.e, those which affect
	 * the global ppa list, e.g: open, close, new_ppa, and XX_attach_upper.
	 */
	struct sppa	*ppa_nextppa;	/* next attachment instance */
	/*
	 * ppa_sib_lock guards the linkages between all upper streams related
	 * to this ppa. Walking the sps_nextsib of any upper streams should
	 * be done by first holding this lock.
	 */
	krwlock_t	ppa_sib_lock;	/* lock for sibling upper streams */
	uint32_t	ppa_flags;	/* miscellaneous flags */
	int32_t		ppa_refcnt;	/* upper stream reference count */
	uint32_t	ppa_ppa_id;	/* unique attachment id */
	spppstr_t	*ppa_streams;	/* list of all non-control streams */
	spppstr_t	*ppa_ctl;	/* back pointer to control stream */
	queue_t		*ppa_lower_wq;	/* pointer to lower write queue */
	uint16_t	ppa_mru;	/* link layer maximum receive unit */
	uint16_t	ppa_mtu;	/* link layer maximum transmit unit */
	hrtime_t	ppa_lasttx;	/* last transmit time for a packet */
	hrtime_t	ppa_lastrx;	/* last receive time for a packet */
	int32_t		ppa_promicnt;	/* promiscous stream count */
	/*
	 * ppa_sta_lock mutex guards the statistic fields of this ppa, since
	 * this structure is shared by upper streams of the same ppa.
	 */
	kmutex_t	ppa_sta_lock;	/* mutex to lock structure */
	struct ppp_stats64 ppa_stats;	/* legacy stats structure */
	uint32_t	ppa_allocbfail;	/* memory allocation failure count */
	uint32_t	ppa_ierr_low;	/* errors from below during receive */
	uint32_t	ppa_ioctlsfwd;	/* total ioctl forwarded down */
	uint32_t	ppa_ioctlsfwdok;  /* and the reply sent upward */
	uint32_t	ppa_ioctlsfwderr; /* or discarded replies */
	uint32_t	ppa_ipkt_ctl;	/* received control pkts */
	uint32_t	ppa_iqdropped;	/* msg dropped due to putq error */
	uint32_t	ppa_irunts;	/* packet rcvd is too short */
	uint32_t	ppa_itoolongs;	/* packet rcvd is larger than MRU */
	uint32_t	ppa_lsneedup;	/* total LINKSTAT_NEEDUP msg sent up */
	uint32_t	ppa_lsdown;	/* total LINKSTAT_DOWN msg sent up */
	uint32_t	ppa_mctlsfwd;	/* total M_{PC}PROTO forwarded down */
	uint32_t	ppa_mctlsfwderr; /*   and discarded count */
	uint32_t	ppa_mctlsknown;	/* total known M_CTL messages */
	uint32_t	ppa_mctlsunknown; /* total unknown M_CTL messages */
	uint32_t	ppa_oerr_low;	/* errors from below during transmit */
	uint32_t	ppa_opkt_ctl;	/* transmitted control pkts */
	uint32_t	ppa_oqdropped;	/* msg dropped due to putq error */
	uint32_t	ppa_orunts;	/* packet sent is too short */
	uint32_t	ppa_otoolongs;	/* packet sent is larger than MTU */
	kstat_t		*ppa_kstats;	/* pointer to kstats structure */
	/*
	 * We keep the following pointers for performance reasons. Instead
	 * of walking the list of attached upper streams to find the
	 * destination upper stream everytime we need to send a packet up,
	 * we keep them here for easy access.
	 */
	spppstr_t	*ppa_ip_cache;	/* ptr to PPP_IP upper stream */
	spppstr_t	*ppa_ip6_cache;	/* ptr to PPP_IPV6 upper stream */

	kmutex_t	ppa_npmutex;	/* protects the 2 fields below */
	uint32_t 	ppa_npflag;	/* network protocols blocked */
	uint32_t 	ppa_holdpkts[3]; /* # of packets blocked per np */

	zoneid_t	ppa_zoneid;	/* zone where PPA is in use */
} sppa_t;

/* bit position (in ppa_npflag) for each ppp_protocol that can be blocked */
#define	NP_IP	1
#define	NP_IPV6	2

/*
 * Values for ppa_flags, and their descriptions.
 */
#define	PPA_LASTMOD	0x00000001	/* last PPP entity on the stream */
#define	PPA_TIMESTAMP	0x00000002	/* time-stamp each packet */

#define	IS_PPA_LASTMOD(x)	\
	((x)->ppa_flags & PPA_LASTMOD)
#define	IS_PPA_TIMESTAMP(x)	\
	((x)->ppa_flags & PPA_TIMESTAMP)

/*
 * Bit format (octal based) string for cmn_err, which represents the flags.
 */
#define	PPA_FLAGS_STR	\
	"\020"		\
	"\1lastmod"	\
	"\2timestamp"

/*
 * General macros.
 */
#define	SPDEBUG	printf

/*
 * Function declarations.
 */
extern int	sppp_close(queue_t *, int, cred_t *);
extern mblk_t	*sppp_dladdud(spppstr_t *, mblk_t *, t_scalar_t, boolean_t);
extern void	sppp_dlpi_pinfoinit(void);
extern void	sppp_dlprsendup(spppstr_t *, mblk_t *, t_scalar_t, boolean_t);
extern void	sppp_lrput(queue_t *, mblk_t *);
extern void	sppp_lrsrv(queue_t *);
extern void	sppp_lwsrv(queue_t *);
extern int	sppp_mproto(queue_t *, mblk_t *, spppstr_t *);
extern int	sppp_open(queue_t *, dev_t *, int, int, cred_t *);
extern void	sppp_uwput(queue_t *, mblk_t *);
extern void	sppp_uwsrv(queue_t *);
extern void	sppp_remove_ppa(spppstr_t *sps);
extern sppa_t	*sppp_find_ppa(uint32_t ppa_id);
extern sppa_t	*sppp_create_ppa(uint32_t ppa_id, zoneid_t zoneid);

#ifdef	__cplusplus
}
#endif

#endif /* __SPPP_H */