1 /*
2  * s_common.c - common utilities for Solaris PPP
3  *
4  * Copyright (c) 2000 by Sun Microsystems, Inc.
5  * All rights reserved.
6  *
7  * Permission to use, copy, modify, and distribute this software and its
8  * documentation is hereby granted, provided that the above copyright
9  * notice appears in all copies.
10  *
11  * SUN MAKES NO REPRESENTATION OR WARRANTIES ABOUT THE SUITABILITY OF
12  * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
13  * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
14  * PARTICULAR PURPOSE, OR NON-INFRINGEMENT.  SUN SHALL NOT BE LIABLE FOR
15  * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
16  * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES
17  */
18 
19 #define	RCSID	"$Id: s_common.c,v 1.0 2000/05/08 01:10:12 masputra Exp $"
20 
21 #include <sys/types.h>
22 #include <sys/debug.h>
23 #include <sys/param.h>
24 #include <sys/stat.h>
25 #include <sys/stream.h>
26 #include <sys/stropts.h>
27 #include <sys/errno.h>
28 #include <sys/ioccom.h>
29 #include <sys/cmn_err.h>
30 #include <sys/ddi.h>
31 #include <sys/sunddi.h>
32 #include <sys/strsun.h>
33 #include <net/ppp_defs.h>
34 #include <net/pppio.h>
35 #include "s_common.h"
36 
37 /*
38  * putctl4()
39  *
40  * Description:
41  *    Create and send a 4-byte message.
42  */
43 int
putctl4(queue_t * q,uchar_t type,uchar_t code,uint16_t val)44 putctl4(queue_t *q, uchar_t type, uchar_t code, uint16_t val)
45 {
46 	mblk_t	*mp;
47 
48 	if ((mp = allocb(4, BPRI_HI)) == NULL) {
49 		return (0);
50 	}
51 	MTYPE(mp) = type;
52 	mp->b_wptr[0] = code;
53 	((uint16_t *)mp->b_wptr)[1] = val;
54 	mp->b_wptr += 4;
55 
56 	putnext(q, mp);
57 	return (1);
58 }
59 
60 /*
61  * putctl8()
62  *
63  * Description:
64  *    Create and send a 8-byte message.
65  */
66 int
putctl8(queue_t * q,uchar_t type,uchar_t code,uint32_t val)67 putctl8(queue_t *q, uchar_t type, uchar_t code, uint32_t val)
68 {
69 	mblk_t	*mp;
70 
71 	if ((mp = allocb(8, BPRI_HI)) == NULL) {
72 		return (0);
73 	}
74 	MTYPE(mp) = type;
75 	mp->b_wptr[0] = code;
76 	((uint32_t *)mp->b_wptr)[1] = val;
77 	mp->b_wptr += 8;
78 
79 	putnext(q, mp);
80 	return (1);
81 }
82 
83 /*
84  * msg_byte()
85  *
86  * Description:
87  *    Helper routine to return a specific byte off a data buffer.
88  */
89 int
msg_byte(mblk_t * mp,unsigned int i)90 msg_byte(mblk_t *mp, unsigned int i)
91 {
92 	while (mp != NULL) {
93 		if (i < MBLKL(mp)) {
94 			break;
95 		}
96 		i -= MBLKL(mp);
97 		mp = mp->b_cont;
98 	}
99 	if (mp == NULL) {
100 		return (-1);
101 	}
102 	return (mp->b_rptr[i]);
103 }
104 
105 /*
106  * sppp_create_lsmsg()
107  *
108  * Description:
109  *    Create a PPP link status message.
110  */
111 mblk_t *
create_lsmsg(enum LSstat ls_type)112 create_lsmsg(enum LSstat ls_type)
113 {
114 	mblk_t		*mp;
115 	struct ppp_ls	*plt;
116 
117 	if ((mp = allocb(sizeof (*plt), BPRI_HI)) == NULL) {
118 		return (NULL);
119 	}
120 	/*
121 	 * Make sure that this message is a control message, and contains
122 	 * a notification that the link has been terminated.
123 	 */
124 	MTYPE(mp) = M_PROTO;
125 	mp->b_wptr += sizeof (*plt);
126 	plt = (struct ppp_ls *)mp->b_rptr;
127 	plt->magic = PPPLSMAGIC;
128 	plt->ppp_message = ls_type;
129 
130 	return (mp);
131 }
132