dlcommon.c 29 KB

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