1145519Sdarrenr/*	$FreeBSD: releng/10.3/contrib/ipfilter/ipsend/dlcommon.c 255332 2013-09-06 23:11:19Z cy $	*/
2145510Sdarrenr
322514Sdarrenr/*
422514Sdarrenr * Common (shared) DLPI test routines.
522514Sdarrenr * Mostly pretty boring boilerplate sorta stuff.
622514Sdarrenr * These can be split into individual library routines later
722514Sdarrenr * but it's just convenient to keep them in a single file
822514Sdarrenr * while they're being developed.
922514Sdarrenr *
1022514Sdarrenr * Not supported:
1122514Sdarrenr *   Connection Oriented stuff
1222514Sdarrenr *   QOS stuff
1322514Sdarrenr */
1422514Sdarrenr
1522514Sdarrenr/*
1622514Sdarrenrtypedef	unsigned long	ulong;
1722514Sdarrenr*/
1822514Sdarrenr
1922514Sdarrenr
2022514Sdarrenr#include	<sys/types.h>
2122514Sdarrenr#include	<sys/stream.h>
2222514Sdarrenr#include	<sys/stropts.h>
23145510Sdarrenr#ifdef __osf__
24145510Sdarrenr# include	<sys/dlpihdr.h>
25145510Sdarrenr#else
26145510Sdarrenr# include	<sys/dlpi.h>
27145510Sdarrenr#endif
2822514Sdarrenr#include	<sys/signal.h>
2922514Sdarrenr#include	<stdio.h>
3022514Sdarrenr#include	<string.h>
3122514Sdarrenr#include	"dltest.h"
3222514Sdarrenr
3322514Sdarrenr#define		CASERET(s)	case s:  return ("s")
3422514Sdarrenr
35255332Scy	char	*dlprim();
36255332Scy	char	*dlstate();
37255332Scy	char	*dlerrno();
38255332Scy	char	*dlpromisclevel();
39255332Scy	char	*dlservicemode();
40255332Scy	char	*dlstyle();
41255332Scy	char	*dlmactype();
4222514Sdarrenr
4322514Sdarrenr
44145510Sdarrenrvoid
4522514Sdarrenrdlinforeq(fd)
46255332Scy	int	fd;
4722514Sdarrenr{
4822514Sdarrenr	dl_info_req_t	info_req;
4922514Sdarrenr	struct	strbuf	ctl;
5022514Sdarrenr	int	flags;
5122514Sdarrenr
5222514Sdarrenr	info_req.dl_primitive = DL_INFO_REQ;
5322514Sdarrenr
5422514Sdarrenr	ctl.maxlen = 0;
5522514Sdarrenr	ctl.len = sizeof (info_req);
5622514Sdarrenr	ctl.buf = (char *) &info_req;
5722514Sdarrenr
5822514Sdarrenr	flags = RS_HIPRI;
5922514Sdarrenr
6022514Sdarrenr	if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)
6122514Sdarrenr		syserr("dlinforeq:  putmsg");
6222514Sdarrenr}
6322514Sdarrenr
64145510Sdarrenrvoid
6522514Sdarrenrdlinfoack(fd, bufp)
66255332Scy	int	fd;
67255332Scy	char	*bufp;
6822514Sdarrenr{
6922514Sdarrenr	union	DL_primitives	*dlp;
7022514Sdarrenr	struct	strbuf	ctl;
7122514Sdarrenr	int	flags;
7222514Sdarrenr
7322514Sdarrenr	ctl.maxlen = MAXDLBUF;
7422514Sdarrenr	ctl.len = 0;
7522514Sdarrenr	ctl.buf = bufp;
7622514Sdarrenr
7722514Sdarrenr	strgetmsg(fd, &ctl, (struct strbuf*)NULL, &flags, "dlinfoack");
7822514Sdarrenr
7922514Sdarrenr	dlp = (union DL_primitives *) ctl.buf;
8022514Sdarrenr
8122514Sdarrenr	expecting(DL_INFO_ACK, dlp);
8222514Sdarrenr
8322514Sdarrenr	if (ctl.len < sizeof (dl_info_ack_t))
8422514Sdarrenr		err("dlinfoack:  response ctl.len too short:  %d", ctl.len);
8522514Sdarrenr
8622514Sdarrenr	if (flags != RS_HIPRI)
8722514Sdarrenr		err("dlinfoack:  DL_INFO_ACK was not M_PCPROTO");
8822514Sdarrenr
8922514Sdarrenr	if (ctl.len < sizeof (dl_info_ack_t))
9022514Sdarrenr		err("dlinfoack:  short response ctl.len:  %d", ctl.len);
9122514Sdarrenr}
9222514Sdarrenr
93145510Sdarrenrvoid
9422514Sdarrenrdlattachreq(fd, ppa)
95255332Scy	int	fd;
96255332Scy	u_long	ppa;
9722514Sdarrenr{
9822514Sdarrenr	dl_attach_req_t	attach_req;
9922514Sdarrenr	struct	strbuf	ctl;
10022514Sdarrenr	int	flags;
10122514Sdarrenr
10222514Sdarrenr	attach_req.dl_primitive = DL_ATTACH_REQ;
10322514Sdarrenr	attach_req.dl_ppa = ppa;
10422514Sdarrenr
10522514Sdarrenr	ctl.maxlen = 0;
10622514Sdarrenr	ctl.len = sizeof (attach_req);
10722514Sdarrenr	ctl.buf = (char *) &attach_req;
10822514Sdarrenr
10922514Sdarrenr	flags = 0;
11022514Sdarrenr
11122514Sdarrenr	if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)
11222514Sdarrenr		syserr("dlattachreq:  putmsg");
11322514Sdarrenr}
11422514Sdarrenr
115145510Sdarrenrvoid
11622514Sdarrenrdlenabmultireq(fd, addr, length)
117255332Scy	int	fd;
118255332Scy	char	*addr;
119255332Scy	int	length;
12022514Sdarrenr{
12122514Sdarrenr	long	buf[MAXDLBUF];
12222514Sdarrenr	union	DL_primitives	*dlp;
12322514Sdarrenr	struct	strbuf	ctl;
12422514Sdarrenr	int	flags;
12522514Sdarrenr
12622514Sdarrenr	dlp = (union DL_primitives*) buf;
12722514Sdarrenr
12822514Sdarrenr	dlp->enabmulti_req.dl_primitive = DL_ENABMULTI_REQ;
12922514Sdarrenr	dlp->enabmulti_req.dl_addr_length = length;
13022514Sdarrenr	dlp->enabmulti_req.dl_addr_offset = sizeof (dl_enabmulti_req_t);
13122514Sdarrenr
13222514Sdarrenr	(void) memcpy((char*)OFFADDR(buf, sizeof (dl_enabmulti_req_t)), addr, length);
13322514Sdarrenr
13422514Sdarrenr	ctl.maxlen = 0;
13522514Sdarrenr	ctl.len = sizeof (dl_enabmulti_req_t) + length;
13622514Sdarrenr	ctl.buf = (char*) buf;
13722514Sdarrenr
13822514Sdarrenr	flags = 0;
13922514Sdarrenr
14022514Sdarrenr	if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)
14122514Sdarrenr		syserr("dlenabmultireq:  putmsg");
14222514Sdarrenr}
14322514Sdarrenr
144145510Sdarrenrvoid
14522514Sdarrenrdldisabmultireq(fd, addr, length)
146255332Scy	int	fd;
147255332Scy	char	*addr;
148255332Scy	int	length;
14922514Sdarrenr{
15022514Sdarrenr	long	buf[MAXDLBUF];
15122514Sdarrenr	union	DL_primitives	*dlp;
15222514Sdarrenr	struct	strbuf	ctl;
15322514Sdarrenr	int	flags;
15422514Sdarrenr
15522514Sdarrenr	dlp = (union DL_primitives*) buf;
15622514Sdarrenr
15722514Sdarrenr	dlp->disabmulti_req.dl_primitive = DL_ENABMULTI_REQ;
15822514Sdarrenr	dlp->disabmulti_req.dl_addr_length = length;
15922514Sdarrenr	dlp->disabmulti_req.dl_addr_offset = sizeof (dl_disabmulti_req_t);
16022514Sdarrenr
16122514Sdarrenr	(void) memcpy((char*)OFFADDR(buf, sizeof (dl_disabmulti_req_t)), addr, length);
16222514Sdarrenr
16322514Sdarrenr	ctl.maxlen = 0;
16422514Sdarrenr	ctl.len = sizeof (dl_disabmulti_req_t) + length;
16522514Sdarrenr	ctl.buf = (char*) buf;
16622514Sdarrenr
16722514Sdarrenr	flags = 0;
16822514Sdarrenr
16922514Sdarrenr	if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)
17022514Sdarrenr		syserr("dldisabmultireq:  putmsg");
17122514Sdarrenr}
17222514Sdarrenr
173145510Sdarrenrvoid
17422514Sdarrenrdlpromisconreq(fd, level)
175255332Scy	int	fd;
176255332Scy	u_long	level;
17722514Sdarrenr{
17822514Sdarrenr	dl_promiscon_req_t	promiscon_req;
17922514Sdarrenr	struct	strbuf	ctl;
18022514Sdarrenr	int	flags;
18122514Sdarrenr
18222514Sdarrenr	promiscon_req.dl_primitive = DL_PROMISCON_REQ;
18322514Sdarrenr	promiscon_req.dl_level = level;
18422514Sdarrenr
18522514Sdarrenr	ctl.maxlen = 0;
18622514Sdarrenr	ctl.len = sizeof (promiscon_req);
18722514Sdarrenr	ctl.buf = (char *) &promiscon_req;
18822514Sdarrenr
18922514Sdarrenr	flags = 0;
19022514Sdarrenr
19122514Sdarrenr	if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)
19222514Sdarrenr		syserr("dlpromiscon:  putmsg");
19322514Sdarrenr
19422514Sdarrenr}
19522514Sdarrenr
196145510Sdarrenrvoid
19722514Sdarrenrdlpromiscoff(fd, level)
198255332Scy	int	fd;
199255332Scy	u_long	level;
20022514Sdarrenr{
20122514Sdarrenr	dl_promiscoff_req_t	promiscoff_req;
20222514Sdarrenr	struct	strbuf	ctl;
20322514Sdarrenr	int	flags;
20422514Sdarrenr
20522514Sdarrenr	promiscoff_req.dl_primitive = DL_PROMISCOFF_REQ;
20622514Sdarrenr	promiscoff_req.dl_level = level;
20722514Sdarrenr
20822514Sdarrenr	ctl.maxlen = 0;
20922514Sdarrenr	ctl.len = sizeof (promiscoff_req);
21022514Sdarrenr	ctl.buf = (char *) &promiscoff_req;
21122514Sdarrenr
21222514Sdarrenr	flags = 0;
21322514Sdarrenr
21422514Sdarrenr	if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)
21522514Sdarrenr		syserr("dlpromiscoff:  putmsg");
21622514Sdarrenr}
21722514Sdarrenr
218145510Sdarrenrvoid
21922514Sdarrenrdlphysaddrreq(fd, addrtype)
220255332Scy	int	fd;
221255332Scy	u_long	addrtype;
22222514Sdarrenr{
22322514Sdarrenr	dl_phys_addr_req_t	phys_addr_req;
22422514Sdarrenr	struct	strbuf	ctl;
22522514Sdarrenr	int	flags;
22622514Sdarrenr
22722514Sdarrenr	phys_addr_req.dl_primitive = DL_PHYS_ADDR_REQ;
22822514Sdarrenr	phys_addr_req.dl_addr_type = addrtype;
22922514Sdarrenr
23022514Sdarrenr	ctl.maxlen = 0;
23122514Sdarrenr	ctl.len = sizeof (phys_addr_req);
23222514Sdarrenr	ctl.buf = (char *) &phys_addr_req;
23322514Sdarrenr
23422514Sdarrenr	flags = 0;
23522514Sdarrenr
23622514Sdarrenr	if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)
23722514Sdarrenr		syserr("dlphysaddrreq:  putmsg");
23822514Sdarrenr}
23922514Sdarrenr
240145510Sdarrenrvoid
24122514Sdarrenrdlsetphysaddrreq(fd, addr, length)
242255332Scy	int	fd;
243255332Scy	char	*addr;
244255332Scy	int	length;
24522514Sdarrenr{
24622514Sdarrenr	long	buf[MAXDLBUF];
24722514Sdarrenr	union	DL_primitives	*dlp;
24822514Sdarrenr	struct	strbuf	ctl;
24922514Sdarrenr	int	flags;
25022514Sdarrenr
25122514Sdarrenr	dlp = (union DL_primitives*) buf;
25222514Sdarrenr
25322514Sdarrenr	dlp->set_physaddr_req.dl_primitive = DL_ENABMULTI_REQ;
25422514Sdarrenr	dlp->set_physaddr_req.dl_addr_length = length;
25522514Sdarrenr	dlp->set_physaddr_req.dl_addr_offset = sizeof (dl_set_phys_addr_req_t);
25622514Sdarrenr
25722514Sdarrenr	(void) memcpy((char*)OFFADDR(buf, sizeof (dl_set_phys_addr_req_t)), addr, length);
25822514Sdarrenr
25922514Sdarrenr	ctl.maxlen = 0;
26022514Sdarrenr	ctl.len = sizeof (dl_set_phys_addr_req_t) + length;
26122514Sdarrenr	ctl.buf = (char*) buf;
26222514Sdarrenr
26322514Sdarrenr	flags = 0;
26422514Sdarrenr
26522514Sdarrenr	if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)
26622514Sdarrenr		syserr("dlsetphysaddrreq:  putmsg");
26722514Sdarrenr}
26822514Sdarrenr
269145510Sdarrenrvoid
27022514Sdarrenrdldetachreq(fd)
271255332Scy	int	fd;
27222514Sdarrenr{
27322514Sdarrenr	dl_detach_req_t	detach_req;
27422514Sdarrenr	struct	strbuf	ctl;
27522514Sdarrenr	int	flags;
27622514Sdarrenr
27722514Sdarrenr	detach_req.dl_primitive = DL_DETACH_REQ;
27822514Sdarrenr
27922514Sdarrenr	ctl.maxlen = 0;
28022514Sdarrenr	ctl.len = sizeof (detach_req);
28122514Sdarrenr	ctl.buf = (char *) &detach_req;
28222514Sdarrenr
28322514Sdarrenr	flags = 0;
28422514Sdarrenr
28522514Sdarrenr	if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)
28622514Sdarrenr		syserr("dldetachreq:  putmsg");
28722514Sdarrenr}
28822514Sdarrenr
289145510Sdarrenrvoid
29022514Sdarrenrdlbindreq(fd, sap, max_conind, service_mode, conn_mgmt, xidtest)
291255332Scy	int	fd;
292255332Scy	u_long	sap;
293255332Scy	u_long	max_conind;
294255332Scy	u_long	service_mode;
295255332Scy	u_long	conn_mgmt;
296255332Scy	u_long	xidtest;
29722514Sdarrenr{
29822514Sdarrenr	dl_bind_req_t	bind_req;
29922514Sdarrenr	struct	strbuf	ctl;
30022514Sdarrenr	int	flags;
30122514Sdarrenr
30222514Sdarrenr	bind_req.dl_primitive = DL_BIND_REQ;
30322514Sdarrenr	bind_req.dl_sap = sap;
30422514Sdarrenr	bind_req.dl_max_conind = max_conind;
30522514Sdarrenr	bind_req.dl_service_mode = service_mode;
30622514Sdarrenr	bind_req.dl_conn_mgmt = conn_mgmt;
30722514Sdarrenr	bind_req.dl_xidtest_flg = xidtest;
30822514Sdarrenr
30922514Sdarrenr	ctl.maxlen = 0;
31022514Sdarrenr	ctl.len = sizeof (bind_req);
31122514Sdarrenr	ctl.buf = (char *) &bind_req;
31222514Sdarrenr
31322514Sdarrenr	flags = 0;
31422514Sdarrenr
31522514Sdarrenr	if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)
31622514Sdarrenr		syserr("dlbindreq:  putmsg");
31722514Sdarrenr}
31822514Sdarrenr
319145510Sdarrenrvoid
32022514Sdarrenrdlunitdatareq(fd, addrp, addrlen, minpri, maxpri, datap, datalen)
321255332Scy	int	fd;
322255332Scy	u_char	*addrp;
323255332Scy	int	addrlen;
324255332Scy	u_long	minpri, maxpri;
325255332Scy	u_char	*datap;
326255332Scy	int	datalen;
32722514Sdarrenr{
32822514Sdarrenr	long	buf[MAXDLBUF];
32922514Sdarrenr	union	DL_primitives	*dlp;
33022514Sdarrenr	struct	strbuf	data, ctl;
33122514Sdarrenr
33222514Sdarrenr	dlp = (union DL_primitives*) buf;
33322514Sdarrenr
33422514Sdarrenr	dlp->unitdata_req.dl_primitive = DL_UNITDATA_REQ;
33522514Sdarrenr	dlp->unitdata_req.dl_dest_addr_length = addrlen;
33622514Sdarrenr	dlp->unitdata_req.dl_dest_addr_offset = sizeof (dl_unitdata_req_t);
33722514Sdarrenr	dlp->unitdata_req.dl_priority.dl_min = minpri;
33822514Sdarrenr	dlp->unitdata_req.dl_priority.dl_max = maxpri;
33922514Sdarrenr
34022514Sdarrenr	(void) memcpy(OFFADDR(dlp, sizeof (dl_unitdata_req_t)), addrp, addrlen);
34122514Sdarrenr
34222514Sdarrenr	ctl.maxlen = 0;
34322514Sdarrenr	ctl.len = sizeof (dl_unitdata_req_t) + addrlen;
34422514Sdarrenr	ctl.buf = (char *) buf;
34522514Sdarrenr
34622514Sdarrenr	data.maxlen = 0;
34722514Sdarrenr	data.len = datalen;
34822514Sdarrenr	data.buf = (char *) datap;
34922514Sdarrenr
35022514Sdarrenr	if (putmsg(fd, &ctl, &data, 0) < 0)
35122514Sdarrenr		syserr("dlunitdatareq:  putmsg");
35222514Sdarrenr}
35322514Sdarrenr
354145510Sdarrenrvoid
35522514Sdarrenrdlunbindreq(fd)
356255332Scy	int	fd;
35722514Sdarrenr{
35822514Sdarrenr	dl_unbind_req_t	unbind_req;
35922514Sdarrenr	struct	strbuf	ctl;
36022514Sdarrenr	int	flags;
36122514Sdarrenr
36222514Sdarrenr	unbind_req.dl_primitive = DL_UNBIND_REQ;
36322514Sdarrenr
36422514Sdarrenr	ctl.maxlen = 0;
36522514Sdarrenr	ctl.len = sizeof (unbind_req);
36622514Sdarrenr	ctl.buf = (char *) &unbind_req;
36722514Sdarrenr
36822514Sdarrenr	flags = 0;
36922514Sdarrenr
37022514Sdarrenr	if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)
37122514Sdarrenr		syserr("dlunbindreq:  putmsg");
37222514Sdarrenr}
37322514Sdarrenr
374145510Sdarrenrvoid
37522514Sdarrenrdlokack(fd, bufp)
376255332Scy	int	fd;
377255332Scy	char	*bufp;
37822514Sdarrenr{
37922514Sdarrenr	union	DL_primitives	*dlp;
38022514Sdarrenr	struct	strbuf	ctl;
38122514Sdarrenr	int	flags;
38222514Sdarrenr
38322514Sdarrenr	ctl.maxlen = MAXDLBUF;
38422514Sdarrenr	ctl.len = 0;
38522514Sdarrenr	ctl.buf = bufp;
38622514Sdarrenr
38722514Sdarrenr	strgetmsg(fd, &ctl, (struct strbuf*)NULL, &flags, "dlokack");
38822514Sdarrenr
38922514Sdarrenr	dlp = (union DL_primitives *) ctl.buf;
39022514Sdarrenr
39122514Sdarrenr	expecting(DL_OK_ACK, dlp);
39222514Sdarrenr
39322514Sdarrenr	if (ctl.len < sizeof (dl_ok_ack_t))
39422514Sdarrenr		err("dlokack:  response ctl.len too short:  %d", ctl.len);
39522514Sdarrenr
39622514Sdarrenr	if (flags != RS_HIPRI)
39722514Sdarrenr		err("dlokack:  DL_OK_ACK was not M_PCPROTO");
39822514Sdarrenr
39922514Sdarrenr	if (ctl.len < sizeof (dl_ok_ack_t))
40022514Sdarrenr		err("dlokack:  short response ctl.len:  %d", ctl.len);
40122514Sdarrenr}
40222514Sdarrenr
403145510Sdarrenrvoid
40422514Sdarrenrdlerrorack(fd, bufp)
405255332Scy	int	fd;
406255332Scy	char	*bufp;
40722514Sdarrenr{
40822514Sdarrenr	union	DL_primitives	*dlp;
40922514Sdarrenr	struct	strbuf	ctl;
41022514Sdarrenr	int	flags;
41122514Sdarrenr
41222514Sdarrenr	ctl.maxlen = MAXDLBUF;
41322514Sdarrenr	ctl.len = 0;
41422514Sdarrenr	ctl.buf = bufp;
41522514Sdarrenr
41622514Sdarrenr	strgetmsg(fd, &ctl, (struct strbuf*)NULL, &flags, "dlerrorack");
41722514Sdarrenr
41822514Sdarrenr	dlp = (union DL_primitives *) ctl.buf;
41922514Sdarrenr
42022514Sdarrenr	expecting(DL_ERROR_ACK, dlp);
42122514Sdarrenr
42222514Sdarrenr	if (ctl.len < sizeof (dl_error_ack_t))
42322514Sdarrenr		err("dlerrorack:  response ctl.len too short:  %d", ctl.len);
42422514Sdarrenr
42522514Sdarrenr	if (flags != RS_HIPRI)
42622514Sdarrenr		err("dlerrorack:  DL_OK_ACK was not M_PCPROTO");
42722514Sdarrenr
42822514Sdarrenr	if (ctl.len < sizeof (dl_error_ack_t))
42922514Sdarrenr		err("dlerrorack:  short response ctl.len:  %d", ctl.len);
43022514Sdarrenr}
43122514Sdarrenr
432145510Sdarrenrvoid
43322514Sdarrenrdlbindack(fd, bufp)
434255332Scy	int	fd;
435255332Scy	char	*bufp;
43622514Sdarrenr{
43722514Sdarrenr	union	DL_primitives	*dlp;
43822514Sdarrenr	struct	strbuf	ctl;
43922514Sdarrenr	int	flags;
44022514Sdarrenr
44122514Sdarrenr	ctl.maxlen = MAXDLBUF;
44222514Sdarrenr	ctl.len = 0;
44322514Sdarrenr	ctl.buf = bufp;
44422514Sdarrenr
44522514Sdarrenr	strgetmsg(fd, &ctl, (struct strbuf*)NULL, &flags, "dlbindack");
44622514Sdarrenr
44722514Sdarrenr	dlp = (union DL_primitives *) ctl.buf;
44822514Sdarrenr
44922514Sdarrenr	expecting(DL_BIND_ACK, dlp);
45022514Sdarrenr
45122514Sdarrenr	if (flags != RS_HIPRI)
45222514Sdarrenr		err("dlbindack:  DL_OK_ACK was not M_PCPROTO");
45322514Sdarrenr
45422514Sdarrenr	if (ctl.len < sizeof (dl_bind_ack_t))
45522514Sdarrenr		err("dlbindack:  short response ctl.len:  %d", ctl.len);
45622514Sdarrenr}
45722514Sdarrenr
458145510Sdarrenrvoid
45922514Sdarrenrdlphysaddrack(fd, bufp)
460255332Scy	int	fd;
461255332Scy	char	*bufp;
46222514Sdarrenr{
46322514Sdarrenr	union	DL_primitives	*dlp;
46422514Sdarrenr	struct	strbuf	ctl;
46522514Sdarrenr	int	flags;
46622514Sdarrenr
46722514Sdarrenr	ctl.maxlen = MAXDLBUF;
46822514Sdarrenr	ctl.len = 0;
46922514Sdarrenr	ctl.buf = bufp;
47022514Sdarrenr
47122514Sdarrenr	strgetmsg(fd, &ctl, (struct strbuf*)NULL, &flags, "dlphysaddrack");
47222514Sdarrenr
47322514Sdarrenr	dlp = (union DL_primitives *) ctl.buf;
47422514Sdarrenr
47522514Sdarrenr	expecting(DL_PHYS_ADDR_ACK, dlp);
47622514Sdarrenr
47722514Sdarrenr	if (flags != RS_HIPRI)
47822514Sdarrenr		err("dlbindack:  DL_OK_ACK was not M_PCPROTO");
47922514Sdarrenr
48022514Sdarrenr	if (ctl.len < sizeof (dl_phys_addr_ack_t))
48122514Sdarrenr		err("dlphysaddrack:  short response ctl.len:  %d", ctl.len);
48222514Sdarrenr}
48322514Sdarrenr
48422514Sdarrenrvoid
48522514Sdarrenrsigalrm()
48622514Sdarrenr{
48722514Sdarrenr	(void) err("sigalrm:  TIMEOUT");
48822514Sdarrenr}
48922514Sdarrenr
49022514Sdarrenrstrgetmsg(fd, ctlp, datap, flagsp, caller)
491255332Scy	int	fd;
492255332Scy	struct	strbuf	*ctlp, *datap;
493255332Scy	int	*flagsp;
494255332Scy	char	*caller;
49522514Sdarrenr{
49622514Sdarrenr	int	rc;
49722514Sdarrenr	static	char	errmsg[80];
49822514Sdarrenr
49922514Sdarrenr	/*
50022514Sdarrenr	 * Start timer.
50122514Sdarrenr	 */
50222514Sdarrenr	(void) signal(SIGALRM, sigalrm);
50322514Sdarrenr	if (alarm(MAXWAIT) < 0) {
50422514Sdarrenr		(void) sprintf(errmsg, "%s:  alarm", caller);
50522514Sdarrenr		syserr(errmsg);
50622514Sdarrenr	}
50722514Sdarrenr
50822514Sdarrenr	/*
50922514Sdarrenr	 * Set flags argument and issue getmsg().
51022514Sdarrenr	 */
51122514Sdarrenr	*flagsp = 0;
51222514Sdarrenr	if ((rc = getmsg(fd, ctlp, datap, flagsp)) < 0) {
51322514Sdarrenr		(void) sprintf(errmsg, "%s:  getmsg", caller);
51422514Sdarrenr		syserr(errmsg);
51522514Sdarrenr	}
51622514Sdarrenr
51722514Sdarrenr	/*
51822514Sdarrenr	 * Stop timer.
51922514Sdarrenr	 */
52022514Sdarrenr	if (alarm(0) < 0) {
52122514Sdarrenr		(void) sprintf(errmsg, "%s:  alarm", caller);
52222514Sdarrenr		syserr(errmsg);
52322514Sdarrenr	}
52422514Sdarrenr
52522514Sdarrenr	/*
52622514Sdarrenr	 * Check for MOREDATA and/or MORECTL.
52722514Sdarrenr	 */
52822514Sdarrenr	if ((rc & (MORECTL | MOREDATA)) == (MORECTL | MOREDATA))
52922514Sdarrenr		err("%s:  MORECTL|MOREDATA", caller);
53022514Sdarrenr	if (rc & MORECTL)
53122514Sdarrenr		err("%s:  MORECTL", caller);
53222514Sdarrenr	if (rc & MOREDATA)
53322514Sdarrenr		err("%s:  MOREDATA", caller);
53422514Sdarrenr
53522514Sdarrenr	/*
53622514Sdarrenr	 * Check for at least sizeof (long) control data portion.
53722514Sdarrenr	 */
53822514Sdarrenr	if (ctlp->len < sizeof (long))
53922514Sdarrenr		err("getmsg:  control portion length < sizeof (long):  %d", ctlp->len);
54022514Sdarrenr}
54122514Sdarrenr
54222514Sdarrenrexpecting(prim, dlp)
543255332Scy	int	prim;
544255332Scy	union	DL_primitives	*dlp;
54522514Sdarrenr{
54622514Sdarrenr	if (dlp->dl_primitive != (u_long)prim) {
54722514Sdarrenr		printdlprim(dlp);
54822514Sdarrenr		err("expected %s got %s", dlprim(prim),
54922514Sdarrenr			dlprim(dlp->dl_primitive));
55022514Sdarrenr		exit(1);
55122514Sdarrenr	}
55222514Sdarrenr}
55322514Sdarrenr
55422514Sdarrenr/*
55522514Sdarrenr * Print any DLPI msg in human readable format.
55622514Sdarrenr */
55722514Sdarrenrprintdlprim(dlp)
558255332Scy	union	DL_primitives	*dlp;
55922514Sdarrenr{
56022514Sdarrenr	switch (dlp->dl_primitive) {
56122514Sdarrenr		case DL_INFO_REQ:
56222514Sdarrenr			printdlinforeq(dlp);
56322514Sdarrenr			break;
56422514Sdarrenr
56522514Sdarrenr		case DL_INFO_ACK:
56622514Sdarrenr			printdlinfoack(dlp);
56722514Sdarrenr			break;
56822514Sdarrenr
56922514Sdarrenr		case DL_ATTACH_REQ:
57022514Sdarrenr			printdlattachreq(dlp);
57122514Sdarrenr			break;
57222514Sdarrenr
57322514Sdarrenr		case DL_OK_ACK:
57422514Sdarrenr			printdlokack(dlp);
57522514Sdarrenr			break;
57622514Sdarrenr
57722514Sdarrenr		case DL_ERROR_ACK:
57822514Sdarrenr			printdlerrorack(dlp);
57922514Sdarrenr			break;
58022514Sdarrenr
58122514Sdarrenr		case DL_DETACH_REQ:
58222514Sdarrenr			printdldetachreq(dlp);
58322514Sdarrenr			break;
58422514Sdarrenr
58522514Sdarrenr		case DL_BIND_REQ:
58622514Sdarrenr			printdlbindreq(dlp);
58722514Sdarrenr			break;
58822514Sdarrenr
58922514Sdarrenr		case DL_BIND_ACK:
59022514Sdarrenr			printdlbindack(dlp);
59122514Sdarrenr			break;
59222514Sdarrenr
59322514Sdarrenr		case DL_UNBIND_REQ:
59422514Sdarrenr			printdlunbindreq(dlp);
59522514Sdarrenr			break;
59622514Sdarrenr
59722514Sdarrenr		case DL_SUBS_BIND_REQ:
59822514Sdarrenr			printdlsubsbindreq(dlp);
59922514Sdarrenr			break;
60022514Sdarrenr
60122514Sdarrenr		case DL_SUBS_BIND_ACK:
60222514Sdarrenr			printdlsubsbindack(dlp);
60322514Sdarrenr			break;
60422514Sdarrenr
60522514Sdarrenr		case DL_SUBS_UNBIND_REQ:
60622514Sdarrenr			printdlsubsunbindreq(dlp);
60722514Sdarrenr			break;
60822514Sdarrenr
60922514Sdarrenr		case DL_ENABMULTI_REQ:
61022514Sdarrenr			printdlenabmultireq(dlp);
61122514Sdarrenr			break;
61222514Sdarrenr
61322514Sdarrenr		case DL_DISABMULTI_REQ:
61422514Sdarrenr			printdldisabmultireq(dlp);
61522514Sdarrenr			break;
61622514Sdarrenr
61722514Sdarrenr		case DL_PROMISCON_REQ:
61822514Sdarrenr			printdlpromisconreq(dlp);
61922514Sdarrenr			break;
62022514Sdarrenr
62122514Sdarrenr		case DL_PROMISCOFF_REQ:
62222514Sdarrenr			printdlpromiscoffreq(dlp);
62322514Sdarrenr			break;
62422514Sdarrenr
62522514Sdarrenr		case DL_UNITDATA_REQ:
62622514Sdarrenr			printdlunitdatareq(dlp);
62722514Sdarrenr			break;
62822514Sdarrenr
62922514Sdarrenr		case DL_UNITDATA_IND:
63022514Sdarrenr			printdlunitdataind(dlp);
63122514Sdarrenr			break;
63222514Sdarrenr
63322514Sdarrenr		case DL_UDERROR_IND:
63422514Sdarrenr			printdluderrorind(dlp);
63522514Sdarrenr			break;
63622514Sdarrenr
63722514Sdarrenr		case DL_UDQOS_REQ:
63822514Sdarrenr			printdludqosreq(dlp);
63922514Sdarrenr			break;
64022514Sdarrenr
64122514Sdarrenr		case DL_PHYS_ADDR_REQ:
64222514Sdarrenr			printdlphysaddrreq(dlp);
64322514Sdarrenr			break;
64422514Sdarrenr
64522514Sdarrenr		case DL_PHYS_ADDR_ACK:
64622514Sdarrenr			printdlphysaddrack(dlp);
64722514Sdarrenr			break;
64822514Sdarrenr
64922514Sdarrenr		case DL_SET_PHYS_ADDR_REQ:
65022514Sdarrenr			printdlsetphysaddrreq(dlp);
65122514Sdarrenr			break;
65222514Sdarrenr
65322514Sdarrenr		default:
65422514Sdarrenr			err("printdlprim:  unknown primitive type 0x%x",
65522514Sdarrenr				dlp->dl_primitive);
65622514Sdarrenr			break;
65722514Sdarrenr	}
65822514Sdarrenr}
65922514Sdarrenr
66022514Sdarrenr/* ARGSUSED */
66122514Sdarrenrprintdlinforeq(dlp)
662255332Scy	union	DL_primitives	*dlp;
66322514Sdarrenr{
66422514Sdarrenr	(void) printf("DL_INFO_REQ\n");
66522514Sdarrenr}
66622514Sdarrenr
66722514Sdarrenrprintdlinfoack(dlp)
668255332Scy	union	DL_primitives	*dlp;
66922514Sdarrenr{
67022514Sdarrenr	u_char	addr[MAXDLADDR];
67122514Sdarrenr	u_char	brdcst[MAXDLADDR];
67222514Sdarrenr
67322514Sdarrenr	addrtostring(OFFADDR(dlp, dlp->info_ack.dl_addr_offset),
67422514Sdarrenr		dlp->info_ack.dl_addr_length, addr);
67522514Sdarrenr	addrtostring(OFFADDR(dlp, dlp->info_ack.dl_brdcst_addr_offset),
67622514Sdarrenr		dlp->info_ack.dl_brdcst_addr_length, brdcst);
67722514Sdarrenr
67822514Sdarrenr	(void) printf("DL_INFO_ACK:  max_sdu %d min_sdu %d\n",
67922514Sdarrenr		dlp->info_ack.dl_max_sdu,
68022514Sdarrenr		dlp->info_ack.dl_min_sdu);
68122514Sdarrenr	(void) printf("addr_length %d mac_type %s current_state %s\n",
68222514Sdarrenr		dlp->info_ack.dl_addr_length,
68322514Sdarrenr		dlmactype(dlp->info_ack.dl_mac_type),
68422514Sdarrenr		dlstate(dlp->info_ack.dl_current_state));
68522514Sdarrenr	(void) printf("sap_length %d service_mode %s qos_length %d\n",
68622514Sdarrenr		dlp->info_ack.dl_sap_length,
68722514Sdarrenr		dlservicemode(dlp->info_ack.dl_service_mode),
68822514Sdarrenr		dlp->info_ack.dl_qos_length);
68922514Sdarrenr	(void) printf("qos_offset %d qos_range_length %d qos_range_offset %d\n",
69022514Sdarrenr		dlp->info_ack.dl_qos_offset,
69122514Sdarrenr		dlp->info_ack.dl_qos_range_length,
69222514Sdarrenr		dlp->info_ack.dl_qos_range_offset);
69322514Sdarrenr	(void) printf("provider_style %s addr_offset %d version %d\n",
69422514Sdarrenr		dlstyle(dlp->info_ack.dl_provider_style),
69522514Sdarrenr		dlp->info_ack.dl_addr_offset,
69622514Sdarrenr		dlp->info_ack.dl_version);
69722514Sdarrenr	(void) printf("brdcst_addr_length %d brdcst_addr_offset %d\n",
69822514Sdarrenr		dlp->info_ack.dl_brdcst_addr_length,
69922514Sdarrenr		dlp->info_ack.dl_brdcst_addr_offset);
70022514Sdarrenr	(void) printf("addr %s\n", addr);
70122514Sdarrenr	(void) printf("brdcst_addr %s\n", brdcst);
70222514Sdarrenr}
70322514Sdarrenr
70422514Sdarrenrprintdlattachreq(dlp)
705255332Scy	union	DL_primitives	*dlp;
70622514Sdarrenr{
70722514Sdarrenr	(void) printf("DL_ATTACH_REQ:  ppa %d\n",
70822514Sdarrenr		dlp->attach_req.dl_ppa);
70922514Sdarrenr}
71022514Sdarrenr
71122514Sdarrenrprintdlokack(dlp)
712255332Scy	union	DL_primitives	*dlp;
71322514Sdarrenr{
71422514Sdarrenr	(void) printf("DL_OK_ACK:  correct_primitive %s\n",
71522514Sdarrenr		dlprim(dlp->ok_ack.dl_correct_primitive));
71622514Sdarrenr}
71722514Sdarrenr
71822514Sdarrenrprintdlerrorack(dlp)
719255332Scy	union	DL_primitives	*dlp;
72022514Sdarrenr{
721145510Sdarrenr	(void) printf("DL_ERROR_ACK:  error_primitive %s errno %s unix_errno %d: %s\n",
72222514Sdarrenr		dlprim(dlp->error_ack.dl_error_primitive),
72322514Sdarrenr		dlerrno(dlp->error_ack.dl_errno),
724145510Sdarrenr		dlp->error_ack.dl_unix_errno,
725145510Sdarrenr		strerror(dlp->error_ack.dl_unix_errno));
72622514Sdarrenr}
72722514Sdarrenr
72822514Sdarrenrprintdlenabmultireq(dlp)
729255332Scy	union	DL_primitives	*dlp;
73022514Sdarrenr{
73122514Sdarrenr	u_char	addr[MAXDLADDR];
73222514Sdarrenr
73322514Sdarrenr	addrtostring(OFFADDR(dlp, dlp->enabmulti_req.dl_addr_offset),
73422514Sdarrenr		dlp->enabmulti_req.dl_addr_length, addr);
73522514Sdarrenr
73622514Sdarrenr	(void) printf("DL_ENABMULTI_REQ:  addr_length %d addr_offset %d\n",
73722514Sdarrenr		dlp->enabmulti_req.dl_addr_length,
73822514Sdarrenr		dlp->enabmulti_req.dl_addr_offset);
73922514Sdarrenr	(void) printf("addr %s\n", addr);
74022514Sdarrenr}
74122514Sdarrenr
74222514Sdarrenrprintdldisabmultireq(dlp)
743255332Scy	union	DL_primitives	*dlp;
74422514Sdarrenr{
74522514Sdarrenr	u_char	addr[MAXDLADDR];
74622514Sdarrenr
74722514Sdarrenr	addrtostring(OFFADDR(dlp, dlp->disabmulti_req.dl_addr_offset),
74822514Sdarrenr		dlp->disabmulti_req.dl_addr_length, addr);
74922514Sdarrenr
75022514Sdarrenr	(void) printf("DL_DISABMULTI_REQ:  addr_length %d addr_offset %d\n",
75122514Sdarrenr		dlp->disabmulti_req.dl_addr_length,
75222514Sdarrenr		dlp->disabmulti_req.dl_addr_offset);
75322514Sdarrenr	(void) printf("addr %s\n", addr);
75422514Sdarrenr}
75522514Sdarrenr
75622514Sdarrenrprintdlpromisconreq(dlp)
757255332Scy	union	DL_primitives	*dlp;
75822514Sdarrenr{
75922514Sdarrenr	(void) printf("DL_PROMISCON_REQ:  level %s\n",
76022514Sdarrenr		dlpromisclevel(dlp->promiscon_req.dl_level));
76122514Sdarrenr}
76222514Sdarrenr
76322514Sdarrenrprintdlpromiscoffreq(dlp)
764255332Scy	union	DL_primitives	*dlp;
76522514Sdarrenr{
76622514Sdarrenr	(void) printf("DL_PROMISCOFF_REQ:  level %s\n",
76722514Sdarrenr		dlpromisclevel(dlp->promiscoff_req.dl_level));
76822514Sdarrenr}
76922514Sdarrenr
77022514Sdarrenrprintdlphysaddrreq(dlp)
771255332Scy	union	DL_primitives	*dlp;
77222514Sdarrenr{
77322514Sdarrenr	(void) printf("DL_PHYS_ADDR_REQ:  addr_type 0x%x\n",
77422514Sdarrenr		dlp->physaddr_req.dl_addr_type);
77522514Sdarrenr}
77622514Sdarrenr
77722514Sdarrenrprintdlphysaddrack(dlp)
778255332Scy	union	DL_primitives	*dlp;
77922514Sdarrenr{
78022514Sdarrenr	u_char	addr[MAXDLADDR];
78122514Sdarrenr
78222514Sdarrenr	addrtostring(OFFADDR(dlp, dlp->physaddr_ack.dl_addr_offset),
78322514Sdarrenr		dlp->physaddr_ack.dl_addr_length, addr);
78422514Sdarrenr
78522514Sdarrenr	(void) printf("DL_PHYS_ADDR_ACK:  addr_length %d addr_offset %d\n",
78622514Sdarrenr		dlp->physaddr_ack.dl_addr_length,
78722514Sdarrenr		dlp->physaddr_ack.dl_addr_offset);
78822514Sdarrenr	(void) printf("addr %s\n", addr);
78922514Sdarrenr}
79022514Sdarrenr
79122514Sdarrenrprintdlsetphysaddrreq(dlp)
792255332Scy	union	DL_primitives	*dlp;
79322514Sdarrenr{
79422514Sdarrenr	u_char	addr[MAXDLADDR];
79522514Sdarrenr
79622514Sdarrenr	addrtostring(OFFADDR(dlp, dlp->set_physaddr_req.dl_addr_offset),
79722514Sdarrenr		dlp->set_physaddr_req.dl_addr_length, addr);
79822514Sdarrenr
79922514Sdarrenr	(void) printf("DL_SET_PHYS_ADDR_REQ:  addr_length %d addr_offset %d\n",
80022514Sdarrenr		dlp->set_physaddr_req.dl_addr_length,
80122514Sdarrenr		dlp->set_physaddr_req.dl_addr_offset);
80222514Sdarrenr	(void) printf("addr %s\n", addr);
80322514Sdarrenr}
80422514Sdarrenr
80522514Sdarrenr/* ARGSUSED */
80622514Sdarrenrprintdldetachreq(dlp)
807255332Scy	union	DL_primitives	*dlp;
80822514Sdarrenr{
80922514Sdarrenr	(void) printf("DL_DETACH_REQ\n");
81022514Sdarrenr}
81122514Sdarrenr
81222514Sdarrenrprintdlbindreq(dlp)
813255332Scy	union	DL_primitives	*dlp;
81422514Sdarrenr{
81522514Sdarrenr	(void) printf("DL_BIND_REQ:  sap %d max_conind %d\n",
81622514Sdarrenr		dlp->bind_req.dl_sap,
81722514Sdarrenr		dlp->bind_req.dl_max_conind);
81822514Sdarrenr	(void) printf("service_mode %s conn_mgmt %d xidtest_flg 0x%x\n",
81922514Sdarrenr		dlservicemode(dlp->bind_req.dl_service_mode),
82022514Sdarrenr		dlp->bind_req.dl_conn_mgmt,
82122514Sdarrenr		dlp->bind_req.dl_xidtest_flg);
82222514Sdarrenr}
82322514Sdarrenr
82422514Sdarrenrprintdlbindack(dlp)
825255332Scy	union	DL_primitives	*dlp;
82622514Sdarrenr{
82722514Sdarrenr	u_char	addr[MAXDLADDR];
82822514Sdarrenr
82922514Sdarrenr	addrtostring(OFFADDR(dlp, dlp->bind_ack.dl_addr_offset),
83022514Sdarrenr		dlp->bind_ack.dl_addr_length, addr);
83122514Sdarrenr
83222514Sdarrenr	(void) printf("DL_BIND_ACK:  sap %d addr_length %d addr_offset %d\n",
83322514Sdarrenr		dlp->bind_ack.dl_sap,
83422514Sdarrenr		dlp->bind_ack.dl_addr_length,
83522514Sdarrenr		dlp->bind_ack.dl_addr_offset);
83622514Sdarrenr	(void) printf("max_conind %d xidtest_flg 0x%x\n",
83722514Sdarrenr		dlp->bind_ack.dl_max_conind,
83822514Sdarrenr		dlp->bind_ack.dl_xidtest_flg);
83922514Sdarrenr	(void) printf("addr %s\n", addr);
84022514Sdarrenr}
84122514Sdarrenr
84222514Sdarrenr/* ARGSUSED */
84322514Sdarrenrprintdlunbindreq(dlp)
844255332Scy	union	DL_primitives	*dlp;
84522514Sdarrenr{
84622514Sdarrenr	(void) printf("DL_UNBIND_REQ\n");
84722514Sdarrenr}
84822514Sdarrenr
84922514Sdarrenrprintdlsubsbindreq(dlp)
850255332Scy	union	DL_primitives	*dlp;
85122514Sdarrenr{
85222514Sdarrenr	u_char	sap[MAXDLADDR];
85322514Sdarrenr
85422514Sdarrenr	addrtostring(OFFADDR(dlp, dlp->subs_bind_req.dl_subs_sap_offset),
85522514Sdarrenr		dlp->subs_bind_req.dl_subs_sap_length, sap);
85622514Sdarrenr
85722514Sdarrenr	(void) printf("DL_SUBS_BIND_REQ:  subs_sap_offset %d sub_sap_len %d\n",
85822514Sdarrenr		dlp->subs_bind_req.dl_subs_sap_offset,
85922514Sdarrenr		dlp->subs_bind_req.dl_subs_sap_length);
86022514Sdarrenr	(void) printf("sap %s\n", sap);
86122514Sdarrenr}
86222514Sdarrenr
86322514Sdarrenrprintdlsubsbindack(dlp)
864255332Scy	union	DL_primitives	*dlp;
86522514Sdarrenr{
86622514Sdarrenr	u_char	sap[MAXDLADDR];
86722514Sdarrenr
86822514Sdarrenr	addrtostring(OFFADDR(dlp, dlp->subs_bind_ack.dl_subs_sap_offset),
86922514Sdarrenr		dlp->subs_bind_ack.dl_subs_sap_length, sap);
87022514Sdarrenr
87122514Sdarrenr	(void) printf("DL_SUBS_BIND_ACK:  subs_sap_offset %d sub_sap_length %d\n",
87222514Sdarrenr		dlp->subs_bind_ack.dl_subs_sap_offset,
87322514Sdarrenr		dlp->subs_bind_ack.dl_subs_sap_length);
87422514Sdarrenr	(void) printf("sap %s\n", sap);
87522514Sdarrenr}
87622514Sdarrenr
87722514Sdarrenrprintdlsubsunbindreq(dlp)
878255332Scy	union	DL_primitives	*dlp;
87922514Sdarrenr{
88022514Sdarrenr	u_char	sap[MAXDLADDR];
88122514Sdarrenr
88222514Sdarrenr	addrtostring(OFFADDR(dlp, dlp->subs_unbind_req.dl_subs_sap_offset),
88322514Sdarrenr		dlp->subs_unbind_req.dl_subs_sap_length, sap);
88422514Sdarrenr
88522514Sdarrenr	(void) printf("DL_SUBS_UNBIND_REQ:  subs_sap_offset %d sub_sap_length %d\n",
88622514Sdarrenr		dlp->subs_unbind_req.dl_subs_sap_offset,
88722514Sdarrenr		dlp->subs_unbind_req.dl_subs_sap_length);
88822514Sdarrenr	(void) printf("sap %s\n", sap);
88922514Sdarrenr}
89022514Sdarrenr
89122514Sdarrenrprintdlunitdatareq(dlp)
892255332Scy	union	DL_primitives	*dlp;
89322514Sdarrenr{
89422514Sdarrenr	u_char	addr[MAXDLADDR];
89522514Sdarrenr
89622514Sdarrenr	addrtostring(OFFADDR(dlp, dlp->unitdata_req.dl_dest_addr_offset),
89722514Sdarrenr		dlp->unitdata_req.dl_dest_addr_length, addr);
89822514Sdarrenr
89922514Sdarrenr	(void) printf("DL_UNITDATA_REQ:  dest_addr_length %d dest_addr_offset %d\n",
90022514Sdarrenr		dlp->unitdata_req.dl_dest_addr_length,
90122514Sdarrenr		dlp->unitdata_req.dl_dest_addr_offset);
90222514Sdarrenr	(void) printf("dl_priority.min %d dl_priority.max %d\n",
90322514Sdarrenr		dlp->unitdata_req.dl_priority.dl_min,
90422514Sdarrenr		dlp->unitdata_req.dl_priority.dl_max);
90522514Sdarrenr	(void) printf("addr %s\n", addr);
90622514Sdarrenr}
90722514Sdarrenr
90822514Sdarrenrprintdlunitdataind(dlp)
909255332Scy	union	DL_primitives	*dlp;
91022514Sdarrenr{
91122514Sdarrenr	u_char	dest[MAXDLADDR];
91222514Sdarrenr	u_char	src[MAXDLADDR];
91322514Sdarrenr
91422514Sdarrenr	addrtostring(OFFADDR(dlp, dlp->unitdata_ind.dl_dest_addr_offset),
91522514Sdarrenr		dlp->unitdata_ind.dl_dest_addr_length, dest);
91622514Sdarrenr	addrtostring(OFFADDR(dlp, dlp->unitdata_ind.dl_src_addr_offset),
91722514Sdarrenr		dlp->unitdata_ind.dl_src_addr_length, src);
91822514Sdarrenr
91922514Sdarrenr	(void) printf("DL_UNITDATA_IND:  dest_addr_length %d dest_addr_offset %d\n",
92022514Sdarrenr		dlp->unitdata_ind.dl_dest_addr_length,
92122514Sdarrenr		dlp->unitdata_ind.dl_dest_addr_offset);
92222514Sdarrenr	(void) printf("src_addr_length %d src_addr_offset %d\n",
92322514Sdarrenr		dlp->unitdata_ind.dl_src_addr_length,
92422514Sdarrenr		dlp->unitdata_ind.dl_src_addr_offset);
92522514Sdarrenr	(void) printf("group_address 0x%x\n",
92622514Sdarrenr		dlp->unitdata_ind.dl_group_address);
92722514Sdarrenr	(void) printf("dest %s\n", dest);
92822514Sdarrenr	(void) printf("src %s\n", src);
92922514Sdarrenr}
93022514Sdarrenr
93122514Sdarrenrprintdluderrorind(dlp)
932255332Scy	union	DL_primitives	*dlp;
93322514Sdarrenr{
93422514Sdarrenr	u_char	addr[MAXDLADDR];
93522514Sdarrenr
93622514Sdarrenr	addrtostring(OFFADDR(dlp, dlp->uderror_ind.dl_dest_addr_offset),
93722514Sdarrenr		dlp->uderror_ind.dl_dest_addr_length, addr);
93822514Sdarrenr
93922514Sdarrenr	(void) printf("DL_UDERROR_IND:  dest_addr_length %d dest_addr_offset %d\n",
94022514Sdarrenr		dlp->uderror_ind.dl_dest_addr_length,
94122514Sdarrenr		dlp->uderror_ind.dl_dest_addr_offset);
94222514Sdarrenr	(void) printf("unix_errno %d errno %s\n",
94322514Sdarrenr		dlp->uderror_ind.dl_unix_errno,
94422514Sdarrenr		dlerrno(dlp->uderror_ind.dl_errno));
94522514Sdarrenr	(void) printf("addr %s\n", addr);
94622514Sdarrenr}
94722514Sdarrenr
94822514Sdarrenrprintdltestreq(dlp)
949255332Scy	union	DL_primitives	*dlp;
95022514Sdarrenr{
95122514Sdarrenr	u_char	addr[MAXDLADDR];
95222514Sdarrenr
95322514Sdarrenr	addrtostring(OFFADDR(dlp, dlp->test_req.dl_dest_addr_offset),
95422514Sdarrenr		dlp->test_req.dl_dest_addr_length, addr);
95522514Sdarrenr
95622514Sdarrenr	(void) printf("DL_TEST_REQ:  flag 0x%x dest_addr_length %d dest_addr_offset %d\n",
95722514Sdarrenr		dlp->test_req.dl_flag,
95822514Sdarrenr		dlp->test_req.dl_dest_addr_length,
95922514Sdarrenr		dlp->test_req.dl_dest_addr_offset);
96022514Sdarrenr	(void) printf("dest_addr %s\n", addr);
96122514Sdarrenr}
96222514Sdarrenr
96322514Sdarrenrprintdltestind(dlp)
964255332Scy	union	DL_primitives	*dlp;
96522514Sdarrenr{
96622514Sdarrenr	u_char	dest[MAXDLADDR];
96722514Sdarrenr	u_char	src[MAXDLADDR];
96822514Sdarrenr
96922514Sdarrenr	addrtostring(OFFADDR(dlp, dlp->test_ind.dl_dest_addr_offset),
97022514Sdarrenr		dlp->test_ind.dl_dest_addr_length, dest);
97122514Sdarrenr	addrtostring(OFFADDR(dlp, dlp->test_ind.dl_src_addr_offset),
97222514Sdarrenr		dlp->test_ind.dl_src_addr_length, src);
97322514Sdarrenr
97422514Sdarrenr	(void) printf("DL_TEST_IND:  flag 0x%x dest_addr_length %d dest_addr_offset %d\n",
97522514Sdarrenr		dlp->test_ind.dl_flag,
97622514Sdarrenr		dlp->test_ind.dl_dest_addr_length,
97722514Sdarrenr		dlp->test_ind.dl_dest_addr_offset);
97822514Sdarrenr	(void) printf("src_addr_length %d src_addr_offset %d\n",
97922514Sdarrenr		dlp->test_ind.dl_src_addr_length,
98022514Sdarrenr		dlp->test_ind.dl_src_addr_offset);
98122514Sdarrenr	(void) printf("dest_addr %s\n", dest);
98222514Sdarrenr	(void) printf("src_addr %s\n", src);
98322514Sdarrenr}
98422514Sdarrenr
98522514Sdarrenrprintdltestres(dlp)
986255332Scy	union	DL_primitives	*dlp;
98722514Sdarrenr{
98822514Sdarrenr	u_char	dest[MAXDLADDR];
98922514Sdarrenr
99022514Sdarrenr	addrtostring(OFFADDR(dlp, dlp->test_res.dl_dest_addr_offset),
99122514Sdarrenr		dlp->test_res.dl_dest_addr_length, dest);
99222514Sdarrenr
99322514Sdarrenr	(void) printf("DL_TEST_RES:  flag 0x%x dest_addr_length %d dest_addr_offset %d\n",
99422514Sdarrenr		dlp->test_res.dl_flag,
99522514Sdarrenr		dlp->test_res.dl_dest_addr_length,
99622514Sdarrenr		dlp->test_res.dl_dest_addr_offset);
99722514Sdarrenr	(void) printf("dest_addr %s\n", dest);
99822514Sdarrenr}
99922514Sdarrenr
100022514Sdarrenrprintdltestcon(dlp)
1001255332Scy	union	DL_primitives	*dlp;
100222514Sdarrenr{
100322514Sdarrenr	u_char	dest[MAXDLADDR];
100422514Sdarrenr	u_char	src[MAXDLADDR];
100522514Sdarrenr
100622514Sdarrenr	addrtostring(OFFADDR(dlp, dlp->test_con.dl_dest_addr_offset),
100722514Sdarrenr		dlp->test_con.dl_dest_addr_length, dest);
100822514Sdarrenr	addrtostring(OFFADDR(dlp, dlp->test_con.dl_src_addr_offset),
100922514Sdarrenr		dlp->test_con.dl_src_addr_length, src);
101022514Sdarrenr
101122514Sdarrenr	(void) printf("DL_TEST_CON:  flag 0x%x dest_addr_length %d dest_addr_offset %d\n",
101222514Sdarrenr		dlp->test_con.dl_flag,
101322514Sdarrenr		dlp->test_con.dl_dest_addr_length,
101422514Sdarrenr		dlp->test_con.dl_dest_addr_offset);
101522514Sdarrenr	(void) printf("src_addr_length %d src_addr_offset %d\n",
101622514Sdarrenr		dlp->test_con.dl_src_addr_length,
101722514Sdarrenr		dlp->test_con.dl_src_addr_offset);
101822514Sdarrenr	(void) printf("dest_addr %s\n", dest);
101922514Sdarrenr	(void) printf("src_addr %s\n", src);
102022514Sdarrenr}
102122514Sdarrenr
102222514Sdarrenrprintdlxidreq(dlp)
1023255332Scy	union	DL_primitives	*dlp;
102422514Sdarrenr{
102522514Sdarrenr	u_char	dest[MAXDLADDR];
102622514Sdarrenr
102722514Sdarrenr	addrtostring(OFFADDR(dlp, dlp->xid_req.dl_dest_addr_offset),
102822514Sdarrenr		dlp->xid_req.dl_dest_addr_length, dest);
102922514Sdarrenr
103022514Sdarrenr	(void) printf("DL_XID_REQ:  flag 0x%x dest_addr_length %d dest_addr_offset %d\n",
103122514Sdarrenr		dlp->xid_req.dl_flag,
103222514Sdarrenr		dlp->xid_req.dl_dest_addr_length,
103322514Sdarrenr		dlp->xid_req.dl_dest_addr_offset);
103422514Sdarrenr	(void) printf("dest_addr %s\n", dest);
103522514Sdarrenr}
103622514Sdarrenr
103722514Sdarrenrprintdlxidind(dlp)
1038255332Scy	union	DL_primitives	*dlp;
103922514Sdarrenr{
104022514Sdarrenr	u_char	dest[MAXDLADDR];
104122514Sdarrenr	u_char	src[MAXDLADDR];
104222514Sdarrenr
104322514Sdarrenr	addrtostring(OFFADDR(dlp, dlp->xid_ind.dl_dest_addr_offset),
104422514Sdarrenr		dlp->xid_ind.dl_dest_addr_length, dest);
104522514Sdarrenr	addrtostring(OFFADDR(dlp, dlp->xid_ind.dl_src_addr_offset),
104622514Sdarrenr		dlp->xid_ind.dl_src_addr_length, src);
104722514Sdarrenr
104822514Sdarrenr	(void) printf("DL_XID_IND:  flag 0x%x dest_addr_length %d dest_addr_offset %d\n",
104922514Sdarrenr		dlp->xid_ind.dl_flag,
105022514Sdarrenr		dlp->xid_ind.dl_dest_addr_length,
105122514Sdarrenr		dlp->xid_ind.dl_dest_addr_offset);
105222514Sdarrenr	(void) printf("src_addr_length %d src_addr_offset %d\n",
105322514Sdarrenr		dlp->xid_ind.dl_src_addr_length,
105422514Sdarrenr		dlp->xid_ind.dl_src_addr_offset);
105522514Sdarrenr	(void) printf("dest_addr %s\n", dest);
105622514Sdarrenr	(void) printf("src_addr %s\n", src);
105722514Sdarrenr}
105822514Sdarrenr
105922514Sdarrenrprintdlxidres(dlp)
1060255332Scy	union	DL_primitives	*dlp;
106122514Sdarrenr{
106222514Sdarrenr	u_char	dest[MAXDLADDR];
106322514Sdarrenr
106422514Sdarrenr	addrtostring(OFFADDR(dlp, dlp->xid_res.dl_dest_addr_offset),
106522514Sdarrenr		dlp->xid_res.dl_dest_addr_length, dest);
106622514Sdarrenr
106722514Sdarrenr	(void) printf("DL_XID_RES:  flag 0x%x dest_addr_length %d dest_addr_offset %d\n",
106822514Sdarrenr		dlp->xid_res.dl_flag,
106922514Sdarrenr		dlp->xid_res.dl_dest_addr_length,
107022514Sdarrenr		dlp->xid_res.dl_dest_addr_offset);
107122514Sdarrenr	(void) printf("dest_addr %s\n", dest);
107222514Sdarrenr}
107322514Sdarrenr
107422514Sdarrenrprintdlxidcon(dlp)
1075255332Scy	union	DL_primitives	*dlp;
107622514Sdarrenr{
107722514Sdarrenr	u_char	dest[MAXDLADDR];
107822514Sdarrenr	u_char	src[MAXDLADDR];
107922514Sdarrenr
108022514Sdarrenr	addrtostring(OFFADDR(dlp, dlp->xid_con.dl_dest_addr_offset),
108122514Sdarrenr		dlp->xid_con.dl_dest_addr_length, dest);
108222514Sdarrenr	addrtostring(OFFADDR(dlp, dlp->xid_con.dl_src_addr_offset),
108322514Sdarrenr		dlp->xid_con.dl_src_addr_length, src);
108422514Sdarrenr
108522514Sdarrenr	(void) printf("DL_XID_CON:  flag 0x%x dest_addr_length %d dest_addr_offset %d\n",
108622514Sdarrenr		dlp->xid_con.dl_flag,
108722514Sdarrenr		dlp->xid_con.dl_dest_addr_length,
108822514Sdarrenr		dlp->xid_con.dl_dest_addr_offset);
108922514Sdarrenr	(void) printf("src_addr_length %d src_addr_offset %d\n",
109022514Sdarrenr		dlp->xid_con.dl_src_addr_length,
109122514Sdarrenr		dlp->xid_con.dl_src_addr_offset);
109222514Sdarrenr	(void) printf("dest_addr %s\n", dest);
109322514Sdarrenr	(void) printf("src_addr %s\n", src);
109422514Sdarrenr}
109522514Sdarrenr
109622514Sdarrenrprintdludqosreq(dlp)
1097255332Scy	union	DL_primitives	*dlp;
109822514Sdarrenr{
109922514Sdarrenr	(void) printf("DL_UDQOS_REQ:  qos_length %d qos_offset %d\n",
110022514Sdarrenr		dlp->udqos_req.dl_qos_length,
110122514Sdarrenr		dlp->udqos_req.dl_qos_offset);
110222514Sdarrenr}
110322514Sdarrenr
110422514Sdarrenr/*
110522514Sdarrenr * Return string.
110622514Sdarrenr */
110722514Sdarrenraddrtostring(addr, length, s)
1108255332Scy	u_char	*addr;
1109255332Scy	u_long	length;
1110255332Scy	u_char	*s;
111122514Sdarrenr{
111222514Sdarrenr	int	i;
111322514Sdarrenr
111422514Sdarrenr	for (i = 0; i < length; i++) {
111522514Sdarrenr		(void) sprintf((char*) s, "%x:", addr[i] & 0xff);
111622514Sdarrenr		s = s + strlen((char*)s);
111722514Sdarrenr	}
111822514Sdarrenr	if (length)
111922514Sdarrenr		*(--s) = '\0';
112022514Sdarrenr}
112122514Sdarrenr
112222514Sdarrenr/*
112322514Sdarrenr * Return length
112422514Sdarrenr */
112522514Sdarrenrstringtoaddr(sp, addr)
1126255332Scy	char	*sp;
1127255332Scy	char	*addr;
112822514Sdarrenr{
112922514Sdarrenr	int	n = 0;
113022514Sdarrenr	char	*p;
113122514Sdarrenr	int	val;
113222514Sdarrenr
113322514Sdarrenr	p = sp;
113422514Sdarrenr	while (p = strtok(p, ":")) {
113522514Sdarrenr		if (sscanf(p, "%x", &val) != 1)
113622514Sdarrenr			err("stringtoaddr:  invalid input string:  %s", sp);
113722514Sdarrenr		if (val > 0xff)
113822514Sdarrenr			err("stringtoaddr:  invalid input string:  %s", sp);
113922514Sdarrenr		*addr++ = val;
114022514Sdarrenr		n++;
114122514Sdarrenr		p = NULL;
114222514Sdarrenr	}
1143255332Scy
114422514Sdarrenr	return (n);
114522514Sdarrenr}
114622514Sdarrenr
114722514Sdarrenr
114822514Sdarrenrstatic char
114922514Sdarrenrhexnibble(c)
1150255332Scy	char	c;
115122514Sdarrenr{
115222514Sdarrenr	static	char	hextab[] = {
115322514Sdarrenr		'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
115422514Sdarrenr		'a', 'b', 'c', 'd', 'e', 'f'
115522514Sdarrenr	};
115622514Sdarrenr
115722514Sdarrenr	return (hextab[c & 0x0f]);
115822514Sdarrenr}
115922514Sdarrenr
116022514Sdarrenrchar*
116122514Sdarrenrdlprim(prim)
1162255332Scy	u_long	prim;
116322514Sdarrenr{
116422514Sdarrenr	static	char	primbuf[80];
116522514Sdarrenr
116622514Sdarrenr	switch ((int)prim) {
116722514Sdarrenr		CASERET(DL_INFO_REQ);
116822514Sdarrenr		CASERET(DL_INFO_ACK);
116922514Sdarrenr		CASERET(DL_ATTACH_REQ);
117022514Sdarrenr		CASERET(DL_DETACH_REQ);
117122514Sdarrenr		CASERET(DL_BIND_REQ);
117222514Sdarrenr		CASERET(DL_BIND_ACK);
117322514Sdarrenr		CASERET(DL_UNBIND_REQ);
117422514Sdarrenr		CASERET(DL_OK_ACK);
117522514Sdarrenr		CASERET(DL_ERROR_ACK);
117622514Sdarrenr		CASERET(DL_SUBS_BIND_REQ);
117722514Sdarrenr		CASERET(DL_SUBS_BIND_ACK);
117822514Sdarrenr		CASERET(DL_UNITDATA_REQ);
117922514Sdarrenr		CASERET(DL_UNITDATA_IND);
118022514Sdarrenr		CASERET(DL_UDERROR_IND);
118122514Sdarrenr		CASERET(DL_UDQOS_REQ);
118222514Sdarrenr		CASERET(DL_CONNECT_REQ);
118322514Sdarrenr		CASERET(DL_CONNECT_IND);
118422514Sdarrenr		CASERET(DL_CONNECT_RES);
118522514Sdarrenr		CASERET(DL_CONNECT_CON);
118622514Sdarrenr		CASERET(DL_TOKEN_REQ);
118722514Sdarrenr		CASERET(DL_TOKEN_ACK);
118822514Sdarrenr		CASERET(DL_DISCONNECT_REQ);
118922514Sdarrenr		CASERET(DL_DISCONNECT_IND);
119022514Sdarrenr		CASERET(DL_RESET_REQ);
119122514Sdarrenr		CASERET(DL_RESET_IND);
119222514Sdarrenr		CASERET(DL_RESET_RES);
119322514Sdarrenr		CASERET(DL_RESET_CON);
119422514Sdarrenr		default:
119522514Sdarrenr			(void) sprintf(primbuf, "unknown primitive 0x%x", prim);
119622514Sdarrenr			return (primbuf);
119722514Sdarrenr	}
119822514Sdarrenr}
119922514Sdarrenr
120022514Sdarrenr
120122514Sdarrenrchar*
120222514Sdarrenrdlstate(state)
1203255332Scy	u_long	state;
120422514Sdarrenr{
120522514Sdarrenr	static	char	statebuf[80];
120622514Sdarrenr
120722514Sdarrenr	switch (state) {
120822514Sdarrenr		CASERET(DL_UNATTACHED);
120922514Sdarrenr		CASERET(DL_ATTACH_PENDING);
121022514Sdarrenr		CASERET(DL_DETACH_PENDING);
121122514Sdarrenr		CASERET(DL_UNBOUND);
121222514Sdarrenr		CASERET(DL_BIND_PENDING);
121322514Sdarrenr		CASERET(DL_UNBIND_PENDING);
121422514Sdarrenr		CASERET(DL_IDLE);
121522514Sdarrenr		CASERET(DL_UDQOS_PENDING);
121622514Sdarrenr		CASERET(DL_OUTCON_PENDING);
121722514Sdarrenr		CASERET(DL_INCON_PENDING);
121822514Sdarrenr		CASERET(DL_CONN_RES_PENDING);
121922514Sdarrenr		CASERET(DL_DATAXFER);
122022514Sdarrenr		CASERET(DL_USER_RESET_PENDING);
122122514Sdarrenr		CASERET(DL_PROV_RESET_PENDING);
122222514Sdarrenr		CASERET(DL_RESET_RES_PENDING);
122322514Sdarrenr		CASERET(DL_DISCON8_PENDING);
122422514Sdarrenr		CASERET(DL_DISCON9_PENDING);
122522514Sdarrenr		CASERET(DL_DISCON11_PENDING);
122622514Sdarrenr		CASERET(DL_DISCON12_PENDING);
122722514Sdarrenr		CASERET(DL_DISCON13_PENDING);
122822514Sdarrenr		CASERET(DL_SUBS_BIND_PND);
122922514Sdarrenr		default:
123022514Sdarrenr			(void) sprintf(statebuf, "unknown state 0x%x", state);
123122514Sdarrenr			return (statebuf);
123222514Sdarrenr	}
123322514Sdarrenr}
123422514Sdarrenr
123522514Sdarrenrchar*
123622514Sdarrenrdlerrno(errno)
1237255332Scy	u_long	errno;
123822514Sdarrenr{
123922514Sdarrenr	static	char	errnobuf[80];
124022514Sdarrenr
124122514Sdarrenr	switch (errno) {
124222514Sdarrenr		CASERET(DL_ACCESS);
124322514Sdarrenr		CASERET(DL_BADADDR);
124422514Sdarrenr		CASERET(DL_BADCORR);
124522514Sdarrenr		CASERET(DL_BADDATA);
124622514Sdarrenr		CASERET(DL_BADPPA);
124722514Sdarrenr		CASERET(DL_BADPRIM);
124822514Sdarrenr		CASERET(DL_BADQOSPARAM);
124922514Sdarrenr		CASERET(DL_BADQOSTYPE);
125022514Sdarrenr		CASERET(DL_BADSAP);
125122514Sdarrenr		CASERET(DL_BADTOKEN);
125222514Sdarrenr		CASERET(DL_BOUND);
125322514Sdarrenr		CASERET(DL_INITFAILED);
125422514Sdarrenr		CASERET(DL_NOADDR);
125522514Sdarrenr		CASERET(DL_NOTINIT);
125622514Sdarrenr		CASERET(DL_OUTSTATE);
125722514Sdarrenr		CASERET(DL_SYSERR);
125822514Sdarrenr		CASERET(DL_UNSUPPORTED);
125922514Sdarrenr		CASERET(DL_UNDELIVERABLE);
126022514Sdarrenr		CASERET(DL_NOTSUPPORTED);
126122514Sdarrenr		CASERET(DL_TOOMANY);
126222514Sdarrenr		CASERET(DL_NOTENAB);
126322514Sdarrenr		CASERET(DL_BUSY);
126422514Sdarrenr		CASERET(DL_NOAUTO);
126522514Sdarrenr		CASERET(DL_NOXIDAUTO);
126622514Sdarrenr		CASERET(DL_NOTESTAUTO);
126722514Sdarrenr		CASERET(DL_XIDAUTO);
126822514Sdarrenr		CASERET(DL_TESTAUTO);
126922514Sdarrenr		CASERET(DL_PENDING);
127022514Sdarrenr
127122514Sdarrenr		default:
127222514Sdarrenr			(void) sprintf(errnobuf, "unknown dlpi errno 0x%x", errno);
127322514Sdarrenr			return (errnobuf);
127422514Sdarrenr	}
127522514Sdarrenr}
127622514Sdarrenr
127722514Sdarrenrchar*
127822514Sdarrenrdlpromisclevel(level)
1279255332Scy	u_long	level;
128022514Sdarrenr{
128122514Sdarrenr	static	char	levelbuf[80];
128222514Sdarrenr
128322514Sdarrenr	switch (level) {
128422514Sdarrenr		CASERET(DL_PROMISC_PHYS);
128522514Sdarrenr		CASERET(DL_PROMISC_SAP);
128622514Sdarrenr		CASERET(DL_PROMISC_MULTI);
128722514Sdarrenr		default:
128822514Sdarrenr			(void) sprintf(levelbuf, "unknown promisc level 0x%x", level);
128922514Sdarrenr			return (levelbuf);
129022514Sdarrenr	}
129122514Sdarrenr}
129222514Sdarrenr
129322514Sdarrenrchar*
129422514Sdarrenrdlservicemode(servicemode)
1295255332Scy	u_long	servicemode;
129622514Sdarrenr{
129722514Sdarrenr	static	char	servicemodebuf[80];
129822514Sdarrenr
129922514Sdarrenr	switch (servicemode) {
130022514Sdarrenr		CASERET(DL_CODLS);
130122514Sdarrenr		CASERET(DL_CLDLS);
130222514Sdarrenr		CASERET(DL_CODLS|DL_CLDLS);
130322514Sdarrenr		default:
130422514Sdarrenr			(void) sprintf(servicemodebuf,
130522514Sdarrenr				"unknown provider service mode 0x%x", servicemode);
130622514Sdarrenr			return (servicemodebuf);
130722514Sdarrenr	}
130822514Sdarrenr}
130922514Sdarrenr
131022514Sdarrenrchar*
131122514Sdarrenrdlstyle(style)
1312255332Scy	long	style;
131322514Sdarrenr{
131422514Sdarrenr	static	char	stylebuf[80];
131522514Sdarrenr
131622514Sdarrenr	switch (style) {
131722514Sdarrenr		CASERET(DL_STYLE1);
131822514Sdarrenr		CASERET(DL_STYLE2);
131922514Sdarrenr		default:
132022514Sdarrenr			(void) sprintf(stylebuf, "unknown provider style 0x%x", style);
132122514Sdarrenr			return (stylebuf);
132222514Sdarrenr	}
132322514Sdarrenr}
132422514Sdarrenr
132522514Sdarrenrchar*
132622514Sdarrenrdlmactype(media)
1327255332Scy	u_long	media;
132822514Sdarrenr{
132922514Sdarrenr	static	char	mediabuf[80];
133022514Sdarrenr
133122514Sdarrenr	switch (media) {
133222514Sdarrenr		CASERET(DL_CSMACD);
133322514Sdarrenr		CASERET(DL_TPB);
133422514Sdarrenr		CASERET(DL_TPR);
133522514Sdarrenr		CASERET(DL_METRO);
133622514Sdarrenr		CASERET(DL_ETHER);
133722514Sdarrenr		CASERET(DL_HDLC);
133822514Sdarrenr		CASERET(DL_CHAR);
133922514Sdarrenr		CASERET(DL_CTCA);
134022514Sdarrenr		default:
134122514Sdarrenr			(void) sprintf(mediabuf, "unknown media type 0x%x", media);
134222514Sdarrenr			return (mediabuf);
134322514Sdarrenr	}
134422514Sdarrenr}
134522514Sdarrenr
134622514Sdarrenr/*VARARGS1*/
134722514Sdarrenrerr(fmt, a1, a2, a3, a4)
1348255332Scy	char	*fmt;
1349255332Scy	char	*a1, *a2, *a3, *a4;
135022514Sdarrenr{
135122514Sdarrenr	(void) fprintf(stderr, fmt, a1, a2, a3, a4);
135222514Sdarrenr	(void) fprintf(stderr, "\n");
135322514Sdarrenr	(void) exit(1);
135422514Sdarrenr}
135522514Sdarrenr
135622514Sdarrenrsyserr(s)
1357255332Scy	char	*s;
135822514Sdarrenr{
135922514Sdarrenr	(void) perror(s);
136022514Sdarrenr	exit(1);
136122514Sdarrenr}
136222514Sdarrenr
136322514Sdarrenrstrioctl(fd, cmd, timout, len, dp)
1364255332Scy	int	fd;
1365255332Scy	int	cmd;
1366255332Scy	int	timout;
1367255332Scy	int	len;
1368255332Scy	char	*dp;
136922514Sdarrenr{
137022514Sdarrenr	struct	strioctl	sioc;
137122514Sdarrenr	int	rc;
137222514Sdarrenr
137322514Sdarrenr	sioc.ic_cmd = cmd;
137422514Sdarrenr	sioc.ic_timout = timout;
137522514Sdarrenr	sioc.ic_len = len;
137622514Sdarrenr	sioc.ic_dp = dp;
137722514Sdarrenr	rc = ioctl(fd, I_STR, &sioc);
137822514Sdarrenr
137922514Sdarrenr	if (rc < 0)
138022514Sdarrenr		return (rc);
138122514Sdarrenr	else
138222514Sdarrenr		return (sioc.ic_len);
138322514Sdarrenr}
1384