xref: /freebsd/sbin/ipf/ipsend/dlcommon.c (revision 41edb306f05651fcaf6c74f9e3557f59f80292e1)
1*41edb306SCy Schubert /*	$FreeBSD$	*/
2*41edb306SCy Schubert 
3*41edb306SCy Schubert /*
4*41edb306SCy Schubert  * Common (shared) DLPI test routines.
5*41edb306SCy Schubert  * Mostly pretty boring boilerplate sorta stuff.
6*41edb306SCy Schubert  * These can be split into individual library routines later
7*41edb306SCy Schubert  * but it's just convenient to keep them in a single file
8*41edb306SCy Schubert  * while they're being developed.
9*41edb306SCy Schubert  *
10*41edb306SCy Schubert  * Not supported:
11*41edb306SCy Schubert  *   Connection Oriented stuff
12*41edb306SCy Schubert  *   QOS stuff
13*41edb306SCy Schubert  */
14*41edb306SCy Schubert 
15*41edb306SCy Schubert /*
16*41edb306SCy Schubert typedef	unsigned long	ulong;
17*41edb306SCy Schubert */
18*41edb306SCy Schubert 
19*41edb306SCy Schubert 
20*41edb306SCy Schubert #include	<sys/types.h>
21*41edb306SCy Schubert #include	<sys/stream.h>
22*41edb306SCy Schubert #include	<sys/stropts.h>
23*41edb306SCy Schubert # include	<sys/dlpi.h>
24*41edb306SCy Schubert #include	<sys/signal.h>
25*41edb306SCy Schubert #include	<stdio.h>
26*41edb306SCy Schubert #include	<string.h>
27*41edb306SCy Schubert #include	"dltest.h"
28*41edb306SCy Schubert 
29*41edb306SCy Schubert #define		CASERET(s)	case s:  return ("s")
30*41edb306SCy Schubert 
31*41edb306SCy Schubert 	char	*dlprim();
32*41edb306SCy Schubert 	char	*dlstate();
33*41edb306SCy Schubert 	char	*dlerrno();
34*41edb306SCy Schubert 	char	*dlpromisclevel();
35*41edb306SCy Schubert 	char	*dlservicemode();
36*41edb306SCy Schubert 	char	*dlstyle();
37*41edb306SCy Schubert 	char	*dlmactype();
38*41edb306SCy Schubert 
39*41edb306SCy Schubert 
40*41edb306SCy Schubert void
41*41edb306SCy Schubert dlinforeq(fd)
42*41edb306SCy Schubert 	int	fd;
43*41edb306SCy Schubert {
44*41edb306SCy Schubert 	dl_info_req_t	info_req;
45*41edb306SCy Schubert 	struct	strbuf	ctl;
46*41edb306SCy Schubert 	int	flags;
47*41edb306SCy Schubert 
48*41edb306SCy Schubert 	info_req.dl_primitive = DL_INFO_REQ;
49*41edb306SCy Schubert 
50*41edb306SCy Schubert 	ctl.maxlen = 0;
51*41edb306SCy Schubert 	ctl.len = sizeof (info_req);
52*41edb306SCy Schubert 	ctl.buf = (char *) &info_req;
53*41edb306SCy Schubert 
54*41edb306SCy Schubert 	flags = RS_HIPRI;
55*41edb306SCy Schubert 
56*41edb306SCy Schubert 	if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)
57*41edb306SCy Schubert 		syserr("dlinforeq:  putmsg");
58*41edb306SCy Schubert }
59*41edb306SCy Schubert 
60*41edb306SCy Schubert void
61*41edb306SCy Schubert dlinfoack(fd, bufp)
62*41edb306SCy Schubert 	int	fd;
63*41edb306SCy Schubert 	char	*bufp;
64*41edb306SCy Schubert {
65*41edb306SCy Schubert 	union	DL_primitives	*dlp;
66*41edb306SCy Schubert 	struct	strbuf	ctl;
67*41edb306SCy Schubert 	int	flags;
68*41edb306SCy Schubert 
69*41edb306SCy Schubert 	ctl.maxlen = MAXDLBUF;
70*41edb306SCy Schubert 	ctl.len = 0;
71*41edb306SCy Schubert 	ctl.buf = bufp;
72*41edb306SCy Schubert 
73*41edb306SCy Schubert 	strgetmsg(fd, &ctl, (struct strbuf*)NULL, &flags, "dlinfoack");
74*41edb306SCy Schubert 
75*41edb306SCy Schubert 	dlp = (union DL_primitives *) ctl.buf;
76*41edb306SCy Schubert 
77*41edb306SCy Schubert 	expecting(DL_INFO_ACK, dlp);
78*41edb306SCy Schubert 
79*41edb306SCy Schubert 	if (ctl.len < sizeof (dl_info_ack_t))
80*41edb306SCy Schubert 		err("dlinfoack:  response ctl.len too short:  %d", ctl.len);
81*41edb306SCy Schubert 
82*41edb306SCy Schubert 	if (flags != RS_HIPRI)
83*41edb306SCy Schubert 		err("dlinfoack:  DL_INFO_ACK was not M_PCPROTO");
84*41edb306SCy Schubert 
85*41edb306SCy Schubert 	if (ctl.len < sizeof (dl_info_ack_t))
86*41edb306SCy Schubert 		err("dlinfoack:  short response ctl.len:  %d", ctl.len);
87*41edb306SCy Schubert }
88*41edb306SCy Schubert 
89*41edb306SCy Schubert void
90*41edb306SCy Schubert dlattachreq(fd, ppa)
91*41edb306SCy Schubert 	int	fd;
92*41edb306SCy Schubert 	u_long	ppa;
93*41edb306SCy Schubert {
94*41edb306SCy Schubert 	dl_attach_req_t	attach_req;
95*41edb306SCy Schubert 	struct	strbuf	ctl;
96*41edb306SCy Schubert 	int	flags;
97*41edb306SCy Schubert 
98*41edb306SCy Schubert 	attach_req.dl_primitive = DL_ATTACH_REQ;
99*41edb306SCy Schubert 	attach_req.dl_ppa = ppa;
100*41edb306SCy Schubert 
101*41edb306SCy Schubert 	ctl.maxlen = 0;
102*41edb306SCy Schubert 	ctl.len = sizeof (attach_req);
103*41edb306SCy Schubert 	ctl.buf = (char *) &attach_req;
104*41edb306SCy Schubert 
105*41edb306SCy Schubert 	flags = 0;
106*41edb306SCy Schubert 
107*41edb306SCy Schubert 	if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)
108*41edb306SCy Schubert 		syserr("dlattachreq:  putmsg");
109*41edb306SCy Schubert }
110*41edb306SCy Schubert 
111*41edb306SCy Schubert void
112*41edb306SCy Schubert dlenabmultireq(fd, addr, length)
113*41edb306SCy Schubert 	int	fd;
114*41edb306SCy Schubert 	char	*addr;
115*41edb306SCy Schubert 	int	length;
116*41edb306SCy Schubert {
117*41edb306SCy Schubert 	long	buf[MAXDLBUF];
118*41edb306SCy Schubert 	union	DL_primitives	*dlp;
119*41edb306SCy Schubert 	struct	strbuf	ctl;
120*41edb306SCy Schubert 	int	flags;
121*41edb306SCy Schubert 
122*41edb306SCy Schubert 	dlp = (union DL_primitives*) buf;
123*41edb306SCy Schubert 
124*41edb306SCy Schubert 	dlp->enabmulti_req.dl_primitive = DL_ENABMULTI_REQ;
125*41edb306SCy Schubert 	dlp->enabmulti_req.dl_addr_length = length;
126*41edb306SCy Schubert 	dlp->enabmulti_req.dl_addr_offset = sizeof (dl_enabmulti_req_t);
127*41edb306SCy Schubert 
128*41edb306SCy Schubert 	(void) memcpy((char*)OFFADDR(buf, sizeof (dl_enabmulti_req_t)), addr, length);
129*41edb306SCy Schubert 
130*41edb306SCy Schubert 	ctl.maxlen = 0;
131*41edb306SCy Schubert 	ctl.len = sizeof (dl_enabmulti_req_t) + length;
132*41edb306SCy Schubert 	ctl.buf = (char*) buf;
133*41edb306SCy Schubert 
134*41edb306SCy Schubert 	flags = 0;
135*41edb306SCy Schubert 
136*41edb306SCy Schubert 	if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)
137*41edb306SCy Schubert 		syserr("dlenabmultireq:  putmsg");
138*41edb306SCy Schubert }
139*41edb306SCy Schubert 
140*41edb306SCy Schubert void
141*41edb306SCy Schubert dldisabmultireq(fd, addr, length)
142*41edb306SCy Schubert 	int	fd;
143*41edb306SCy Schubert 	char	*addr;
144*41edb306SCy Schubert 	int	length;
145*41edb306SCy Schubert {
146*41edb306SCy Schubert 	long	buf[MAXDLBUF];
147*41edb306SCy Schubert 	union	DL_primitives	*dlp;
148*41edb306SCy Schubert 	struct	strbuf	ctl;
149*41edb306SCy Schubert 	int	flags;
150*41edb306SCy Schubert 
151*41edb306SCy Schubert 	dlp = (union DL_primitives*) buf;
152*41edb306SCy Schubert 
153*41edb306SCy Schubert 	dlp->disabmulti_req.dl_primitive = DL_ENABMULTI_REQ;
154*41edb306SCy Schubert 	dlp->disabmulti_req.dl_addr_length = length;
155*41edb306SCy Schubert 	dlp->disabmulti_req.dl_addr_offset = sizeof (dl_disabmulti_req_t);
156*41edb306SCy Schubert 
157*41edb306SCy Schubert 	(void) memcpy((char*)OFFADDR(buf, sizeof (dl_disabmulti_req_t)), addr, length);
158*41edb306SCy Schubert 
159*41edb306SCy Schubert 	ctl.maxlen = 0;
160*41edb306SCy Schubert 	ctl.len = sizeof (dl_disabmulti_req_t) + length;
161*41edb306SCy Schubert 	ctl.buf = (char*) buf;
162*41edb306SCy Schubert 
163*41edb306SCy Schubert 	flags = 0;
164*41edb306SCy Schubert 
165*41edb306SCy Schubert 	if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)
166*41edb306SCy Schubert 		syserr("dldisabmultireq:  putmsg");
167*41edb306SCy Schubert }
168*41edb306SCy Schubert 
169*41edb306SCy Schubert void
170*41edb306SCy Schubert dlpromisconreq(fd, level)
171*41edb306SCy Schubert 	int	fd;
172*41edb306SCy Schubert 	u_long	level;
173*41edb306SCy Schubert {
174*41edb306SCy Schubert 	dl_promiscon_req_t	promiscon_req;
175*41edb306SCy Schubert 	struct	strbuf	ctl;
176*41edb306SCy Schubert 	int	flags;
177*41edb306SCy Schubert 
178*41edb306SCy Schubert 	promiscon_req.dl_primitive = DL_PROMISCON_REQ;
179*41edb306SCy Schubert 	promiscon_req.dl_level = level;
180*41edb306SCy Schubert 
181*41edb306SCy Schubert 	ctl.maxlen = 0;
182*41edb306SCy Schubert 	ctl.len = sizeof (promiscon_req);
183*41edb306SCy Schubert 	ctl.buf = (char *) &promiscon_req;
184*41edb306SCy Schubert 
185*41edb306SCy Schubert 	flags = 0;
186*41edb306SCy Schubert 
187*41edb306SCy Schubert 	if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)
188*41edb306SCy Schubert 		syserr("dlpromiscon:  putmsg");
189*41edb306SCy Schubert 
190*41edb306SCy Schubert }
191*41edb306SCy Schubert 
192*41edb306SCy Schubert void
193*41edb306SCy Schubert dlpromiscoff(fd, level)
194*41edb306SCy Schubert 	int	fd;
195*41edb306SCy Schubert 	u_long	level;
196*41edb306SCy Schubert {
197*41edb306SCy Schubert 	dl_promiscoff_req_t	promiscoff_req;
198*41edb306SCy Schubert 	struct	strbuf	ctl;
199*41edb306SCy Schubert 	int	flags;
200*41edb306SCy Schubert 
201*41edb306SCy Schubert 	promiscoff_req.dl_primitive = DL_PROMISCOFF_REQ;
202*41edb306SCy Schubert 	promiscoff_req.dl_level = level;
203*41edb306SCy Schubert 
204*41edb306SCy Schubert 	ctl.maxlen = 0;
205*41edb306SCy Schubert 	ctl.len = sizeof (promiscoff_req);
206*41edb306SCy Schubert 	ctl.buf = (char *) &promiscoff_req;
207*41edb306SCy Schubert 
208*41edb306SCy Schubert 	flags = 0;
209*41edb306SCy Schubert 
210*41edb306SCy Schubert 	if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)
211*41edb306SCy Schubert 		syserr("dlpromiscoff:  putmsg");
212*41edb306SCy Schubert }
213*41edb306SCy Schubert 
214*41edb306SCy Schubert void
215*41edb306SCy Schubert dlphysaddrreq(fd, addrtype)
216*41edb306SCy Schubert 	int	fd;
217*41edb306SCy Schubert 	u_long	addrtype;
218*41edb306SCy Schubert {
219*41edb306SCy Schubert 	dl_phys_addr_req_t	phys_addr_req;
220*41edb306SCy Schubert 	struct	strbuf	ctl;
221*41edb306SCy Schubert 	int	flags;
222*41edb306SCy Schubert 
223*41edb306SCy Schubert 	phys_addr_req.dl_primitive = DL_PHYS_ADDR_REQ;
224*41edb306SCy Schubert 	phys_addr_req.dl_addr_type = addrtype;
225*41edb306SCy Schubert 
226*41edb306SCy Schubert 	ctl.maxlen = 0;
227*41edb306SCy Schubert 	ctl.len = sizeof (phys_addr_req);
228*41edb306SCy Schubert 	ctl.buf = (char *) &phys_addr_req;
229*41edb306SCy Schubert 
230*41edb306SCy Schubert 	flags = 0;
231*41edb306SCy Schubert 
232*41edb306SCy Schubert 	if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)
233*41edb306SCy Schubert 		syserr("dlphysaddrreq:  putmsg");
234*41edb306SCy Schubert }
235*41edb306SCy Schubert 
236*41edb306SCy Schubert void
237*41edb306SCy Schubert dlsetphysaddrreq(fd, addr, length)
238*41edb306SCy Schubert 	int	fd;
239*41edb306SCy Schubert 	char	*addr;
240*41edb306SCy Schubert 	int	length;
241*41edb306SCy Schubert {
242*41edb306SCy Schubert 	long	buf[MAXDLBUF];
243*41edb306SCy Schubert 	union	DL_primitives	*dlp;
244*41edb306SCy Schubert 	struct	strbuf	ctl;
245*41edb306SCy Schubert 	int	flags;
246*41edb306SCy Schubert 
247*41edb306SCy Schubert 	dlp = (union DL_primitives*) buf;
248*41edb306SCy Schubert 
249*41edb306SCy Schubert 	dlp->set_physaddr_req.dl_primitive = DL_ENABMULTI_REQ;
250*41edb306SCy Schubert 	dlp->set_physaddr_req.dl_addr_length = length;
251*41edb306SCy Schubert 	dlp->set_physaddr_req.dl_addr_offset = sizeof (dl_set_phys_addr_req_t);
252*41edb306SCy Schubert 
253*41edb306SCy Schubert 	(void) memcpy((char*)OFFADDR(buf, sizeof (dl_set_phys_addr_req_t)), addr, length);
254*41edb306SCy Schubert 
255*41edb306SCy Schubert 	ctl.maxlen = 0;
256*41edb306SCy Schubert 	ctl.len = sizeof (dl_set_phys_addr_req_t) + length;
257*41edb306SCy Schubert 	ctl.buf = (char*) buf;
258*41edb306SCy Schubert 
259*41edb306SCy Schubert 	flags = 0;
260*41edb306SCy Schubert 
261*41edb306SCy Schubert 	if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)
262*41edb306SCy Schubert 		syserr("dlsetphysaddrreq:  putmsg");
263*41edb306SCy Schubert }
264*41edb306SCy Schubert 
265*41edb306SCy Schubert void
266*41edb306SCy Schubert dldetachreq(fd)
267*41edb306SCy Schubert 	int	fd;
268*41edb306SCy Schubert {
269*41edb306SCy Schubert 	dl_detach_req_t	detach_req;
270*41edb306SCy Schubert 	struct	strbuf	ctl;
271*41edb306SCy Schubert 	int	flags;
272*41edb306SCy Schubert 
273*41edb306SCy Schubert 	detach_req.dl_primitive = DL_DETACH_REQ;
274*41edb306SCy Schubert 
275*41edb306SCy Schubert 	ctl.maxlen = 0;
276*41edb306SCy Schubert 	ctl.len = sizeof (detach_req);
277*41edb306SCy Schubert 	ctl.buf = (char *) &detach_req;
278*41edb306SCy Schubert 
279*41edb306SCy Schubert 	flags = 0;
280*41edb306SCy Schubert 
281*41edb306SCy Schubert 	if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)
282*41edb306SCy Schubert 		syserr("dldetachreq:  putmsg");
283*41edb306SCy Schubert }
284*41edb306SCy Schubert 
285*41edb306SCy Schubert void
286*41edb306SCy Schubert dlbindreq(fd, sap, max_conind, service_mode, conn_mgmt, xidtest)
287*41edb306SCy Schubert 	int	fd;
288*41edb306SCy Schubert 	u_long	sap;
289*41edb306SCy Schubert 	u_long	max_conind;
290*41edb306SCy Schubert 	u_long	service_mode;
291*41edb306SCy Schubert 	u_long	conn_mgmt;
292*41edb306SCy Schubert 	u_long	xidtest;
293*41edb306SCy Schubert {
294*41edb306SCy Schubert 	dl_bind_req_t	bind_req;
295*41edb306SCy Schubert 	struct	strbuf	ctl;
296*41edb306SCy Schubert 	int	flags;
297*41edb306SCy Schubert 
298*41edb306SCy Schubert 	bind_req.dl_primitive = DL_BIND_REQ;
299*41edb306SCy Schubert 	bind_req.dl_sap = sap;
300*41edb306SCy Schubert 	bind_req.dl_max_conind = max_conind;
301*41edb306SCy Schubert 	bind_req.dl_service_mode = service_mode;
302*41edb306SCy Schubert 	bind_req.dl_conn_mgmt = conn_mgmt;
303*41edb306SCy Schubert 	bind_req.dl_xidtest_flg = xidtest;
304*41edb306SCy Schubert 
305*41edb306SCy Schubert 	ctl.maxlen = 0;
306*41edb306SCy Schubert 	ctl.len = sizeof (bind_req);
307*41edb306SCy Schubert 	ctl.buf = (char *) &bind_req;
308*41edb306SCy Schubert 
309*41edb306SCy Schubert 	flags = 0;
310*41edb306SCy Schubert 
311*41edb306SCy Schubert 	if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)
312*41edb306SCy Schubert 		syserr("dlbindreq:  putmsg");
313*41edb306SCy Schubert }
314*41edb306SCy Schubert 
315*41edb306SCy Schubert void
316*41edb306SCy Schubert dlunitdatareq(fd, addrp, addrlen, minpri, maxpri, datap, datalen)
317*41edb306SCy Schubert 	int	fd;
318*41edb306SCy Schubert 	u_char	*addrp;
319*41edb306SCy Schubert 	int	addrlen;
320*41edb306SCy Schubert 	u_long	minpri, maxpri;
321*41edb306SCy Schubert 	u_char	*datap;
322*41edb306SCy Schubert 	int	datalen;
323*41edb306SCy Schubert {
324*41edb306SCy Schubert 	long	buf[MAXDLBUF];
325*41edb306SCy Schubert 	union	DL_primitives	*dlp;
326*41edb306SCy Schubert 	struct	strbuf	data, ctl;
327*41edb306SCy Schubert 
328*41edb306SCy Schubert 	dlp = (union DL_primitives*) buf;
329*41edb306SCy Schubert 
330*41edb306SCy Schubert 	dlp->unitdata_req.dl_primitive = DL_UNITDATA_REQ;
331*41edb306SCy Schubert 	dlp->unitdata_req.dl_dest_addr_length = addrlen;
332*41edb306SCy Schubert 	dlp->unitdata_req.dl_dest_addr_offset = sizeof (dl_unitdata_req_t);
333*41edb306SCy Schubert 	dlp->unitdata_req.dl_priority.dl_min = minpri;
334*41edb306SCy Schubert 	dlp->unitdata_req.dl_priority.dl_max = maxpri;
335*41edb306SCy Schubert 
336*41edb306SCy Schubert 	(void) memcpy(OFFADDR(dlp, sizeof (dl_unitdata_req_t)), addrp, addrlen);
337*41edb306SCy Schubert 
338*41edb306SCy Schubert 	ctl.maxlen = 0;
339*41edb306SCy Schubert 	ctl.len = sizeof (dl_unitdata_req_t) + addrlen;
340*41edb306SCy Schubert 	ctl.buf = (char *) buf;
341*41edb306SCy Schubert 
342*41edb306SCy Schubert 	data.maxlen = 0;
343*41edb306SCy Schubert 	data.len = datalen;
344*41edb306SCy Schubert 	data.buf = (char *) datap;
345*41edb306SCy Schubert 
346*41edb306SCy Schubert 	if (putmsg(fd, &ctl, &data, 0) < 0)
347*41edb306SCy Schubert 		syserr("dlunitdatareq:  putmsg");
348*41edb306SCy Schubert }
349*41edb306SCy Schubert 
350*41edb306SCy Schubert void
351*41edb306SCy Schubert dlunbindreq(fd)
352*41edb306SCy Schubert 	int	fd;
353*41edb306SCy Schubert {
354*41edb306SCy Schubert 	dl_unbind_req_t	unbind_req;
355*41edb306SCy Schubert 	struct	strbuf	ctl;
356*41edb306SCy Schubert 	int	flags;
357*41edb306SCy Schubert 
358*41edb306SCy Schubert 	unbind_req.dl_primitive = DL_UNBIND_REQ;
359*41edb306SCy Schubert 
360*41edb306SCy Schubert 	ctl.maxlen = 0;
361*41edb306SCy Schubert 	ctl.len = sizeof (unbind_req);
362*41edb306SCy Schubert 	ctl.buf = (char *) &unbind_req;
363*41edb306SCy Schubert 
364*41edb306SCy Schubert 	flags = 0;
365*41edb306SCy Schubert 
366*41edb306SCy Schubert 	if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)
367*41edb306SCy Schubert 		syserr("dlunbindreq:  putmsg");
368*41edb306SCy Schubert }
369*41edb306SCy Schubert 
370*41edb306SCy Schubert void
371*41edb306SCy Schubert dlokack(fd, bufp)
372*41edb306SCy Schubert 	int	fd;
373*41edb306SCy Schubert 	char	*bufp;
374*41edb306SCy Schubert {
375*41edb306SCy Schubert 	union	DL_primitives	*dlp;
376*41edb306SCy Schubert 	struct	strbuf	ctl;
377*41edb306SCy Schubert 	int	flags;
378*41edb306SCy Schubert 
379*41edb306SCy Schubert 	ctl.maxlen = MAXDLBUF;
380*41edb306SCy Schubert 	ctl.len = 0;
381*41edb306SCy Schubert 	ctl.buf = bufp;
382*41edb306SCy Schubert 
383*41edb306SCy Schubert 	strgetmsg(fd, &ctl, (struct strbuf*)NULL, &flags, "dlokack");
384*41edb306SCy Schubert 
385*41edb306SCy Schubert 	dlp = (union DL_primitives *) ctl.buf;
386*41edb306SCy Schubert 
387*41edb306SCy Schubert 	expecting(DL_OK_ACK, dlp);
388*41edb306SCy Schubert 
389*41edb306SCy Schubert 	if (ctl.len < sizeof (dl_ok_ack_t))
390*41edb306SCy Schubert 		err("dlokack:  response ctl.len too short:  %d", ctl.len);
391*41edb306SCy Schubert 
392*41edb306SCy Schubert 	if (flags != RS_HIPRI)
393*41edb306SCy Schubert 		err("dlokack:  DL_OK_ACK was not M_PCPROTO");
394*41edb306SCy Schubert 
395*41edb306SCy Schubert 	if (ctl.len < sizeof (dl_ok_ack_t))
396*41edb306SCy Schubert 		err("dlokack:  short response ctl.len:  %d", ctl.len);
397*41edb306SCy Schubert }
398*41edb306SCy Schubert 
399*41edb306SCy Schubert void
400*41edb306SCy Schubert dlerrorack(fd, bufp)
401*41edb306SCy Schubert 	int	fd;
402*41edb306SCy Schubert 	char	*bufp;
403*41edb306SCy Schubert {
404*41edb306SCy Schubert 	union	DL_primitives	*dlp;
405*41edb306SCy Schubert 	struct	strbuf	ctl;
406*41edb306SCy Schubert 	int	flags;
407*41edb306SCy Schubert 
408*41edb306SCy Schubert 	ctl.maxlen = MAXDLBUF;
409*41edb306SCy Schubert 	ctl.len = 0;
410*41edb306SCy Schubert 	ctl.buf = bufp;
411*41edb306SCy Schubert 
412*41edb306SCy Schubert 	strgetmsg(fd, &ctl, (struct strbuf*)NULL, &flags, "dlerrorack");
413*41edb306SCy Schubert 
414*41edb306SCy Schubert 	dlp = (union DL_primitives *) ctl.buf;
415*41edb306SCy Schubert 
416*41edb306SCy Schubert 	expecting(DL_ERROR_ACK, dlp);
417*41edb306SCy Schubert 
418*41edb306SCy Schubert 	if (ctl.len < sizeof (dl_error_ack_t))
419*41edb306SCy Schubert 		err("dlerrorack:  response ctl.len too short:  %d", ctl.len);
420*41edb306SCy Schubert 
421*41edb306SCy Schubert 	if (flags != RS_HIPRI)
422*41edb306SCy Schubert 		err("dlerrorack:  DL_OK_ACK was not M_PCPROTO");
423*41edb306SCy Schubert 
424*41edb306SCy Schubert 	if (ctl.len < sizeof (dl_error_ack_t))
425*41edb306SCy Schubert 		err("dlerrorack:  short response ctl.len:  %d", ctl.len);
426*41edb306SCy Schubert }
427*41edb306SCy Schubert 
428*41edb306SCy Schubert void
429*41edb306SCy Schubert dlbindack(fd, bufp)
430*41edb306SCy Schubert 	int	fd;
431*41edb306SCy Schubert 	char	*bufp;
432*41edb306SCy Schubert {
433*41edb306SCy Schubert 	union	DL_primitives	*dlp;
434*41edb306SCy Schubert 	struct	strbuf	ctl;
435*41edb306SCy Schubert 	int	flags;
436*41edb306SCy Schubert 
437*41edb306SCy Schubert 	ctl.maxlen = MAXDLBUF;
438*41edb306SCy Schubert 	ctl.len = 0;
439*41edb306SCy Schubert 	ctl.buf = bufp;
440*41edb306SCy Schubert 
441*41edb306SCy Schubert 	strgetmsg(fd, &ctl, (struct strbuf*)NULL, &flags, "dlbindack");
442*41edb306SCy Schubert 
443*41edb306SCy Schubert 	dlp = (union DL_primitives *) ctl.buf;
444*41edb306SCy Schubert 
445*41edb306SCy Schubert 	expecting(DL_BIND_ACK, dlp);
446*41edb306SCy Schubert 
447*41edb306SCy Schubert 	if (flags != RS_HIPRI)
448*41edb306SCy Schubert 		err("dlbindack:  DL_OK_ACK was not M_PCPROTO");
449*41edb306SCy Schubert 
450*41edb306SCy Schubert 	if (ctl.len < sizeof (dl_bind_ack_t))
451*41edb306SCy Schubert 		err("dlbindack:  short response ctl.len:  %d", ctl.len);
452*41edb306SCy Schubert }
453*41edb306SCy Schubert 
454*41edb306SCy Schubert void
455*41edb306SCy Schubert dlphysaddrack(fd, bufp)
456*41edb306SCy Schubert 	int	fd;
457*41edb306SCy Schubert 	char	*bufp;
458*41edb306SCy Schubert {
459*41edb306SCy Schubert 	union	DL_primitives	*dlp;
460*41edb306SCy Schubert 	struct	strbuf	ctl;
461*41edb306SCy Schubert 	int	flags;
462*41edb306SCy Schubert 
463*41edb306SCy Schubert 	ctl.maxlen = MAXDLBUF;
464*41edb306SCy Schubert 	ctl.len = 0;
465*41edb306SCy Schubert 	ctl.buf = bufp;
466*41edb306SCy Schubert 
467*41edb306SCy Schubert 	strgetmsg(fd, &ctl, (struct strbuf*)NULL, &flags, "dlphysaddrack");
468*41edb306SCy Schubert 
469*41edb306SCy Schubert 	dlp = (union DL_primitives *) ctl.buf;
470*41edb306SCy Schubert 
471*41edb306SCy Schubert 	expecting(DL_PHYS_ADDR_ACK, dlp);
472*41edb306SCy Schubert 
473*41edb306SCy Schubert 	if (flags != RS_HIPRI)
474*41edb306SCy Schubert 		err("dlbindack:  DL_OK_ACK was not M_PCPROTO");
475*41edb306SCy Schubert 
476*41edb306SCy Schubert 	if (ctl.len < sizeof (dl_phys_addr_ack_t))
477*41edb306SCy Schubert 		err("dlphysaddrack:  short response ctl.len:  %d", ctl.len);
478*41edb306SCy Schubert }
479*41edb306SCy Schubert 
480*41edb306SCy Schubert void
481*41edb306SCy Schubert sigalrm()
482*41edb306SCy Schubert {
483*41edb306SCy Schubert 	(void) err("sigalrm:  TIMEOUT");
484*41edb306SCy Schubert }
485*41edb306SCy Schubert 
486*41edb306SCy Schubert strgetmsg(fd, ctlp, datap, flagsp, caller)
487*41edb306SCy Schubert 	int	fd;
488*41edb306SCy Schubert 	struct	strbuf	*ctlp, *datap;
489*41edb306SCy Schubert 	int	*flagsp;
490*41edb306SCy Schubert 	char	*caller;
491*41edb306SCy Schubert {
492*41edb306SCy Schubert 	int	rc;
493*41edb306SCy Schubert 	static	char	errmsg[80];
494*41edb306SCy Schubert 
495*41edb306SCy Schubert 	/*
496*41edb306SCy Schubert 	 * Start timer.
497*41edb306SCy Schubert 	 */
498*41edb306SCy Schubert 	(void) signal(SIGALRM, sigalrm);
499*41edb306SCy Schubert 	if (alarm(MAXWAIT) < 0) {
500*41edb306SCy Schubert 		(void) snprintf(errmsg, sizeof(errmsg), "%s:  alarm", caller);
501*41edb306SCy Schubert 		syserr(errmsg);
502*41edb306SCy Schubert 	}
503*41edb306SCy Schubert 
504*41edb306SCy Schubert 	/*
505*41edb306SCy Schubert 	 * Set flags argument and issue getmsg().
506*41edb306SCy Schubert 	 */
507*41edb306SCy Schubert 	*flagsp = 0;
508*41edb306SCy Schubert 	if ((rc = getmsg(fd, ctlp, datap, flagsp)) < 0) {
509*41edb306SCy Schubert 		(void) snprintf(errmsg, sizeof(errmsg), "%s:  getmsg", caller);
510*41edb306SCy Schubert 		syserr(errmsg);
511*41edb306SCy Schubert 	}
512*41edb306SCy Schubert 
513*41edb306SCy Schubert 	/*
514*41edb306SCy Schubert 	 * Stop timer.
515*41edb306SCy Schubert 	 */
516*41edb306SCy Schubert 	if (alarm(0) < 0) {
517*41edb306SCy Schubert 		(void) snprintf(errmsg, sizeof(errmsg), "%s:  alarm", caller);
518*41edb306SCy Schubert 		syserr(errmsg);
519*41edb306SCy Schubert 	}
520*41edb306SCy Schubert 
521*41edb306SCy Schubert 	/*
522*41edb306SCy Schubert 	 * Check for MOREDATA and/or MORECTL.
523*41edb306SCy Schubert 	 */
524*41edb306SCy Schubert 	if ((rc & (MORECTL | MOREDATA)) == (MORECTL | MOREDATA))
525*41edb306SCy Schubert 		err("%s:  MORECTL|MOREDATA", caller);
526*41edb306SCy Schubert 	if (rc & MORECTL)
527*41edb306SCy Schubert 		err("%s:  MORECTL", caller);
528*41edb306SCy Schubert 	if (rc & MOREDATA)
529*41edb306SCy Schubert 		err("%s:  MOREDATA", caller);
530*41edb306SCy Schubert 
531*41edb306SCy Schubert 	/*
532*41edb306SCy Schubert 	 * Check for at least sizeof (long) control data portion.
533*41edb306SCy Schubert 	 */
534*41edb306SCy Schubert 	if (ctlp->len < sizeof (long))
535*41edb306SCy Schubert 		err("getmsg:  control portion length < sizeof (long):  %d", ctlp->len);
536*41edb306SCy Schubert }
537*41edb306SCy Schubert 
538*41edb306SCy Schubert expecting(prim, dlp)
539*41edb306SCy Schubert 	int	prim;
540*41edb306SCy Schubert 	union	DL_primitives	*dlp;
541*41edb306SCy Schubert {
542*41edb306SCy Schubert 	if (dlp->dl_primitive != (u_long)prim) {
543*41edb306SCy Schubert 		printdlprim(dlp);
544*41edb306SCy Schubert 		err("expected %s got %s", dlprim(prim),
545*41edb306SCy Schubert 			dlprim(dlp->dl_primitive));
546*41edb306SCy Schubert 		exit(1);
547*41edb306SCy Schubert 	}
548*41edb306SCy Schubert }
549*41edb306SCy Schubert 
550*41edb306SCy Schubert /*
551*41edb306SCy Schubert  * Print any DLPI msg in human readable format.
552*41edb306SCy Schubert  */
553*41edb306SCy Schubert printdlprim(dlp)
554*41edb306SCy Schubert 	union	DL_primitives	*dlp;
555*41edb306SCy Schubert {
556*41edb306SCy Schubert 	switch (dlp->dl_primitive) {
557*41edb306SCy Schubert 		case DL_INFO_REQ:
558*41edb306SCy Schubert 			printdlinforeq(dlp);
559*41edb306SCy Schubert 			break;
560*41edb306SCy Schubert 
561*41edb306SCy Schubert 		case DL_INFO_ACK:
562*41edb306SCy Schubert 			printdlinfoack(dlp);
563*41edb306SCy Schubert 			break;
564*41edb306SCy Schubert 
565*41edb306SCy Schubert 		case DL_ATTACH_REQ:
566*41edb306SCy Schubert 			printdlattachreq(dlp);
567*41edb306SCy Schubert 			break;
568*41edb306SCy Schubert 
569*41edb306SCy Schubert 		case DL_OK_ACK:
570*41edb306SCy Schubert 			printdlokack(dlp);
571*41edb306SCy Schubert 			break;
572*41edb306SCy Schubert 
573*41edb306SCy Schubert 		case DL_ERROR_ACK:
574*41edb306SCy Schubert 			printdlerrorack(dlp);
575*41edb306SCy Schubert 			break;
576*41edb306SCy Schubert 
577*41edb306SCy Schubert 		case DL_DETACH_REQ:
578*41edb306SCy Schubert 			printdldetachreq(dlp);
579*41edb306SCy Schubert 			break;
580*41edb306SCy Schubert 
581*41edb306SCy Schubert 		case DL_BIND_REQ:
582*41edb306SCy Schubert 			printdlbindreq(dlp);
583*41edb306SCy Schubert 			break;
584*41edb306SCy Schubert 
585*41edb306SCy Schubert 		case DL_BIND_ACK:
586*41edb306SCy Schubert 			printdlbindack(dlp);
587*41edb306SCy Schubert 			break;
588*41edb306SCy Schubert 
589*41edb306SCy Schubert 		case DL_UNBIND_REQ:
590*41edb306SCy Schubert 			printdlunbindreq(dlp);
591*41edb306SCy Schubert 			break;
592*41edb306SCy Schubert 
593*41edb306SCy Schubert 		case DL_SUBS_BIND_REQ:
594*41edb306SCy Schubert 			printdlsubsbindreq(dlp);
595*41edb306SCy Schubert 			break;
596*41edb306SCy Schubert 
597*41edb306SCy Schubert 		case DL_SUBS_BIND_ACK:
598*41edb306SCy Schubert 			printdlsubsbindack(dlp);
599*41edb306SCy Schubert 			break;
600*41edb306SCy Schubert 
601*41edb306SCy Schubert 		case DL_SUBS_UNBIND_REQ:
602*41edb306SCy Schubert 			printdlsubsunbindreq(dlp);
603*41edb306SCy Schubert 			break;
604*41edb306SCy Schubert 
605*41edb306SCy Schubert 		case DL_ENABMULTI_REQ:
606*41edb306SCy Schubert 			printdlenabmultireq(dlp);
607*41edb306SCy Schubert 			break;
608*41edb306SCy Schubert 
609*41edb306SCy Schubert 		case DL_DISABMULTI_REQ:
610*41edb306SCy Schubert 			printdldisabmultireq(dlp);
611*41edb306SCy Schubert 			break;
612*41edb306SCy Schubert 
613*41edb306SCy Schubert 		case DL_PROMISCON_REQ:
614*41edb306SCy Schubert 			printdlpromisconreq(dlp);
615*41edb306SCy Schubert 			break;
616*41edb306SCy Schubert 
617*41edb306SCy Schubert 		case DL_PROMISCOFF_REQ:
618*41edb306SCy Schubert 			printdlpromiscoffreq(dlp);
619*41edb306SCy Schubert 			break;
620*41edb306SCy Schubert 
621*41edb306SCy Schubert 		case DL_UNITDATA_REQ:
622*41edb306SCy Schubert 			printdlunitdatareq(dlp);
623*41edb306SCy Schubert 			break;
624*41edb306SCy Schubert 
625*41edb306SCy Schubert 		case DL_UNITDATA_IND:
626*41edb306SCy Schubert 			printdlunitdataind(dlp);
627*41edb306SCy Schubert 			break;
628*41edb306SCy Schubert 
629*41edb306SCy Schubert 		case DL_UDERROR_IND:
630*41edb306SCy Schubert 			printdluderrorind(dlp);
631*41edb306SCy Schubert 			break;
632*41edb306SCy Schubert 
633*41edb306SCy Schubert 		case DL_UDQOS_REQ:
634*41edb306SCy Schubert 			printdludqosreq(dlp);
635*41edb306SCy Schubert 			break;
636*41edb306SCy Schubert 
637*41edb306SCy Schubert 		case DL_PHYS_ADDR_REQ:
638*41edb306SCy Schubert 			printdlphysaddrreq(dlp);
639*41edb306SCy Schubert 			break;
640*41edb306SCy Schubert 
641*41edb306SCy Schubert 		case DL_PHYS_ADDR_ACK:
642*41edb306SCy Schubert 			printdlphysaddrack(dlp);
643*41edb306SCy Schubert 			break;
644*41edb306SCy Schubert 
645*41edb306SCy Schubert 		case DL_SET_PHYS_ADDR_REQ:
646*41edb306SCy Schubert 			printdlsetphysaddrreq(dlp);
647*41edb306SCy Schubert 			break;
648*41edb306SCy Schubert 
649*41edb306SCy Schubert 		default:
650*41edb306SCy Schubert 			err("printdlprim:  unknown primitive type 0x%x",
651*41edb306SCy Schubert 				dlp->dl_primitive);
652*41edb306SCy Schubert 			break;
653*41edb306SCy Schubert 	}
654*41edb306SCy Schubert }
655*41edb306SCy Schubert 
656*41edb306SCy Schubert /* ARGSUSED */
657*41edb306SCy Schubert printdlinforeq(dlp)
658*41edb306SCy Schubert 	union	DL_primitives	*dlp;
659*41edb306SCy Schubert {
660*41edb306SCy Schubert 	(void) printf("DL_INFO_REQ\n");
661*41edb306SCy Schubert }
662*41edb306SCy Schubert 
663*41edb306SCy Schubert printdlinfoack(dlp)
664*41edb306SCy Schubert 	union	DL_primitives	*dlp;
665*41edb306SCy Schubert {
666*41edb306SCy Schubert 	u_char	addr[MAXDLADDR];
667*41edb306SCy Schubert 	u_char	brdcst[MAXDLADDR];
668*41edb306SCy Schubert 
669*41edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->info_ack.dl_addr_offset),
670*41edb306SCy Schubert 		dlp->info_ack.dl_addr_length, addr);
671*41edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->info_ack.dl_brdcst_addr_offset),
672*41edb306SCy Schubert 		dlp->info_ack.dl_brdcst_addr_length, brdcst);
673*41edb306SCy Schubert 
674*41edb306SCy Schubert 	(void) printf("DL_INFO_ACK:  max_sdu %d min_sdu %d\n",
675*41edb306SCy Schubert 		dlp->info_ack.dl_max_sdu,
676*41edb306SCy Schubert 		dlp->info_ack.dl_min_sdu);
677*41edb306SCy Schubert 	(void) printf("addr_length %d mac_type %s current_state %s\n",
678*41edb306SCy Schubert 		dlp->info_ack.dl_addr_length,
679*41edb306SCy Schubert 		dlmactype(dlp->info_ack.dl_mac_type),
680*41edb306SCy Schubert 		dlstate(dlp->info_ack.dl_current_state));
681*41edb306SCy Schubert 	(void) printf("sap_length %d service_mode %s qos_length %d\n",
682*41edb306SCy Schubert 		dlp->info_ack.dl_sap_length,
683*41edb306SCy Schubert 		dlservicemode(dlp->info_ack.dl_service_mode),
684*41edb306SCy Schubert 		dlp->info_ack.dl_qos_length);
685*41edb306SCy Schubert 	(void) printf("qos_offset %d qos_range_length %d qos_range_offset %d\n",
686*41edb306SCy Schubert 		dlp->info_ack.dl_qos_offset,
687*41edb306SCy Schubert 		dlp->info_ack.dl_qos_range_length,
688*41edb306SCy Schubert 		dlp->info_ack.dl_qos_range_offset);
689*41edb306SCy Schubert 	(void) printf("provider_style %s addr_offset %d version %d\n",
690*41edb306SCy Schubert 		dlstyle(dlp->info_ack.dl_provider_style),
691*41edb306SCy Schubert 		dlp->info_ack.dl_addr_offset,
692*41edb306SCy Schubert 		dlp->info_ack.dl_version);
693*41edb306SCy Schubert 	(void) printf("brdcst_addr_length %d brdcst_addr_offset %d\n",
694*41edb306SCy Schubert 		dlp->info_ack.dl_brdcst_addr_length,
695*41edb306SCy Schubert 		dlp->info_ack.dl_brdcst_addr_offset);
696*41edb306SCy Schubert 	(void) printf("addr %s\n", addr);
697*41edb306SCy Schubert 	(void) printf("brdcst_addr %s\n", brdcst);
698*41edb306SCy Schubert }
699*41edb306SCy Schubert 
700*41edb306SCy Schubert printdlattachreq(dlp)
701*41edb306SCy Schubert 	union	DL_primitives	*dlp;
702*41edb306SCy Schubert {
703*41edb306SCy Schubert 	(void) printf("DL_ATTACH_REQ:  ppa %d\n",
704*41edb306SCy Schubert 		dlp->attach_req.dl_ppa);
705*41edb306SCy Schubert }
706*41edb306SCy Schubert 
707*41edb306SCy Schubert printdlokack(dlp)
708*41edb306SCy Schubert 	union	DL_primitives	*dlp;
709*41edb306SCy Schubert {
710*41edb306SCy Schubert 	(void) printf("DL_OK_ACK:  correct_primitive %s\n",
711*41edb306SCy Schubert 		dlprim(dlp->ok_ack.dl_correct_primitive));
712*41edb306SCy Schubert }
713*41edb306SCy Schubert 
714*41edb306SCy Schubert printdlerrorack(dlp)
715*41edb306SCy Schubert 	union	DL_primitives	*dlp;
716*41edb306SCy Schubert {
717*41edb306SCy Schubert 	(void) printf("DL_ERROR_ACK:  error_primitive %s errno %s unix_errno %d: %s\n",
718*41edb306SCy Schubert 		dlprim(dlp->error_ack.dl_error_primitive),
719*41edb306SCy Schubert 		dlerrno(dlp->error_ack.dl_errno),
720*41edb306SCy Schubert 		dlp->error_ack.dl_unix_errno,
721*41edb306SCy Schubert 		strerror(dlp->error_ack.dl_unix_errno));
722*41edb306SCy Schubert }
723*41edb306SCy Schubert 
724*41edb306SCy Schubert printdlenabmultireq(dlp)
725*41edb306SCy Schubert 	union	DL_primitives	*dlp;
726*41edb306SCy Schubert {
727*41edb306SCy Schubert 	u_char	addr[MAXDLADDR];
728*41edb306SCy Schubert 
729*41edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->enabmulti_req.dl_addr_offset),
730*41edb306SCy Schubert 		dlp->enabmulti_req.dl_addr_length, addr);
731*41edb306SCy Schubert 
732*41edb306SCy Schubert 	(void) printf("DL_ENABMULTI_REQ:  addr_length %d addr_offset %d\n",
733*41edb306SCy Schubert 		dlp->enabmulti_req.dl_addr_length,
734*41edb306SCy Schubert 		dlp->enabmulti_req.dl_addr_offset);
735*41edb306SCy Schubert 	(void) printf("addr %s\n", addr);
736*41edb306SCy Schubert }
737*41edb306SCy Schubert 
738*41edb306SCy Schubert printdldisabmultireq(dlp)
739*41edb306SCy Schubert 	union	DL_primitives	*dlp;
740*41edb306SCy Schubert {
741*41edb306SCy Schubert 	u_char	addr[MAXDLADDR];
742*41edb306SCy Schubert 
743*41edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->disabmulti_req.dl_addr_offset),
744*41edb306SCy Schubert 		dlp->disabmulti_req.dl_addr_length, addr);
745*41edb306SCy Schubert 
746*41edb306SCy Schubert 	(void) printf("DL_DISABMULTI_REQ:  addr_length %d addr_offset %d\n",
747*41edb306SCy Schubert 		dlp->disabmulti_req.dl_addr_length,
748*41edb306SCy Schubert 		dlp->disabmulti_req.dl_addr_offset);
749*41edb306SCy Schubert 	(void) printf("addr %s\n", addr);
750*41edb306SCy Schubert }
751*41edb306SCy Schubert 
752*41edb306SCy Schubert printdlpromisconreq(dlp)
753*41edb306SCy Schubert 	union	DL_primitives	*dlp;
754*41edb306SCy Schubert {
755*41edb306SCy Schubert 	(void) printf("DL_PROMISCON_REQ:  level %s\n",
756*41edb306SCy Schubert 		dlpromisclevel(dlp->promiscon_req.dl_level));
757*41edb306SCy Schubert }
758*41edb306SCy Schubert 
759*41edb306SCy Schubert printdlpromiscoffreq(dlp)
760*41edb306SCy Schubert 	union	DL_primitives	*dlp;
761*41edb306SCy Schubert {
762*41edb306SCy Schubert 	(void) printf("DL_PROMISCOFF_REQ:  level %s\n",
763*41edb306SCy Schubert 		dlpromisclevel(dlp->promiscoff_req.dl_level));
764*41edb306SCy Schubert }
765*41edb306SCy Schubert 
766*41edb306SCy Schubert printdlphysaddrreq(dlp)
767*41edb306SCy Schubert 	union	DL_primitives	*dlp;
768*41edb306SCy Schubert {
769*41edb306SCy Schubert 	(void) printf("DL_PHYS_ADDR_REQ:  addr_type 0x%x\n",
770*41edb306SCy Schubert 		dlp->physaddr_req.dl_addr_type);
771*41edb306SCy Schubert }
772*41edb306SCy Schubert 
773*41edb306SCy Schubert printdlphysaddrack(dlp)
774*41edb306SCy Schubert 	union	DL_primitives	*dlp;
775*41edb306SCy Schubert {
776*41edb306SCy Schubert 	u_char	addr[MAXDLADDR];
777*41edb306SCy Schubert 
778*41edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->physaddr_ack.dl_addr_offset),
779*41edb306SCy Schubert 		dlp->physaddr_ack.dl_addr_length, addr);
780*41edb306SCy Schubert 
781*41edb306SCy Schubert 	(void) printf("DL_PHYS_ADDR_ACK:  addr_length %d addr_offset %d\n",
782*41edb306SCy Schubert 		dlp->physaddr_ack.dl_addr_length,
783*41edb306SCy Schubert 		dlp->physaddr_ack.dl_addr_offset);
784*41edb306SCy Schubert 	(void) printf("addr %s\n", addr);
785*41edb306SCy Schubert }
786*41edb306SCy Schubert 
787*41edb306SCy Schubert printdlsetphysaddrreq(dlp)
788*41edb306SCy Schubert 	union	DL_primitives	*dlp;
789*41edb306SCy Schubert {
790*41edb306SCy Schubert 	u_char	addr[MAXDLADDR];
791*41edb306SCy Schubert 
792*41edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->set_physaddr_req.dl_addr_offset),
793*41edb306SCy Schubert 		dlp->set_physaddr_req.dl_addr_length, addr);
794*41edb306SCy Schubert 
795*41edb306SCy Schubert 	(void) printf("DL_SET_PHYS_ADDR_REQ:  addr_length %d addr_offset %d\n",
796*41edb306SCy Schubert 		dlp->set_physaddr_req.dl_addr_length,
797*41edb306SCy Schubert 		dlp->set_physaddr_req.dl_addr_offset);
798*41edb306SCy Schubert 	(void) printf("addr %s\n", addr);
799*41edb306SCy Schubert }
800*41edb306SCy Schubert 
801*41edb306SCy Schubert /* ARGSUSED */
802*41edb306SCy Schubert printdldetachreq(dlp)
803*41edb306SCy Schubert 	union	DL_primitives	*dlp;
804*41edb306SCy Schubert {
805*41edb306SCy Schubert 	(void) printf("DL_DETACH_REQ\n");
806*41edb306SCy Schubert }
807*41edb306SCy Schubert 
808*41edb306SCy Schubert printdlbindreq(dlp)
809*41edb306SCy Schubert 	union	DL_primitives	*dlp;
810*41edb306SCy Schubert {
811*41edb306SCy Schubert 	(void) printf("DL_BIND_REQ:  sap %d max_conind %d\n",
812*41edb306SCy Schubert 		dlp->bind_req.dl_sap,
813*41edb306SCy Schubert 		dlp->bind_req.dl_max_conind);
814*41edb306SCy Schubert 	(void) printf("service_mode %s conn_mgmt %d xidtest_flg 0x%x\n",
815*41edb306SCy Schubert 		dlservicemode(dlp->bind_req.dl_service_mode),
816*41edb306SCy Schubert 		dlp->bind_req.dl_conn_mgmt,
817*41edb306SCy Schubert 		dlp->bind_req.dl_xidtest_flg);
818*41edb306SCy Schubert }
819*41edb306SCy Schubert 
820*41edb306SCy Schubert printdlbindack(dlp)
821*41edb306SCy Schubert 	union	DL_primitives	*dlp;
822*41edb306SCy Schubert {
823*41edb306SCy Schubert 	u_char	addr[MAXDLADDR];
824*41edb306SCy Schubert 
825*41edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->bind_ack.dl_addr_offset),
826*41edb306SCy Schubert 		dlp->bind_ack.dl_addr_length, addr);
827*41edb306SCy Schubert 
828*41edb306SCy Schubert 	(void) printf("DL_BIND_ACK:  sap %d addr_length %d addr_offset %d\n",
829*41edb306SCy Schubert 		dlp->bind_ack.dl_sap,
830*41edb306SCy Schubert 		dlp->bind_ack.dl_addr_length,
831*41edb306SCy Schubert 		dlp->bind_ack.dl_addr_offset);
832*41edb306SCy Schubert 	(void) printf("max_conind %d xidtest_flg 0x%x\n",
833*41edb306SCy Schubert 		dlp->bind_ack.dl_max_conind,
834*41edb306SCy Schubert 		dlp->bind_ack.dl_xidtest_flg);
835*41edb306SCy Schubert 	(void) printf("addr %s\n", addr);
836*41edb306SCy Schubert }
837*41edb306SCy Schubert 
838*41edb306SCy Schubert /* ARGSUSED */
839*41edb306SCy Schubert printdlunbindreq(dlp)
840*41edb306SCy Schubert 	union	DL_primitives	*dlp;
841*41edb306SCy Schubert {
842*41edb306SCy Schubert 	(void) printf("DL_UNBIND_REQ\n");
843*41edb306SCy Schubert }
844*41edb306SCy Schubert 
845*41edb306SCy Schubert printdlsubsbindreq(dlp)
846*41edb306SCy Schubert 	union	DL_primitives	*dlp;
847*41edb306SCy Schubert {
848*41edb306SCy Schubert 	u_char	sap[MAXDLADDR];
849*41edb306SCy Schubert 
850*41edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->subs_bind_req.dl_subs_sap_offset),
851*41edb306SCy Schubert 		dlp->subs_bind_req.dl_subs_sap_length, sap);
852*41edb306SCy Schubert 
853*41edb306SCy Schubert 	(void) printf("DL_SUBS_BIND_REQ:  subs_sap_offset %d sub_sap_len %d\n",
854*41edb306SCy Schubert 		dlp->subs_bind_req.dl_subs_sap_offset,
855*41edb306SCy Schubert 		dlp->subs_bind_req.dl_subs_sap_length);
856*41edb306SCy Schubert 	(void) printf("sap %s\n", sap);
857*41edb306SCy Schubert }
858*41edb306SCy Schubert 
859*41edb306SCy Schubert printdlsubsbindack(dlp)
860*41edb306SCy Schubert 	union	DL_primitives	*dlp;
861*41edb306SCy Schubert {
862*41edb306SCy Schubert 	u_char	sap[MAXDLADDR];
863*41edb306SCy Schubert 
864*41edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->subs_bind_ack.dl_subs_sap_offset),
865*41edb306SCy Schubert 		dlp->subs_bind_ack.dl_subs_sap_length, sap);
866*41edb306SCy Schubert 
867*41edb306SCy Schubert 	(void) printf("DL_SUBS_BIND_ACK:  subs_sap_offset %d sub_sap_length %d\n",
868*41edb306SCy Schubert 		dlp->subs_bind_ack.dl_subs_sap_offset,
869*41edb306SCy Schubert 		dlp->subs_bind_ack.dl_subs_sap_length);
870*41edb306SCy Schubert 	(void) printf("sap %s\n", sap);
871*41edb306SCy Schubert }
872*41edb306SCy Schubert 
873*41edb306SCy Schubert printdlsubsunbindreq(dlp)
874*41edb306SCy Schubert 	union	DL_primitives	*dlp;
875*41edb306SCy Schubert {
876*41edb306SCy Schubert 	u_char	sap[MAXDLADDR];
877*41edb306SCy Schubert 
878*41edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->subs_unbind_req.dl_subs_sap_offset),
879*41edb306SCy Schubert 		dlp->subs_unbind_req.dl_subs_sap_length, sap);
880*41edb306SCy Schubert 
881*41edb306SCy Schubert 	(void) printf("DL_SUBS_UNBIND_REQ:  subs_sap_offset %d sub_sap_length %d\n",
882*41edb306SCy Schubert 		dlp->subs_unbind_req.dl_subs_sap_offset,
883*41edb306SCy Schubert 		dlp->subs_unbind_req.dl_subs_sap_length);
884*41edb306SCy Schubert 	(void) printf("sap %s\n", sap);
885*41edb306SCy Schubert }
886*41edb306SCy Schubert 
887*41edb306SCy Schubert printdlunitdatareq(dlp)
888*41edb306SCy Schubert 	union	DL_primitives	*dlp;
889*41edb306SCy Schubert {
890*41edb306SCy Schubert 	u_char	addr[MAXDLADDR];
891*41edb306SCy Schubert 
892*41edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->unitdata_req.dl_dest_addr_offset),
893*41edb306SCy Schubert 		dlp->unitdata_req.dl_dest_addr_length, addr);
894*41edb306SCy Schubert 
895*41edb306SCy Schubert 	(void) printf("DL_UNITDATA_REQ:  dest_addr_length %d dest_addr_offset %d\n",
896*41edb306SCy Schubert 		dlp->unitdata_req.dl_dest_addr_length,
897*41edb306SCy Schubert 		dlp->unitdata_req.dl_dest_addr_offset);
898*41edb306SCy Schubert 	(void) printf("dl_priority.min %d dl_priority.max %d\n",
899*41edb306SCy Schubert 		dlp->unitdata_req.dl_priority.dl_min,
900*41edb306SCy Schubert 		dlp->unitdata_req.dl_priority.dl_max);
901*41edb306SCy Schubert 	(void) printf("addr %s\n", addr);
902*41edb306SCy Schubert }
903*41edb306SCy Schubert 
904*41edb306SCy Schubert printdlunitdataind(dlp)
905*41edb306SCy Schubert 	union	DL_primitives	*dlp;
906*41edb306SCy Schubert {
907*41edb306SCy Schubert 	u_char	dest[MAXDLADDR];
908*41edb306SCy Schubert 	u_char	src[MAXDLADDR];
909*41edb306SCy Schubert 
910*41edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->unitdata_ind.dl_dest_addr_offset),
911*41edb306SCy Schubert 		dlp->unitdata_ind.dl_dest_addr_length, dest);
912*41edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->unitdata_ind.dl_src_addr_offset),
913*41edb306SCy Schubert 		dlp->unitdata_ind.dl_src_addr_length, src);
914*41edb306SCy Schubert 
915*41edb306SCy Schubert 	(void) printf("DL_UNITDATA_IND:  dest_addr_length %d dest_addr_offset %d\n",
916*41edb306SCy Schubert 		dlp->unitdata_ind.dl_dest_addr_length,
917*41edb306SCy Schubert 		dlp->unitdata_ind.dl_dest_addr_offset);
918*41edb306SCy Schubert 	(void) printf("src_addr_length %d src_addr_offset %d\n",
919*41edb306SCy Schubert 		dlp->unitdata_ind.dl_src_addr_length,
920*41edb306SCy Schubert 		dlp->unitdata_ind.dl_src_addr_offset);
921*41edb306SCy Schubert 	(void) printf("group_address 0x%x\n",
922*41edb306SCy Schubert 		dlp->unitdata_ind.dl_group_address);
923*41edb306SCy Schubert 	(void) printf("dest %s\n", dest);
924*41edb306SCy Schubert 	(void) printf("src %s\n", src);
925*41edb306SCy Schubert }
926*41edb306SCy Schubert 
927*41edb306SCy Schubert printdluderrorind(dlp)
928*41edb306SCy Schubert 	union	DL_primitives	*dlp;
929*41edb306SCy Schubert {
930*41edb306SCy Schubert 	u_char	addr[MAXDLADDR];
931*41edb306SCy Schubert 
932*41edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->uderror_ind.dl_dest_addr_offset),
933*41edb306SCy Schubert 		dlp->uderror_ind.dl_dest_addr_length, addr);
934*41edb306SCy Schubert 
935*41edb306SCy Schubert 	(void) printf("DL_UDERROR_IND:  dest_addr_length %d dest_addr_offset %d\n",
936*41edb306SCy Schubert 		dlp->uderror_ind.dl_dest_addr_length,
937*41edb306SCy Schubert 		dlp->uderror_ind.dl_dest_addr_offset);
938*41edb306SCy Schubert 	(void) printf("unix_errno %d errno %s\n",
939*41edb306SCy Schubert 		dlp->uderror_ind.dl_unix_errno,
940*41edb306SCy Schubert 		dlerrno(dlp->uderror_ind.dl_errno));
941*41edb306SCy Schubert 	(void) printf("addr %s\n", addr);
942*41edb306SCy Schubert }
943*41edb306SCy Schubert 
944*41edb306SCy Schubert printdltestreq(dlp)
945*41edb306SCy Schubert 	union	DL_primitives	*dlp;
946*41edb306SCy Schubert {
947*41edb306SCy Schubert 	u_char	addr[MAXDLADDR];
948*41edb306SCy Schubert 
949*41edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->test_req.dl_dest_addr_offset),
950*41edb306SCy Schubert 		dlp->test_req.dl_dest_addr_length, addr);
951*41edb306SCy Schubert 
952*41edb306SCy Schubert 	(void) printf("DL_TEST_REQ:  flag 0x%x dest_addr_length %d dest_addr_offset %d\n",
953*41edb306SCy Schubert 		dlp->test_req.dl_flag,
954*41edb306SCy Schubert 		dlp->test_req.dl_dest_addr_length,
955*41edb306SCy Schubert 		dlp->test_req.dl_dest_addr_offset);
956*41edb306SCy Schubert 	(void) printf("dest_addr %s\n", addr);
957*41edb306SCy Schubert }
958*41edb306SCy Schubert 
959*41edb306SCy Schubert printdltestind(dlp)
960*41edb306SCy Schubert 	union	DL_primitives	*dlp;
961*41edb306SCy Schubert {
962*41edb306SCy Schubert 	u_char	dest[MAXDLADDR];
963*41edb306SCy Schubert 	u_char	src[MAXDLADDR];
964*41edb306SCy Schubert 
965*41edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->test_ind.dl_dest_addr_offset),
966*41edb306SCy Schubert 		dlp->test_ind.dl_dest_addr_length, dest);
967*41edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->test_ind.dl_src_addr_offset),
968*41edb306SCy Schubert 		dlp->test_ind.dl_src_addr_length, src);
969*41edb306SCy Schubert 
970*41edb306SCy Schubert 	(void) printf("DL_TEST_IND:  flag 0x%x dest_addr_length %d dest_addr_offset %d\n",
971*41edb306SCy Schubert 		dlp->test_ind.dl_flag,
972*41edb306SCy Schubert 		dlp->test_ind.dl_dest_addr_length,
973*41edb306SCy Schubert 		dlp->test_ind.dl_dest_addr_offset);
974*41edb306SCy Schubert 	(void) printf("src_addr_length %d src_addr_offset %d\n",
975*41edb306SCy Schubert 		dlp->test_ind.dl_src_addr_length,
976*41edb306SCy Schubert 		dlp->test_ind.dl_src_addr_offset);
977*41edb306SCy Schubert 	(void) printf("dest_addr %s\n", dest);
978*41edb306SCy Schubert 	(void) printf("src_addr %s\n", src);
979*41edb306SCy Schubert }
980*41edb306SCy Schubert 
981*41edb306SCy Schubert printdltestres(dlp)
982*41edb306SCy Schubert 	union	DL_primitives	*dlp;
983*41edb306SCy Schubert {
984*41edb306SCy Schubert 	u_char	dest[MAXDLADDR];
985*41edb306SCy Schubert 
986*41edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->test_res.dl_dest_addr_offset),
987*41edb306SCy Schubert 		dlp->test_res.dl_dest_addr_length, dest);
988*41edb306SCy Schubert 
989*41edb306SCy Schubert 	(void) printf("DL_TEST_RES:  flag 0x%x dest_addr_length %d dest_addr_offset %d\n",
990*41edb306SCy Schubert 		dlp->test_res.dl_flag,
991*41edb306SCy Schubert 		dlp->test_res.dl_dest_addr_length,
992*41edb306SCy Schubert 		dlp->test_res.dl_dest_addr_offset);
993*41edb306SCy Schubert 	(void) printf("dest_addr %s\n", dest);
994*41edb306SCy Schubert }
995*41edb306SCy Schubert 
996*41edb306SCy Schubert printdltestcon(dlp)
997*41edb306SCy Schubert 	union	DL_primitives	*dlp;
998*41edb306SCy Schubert {
999*41edb306SCy Schubert 	u_char	dest[MAXDLADDR];
1000*41edb306SCy Schubert 	u_char	src[MAXDLADDR];
1001*41edb306SCy Schubert 
1002*41edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->test_con.dl_dest_addr_offset),
1003*41edb306SCy Schubert 		dlp->test_con.dl_dest_addr_length, dest);
1004*41edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->test_con.dl_src_addr_offset),
1005*41edb306SCy Schubert 		dlp->test_con.dl_src_addr_length, src);
1006*41edb306SCy Schubert 
1007*41edb306SCy Schubert 	(void) printf("DL_TEST_CON:  flag 0x%x dest_addr_length %d dest_addr_offset %d\n",
1008*41edb306SCy Schubert 		dlp->test_con.dl_flag,
1009*41edb306SCy Schubert 		dlp->test_con.dl_dest_addr_length,
1010*41edb306SCy Schubert 		dlp->test_con.dl_dest_addr_offset);
1011*41edb306SCy Schubert 	(void) printf("src_addr_length %d src_addr_offset %d\n",
1012*41edb306SCy Schubert 		dlp->test_con.dl_src_addr_length,
1013*41edb306SCy Schubert 		dlp->test_con.dl_src_addr_offset);
1014*41edb306SCy Schubert 	(void) printf("dest_addr %s\n", dest);
1015*41edb306SCy Schubert 	(void) printf("src_addr %s\n", src);
1016*41edb306SCy Schubert }
1017*41edb306SCy Schubert 
1018*41edb306SCy Schubert printdlxidreq(dlp)
1019*41edb306SCy Schubert 	union	DL_primitives	*dlp;
1020*41edb306SCy Schubert {
1021*41edb306SCy Schubert 	u_char	dest[MAXDLADDR];
1022*41edb306SCy Schubert 
1023*41edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->xid_req.dl_dest_addr_offset),
1024*41edb306SCy Schubert 		dlp->xid_req.dl_dest_addr_length, dest);
1025*41edb306SCy Schubert 
1026*41edb306SCy Schubert 	(void) printf("DL_XID_REQ:  flag 0x%x dest_addr_length %d dest_addr_offset %d\n",
1027*41edb306SCy Schubert 		dlp->xid_req.dl_flag,
1028*41edb306SCy Schubert 		dlp->xid_req.dl_dest_addr_length,
1029*41edb306SCy Schubert 		dlp->xid_req.dl_dest_addr_offset);
1030*41edb306SCy Schubert 	(void) printf("dest_addr %s\n", dest);
1031*41edb306SCy Schubert }
1032*41edb306SCy Schubert 
1033*41edb306SCy Schubert printdlxidind(dlp)
1034*41edb306SCy Schubert 	union	DL_primitives	*dlp;
1035*41edb306SCy Schubert {
1036*41edb306SCy Schubert 	u_char	dest[MAXDLADDR];
1037*41edb306SCy Schubert 	u_char	src[MAXDLADDR];
1038*41edb306SCy Schubert 
1039*41edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->xid_ind.dl_dest_addr_offset),
1040*41edb306SCy Schubert 		dlp->xid_ind.dl_dest_addr_length, dest);
1041*41edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->xid_ind.dl_src_addr_offset),
1042*41edb306SCy Schubert 		dlp->xid_ind.dl_src_addr_length, src);
1043*41edb306SCy Schubert 
1044*41edb306SCy Schubert 	(void) printf("DL_XID_IND:  flag 0x%x dest_addr_length %d dest_addr_offset %d\n",
1045*41edb306SCy Schubert 		dlp->xid_ind.dl_flag,
1046*41edb306SCy Schubert 		dlp->xid_ind.dl_dest_addr_length,
1047*41edb306SCy Schubert 		dlp->xid_ind.dl_dest_addr_offset);
1048*41edb306SCy Schubert 	(void) printf("src_addr_length %d src_addr_offset %d\n",
1049*41edb306SCy Schubert 		dlp->xid_ind.dl_src_addr_length,
1050*41edb306SCy Schubert 		dlp->xid_ind.dl_src_addr_offset);
1051*41edb306SCy Schubert 	(void) printf("dest_addr %s\n", dest);
1052*41edb306SCy Schubert 	(void) printf("src_addr %s\n", src);
1053*41edb306SCy Schubert }
1054*41edb306SCy Schubert 
1055*41edb306SCy Schubert printdlxidres(dlp)
1056*41edb306SCy Schubert 	union	DL_primitives	*dlp;
1057*41edb306SCy Schubert {
1058*41edb306SCy Schubert 	u_char	dest[MAXDLADDR];
1059*41edb306SCy Schubert 
1060*41edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->xid_res.dl_dest_addr_offset),
1061*41edb306SCy Schubert 		dlp->xid_res.dl_dest_addr_length, dest);
1062*41edb306SCy Schubert 
1063*41edb306SCy Schubert 	(void) printf("DL_XID_RES:  flag 0x%x dest_addr_length %d dest_addr_offset %d\n",
1064*41edb306SCy Schubert 		dlp->xid_res.dl_flag,
1065*41edb306SCy Schubert 		dlp->xid_res.dl_dest_addr_length,
1066*41edb306SCy Schubert 		dlp->xid_res.dl_dest_addr_offset);
1067*41edb306SCy Schubert 	(void) printf("dest_addr %s\n", dest);
1068*41edb306SCy Schubert }
1069*41edb306SCy Schubert 
1070*41edb306SCy Schubert printdlxidcon(dlp)
1071*41edb306SCy Schubert 	union	DL_primitives	*dlp;
1072*41edb306SCy Schubert {
1073*41edb306SCy Schubert 	u_char	dest[MAXDLADDR];
1074*41edb306SCy Schubert 	u_char	src[MAXDLADDR];
1075*41edb306SCy Schubert 
1076*41edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->xid_con.dl_dest_addr_offset),
1077*41edb306SCy Schubert 		dlp->xid_con.dl_dest_addr_length, dest);
1078*41edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->xid_con.dl_src_addr_offset),
1079*41edb306SCy Schubert 		dlp->xid_con.dl_src_addr_length, src);
1080*41edb306SCy Schubert 
1081*41edb306SCy Schubert 	(void) printf("DL_XID_CON:  flag 0x%x dest_addr_length %d dest_addr_offset %d\n",
1082*41edb306SCy Schubert 		dlp->xid_con.dl_flag,
1083*41edb306SCy Schubert 		dlp->xid_con.dl_dest_addr_length,
1084*41edb306SCy Schubert 		dlp->xid_con.dl_dest_addr_offset);
1085*41edb306SCy Schubert 	(void) printf("src_addr_length %d src_addr_offset %d\n",
1086*41edb306SCy Schubert 		dlp->xid_con.dl_src_addr_length,
1087*41edb306SCy Schubert 		dlp->xid_con.dl_src_addr_offset);
1088*41edb306SCy Schubert 	(void) printf("dest_addr %s\n", dest);
1089*41edb306SCy Schubert 	(void) printf("src_addr %s\n", src);
1090*41edb306SCy Schubert }
1091*41edb306SCy Schubert 
1092*41edb306SCy Schubert printdludqosreq(dlp)
1093*41edb306SCy Schubert 	union	DL_primitives	*dlp;
1094*41edb306SCy Schubert {
1095*41edb306SCy Schubert 	(void) printf("DL_UDQOS_REQ:  qos_length %d qos_offset %d\n",
1096*41edb306SCy Schubert 		dlp->udqos_req.dl_qos_length,
1097*41edb306SCy Schubert 		dlp->udqos_req.dl_qos_offset);
1098*41edb306SCy Schubert }
1099*41edb306SCy Schubert 
1100*41edb306SCy Schubert /*
1101*41edb306SCy Schubert  * Return string.
1102*41edb306SCy Schubert  */
1103*41edb306SCy Schubert addrtostring(addr, length, s)
1104*41edb306SCy Schubert 	u_char	*addr;
1105*41edb306SCy Schubert 	u_long	length;
1106*41edb306SCy Schubert 	u_char	*s;
1107*41edb306SCy Schubert {
1108*41edb306SCy Schubert 	int	i;
1109*41edb306SCy Schubert 
1110*41edb306SCy Schubert 	for (i = 0; i < length; i++) {
1111*41edb306SCy Schubert 		(void) sprintf((char*) s, "%x:", addr[i] & 0xff);
1112*41edb306SCy Schubert 		s = s + strlen((char*)s);
1113*41edb306SCy Schubert 	}
1114*41edb306SCy Schubert 	if (length)
1115*41edb306SCy Schubert 		*(--s) = '\0';
1116*41edb306SCy Schubert }
1117*41edb306SCy Schubert 
1118*41edb306SCy Schubert /*
1119*41edb306SCy Schubert  * Return length
1120*41edb306SCy Schubert  */
1121*41edb306SCy Schubert stringtoaddr(sp, addr)
1122*41edb306SCy Schubert 	char	*sp;
1123*41edb306SCy Schubert 	char	*addr;
1124*41edb306SCy Schubert {
1125*41edb306SCy Schubert 	int	n = 0;
1126*41edb306SCy Schubert 	char	*p;
1127*41edb306SCy Schubert 	int	val;
1128*41edb306SCy Schubert 
1129*41edb306SCy Schubert 	p = sp;
1130*41edb306SCy Schubert 	while (p = strtok(p, ":")) {
1131*41edb306SCy Schubert 		if (sscanf(p, "%x", &val) != 1)
1132*41edb306SCy Schubert 			err("stringtoaddr:  invalid input string:  %s", sp);
1133*41edb306SCy Schubert 		if (val > 0xff)
1134*41edb306SCy Schubert 			err("stringtoaddr:  invalid input string:  %s", sp);
1135*41edb306SCy Schubert 		*addr++ = val;
1136*41edb306SCy Schubert 		n++;
1137*41edb306SCy Schubert 		p = NULL;
1138*41edb306SCy Schubert 	}
1139*41edb306SCy Schubert 
1140*41edb306SCy Schubert 	return (n);
1141*41edb306SCy Schubert }
1142*41edb306SCy Schubert 
1143*41edb306SCy Schubert 
1144*41edb306SCy Schubert static char
1145*41edb306SCy Schubert hexnibble(c)
1146*41edb306SCy Schubert 	char	c;
1147*41edb306SCy Schubert {
1148*41edb306SCy Schubert 	static	char	hextab[] = {
1149*41edb306SCy Schubert 		'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
1150*41edb306SCy Schubert 		'a', 'b', 'c', 'd', 'e', 'f'
1151*41edb306SCy Schubert 	};
1152*41edb306SCy Schubert 
1153*41edb306SCy Schubert 	return (hextab[c & 0x0f]);
1154*41edb306SCy Schubert }
1155*41edb306SCy Schubert 
1156*41edb306SCy Schubert char*
1157*41edb306SCy Schubert dlprim(prim)
1158*41edb306SCy Schubert 	u_long	prim;
1159*41edb306SCy Schubert {
1160*41edb306SCy Schubert 	static	char	primbuf[80];
1161*41edb306SCy Schubert 
1162*41edb306SCy Schubert 	switch ((int)prim) {
1163*41edb306SCy Schubert 		CASERET(DL_INFO_REQ);
1164*41edb306SCy Schubert 		CASERET(DL_INFO_ACK);
1165*41edb306SCy Schubert 		CASERET(DL_ATTACH_REQ);
1166*41edb306SCy Schubert 		CASERET(DL_DETACH_REQ);
1167*41edb306SCy Schubert 		CASERET(DL_BIND_REQ);
1168*41edb306SCy Schubert 		CASERET(DL_BIND_ACK);
1169*41edb306SCy Schubert 		CASERET(DL_UNBIND_REQ);
1170*41edb306SCy Schubert 		CASERET(DL_OK_ACK);
1171*41edb306SCy Schubert 		CASERET(DL_ERROR_ACK);
1172*41edb306SCy Schubert 		CASERET(DL_SUBS_BIND_REQ);
1173*41edb306SCy Schubert 		CASERET(DL_SUBS_BIND_ACK);
1174*41edb306SCy Schubert 		CASERET(DL_UNITDATA_REQ);
1175*41edb306SCy Schubert 		CASERET(DL_UNITDATA_IND);
1176*41edb306SCy Schubert 		CASERET(DL_UDERROR_IND);
1177*41edb306SCy Schubert 		CASERET(DL_UDQOS_REQ);
1178*41edb306SCy Schubert 		CASERET(DL_CONNECT_REQ);
1179*41edb306SCy Schubert 		CASERET(DL_CONNECT_IND);
1180*41edb306SCy Schubert 		CASERET(DL_CONNECT_RES);
1181*41edb306SCy Schubert 		CASERET(DL_CONNECT_CON);
1182*41edb306SCy Schubert 		CASERET(DL_TOKEN_REQ);
1183*41edb306SCy Schubert 		CASERET(DL_TOKEN_ACK);
1184*41edb306SCy Schubert 		CASERET(DL_DISCONNECT_REQ);
1185*41edb306SCy Schubert 		CASERET(DL_DISCONNECT_IND);
1186*41edb306SCy Schubert 		CASERET(DL_RESET_REQ);
1187*41edb306SCy Schubert 		CASERET(DL_RESET_IND);
1188*41edb306SCy Schubert 		CASERET(DL_RESET_RES);
1189*41edb306SCy Schubert 		CASERET(DL_RESET_CON);
1190*41edb306SCy Schubert 		default:
1191*41edb306SCy Schubert 			(void) snprintf(primbuf, sizeof(primbuf), "unknown primitive 0x%x", prim);
1192*41edb306SCy Schubert 			return (primbuf);
1193*41edb306SCy Schubert 	}
1194*41edb306SCy Schubert }
1195*41edb306SCy Schubert 
1196*41edb306SCy Schubert 
1197*41edb306SCy Schubert char*
1198*41edb306SCy Schubert dlstate(state)
1199*41edb306SCy Schubert 	u_long	state;
1200*41edb306SCy Schubert {
1201*41edb306SCy Schubert 	static	char	statebuf[80];
1202*41edb306SCy Schubert 
1203*41edb306SCy Schubert 	switch (state) {
1204*41edb306SCy Schubert 		CASERET(DL_UNATTACHED);
1205*41edb306SCy Schubert 		CASERET(DL_ATTACH_PENDING);
1206*41edb306SCy Schubert 		CASERET(DL_DETACH_PENDING);
1207*41edb306SCy Schubert 		CASERET(DL_UNBOUND);
1208*41edb306SCy Schubert 		CASERET(DL_BIND_PENDING);
1209*41edb306SCy Schubert 		CASERET(DL_UNBIND_PENDING);
1210*41edb306SCy Schubert 		CASERET(DL_IDLE);
1211*41edb306SCy Schubert 		CASERET(DL_UDQOS_PENDING);
1212*41edb306SCy Schubert 		CASERET(DL_OUTCON_PENDING);
1213*41edb306SCy Schubert 		CASERET(DL_INCON_PENDING);
1214*41edb306SCy Schubert 		CASERET(DL_CONN_RES_PENDING);
1215*41edb306SCy Schubert 		CASERET(DL_DATAXFER);
1216*41edb306SCy Schubert 		CASERET(DL_USER_RESET_PENDING);
1217*41edb306SCy Schubert 		CASERET(DL_PROV_RESET_PENDING);
1218*41edb306SCy Schubert 		CASERET(DL_RESET_RES_PENDING);
1219*41edb306SCy Schubert 		CASERET(DL_DISCON8_PENDING);
1220*41edb306SCy Schubert 		CASERET(DL_DISCON9_PENDING);
1221*41edb306SCy Schubert 		CASERET(DL_DISCON11_PENDING);
1222*41edb306SCy Schubert 		CASERET(DL_DISCON12_PENDING);
1223*41edb306SCy Schubert 		CASERET(DL_DISCON13_PENDING);
1224*41edb306SCy Schubert 		CASERET(DL_SUBS_BIND_PND);
1225*41edb306SCy Schubert 		default:
1226*41edb306SCy Schubert 			(void) snprintf(statebuf, sizeof(statebuf), "unknown state 0x%x", state);
1227*41edb306SCy Schubert 			return (statebuf);
1228*41edb306SCy Schubert 	}
1229*41edb306SCy Schubert }
1230*41edb306SCy Schubert 
1231*41edb306SCy Schubert char*
1232*41edb306SCy Schubert dlerrno(errno)
1233*41edb306SCy Schubert 	u_long	errno;
1234*41edb306SCy Schubert {
1235*41edb306SCy Schubert 	static	char	errnobuf[80];
1236*41edb306SCy Schubert 
1237*41edb306SCy Schubert 	switch (errno) {
1238*41edb306SCy Schubert 		CASERET(DL_ACCESS);
1239*41edb306SCy Schubert 		CASERET(DL_BADADDR);
1240*41edb306SCy Schubert 		CASERET(DL_BADCORR);
1241*41edb306SCy Schubert 		CASERET(DL_BADDATA);
1242*41edb306SCy Schubert 		CASERET(DL_BADPPA);
1243*41edb306SCy Schubert 		CASERET(DL_BADPRIM);
1244*41edb306SCy Schubert 		CASERET(DL_BADQOSPARAM);
1245*41edb306SCy Schubert 		CASERET(DL_BADQOSTYPE);
1246*41edb306SCy Schubert 		CASERET(DL_BADSAP);
1247*41edb306SCy Schubert 		CASERET(DL_BADTOKEN);
1248*41edb306SCy Schubert 		CASERET(DL_BOUND);
1249*41edb306SCy Schubert 		CASERET(DL_INITFAILED);
1250*41edb306SCy Schubert 		CASERET(DL_NOADDR);
1251*41edb306SCy Schubert 		CASERET(DL_NOTINIT);
1252*41edb306SCy Schubert 		CASERET(DL_OUTSTATE);
1253*41edb306SCy Schubert 		CASERET(DL_SYSERR);
1254*41edb306SCy Schubert 		CASERET(DL_UNSUPPORTED);
1255*41edb306SCy Schubert 		CASERET(DL_UNDELIVERABLE);
1256*41edb306SCy Schubert 		CASERET(DL_NOTSUPPORTED);
1257*41edb306SCy Schubert 		CASERET(DL_TOOMANY);
1258*41edb306SCy Schubert 		CASERET(DL_NOTENAB);
1259*41edb306SCy Schubert 		CASERET(DL_BUSY);
1260*41edb306SCy Schubert 		CASERET(DL_NOAUTO);
1261*41edb306SCy Schubert 		CASERET(DL_NOXIDAUTO);
1262*41edb306SCy Schubert 		CASERET(DL_NOTESTAUTO);
1263*41edb306SCy Schubert 		CASERET(DL_XIDAUTO);
1264*41edb306SCy Schubert 		CASERET(DL_TESTAUTO);
1265*41edb306SCy Schubert 		CASERET(DL_PENDING);
1266*41edb306SCy Schubert 
1267*41edb306SCy Schubert 		default:
1268*41edb306SCy Schubert 			(void) snprintf(errnobuf, sizeof(errnobuf), "unknown dlpi errno 0x%x", errno);
1269*41edb306SCy Schubert 			return (errnobuf);
1270*41edb306SCy Schubert 	}
1271*41edb306SCy Schubert }
1272*41edb306SCy Schubert 
1273*41edb306SCy Schubert char*
1274*41edb306SCy Schubert dlpromisclevel(level)
1275*41edb306SCy Schubert 	u_long	level;
1276*41edb306SCy Schubert {
1277*41edb306SCy Schubert 	static	char	levelbuf[80];
1278*41edb306SCy Schubert 
1279*41edb306SCy Schubert 	switch (level) {
1280*41edb306SCy Schubert 		CASERET(DL_PROMISC_PHYS);
1281*41edb306SCy Schubert 		CASERET(DL_PROMISC_SAP);
1282*41edb306SCy Schubert 		CASERET(DL_PROMISC_MULTI);
1283*41edb306SCy Schubert 		default:
1284*41edb306SCy Schubert 			(void) snprintf(levelbuf, sizeof(levelbuf), "unknown promisc level 0x%x", level);
1285*41edb306SCy Schubert 			return (levelbuf);
1286*41edb306SCy Schubert 	}
1287*41edb306SCy Schubert }
1288*41edb306SCy Schubert 
1289*41edb306SCy Schubert char*
1290*41edb306SCy Schubert dlservicemode(servicemode)
1291*41edb306SCy Schubert 	u_long	servicemode;
1292*41edb306SCy Schubert {
1293*41edb306SCy Schubert 	static	char	servicemodebuf[80];
1294*41edb306SCy Schubert 
1295*41edb306SCy Schubert 	switch (servicemode) {
1296*41edb306SCy Schubert 		CASERET(DL_CODLS);
1297*41edb306SCy Schubert 		CASERET(DL_CLDLS);
1298*41edb306SCy Schubert 		CASERET(DL_CODLS|DL_CLDLS);
1299*41edb306SCy Schubert 		default:
1300*41edb306SCy Schubert 			(void) snprintf(servicemodebuf, sizeof(servicemodebuf),
1301*41edb306SCy Schubert 				"unknown provider service mode 0x%x", servicemode);
1302*41edb306SCy Schubert 			return (servicemodebuf);
1303*41edb306SCy Schubert 	}
1304*41edb306SCy Schubert }
1305*41edb306SCy Schubert 
1306*41edb306SCy Schubert char*
1307*41edb306SCy Schubert dlstyle(style)
1308*41edb306SCy Schubert 	long	style;
1309*41edb306SCy Schubert {
1310*41edb306SCy Schubert 	static	char	stylebuf[80];
1311*41edb306SCy Schubert 
1312*41edb306SCy Schubert 	switch (style) {
1313*41edb306SCy Schubert 		CASERET(DL_STYLE1);
1314*41edb306SCy Schubert 		CASERET(DL_STYLE2);
1315*41edb306SCy Schubert 		default:
1316*41edb306SCy Schubert 			(void) snprintf(stylebuf, sizeof(stylebuf), "unknown provider style 0x%x", style);
1317*41edb306SCy Schubert 			return (stylebuf);
1318*41edb306SCy Schubert 	}
1319*41edb306SCy Schubert }
1320*41edb306SCy Schubert 
1321*41edb306SCy Schubert char*
1322*41edb306SCy Schubert dlmactype(media)
1323*41edb306SCy Schubert 	u_long	media;
1324*41edb306SCy Schubert {
1325*41edb306SCy Schubert 	static	char	mediabuf[80];
1326*41edb306SCy Schubert 
1327*41edb306SCy Schubert 	switch (media) {
1328*41edb306SCy Schubert 		CASERET(DL_CSMACD);
1329*41edb306SCy Schubert 		CASERET(DL_TPB);
1330*41edb306SCy Schubert 		CASERET(DL_TPR);
1331*41edb306SCy Schubert 		CASERET(DL_METRO);
1332*41edb306SCy Schubert 		CASERET(DL_ETHER);
1333*41edb306SCy Schubert 		CASERET(DL_HDLC);
1334*41edb306SCy Schubert 		CASERET(DL_CHAR);
1335*41edb306SCy Schubert 		CASERET(DL_CTCA);
1336*41edb306SCy Schubert 		default:
1337*41edb306SCy Schubert 			(void) snprintf(mediabuf, sizeof(mediabuf), "unknown media type 0x%x", media);
1338*41edb306SCy Schubert 			return (mediabuf);
1339*41edb306SCy Schubert 	}
1340*41edb306SCy Schubert }
1341*41edb306SCy Schubert 
1342*41edb306SCy Schubert /*VARARGS1*/
1343*41edb306SCy Schubert err(fmt, a1, a2, a3, a4)
1344*41edb306SCy Schubert 	char	*fmt;
1345*41edb306SCy Schubert 	char	*a1, *a2, *a3, *a4;
1346*41edb306SCy Schubert {
1347*41edb306SCy Schubert 	(void) fprintf(stderr, fmt, a1, a2, a3, a4);
1348*41edb306SCy Schubert 	(void) fprintf(stderr, "\n");
1349*41edb306SCy Schubert 	(void) exit(1);
1350*41edb306SCy Schubert }
1351*41edb306SCy Schubert 
1352*41edb306SCy Schubert syserr(s)
1353*41edb306SCy Schubert 	char	*s;
1354*41edb306SCy Schubert {
1355*41edb306SCy Schubert 	(void) perror(s);
1356*41edb306SCy Schubert 	exit(1);
1357*41edb306SCy Schubert }
1358*41edb306SCy Schubert 
1359*41edb306SCy Schubert strioctl(fd, cmd, timout, len, dp)
1360*41edb306SCy Schubert 	int	fd;
1361*41edb306SCy Schubert 	int	cmd;
1362*41edb306SCy Schubert 	int	timout;
1363*41edb306SCy Schubert 	int	len;
1364*41edb306SCy Schubert 	char	*dp;
1365*41edb306SCy Schubert {
1366*41edb306SCy Schubert 	struct	strioctl	sioc;
1367*41edb306SCy Schubert 	int	rc;
1368*41edb306SCy Schubert 
1369*41edb306SCy Schubert 	sioc.ic_cmd = cmd;
1370*41edb306SCy Schubert 	sioc.ic_timout = timout;
1371*41edb306SCy Schubert 	sioc.ic_len = len;
1372*41edb306SCy Schubert 	sioc.ic_dp = dp;
1373*41edb306SCy Schubert 	rc = ioctl(fd, I_STR, &sioc);
1374*41edb306SCy Schubert 
1375*41edb306SCy Schubert 	if (rc < 0)
1376*41edb306SCy Schubert 		return (rc);
1377*41edb306SCy Schubert 	else
1378*41edb306SCy Schubert 		return (sioc.ic_len);
1379*41edb306SCy Schubert }
1380