#include <smi.h>
#endif
+#include "netdissect-ctype.h"
+
#include "netdissect.h"
#include "extract.h"
#undef OPAQUE /* defined in <wingdi.h> */
-static const char tstr[] = "[|snmp]";
/*
* Universal ASN.1 types
#define DECODE_ErrorStatus(e) \
( e >= 0 && (size_t)e < sizeof(ErrorStatus)/sizeof(ErrorStatus[0]) \
? ErrorStatus[e] \
- : (nd_snprintf(errbuf, sizeof(errbuf), "err=%u", e), errbuf))
+ : (snprintf(errbuf, sizeof(errbuf), "err=%u", e), errbuf))
/*
* generic-trap values in the SNMP Trap-PDU
#define DECODE_GenericTrap(t) \
( t >= 0 && (size_t)t < sizeof(GenericTrap)/sizeof(GenericTrap[0]) \
? GenericTrap[t] \
- : (nd_snprintf(buf, sizeof(buf), "gt=%d", t), buf))
+ : (snprintf(buf, sizeof(buf), "gt=%d", t), buf))
/*
* ASN.1 type class table
ND_PRINT("[nothing to parse]");
return -1;
}
- 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 = EXTRACT_U_1(p) & ASN_ID_BITS; /* lower 5 bits, range 00-1f */
+ id = GET_U_1(p) & ASN_ID_BITS; /* lower 5 bits, range 00-1f */
#ifdef notdef
- form = (EXTRACT_U_1(p) & 0xe0) >> 5; /* move upper 3 bits to lower 3 */
+ form = (GET_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)(EXTRACT_U_1(p) & ASN_FORM_BITS) >> ASN_FORM_SHIFT;
- class = (u_char)(EXTRACT_U_1(p) & ASN_CLASS_BITS) >> ASN_CLASS_SHIFT;
+ form = (u_char)(GET_U_1(p) & ASN_FORM_BITS) >> ASN_FORM_SHIFT;
+ class = (u_char)(GET_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_1(p);
- while (EXTRACT_U_1(p) & ASN_BIT8) {
+ while (GET_U_1(p) & ASN_BIT8) {
if (len < 1) {
ND_PRINT("[Xtagfield?]");
return -1;
}
- id = (id << 7) | (EXTRACT_U_1(p) & ~ASN_BIT8);
+ id = (id << 7) | (GET_U_1(p) & ~ASN_BIT8);
len--;
hdr++;
p++;
- ND_TCHECK_1(p);
}
if (len < 1) {
ND_PRINT("[Xtagfield?]");
return -1;
}
- ND_TCHECK_1(p);
- elem->id = id = (id << 7) | EXTRACT_U_1(p);
+ elem->id = id = (id << 7) | GET_U_1(p);
--len;
++hdr;
++p;
ND_PRINT("[no asnlen]");
return -1;
}
- ND_TCHECK_1(p);
- elem->asnlen = EXTRACT_U_1(p);
+ elem->asnlen = GET_U_1(p);
p++; len--; hdr++;
if (elem->asnlen & ASN_BIT8) {
uint32_t noct = elem->asnlen % ASN_BIT8;
return -1;
}
ND_TCHECK_LEN(p, noct);
- for (; noct-- > 0; len--, hdr++) {
- elem->asnlen = (elem->asnlen << ASN_SHIFT8) | EXTRACT_U_1(p);
+ for (; noct != 0; len--, hdr++, noct--) {
+ elem->asnlen = (elem->asnlen << ASN_SHIFT8) | GET_U_1(p);
p++;
}
}
ND_PRINT("[asnlen=0]");
return -1;
}
- if (EXTRACT_U_1(p) & ASN_BIT8) /* negative */
+ if (GET_U_1(p) & ASN_BIT8) /* negative */
data = -1;
for (i = elem->asnlen; i != 0; p++, i--)
- data = (data << ASN_SHIFT8) | EXTRACT_U_1(p);
+ data = (data << ASN_SHIFT8) | GET_U_1(p);
elem->data.integer = data;
break;
}
elem->type = BE_UNS;
data = 0;
for (i = elem->asnlen; i != 0; p++, i--)
- data = (data << 8) + EXTRACT_U_1(p);
+ data = (data << 8) + GET_U_1(p);
elem->data.uns = data;
break;
}
elem->type = BE_UNS64;
data64 = 0;
for (i = elem->asnlen; i != 0; p++, i--)
- data64 = (data64 << 8) + EXTRACT_U_1(p);
+ data64 = (data64 << 8) + GET_U_1(p);
elem->data.uns64 = data64;
break;
}
return elem->asnlen + hdr;
trunc:
- ND_PRINT("%s", tstr);
+ nd_print_trunc(ndo);
return -1;
}
ND_TCHECK_LEN(p, asnlen);
for (i = asnlen; i != 0; p++, i--)
- ND_PRINT("_%.2x", EXTRACT_U_1(p));
+ ND_PRINT("_%.2x", GET_U_1(p));
return 0;
trunc:
- ND_PRINT("%s", tstr);
+ nd_print_trunc(ndo);
return -1;
}
p = elem->data.str;
ND_TCHECK_LEN(p, asnlen);
for (i = asnlen; printable && i != 0; p++, i--)
- printable = ND_ISPRINT(EXTRACT_U_1(p));
+ printable = ND_ASCII_ISPRINT(GET_U_1(p));
p = elem->data.str;
if (printable) {
ND_PRINT("\"");
- if (fn_printn(ndo, p, asnlen, ndo->ndo_snapend)) {
+ if (nd_printn(ndo, p, asnlen, ndo->ndo_snapend)) {
ND_PRINT("\"");
goto trunc;
}
ND_PRINT("\"");
} else {
for (i = asnlen; i != 0; p++, i--) {
- ND_PRINT(first ? "%.2x" : "_%.2x", EXTRACT_U_1(p));
+ ND_PRINT(first ? "%.2x" : "_%.2x", GET_U_1(p));
first = 0;
}
}
return 0;
trunc:
- ND_PRINT("%s", tstr);
+ nd_print_trunc(ndo);
return -1;
}
}
for (; i != 0; p++, i--) {
- ND_TCHECK_1(p);
- o = (o << ASN_SHIFT7) + (EXTRACT_U_1(p) & ~ASN_BIT8);
- if (EXTRACT_U_1(p) & ASN_LONGLEN)
+ o = (o << ASN_SHIFT7) + (GET_U_1(p) & ~ASN_BIT8);
+ if (GET_U_1(p) & ASN_LONGLEN)
continue;
/*
p = (const u_char *)elem->data.raw;
ND_TCHECK_LEN(p, asnlen);
for (i = asnlen; i != 0; p++, i--) {
- ND_PRINT((i == asnlen-1) ? "%u" : ".%u", EXTRACT_U_1(p));
+ ND_PRINT((i == asnlen) ? "%u" : ".%u", GET_U_1(p));
}
break;
return 0;
trunc:
- ND_PRINT("%s", tstr);
+ nd_print_trunc(ndo);
return -1;
}
unsigned int firstval;
for (*oidlen = 0; i != 0; p++, i--) {
- ND_TCHECK_1(p);
- o = (o << ASN_SHIFT7) + (EXTRACT_U_1(p) & ~ASN_BIT8);
- if (EXTRACT_U_1(p) & ASN_LONGLEN)
+ o = (o << ASN_SHIFT7) + (GET_U_1(p) & ~ASN_BIT8);
+ if (GET_U_1(p) & ASN_LONGLEN)
continue;
/*
* (see X.690:1997 clause 8.19 for the details)
*/
if (first < 0) {
- first = 0;
+ first = 0;
firstval = o / OIDMUX;
if (firstval > 2) firstval = 2;
o -= firstval * OIDMUX;
o = 0;
}
return 0;
-
-trunc:
- ND_PRINT("%s", tstr);
- return -1;
}
static int smi_check_type(SmiBasetype basetype, int be)
np += count;
varbind_print(ndo, pduid, np, length);
- return;
}
/*
np += count;
varbind_print(ndo, TRAP, np, length);
- return;
}
/*
ND_PRINT("[msgFlags size %d]", elem.asnlen);
return;
}
- flags = EXTRACT_U_1(elem.data.str);
+ flags = GET_U_1(elem.data.str);
if (flags != 0x00 && flags != 0x01 && flags != 0x03
&& flags != 0x04 && flags != 0x05 && flags != 0x07) {
ND_PRINT("[msgFlags=0x%02X]", flags);
int count = 0;
int version = 0;
+ ndo->ndo_protocol = "snmp";
ND_PRINT(" ");
/* initial Sequence */