xref: /illumos-gate/usr/src/uts/common/io/ppp/sppp/sppp.c (revision d8109ce4330e1b8ad6c29f9fccacec969066bb9d)
1 /*
2  * sppp.c - Solaris STREAMS PPP multiplexing pseudo-driver
3  *
4  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
5  * Use is subject to license terms.
6  * Copyright (c) 2016 by Delphix. All rights reserved.
7  * Copyright 2019, Joyent, Inc.
8  *
9  * Permission to use, copy, modify, and distribute this software and its
10  * documentation is hereby granted, provided that the above copyright
11  * notice appears in all copies.
12  *
13  * SUN MAKES NO REPRESENTATION OR WARRANTIES ABOUT THE SUITABILITY OF
14  * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
15  * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
16  * PARTICULAR PURPOSE, OR NON-INFRINGEMENT.  SUN SHALL NOT BE LIABLE FOR
17  * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
18  * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES
19  *
20  * Copyright (c) 1994 The Australian National University.
21  * All rights reserved.
22  *
23  * Permission to use, copy, modify, and distribute this software and its
24  * documentation is hereby granted, provided that the above copyright
25  * notice appears in all copies.  This software is provided without any
26  * warranty, express or implied. The Australian National University
27  * makes no representations about the suitability of this software for
28  * any purpose.
29  *
30  * IN NO EVENT SHALL THE AUSTRALIAN NATIONAL UNIVERSITY BE LIABLE TO ANY
31  * PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
32  * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
33  * THE AUSTRALIAN NATIONAL UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY
34  * OF SUCH DAMAGE.
35  *
36  * THE AUSTRALIAN NATIONAL UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES,
37  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
38  * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
39  * ON AN "AS IS" BASIS, AND THE AUSTRALIAN NATIONAL UNIVERSITY HAS NO
40  * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
41  * OR MODIFICATIONS.
42  *
43  * This driver is derived from the original SVR4 STREAMS PPP driver
44  * originally written by Paul Mackerras <paul.mackerras@cs.anu.edu.au>.
45  *
46  * Adi Masputra <adi.masputra@sun.com> rewrote and restructured the code
47  * for improved performance and scalability.
48  */
49 
50 #define	RCSID	"$Id: sppp.c,v 1.0 2000/05/08 01:10:12 masputra Exp $"
51 
52 #include <sys/types.h>
53 #include <sys/debug.h>
54 #include <sys/param.h>
55 #include <sys/stat.h>
56 #include <sys/stream.h>
57 #include <sys/stropts.h>
58 #include <sys/sysmacros.h>
59 #include <sys/errno.h>
60 #include <sys/time.h>
61 #include <sys/cmn_err.h>
62 #include <sys/kmem.h>
63 #include <sys/conf.h>
64 #include <sys/dlpi.h>
65 #include <sys/ddi.h>
66 #include <sys/kstat.h>
67 #include <sys/strsun.h>
68 #include <sys/ethernet.h>
69 #include <sys/policy.h>
70 #include <sys/zone.h>
71 #include <net/ppp_defs.h>
72 #include <net/pppio.h>
73 #include "sppp.h"
74 #include "s_common.h"
75 
76 /*
77  * This is used to tag official Solaris sources.  Please do not define
78  * "INTERNAL_BUILD" when building this software outside of Sun Microsystems.
79  */
80 #ifdef INTERNAL_BUILD
81 /* MODINFO is limited to 32 characters. */
82 const char sppp_module_description[] = "PPP 4.0 mux";
83 #else /* INTERNAL_BUILD */
84 const char sppp_module_description[] = "ANU PPP mux";
85 
86 /* LINTED */
87 static const char buildtime[] = "Built " __DATE__ " at " __TIME__
88 #ifdef DEBUG
89 " DEBUG"
90 #endif
91 "\n";
92 #endif /* INTERNAL_BUILD */
93 
94 static void	sppp_inner_ioctl(queue_t *, mblk_t *);
95 static void	sppp_outer_ioctl(queue_t *, mblk_t *);
96 static queue_t	*sppp_send(queue_t *, mblk_t **, spppstr_t *);
97 static queue_t	*sppp_recv(queue_t *, mblk_t **, spppstr_t *);
98 static void	sppp_recv_nondata(queue_t *, mblk_t *, spppstr_t *);
99 static queue_t	*sppp_outpkt(queue_t *, mblk_t **, int, spppstr_t *);
100 static spppstr_t *sppp_inpkt(queue_t *, mblk_t *, spppstr_t *);
101 static int	sppp_kstat_update(kstat_t *, int);
102 static void	sppp_release_pkts(sppa_t *, uint16_t);
103 
104 /*
105  * sps_list contains the list of active per-stream instance state structures
106  * ordered on the minor device number (see sppp.h for details). All streams
107  * opened to this driver are threaded together in this list.
108  */
109 static spppstr_t *sps_list = NULL;
110 /*
111  * ppa_list contains the list of active per-attachment instance state
112  * structures ordered on the ppa id number (see sppp.h for details). All of
113  * the ppa structures created once per PPPIO_NEWPPA ioctl are threaded together
114  * in this list. There is exactly one ppa structure for a given PPP interface,
115  * and multiple sps streams (upper streams) may share a ppa by performing
116  * an attachment explicitly (PPPIO_ATTACH) or implicitly (DL_ATTACH_REQ).
117  */
118 static sppa_t *ppa_list = NULL;
119 
120 static const char *kstats_names[] = { SPPP_KSTATS_NAMES };
121 static const char *kstats64_names[] = { SPPP_KSTATS64_NAMES };
122 
123 /*
124  * map proto (which is an IANA defined ppp network protocol) to
125  * a bit position indicated by NP_* in ppa_npflag
126  */
127 static uint32_t
128 sppp_ppp2np(uint16_t proto)
129 {
130 	switch (proto) {
131 	case PPP_IP:
132 		return (NP_IP);
133 	case PPP_IPV6:
134 		return (NP_IPV6);
135 	default:
136 		return (0);
137 	}
138 }
139 
140 /*
141  * sppp_open()
142  *
143  * MT-Perimeters:
144  *    exclusive inner, exclusive outer.
145  *
146  * Description:
147  *    Common open procedure for module.
148  */
149 /* ARGSUSED */
150 int
151 sppp_open(queue_t *q, dev_t *devp, int oflag, int sflag, cred_t *credp)
152 {
153 	spppstr_t	*sps;
154 	spppstr_t	**nextmn;
155 	minor_t		mn;
156 
157 	ASSERT(q != NULL && devp != NULL);
158 	ASSERT(sflag != MODOPEN);
159 
160 	if (q->q_ptr != NULL) {
161 		return (0);		/* already open */
162 	}
163 	if (sflag != CLONEOPEN) {
164 		return (OPENFAIL);
165 	}
166 	/*
167 	 * The sps list is sorted using the minor number as the key. The
168 	 * following code walks the list to find the lowest valued minor
169 	 * number available to be used.
170 	 */
171 	mn = 0;
172 	for (nextmn = &sps_list; (sps = *nextmn) != NULL;
173 	    nextmn = &sps->sps_nextmn) {
174 		if (sps->sps_mn_id != mn) {
175 			break;
176 		}
177 		++mn;
178 	}
179 	sps = (spppstr_t *)kmem_zalloc(sizeof (spppstr_t), KM_SLEEP);
180 	ASSERT(sps != NULL);		/* KM_SLEEP must never return NULL */
181 	sps->sps_nextmn = *nextmn;	/* insert stream in global list */
182 	*nextmn = sps;
183 	sps->sps_mn_id = mn;		/* save minor id for this stream */
184 	sps->sps_rq = q;		/* save read queue pointer */
185 	sps->sps_sap = -1;		/* no sap bound to stream */
186 	sps->sps_dlstate = DL_UNATTACHED; /* dlpi state is unattached */
187 	sps->sps_npmode = NPMODE_DROP;	/* drop all packets initially */
188 	sps->sps_zoneid = crgetzoneid(credp);
189 	q->q_ptr = WR(q)->q_ptr = (caddr_t)sps;
190 	/*
191 	 * We explicitly disable the automatic queue scheduling for the
192 	 * write-side to obtain complete control over queuing during transmit.
193 	 * Packets will be queued at the upper write queue and the service
194 	 * routine will not be called until it gets scheduled by having the
195 	 * lower write service routine call the qenable(WR(uq)) for all streams
196 	 * attached to the same ppa instance.
197 	 */
198 	noenable(WR(q));
199 	*devp = makedevice(getmajor(*devp), mn);
200 	qprocson(q);
201 	return (0);
202 }
203 
204 /*
205  * Free storage used by a PPA.  This is not called until the last PPA
206  * user closes their connection or reattaches to a different PPA.
207  */
208 static void
209 sppp_free_ppa(sppa_t *ppa)
210 {
211 	sppa_t **nextppa;
212 
213 	ASSERT(ppa->ppa_refcnt == 1);
214 	if (ppa->ppa_kstats != NULL) {
215 		kstat_delete(ppa->ppa_kstats);
216 		ppa->ppa_kstats = NULL;
217 	}
218 	mutex_destroy(&ppa->ppa_sta_lock);
219 	mutex_destroy(&ppa->ppa_npmutex);
220 	rw_destroy(&ppa->ppa_sib_lock);
221 	nextppa = &ppa_list;
222 	while (*nextppa != NULL) {
223 		if (*nextppa == ppa) {
224 			*nextppa = ppa->ppa_nextppa;
225 			break;
226 		}
227 		nextppa = &(*nextppa)->ppa_nextppa;
228 	}
229 	kmem_free(ppa, sizeof (*ppa));
230 }
231 
232 /*
233  * Create a new PPA.  Caller must be exclusive on outer perimeter.
234  */
235 sppa_t *
236 sppp_create_ppa(uint32_t ppa_id, zoneid_t zoneid)
237 {
238 	sppa_t *ppa;
239 	sppa_t *curppa;
240 	sppa_t **availppa;
241 	char unit[32];		/* Unit name */
242 	const char **cpp;
243 	kstat_t *ksp;
244 	kstat_named_t *knt;
245 
246 	/*
247 	 * NOTE: unit *must* be named for the driver
248 	 * name plus the ppa number so that netstat
249 	 * can find the statistics.
250 	 */
251 	(void) sprintf(unit, "%s" "%d", PPP_DRV_NAME, ppa_id);
252 	/*
253 	 * Make sure we can allocate a buffer to
254 	 * contain the ppa to be sent upstream, as
255 	 * well as the actual ppa structure and its
256 	 * associated kstat structure.
257 	 */
258 	ppa = (sppa_t *)kmem_zalloc(sizeof (sppa_t),
259 	    KM_NOSLEEP);
260 	ksp = kstat_create(PPP_DRV_NAME, ppa_id, unit, "net", KSTAT_TYPE_NAMED,
261 	    sizeof (sppp_kstats_t) / sizeof (kstat_named_t), 0);
262 
263 	if (ppa == NULL || ksp == NULL) {
264 		if (ppa != NULL) {
265 			kmem_free(ppa, sizeof (sppa_t));
266 		}
267 		if (ksp != NULL) {
268 			kstat_delete(ksp);
269 		}
270 		return (NULL);
271 	}
272 	ppa->ppa_kstats = ksp;		/* chain kstat structure */
273 	ppa->ppa_ppa_id = ppa_id;	/* record ppa id */
274 	ppa->ppa_zoneid = zoneid;	/* zone that owns this PPA */
275 	ppa->ppa_mtu = PPP_MAXMTU;	/* 65535-(PPP_HDRLEN+PPP_FCSLEN) */
276 	ppa->ppa_mru = PPP_MAXMRU;	/* 65000 */
277 
278 	mutex_init(&ppa->ppa_sta_lock, NULL, MUTEX_DRIVER, NULL);
279 	mutex_init(&ppa->ppa_npmutex, NULL, MUTEX_DRIVER, NULL);
280 	rw_init(&ppa->ppa_sib_lock, NULL, RW_DRIVER, NULL);
281 
282 	/*
283 	 * Prepare and install kstat counters.  Note that for netstat
284 	 * -i to work, there needs to be "ipackets", "opackets",
285 	 * "ierrors", and "oerrors" kstat named variables.
286 	 */
287 	knt = (kstat_named_t *)ksp->ks_data;
288 	for (cpp = kstats_names; cpp < kstats_names + Dim(kstats_names);
289 	    cpp++) {
290 		kstat_named_init(knt, *cpp, KSTAT_DATA_UINT32);
291 		knt++;
292 	}
293 	for (cpp = kstats64_names; cpp < kstats64_names + Dim(kstats64_names);
294 	    cpp++) {
295 		kstat_named_init(knt, *cpp, KSTAT_DATA_UINT64);
296 		knt++;
297 	}
298 	ksp->ks_update = sppp_kstat_update;
299 	ksp->ks_private = (void *)ppa;
300 	kstat_install(ksp);
301 
302 	/* link to the next ppa and insert into global list */
303 	availppa = &ppa_list;
304 	while ((curppa = *availppa) != NULL) {
305 		if (ppa_id < curppa->ppa_ppa_id)
306 			break;
307 		availppa = &curppa->ppa_nextppa;
308 	}
309 	ppa->ppa_nextppa = *availppa;
310 	*availppa = ppa;
311 	return (ppa);
312 }
313 
314 /*
315  * sppp_close()
316  *
317  * MT-Perimeters:
318  *    exclusive inner, exclusive outer.
319  *
320  * Description:
321  *    Common close procedure for module.
322  */
323 /* ARGSUSED */
324 int
325 sppp_close(queue_t *q, int flags __unused, cred_t *credp __unused)
326 {
327 	spppstr_t	*sps;
328 	spppstr_t	**nextmn;
329 	spppstr_t	*sib;
330 	sppa_t		*ppa;
331 	mblk_t		*mp;
332 
333 	ASSERT(q != NULL && q->q_ptr != NULL);
334 	sps = (spppstr_t *)q->q_ptr;
335 	qprocsoff(q);
336 
337 	ppa = sps->sps_ppa;
338 	if (ppa == NULL) {
339 		ASSERT(!IS_SPS_CONTROL(sps));
340 		goto close_unattached;
341 	}
342 	if (IS_SPS_CONTROL(sps)) {
343 		uint32_t	cnt = 0;
344 
345 		ASSERT(ppa != NULL);
346 		ASSERT(ppa->ppa_ctl == sps);
347 		ppa->ppa_ctl = NULL;
348 		/*
349 		 * STREAMS framework always issues I_UNLINK prior to close,
350 		 * since we only allow I_LINK under the control stream.
351 		 * A given ppa structure has at most one lower stream pointed
352 		 * by the ppa_lower_wq field, because we only allow a single
353 		 * linkage (I_LINK) to be done on the control stream.
354 		 */
355 		ASSERT(ppa->ppa_lower_wq == NULL);
356 		/*
357 		 * Walk through all of sibling streams attached to this ppa,
358 		 * and remove all references to this ppa. We have exclusive
359 		 * access for the entire driver here, so there's no need
360 		 * to hold ppa_sib_lock.
361 		 */
362 		cnt++;
363 		sib = ppa->ppa_streams;
364 		while (sib != NULL) {
365 			ASSERT(ppa == sib->sps_ppa);
366 			sib->sps_npmode = NPMODE_DROP;
367 			sib->sps_flags &= ~(SPS_PIOATTACH | SPS_CACHED);
368 			/*
369 			 * There should be a preallocated hangup
370 			 * message here.  Fetch it and send it up to
371 			 * the stream head.  This will cause IP to
372 			 * mark the interface as "down."
373 			 */
374 			if ((mp = sib->sps_hangup) != NULL) {
375 				sib->sps_hangup = NULL;
376 				/*
377 				 * M_HANGUP works with IP, but snoop
378 				 * is lame and requires M_ERROR.  Send
379 				 * up a clean error code instead.
380 				 *
381 				 * XXX if snoop is fixed, fix this, too.
382 				 */
383 				MTYPE(mp) = M_ERROR;
384 				*mp->b_wptr++ = ENXIO;
385 				putnext(sib->sps_rq, mp);
386 			}
387 			qenable(WR(sib->sps_rq));
388 			cnt++;
389 			sib = sib->sps_nextsib;
390 		}
391 		ASSERT(ppa->ppa_refcnt == cnt);
392 	} else {
393 		ASSERT(ppa->ppa_streams != NULL);
394 		ASSERT(ppa->ppa_ctl != sps);
395 		mp = NULL;
396 		if (sps->sps_sap == PPP_IP) {
397 			ppa->ppa_ip_cache = NULL;
398 			mp = create_lsmsg(PPP_LINKSTAT_IPV4_UNBOUND);
399 		} else if (sps->sps_sap == PPP_IPV6) {
400 			ppa->ppa_ip6_cache = NULL;
401 			mp = create_lsmsg(PPP_LINKSTAT_IPV6_UNBOUND);
402 		}
403 		/* Tell the daemon the bad news. */
404 		if (mp != NULL && ppa->ppa_ctl != NULL &&
405 		    (sps->sps_npmode == NPMODE_PASS ||
406 		    sps->sps_npmode == NPMODE_QUEUE)) {
407 			putnext(ppa->ppa_ctl->sps_rq, mp);
408 		} else {
409 			freemsg(mp);
410 		}
411 		/*
412 		 * Walk through all of sibling streams attached to the
413 		 * same ppa, and remove this stream from the sibling
414 		 * streams list. We have exclusive access for the
415 		 * entire driver here, so there's no need to hold
416 		 * ppa_sib_lock.
417 		 */
418 		sib = ppa->ppa_streams;
419 		if (sib == sps) {
420 			ppa->ppa_streams = sps->sps_nextsib;
421 		} else {
422 			while (sib->sps_nextsib != NULL) {
423 				if (sib->sps_nextsib == sps) {
424 					sib->sps_nextsib = sps->sps_nextsib;
425 					break;
426 				}
427 				sib = sib->sps_nextsib;
428 			}
429 		}
430 		sps->sps_nextsib = NULL;
431 		freemsg(sps->sps_hangup);
432 		sps->sps_hangup = NULL;
433 		/*
434 		 * Check if this is a promiscous stream. If the SPS_PROMISC bit
435 		 * is still set, it means that the stream is closed without
436 		 * ever having issued DL_DETACH_REQ or DL_PROMISCOFF_REQ.
437 		 * In this case, we simply decrement the promiscous counter,
438 		 * and it's safe to do it without holding ppa_sib_lock since
439 		 * we're exclusive (inner and outer) at this point.
440 		 */
441 		if (IS_SPS_PROMISC(sps)) {
442 			ASSERT(ppa->ppa_promicnt > 0);
443 			ppa->ppa_promicnt--;
444 		}
445 	}
446 	/* If we're the only one left, then delete now. */
447 	if (ppa->ppa_refcnt <= 1)
448 		sppp_free_ppa(ppa);
449 	else
450 		ppa->ppa_refcnt--;
451 close_unattached:
452 	q->q_ptr = WR(q)->q_ptr = NULL;
453 	for (nextmn = &sps_list; *nextmn != NULL;
454 	    nextmn = &(*nextmn)->sps_nextmn) {
455 		if (*nextmn == sps) {
456 			*nextmn = sps->sps_nextmn;
457 			break;
458 		}
459 	}
460 	kmem_free(sps, sizeof (spppstr_t));
461 	return (0);
462 }
463 
464 static void
465 sppp_ioctl(struct queue *q, mblk_t *mp)
466 {
467 	spppstr_t	*sps;
468 	spppstr_t	*nextsib;
469 	sppa_t		*ppa;
470 	struct iocblk	*iop;
471 	mblk_t		*nmp;
472 	enum NPmode	npmode;
473 	struct ppp_idle	*pip;
474 	struct ppp_stats64 *psp;
475 	struct ppp_comp_stats *pcsp;
476 	hrtime_t	hrtime;
477 	int		sap;
478 	int		count = 0;
479 	int		error = EINVAL;
480 
481 	sps = (spppstr_t *)q->q_ptr;
482 	ppa = sps->sps_ppa;
483 
484 	iop = (struct iocblk *)mp->b_rptr;
485 	switch (iop->ioc_cmd) {
486 	case PPPIO_NPMODE:
487 		if (!IS_SPS_CONTROL(sps)) {
488 			break;		/* return EINVAL */
489 		} else if (iop->ioc_count != 2 * sizeof (uint32_t) ||
490 		    (mp->b_cont == NULL)) {
491 			error = EPROTO;
492 			break;
493 		}
494 		ASSERT(ppa != NULL);
495 		ASSERT(mp->b_cont->b_rptr != NULL);
496 		ASSERT(sps->sps_npmode == NPMODE_PASS);
497 		sap = ((uint32_t *)mp->b_cont->b_rptr)[0];
498 		npmode = (enum NPmode)((uint32_t *)mp->b_cont->b_rptr)[1];
499 		/*
500 		 * Walk the sibling streams which belong to the same
501 		 * ppa, and try to find a stream with matching sap
502 		 * number.
503 		 */
504 		rw_enter(&ppa->ppa_sib_lock, RW_WRITER);
505 		for (nextsib = ppa->ppa_streams; nextsib != NULL;
506 		    nextsib = nextsib->sps_nextsib) {
507 			if (nextsib->sps_sap == sap) {
508 				break;	/* found it */
509 			}
510 		}
511 		if (nextsib == NULL) {
512 			rw_exit(&ppa->ppa_sib_lock);
513 			break;		/* return EINVAL */
514 		} else {
515 			nextsib->sps_npmode = npmode;
516 			if ((nextsib->sps_npmode != NPMODE_QUEUE) &&
517 			    (WR(nextsib->sps_rq)->q_first != NULL)) {
518 				qenable(WR(nextsib->sps_rq));
519 			}
520 		}
521 		rw_exit(&ppa->ppa_sib_lock);
522 		error = 0;	/* return success */
523 		break;
524 	case PPPIO_GIDLE:
525 		if (ppa == NULL) {
526 			ASSERT(!IS_SPS_CONTROL(sps));
527 			error = ENOLINK;
528 			break;
529 		} else if (!IS_PPA_TIMESTAMP(ppa)) {
530 			break;		/* return EINVAL */
531 		}
532 		if ((nmp = allocb(sizeof (struct ppp_idle),
533 		    BPRI_MED)) == NULL) {
534 			mutex_enter(&ppa->ppa_sta_lock);
535 			ppa->ppa_allocbfail++;
536 			mutex_exit(&ppa->ppa_sta_lock);
537 			error = ENOSR;
538 			break;
539 		}
540 		if (mp->b_cont != NULL) {
541 			freemsg(mp->b_cont);
542 		}
543 		mp->b_cont = nmp;
544 		pip = (struct ppp_idle *)nmp->b_wptr;
545 		nmp->b_wptr += sizeof (struct ppp_idle);
546 		/*
547 		 * Get current timestamp and subtract the tx and rx
548 		 * timestamps to get the actual idle time to be
549 		 * returned.
550 		 */
551 		hrtime = gethrtime();
552 		pip->xmit_idle = (hrtime - ppa->ppa_lasttx) / 1000000000ul;
553 		pip->recv_idle = (hrtime - ppa->ppa_lastrx) / 1000000000ul;
554 		count = msgsize(nmp);
555 		error = 0;
556 		break;		/* return success (error is 0) */
557 	case PPPIO_GTYPE:
558 		nmp = allocb(sizeof (uint32_t), BPRI_MED);
559 		if (nmp == NULL) {
560 			error = ENOSR;
561 			break;
562 		}
563 		if (mp->b_cont != NULL) {
564 			freemsg(mp->b_cont);
565 		}
566 		mp->b_cont = nmp;
567 		/*
568 		 * Let the requestor know that we are the PPP
569 		 * multiplexer (PPPTYP_MUX).
570 		 */
571 		*(uint32_t *)nmp->b_wptr = PPPTYP_MUX;
572 		nmp->b_wptr += sizeof (uint32_t);
573 		count = msgsize(nmp);
574 		error = 0;		/* return success */
575 		break;
576 	case PPPIO_GETSTAT64:
577 		if (ppa == NULL) {
578 			break;		/* return EINVAL */
579 		} else if ((ppa->ppa_lower_wq != NULL) &&
580 		    !IS_PPA_LASTMOD(ppa)) {
581 			mutex_enter(&ppa->ppa_sta_lock);
582 			/*
583 			 * We match sps_ioc_id on the M_IOC{ACK,NAK},
584 			 * so if the response hasn't come back yet,
585 			 * new ioctls must be queued instead.
586 			 */
587 			if (IS_SPS_IOCQ(sps)) {
588 				mutex_exit(&ppa->ppa_sta_lock);
589 				if (!putq(q, mp)) {
590 					error = EAGAIN;
591 					break;
592 				}
593 				return;
594 			} else {
595 				ppa->ppa_ioctlsfwd++;
596 				/*
597 				 * Record the ioctl CMD & ID - this will be
598 				 * used to check the ACK or NAK responses
599 				 * coming from below.
600 				 */
601 				sps->sps_ioc_id = iop->ioc_id;
602 				sps->sps_flags |= SPS_IOCQ;
603 				mutex_exit(&ppa->ppa_sta_lock);
604 			}
605 			putnext(ppa->ppa_lower_wq, mp);
606 			return;	/* don't ack or nak the request */
607 		}
608 		nmp = allocb(sizeof (*psp), BPRI_MED);
609 		if (nmp == NULL) {
610 			mutex_enter(&ppa->ppa_sta_lock);
611 			ppa->ppa_allocbfail++;
612 			mutex_exit(&ppa->ppa_sta_lock);
613 			error = ENOSR;
614 			break;
615 		}
616 		if (mp->b_cont != NULL) {
617 			freemsg(mp->b_cont);
618 		}
619 		mp->b_cont = nmp;
620 		psp = (struct ppp_stats64 *)nmp->b_wptr;
621 		/*
622 		 * Copy the contents of ppp_stats64 structure for this
623 		 * ppa and return them to the caller.
624 		 */
625 		mutex_enter(&ppa->ppa_sta_lock);
626 		bcopy(&ppa->ppa_stats, psp, sizeof (*psp));
627 		mutex_exit(&ppa->ppa_sta_lock);
628 		nmp->b_wptr += sizeof (*psp);
629 		count = sizeof (*psp);
630 		error = 0;		/* return success */
631 		break;
632 	case PPPIO_GETCSTAT:
633 		if (ppa == NULL) {
634 			break;		/* return EINVAL */
635 		} else if ((ppa->ppa_lower_wq != NULL) &&
636 		    !IS_PPA_LASTMOD(ppa)) {
637 			mutex_enter(&ppa->ppa_sta_lock);
638 			/*
639 			 * See comments in PPPIO_GETSTAT64 case
640 			 * in sppp_ioctl().
641 			 */
642 			if (IS_SPS_IOCQ(sps)) {
643 				mutex_exit(&ppa->ppa_sta_lock);
644 				if (!putq(q, mp)) {
645 					error = EAGAIN;
646 					break;
647 				}
648 				return;
649 			} else {
650 				ppa->ppa_ioctlsfwd++;
651 				/*
652 				 * Record the ioctl CMD & ID - this will be
653 				 * used to check the ACK or NAK responses
654 				 * coming from below.
655 				 */
656 				sps->sps_ioc_id = iop->ioc_id;
657 				sps->sps_flags |= SPS_IOCQ;
658 				mutex_exit(&ppa->ppa_sta_lock);
659 			}
660 			putnext(ppa->ppa_lower_wq, mp);
661 			return;	/* don't ack or nak the request */
662 		}
663 		nmp = allocb(sizeof (struct ppp_comp_stats), BPRI_MED);
664 		if (nmp == NULL) {
665 			mutex_enter(&ppa->ppa_sta_lock);
666 			ppa->ppa_allocbfail++;
667 			mutex_exit(&ppa->ppa_sta_lock);
668 			error = ENOSR;
669 			break;
670 		}
671 		if (mp->b_cont != NULL) {
672 			freemsg(mp->b_cont);
673 		}
674 		mp->b_cont = nmp;
675 		pcsp = (struct ppp_comp_stats *)nmp->b_wptr;
676 		nmp->b_wptr += sizeof (struct ppp_comp_stats);
677 		bzero((caddr_t)pcsp, sizeof (struct ppp_comp_stats));
678 		count = msgsize(nmp);
679 		error = 0;		/* return success */
680 		break;
681 	}
682 
683 	if (error == 0) {
684 		/* Success; tell the user. */
685 		miocack(q, mp, count, 0);
686 	} else {
687 		/* Failure; send error back upstream. */
688 		miocnak(q, mp, 0, error);
689 	}
690 }
691 
692 /*
693  * sppp_uwput()
694  *
695  * MT-Perimeters:
696  *    shared inner, shared outer.
697  *
698  * Description:
699  *    Upper write-side put procedure. Messages from above arrive here.
700  */
701 int
702 sppp_uwput(queue_t *q, mblk_t *mp)
703 {
704 	queue_t		*nextq;
705 	spppstr_t	*sps;
706 	sppa_t		*ppa;
707 	struct iocblk	*iop;
708 	int		error;
709 
710 	ASSERT(q != NULL && q->q_ptr != NULL);
711 	ASSERT(mp != NULL && mp->b_rptr != NULL);
712 	sps = (spppstr_t *)q->q_ptr;
713 	ppa = sps->sps_ppa;
714 
715 	switch (MTYPE(mp)) {
716 	case M_PCPROTO:
717 	case M_PROTO:
718 		if (IS_SPS_CONTROL(sps)) {
719 			ASSERT(ppa != NULL);
720 			/*
721 			 * Intentionally change this to a high priority
722 			 * message so it doesn't get queued up. M_PROTO is
723 			 * specifically used for signalling between pppd and its
724 			 * kernel-level component(s), such as ppptun, so we
725 			 * make sure that it doesn't get queued up behind
726 			 * data messages.
727 			 */
728 			MTYPE(mp) = M_PCPROTO;
729 			if ((ppa->ppa_lower_wq != NULL) &&
730 			    canputnext(ppa->ppa_lower_wq)) {
731 				mutex_enter(&ppa->ppa_sta_lock);
732 				ppa->ppa_mctlsfwd++;
733 				mutex_exit(&ppa->ppa_sta_lock);
734 				putnext(ppa->ppa_lower_wq, mp);
735 			} else {
736 				mutex_enter(&ppa->ppa_sta_lock);
737 				ppa->ppa_mctlsfwderr++;
738 				mutex_exit(&ppa->ppa_sta_lock);
739 				freemsg(mp);
740 			}
741 		} else {
742 			(void) sppp_mproto(q, mp, sps);
743 			return (0);
744 		}
745 		break;
746 	case M_DATA:
747 		if ((nextq = sppp_send(q, &mp, sps)) != NULL)
748 			putnext(nextq, mp);
749 		break;
750 	case M_IOCTL:
751 		error = EINVAL;
752 		iop = (struct iocblk *)mp->b_rptr;
753 		switch (iop->ioc_cmd) {
754 		case DLIOCRAW:
755 		case DL_IOC_HDR_INFO:
756 		case PPPIO_ATTACH:
757 		case PPPIO_DEBUG:
758 		case PPPIO_DETACH:
759 		case PPPIO_LASTMOD:
760 		case PPPIO_MRU:
761 		case PPPIO_MTU:
762 		case PPPIO_USETIMESTAMP:
763 		case PPPIO_BLOCKNP:
764 		case PPPIO_UNBLOCKNP:
765 			qwriter(q, mp, sppp_inner_ioctl, PERIM_INNER);
766 			return (0);
767 		case I_LINK:
768 		case I_UNLINK:
769 		case PPPIO_NEWPPA:
770 			qwriter(q, mp, sppp_outer_ioctl, PERIM_OUTER);
771 			return (0);
772 		case PPPIO_NPMODE:
773 		case PPPIO_GIDLE:
774 		case PPPIO_GTYPE:
775 		case PPPIO_GETSTAT64:
776 		case PPPIO_GETCSTAT:
777 			/*
778 			 * These require additional auto variables to
779 			 * handle, so (for optimization reasons)
780 			 * they're moved off to a separate function.
781 			 */
782 			sppp_ioctl(q, mp);
783 			return (0);
784 		case PPPIO_GETSTAT:
785 			break;			/* 32 bit interface gone */
786 		default:
787 			if (iop->ioc_cr == NULL ||
788 			    secpolicy_ppp_config(iop->ioc_cr) != 0) {
789 				error = EPERM;
790 				break;
791 			} else if ((ppa == NULL) ||
792 			    (ppa->ppa_lower_wq == NULL)) {
793 				break;		/* return EINVAL */
794 			}
795 			mutex_enter(&ppa->ppa_sta_lock);
796 			/*
797 			 * See comments in PPPIO_GETSTAT64 case
798 			 * in sppp_ioctl().
799 			 */
800 			if (IS_SPS_IOCQ(sps)) {
801 				mutex_exit(&ppa->ppa_sta_lock);
802 				if (!putq(q, mp)) {
803 					error = EAGAIN;
804 					break;
805 				}
806 				return (0);
807 			} else {
808 				ppa->ppa_ioctlsfwd++;
809 				/*
810 				 * Record the ioctl CMD & ID -
811 				 * this will be used to check the
812 				 * ACK or NAK responses coming from below.
813 				 */
814 				sps->sps_ioc_id = iop->ioc_id;
815 				sps->sps_flags |= SPS_IOCQ;
816 				mutex_exit(&ppa->ppa_sta_lock);
817 			}
818 			putnext(ppa->ppa_lower_wq, mp);
819 			return (0);	/* don't ack or nak the request */
820 		}
821 		/* Failure; send error back upstream. */
822 		miocnak(q, mp, 0, error);
823 		break;
824 	case M_FLUSH:
825 		if (*mp->b_rptr & FLUSHW) {
826 			flushq(q, FLUSHDATA);
827 		}
828 		if (*mp->b_rptr & FLUSHR) {
829 			*mp->b_rptr &= ~FLUSHW;
830 			qreply(q, mp);
831 		} else {
832 			freemsg(mp);
833 		}
834 		break;
835 	default:
836 		freemsg(mp);
837 		break;
838 	}
839 	return (0);
840 }
841 
842 /*
843  * sppp_uwsrv()
844  *
845  * MT-Perimeters:
846  *    exclusive inner, shared outer.
847  *
848  * Description:
849  *    Upper write-side service procedure. Note that this procedure does
850  *    not get called when a message is placed on our write-side queue, since
851  *    automatic queue scheduling has been turned off by noenable() when
852  *    the queue was opened. We do this on purpose, as we explicitly control
853  *    the write-side queue. Therefore, this procedure gets called when
854  *    the lower write service procedure qenable() the upper write stream queue.
855  */
856 int
857 sppp_uwsrv(queue_t *q)
858 {
859 	spppstr_t	*sps;
860 	sppa_t		*ppa;
861 	mblk_t		*mp;
862 	queue_t		*nextq;
863 	struct iocblk	*iop;
864 
865 	ASSERT(q != NULL && q->q_ptr != NULL);
866 	sps = (spppstr_t *)q->q_ptr;
867 
868 	while ((mp = getq(q)) != NULL) {
869 		if (MTYPE(mp) == M_IOCTL) {
870 			ppa = sps->sps_ppa;
871 			if ((ppa == NULL) || (ppa->ppa_lower_wq == NULL)) {
872 				miocnak(q, mp, 0, EINVAL);
873 				continue;
874 			}
875 
876 			iop = (struct iocblk *)mp->b_rptr;
877 			mutex_enter(&ppa->ppa_sta_lock);
878 			/*
879 			 * See comments in PPPIO_GETSTAT64 case
880 			 * in sppp_ioctl().
881 			 */
882 			if (IS_SPS_IOCQ(sps)) {
883 				mutex_exit(&ppa->ppa_sta_lock);
884 				if (putbq(q, mp) == 0)
885 					miocnak(q, mp, 0, EAGAIN);
886 				break;
887 			} else {
888 				ppa->ppa_ioctlsfwd++;
889 				sps->sps_ioc_id = iop->ioc_id;
890 				sps->sps_flags |= SPS_IOCQ;
891 				mutex_exit(&ppa->ppa_sta_lock);
892 				putnext(ppa->ppa_lower_wq, mp);
893 			}
894 		} else if ((nextq =
895 		    sppp_outpkt(q, &mp, msgdsize(mp), sps)) == NULL) {
896 			if (mp != NULL) {
897 				if (putbq(q, mp) == 0)
898 					freemsg(mp);
899 				break;
900 			}
901 		} else {
902 			putnext(nextq, mp);
903 		}
904 	}
905 	return (0);
906 }
907 
908 void
909 sppp_remove_ppa(spppstr_t *sps)
910 {
911 	spppstr_t *nextsib;
912 	sppa_t *ppa = sps->sps_ppa;
913 
914 	rw_enter(&ppa->ppa_sib_lock, RW_WRITER);
915 	if (ppa->ppa_refcnt <= 1) {
916 		rw_exit(&ppa->ppa_sib_lock);
917 		sppp_free_ppa(ppa);
918 	} else {
919 		nextsib = ppa->ppa_streams;
920 		if (nextsib == sps) {
921 			ppa->ppa_streams = sps->sps_nextsib;
922 		} else {
923 			while (nextsib->sps_nextsib != NULL) {
924 				if (nextsib->sps_nextsib == sps) {
925 					nextsib->sps_nextsib =
926 					    sps->sps_nextsib;
927 					break;
928 				}
929 				nextsib = nextsib->sps_nextsib;
930 			}
931 		}
932 		ppa->ppa_refcnt--;
933 		/*
934 		 * And if this stream was marked as promiscuous
935 		 * (SPS_PROMISC), then we need to update the
936 		 * promiscuous streams count. This should only happen
937 		 * when DL_DETACH_REQ is issued prior to marking the
938 		 * stream as non-promiscuous, through
939 		 * DL_PROMISCOFF_REQ request.
940 		 */
941 		if (IS_SPS_PROMISC(sps)) {
942 			ASSERT(ppa->ppa_promicnt > 0);
943 			ppa->ppa_promicnt--;
944 		}
945 		rw_exit(&ppa->ppa_sib_lock);
946 	}
947 	sps->sps_nextsib = NULL;
948 	sps->sps_ppa = NULL;
949 	freemsg(sps->sps_hangup);
950 	sps->sps_hangup = NULL;
951 }
952 
953 sppa_t *
954 sppp_find_ppa(uint32_t ppa_id)
955 {
956 	sppa_t *ppa;
957 
958 	for (ppa = ppa_list; ppa != NULL; ppa = ppa->ppa_nextppa) {
959 		if (ppa->ppa_ppa_id == ppa_id) {
960 			break;	/* found the ppa */
961 		}
962 	}
963 	return (ppa);
964 }
965 
966 /*
967  * sppp_inner_ioctl()
968  *
969  * MT-Perimeters:
970  *    exclusive inner, shared outer
971  *
972  * Description:
973  *    Called by sppp_uwput as a result of receiving ioctls which require
974  *    an exclusive access at the inner perimeter.
975  */
976 static void
977 sppp_inner_ioctl(queue_t *q, mblk_t *mp)
978 {
979 	spppstr_t	*sps;
980 	sppa_t		*ppa;
981 	struct iocblk	*iop;
982 	mblk_t		*nmp;
983 	int		error = EINVAL;
984 	int		count = 0;
985 	int		dbgcmd;
986 	int		mru, mtu;
987 	uint32_t	ppa_id;
988 	hrtime_t	hrtime;
989 	uint16_t	proto;
990 
991 	ASSERT(q != NULL && q->q_ptr != NULL);
992 	ASSERT(mp != NULL && mp->b_rptr != NULL);
993 
994 	sps = (spppstr_t *)q->q_ptr;
995 	ppa = sps->sps_ppa;
996 	iop = (struct iocblk *)mp->b_rptr;
997 	switch (iop->ioc_cmd) {
998 	case DLIOCRAW:
999 		if (IS_SPS_CONTROL(sps)) {
1000 			break;		/* return EINVAL */
1001 		}
1002 		sps->sps_flags |= SPS_RAWDATA;
1003 		error = 0;		/* return success */
1004 		break;
1005 	case DL_IOC_HDR_INFO:
1006 		if (IS_SPS_CONTROL(sps)) {
1007 			break;		/* return EINVAL */
1008 		} else if ((mp->b_cont == NULL) ||
1009 		    *((t_uscalar_t *)mp->b_cont->b_rptr) != DL_UNITDATA_REQ ||
1010 		    (MBLKL(mp->b_cont) < (sizeof (dl_unitdata_req_t) +
1011 		    SPPP_ADDRL))) {
1012 			error = EPROTO;
1013 			break;
1014 		} else if (ppa == NULL) {
1015 			error = ENOLINK;
1016 			break;
1017 		}
1018 		if ((nmp = allocb(PPP_HDRLEN, BPRI_MED)) == NULL) {
1019 			mutex_enter(&ppa->ppa_sta_lock);
1020 			ppa->ppa_allocbfail++;
1021 			mutex_exit(&ppa->ppa_sta_lock);
1022 			error = ENOMEM;
1023 			break;
1024 		}
1025 		*(uchar_t *)nmp->b_wptr++ = PPP_ALLSTATIONS;
1026 		*(uchar_t *)nmp->b_wptr++ = PPP_UI;
1027 		*(uchar_t *)nmp->b_wptr++ = sps->sps_sap >> 8;
1028 		*(uchar_t *)nmp->b_wptr++ = sps->sps_sap & 0xff;
1029 		ASSERT(MBLKL(nmp) == PPP_HDRLEN);
1030 
1031 		linkb(mp, nmp);
1032 		sps->sps_flags |= SPS_FASTPATH;
1033 		error = 0;		/* return success */
1034 		count = msgsize(nmp);
1035 		break;
1036 	case PPPIO_ATTACH:
1037 		if (IS_SPS_CONTROL(sps) || IS_SPS_PIOATTACH(sps) ||
1038 		    (sps->sps_dlstate != DL_UNATTACHED) ||
1039 		    (iop->ioc_count != sizeof (uint32_t))) {
1040 			break;		/* return EINVAL */
1041 		} else if (mp->b_cont == NULL) {
1042 			error = EPROTO;
1043 			break;
1044 		}
1045 		ASSERT(mp->b_cont->b_rptr != NULL);
1046 		/* If there's something here, it's detached. */
1047 		if (ppa != NULL) {
1048 			sppp_remove_ppa(sps);
1049 		}
1050 		ppa_id = *(uint32_t *)mp->b_cont->b_rptr;
1051 		ppa = sppp_find_ppa(ppa_id);
1052 		/*
1053 		 * If we can't find it, then it's either because the requestor
1054 		 * has supplied a wrong ppa_id to be attached to, or because
1055 		 * the control stream for the specified ppa_id has been closed
1056 		 * before we get here.
1057 		 */
1058 		if (ppa == NULL) {
1059 			error = ENOENT;
1060 			break;
1061 		}
1062 		if (iop->ioc_cr == NULL ||
1063 		    ppa->ppa_zoneid != crgetzoneid(iop->ioc_cr)) {
1064 			error = EPERM;
1065 			break;
1066 		}
1067 		/*
1068 		 * Preallocate the hangup message so that we're always
1069 		 * able to send this upstream in the event of a
1070 		 * catastrophic failure.
1071 		 */
1072 		if ((sps->sps_hangup = allocb(1, BPRI_MED)) == NULL) {
1073 			error = ENOSR;
1074 			break;
1075 		}
1076 		/*
1077 		 * There are two ways to attach a stream to a ppa: one is
1078 		 * through DLPI (DL_ATTACH_REQ) and the other is through
1079 		 * PPPIO_ATTACH. This is why we need to distinguish whether or
1080 		 * not a stream was allocated via PPPIO_ATTACH, so that we can
1081 		 * properly detach it when we receive PPPIO_DETACH ioctl
1082 		 * request.
1083 		 */
1084 		sps->sps_flags |= SPS_PIOATTACH;
1085 		sps->sps_ppa = ppa;
1086 		/*
1087 		 * Add this stream to the head of the list of sibling streams
1088 		 * which belong to the same ppa as specified.
1089 		 */
1090 		rw_enter(&ppa->ppa_sib_lock, RW_WRITER);
1091 		ppa->ppa_refcnt++;
1092 		sps->sps_nextsib = ppa->ppa_streams;
1093 		ppa->ppa_streams = sps;
1094 		rw_exit(&ppa->ppa_sib_lock);
1095 		error = 0;		/* return success */
1096 		break;
1097 	case PPPIO_BLOCKNP:
1098 	case PPPIO_UNBLOCKNP:
1099 		if (iop->ioc_cr == NULL ||
1100 		    secpolicy_ppp_config(iop->ioc_cr) != 0) {
1101 			error = EPERM;
1102 			break;
1103 		}
1104 		error = miocpullup(mp, sizeof (uint16_t));
1105 		if (error != 0)
1106 			break;
1107 		ASSERT(mp->b_cont->b_rptr != NULL);
1108 		proto = *(uint16_t *)mp->b_cont->b_rptr;
1109 		if (iop->ioc_cmd == PPPIO_BLOCKNP) {
1110 			uint32_t npflagpos = sppp_ppp2np(proto);
1111 			/*
1112 			 * Mark proto as blocked in ppa_npflag until the
1113 			 * corresponding queues for proto have been plumbed.
1114 			 */
1115 			if (npflagpos != 0) {
1116 				mutex_enter(&ppa->ppa_npmutex);
1117 				ppa->ppa_npflag |= (1 << npflagpos);
1118 				mutex_exit(&ppa->ppa_npmutex);
1119 			} else {
1120 				error = EINVAL;
1121 			}
1122 		} else {
1123 			/*
1124 			 * reset ppa_npflag and release proto
1125 			 * packets that were being held in control queue.
1126 			 */
1127 			sppp_release_pkts(ppa, proto);
1128 		}
1129 		break;
1130 	case PPPIO_DEBUG:
1131 		if (iop->ioc_cr == NULL ||
1132 		    secpolicy_ppp_config(iop->ioc_cr) != 0) {
1133 			error = EPERM;
1134 			break;
1135 		} else if (iop->ioc_count != sizeof (uint32_t)) {
1136 			break;		/* return EINVAL */
1137 		} else if (mp->b_cont == NULL) {
1138 			error = EPROTO;
1139 			break;
1140 		}
1141 		ASSERT(mp->b_cont->b_rptr != NULL);
1142 		dbgcmd = *(uint32_t *)mp->b_cont->b_rptr;
1143 		/*
1144 		 * We accept PPPDBG_LOG + PPPDBG_DRIVER value as an indication
1145 		 * that SPS_KDEBUG needs to be enabled for this upper stream.
1146 		 */
1147 		if (dbgcmd == PPPDBG_LOG + PPPDBG_DRIVER) {
1148 			sps->sps_flags |= SPS_KDEBUG;
1149 			error = 0;	/* return success */
1150 			break;
1151 		}
1152 		/*
1153 		 * Otherwise, for any other values, we send them down only if
1154 		 * there is an attachment and if the attachment has something
1155 		 * linked underneath it.
1156 		 */
1157 		if ((ppa == NULL) || (ppa->ppa_lower_wq == NULL)) {
1158 			error = ENOLINK;
1159 			break;
1160 		}
1161 		mutex_enter(&ppa->ppa_sta_lock);
1162 		/*
1163 		 * See comments in PPPIO_GETSTAT64 case
1164 		 * in sppp_ioctl().
1165 		 */
1166 		if (IS_SPS_IOCQ(sps)) {
1167 			mutex_exit(&ppa->ppa_sta_lock);
1168 			if (!putq(q, mp)) {
1169 				error = EAGAIN;
1170 				break;
1171 			}
1172 			return;
1173 		} else {
1174 			ppa->ppa_ioctlsfwd++;
1175 			/*
1176 			 * Record the ioctl CMD & ID -
1177 			 * this will be used to check the
1178 			 * ACK or NAK responses coming from below.
1179 			 */
1180 			sps->sps_ioc_id = iop->ioc_id;
1181 			sps->sps_flags |= SPS_IOCQ;
1182 			mutex_exit(&ppa->ppa_sta_lock);
1183 		}
1184 		putnext(ppa->ppa_lower_wq, mp);
1185 		return;			/* don't ack or nak the request */
1186 	case PPPIO_DETACH:
1187 		if (!IS_SPS_PIOATTACH(sps)) {
1188 			break;		/* return EINVAL */
1189 		}
1190 		/*
1191 		 * The SPS_PIOATTACH flag set on the stream tells us that
1192 		 * the ppa field is still valid. In the event that the control
1193 		 * stream be closed prior to this stream's detachment, the
1194 		 * SPS_PIOATTACH flag would have been cleared from this stream
1195 		 * during close; in that case we won't get here.
1196 		 */
1197 		ASSERT(ppa != NULL);
1198 		ASSERT(ppa->ppa_ctl != sps);
1199 		ASSERT(sps->sps_dlstate == DL_UNATTACHED);
1200 
1201 		/*
1202 		 * We don't actually detach anything until the stream is
1203 		 * closed or reattached.
1204 		 */
1205 
1206 		sps->sps_flags &= ~SPS_PIOATTACH;
1207 		error = 0;		/* return success */
1208 		break;
1209 	case PPPIO_LASTMOD:
1210 		if (!IS_SPS_CONTROL(sps)) {
1211 			break;		/* return EINVAL */
1212 		}
1213 		ASSERT(ppa != NULL);
1214 		ppa->ppa_flags |= PPA_LASTMOD;
1215 		error = 0;		/* return success */
1216 		break;
1217 	case PPPIO_MRU:
1218 		if (!IS_SPS_CONTROL(sps) ||
1219 		    (iop->ioc_count != sizeof (uint32_t))) {
1220 			break;		/* return EINVAL */
1221 		} else if (mp->b_cont == NULL) {
1222 			error = EPROTO;
1223 			break;
1224 		}
1225 		ASSERT(ppa != NULL);
1226 		ASSERT(mp->b_cont->b_rptr != NULL);
1227 		mru = *(uint32_t *)mp->b_cont->b_rptr;
1228 		if ((mru <= 0) || (mru > PPP_MAXMRU)) {
1229 			error = EPROTO;
1230 			break;
1231 		}
1232 		if (mru < PPP_MRU) {
1233 			mru = PPP_MRU;
1234 		}
1235 		ppa->ppa_mru = (uint16_t)mru;
1236 		/*
1237 		 * If there's something beneath this driver for the ppa, then
1238 		 * inform it (or them) of the MRU size. Only do this is we
1239 		 * are not the last PPP module on the stream.
1240 		 */
1241 		if (!IS_PPA_LASTMOD(ppa) && (ppa->ppa_lower_wq != NULL)) {
1242 			(void) putctl4(ppa->ppa_lower_wq, M_CTL, PPPCTL_MRU,
1243 			    mru);
1244 		}
1245 		error = 0;		/* return success */
1246 		break;
1247 	case PPPIO_MTU:
1248 		if (!IS_SPS_CONTROL(sps) ||
1249 		    (iop->ioc_count != sizeof (uint32_t))) {
1250 			break;		/* return EINVAL */
1251 		} else if (mp->b_cont == NULL) {
1252 			error = EPROTO;
1253 			break;
1254 		}
1255 		ASSERT(ppa != NULL);
1256 		ASSERT(mp->b_cont->b_rptr != NULL);
1257 		mtu = *(uint32_t *)mp->b_cont->b_rptr;
1258 		if ((mtu <= 0) || (mtu > PPP_MAXMTU)) {
1259 			error = EPROTO;
1260 			break;
1261 		}
1262 		ppa->ppa_mtu = (uint16_t)mtu;
1263 		/*
1264 		 * If there's something beneath this driver for the ppa, then
1265 		 * inform it (or them) of the MTU size. Only do this if we
1266 		 * are not the last PPP module on the stream.
1267 		 */
1268 		if (!IS_PPA_LASTMOD(ppa) && (ppa->ppa_lower_wq != NULL)) {
1269 			(void) putctl4(ppa->ppa_lower_wq, M_CTL, PPPCTL_MTU,
1270 			    mtu);
1271 		}
1272 		error = 0;		/* return success */
1273 		break;
1274 	case PPPIO_USETIMESTAMP:
1275 		if (!IS_SPS_CONTROL(sps)) {
1276 			break;		/* return EINVAL */
1277 		}
1278 		if (!IS_PPA_TIMESTAMP(ppa)) {
1279 			hrtime = gethrtime();
1280 			ppa->ppa_lasttx = ppa->ppa_lastrx = hrtime;
1281 			ppa->ppa_flags |= PPA_TIMESTAMP;
1282 		}
1283 		error = 0;
1284 		break;
1285 	}
1286 
1287 	if (error == 0) {
1288 		/* Success; tell the user */
1289 		miocack(q, mp, count, 0);
1290 	} else {
1291 		/* Failure; send error back upstream */
1292 		miocnak(q, mp, 0, error);
1293 	}
1294 }
1295 
1296 /*
1297  * sppp_outer_ioctl()
1298  *
1299  * MT-Perimeters:
1300  *    exclusive inner, exclusive outer
1301  *
1302  * Description:
1303  *    Called by sppp_uwput as a result of receiving ioctls which require
1304  *    an exclusive access at the outer perimeter.
1305  */
1306 static void
1307 sppp_outer_ioctl(queue_t *q, mblk_t *mp)
1308 {
1309 	spppstr_t	*sps = q->q_ptr;
1310 	spppstr_t	*nextsib;
1311 	queue_t		*lwq;
1312 	sppa_t		*ppa;
1313 	struct iocblk	*iop;
1314 	int		error = EINVAL;
1315 	int		count = 0;
1316 	uint32_t	ppa_id;
1317 	mblk_t		*nmp;
1318 	zoneid_t	zoneid;
1319 
1320 	sps = (spppstr_t *)q->q_ptr;
1321 	ppa = sps->sps_ppa;
1322 	iop = (struct iocblk *)mp->b_rptr;
1323 	switch (iop->ioc_cmd) {
1324 	case I_LINK:
1325 		if (!IS_SPS_CONTROL(sps)) {
1326 			break;		/* return EINVAL */
1327 		} else if (ppa->ppa_lower_wq != NULL) {
1328 			error = EEXIST;
1329 			break;
1330 		}
1331 		ASSERT(ppa->ppa_ctl != NULL);
1332 		ASSERT(sps->sps_npmode == NPMODE_PASS);
1333 		ASSERT(mp->b_cont != NULL && mp->b_cont->b_rptr != NULL);
1334 
1335 		lwq = ((struct linkblk *)mp->b_cont->b_rptr)->l_qbot;
1336 		ASSERT(lwq != NULL);
1337 
1338 		ppa->ppa_lower_wq = lwq;
1339 		lwq->q_ptr = RD(lwq)->q_ptr = (caddr_t)ppa;
1340 		/*
1341 		 * Unblock upper network streams which now feed this lower
1342 		 * stream. We don't need to hold ppa_sib_lock here, since we
1343 		 * are writer at the outer perimeter.
1344 		 */
1345 		if (WR(sps->sps_rq)->q_first != NULL)
1346 			qenable(WR(sps->sps_rq));
1347 		for (nextsib = ppa->ppa_streams; nextsib != NULL;
1348 		    nextsib = nextsib->sps_nextsib) {
1349 			nextsib->sps_npmode = NPMODE_PASS;
1350 			if (WR(nextsib->sps_rq)->q_first != NULL) {
1351 				qenable(WR(nextsib->sps_rq));
1352 			}
1353 		}
1354 
1355 		/*
1356 		 * Also unblock (run once) our lower read-side queue.  This is
1357 		 * where packets received while doing the I_LINK may be
1358 		 * languishing; see sppp_lrsrv.
1359 		 */
1360 		qenable(RD(lwq));
1361 
1362 		/*
1363 		 * Send useful information down to the modules which are now
1364 		 * linked below this driver (for this particular ppa). Only
1365 		 * do this if we are not the last PPP module on the stream.
1366 		 */
1367 		if (!IS_PPA_LASTMOD(ppa)) {
1368 			(void) putctl8(lwq, M_CTL, PPPCTL_UNIT,
1369 			    ppa->ppa_ppa_id);
1370 			(void) putctl4(lwq, M_CTL, PPPCTL_MRU, ppa->ppa_mru);
1371 			(void) putctl4(lwq, M_CTL, PPPCTL_MTU, ppa->ppa_mtu);
1372 		}
1373 
1374 		if (IS_SPS_KDEBUG(sps)) {
1375 			SPDEBUG(PPP_DRV_NAME
1376 			    "/%d: I_LINK lwq=0x%p sps=0x%p flags=0x%b ppa=0x%p "
1377 			    "flags=0x%b\n", sps->sps_mn_id,
1378 			    (void *)ppa->ppa_lower_wq, (void *)sps,
1379 			    sps->sps_flags, SPS_FLAGS_STR,
1380 			    (void *)ppa, ppa->ppa_flags,
1381 			    PPA_FLAGS_STR);
1382 		}
1383 		error = 0;		/* return success */
1384 		break;
1385 	case I_UNLINK:
1386 		ASSERT(IS_SPS_CONTROL(sps));
1387 		ASSERT(ppa != NULL);
1388 		lwq = ppa->ppa_lower_wq;
1389 		ASSERT(mp->b_cont != NULL && mp->b_cont->b_rptr != NULL);
1390 		ASSERT(lwq == ((struct linkblk *)mp->b_cont->b_rptr)->l_qbot);
1391 
1392 		if (IS_SPS_KDEBUG(sps)) {
1393 			SPDEBUG(PPP_DRV_NAME
1394 			    "/%d: I_UNLINK lwq=0x%p sps=0x%p flags=0x%b "
1395 			    "ppa=0x%p flags=0x%b\n", sps->sps_mn_id,
1396 			    (void *)lwq, (void *)sps, sps->sps_flags,
1397 			    SPS_FLAGS_STR, (void *)ppa, ppa->ppa_flags,
1398 			    PPA_FLAGS_STR);
1399 		}
1400 		/*
1401 		 * While accessing the outer perimeter exclusively, we
1402 		 * disassociate our ppa's lower_wq from the lower stream linked
1403 		 * beneath us, and we also disassociate our control stream from
1404 		 * the q_ptr of the lower stream.
1405 		 */
1406 		lwq->q_ptr = RD(lwq)->q_ptr = NULL;
1407 		ppa->ppa_lower_wq = NULL;
1408 		/*
1409 		 * Unblock streams which now feed back up the control stream,
1410 		 * and acknowledge the request. We don't need to hold
1411 		 * ppa_sib_lock here, since we are writer at the outer
1412 		 * perimeter.
1413 		 */
1414 		if (WR(sps->sps_rq)->q_first != NULL)
1415 			qenable(WR(sps->sps_rq));
1416 		for (nextsib = ppa->ppa_streams; nextsib != NULL;
1417 		    nextsib = nextsib->sps_nextsib) {
1418 			if (WR(nextsib->sps_rq)->q_first != NULL) {
1419 				qenable(WR(nextsib->sps_rq));
1420 			}
1421 		}
1422 		error = 0;		/* return success */
1423 		break;
1424 	case PPPIO_NEWPPA:
1425 		/*
1426 		 * Do sanity check to ensure that we don't accept PPPIO_NEWPPA
1427 		 * on a stream which DLPI is used (since certain DLPI messages
1428 		 * will cause state transition reflected in sps_dlstate,
1429 		 * changing it from its default DL_UNATTACHED value). In other
1430 		 * words, we won't allow a network/snoop stream to become
1431 		 * a control stream.
1432 		 */
1433 		if (iop->ioc_cr == NULL ||
1434 		    secpolicy_ppp_config(iop->ioc_cr) != 0) {
1435 			error = EPERM;
1436 			break;
1437 		} else if (IS_SPS_CONTROL(sps) || IS_SPS_PIOATTACH(sps) ||
1438 		    (ppa != NULL) || (sps->sps_dlstate != DL_UNATTACHED)) {
1439 			break;		/* return EINVAL */
1440 		}
1441 		/* Get requested unit number (if any) */
1442 		if (iop->ioc_count == sizeof (uint32_t) && mp->b_cont != NULL)
1443 			ppa_id = *(uint32_t *)mp->b_cont->b_rptr;
1444 		else
1445 			ppa_id = 0;
1446 		/* Get mblk to use for response message */
1447 		nmp = allocb(sizeof (uint32_t), BPRI_MED);
1448 		if (nmp == NULL) {
1449 			error = ENOSR;
1450 			break;
1451 		}
1452 		if (mp->b_cont != NULL) {
1453 			freemsg(mp->b_cont);
1454 		}
1455 		mp->b_cont = nmp;		/* chain our response mblk */
1456 		/*
1457 		 * Walk the global ppa list and determine the lowest
1458 		 * available ppa_id number to be used.
1459 		 */
1460 		if (ppa_id == (uint32_t)-1)
1461 			ppa_id = 0;
1462 		zoneid = crgetzoneid(iop->ioc_cr);
1463 		for (ppa = ppa_list; ppa != NULL; ppa = ppa->ppa_nextppa) {
1464 			if (ppa_id == (uint32_t)-2) {
1465 				if (ppa->ppa_ctl == NULL &&
1466 				    ppa->ppa_zoneid == zoneid)
1467 					break;
1468 			} else {
1469 				if (ppa_id < ppa->ppa_ppa_id)
1470 					break;
1471 				if (ppa_id == ppa->ppa_ppa_id)
1472 					++ppa_id;
1473 			}
1474 		}
1475 		if (ppa_id == (uint32_t)-2) {
1476 			if (ppa == NULL) {
1477 				error = ENXIO;
1478 				break;
1479 			}
1480 			/* Clear timestamp and lastmod flags */
1481 			ppa->ppa_flags = 0;
1482 		} else {
1483 			ppa = sppp_create_ppa(ppa_id, zoneid);
1484 			if (ppa == NULL) {
1485 				error = ENOMEM;
1486 				break;
1487 			}
1488 		}
1489 
1490 		sps->sps_ppa = ppa;		/* chain the ppa structure */
1491 		sps->sps_npmode = NPMODE_PASS;	/* network packets may travel */
1492 		sps->sps_flags |= SPS_CONTROL;	/* this is the control stream */
1493 
1494 		ppa->ppa_refcnt++;		/* new PPA reference */
1495 		ppa->ppa_ctl = sps;		/* back ptr to upper stream */
1496 		/*
1497 		 * Return the newly created ppa_id to the requestor and
1498 		 * acnowledge the request.
1499 		 */
1500 		*(uint32_t *)nmp->b_wptr = ppa->ppa_ppa_id;
1501 		nmp->b_wptr += sizeof (uint32_t);
1502 
1503 		if (IS_SPS_KDEBUG(sps)) {
1504 			SPDEBUG(PPP_DRV_NAME
1505 			    "/%d: PPPIO_NEWPPA ppa_id=%d sps=0x%p flags=0x%b "
1506 			    "ppa=0x%p flags=0x%b\n", sps->sps_mn_id, ppa_id,
1507 			    (void *)sps, sps->sps_flags, SPS_FLAGS_STR,
1508 			    (void *)ppa, ppa->ppa_flags,
1509 			    PPA_FLAGS_STR);
1510 		}
1511 		count = msgsize(nmp);
1512 		error = 0;
1513 		break;
1514 	}
1515 
1516 	if (error == 0) {
1517 		/* Success; tell the user. */
1518 		miocack(q, mp, count, 0);
1519 	} else {
1520 		/* Failure; send error back upstream. */
1521 		miocnak(q, mp, 0, error);
1522 	}
1523 }
1524 
1525 /*
1526  * sppp_send()
1527  *
1528  * MT-Perimeters:
1529  *    shared inner, shared outer.
1530  *
1531  * Description:
1532  *    Called by sppp_uwput to handle M_DATA message type.  Returns
1533  *    queue_t for putnext, or NULL to mean that the packet was
1534  *    handled internally.
1535  */
1536 static queue_t *
1537 sppp_send(queue_t *q, mblk_t **mpp, spppstr_t *sps)
1538 {
1539 	mblk_t	*mp;
1540 	sppa_t	*ppa;
1541 	int	is_promisc;
1542 	int	msize;
1543 	int	error = 0;
1544 	queue_t	*nextq;
1545 
1546 	ASSERT(mpp != NULL);
1547 	mp = *mpp;
1548 	ASSERT(q != NULL && q->q_ptr != NULL);
1549 	ASSERT(mp != NULL && mp->b_rptr != NULL);
1550 	ASSERT(sps != NULL);
1551 	ASSERT(q->q_ptr == sps);
1552 	/*
1553 	 * We only let M_DATA through if the sender is either the control
1554 	 * stream (for PPP control packets) or one of the network streams
1555 	 * (for IP packets) in IP fastpath mode. If this stream is not attached
1556 	 * to any ppas, then discard data coming down through this stream.
1557 	 */
1558 	ppa = sps->sps_ppa;
1559 	if (ppa == NULL) {
1560 		ASSERT(!IS_SPS_CONTROL(sps));
1561 		error = ENOLINK;
1562 	} else if (!IS_SPS_CONTROL(sps) && !IS_SPS_FASTPATH(sps)) {
1563 		error = EPROTO;
1564 	}
1565 	if (error != 0) {
1566 		merror(q, mp, error);
1567 		return (NULL);
1568 	}
1569 	msize = msgdsize(mp);
1570 	if (msize > (ppa->ppa_mtu + PPP_HDRLEN)) {
1571 		/* Log, and send it anyway */
1572 		mutex_enter(&ppa->ppa_sta_lock);
1573 		ppa->ppa_otoolongs++;
1574 		mutex_exit(&ppa->ppa_sta_lock);
1575 	} else if (msize < PPP_HDRLEN) {
1576 		/*
1577 		 * Log, and send it anyway. We log it because we get things
1578 		 * in M_DATA form here, which tells us that the sender is
1579 		 * either IP in fastpath transmission mode, or pppd. In both
1580 		 * cases, they are currently expected to send the 4-bytes
1581 		 * PPP header in front of any possible payloads.
1582 		 */
1583 		mutex_enter(&ppa->ppa_sta_lock);
1584 		ppa->ppa_orunts++;
1585 		mutex_exit(&ppa->ppa_sta_lock);
1586 	}
1587 
1588 	if (IS_SPS_KDEBUG(sps)) {
1589 		SPDEBUG(PPP_DRV_NAME
1590 		    "/%d: M_DATA send (%d bytes) sps=0x%p flags=0x%b "
1591 		    "ppa=0x%p flags=0x%b\n", sps->sps_mn_id, msize,
1592 		    (void *)sps, sps->sps_flags, SPS_FLAGS_STR,
1593 		    (void *)ppa, ppa->ppa_flags, PPA_FLAGS_STR);
1594 	}
1595 	/*
1596 	 * Should there be any promiscuous stream(s), send the data up
1597 	 * for each promiscuous stream that we recognize. Make sure that
1598 	 * for fastpath, we skip the PPP header in the M_DATA mblk. We skip
1599 	 * the control stream as we obviously never allow the control stream
1600 	 * to become promiscous and bind to PPP_ALLSAP.
1601 	 */
1602 	rw_enter(&ppa->ppa_sib_lock, RW_READER);
1603 	is_promisc = sps->sps_ppa->ppa_promicnt;
1604 	if (is_promisc) {
1605 		ASSERT(ppa->ppa_streams != NULL);
1606 		sppp_dlprsendup(ppa->ppa_streams, mp, sps->sps_sap, B_TRUE);
1607 	}
1608 	rw_exit(&ppa->ppa_sib_lock);
1609 	/*
1610 	 * Only time-stamp the packet with hrtime if the upper stream
1611 	 * is configured to do so.  PPP control (negotiation) messages
1612 	 * are never considered link activity; only data is activity.
1613 	 */
1614 	if (!IS_SPS_CONTROL(sps) && IS_PPA_TIMESTAMP(ppa)) {
1615 		ppa->ppa_lasttx = gethrtime();
1616 	}
1617 	/*
1618 	 * If there's already a message in the write-side service queue,
1619 	 * then queue this message there as well, otherwise, try to send
1620 	 * it down to the module immediately below us.
1621 	 */
1622 	if (q->q_first != NULL ||
1623 	    (nextq = sppp_outpkt(q, mpp, msize, sps)) == NULL) {
1624 		mp = *mpp;
1625 		if (mp != NULL && putq(q, mp) == 0) {
1626 			mutex_enter(&ppa->ppa_sta_lock);
1627 			ppa->ppa_oqdropped++;
1628 			mutex_exit(&ppa->ppa_sta_lock);
1629 			freemsg(mp);
1630 		}
1631 		return (NULL);
1632 	}
1633 	return (nextq);
1634 }
1635 
1636 /*
1637  * sppp_outpkt()
1638  *
1639  * MT-Perimeters:
1640  *    shared inner, shared outer (if called from sppp_wput, sppp_dlunitdatareq).
1641  *    exclusive inner, shared outer (if called from sppp_wsrv).
1642  *
1643  * Description:
1644  *    Called from 1) sppp_uwput when processing a M_DATA fastpath message,
1645  *    or 2) sppp_uwsrv when processing the upper write-side service queue.
1646  *    For both cases, it prepares to send the data to the module below
1647  *    this driver if there is a lower stream linked underneath. If none, then
1648  *    the data will be sent upstream via the control channel to pppd.
1649  *
1650  * Returns:
1651  *	Non-NULL queue_t if message should be sent now, otherwise
1652  *	if *mpp == NULL, then message was freed, otherwise put *mpp
1653  *	(back) on the queue.  (Does not do putq/putbq, since it's
1654  *	called both from srv and put procedures.)
1655  */
1656 static queue_t *
1657 sppp_outpkt(queue_t *q, mblk_t **mpp, int msize, spppstr_t *sps)
1658 {
1659 	mblk_t		*mp;
1660 	sppa_t		*ppa;
1661 	enum NPmode	npmode;
1662 	mblk_t		*mpnew;
1663 
1664 	ASSERT(mpp != NULL);
1665 	mp = *mpp;
1666 	ASSERT(q != NULL && q->q_ptr != NULL);
1667 	ASSERT(mp != NULL && mp->b_rptr != NULL);
1668 	ASSERT(sps != NULL);
1669 
1670 	ppa = sps->sps_ppa;
1671 	npmode = sps->sps_npmode;
1672 
1673 	if (npmode == NPMODE_QUEUE) {
1674 		ASSERT(!IS_SPS_CONTROL(sps));
1675 		return (NULL);	/* queue it for later */
1676 	} else if (ppa == NULL || ppa->ppa_ctl == NULL ||
1677 	    npmode == NPMODE_DROP || npmode == NPMODE_ERROR) {
1678 		/*
1679 		 * This can not be the control stream, as it must always have
1680 		 * a valid ppa, and its npmode must always be NPMODE_PASS.
1681 		 */
1682 		ASSERT(!IS_SPS_CONTROL(sps));
1683 		if (npmode == NPMODE_DROP) {
1684 			freemsg(mp);
1685 		} else {
1686 			/*
1687 			 * If we no longer have the control stream, or if the
1688 			 * mode is set to NPMODE_ERROR, then we need to tell IP
1689 			 * that the interface need to be marked as down. In
1690 			 * other words, we tell IP to be quiescent.
1691 			 */
1692 			merror(q, mp, EPROTO);
1693 		}
1694 		*mpp = NULL;
1695 		return (NULL);	/* don't queue it */
1696 	}
1697 	/*
1698 	 * Do we have a driver stream linked underneath ? If not, we need to
1699 	 * notify pppd that the link needs to be brought up and configure
1700 	 * this upper stream to drop subsequent outgoing packets. This is
1701 	 * for demand-dialing, in which case pppd has done the IP plumbing
1702 	 * but hasn't linked the driver stream underneath us. Therefore, when
1703 	 * a packet is sent down the IP interface, a notification message
1704 	 * will be sent up the control stream to pppd in order for it to
1705 	 * establish the physical link. The driver stream is then expected
1706 	 * to be linked underneath after physical link establishment is done.
1707 	 */
1708 	if (ppa->ppa_lower_wq == NULL) {
1709 		ASSERT(ppa->ppa_ctl != NULL);
1710 		ASSERT(ppa->ppa_ctl->sps_rq != NULL);
1711 
1712 		*mpp = NULL;
1713 		mpnew = create_lsmsg(PPP_LINKSTAT_NEEDUP);
1714 		if (mpnew == NULL) {
1715 			freemsg(mp);
1716 			mutex_enter(&ppa->ppa_sta_lock);
1717 			ppa->ppa_allocbfail++;
1718 			mutex_exit(&ppa->ppa_sta_lock);
1719 			return (NULL);	/* don't queue it */
1720 		}
1721 		/* Include the data in the message for logging. */
1722 		mpnew->b_cont = mp;
1723 		mutex_enter(&ppa->ppa_sta_lock);
1724 		ppa->ppa_lsneedup++;
1725 		mutex_exit(&ppa->ppa_sta_lock);
1726 		/*
1727 		 * We need to set the mode to NPMODE_DROP, but should only
1728 		 * do so when this stream is not the control stream.
1729 		 */
1730 		if (!IS_SPS_CONTROL(sps)) {
1731 			sps->sps_npmode = NPMODE_DROP;
1732 		}
1733 		putnext(ppa->ppa_ctl->sps_rq, mpnew);
1734 		return (NULL);	/* don't queue it */
1735 	}
1736 	/*
1737 	 * If so, then try to send it down. The lower queue is only ever
1738 	 * detached while holding an exclusive lock on the whole driver,
1739 	 * so we can be confident that the lower queue is still there.
1740 	 */
1741 	if (bcanputnext(ppa->ppa_lower_wq, mp->b_band)) {
1742 		mutex_enter(&ppa->ppa_sta_lock);
1743 		ppa->ppa_stats.p.ppp_opackets++;
1744 		if (IS_SPS_CONTROL(sps)) {
1745 			ppa->ppa_opkt_ctl++;
1746 		}
1747 		ppa->ppa_stats.p.ppp_obytes += msize;
1748 		mutex_exit(&ppa->ppa_sta_lock);
1749 		return (ppa->ppa_lower_wq);	/* don't queue it */
1750 	}
1751 	return (NULL);	/* queue it for later */
1752 }
1753 
1754 /*
1755  * sppp_lwsrv()
1756  *
1757  * MT-Perimeters:
1758  *    exclusive inner, shared outer.
1759  *
1760  * Description:
1761  *    Lower write-side service procedure. No messages are ever placed on
1762  *    the write queue here, this just back-enables all upper write side
1763  *    service procedures.
1764  */
1765 int
1766 sppp_lwsrv(queue_t *q)
1767 {
1768 	sppa_t		*ppa;
1769 	spppstr_t	*nextsib;
1770 
1771 	ASSERT(q != NULL && q->q_ptr != NULL);
1772 	ppa = (sppa_t *)q->q_ptr;
1773 	ASSERT(ppa != NULL);
1774 
1775 	rw_enter(&ppa->ppa_sib_lock, RW_READER);
1776 	if ((nextsib = ppa->ppa_ctl) != NULL &&
1777 	    WR(nextsib->sps_rq)->q_first != NULL)
1778 		qenable(WR(nextsib->sps_rq));
1779 	for (nextsib = ppa->ppa_streams; nextsib != NULL;
1780 	    nextsib = nextsib->sps_nextsib) {
1781 		if (WR(nextsib->sps_rq)->q_first != NULL) {
1782 			qenable(WR(nextsib->sps_rq));
1783 		}
1784 	}
1785 	rw_exit(&ppa->ppa_sib_lock);
1786 	return (0);
1787 }
1788 
1789 /*
1790  * sppp_lrput()
1791  *
1792  * MT-Perimeters:
1793  *    shared inner, shared outer.
1794  *
1795  * Description:
1796  *    Lower read-side put procedure. Messages from below get here.
1797  *    Data messages are handled separately to limit stack usage
1798  *    going into IP.
1799  *
1800  *    Note that during I_UNLINK processing, it's possible for a downstream
1801  *    message to enable upstream data (due to pass_wput() removing the
1802  *    SQ_BLOCKED flag), and thus we must protect against a NULL sppa pointer.
1803  *    In this case, the only thing above us is passthru, and we might as well
1804  *    discard.
1805  */
1806 int
1807 sppp_lrput(queue_t *q, mblk_t *mp)
1808 {
1809 	sppa_t		*ppa;
1810 	spppstr_t	*sps;
1811 
1812 	if ((ppa = q->q_ptr) == NULL) {
1813 		freemsg(mp);
1814 		return (0);
1815 	}
1816 
1817 	sps = ppa->ppa_ctl;
1818 
1819 	if (MTYPE(mp) != M_DATA) {
1820 		sppp_recv_nondata(q, mp, sps);
1821 	} else if (sps == NULL) {
1822 		freemsg(mp);
1823 	} else if ((q = sppp_recv(q, &mp, sps)) != NULL) {
1824 		putnext(q, mp);
1825 	}
1826 	return (0);
1827 }
1828 
1829 /*
1830  * sppp_lrsrv()
1831  *
1832  * MT-Perimeters:
1833  *    exclusive inner, shared outer.
1834  *
1835  * Description:
1836  *    Lower read-side service procedure.  This is run once after the I_LINK
1837  *    occurs in order to clean up any packets that came in while we were
1838  *    transferring in the lower stream.  Otherwise, it's not used.
1839  */
1840 int
1841 sppp_lrsrv(queue_t *q)
1842 {
1843 	mblk_t *mp;
1844 
1845 	while ((mp = getq(q)) != NULL)
1846 		(void) sppp_lrput(q, mp);
1847 	return (0);
1848 }
1849 
1850 /*
1851  * sppp_recv_nondata()
1852  *
1853  * MT-Perimeters:
1854  *    shared inner, shared outer.
1855  *
1856  * Description:
1857  *    All received non-data messages come through here.
1858  */
1859 static void
1860 sppp_recv_nondata(queue_t *q, mblk_t *mp, spppstr_t *ctlsps)
1861 {
1862 	sppa_t		*ppa;
1863 	spppstr_t	*destsps;
1864 	struct iocblk	*iop;
1865 
1866 	ppa = (sppa_t *)q->q_ptr;
1867 	ctlsps = ppa->ppa_ctl;
1868 
1869 	switch (MTYPE(mp)) {
1870 	case M_CTL:
1871 		mutex_enter(&ppa->ppa_sta_lock);
1872 		if (*mp->b_rptr == PPPCTL_IERROR) {
1873 			ppa->ppa_stats.p.ppp_ierrors++;
1874 			ppa->ppa_ierr_low++;
1875 			ppa->ppa_mctlsknown++;
1876 		} else if (*mp->b_rptr == PPPCTL_OERROR) {
1877 			ppa->ppa_stats.p.ppp_oerrors++;
1878 			ppa->ppa_oerr_low++;
1879 			ppa->ppa_mctlsknown++;
1880 		} else {
1881 			ppa->ppa_mctlsunknown++;
1882 		}
1883 		mutex_exit(&ppa->ppa_sta_lock);
1884 		freemsg(mp);
1885 		break;
1886 	case M_IOCTL:
1887 		miocnak(q, mp, 0, EINVAL);
1888 		break;
1889 	case M_IOCACK:
1890 	case M_IOCNAK:
1891 		iop = (struct iocblk *)mp->b_rptr;
1892 		ASSERT(iop != NULL);
1893 		/*
1894 		 * Attempt to match up the response with the stream that the
1895 		 * request came from. If ioc_id doesn't match the one that we
1896 		 * recorded, then discard this message.
1897 		 */
1898 		rw_enter(&ppa->ppa_sib_lock, RW_READER);
1899 		if ((destsps = ctlsps) == NULL ||
1900 		    destsps->sps_ioc_id != iop->ioc_id) {
1901 			destsps = ppa->ppa_streams;
1902 			while (destsps != NULL) {
1903 				if (destsps->sps_ioc_id == iop->ioc_id) {
1904 					break;	/* found the upper stream */
1905 				}
1906 				destsps = destsps->sps_nextsib;
1907 			}
1908 		}
1909 		rw_exit(&ppa->ppa_sib_lock);
1910 		if (destsps == NULL) {
1911 			mutex_enter(&ppa->ppa_sta_lock);
1912 			ppa->ppa_ioctlsfwderr++;
1913 			mutex_exit(&ppa->ppa_sta_lock);
1914 			freemsg(mp);
1915 			break;
1916 		}
1917 		mutex_enter(&ppa->ppa_sta_lock);
1918 		ppa->ppa_ioctlsfwdok++;
1919 
1920 		/*
1921 		 * Clear SPS_IOCQ and enable the lower write side queue,
1922 		 * this would allow the upper stream service routine
1923 		 * to start processing the queue for pending messages.
1924 		 * sppp_lwsrv -> sppp_uwsrv.
1925 		 */
1926 		destsps->sps_flags &= ~SPS_IOCQ;
1927 		mutex_exit(&ppa->ppa_sta_lock);
1928 		qenable(WR(destsps->sps_rq));
1929 
1930 		putnext(destsps->sps_rq, mp);
1931 		break;
1932 	case M_HANGUP:
1933 		/*
1934 		 * Free the original mblk_t. We don't really want to send
1935 		 * a M_HANGUP message upstream, so we need to translate this
1936 		 * message into something else.
1937 		 */
1938 		freemsg(mp);
1939 		if (ctlsps == NULL)
1940 			break;
1941 		mp = create_lsmsg(PPP_LINKSTAT_HANGUP);
1942 		if (mp == NULL) {
1943 			mutex_enter(&ppa->ppa_sta_lock);
1944 			ppa->ppa_allocbfail++;
1945 			mutex_exit(&ppa->ppa_sta_lock);
1946 			break;
1947 		}
1948 		mutex_enter(&ppa->ppa_sta_lock);
1949 		ppa->ppa_lsdown++;
1950 		mutex_exit(&ppa->ppa_sta_lock);
1951 		putnext(ctlsps->sps_rq, mp);
1952 		break;
1953 	case M_FLUSH:
1954 		if (*mp->b_rptr & FLUSHR) {
1955 			flushq(q, FLUSHDATA);
1956 		}
1957 		if (*mp->b_rptr & FLUSHW) {
1958 			*mp->b_rptr &= ~FLUSHR;
1959 			qreply(q, mp);
1960 		} else {
1961 			freemsg(mp);
1962 		}
1963 		break;
1964 	default:
1965 		if (ctlsps != NULL &&
1966 		    (queclass(mp) == QPCTL) || canputnext(ctlsps->sps_rq)) {
1967 			putnext(ctlsps->sps_rq, mp);
1968 		} else {
1969 			mutex_enter(&ppa->ppa_sta_lock);
1970 			ppa->ppa_iqdropped++;
1971 			mutex_exit(&ppa->ppa_sta_lock);
1972 			freemsg(mp);
1973 		}
1974 		break;
1975 	}
1976 }
1977 
1978 /*
1979  * sppp_recv()
1980  *
1981  * MT-Perimeters:
1982  *    shared inner, shared outer.
1983  *
1984  * Description:
1985  *    Receive function called by sppp_lrput.  Finds appropriate
1986  *    receive stream and does accounting.
1987  */
1988 static queue_t *
1989 sppp_recv(queue_t *q, mblk_t **mpp, spppstr_t *ctlsps)
1990 {
1991 	mblk_t		*mp;
1992 	int		len;
1993 	sppa_t		*ppa;
1994 	spppstr_t	*destsps;
1995 	mblk_t		*zmp;
1996 	uint32_t	npflagpos;
1997 
1998 	ASSERT(mpp != NULL);
1999 	mp = *mpp;
2000 	ASSERT(q != NULL && q->q_ptr != NULL);
2001 	ASSERT(mp != NULL && mp->b_rptr != NULL);
2002 	ASSERT(ctlsps != NULL);
2003 	ASSERT(IS_SPS_CONTROL(ctlsps));
2004 	ppa = ctlsps->sps_ppa;
2005 	ASSERT(ppa != NULL && ppa->ppa_ctl != NULL);
2006 
2007 	len = msgdsize(mp);
2008 	mutex_enter(&ppa->ppa_sta_lock);
2009 	ppa->ppa_stats.p.ppp_ibytes += len;
2010 	mutex_exit(&ppa->ppa_sta_lock);
2011 	/*
2012 	 * If the entire data size of the mblk is less than the length of the
2013 	 * PPP header, then free it. We can't do much with such message anyway,
2014 	 * since we can't really determine what the PPP protocol type is.
2015 	 */
2016 	if (len < PPP_HDRLEN) {
2017 		/* Log, and free it */
2018 		mutex_enter(&ppa->ppa_sta_lock);
2019 		ppa->ppa_irunts++;
2020 		mutex_exit(&ppa->ppa_sta_lock);
2021 		freemsg(mp);
2022 		return (NULL);
2023 	} else if (len > (ppa->ppa_mru + PPP_HDRLEN)) {
2024 		/* Log, and accept it anyway */
2025 		mutex_enter(&ppa->ppa_sta_lock);
2026 		ppa->ppa_itoolongs++;
2027 		mutex_exit(&ppa->ppa_sta_lock);
2028 	}
2029 	/*
2030 	 * We need at least be able to read the PPP protocol from the header,
2031 	 * so if the first message block is too small, then we concatenate the
2032 	 * rest of the following blocks into one message.
2033 	 */
2034 	if (MBLKL(mp) < PPP_HDRLEN) {
2035 		zmp = msgpullup(mp, PPP_HDRLEN);
2036 		freemsg(mp);
2037 		mp = zmp;
2038 		if (mp == NULL) {
2039 			mutex_enter(&ppa->ppa_sta_lock);
2040 			ppa->ppa_allocbfail++;
2041 			mutex_exit(&ppa->ppa_sta_lock);
2042 			return (NULL);
2043 		}
2044 		*mpp = mp;
2045 	}
2046 	/*
2047 	 * Hold this packet in the control-queue until
2048 	 * the matching network-layer upper stream for the PPP protocol (sap)
2049 	 * has not been plumbed and configured
2050 	 */
2051 	npflagpos = sppp_ppp2np(PPP_PROTOCOL(mp->b_rptr));
2052 	mutex_enter(&ppa->ppa_npmutex);
2053 	if (npflagpos != 0 && (ppa->ppa_npflag & (1 << npflagpos))) {
2054 		/*
2055 		 * proto is currently blocked; Hold up to 4 packets
2056 		 * in the kernel.
2057 		 */
2058 		if (ppa->ppa_holdpkts[npflagpos] > 3 ||
2059 		    putq(ctlsps->sps_rq, mp) == 0)
2060 			freemsg(mp);
2061 		else
2062 			ppa->ppa_holdpkts[npflagpos]++;
2063 		mutex_exit(&ppa->ppa_npmutex);
2064 		return (NULL);
2065 	}
2066 	mutex_exit(&ppa->ppa_npmutex);
2067 	/*
2068 	 * Try to find a matching network-layer upper stream for the specified
2069 	 * PPP protocol (sap), and if none is found, send this frame up the
2070 	 * control stream.
2071 	 */
2072 	destsps = sppp_inpkt(q, mp, ctlsps);
2073 	if (destsps == NULL) {
2074 		mutex_enter(&ppa->ppa_sta_lock);
2075 		ppa->ppa_ipkt_ctl++;
2076 		mutex_exit(&ppa->ppa_sta_lock);
2077 		if (canputnext(ctlsps->sps_rq)) {
2078 			if (IS_SPS_KDEBUG(ctlsps)) {
2079 				SPDEBUG(PPP_DRV_NAME
2080 				    "/%d: M_DATA recv (%d bytes) sps=0x%p "
2081 				    "flags=0x%b ppa=0x%p flags=0x%b\n",
2082 				    ctlsps->sps_mn_id, len, (void *)ctlsps,
2083 				    ctlsps->sps_flags, SPS_FLAGS_STR,
2084 				    (void *)ppa, ppa->ppa_flags,
2085 				    PPA_FLAGS_STR);
2086 			}
2087 			return (ctlsps->sps_rq);
2088 		} else {
2089 			mutex_enter(&ppa->ppa_sta_lock);
2090 			ppa->ppa_iqdropped++;
2091 			mutex_exit(&ppa->ppa_sta_lock);
2092 			freemsg(mp);
2093 			return (NULL);
2094 		}
2095 	}
2096 	if (canputnext(destsps->sps_rq)) {
2097 		if (IS_SPS_KDEBUG(destsps)) {
2098 			SPDEBUG(PPP_DRV_NAME
2099 			    "/%d: M_DATA recv (%d bytes) sps=0x%p flags=0x%b "
2100 			    "ppa=0x%p flags=0x%b\n", destsps->sps_mn_id, len,
2101 			    (void *)destsps, destsps->sps_flags,
2102 			    SPS_FLAGS_STR, (void *)ppa, ppa->ppa_flags,
2103 			    PPA_FLAGS_STR);
2104 		}
2105 		/*
2106 		 * If fastpath is enabled on the network-layer stream, then
2107 		 * make sure we skip over the PPP header, otherwise, we wrap
2108 		 * the message in a DLPI message.
2109 		 */
2110 		if (IS_SPS_FASTPATH(destsps)) {
2111 			mp->b_rptr += PPP_HDRLEN;
2112 			return (destsps->sps_rq);
2113 		} else {
2114 			spppstr_t *uqs = (spppstr_t *)destsps->sps_rq->q_ptr;
2115 			ASSERT(uqs != NULL);
2116 			mp->b_rptr += PPP_HDRLEN;
2117 			mp = sppp_dladdud(uqs, mp, uqs->sps_sap, B_FALSE);
2118 			if (mp != NULL) {
2119 				*mpp = mp;
2120 				return (destsps->sps_rq);
2121 			} else {
2122 				mutex_enter(&ppa->ppa_sta_lock);
2123 				ppa->ppa_allocbfail++;
2124 				mutex_exit(&ppa->ppa_sta_lock);
2125 				/* mp already freed by sppp_dladdud */
2126 				return (NULL);
2127 			}
2128 		}
2129 	} else {
2130 		mutex_enter(&ppa->ppa_sta_lock);
2131 		ppa->ppa_iqdropped++;
2132 		mutex_exit(&ppa->ppa_sta_lock);
2133 		freemsg(mp);
2134 		return (NULL);
2135 	}
2136 }
2137 
2138 /*
2139  * sppp_inpkt()
2140  *
2141  * MT-Perimeters:
2142  *    shared inner, shared outer.
2143  *
2144  * Description:
2145  *    Find the destination upper stream for the received packet, called
2146  *    from sppp_recv.
2147  *
2148  * Returns:
2149  *    ptr to destination upper network stream, or NULL for control stream.
2150  */
2151 /* ARGSUSED */
2152 static spppstr_t *
2153 sppp_inpkt(queue_t *q, mblk_t *mp, spppstr_t *ctlsps)
2154 {
2155 	spppstr_t	*destsps = NULL;
2156 	sppa_t		*ppa;
2157 	uint16_t	proto;
2158 	int		is_promisc;
2159 
2160 	ASSERT(q != NULL && q->q_ptr != NULL);
2161 	ASSERT(mp != NULL && mp->b_rptr != NULL);
2162 	ASSERT(IS_SPS_CONTROL(ctlsps));
2163 	ppa = ctlsps->sps_ppa;
2164 	ASSERT(ppa != NULL);
2165 	/*
2166 	 * From RFC 1661 (Section 2):
2167 	 *
2168 	 * The Protocol field is one or two octets, and its value identifies
2169 	 * the datagram encapsulated in the Information field of the packet.
2170 	 * The field is transmitted and received most significant octet first.
2171 	 *
2172 	 * The structure of this field is consistent with the ISO 3309
2173 	 * extension mechanism for address fields.  All Protocols MUST be odd;
2174 	 * the least significant bit of the least significant octet MUST equal
2175 	 * "1".  Also, all Protocols MUST be assigned such that the least
2176 	 * significant bit of the most significant octet equals "0". Frames
2177 	 * received which don't comply with these rules MUST be treated as
2178 	 * having an unrecognized Protocol.
2179 	 *
2180 	 * Protocol field values in the "0***" to "3***" range identify the
2181 	 * network-layer protocol of specific packets, and values in the
2182 	 * "8***" to "b***" range identify packets belonging to the associated
2183 	 * Network Control Protocols (NCPs), if any.
2184 	 *
2185 	 * Protocol field values in the "4***" to "7***" range are used for
2186 	 * protocols with low volume traffic which have no associated NCP.
2187 	 * Protocol field values in the "c***" to "f***" range identify packets
2188 	 * as link-layer Control Protocols (such as LCP).
2189 	 */
2190 	proto = PPP_PROTOCOL(mp->b_rptr);
2191 	mutex_enter(&ppa->ppa_sta_lock);
2192 	ppa->ppa_stats.p.ppp_ipackets++;
2193 	mutex_exit(&ppa->ppa_sta_lock);
2194 	/*
2195 	 * We check if this is not a network-layer protocol, and if so,
2196 	 * then send this packet up the control stream.
2197 	 */
2198 	if (proto > 0x7fff) {
2199 		goto inpkt_done;	/* send it up the control stream */
2200 	}
2201 	/*
2202 	 * Try to grab the destination upper stream from the network-layer
2203 	 * stream cache for this ppa for PPP_IP (0x0021) or PPP_IPV6 (0x0057)
2204 	 * protocol types. Otherwise, if the type is not known to the cache,
2205 	 * or if its sap can't be matched with any of the upper streams, then
2206 	 * send this packet up the control stream so that it can be rejected.
2207 	 */
2208 	if (proto == PPP_IP) {
2209 		destsps = ppa->ppa_ip_cache;
2210 	} else if (proto == PPP_IPV6) {
2211 		destsps = ppa->ppa_ip6_cache;
2212 	}
2213 	/*
2214 	 * Toss this one away up the control stream if there's no matching sap;
2215 	 * this way the protocol can be rejected (destsps is NULL).
2216 	 */
2217 
2218 inpkt_done:
2219 	/*
2220 	 * Only time-stamp the packet with hrtime if the upper stream
2221 	 * is configured to do so.  PPP control (negotiation) messages
2222 	 * are never considered link activity; only data is activity.
2223 	 */
2224 	if (destsps != NULL && IS_PPA_TIMESTAMP(ppa)) {
2225 		ppa->ppa_lastrx = gethrtime();
2226 	}
2227 	/*
2228 	 * Should there be any promiscuous stream(s), send the data up for
2229 	 * each promiscuous stream that we recognize. We skip the control
2230 	 * stream as we obviously never allow the control stream to become
2231 	 * promiscous and bind to PPP_ALLSAP.
2232 	 */
2233 	rw_enter(&ppa->ppa_sib_lock, RW_READER);
2234 	is_promisc = ppa->ppa_promicnt;
2235 	if (is_promisc) {
2236 		ASSERT(ppa->ppa_streams != NULL);
2237 		sppp_dlprsendup(ppa->ppa_streams, mp, proto, B_TRUE);
2238 	}
2239 	rw_exit(&ppa->ppa_sib_lock);
2240 	return (destsps);
2241 }
2242 
2243 /*
2244  * sppp_kstat_update()
2245  *
2246  * Description:
2247  *    Update per-ppa kstat interface statistics.
2248  */
2249 static int
2250 sppp_kstat_update(kstat_t *ksp, int rw)
2251 {
2252 	register sppa_t		*ppa;
2253 	register sppp_kstats_t	*pppkp;
2254 	register struct pppstat64 *sp;
2255 
2256 	if (rw == KSTAT_WRITE) {
2257 		return (EACCES);
2258 	}
2259 
2260 	ppa = (sppa_t *)ksp->ks_private;
2261 	ASSERT(ppa != NULL);
2262 
2263 	pppkp = (sppp_kstats_t *)ksp->ks_data;
2264 	sp = &ppa->ppa_stats.p;
2265 
2266 	mutex_enter(&ppa->ppa_sta_lock);
2267 	pppkp->allocbfail.value.ui32	= ppa->ppa_allocbfail;
2268 	pppkp->mctlsfwd.value.ui32	= ppa->ppa_mctlsfwd;
2269 	pppkp->mctlsfwderr.value.ui32	= ppa->ppa_mctlsfwderr;
2270 	pppkp->rbytes.value.ui32	= sp->ppp_ibytes;
2271 	pppkp->rbytes64.value.ui64	= sp->ppp_ibytes;
2272 	pppkp->ierrors.value.ui32	= sp->ppp_ierrors;
2273 	pppkp->ierrors_lower.value.ui32	= ppa->ppa_ierr_low;
2274 	pppkp->ioctlsfwd.value.ui32	= ppa->ppa_ioctlsfwd;
2275 	pppkp->ioctlsfwdok.value.ui32	= ppa->ppa_ioctlsfwdok;
2276 	pppkp->ioctlsfwderr.value.ui32	= ppa->ppa_ioctlsfwderr;
2277 	pppkp->ipackets.value.ui32	= sp->ppp_ipackets;
2278 	pppkp->ipackets64.value.ui64	= sp->ppp_ipackets;
2279 	pppkp->ipackets_ctl.value.ui32	= ppa->ppa_ipkt_ctl;
2280 	pppkp->iqdropped.value.ui32	= ppa->ppa_iqdropped;
2281 	pppkp->irunts.value.ui32	= ppa->ppa_irunts;
2282 	pppkp->itoolongs.value.ui32	= ppa->ppa_itoolongs;
2283 	pppkp->lsneedup.value.ui32	= ppa->ppa_lsneedup;
2284 	pppkp->lsdown.value.ui32	= ppa->ppa_lsdown;
2285 	pppkp->mctlsknown.value.ui32	= ppa->ppa_mctlsknown;
2286 	pppkp->mctlsunknown.value.ui32	= ppa->ppa_mctlsunknown;
2287 	pppkp->obytes.value.ui32	= sp->ppp_obytes;
2288 	pppkp->obytes64.value.ui64	= sp->ppp_obytes;
2289 	pppkp->oerrors.value.ui32	= sp->ppp_oerrors;
2290 	pppkp->oerrors_lower.value.ui32	= ppa->ppa_oerr_low;
2291 	pppkp->opackets.value.ui32	= sp->ppp_opackets;
2292 	pppkp->opackets64.value.ui64	= sp->ppp_opackets;
2293 	pppkp->opackets_ctl.value.ui32	= ppa->ppa_opkt_ctl;
2294 	pppkp->oqdropped.value.ui32	= ppa->ppa_oqdropped;
2295 	pppkp->otoolongs.value.ui32	= ppa->ppa_otoolongs;
2296 	pppkp->orunts.value.ui32	= ppa->ppa_orunts;
2297 	mutex_exit(&ppa->ppa_sta_lock);
2298 
2299 	return (0);
2300 }
2301 
2302 /*
2303  * Turn off proto in ppa_npflag to indicate that
2304  * the corresponding network protocol has been plumbed.
2305  * Release proto packets that were being held in the control
2306  * queue in anticipation of this event.
2307  */
2308 static void
2309 sppp_release_pkts(sppa_t *ppa, uint16_t proto)
2310 {
2311 	uint32_t npflagpos = sppp_ppp2np(proto);
2312 	int count;
2313 	mblk_t *mp;
2314 	uint16_t mp_proto;
2315 	queue_t *q;
2316 	spppstr_t *destsps;
2317 
2318 	ASSERT(ppa != NULL);
2319 
2320 	if (npflagpos == 0 || (ppa->ppa_npflag & (1 << npflagpos)) == 0)
2321 		return;
2322 
2323 	mutex_enter(&ppa->ppa_npmutex);
2324 	ppa->ppa_npflag &= ~(1 << npflagpos);
2325 	count = ppa->ppa_holdpkts[npflagpos];
2326 	ppa->ppa_holdpkts[npflagpos] = 0;
2327 	mutex_exit(&ppa->ppa_npmutex);
2328 
2329 	q = ppa->ppa_ctl->sps_rq;
2330 
2331 	while (count > 0) {
2332 		mp = getq(q);
2333 		ASSERT(mp != NULL);
2334 
2335 		mp_proto = PPP_PROTOCOL(mp->b_rptr);
2336 		if (mp_proto !=  proto) {
2337 			(void) putq(q, mp);
2338 			continue;
2339 		}
2340 		count--;
2341 		destsps = NULL;
2342 		if (mp_proto == PPP_IP) {
2343 			destsps = ppa->ppa_ip_cache;
2344 		} else if (mp_proto == PPP_IPV6) {
2345 			destsps = ppa->ppa_ip6_cache;
2346 		}
2347 		ASSERT(destsps != NULL);
2348 
2349 		if (IS_SPS_FASTPATH(destsps)) {
2350 			mp->b_rptr += PPP_HDRLEN;
2351 		} else {
2352 			spppstr_t *uqs = (spppstr_t *)destsps->sps_rq->q_ptr;
2353 			ASSERT(uqs != NULL);
2354 			mp->b_rptr += PPP_HDRLEN;
2355 			mp = sppp_dladdud(uqs, mp, uqs->sps_sap, B_FALSE);
2356 			if (mp == NULL) {
2357 				mutex_enter(&ppa->ppa_sta_lock);
2358 				ppa->ppa_allocbfail++;
2359 				mutex_exit(&ppa->ppa_sta_lock);
2360 				/* mp already freed by sppp_dladdud */
2361 				continue;
2362 			}
2363 		}
2364 
2365 		if (canputnext(destsps->sps_rq)) {
2366 			putnext(destsps->sps_rq, mp);
2367 		} else {
2368 			mutex_enter(&ppa->ppa_sta_lock);
2369 			ppa->ppa_iqdropped++;
2370 			mutex_exit(&ppa->ppa_sta_lock);
2371 			freemsg(mp);
2372 			continue;
2373 		}
2374 	}
2375 }
2376