#endif
#include "netdissect.h"
+#include "extract.h"
#undef OPAQUE /* defined in <wingdi.h> */
ND_PRINT((ndo, "[nothing to parse]"));
return -1;
}
- ND_TCHECK(*p);
+ ND_TCHECK_1(p);
/*
* it would be nice to use a bit field, but you can't depend on them.
* +---+---+---+---+---+---+---+---+
* 7 6 5 4 3 2 1 0
*/
- id = *p & ASN_ID_BITS; /* lower 5 bits, range 00-1f */
+ id = EXTRACT_U_1(p) & ASN_ID_BITS; /* lower 5 bits, range 00-1f */
#ifdef notdef
- form = (*p & 0xe0) >> 5; /* move upper 3 bits to lower 3 */
+ form = (EXTRACT_U_1(p) & 0xe0) >> 5; /* move upper 3 bits to lower 3 */
class = form >> 1; /* bits 7&6 -> bits 1&0, range 0-3 */
form &= 0x1; /* bit 5 -> bit 0, range 0-1 */
#else
- form = (u_char)(*p & ASN_FORM_BITS) >> ASN_FORM_SHIFT;
- class = (u_char)(*p & ASN_CLASS_BITS) >> ASN_CLASS_SHIFT;
+ form = (u_char)(EXTRACT_U_1(p) & ASN_FORM_BITS) >> ASN_FORM_SHIFT;
+ class = (u_char)(EXTRACT_U_1(p) & ASN_CLASS_BITS) >> ASN_CLASS_SHIFT;
#endif
elem->form = form;
elem->class = class;
* that won't fit in 32 bits.
*/
id = 0;
- ND_TCHECK(*p);
- while (*p & ASN_BIT8) {
+ ND_TCHECK_1(p);
+ while (EXTRACT_U_1(p) & ASN_BIT8) {
if (len < 1) {
ND_PRINT((ndo, "[Xtagfield?]"));
return -1;
}
- id = (id << 7) | (*p & ~ASN_BIT8);
+ id = (id << 7) | (EXTRACT_U_1(p) & ~ASN_BIT8);
len--;
hdr++;
p++;
- ND_TCHECK(*p);
+ ND_TCHECK_1(p);
}
if (len < 1) {
ND_PRINT((ndo, "[Xtagfield?]"));
return -1;
}
- ND_TCHECK(*p);
- elem->id = id = (id << 7) | *p;
+ ND_TCHECK_1(p);
+ elem->id = id = (id << 7) | EXTRACT_U_1(p);
--len;
++hdr;
++p;
ND_PRINT((ndo, "[no asnlen]"));
return -1;
}
- ND_TCHECK(*p);
- elem->asnlen = *p;
+ ND_TCHECK_1(p);
+ elem->asnlen = EXTRACT_U_1(p);
p++; len--; hdr++;
if (elem->asnlen & ASN_BIT8) {
uint32_t noct = elem->asnlen % ASN_BIT8;
return -1;
}
ND_TCHECK2(*p, noct);
- for (; noct-- > 0; len--, hdr++)
- elem->asnlen = (elem->asnlen << ASN_SHIFT8) | *p++;
+ for (; noct-- > 0; len--, hdr++) {
+ elem->asnlen = (elem->asnlen << ASN_SHIFT8) | EXTRACT_U_1(p);
+ p++;
+ }
}
if (len < elem->asnlen) {
ND_PRINT((ndo, "[len%d<asnlen%u]", len, elem->asnlen));
ND_PRINT((ndo, "[id?%c/%s/%d]", *Form[form], Class[class].name, id));
return -1;
}
+ ND_TCHECK2(*p, elem->asnlen);
switch (form) {
case PRIMITIVE:
ND_PRINT((ndo, "[asnlen=0]"));
return -1;
}
- ND_TCHECK2(*p, elem->asnlen);
- if (*p & ASN_BIT8) /* negative */
+ if (EXTRACT_U_1(p) & ASN_BIT8) /* negative */
data = -1;
for (i = elem->asnlen; i-- > 0; p++)
- data = (data << ASN_SHIFT8) | *p;
+ data = (data << ASN_SHIFT8) | EXTRACT_U_1(p);
elem->data.integer = data;
break;
}
case GAUGE:
case TIMETICKS: {
register uint32_t data;
- ND_TCHECK2(*p, elem->asnlen);
elem->type = BE_UNS;
data = 0;
for (i = elem->asnlen; i-- > 0; p++)
- data = (data << 8) + *p;
+ data = (data << 8) + EXTRACT_U_1(p);
elem->data.uns = data;
break;
}
case COUNTER64: {
register uint64_t data64;
- ND_TCHECK2(*p, elem->asnlen);
elem->type = BE_UNS64;
data64 = 0;
for (i = elem->asnlen; i-- > 0; p++)
- data64 = (data64 << 8) + *p;
+ data64 = (data64 << 8) + EXTRACT_U_1(p);
elem->data.uns64 = data64;
break;
}
default:
ND_PRINT((ndo, "[P/%s/%s]", Class[class].name, Class[class].Id[id]));
- ND_TCHECK2(*p, elem->asnlen);
elem->type = BE_OCTET;
elem->data.raw = (const uint8_t *)p;
break;
ND_TCHECK2(*p, asnlen);
for (i = asnlen; i-- > 0; p++)
- ND_PRINT((ndo, "_%.2x", *p));
+ ND_PRINT((ndo, "_%.2x", EXTRACT_U_1(p)));
return 0;
trunc:
p = elem->data.str;
ND_TCHECK2(*p, asnlen);
for (i = asnlen; printable && i-- > 0; p++)
- printable = ND_ISPRINT(*p);
+ printable = ND_ISPRINT(EXTRACT_U_1(p));
p = elem->data.str;
if (printable) {
ND_PRINT((ndo, "\""));
ND_PRINT((ndo, "\""));
} else {
for (i = asnlen; i-- > 0; p++) {
- ND_PRINT((ndo, first ? "%.2x" : "_%.2x", *p));
+ ND_PRINT((ndo, first ? "%.2x" : "_%.2x", EXTRACT_U_1(p)));
first = 0;
}
}
p = (const u_char *)elem->data.raw;
i = asnlen;
- if (!nd_smi_module_loaded) {
- if (!ndo->ndo_nflag && asnlen > 2) {
- const struct obj_abrev *a = &obj_abrev_list[0];
- for (; a->node; a++) {
- if (i < a->oid_len)
- continue;
- if (!ND_TTEST2(*p, a->oid_len))
- continue;
- if (memcmp(a->oid, p, a->oid_len) == 0) {
- objp = a->node->child;
- i -= a->oid_len;
- p += a->oid_len;
- ND_PRINT((ndo, "%s", a->prefix));
- first = 1;
- break;
- }
+ if (!ndo->ndo_nflag && asnlen > 2) {
+ const struct obj_abrev *a = &obj_abrev_list[0];
+ for (; a->node; a++) {
+ if (i < a->oid_len)
+ continue;
+ if (!ND_TTEST2(*p, a->oid_len))
+ continue;
+ if (memcmp(a->oid, p, a->oid_len) == 0) {
+ objp = a->node->child;
+ i -= a->oid_len;
+ p += a->oid_len;
+ ND_PRINT((ndo, "%s", a->prefix));
+ first = 1;
+ break;
}
}
+ }
- for (; i-- > 0; p++) {
- ND_TCHECK(*p);
- o = (o << ASN_SHIFT7) + (*p & ~ASN_BIT8);
- if (*p & ASN_LONGLEN)
- continue;
-
- /*
- * first subitem encodes two items with
- * 1st*OIDMUX+2nd
- * (see X.690:1997 clause 8.19 for the details)
- */
- if (first < 0) {
- int s;
- if (!ndo->ndo_nflag)
- objp = mibroot;
- first = 0;
- s = o / OIDMUX;
- if (s > 2) s = 2;
- OBJ_PRINT(s, first);
- o -= s * OIDMUX;
- }
- OBJ_PRINT(o, first);
- if (--first < 0)
- first = 0;
- o = 0;
+ for (; i-- > 0; p++) {
+ ND_TCHECK_1(p);
+ o = (o << ASN_SHIFT7) + (EXTRACT_U_1(p) & ~ASN_BIT8);
+ if (EXTRACT_U_1(p) & ASN_LONGLEN)
+ continue;
+
+ /*
+ * first subitem encodes two items with
+ * 1st*OIDMUX+2nd
+ * (see X.690:1997 clause 8.19 for the details)
+ */
+ if (first < 0) {
+ int s;
+ if (!ndo->ndo_nflag)
+ objp = mibroot;
+ first = 0;
+ s = o / OIDMUX;
+ if (s > 2) s = 2;
+ OBJ_PRINT(s, first);
+ o -= s * OIDMUX;
}
+ OBJ_PRINT(o, first);
+ if (--first < 0)
+ first = 0;
+ o = 0;
}
break;
}
p = (const u_char *)elem->data.raw;
ND_TCHECK2(*p, asnlen);
for (i = asnlen; i-- != 0; p++) {
- ND_PRINT((ndo, (i == asnlen-1) ? "%u" : ".%u", *p));
+ ND_PRINT((ndo, (i == asnlen-1) ? "%u" : ".%u", EXTRACT_U_1(p)));
}
break;
int o = 0, first = -1, i = asnlen;
unsigned int firstval;
- if (nd_smi_module_loaded) {
- for (*oidlen = 0; i-- > 0; p++) {
- ND_TCHECK(*p);
- o = (o << ASN_SHIFT7) + (*p & ~ASN_BIT8);
- if (*p & ASN_LONGLEN)
- continue;
+ for (*oidlen = 0; i-- > 0; p++) {
+ ND_TCHECK_1(p);
+ o = (o << ASN_SHIFT7) + (EXTRACT_U_1(p) & ~ASN_BIT8);
+ if (EXTRACT_U_1(p) & ASN_LONGLEN)
+ continue;
- /*
- * first subitem encodes two items with 1st*OIDMUX+2nd
- * (see X.690:1997 clause 8.19 for the details)
- */
- if (first < 0) {
- first = 0;
- firstval = o / OIDMUX;
- if (firstval > 2) firstval = 2;
- o -= firstval * OIDMUX;
- if (*oidlen < oidsize) {
- oid[(*oidlen)++] = firstval;
- }
- }
+ /*
+ * first subitem encodes two items with 1st*OIDMUX+2nd
+ * (see X.690:1997 clause 8.19 for the details)
+ */
+ if (first < 0) {
+ first = 0;
+ firstval = o / OIDMUX;
+ if (firstval > 2) firstval = 2;
+ o -= firstval * OIDMUX;
if (*oidlen < oidsize) {
- oid[(*oidlen)++] = o;
+ oid[(*oidlen)++] = firstval;
}
- o = 0;
}
+ if (*oidlen < oidsize) {
+ oid[(*oidlen)++] = o;
+ }
+ o = 0;
}
return 0;
SmiNode *smiNode = NULL;
unsigned int i;
+ if (!nd_smi_module_loaded) {
+ *status = asn1_print(ndo, elem);
+ return NULL;
+ }
*status = smi_decode_oid(ndo, elem, oid, sizeof(oid) / sizeof(unsigned int),
&oidlen);
if (*status < 0)
if (smiType->basetype == SMI_BASETYPE_BITS) {
/* print bit labels */
} else {
- smi_decode_oid(ndo, elem, oid,
- sizeof(oid)/sizeof(unsigned int),
- &oidlen);
- smiNode = smiGetNodeByOID(oidlen, oid);
- if (smiNode) {
- if (ndo->ndo_vflag) {
- ND_PRINT((ndo, "%s::", smiGetNodeModule(smiNode)->name));
- }
- ND_PRINT((ndo, "%s", smiNode->name));
- if (smiNode->oidlen < oidlen) {
- for (i = smiNode->oidlen;
- i < oidlen; i++) {
- ND_PRINT((ndo, ".%u", oid[i]));
+ if (nd_smi_module_loaded &&
+ smi_decode_oid(ndo, elem, oid,
+ sizeof(oid)/sizeof(unsigned int),
+ &oidlen) == 0) {
+ smiNode = smiGetNodeByOID(oidlen, oid);
+ if (smiNode) {
+ if (ndo->ndo_vflag) {
+ ND_PRINT((ndo, "%s::", smiGetNodeModule(smiNode)->name));
+ }
+ ND_PRINT((ndo, "%s", smiNode->name));
+ if (smiNode->oidlen < oidlen) {
+ for (i = smiNode->oidlen;
+ i < oidlen; i++) {
+ ND_PRINT((ndo, ".%u", oid[i]));
+ }
}
+ done++;
}
- done++;
}
}
break;
ND_PRINT((ndo, "[msgFlags size %d]", elem.asnlen));
return;
}
- flags = elem.data.str[0];
+ flags = EXTRACT_U_1(elem.data.str);
if (flags != 0x00 && flags != 0x01 && flags != 0x03
&& flags != 0x04 && flags != 0x05 && flags != 0x07) {
ND_PRINT((ndo, "[msgFlags=0x%02X]", flags));