Lines Matching +full:smi +full:- +full:based
47 # (W-7405-ENG-36) by Los Alamos National Laboratory, which is
63 #include "netdissect-stdinc.h"
70 #include <smi.h>
73 #include "netdissect-ctype.h"
83 * (we only care about the tag values for those allowed in the Internet SMI)
86 "U-0",
98 "U-8","U-9","U-10","U-11", /* 8-11 */
99 "U-12","U-13","U-14","U-15", /* 12-15 */
106 * Application-wide ASN.1 types from the Internet SMI and their tags
119 "C-5",
125 * Context-specific ASN.1 types for the SNMP PDUs and their tags
155 * Context-specific ASN.1 types for the SNMP Exceptions and their tags
168 * The Internet SMI does not specify any
171 "P-0"
175 * error-status values for any SNMP PDU
204 * generic-trap values in the SNMP Trap-PDU
226 #define defineCLASS(x) { "x", x, sizeof(x)/sizeof(x[0]) } /* not ANSI-C */
255 * A structure for the OID tree for the compiled-in MIB.
256 * This is stored as a general-order tree.
260 u_char oid; /* sub-id following parent */
267 * RFC-1156 format files into "makemib". "mib.h" MUST define at least
330 if ((o) == objp->oid) \
332 } while ((objp = objp->next) != NULL); \
335 ND_PRINT(suppressdot?"%s":".%s", objp->desc); \
336 objp = objp->child; \
342 * This is the definition for the Any-Data-Type storage used purely for
413 * (and of real-length "len") and stores the intermediate data in the
416 * This returns -l if it fails (i.e., the ASN.1 stream is not valid).
426 elem->asnlen = 0;
427 elem->type = BE_ANY;
430 return -1;
435 * +---+---+---+---+---+---+---+---+
437 * +---+---+---+---+---+---+---+---+
440 id = GET_U_1(p) & ASN_ID_BITS; /* lower 5 bits, range 00-1f */
443 class = form >> 1; /* bits 7&6 -> bits 1&0, range 0-3 */
444 form &= 0x1; /* bit 5 -> bit 0, range 0-1 */
449 elem->form = form;
450 elem->class = class;
451 elem->id = id;
452 p++; len--; hdr = 1;
462 * bit set. XXX - this doesn't handle a value
469 return -1;
472 len--;
478 return -1;
480 elem->id = id = (id << 7) | GET_U_1(p);
481 --len;
487 return -1;
489 elem->asnlen = GET_U_1(p);
490 p++; len--; hdr++;
491 if (elem->asnlen & ASN_BIT8) {
492 uint32_t noct = elem->asnlen % ASN_BIT8;
493 elem->asnlen = 0;
496 return -1;
499 for (; noct != 0; len--, hdr++, noct--) {
500 elem->asnlen = (elem->asnlen << ASN_SHIFT8) | GET_U_1(p);
504 if (len < elem->asnlen) {
505 ND_PRINT("[len%d<asnlen%u]", len, elem->asnlen);
506 return -1;
510 return -1;
514 return -1;
518 return -1;
520 ND_TCHECK_LEN(p, elem->asnlen);
528 elem->type = BE_STR;
529 elem->data.str = p;
534 elem->type = BE_INT;
537 if (elem->asnlen == 0) {
539 return -1;
543 for (i = elem->asnlen; i != 0; p++, i--)
545 elem->data.integer = data;
550 elem->type = BE_OID;
551 elem->data.raw = (const uint8_t *)p;
555 elem->type = BE_NULL;
556 elem->data.raw = NULL;
560 elem->type = BE_OCTET;
561 elem->data.raw = (const uint8_t *)p;
570 elem->type = BE_INETADDR;
571 elem->data.raw = (const uint8_t *)p;
578 elem->type = BE_UNS;
580 for (i = elem->asnlen; i != 0; p++, i--)
582 elem->data.uns = data;
588 elem->type = BE_UNS64;
590 for (i = elem->asnlen; i != 0; p++, i--)
592 elem->data.uns64 = data64;
597 elem->type = BE_OCTET;
598 elem->data.raw = (const uint8_t *)p;
608 elem->type = BE_NOSUCHOBJECT;
609 elem->data.raw = NULL;
613 elem->type = BE_NOSUCHINST;
614 elem->data.raw = NULL;
618 elem->type = BE_ENDOFMIBVIEW;
619 elem->data.raw = NULL;
626 elem->type = BE_OCTET;
627 elem->data.raw = (const uint8_t *)p;
637 elem->type = BE_SEQ;
638 elem->data.raw = (const uint8_t *)p;
642 elem->type = BE_OCTET;
643 elem->data.raw = (const uint8_t *)p;
650 elem->type = BE_PDU;
651 elem->data.raw = (const uint8_t *)p;
655 elem->type = BE_OCTET;
656 elem->data.raw = (const uint8_t *)p;
662 p += elem->asnlen;
663 len -= elem->asnlen;
664 return elem->asnlen + hdr;
668 return -1;
674 const u_char *p = (const u_char *)elem->data.raw;
675 uint32_t asnlen = elem->asnlen;
679 for (i = asnlen; i != 0; p++, i--)
685 return -1;
693 uint32_t asnlen = elem->asnlen;
696 p = elem->data.str;
698 for (i = asnlen; printable && i != 0; p++, i--)
700 p = elem->data.str;
703 if (nd_printn(ndo, p, asnlen, ndo->ndo_snapend)) {
709 for (i = asnlen; i != 0; p++, i--) {
718 return -1;
731 uint32_t asnlen = elem->asnlen;
734 switch (elem->type) {
737 if (asn1_print_octets(ndo, elem) == -1)
738 return -1;
745 int first = -1;
748 p = (const u_char *)elem->data.raw;
750 if (!ndo->ndo_nflag && asnlen > 2) {
752 for (; a->node; a++) {
753 if (i < a->oid_len)
755 if (!ND_TTEST_LEN(p, a->oid_len))
757 if (memcmp(a->oid, p, a->oid_len) == 0) {
758 objp = a->node->child;
759 i -= a->oid_len;
760 p += a->oid_len;
761 ND_PRINT("%s", a->prefix);
768 for (; i != 0; p++, i--) {
780 if (!ndo->ndo_nflag)
786 o -= s * OIDMUX;
789 if (--first < 0)
797 ND_PRINT("%d", elem->data.integer);
801 ND_PRINT("%u", elem->data.uns);
805 ND_PRINT("%" PRIu64, elem->data.uns64);
809 if (asn1_print_string(ndo, elem) == -1)
810 return -1;
814 ND_PRINT("Seq(%u)", elem->asnlen);
820 p = (const u_char *)elem->data.raw;
822 for (i = asnlen; i != 0; p++, i--) {
830 ND_PRINT("[%s]", Class[EXCEPTIONS].Id[elem->id]);
834 ND_PRINT("%s(%u)", Class[CONTEXT].Id[elem->id], elem->asnlen);
849 return -1;
858 * Rose-Normal-Form.
879 length -= i;
914 const u_char *p = (const u_char *)elem->data.raw;
915 uint32_t asnlen = elem->asnlen;
917 int o = 0, first = -1;
920 for (*oidlen = 0; i != 0; p++, i--) {
933 o -= firstval * OIDMUX;
964 switch (smiType->basetype) {
967 if (smiRange->minValue.value.unsigned32
968 == smiRange->maxValue.value.unsigned32) {
969 ok = (elem->asnlen == smiRange->minValue.value.unsigned32);
971 ok = (elem->asnlen >= smiRange->minValue.value.unsigned32
972 && elem->asnlen <= smiRange->maxValue.value.unsigned32);
977 ok = (elem->data.integer >= smiRange->minValue.value.integer32
978 && elem->data.integer <= smiRange->maxValue.value.integer32);
982 ok = (elem->data.uns >= smiRange->minValue.value.unsigned32
983 && elem->data.uns <= smiRange->maxValue.value.unsigned32);
1057 if (ndo->ndo_vflag) {
1058 ND_PRINT("%s::", smiGetNodeModule(smiNode)->name);
1060 ND_PRINT("%s", smiNode->name);
1061 if (smiNode->oidlen < oidlen) {
1062 for (i = smiNode->oidlen; i < oidlen; i++) {
1079 if (! smiNode || ! (smiNode->nodekind
1084 if (elem->type == BE_NOSUCHOBJECT
1085 || elem->type == BE_NOSUCHINST
1086 || elem->type == BE_ENDOFMIBVIEW) {
1090 if (NOTIFY_CLASS(pduid) && smiNode->access < SMI_ACCESS_NOTIFY) {
1094 if (READ_CLASS(pduid) && smiNode->access < SMI_ACCESS_READ_ONLY) {
1098 if (WRITE_CLASS(pduid) && smiNode->access < SMI_ACCESS_READ_WRITE) {
1103 && smiNode->access == SMI_ACCESS_NOT_ACCESSIBLE) {
1112 if (! smi_check_type(smiType->basetype, elem->type)) {
1128 switch (elem->type) {
1130 if (smiType->basetype == SMI_BASETYPE_BITS) {
1139 if (ndo->ndo_vflag) {
1140 ND_PRINT("%s::", smiGetNodeModule(smiNode)->name);
1142 ND_PRINT("%s", smiNode->name);
1143 if (smiNode->oidlen < oidlen) {
1144 for (i = smiNode->oidlen;
1156 if (smiType->basetype == SMI_BASETYPE_ENUM) {
1160 if (nn->value.value.integer32
1161 == elem->data.integer) {
1162 ND_PRINT("%s", nn->name);
1163 ND_PRINT("(%d)", elem->data.integer);
1182 * version INTEGER {version-1(0)},
1184 * data ANY -- PDUs
1188 * request-id INTEGER,
1189 * error-status INTEGER,
1190 * error-index INTEGER,
1200 * agent-addr NetworkAddress,
1201 * generic-trap INTEGER,
1202 * specific-trap INTEGER,
1203 * time-stamp TimeTicks,
1235 ND_PRINT("[%d extra after SEQ of varbind]", length - count);
1255 vblength = length - count;
1275 length -= count;
1327 if (ndo->ndo_vflag)
1329 length -= count;
1354 length -= count;
1379 length -= count;
1407 length -= count;
1412 /* agent-addr (inetaddr) */
1416 ND_PRINT("[agent-addr!=INETADDR]");
1422 length -= count;
1425 /* generic-trap (Integer) */
1429 ND_PRINT("[generic-trap!=INT]");
1438 length -= count;
1441 /* specific-trap (Integer) */
1445 ND_PRINT("[specific-trap!=INT]");
1451 ND_PRINT("[specific-trap(%d)!=0]", elem.data.integer);
1454 length -= count;
1459 /* time-stamp (TimeTicks) */
1463 ND_PRINT("[time-stamp!=TIMETICKS]");
1469 length -= count;
1493 ND_PRINT("[%d extra after PDU]", length - count);
1494 if (ndo->ndo_vflag) {
1532 if (ndo->ndo_vflag) {
1566 length -= count;
1570 if (asn1_print_octets(ndo, &elem) == -1)
1582 length -= count;
1586 if (asn1_print_string(ndo, &elem) == -1)
1612 if (!(elem.asnlen == sizeof(DEF_COMMUNITY) - 1 &&
1614 sizeof(DEF_COMMUNITY) - 1) == 0)) {
1617 if (asn1_print_string(ndo, &elem) == -1)
1621 length -= count;
1628 * Decode SNMPv3 User-based Security Message Header (SNMPv3)
1656 length -= count;
1667 if (ndo->ndo_vflag)
1669 length -= count;
1680 if (ndo->ndo_vflag)
1682 length -= count;
1693 length -= count;
1697 if (asn1_print_string(ndo, &elem) == -1)
1709 length -= count;
1720 length -= count;
1724 ND_PRINT("[%d extra after usm SEQ]", length - count);
1752 if (ndo->ndo_vflag) {
1764 length -= count;
1775 length -= count;
1796 length -= count;
1813 length -= count;
1817 ND_PRINT("[%d extra after message SEQ]", length - count);
1819 if (ndo->ndo_vflag) {
1824 if (ndo->ndo_vflag) {
1832 np = xnp + (np - xnp);
1833 length = xlength - (np - xnp);
1843 length -= count;
1848 if (ndo->ndo_vflag) {
1853 if (ndo->ndo_vflag) {
1859 if (ndo->ndo_vflag) {
1875 ndo->ndo_protocol = "snmp";
1887 ND_PRINT("[%d extra after iSEQ]", length - count);
1905 if (ndo->ndo_vflag)
1913 length -= count;
1929 if (ndo->ndo_vflag) {