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