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