Annotation of embedaddon/iftop/dlcommon.c, revision 1.1.1.1

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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>