xref: /freebsd/sbin/ipf/ipsend/dlcommon.c (revision 2a63c3be158216222d89a073dcbd6a72ee4aab5a)
141edb306SCy Schubert 
241edb306SCy Schubert /*
341edb306SCy Schubert  * Common (shared) DLPI test routines.
441edb306SCy Schubert  * Mostly pretty boring boilerplate sorta stuff.
541edb306SCy Schubert  * These can be split into individual library routines later
641edb306SCy Schubert  * but it's just convenient to keep them in a single file
741edb306SCy Schubert  * while they're being developed.
841edb306SCy Schubert  *
941edb306SCy Schubert  * Not supported:
1041edb306SCy Schubert  *   Connection Oriented stuff
1141edb306SCy Schubert  *   QOS stuff
1241edb306SCy Schubert  */
1341edb306SCy Schubert 
1441edb306SCy Schubert /*
1541edb306SCy Schubert typedef	unsigned long	ulong;
1641edb306SCy Schubert */
1741edb306SCy Schubert 
1841edb306SCy Schubert 
1941edb306SCy Schubert #include	<sys/types.h>
2041edb306SCy Schubert #include	<sys/stream.h>
2141edb306SCy Schubert #include	<sys/stropts.h>
2241edb306SCy Schubert # include	<sys/dlpi.h>
2341edb306SCy Schubert #include	<sys/signal.h>
2441edb306SCy Schubert #include	<stdio.h>
2541edb306SCy Schubert #include	<string.h>
2641edb306SCy Schubert #include	"dltest.h"
2741edb306SCy Schubert 
2841edb306SCy Schubert #define		CASERET(s)	case s:  return ("s")
2941edb306SCy Schubert 
3041edb306SCy Schubert 	char	*dlprim();
3141edb306SCy Schubert 	char	*dlstate();
3241edb306SCy Schubert 	char	*dlerrno();
3341edb306SCy Schubert 	char	*dlpromisclevel();
3441edb306SCy Schubert 	char	*dlservicemode();
3541edb306SCy Schubert 	char	*dlstyle();
3641edb306SCy Schubert 	char	*dlmactype();
3741edb306SCy Schubert 
3841edb306SCy Schubert 
3941edb306SCy Schubert void
dlinforeq(int fd)40*efeb8bffSCy Schubert dlinforeq(int fd)
4141edb306SCy Schubert {
4241edb306SCy Schubert 	dl_info_req_t	info_req;
4341edb306SCy Schubert 	struct	strbuf	ctl;
4441edb306SCy Schubert 	int	flags;
4541edb306SCy Schubert 
4641edb306SCy Schubert 	info_req.dl_primitive = DL_INFO_REQ;
4741edb306SCy Schubert 
4841edb306SCy Schubert 	ctl.maxlen = 0;
4941edb306SCy Schubert 	ctl.len = sizeof (info_req);
5041edb306SCy Schubert 	ctl.buf = (char *) &info_req;
5141edb306SCy Schubert 
5241edb306SCy Schubert 	flags = RS_HIPRI;
5341edb306SCy Schubert 
5441edb306SCy Schubert 	if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)
5541edb306SCy Schubert 		syserr("dlinforeq:  putmsg");
5641edb306SCy Schubert }
5741edb306SCy Schubert 
5841edb306SCy Schubert void
dlinfoack(int fd,char * bufp)59*efeb8bffSCy Schubert dlinfoack(int fd, char *bufp)
6041edb306SCy Schubert {
6141edb306SCy Schubert 	union	DL_primitives	*dlp;
6241edb306SCy Schubert 	struct	strbuf	ctl;
6341edb306SCy Schubert 	int	flags;
6441edb306SCy Schubert 
6541edb306SCy Schubert 	ctl.maxlen = MAXDLBUF;
6641edb306SCy Schubert 	ctl.len = 0;
6741edb306SCy Schubert 	ctl.buf = bufp;
6841edb306SCy Schubert 
6941edb306SCy Schubert 	strgetmsg(fd, &ctl, (struct strbuf*)NULL, &flags, "dlinfoack");
7041edb306SCy Schubert 
7141edb306SCy Schubert 	dlp = (union DL_primitives *) ctl.buf;
7241edb306SCy Schubert 
7341edb306SCy Schubert 	expecting(DL_INFO_ACK, dlp);
7441edb306SCy Schubert 
7541edb306SCy Schubert 	if (ctl.len < sizeof (dl_info_ack_t))
7641edb306SCy Schubert 		err("dlinfoack:  response ctl.len too short:  %d", ctl.len);
7741edb306SCy Schubert 
7841edb306SCy Schubert 	if (flags != RS_HIPRI)
7941edb306SCy Schubert 		err("dlinfoack:  DL_INFO_ACK was not M_PCPROTO");
8041edb306SCy Schubert 
8141edb306SCy Schubert 	if (ctl.len < sizeof (dl_info_ack_t))
8241edb306SCy Schubert 		err("dlinfoack:  short response ctl.len:  %d", ctl.len);
8341edb306SCy Schubert }
8441edb306SCy Schubert 
8541edb306SCy Schubert void
dlattachreq(int fd,u_long ppa)86*efeb8bffSCy Schubert dlattachreq(int fd, u_long ppa)
8741edb306SCy Schubert {
8841edb306SCy Schubert 	dl_attach_req_t	attach_req;
8941edb306SCy Schubert 	struct	strbuf	ctl;
9041edb306SCy Schubert 	int	flags;
9141edb306SCy Schubert 
9241edb306SCy Schubert 	attach_req.dl_primitive = DL_ATTACH_REQ;
9341edb306SCy Schubert 	attach_req.dl_ppa = ppa;
9441edb306SCy Schubert 
9541edb306SCy Schubert 	ctl.maxlen = 0;
9641edb306SCy Schubert 	ctl.len = sizeof (attach_req);
9741edb306SCy Schubert 	ctl.buf = (char *) &attach_req;
9841edb306SCy Schubert 
9941edb306SCy Schubert 	flags = 0;
10041edb306SCy Schubert 
10141edb306SCy Schubert 	if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)
10241edb306SCy Schubert 		syserr("dlattachreq:  putmsg");
10341edb306SCy Schubert }
10441edb306SCy Schubert 
10541edb306SCy Schubert void
dlenabmultireq(int fd,char * addr,int length)106*efeb8bffSCy Schubert dlenabmultireq(int fd, char *addr, int length)
10741edb306SCy Schubert {
10841edb306SCy Schubert 	long	buf[MAXDLBUF];
10941edb306SCy Schubert 	union	DL_primitives	*dlp;
11041edb306SCy Schubert 	struct	strbuf	ctl;
11141edb306SCy Schubert 	int	flags;
11241edb306SCy Schubert 
11341edb306SCy Schubert 	dlp = (union DL_primitives*) buf;
11441edb306SCy Schubert 
11541edb306SCy Schubert 	dlp->enabmulti_req.dl_primitive = DL_ENABMULTI_REQ;
11641edb306SCy Schubert 	dlp->enabmulti_req.dl_addr_length = length;
11741edb306SCy Schubert 	dlp->enabmulti_req.dl_addr_offset = sizeof (dl_enabmulti_req_t);
11841edb306SCy Schubert 
11941edb306SCy Schubert 	(void) memcpy((char*)OFFADDR(buf, sizeof (dl_enabmulti_req_t)), addr, length);
12041edb306SCy Schubert 
12141edb306SCy Schubert 	ctl.maxlen = 0;
12241edb306SCy Schubert 	ctl.len = sizeof (dl_enabmulti_req_t) + length;
12341edb306SCy Schubert 	ctl.buf = (char*) buf;
12441edb306SCy Schubert 
12541edb306SCy Schubert 	flags = 0;
12641edb306SCy Schubert 
12741edb306SCy Schubert 	if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)
12841edb306SCy Schubert 		syserr("dlenabmultireq:  putmsg");
12941edb306SCy Schubert }
13041edb306SCy Schubert 
13141edb306SCy Schubert void
dldisabmultireq(int fd,char * addr,int length)132*efeb8bffSCy Schubert dldisabmultireq(int fd, char *addr, int length)
13341edb306SCy Schubert {
13441edb306SCy Schubert 	long	buf[MAXDLBUF];
13541edb306SCy Schubert 	union	DL_primitives	*dlp;
13641edb306SCy Schubert 	struct	strbuf	ctl;
13741edb306SCy Schubert 	int	flags;
13841edb306SCy Schubert 
13941edb306SCy Schubert 	dlp = (union DL_primitives*) buf;
14041edb306SCy Schubert 
14141edb306SCy Schubert 	dlp->disabmulti_req.dl_primitive = DL_ENABMULTI_REQ;
14241edb306SCy Schubert 	dlp->disabmulti_req.dl_addr_length = length;
14341edb306SCy Schubert 	dlp->disabmulti_req.dl_addr_offset = sizeof (dl_disabmulti_req_t);
14441edb306SCy Schubert 
14541edb306SCy Schubert 	(void) memcpy((char*)OFFADDR(buf, sizeof (dl_disabmulti_req_t)), addr, length);
14641edb306SCy Schubert 
14741edb306SCy Schubert 	ctl.maxlen = 0;
14841edb306SCy Schubert 	ctl.len = sizeof (dl_disabmulti_req_t) + length;
14941edb306SCy Schubert 	ctl.buf = (char*) buf;
15041edb306SCy Schubert 
15141edb306SCy Schubert 	flags = 0;
15241edb306SCy Schubert 
15341edb306SCy Schubert 	if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)
15441edb306SCy Schubert 		syserr("dldisabmultireq:  putmsg");
15541edb306SCy Schubert }
15641edb306SCy Schubert 
15741edb306SCy Schubert void
dlpromisconreq(int fd,u_long level)158*efeb8bffSCy Schubert dlpromisconreq(int fd, u_long level)
15941edb306SCy Schubert {
16041edb306SCy Schubert 	dl_promiscon_req_t	promiscon_req;
16141edb306SCy Schubert 	struct	strbuf	ctl;
16241edb306SCy Schubert 	int	flags;
16341edb306SCy Schubert 
16441edb306SCy Schubert 	promiscon_req.dl_primitive = DL_PROMISCON_REQ;
16541edb306SCy Schubert 	promiscon_req.dl_level = level;
16641edb306SCy Schubert 
16741edb306SCy Schubert 	ctl.maxlen = 0;
16841edb306SCy Schubert 	ctl.len = sizeof (promiscon_req);
16941edb306SCy Schubert 	ctl.buf = (char *) &promiscon_req;
17041edb306SCy Schubert 
17141edb306SCy Schubert 	flags = 0;
17241edb306SCy Schubert 
17341edb306SCy Schubert 	if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)
17441edb306SCy Schubert 		syserr("dlpromiscon:  putmsg");
17541edb306SCy Schubert 
17641edb306SCy Schubert }
17741edb306SCy Schubert 
17841edb306SCy Schubert void
dlpromiscoff(int fd,u_long level)179*efeb8bffSCy Schubert dlpromiscoff(int fd, u_long level)
18041edb306SCy Schubert {
18141edb306SCy Schubert 	dl_promiscoff_req_t	promiscoff_req;
18241edb306SCy Schubert 	struct	strbuf	ctl;
18341edb306SCy Schubert 	int	flags;
18441edb306SCy Schubert 
18541edb306SCy Schubert 	promiscoff_req.dl_primitive = DL_PROMISCOFF_REQ;
18641edb306SCy Schubert 	promiscoff_req.dl_level = level;
18741edb306SCy Schubert 
18841edb306SCy Schubert 	ctl.maxlen = 0;
18941edb306SCy Schubert 	ctl.len = sizeof (promiscoff_req);
19041edb306SCy Schubert 	ctl.buf = (char *) &promiscoff_req;
19141edb306SCy Schubert 
19241edb306SCy Schubert 	flags = 0;
19341edb306SCy Schubert 
19441edb306SCy Schubert 	if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)
19541edb306SCy Schubert 		syserr("dlpromiscoff:  putmsg");
19641edb306SCy Schubert }
19741edb306SCy Schubert 
19841edb306SCy Schubert void
dlphysaddrreq(int fd,u_long addrtype)199*efeb8bffSCy Schubert dlphysaddrreq(int fd, u_long addrtype)
20041edb306SCy Schubert {
20141edb306SCy Schubert 	dl_phys_addr_req_t	phys_addr_req;
20241edb306SCy Schubert 	struct	strbuf	ctl;
20341edb306SCy Schubert 	int	flags;
20441edb306SCy Schubert 
20541edb306SCy Schubert 	phys_addr_req.dl_primitive = DL_PHYS_ADDR_REQ;
20641edb306SCy Schubert 	phys_addr_req.dl_addr_type = addrtype;
20741edb306SCy Schubert 
20841edb306SCy Schubert 	ctl.maxlen = 0;
20941edb306SCy Schubert 	ctl.len = sizeof (phys_addr_req);
21041edb306SCy Schubert 	ctl.buf = (char *) &phys_addr_req;
21141edb306SCy Schubert 
21241edb306SCy Schubert 	flags = 0;
21341edb306SCy Schubert 
21441edb306SCy Schubert 	if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)
21541edb306SCy Schubert 		syserr("dlphysaddrreq:  putmsg");
21641edb306SCy Schubert }
21741edb306SCy Schubert 
21841edb306SCy Schubert void
dlsetphysaddrreq(int fd,char * addr,int length)219*efeb8bffSCy Schubert dlsetphysaddrreq(int fd, char *addr, int length)
22041edb306SCy Schubert {
22141edb306SCy Schubert 	long	buf[MAXDLBUF];
22241edb306SCy Schubert 	union	DL_primitives	*dlp;
22341edb306SCy Schubert 	struct	strbuf	ctl;
22441edb306SCy Schubert 	int	flags;
22541edb306SCy Schubert 
22641edb306SCy Schubert 	dlp = (union DL_primitives*) buf;
22741edb306SCy Schubert 
22841edb306SCy Schubert 	dlp->set_physaddr_req.dl_primitive = DL_ENABMULTI_REQ;
22941edb306SCy Schubert 	dlp->set_physaddr_req.dl_addr_length = length;
23041edb306SCy Schubert 	dlp->set_physaddr_req.dl_addr_offset = sizeof (dl_set_phys_addr_req_t);
23141edb306SCy Schubert 
23241edb306SCy Schubert 	(void) memcpy((char*)OFFADDR(buf, sizeof (dl_set_phys_addr_req_t)), addr, length);
23341edb306SCy Schubert 
23441edb306SCy Schubert 	ctl.maxlen = 0;
23541edb306SCy Schubert 	ctl.len = sizeof (dl_set_phys_addr_req_t) + length;
23641edb306SCy Schubert 	ctl.buf = (char*) buf;
23741edb306SCy Schubert 
23841edb306SCy Schubert 	flags = 0;
23941edb306SCy Schubert 
24041edb306SCy Schubert 	if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)
24141edb306SCy Schubert 		syserr("dlsetphysaddrreq:  putmsg");
24241edb306SCy Schubert }
24341edb306SCy Schubert 
24441edb306SCy Schubert void
dldetachreq(int fd)245*efeb8bffSCy Schubert dldetachreq(int fd)
24641edb306SCy Schubert {
24741edb306SCy Schubert 	dl_detach_req_t	detach_req;
24841edb306SCy Schubert 	struct	strbuf	ctl;
24941edb306SCy Schubert 	int	flags;
25041edb306SCy Schubert 
25141edb306SCy Schubert 	detach_req.dl_primitive = DL_DETACH_REQ;
25241edb306SCy Schubert 
25341edb306SCy Schubert 	ctl.maxlen = 0;
25441edb306SCy Schubert 	ctl.len = sizeof (detach_req);
25541edb306SCy Schubert 	ctl.buf = (char *) &detach_req;
25641edb306SCy Schubert 
25741edb306SCy Schubert 	flags = 0;
25841edb306SCy Schubert 
25941edb306SCy Schubert 	if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)
26041edb306SCy Schubert 		syserr("dldetachreq:  putmsg");
26141edb306SCy Schubert }
26241edb306SCy Schubert 
26341edb306SCy Schubert void
dlbindreq(int fd,u_long sap,u_long max_conind,u_long service_mode,u_long conn_mgmt,u_long xidtest)264*efeb8bffSCy Schubert dlbindreq(int fd, u_long sap, u_long max_conind, u_long service_mode,
265*efeb8bffSCy Schubert 	u_long conn_mgmt, u_long xidtest)
26641edb306SCy Schubert {
26741edb306SCy Schubert 	dl_bind_req_t	bind_req;
26841edb306SCy Schubert 	struct	strbuf	ctl;
26941edb306SCy Schubert 	int	flags;
27041edb306SCy Schubert 
27141edb306SCy Schubert 	bind_req.dl_primitive = DL_BIND_REQ;
27241edb306SCy Schubert 	bind_req.dl_sap = sap;
27341edb306SCy Schubert 	bind_req.dl_max_conind = max_conind;
27441edb306SCy Schubert 	bind_req.dl_service_mode = service_mode;
27541edb306SCy Schubert 	bind_req.dl_conn_mgmt = conn_mgmt;
27641edb306SCy Schubert 	bind_req.dl_xidtest_flg = xidtest;
27741edb306SCy Schubert 
27841edb306SCy Schubert 	ctl.maxlen = 0;
27941edb306SCy Schubert 	ctl.len = sizeof (bind_req);
28041edb306SCy Schubert 	ctl.buf = (char *) &bind_req;
28141edb306SCy Schubert 
28241edb306SCy Schubert 	flags = 0;
28341edb306SCy Schubert 
28441edb306SCy Schubert 	if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)
28541edb306SCy Schubert 		syserr("dlbindreq:  putmsg");
28641edb306SCy Schubert }
28741edb306SCy Schubert 
28841edb306SCy Schubert void
dlunitdatareq(int fd,u_char * addrp,int addrlen,u_long minpri,u_long maxpri,u_char * datap,int datalen)289*efeb8bffSCy Schubert dlunitdatareq(int fd, u_char *addrp, int addrlen, u_long minpri,
290*efeb8bffSCy Schubert 	u_long maxpri, u_char *datap, int datalen)
29141edb306SCy Schubert {
29241edb306SCy Schubert 	long	buf[MAXDLBUF];
29341edb306SCy Schubert 	union	DL_primitives	*dlp;
29441edb306SCy Schubert 	struct	strbuf	data, ctl;
29541edb306SCy Schubert 
29641edb306SCy Schubert 	dlp = (union DL_primitives*) buf;
29741edb306SCy Schubert 
29841edb306SCy Schubert 	dlp->unitdata_req.dl_primitive = DL_UNITDATA_REQ;
29941edb306SCy Schubert 	dlp->unitdata_req.dl_dest_addr_length = addrlen;
30041edb306SCy Schubert 	dlp->unitdata_req.dl_dest_addr_offset = sizeof (dl_unitdata_req_t);
30141edb306SCy Schubert 	dlp->unitdata_req.dl_priority.dl_min = minpri;
30241edb306SCy Schubert 	dlp->unitdata_req.dl_priority.dl_max = maxpri;
30341edb306SCy Schubert 
30441edb306SCy Schubert 	(void) memcpy(OFFADDR(dlp, sizeof (dl_unitdata_req_t)), addrp, addrlen);
30541edb306SCy Schubert 
30641edb306SCy Schubert 	ctl.maxlen = 0;
30741edb306SCy Schubert 	ctl.len = sizeof (dl_unitdata_req_t) + addrlen;
30841edb306SCy Schubert 	ctl.buf = (char *) buf;
30941edb306SCy Schubert 
31041edb306SCy Schubert 	data.maxlen = 0;
31141edb306SCy Schubert 	data.len = datalen;
31241edb306SCy Schubert 	data.buf = (char *) datap;
31341edb306SCy Schubert 
31441edb306SCy Schubert 	if (putmsg(fd, &ctl, &data, 0) < 0)
31541edb306SCy Schubert 		syserr("dlunitdatareq:  putmsg");
31641edb306SCy Schubert }
31741edb306SCy Schubert 
31841edb306SCy Schubert void
dlunbindreq(int fd)319*efeb8bffSCy Schubert dlunbindreq(int fd)
32041edb306SCy Schubert {
32141edb306SCy Schubert 	dl_unbind_req_t	unbind_req;
32241edb306SCy Schubert 	struct	strbuf	ctl;
32341edb306SCy Schubert 	int	flags;
32441edb306SCy Schubert 
32541edb306SCy Schubert 	unbind_req.dl_primitive = DL_UNBIND_REQ;
32641edb306SCy Schubert 
32741edb306SCy Schubert 	ctl.maxlen = 0;
32841edb306SCy Schubert 	ctl.len = sizeof (unbind_req);
32941edb306SCy Schubert 	ctl.buf = (char *) &unbind_req;
33041edb306SCy Schubert 
33141edb306SCy Schubert 	flags = 0;
33241edb306SCy Schubert 
33341edb306SCy Schubert 	if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)
33441edb306SCy Schubert 		syserr("dlunbindreq:  putmsg");
33541edb306SCy Schubert }
33641edb306SCy Schubert 
33741edb306SCy Schubert void
dlokack(int fd,char * bufp)338*efeb8bffSCy Schubert dlokack(int fd, char *bufp)
33941edb306SCy Schubert {
34041edb306SCy Schubert 	union	DL_primitives	*dlp;
34141edb306SCy Schubert 	struct	strbuf	ctl;
34241edb306SCy Schubert 	int	flags;
34341edb306SCy Schubert 
34441edb306SCy Schubert 	ctl.maxlen = MAXDLBUF;
34541edb306SCy Schubert 	ctl.len = 0;
34641edb306SCy Schubert 	ctl.buf = bufp;
34741edb306SCy Schubert 
34841edb306SCy Schubert 	strgetmsg(fd, &ctl, (struct strbuf*)NULL, &flags, "dlokack");
34941edb306SCy Schubert 
35041edb306SCy Schubert 	dlp = (union DL_primitives *) ctl.buf;
35141edb306SCy Schubert 
35241edb306SCy Schubert 	expecting(DL_OK_ACK, dlp);
35341edb306SCy Schubert 
35441edb306SCy Schubert 	if (ctl.len < sizeof (dl_ok_ack_t))
35541edb306SCy Schubert 		err("dlokack:  response ctl.len too short:  %d", ctl.len);
35641edb306SCy Schubert 
35741edb306SCy Schubert 	if (flags != RS_HIPRI)
35841edb306SCy Schubert 		err("dlokack:  DL_OK_ACK was not M_PCPROTO");
35941edb306SCy Schubert 
36041edb306SCy Schubert 	if (ctl.len < sizeof (dl_ok_ack_t))
36141edb306SCy Schubert 		err("dlokack:  short response ctl.len:  %d", ctl.len);
36241edb306SCy Schubert }
36341edb306SCy Schubert 
36441edb306SCy Schubert void
dlerrorack(int fd,char * bufp)365*efeb8bffSCy Schubert dlerrorack(int fd, char *bufp)
36641edb306SCy Schubert {
36741edb306SCy Schubert 	union	DL_primitives	*dlp;
36841edb306SCy Schubert 	struct	strbuf	ctl;
36941edb306SCy Schubert 	int	flags;
37041edb306SCy Schubert 
37141edb306SCy Schubert 	ctl.maxlen = MAXDLBUF;
37241edb306SCy Schubert 	ctl.len = 0;
37341edb306SCy Schubert 	ctl.buf = bufp;
37441edb306SCy Schubert 
37541edb306SCy Schubert 	strgetmsg(fd, &ctl, (struct strbuf*)NULL, &flags, "dlerrorack");
37641edb306SCy Schubert 
37741edb306SCy Schubert 	dlp = (union DL_primitives *) ctl.buf;
37841edb306SCy Schubert 
37941edb306SCy Schubert 	expecting(DL_ERROR_ACK, dlp);
38041edb306SCy Schubert 
38141edb306SCy Schubert 	if (ctl.len < sizeof (dl_error_ack_t))
38241edb306SCy Schubert 		err("dlerrorack:  response ctl.len too short:  %d", ctl.len);
38341edb306SCy Schubert 
38441edb306SCy Schubert 	if (flags != RS_HIPRI)
38541edb306SCy Schubert 		err("dlerrorack:  DL_OK_ACK was not M_PCPROTO");
38641edb306SCy Schubert 
38741edb306SCy Schubert 	if (ctl.len < sizeof (dl_error_ack_t))
38841edb306SCy Schubert 		err("dlerrorack:  short response ctl.len:  %d", ctl.len);
38941edb306SCy Schubert }
39041edb306SCy Schubert 
39141edb306SCy Schubert void
dlbindack(int fd,char * bufp)392*efeb8bffSCy Schubert dlbindack(int fd, char *bufp)
39341edb306SCy Schubert {
39441edb306SCy Schubert 	union	DL_primitives	*dlp;
39541edb306SCy Schubert 	struct	strbuf	ctl;
39641edb306SCy Schubert 	int	flags;
39741edb306SCy Schubert 
39841edb306SCy Schubert 	ctl.maxlen = MAXDLBUF;
39941edb306SCy Schubert 	ctl.len = 0;
40041edb306SCy Schubert 	ctl.buf = bufp;
40141edb306SCy Schubert 
40241edb306SCy Schubert 	strgetmsg(fd, &ctl, (struct strbuf*)NULL, &flags, "dlbindack");
40341edb306SCy Schubert 
40441edb306SCy Schubert 	dlp = (union DL_primitives *) ctl.buf;
40541edb306SCy Schubert 
40641edb306SCy Schubert 	expecting(DL_BIND_ACK, dlp);
40741edb306SCy Schubert 
40841edb306SCy Schubert 	if (flags != RS_HIPRI)
40941edb306SCy Schubert 		err("dlbindack:  DL_OK_ACK was not M_PCPROTO");
41041edb306SCy Schubert 
41141edb306SCy Schubert 	if (ctl.len < sizeof (dl_bind_ack_t))
41241edb306SCy Schubert 		err("dlbindack:  short response ctl.len:  %d", ctl.len);
41341edb306SCy Schubert }
41441edb306SCy Schubert 
41541edb306SCy Schubert void
dlphysaddrack(int fd,char * bufp)416*efeb8bffSCy Schubert dlphysaddrack(int fd, char *bufp)
41741edb306SCy Schubert {
41841edb306SCy Schubert 	union	DL_primitives	*dlp;
41941edb306SCy Schubert 	struct	strbuf	ctl;
42041edb306SCy Schubert 	int	flags;
42141edb306SCy Schubert 
42241edb306SCy Schubert 	ctl.maxlen = MAXDLBUF;
42341edb306SCy Schubert 	ctl.len = 0;
42441edb306SCy Schubert 	ctl.buf = bufp;
42541edb306SCy Schubert 
42641edb306SCy Schubert 	strgetmsg(fd, &ctl, (struct strbuf*)NULL, &flags, "dlphysaddrack");
42741edb306SCy Schubert 
42841edb306SCy Schubert 	dlp = (union DL_primitives *) ctl.buf;
42941edb306SCy Schubert 
43041edb306SCy Schubert 	expecting(DL_PHYS_ADDR_ACK, dlp);
43141edb306SCy Schubert 
43241edb306SCy Schubert 	if (flags != RS_HIPRI)
43341edb306SCy Schubert 		err("dlbindack:  DL_OK_ACK was not M_PCPROTO");
43441edb306SCy Schubert 
43541edb306SCy Schubert 	if (ctl.len < sizeof (dl_phys_addr_ack_t))
43641edb306SCy Schubert 		err("dlphysaddrack:  short response ctl.len:  %d", ctl.len);
43741edb306SCy Schubert }
43841edb306SCy Schubert 
43941edb306SCy Schubert void
sigalrm(void)440*efeb8bffSCy Schubert sigalrm(void)
44141edb306SCy Schubert {
44241edb306SCy Schubert 	(void) err("sigalrm:  TIMEOUT");
44341edb306SCy Schubert }
44441edb306SCy Schubert 
strgetmsg(int fd,struct strbuf * ctlp,struct strbuf * datap,int * flagsp,char * caller)445*efeb8bffSCy Schubert strgetmsg(int fd, struct strbuf *ctlp, struct strbuf *datap, int *flagsp,
446*efeb8bffSCy Schubert 	char *caller)
44741edb306SCy Schubert {
44841edb306SCy Schubert 	int	rc;
44941edb306SCy Schubert 	static	char	errmsg[80];
45041edb306SCy Schubert 
45141edb306SCy Schubert 	/*
45241edb306SCy Schubert 	 * Start timer.
45341edb306SCy Schubert 	 */
45441edb306SCy Schubert 	(void) signal(SIGALRM, sigalrm);
45541edb306SCy Schubert 	if (alarm(MAXWAIT) < 0) {
45641edb306SCy Schubert 		(void) snprintf(errmsg, sizeof(errmsg), "%s:  alarm", caller);
45741edb306SCy Schubert 		syserr(errmsg);
45841edb306SCy Schubert 	}
45941edb306SCy Schubert 
46041edb306SCy Schubert 	/*
46141edb306SCy Schubert 	 * Set flags argument and issue getmsg().
46241edb306SCy Schubert 	 */
46341edb306SCy Schubert 	*flagsp = 0;
46441edb306SCy Schubert 	if ((rc = getmsg(fd, ctlp, datap, flagsp)) < 0) {
46541edb306SCy Schubert 		(void) snprintf(errmsg, sizeof(errmsg), "%s:  getmsg", caller);
46641edb306SCy Schubert 		syserr(errmsg);
46741edb306SCy Schubert 	}
46841edb306SCy Schubert 
46941edb306SCy Schubert 	/*
47041edb306SCy Schubert 	 * Stop timer.
47141edb306SCy Schubert 	 */
47241edb306SCy Schubert 	if (alarm(0) < 0) {
47341edb306SCy Schubert 		(void) snprintf(errmsg, sizeof(errmsg), "%s:  alarm", caller);
47441edb306SCy Schubert 		syserr(errmsg);
47541edb306SCy Schubert 	}
47641edb306SCy Schubert 
47741edb306SCy Schubert 	/*
47841edb306SCy Schubert 	 * Check for MOREDATA and/or MORECTL.
47941edb306SCy Schubert 	 */
48041edb306SCy Schubert 	if ((rc & (MORECTL | MOREDATA)) == (MORECTL | MOREDATA))
48141edb306SCy Schubert 		err("%s:  MORECTL|MOREDATA", caller);
48241edb306SCy Schubert 	if (rc & MORECTL)
48341edb306SCy Schubert 		err("%s:  MORECTL", caller);
48441edb306SCy Schubert 	if (rc & MOREDATA)
48541edb306SCy Schubert 		err("%s:  MOREDATA", caller);
48641edb306SCy Schubert 
48741edb306SCy Schubert 	/*
48841edb306SCy Schubert 	 * Check for at least sizeof (long) control data portion.
48941edb306SCy Schubert 	 */
49041edb306SCy Schubert 	if (ctlp->len < sizeof (long))
49141edb306SCy Schubert 		err("getmsg:  control portion length < sizeof (long):  %d", ctlp->len);
49241edb306SCy Schubert }
49341edb306SCy Schubert 
expecting(int prim,union DL_primitives * dlp)494*efeb8bffSCy Schubert expecting(int prim, union DL_primitives *dlp)
49541edb306SCy Schubert {
49641edb306SCy Schubert 	if (dlp->dl_primitive != (u_long)prim) {
49741edb306SCy Schubert 		printdlprim(dlp);
49841edb306SCy Schubert 		err("expected %s got %s", dlprim(prim),
49941edb306SCy Schubert 			dlprim(dlp->dl_primitive));
50041edb306SCy Schubert 		exit(1);
50141edb306SCy Schubert 	}
50241edb306SCy Schubert }
50341edb306SCy Schubert 
50441edb306SCy Schubert /*
50541edb306SCy Schubert  * Print any DLPI msg in human readable format.
50641edb306SCy Schubert  */
printdlprim(union DL_primitives * dlp)507*efeb8bffSCy Schubert printdlprim(union DL_primitives *dlp)
50841edb306SCy Schubert {
50941edb306SCy Schubert 	switch (dlp->dl_primitive) {
51041edb306SCy Schubert 		case DL_INFO_REQ:
51141edb306SCy Schubert 			printdlinforeq(dlp);
51241edb306SCy Schubert 			break;
51341edb306SCy Schubert 
51441edb306SCy Schubert 		case DL_INFO_ACK:
51541edb306SCy Schubert 			printdlinfoack(dlp);
51641edb306SCy Schubert 			break;
51741edb306SCy Schubert 
51841edb306SCy Schubert 		case DL_ATTACH_REQ:
51941edb306SCy Schubert 			printdlattachreq(dlp);
52041edb306SCy Schubert 			break;
52141edb306SCy Schubert 
52241edb306SCy Schubert 		case DL_OK_ACK:
52341edb306SCy Schubert 			printdlokack(dlp);
52441edb306SCy Schubert 			break;
52541edb306SCy Schubert 
52641edb306SCy Schubert 		case DL_ERROR_ACK:
52741edb306SCy Schubert 			printdlerrorack(dlp);
52841edb306SCy Schubert 			break;
52941edb306SCy Schubert 
53041edb306SCy Schubert 		case DL_DETACH_REQ:
53141edb306SCy Schubert 			printdldetachreq(dlp);
53241edb306SCy Schubert 			break;
53341edb306SCy Schubert 
53441edb306SCy Schubert 		case DL_BIND_REQ:
53541edb306SCy Schubert 			printdlbindreq(dlp);
53641edb306SCy Schubert 			break;
53741edb306SCy Schubert 
53841edb306SCy Schubert 		case DL_BIND_ACK:
53941edb306SCy Schubert 			printdlbindack(dlp);
54041edb306SCy Schubert 			break;
54141edb306SCy Schubert 
54241edb306SCy Schubert 		case DL_UNBIND_REQ:
54341edb306SCy Schubert 			printdlunbindreq(dlp);
54441edb306SCy Schubert 			break;
54541edb306SCy Schubert 
54641edb306SCy Schubert 		case DL_SUBS_BIND_REQ:
54741edb306SCy Schubert 			printdlsubsbindreq(dlp);
54841edb306SCy Schubert 			break;
54941edb306SCy Schubert 
55041edb306SCy Schubert 		case DL_SUBS_BIND_ACK:
55141edb306SCy Schubert 			printdlsubsbindack(dlp);
55241edb306SCy Schubert 			break;
55341edb306SCy Schubert 
55441edb306SCy Schubert 		case DL_SUBS_UNBIND_REQ:
55541edb306SCy Schubert 			printdlsubsunbindreq(dlp);
55641edb306SCy Schubert 			break;
55741edb306SCy Schubert 
55841edb306SCy Schubert 		case DL_ENABMULTI_REQ:
55941edb306SCy Schubert 			printdlenabmultireq(dlp);
56041edb306SCy Schubert 			break;
56141edb306SCy Schubert 
56241edb306SCy Schubert 		case DL_DISABMULTI_REQ:
56341edb306SCy Schubert 			printdldisabmultireq(dlp);
56441edb306SCy Schubert 			break;
56541edb306SCy Schubert 
56641edb306SCy Schubert 		case DL_PROMISCON_REQ:
56741edb306SCy Schubert 			printdlpromisconreq(dlp);
56841edb306SCy Schubert 			break;
56941edb306SCy Schubert 
57041edb306SCy Schubert 		case DL_PROMISCOFF_REQ:
57141edb306SCy Schubert 			printdlpromiscoffreq(dlp);
57241edb306SCy Schubert 			break;
57341edb306SCy Schubert 
57441edb306SCy Schubert 		case DL_UNITDATA_REQ:
57541edb306SCy Schubert 			printdlunitdatareq(dlp);
57641edb306SCy Schubert 			break;
57741edb306SCy Schubert 
57841edb306SCy Schubert 		case DL_UNITDATA_IND:
57941edb306SCy Schubert 			printdlunitdataind(dlp);
58041edb306SCy Schubert 			break;
58141edb306SCy Schubert 
58241edb306SCy Schubert 		case DL_UDERROR_IND:
58341edb306SCy Schubert 			printdluderrorind(dlp);
58441edb306SCy Schubert 			break;
58541edb306SCy Schubert 
58641edb306SCy Schubert 		case DL_UDQOS_REQ:
58741edb306SCy Schubert 			printdludqosreq(dlp);
58841edb306SCy Schubert 			break;
58941edb306SCy Schubert 
59041edb306SCy Schubert 		case DL_PHYS_ADDR_REQ:
59141edb306SCy Schubert 			printdlphysaddrreq(dlp);
59241edb306SCy Schubert 			break;
59341edb306SCy Schubert 
59441edb306SCy Schubert 		case DL_PHYS_ADDR_ACK:
59541edb306SCy Schubert 			printdlphysaddrack(dlp);
59641edb306SCy Schubert 			break;
59741edb306SCy Schubert 
59841edb306SCy Schubert 		case DL_SET_PHYS_ADDR_REQ:
59941edb306SCy Schubert 			printdlsetphysaddrreq(dlp);
60041edb306SCy Schubert 			break;
60141edb306SCy Schubert 
60241edb306SCy Schubert 		default:
60341edb306SCy Schubert 			err("printdlprim:  unknown primitive type 0x%x",
60441edb306SCy Schubert 				dlp->dl_primitive);
60541edb306SCy Schubert 			break;
60641edb306SCy Schubert 	}
60741edb306SCy Schubert }
60841edb306SCy Schubert 
60941edb306SCy Schubert /* ARGSUSED */
printdlinforeq(union DL_primitives * dlp)610*efeb8bffSCy Schubert printdlinforeq(union DL_primitives *dlp)
61141edb306SCy Schubert {
61241edb306SCy Schubert 	(void) printf("DL_INFO_REQ\n");
61341edb306SCy Schubert }
61441edb306SCy Schubert 
printdlinfoack(union DL_primitives * dlp)615*efeb8bffSCy Schubert printdlinfoack(union DL_primitives *dlp)
61641edb306SCy Schubert {
61741edb306SCy Schubert 	u_char	addr[MAXDLADDR];
61841edb306SCy Schubert 	u_char	brdcst[MAXDLADDR];
61941edb306SCy Schubert 
62041edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->info_ack.dl_addr_offset),
62141edb306SCy Schubert 		dlp->info_ack.dl_addr_length, addr);
62241edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->info_ack.dl_brdcst_addr_offset),
62341edb306SCy Schubert 		dlp->info_ack.dl_brdcst_addr_length, brdcst);
62441edb306SCy Schubert 
62541edb306SCy Schubert 	(void) printf("DL_INFO_ACK:  max_sdu %d min_sdu %d\n",
62641edb306SCy Schubert 		dlp->info_ack.dl_max_sdu,
62741edb306SCy Schubert 		dlp->info_ack.dl_min_sdu);
62841edb306SCy Schubert 	(void) printf("addr_length %d mac_type %s current_state %s\n",
62941edb306SCy Schubert 		dlp->info_ack.dl_addr_length,
63041edb306SCy Schubert 		dlmactype(dlp->info_ack.dl_mac_type),
63141edb306SCy Schubert 		dlstate(dlp->info_ack.dl_current_state));
63241edb306SCy Schubert 	(void) printf("sap_length %d service_mode %s qos_length %d\n",
63341edb306SCy Schubert 		dlp->info_ack.dl_sap_length,
63441edb306SCy Schubert 		dlservicemode(dlp->info_ack.dl_service_mode),
63541edb306SCy Schubert 		dlp->info_ack.dl_qos_length);
63641edb306SCy Schubert 	(void) printf("qos_offset %d qos_range_length %d qos_range_offset %d\n",
63741edb306SCy Schubert 		dlp->info_ack.dl_qos_offset,
63841edb306SCy Schubert 		dlp->info_ack.dl_qos_range_length,
63941edb306SCy Schubert 		dlp->info_ack.dl_qos_range_offset);
64041edb306SCy Schubert 	(void) printf("provider_style %s addr_offset %d version %d\n",
64141edb306SCy Schubert 		dlstyle(dlp->info_ack.dl_provider_style),
64241edb306SCy Schubert 		dlp->info_ack.dl_addr_offset,
64341edb306SCy Schubert 		dlp->info_ack.dl_version);
64441edb306SCy Schubert 	(void) printf("brdcst_addr_length %d brdcst_addr_offset %d\n",
64541edb306SCy Schubert 		dlp->info_ack.dl_brdcst_addr_length,
64641edb306SCy Schubert 		dlp->info_ack.dl_brdcst_addr_offset);
64741edb306SCy Schubert 	(void) printf("addr %s\n", addr);
64841edb306SCy Schubert 	(void) printf("brdcst_addr %s\n", brdcst);
64941edb306SCy Schubert }
65041edb306SCy Schubert 
printdlattachreq(union DL_primitives * dlp)651*efeb8bffSCy Schubert printdlattachreq(union DL_primitives *dlp)
65241edb306SCy Schubert {
65341edb306SCy Schubert 	(void) printf("DL_ATTACH_REQ:  ppa %d\n",
65441edb306SCy Schubert 		dlp->attach_req.dl_ppa);
65541edb306SCy Schubert }
65641edb306SCy Schubert 
657*efeb8bffSCy Schubert printdlokack(union DL_primitives* dlp)
65841edb306SCy Schubert 	union	DL_primitives	*dlp;
65941edb306SCy Schubert {
66041edb306SCy Schubert 	(void) printf("DL_OK_ACK:  correct_primitive %s\n",
66141edb306SCy Schubert 		dlprim(dlp->ok_ack.dl_correct_primitive));
66241edb306SCy Schubert }
66341edb306SCy Schubert 
printdlerrorack(union DL_primitives * dlp)664*efeb8bffSCy Schubert printdlerrorack(union DL_primitives *dlp)
66541edb306SCy Schubert {
66641edb306SCy Schubert 	(void) printf("DL_ERROR_ACK:  error_primitive %s errno %s unix_errno %d: %s\n",
66741edb306SCy Schubert 		dlprim(dlp->error_ack.dl_error_primitive),
66841edb306SCy Schubert 		dlerrno(dlp->error_ack.dl_errno),
66941edb306SCy Schubert 		dlp->error_ack.dl_unix_errno,
67041edb306SCy Schubert 		strerror(dlp->error_ack.dl_unix_errno));
67141edb306SCy Schubert }
67241edb306SCy Schubert 
printdlenabmultireq(union DL_primitives * dlp)673*efeb8bffSCy Schubert printdlenabmultireq(union DL_primitives *dlp)
67441edb306SCy Schubert {
67541edb306SCy Schubert 	u_char	addr[MAXDLADDR];
67641edb306SCy Schubert 
67741edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->enabmulti_req.dl_addr_offset),
67841edb306SCy Schubert 		dlp->enabmulti_req.dl_addr_length, addr);
67941edb306SCy Schubert 
68041edb306SCy Schubert 	(void) printf("DL_ENABMULTI_REQ:  addr_length %d addr_offset %d\n",
68141edb306SCy Schubert 		dlp->enabmulti_req.dl_addr_length,
68241edb306SCy Schubert 		dlp->enabmulti_req.dl_addr_offset);
68341edb306SCy Schubert 	(void) printf("addr %s\n", addr);
68441edb306SCy Schubert }
68541edb306SCy Schubert 
printdldisabmultireq(union DL_primitives * dlp)686*efeb8bffSCy Schubert printdldisabmultireq(union DL_primitives *dlp)
68741edb306SCy Schubert {
68841edb306SCy Schubert 	u_char	addr[MAXDLADDR];
68941edb306SCy Schubert 
69041edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->disabmulti_req.dl_addr_offset),
69141edb306SCy Schubert 		dlp->disabmulti_req.dl_addr_length, addr);
69241edb306SCy Schubert 
69341edb306SCy Schubert 	(void) printf("DL_DISABMULTI_REQ:  addr_length %d addr_offset %d\n",
69441edb306SCy Schubert 		dlp->disabmulti_req.dl_addr_length,
69541edb306SCy Schubert 		dlp->disabmulti_req.dl_addr_offset);
69641edb306SCy Schubert 	(void) printf("addr %s\n", addr);
69741edb306SCy Schubert }
69841edb306SCy Schubert 
printdlpromisconreq(union DL_primitives * dlp)699*efeb8bffSCy Schubert printdlpromisconreq(union DL_primitives *dlp)
70041edb306SCy Schubert {
70141edb306SCy Schubert 	(void) printf("DL_PROMISCON_REQ:  level %s\n",
70241edb306SCy Schubert 		dlpromisclevel(dlp->promiscon_req.dl_level));
70341edb306SCy Schubert }
70441edb306SCy Schubert 
printdlpromiscoffreq(union DL_primitives * dlp)705*efeb8bffSCy Schubert printdlpromiscoffreq(union DL_primitives *dlp)
70641edb306SCy Schubert {
70741edb306SCy Schubert 	(void) printf("DL_PROMISCOFF_REQ:  level %s\n",
70841edb306SCy Schubert 		dlpromisclevel(dlp->promiscoff_req.dl_level));
70941edb306SCy Schubert }
71041edb306SCy Schubert 
printdlphysaddrreq(union DL_primitives * dlp)711*efeb8bffSCy Schubert printdlphysaddrreq(union DL_primitives *dlp)
71241edb306SCy Schubert {
71341edb306SCy Schubert 	(void) printf("DL_PHYS_ADDR_REQ:  addr_type 0x%x\n",
71441edb306SCy Schubert 		dlp->physaddr_req.dl_addr_type);
71541edb306SCy Schubert }
71641edb306SCy Schubert 
printdlphysaddrack(union DL_primitives * dlp)717*efeb8bffSCy Schubert printdlphysaddrack(union DL_primitives *dlp)
71841edb306SCy Schubert {
71941edb306SCy Schubert 	u_char	addr[MAXDLADDR];
72041edb306SCy Schubert 
72141edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->physaddr_ack.dl_addr_offset),
72241edb306SCy Schubert 		dlp->physaddr_ack.dl_addr_length, addr);
72341edb306SCy Schubert 
72441edb306SCy Schubert 	(void) printf("DL_PHYS_ADDR_ACK:  addr_length %d addr_offset %d\n",
72541edb306SCy Schubert 		dlp->physaddr_ack.dl_addr_length,
72641edb306SCy Schubert 		dlp->physaddr_ack.dl_addr_offset);
72741edb306SCy Schubert 	(void) printf("addr %s\n", addr);
72841edb306SCy Schubert }
72941edb306SCy Schubert 
printdlsetphysaddrreq(union DL_primitives * dlp)730*efeb8bffSCy Schubert printdlsetphysaddrreq(union DL_primitives *dlp)
73141edb306SCy Schubert {
73241edb306SCy Schubert 	u_char	addr[MAXDLADDR];
73341edb306SCy Schubert 
73441edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->set_physaddr_req.dl_addr_offset),
73541edb306SCy Schubert 		dlp->set_physaddr_req.dl_addr_length, addr);
73641edb306SCy Schubert 
73741edb306SCy Schubert 	(void) printf("DL_SET_PHYS_ADDR_REQ:  addr_length %d addr_offset %d\n",
73841edb306SCy Schubert 		dlp->set_physaddr_req.dl_addr_length,
73941edb306SCy Schubert 		dlp->set_physaddr_req.dl_addr_offset);
74041edb306SCy Schubert 	(void) printf("addr %s\n", addr);
74141edb306SCy Schubert }
74241edb306SCy Schubert 
74341edb306SCy Schubert /* ARGSUSED */
printdldetachreq(union DL_primitives * dlp)744*efeb8bffSCy Schubert printdldetachreq(union DL_primitives *dlp)
74541edb306SCy Schubert {
74641edb306SCy Schubert 	(void) printf("DL_DETACH_REQ\n");
74741edb306SCy Schubert }
74841edb306SCy Schubert 
printdlbindreq(union DL_primitives * dlp)749*efeb8bffSCy Schubert printdlbindreq(union DL_primitives *dlp)
75041edb306SCy Schubert {
75141edb306SCy Schubert 	(void) printf("DL_BIND_REQ:  sap %d max_conind %d\n",
75241edb306SCy Schubert 		dlp->bind_req.dl_sap,
75341edb306SCy Schubert 		dlp->bind_req.dl_max_conind);
75441edb306SCy Schubert 	(void) printf("service_mode %s conn_mgmt %d xidtest_flg 0x%x\n",
75541edb306SCy Schubert 		dlservicemode(dlp->bind_req.dl_service_mode),
75641edb306SCy Schubert 		dlp->bind_req.dl_conn_mgmt,
75741edb306SCy Schubert 		dlp->bind_req.dl_xidtest_flg);
75841edb306SCy Schubert }
75941edb306SCy Schubert 
printdlbindack(union DL_primitives * dlp)760*efeb8bffSCy Schubert printdlbindack(union DL_primitives *dlp)
76141edb306SCy Schubert {
76241edb306SCy Schubert 	u_char	addr[MAXDLADDR];
76341edb306SCy Schubert 
76441edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->bind_ack.dl_addr_offset),
76541edb306SCy Schubert 		dlp->bind_ack.dl_addr_length, addr);
76641edb306SCy Schubert 
76741edb306SCy Schubert 	(void) printf("DL_BIND_ACK:  sap %d addr_length %d addr_offset %d\n",
76841edb306SCy Schubert 		dlp->bind_ack.dl_sap,
76941edb306SCy Schubert 		dlp->bind_ack.dl_addr_length,
77041edb306SCy Schubert 		dlp->bind_ack.dl_addr_offset);
77141edb306SCy Schubert 	(void) printf("max_conind %d xidtest_flg 0x%x\n",
77241edb306SCy Schubert 		dlp->bind_ack.dl_max_conind,
77341edb306SCy Schubert 		dlp->bind_ack.dl_xidtest_flg);
77441edb306SCy Schubert 	(void) printf("addr %s\n", addr);
77541edb306SCy Schubert }
77641edb306SCy Schubert 
77741edb306SCy Schubert /* ARGSUSED */
printdlunbindreq(union DL_primitives * dlp)778*efeb8bffSCy Schubert printdlunbindreq(union DL_primitives *dlp)
77941edb306SCy Schubert {
78041edb306SCy Schubert 	(void) printf("DL_UNBIND_REQ\n");
78141edb306SCy Schubert }
78241edb306SCy Schubert 
printdlsubsbindreq(union DL_primitives * dlp)783*efeb8bffSCy Schubert printdlsubsbindreq(union DL_primitives *dlp)
78441edb306SCy Schubert {
78541edb306SCy Schubert 	u_char	sap[MAXDLADDR];
78641edb306SCy Schubert 
78741edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->subs_bind_req.dl_subs_sap_offset),
78841edb306SCy Schubert 		dlp->subs_bind_req.dl_subs_sap_length, sap);
78941edb306SCy Schubert 
79041edb306SCy Schubert 	(void) printf("DL_SUBS_BIND_REQ:  subs_sap_offset %d sub_sap_len %d\n",
79141edb306SCy Schubert 		dlp->subs_bind_req.dl_subs_sap_offset,
79241edb306SCy Schubert 		dlp->subs_bind_req.dl_subs_sap_length);
79341edb306SCy Schubert 	(void) printf("sap %s\n", sap);
79441edb306SCy Schubert }
79541edb306SCy Schubert 
printdlsubsbindack(union DL_primitives * dlp)796*efeb8bffSCy Schubert printdlsubsbindack(union DL_primitives *dlp)
79741edb306SCy Schubert {
79841edb306SCy Schubert 	u_char	sap[MAXDLADDR];
79941edb306SCy Schubert 
80041edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->subs_bind_ack.dl_subs_sap_offset),
80141edb306SCy Schubert 		dlp->subs_bind_ack.dl_subs_sap_length, sap);
80241edb306SCy Schubert 
80341edb306SCy Schubert 	(void) printf("DL_SUBS_BIND_ACK:  subs_sap_offset %d sub_sap_length %d\n",
80441edb306SCy Schubert 		dlp->subs_bind_ack.dl_subs_sap_offset,
80541edb306SCy Schubert 		dlp->subs_bind_ack.dl_subs_sap_length);
80641edb306SCy Schubert 	(void) printf("sap %s\n", sap);
80741edb306SCy Schubert }
80841edb306SCy Schubert 
printdlsubsunbindreq(union DL_primitives * dlp)809*efeb8bffSCy Schubert printdlsubsunbindreq(union DL_primitives *dlp)
81041edb306SCy Schubert {
81141edb306SCy Schubert 	u_char	sap[MAXDLADDR];
81241edb306SCy Schubert 
81341edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->subs_unbind_req.dl_subs_sap_offset),
81441edb306SCy Schubert 		dlp->subs_unbind_req.dl_subs_sap_length, sap);
81541edb306SCy Schubert 
81641edb306SCy Schubert 	(void) printf("DL_SUBS_UNBIND_REQ:  subs_sap_offset %d sub_sap_length %d\n",
81741edb306SCy Schubert 		dlp->subs_unbind_req.dl_subs_sap_offset,
81841edb306SCy Schubert 		dlp->subs_unbind_req.dl_subs_sap_length);
81941edb306SCy Schubert 	(void) printf("sap %s\n", sap);
82041edb306SCy Schubert }
82141edb306SCy Schubert 
printdlunitdatareq(union DL_primitives * dlp)822*efeb8bffSCy Schubert printdlunitdatareq(union DL_primitives *dlp)
82341edb306SCy Schubert {
82441edb306SCy Schubert 	u_char	addr[MAXDLADDR];
82541edb306SCy Schubert 
82641edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->unitdata_req.dl_dest_addr_offset),
82741edb306SCy Schubert 		dlp->unitdata_req.dl_dest_addr_length, addr);
82841edb306SCy Schubert 
82941edb306SCy Schubert 	(void) printf("DL_UNITDATA_REQ:  dest_addr_length %d dest_addr_offset %d\n",
83041edb306SCy Schubert 		dlp->unitdata_req.dl_dest_addr_length,
83141edb306SCy Schubert 		dlp->unitdata_req.dl_dest_addr_offset);
83241edb306SCy Schubert 	(void) printf("dl_priority.min %d dl_priority.max %d\n",
83341edb306SCy Schubert 		dlp->unitdata_req.dl_priority.dl_min,
83441edb306SCy Schubert 		dlp->unitdata_req.dl_priority.dl_max);
83541edb306SCy Schubert 	(void) printf("addr %s\n", addr);
83641edb306SCy Schubert }
83741edb306SCy Schubert 
printdlunitdataind(union DL_primitives * dlp)838*efeb8bffSCy Schubert printdlunitdataind(union DL_primitives *dlp)
83941edb306SCy Schubert {
84041edb306SCy Schubert 	u_char	dest[MAXDLADDR];
84141edb306SCy Schubert 	u_char	src[MAXDLADDR];
84241edb306SCy Schubert 
84341edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->unitdata_ind.dl_dest_addr_offset),
84441edb306SCy Schubert 		dlp->unitdata_ind.dl_dest_addr_length, dest);
84541edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->unitdata_ind.dl_src_addr_offset),
84641edb306SCy Schubert 		dlp->unitdata_ind.dl_src_addr_length, src);
84741edb306SCy Schubert 
84841edb306SCy Schubert 	(void) printf("DL_UNITDATA_IND:  dest_addr_length %d dest_addr_offset %d\n",
84941edb306SCy Schubert 		dlp->unitdata_ind.dl_dest_addr_length,
85041edb306SCy Schubert 		dlp->unitdata_ind.dl_dest_addr_offset);
85141edb306SCy Schubert 	(void) printf("src_addr_length %d src_addr_offset %d\n",
85241edb306SCy Schubert 		dlp->unitdata_ind.dl_src_addr_length,
85341edb306SCy Schubert 		dlp->unitdata_ind.dl_src_addr_offset);
85441edb306SCy Schubert 	(void) printf("group_address 0x%x\n",
85541edb306SCy Schubert 		dlp->unitdata_ind.dl_group_address);
85641edb306SCy Schubert 	(void) printf("dest %s\n", dest);
85741edb306SCy Schubert 	(void) printf("src %s\n", src);
85841edb306SCy Schubert }
85941edb306SCy Schubert 
printdluderrorind(union DL_primitives * dlp)860*efeb8bffSCy Schubert printdluderrorind(union DL_primitives *dlp)
86141edb306SCy Schubert {
86241edb306SCy Schubert 	u_char	addr[MAXDLADDR];
86341edb306SCy Schubert 
86441edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->uderror_ind.dl_dest_addr_offset),
86541edb306SCy Schubert 		dlp->uderror_ind.dl_dest_addr_length, addr);
86641edb306SCy Schubert 
86741edb306SCy Schubert 	(void) printf("DL_UDERROR_IND:  dest_addr_length %d dest_addr_offset %d\n",
86841edb306SCy Schubert 		dlp->uderror_ind.dl_dest_addr_length,
86941edb306SCy Schubert 		dlp->uderror_ind.dl_dest_addr_offset);
87041edb306SCy Schubert 	(void) printf("unix_errno %d errno %s\n",
87141edb306SCy Schubert 		dlp->uderror_ind.dl_unix_errno,
87241edb306SCy Schubert 		dlerrno(dlp->uderror_ind.dl_errno));
87341edb306SCy Schubert 	(void) printf("addr %s\n", addr);
87441edb306SCy Schubert }
87541edb306SCy Schubert 
printdltestreq(union DL_primitives * dlp)876*efeb8bffSCy Schubert printdltestreq(union DL_primitives *dlp)
87741edb306SCy Schubert {
87841edb306SCy Schubert 	u_char	addr[MAXDLADDR];
87941edb306SCy Schubert 
88041edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->test_req.dl_dest_addr_offset),
88141edb306SCy Schubert 		dlp->test_req.dl_dest_addr_length, addr);
88241edb306SCy Schubert 
88341edb306SCy Schubert 	(void) printf("DL_TEST_REQ:  flag 0x%x dest_addr_length %d dest_addr_offset %d\n",
88441edb306SCy Schubert 		dlp->test_req.dl_flag,
88541edb306SCy Schubert 		dlp->test_req.dl_dest_addr_length,
88641edb306SCy Schubert 		dlp->test_req.dl_dest_addr_offset);
88741edb306SCy Schubert 	(void) printf("dest_addr %s\n", addr);
88841edb306SCy Schubert }
88941edb306SCy Schubert 
printdltestind(union DL_primitives * dlp)890*efeb8bffSCy Schubert printdltestind(union DL_primitives *dlp)
89141edb306SCy Schubert {
89241edb306SCy Schubert 	u_char	dest[MAXDLADDR];
89341edb306SCy Schubert 	u_char	src[MAXDLADDR];
89441edb306SCy Schubert 
89541edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->test_ind.dl_dest_addr_offset),
89641edb306SCy Schubert 		dlp->test_ind.dl_dest_addr_length, dest);
89741edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->test_ind.dl_src_addr_offset),
89841edb306SCy Schubert 		dlp->test_ind.dl_src_addr_length, src);
89941edb306SCy Schubert 
90041edb306SCy Schubert 	(void) printf("DL_TEST_IND:  flag 0x%x dest_addr_length %d dest_addr_offset %d\n",
90141edb306SCy Schubert 		dlp->test_ind.dl_flag,
90241edb306SCy Schubert 		dlp->test_ind.dl_dest_addr_length,
90341edb306SCy Schubert 		dlp->test_ind.dl_dest_addr_offset);
90441edb306SCy Schubert 	(void) printf("src_addr_length %d src_addr_offset %d\n",
90541edb306SCy Schubert 		dlp->test_ind.dl_src_addr_length,
90641edb306SCy Schubert 		dlp->test_ind.dl_src_addr_offset);
90741edb306SCy Schubert 	(void) printf("dest_addr %s\n", dest);
90841edb306SCy Schubert 	(void) printf("src_addr %s\n", src);
90941edb306SCy Schubert }
91041edb306SCy Schubert 
printdltestres(union DL_primitives * dlp)911*efeb8bffSCy Schubert printdltestres(union DL_primitives *dlp)
91241edb306SCy Schubert {
91341edb306SCy Schubert 	u_char	dest[MAXDLADDR];
91441edb306SCy Schubert 
91541edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->test_res.dl_dest_addr_offset),
91641edb306SCy Schubert 		dlp->test_res.dl_dest_addr_length, dest);
91741edb306SCy Schubert 
91841edb306SCy Schubert 	(void) printf("DL_TEST_RES:  flag 0x%x dest_addr_length %d dest_addr_offset %d\n",
91941edb306SCy Schubert 		dlp->test_res.dl_flag,
92041edb306SCy Schubert 		dlp->test_res.dl_dest_addr_length,
92141edb306SCy Schubert 		dlp->test_res.dl_dest_addr_offset);
92241edb306SCy Schubert 	(void) printf("dest_addr %s\n", dest);
92341edb306SCy Schubert }
92441edb306SCy Schubert 
printdltestcon(union DL_primitives * dlp)925*efeb8bffSCy Schubert printdltestcon(union DL_primitives *dlp)
92641edb306SCy Schubert {
92741edb306SCy Schubert 	u_char	dest[MAXDLADDR];
92841edb306SCy Schubert 	u_char	src[MAXDLADDR];
92941edb306SCy Schubert 
93041edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->test_con.dl_dest_addr_offset),
93141edb306SCy Schubert 		dlp->test_con.dl_dest_addr_length, dest);
93241edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->test_con.dl_src_addr_offset),
93341edb306SCy Schubert 		dlp->test_con.dl_src_addr_length, src);
93441edb306SCy Schubert 
93541edb306SCy Schubert 	(void) printf("DL_TEST_CON:  flag 0x%x dest_addr_length %d dest_addr_offset %d\n",
93641edb306SCy Schubert 		dlp->test_con.dl_flag,
93741edb306SCy Schubert 		dlp->test_con.dl_dest_addr_length,
93841edb306SCy Schubert 		dlp->test_con.dl_dest_addr_offset);
93941edb306SCy Schubert 	(void) printf("src_addr_length %d src_addr_offset %d\n",
94041edb306SCy Schubert 		dlp->test_con.dl_src_addr_length,
94141edb306SCy Schubert 		dlp->test_con.dl_src_addr_offset);
94241edb306SCy Schubert 	(void) printf("dest_addr %s\n", dest);
94341edb306SCy Schubert 	(void) printf("src_addr %s\n", src);
94441edb306SCy Schubert }
94541edb306SCy Schubert 
printdlxidreq(union DL_primitives * dlp)946*efeb8bffSCy Schubert printdlxidreq(union DL_primitives *dlp)
94741edb306SCy Schubert {
94841edb306SCy Schubert 	u_char	dest[MAXDLADDR];
94941edb306SCy Schubert 
95041edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->xid_req.dl_dest_addr_offset),
95141edb306SCy Schubert 		dlp->xid_req.dl_dest_addr_length, dest);
95241edb306SCy Schubert 
95341edb306SCy Schubert 	(void) printf("DL_XID_REQ:  flag 0x%x dest_addr_length %d dest_addr_offset %d\n",
95441edb306SCy Schubert 		dlp->xid_req.dl_flag,
95541edb306SCy Schubert 		dlp->xid_req.dl_dest_addr_length,
95641edb306SCy Schubert 		dlp->xid_req.dl_dest_addr_offset);
95741edb306SCy Schubert 	(void) printf("dest_addr %s\n", dest);
95841edb306SCy Schubert }
95941edb306SCy Schubert 
printdlxidind(dlpunion DL_primitives *)960*efeb8bffSCy Schubert printdlxidind(dlpunion DL_primitives *)
96141edb306SCy Schubert {
96241edb306SCy Schubert 	u_char	dest[MAXDLADDR];
96341edb306SCy Schubert 	u_char	src[MAXDLADDR];
96441edb306SCy Schubert 
96541edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->xid_ind.dl_dest_addr_offset),
96641edb306SCy Schubert 		dlp->xid_ind.dl_dest_addr_length, dest);
96741edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->xid_ind.dl_src_addr_offset),
96841edb306SCy Schubert 		dlp->xid_ind.dl_src_addr_length, src);
96941edb306SCy Schubert 
97041edb306SCy Schubert 	(void) printf("DL_XID_IND:  flag 0x%x dest_addr_length %d dest_addr_offset %d\n",
97141edb306SCy Schubert 		dlp->xid_ind.dl_flag,
97241edb306SCy Schubert 		dlp->xid_ind.dl_dest_addr_length,
97341edb306SCy Schubert 		dlp->xid_ind.dl_dest_addr_offset);
97441edb306SCy Schubert 	(void) printf("src_addr_length %d src_addr_offset %d\n",
97541edb306SCy Schubert 		dlp->xid_ind.dl_src_addr_length,
97641edb306SCy Schubert 		dlp->xid_ind.dl_src_addr_offset);
97741edb306SCy Schubert 	(void) printf("dest_addr %s\n", dest);
97841edb306SCy Schubert 	(void) printf("src_addr %s\n", src);
97941edb306SCy Schubert }
98041edb306SCy Schubert 
printdlxidres(union DL_primitives * dlp)981*efeb8bffSCy Schubert printdlxidres(union DL_primitives *dlp)
98241edb306SCy Schubert {
98341edb306SCy Schubert 	u_char	dest[MAXDLADDR];
98441edb306SCy Schubert 
98541edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->xid_res.dl_dest_addr_offset),
98641edb306SCy Schubert 		dlp->xid_res.dl_dest_addr_length, dest);
98741edb306SCy Schubert 
98841edb306SCy Schubert 	(void) printf("DL_XID_RES:  flag 0x%x dest_addr_length %d dest_addr_offset %d\n",
98941edb306SCy Schubert 		dlp->xid_res.dl_flag,
99041edb306SCy Schubert 		dlp->xid_res.dl_dest_addr_length,
99141edb306SCy Schubert 		dlp->xid_res.dl_dest_addr_offset);
99241edb306SCy Schubert 	(void) printf("dest_addr %s\n", dest);
99341edb306SCy Schubert }
99441edb306SCy Schubert 
printdlxidcon(union DL_primitives * dlp)995*efeb8bffSCy Schubert printdlxidcon(union DL_primitives *dlp)
99641edb306SCy Schubert {
99741edb306SCy Schubert 	u_char	dest[MAXDLADDR];
99841edb306SCy Schubert 	u_char	src[MAXDLADDR];
99941edb306SCy Schubert 
100041edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->xid_con.dl_dest_addr_offset),
100141edb306SCy Schubert 		dlp->xid_con.dl_dest_addr_length, dest);
100241edb306SCy Schubert 	addrtostring(OFFADDR(dlp, dlp->xid_con.dl_src_addr_offset),
100341edb306SCy Schubert 		dlp->xid_con.dl_src_addr_length, src);
100441edb306SCy Schubert 
100541edb306SCy Schubert 	(void) printf("DL_XID_CON:  flag 0x%x dest_addr_length %d dest_addr_offset %d\n",
100641edb306SCy Schubert 		dlp->xid_con.dl_flag,
100741edb306SCy Schubert 		dlp->xid_con.dl_dest_addr_length,
100841edb306SCy Schubert 		dlp->xid_con.dl_dest_addr_offset);
100941edb306SCy Schubert 	(void) printf("src_addr_length %d src_addr_offset %d\n",
101041edb306SCy Schubert 		dlp->xid_con.dl_src_addr_length,
101141edb306SCy Schubert 		dlp->xid_con.dl_src_addr_offset);
101241edb306SCy Schubert 	(void) printf("dest_addr %s\n", dest);
101341edb306SCy Schubert 	(void) printf("src_addr %s\n", src);
101441edb306SCy Schubert }
101541edb306SCy Schubert 
printdludqosreq(union DL_primitives * dlp)1016*efeb8bffSCy Schubert printdludqosreq(union DL_primitives *dlp)
101741edb306SCy Schubert {
101841edb306SCy Schubert 	(void) printf("DL_UDQOS_REQ:  qos_length %d qos_offset %d\n",
101941edb306SCy Schubert 		dlp->udqos_req.dl_qos_length,
102041edb306SCy Schubert 		dlp->udqos_req.dl_qos_offset);
102141edb306SCy Schubert }
102241edb306SCy Schubert 
102341edb306SCy Schubert /*
102441edb306SCy Schubert  * Return string.
102541edb306SCy Schubert  */
addrtostring(u_char * addr,u_long length,u_char * s)1026*efeb8bffSCy Schubert addrtostring(u_char *addr, u_long length, u_char *s)
102741edb306SCy Schubert {
102841edb306SCy Schubert 	int	i;
102941edb306SCy Schubert 
103041edb306SCy Schubert 	for (i = 0; i < length; i++) {
103141edb306SCy Schubert 		(void) sprintf((char*) s, "%x:", addr[i] & 0xff);
103241edb306SCy Schubert 		s = s + strlen((char*)s);
103341edb306SCy Schubert 	}
103441edb306SCy Schubert 	if (length)
103541edb306SCy Schubert 		*(--s) = '\0';
103641edb306SCy Schubert }
103741edb306SCy Schubert 
103841edb306SCy Schubert /*
103941edb306SCy Schubert  * Return length
104041edb306SCy Schubert  */
stringtoaddr(char * sp,char * addr)1041*efeb8bffSCy Schubert stringtoaddr(char *sp, char *addr)
104241edb306SCy Schubert {
104341edb306SCy Schubert 	int	n = 0;
104441edb306SCy Schubert 	char	*p;
104541edb306SCy Schubert 	int	val;
104641edb306SCy Schubert 
104741edb306SCy Schubert 	p = sp;
104841edb306SCy Schubert 	while (p = strtok(p, ":")) {
104941edb306SCy Schubert 		if (sscanf(p, "%x", &val) != 1)
105041edb306SCy Schubert 			err("stringtoaddr:  invalid input string:  %s", sp);
105141edb306SCy Schubert 		if (val > 0xff)
105241edb306SCy Schubert 			err("stringtoaddr:  invalid input string:  %s", sp);
105341edb306SCy Schubert 		*addr++ = val;
105441edb306SCy Schubert 		n++;
105541edb306SCy Schubert 		p = NULL;
105641edb306SCy Schubert 	}
105741edb306SCy Schubert 
105841edb306SCy Schubert 	return (n);
105941edb306SCy Schubert }
106041edb306SCy Schubert 
106141edb306SCy Schubert 
106241edb306SCy Schubert static char
hexnibble(char c)1063*efeb8bffSCy Schubert hexnibble(char c)
106441edb306SCy Schubert {
106541edb306SCy Schubert 	static	char	hextab[] = {
106641edb306SCy Schubert 		'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
106741edb306SCy Schubert 		'a', 'b', 'c', 'd', 'e', 'f'
106841edb306SCy Schubert 	};
106941edb306SCy Schubert 
107041edb306SCy Schubert 	return (hextab[c & 0x0f]);
107141edb306SCy Schubert }
107241edb306SCy Schubert 
107341edb306SCy Schubert char*
dlprim(u_long prim)1074*efeb8bffSCy Schubert dlprim(u_long prim)
107541edb306SCy Schubert {
107641edb306SCy Schubert 	static	char	primbuf[80];
107741edb306SCy Schubert 
107841edb306SCy Schubert 	switch ((int)prim) {
107941edb306SCy Schubert 		CASERET(DL_INFO_REQ);
108041edb306SCy Schubert 		CASERET(DL_INFO_ACK);
108141edb306SCy Schubert 		CASERET(DL_ATTACH_REQ);
108241edb306SCy Schubert 		CASERET(DL_DETACH_REQ);
108341edb306SCy Schubert 		CASERET(DL_BIND_REQ);
108441edb306SCy Schubert 		CASERET(DL_BIND_ACK);
108541edb306SCy Schubert 		CASERET(DL_UNBIND_REQ);
108641edb306SCy Schubert 		CASERET(DL_OK_ACK);
108741edb306SCy Schubert 		CASERET(DL_ERROR_ACK);
108841edb306SCy Schubert 		CASERET(DL_SUBS_BIND_REQ);
108941edb306SCy Schubert 		CASERET(DL_SUBS_BIND_ACK);
109041edb306SCy Schubert 		CASERET(DL_UNITDATA_REQ);
109141edb306SCy Schubert 		CASERET(DL_UNITDATA_IND);
109241edb306SCy Schubert 		CASERET(DL_UDERROR_IND);
109341edb306SCy Schubert 		CASERET(DL_UDQOS_REQ);
109441edb306SCy Schubert 		CASERET(DL_CONNECT_REQ);
109541edb306SCy Schubert 		CASERET(DL_CONNECT_IND);
109641edb306SCy Schubert 		CASERET(DL_CONNECT_RES);
109741edb306SCy Schubert 		CASERET(DL_CONNECT_CON);
109841edb306SCy Schubert 		CASERET(DL_TOKEN_REQ);
109941edb306SCy Schubert 		CASERET(DL_TOKEN_ACK);
110041edb306SCy Schubert 		CASERET(DL_DISCONNECT_REQ);
110141edb306SCy Schubert 		CASERET(DL_DISCONNECT_IND);
110241edb306SCy Schubert 		CASERET(DL_RESET_REQ);
110341edb306SCy Schubert 		CASERET(DL_RESET_IND);
110441edb306SCy Schubert 		CASERET(DL_RESET_RES);
110541edb306SCy Schubert 		CASERET(DL_RESET_CON);
110641edb306SCy Schubert 		default:
110741edb306SCy Schubert 			(void) snprintf(primbuf, sizeof(primbuf), "unknown primitive 0x%x", prim);
110841edb306SCy Schubert 			return (primbuf);
110941edb306SCy Schubert 	}
111041edb306SCy Schubert }
111141edb306SCy Schubert 
111241edb306SCy Schubert 
111341edb306SCy Schubert char*
dlstate(u_long state)1114*efeb8bffSCy Schubert dlstate(u_long state)
111541edb306SCy Schubert {
111641edb306SCy Schubert 	static	char	statebuf[80];
111741edb306SCy Schubert 
111841edb306SCy Schubert 	switch (state) {
111941edb306SCy Schubert 		CASERET(DL_UNATTACHED);
112041edb306SCy Schubert 		CASERET(DL_ATTACH_PENDING);
112141edb306SCy Schubert 		CASERET(DL_DETACH_PENDING);
112241edb306SCy Schubert 		CASERET(DL_UNBOUND);
112341edb306SCy Schubert 		CASERET(DL_BIND_PENDING);
112441edb306SCy Schubert 		CASERET(DL_UNBIND_PENDING);
112541edb306SCy Schubert 		CASERET(DL_IDLE);
112641edb306SCy Schubert 		CASERET(DL_UDQOS_PENDING);
112741edb306SCy Schubert 		CASERET(DL_OUTCON_PENDING);
112841edb306SCy Schubert 		CASERET(DL_INCON_PENDING);
112941edb306SCy Schubert 		CASERET(DL_CONN_RES_PENDING);
113041edb306SCy Schubert 		CASERET(DL_DATAXFER);
113141edb306SCy Schubert 		CASERET(DL_USER_RESET_PENDING);
113241edb306SCy Schubert 		CASERET(DL_PROV_RESET_PENDING);
113341edb306SCy Schubert 		CASERET(DL_RESET_RES_PENDING);
113441edb306SCy Schubert 		CASERET(DL_DISCON8_PENDING);
113541edb306SCy Schubert 		CASERET(DL_DISCON9_PENDING);
113641edb306SCy Schubert 		CASERET(DL_DISCON11_PENDING);
113741edb306SCy Schubert 		CASERET(DL_DISCON12_PENDING);
113841edb306SCy Schubert 		CASERET(DL_DISCON13_PENDING);
113941edb306SCy Schubert 		CASERET(DL_SUBS_BIND_PND);
114041edb306SCy Schubert 		default:
114141edb306SCy Schubert 			(void) snprintf(statebuf, sizeof(statebuf), "unknown state 0x%x", state);
114241edb306SCy Schubert 			return (statebuf);
114341edb306SCy Schubert 	}
114441edb306SCy Schubert }
114541edb306SCy Schubert 
114641edb306SCy Schubert char*
dlerrno(u_long errno)1147*efeb8bffSCy Schubert dlerrno(u_long errno)
114841edb306SCy Schubert {
114941edb306SCy Schubert 	static	char	errnobuf[80];
115041edb306SCy Schubert 
115141edb306SCy Schubert 	switch (errno) {
115241edb306SCy Schubert 		CASERET(DL_ACCESS);
115341edb306SCy Schubert 		CASERET(DL_BADADDR);
115441edb306SCy Schubert 		CASERET(DL_BADCORR);
115541edb306SCy Schubert 		CASERET(DL_BADDATA);
115641edb306SCy Schubert 		CASERET(DL_BADPPA);
115741edb306SCy Schubert 		CASERET(DL_BADPRIM);
115841edb306SCy Schubert 		CASERET(DL_BADQOSPARAM);
115941edb306SCy Schubert 		CASERET(DL_BADQOSTYPE);
116041edb306SCy Schubert 		CASERET(DL_BADSAP);
116141edb306SCy Schubert 		CASERET(DL_BADTOKEN);
116241edb306SCy Schubert 		CASERET(DL_BOUND);
116341edb306SCy Schubert 		CASERET(DL_INITFAILED);
116441edb306SCy Schubert 		CASERET(DL_NOADDR);
116541edb306SCy Schubert 		CASERET(DL_NOTINIT);
116641edb306SCy Schubert 		CASERET(DL_OUTSTATE);
116741edb306SCy Schubert 		CASERET(DL_SYSERR);
116841edb306SCy Schubert 		CASERET(DL_UNSUPPORTED);
116941edb306SCy Schubert 		CASERET(DL_UNDELIVERABLE);
117041edb306SCy Schubert 		CASERET(DL_NOTSUPPORTED);
117141edb306SCy Schubert 		CASERET(DL_TOOMANY);
117241edb306SCy Schubert 		CASERET(DL_NOTENAB);
117341edb306SCy Schubert 		CASERET(DL_BUSY);
117441edb306SCy Schubert 		CASERET(DL_NOAUTO);
117541edb306SCy Schubert 		CASERET(DL_NOXIDAUTO);
117641edb306SCy Schubert 		CASERET(DL_NOTESTAUTO);
117741edb306SCy Schubert 		CASERET(DL_XIDAUTO);
117841edb306SCy Schubert 		CASERET(DL_TESTAUTO);
117941edb306SCy Schubert 		CASERET(DL_PENDING);
118041edb306SCy Schubert 
118141edb306SCy Schubert 		default:
118241edb306SCy Schubert 			(void) snprintf(errnobuf, sizeof(errnobuf), "unknown dlpi errno 0x%x", errno);
118341edb306SCy Schubert 			return (errnobuf);
118441edb306SCy Schubert 	}
118541edb306SCy Schubert }
118641edb306SCy Schubert 
118741edb306SCy Schubert char*
dlpromisclevel(u_long level)1188*efeb8bffSCy Schubert dlpromisclevel(u_long level)
118941edb306SCy Schubert {
119041edb306SCy Schubert 	static	char	levelbuf[80];
119141edb306SCy Schubert 
119241edb306SCy Schubert 	switch (level) {
119341edb306SCy Schubert 		CASERET(DL_PROMISC_PHYS);
119441edb306SCy Schubert 		CASERET(DL_PROMISC_SAP);
119541edb306SCy Schubert 		CASERET(DL_PROMISC_MULTI);
119641edb306SCy Schubert 		default:
119741edb306SCy Schubert 			(void) snprintf(levelbuf, sizeof(levelbuf), "unknown promisc level 0x%x", level);
119841edb306SCy Schubert 			return (levelbuf);
119941edb306SCy Schubert 	}
120041edb306SCy Schubert }
120141edb306SCy Schubert 
120241edb306SCy Schubert char*
dlservicemode(u_long servicemode)1203*efeb8bffSCy Schubert dlservicemode(u_long servicemode)
120441edb306SCy Schubert {
120541edb306SCy Schubert 	static	char	servicemodebuf[80];
120641edb306SCy Schubert 
120741edb306SCy Schubert 	switch (servicemode) {
120841edb306SCy Schubert 		CASERET(DL_CODLS);
120941edb306SCy Schubert 		CASERET(DL_CLDLS);
121041edb306SCy Schubert 		CASERET(DL_CODLS|DL_CLDLS);
121141edb306SCy Schubert 		default:
121241edb306SCy Schubert 			(void) snprintf(servicemodebuf, sizeof(servicemodebuf),
121341edb306SCy Schubert 				"unknown provider service mode 0x%x", servicemode);
121441edb306SCy Schubert 			return (servicemodebuf);
121541edb306SCy Schubert 	}
121641edb306SCy Schubert }
121741edb306SCy Schubert 
121841edb306SCy Schubert char*
dlstyle(long style)1219*efeb8bffSCy Schubert dlstyle(long style)
122041edb306SCy Schubert {
122141edb306SCy Schubert 	static	char	stylebuf[80];
122241edb306SCy Schubert 
122341edb306SCy Schubert 	switch (style) {
122441edb306SCy Schubert 		CASERET(DL_STYLE1);
122541edb306SCy Schubert 		CASERET(DL_STYLE2);
122641edb306SCy Schubert 		default:
122741edb306SCy Schubert 			(void) snprintf(stylebuf, sizeof(stylebuf), "unknown provider style 0x%x", style);
122841edb306SCy Schubert 			return (stylebuf);
122941edb306SCy Schubert 	}
123041edb306SCy Schubert }
123141edb306SCy Schubert 
123241edb306SCy Schubert char*
dlmactype(u_long media)1233*efeb8bffSCy Schubert dlmactype(u_long media)
123441edb306SCy Schubert {
123541edb306SCy Schubert 	static	char	mediabuf[80];
123641edb306SCy Schubert 
123741edb306SCy Schubert 	switch (media) {
123841edb306SCy Schubert 		CASERET(DL_CSMACD);
123941edb306SCy Schubert 		CASERET(DL_TPB);
124041edb306SCy Schubert 		CASERET(DL_TPR);
124141edb306SCy Schubert 		CASERET(DL_METRO);
124241edb306SCy Schubert 		CASERET(DL_ETHER);
124341edb306SCy Schubert 		CASERET(DL_HDLC);
124441edb306SCy Schubert 		CASERET(DL_CHAR);
124541edb306SCy Schubert 		CASERET(DL_CTCA);
124641edb306SCy Schubert 		default:
124741edb306SCy Schubert 			(void) snprintf(mediabuf, sizeof(mediabuf), "unknown media type 0x%x", media);
124841edb306SCy Schubert 			return (mediabuf);
124941edb306SCy Schubert 	}
125041edb306SCy Schubert }
125141edb306SCy Schubert 
125241edb306SCy Schubert /*VARARGS1*/
err(char * fmt,char * a1,char * a2,char * a3,char * a4)1253*efeb8bffSCy Schubert err(char *fmt, char *a1, char *a2, char *a3, char *a4)
125441edb306SCy Schubert {
125541edb306SCy Schubert 	(void) fprintf(stderr, fmt, a1, a2, a3, a4);
125641edb306SCy Schubert 	(void) fprintf(stderr, "\n");
125741edb306SCy Schubert 	(void) exit(1);
125841edb306SCy Schubert }
125941edb306SCy Schubert 
1260*efeb8bffSCy Schubert syserr(char *s)
126141edb306SCy Schubert 	char	*s;
126241edb306SCy Schubert {
126341edb306SCy Schubert 	(void) perror(s);
126441edb306SCy Schubert 	exit(1);
126541edb306SCy Schubert }
126641edb306SCy Schubert 
strioctl(int fd,int cmd,int timout,int len,char * dp)1267*efeb8bffSCy Schubert strioctl(int fd, int cmd, int timout, int len, char *dp)
126841edb306SCy Schubert {
126941edb306SCy Schubert 	struct	strioctl	sioc;
127041edb306SCy Schubert 	int	rc;
127141edb306SCy Schubert 
127241edb306SCy Schubert 	sioc.ic_cmd = cmd;
127341edb306SCy Schubert 	sioc.ic_timout = timout;
127441edb306SCy Schubert 	sioc.ic_len = len;
127541edb306SCy Schubert 	sioc.ic_dp = dp;
127641edb306SCy Schubert 	rc = ioctl(fd, I_STR, &sioc);
127741edb306SCy Schubert 
127841edb306SCy Schubert 	if (rc < 0)
127941edb306SCy Schubert 		return (rc);
128041edb306SCy Schubert 	else
128141edb306SCy Schubert 		return (sioc.ic_len);
128241edb306SCy Schubert }
1283