From 2cda69e0b8548f2526326a776291e66dcd0a604f Mon Sep 17 00:00:00 2001 From: muecklichd Date: Mon, 6 Jul 2026 16:52:59 +0200 Subject: [PATCH] nonbulk: use GETNEXT instead of GET for the first packet The first packet in NONBULK mode used a plain GET against a hardcoded instance (ifDescr.1 etc.), while every subsequent packet already used GETNEXT against the base OID. This meant NONBULK mode silently failed (noSuchName under SNMPv1, zero interfaces found) on any device whose first ifIndex is not 1, instead of walking the table as documented. This aligns the first packet with the GETNEXT-based walk already used for all following packets. No behavior change for devices that start at ifIndex 1 (verified against a local snmpd v1 agent - old and new binary produce byte-identical output); fixes the case of devices with a non-contiguous or non-1-starting ifIndex range (reproduced with snmpsim against a simulated agent starting at ifIndex 5). No change to session setup (community/v1 forcing in start_session(), SNMPv3 handling in start_session_v3()) or to default/cisco/bintec modes. --- check_interfaces.c | 23 +++++++++-------------- snmp_bulkget.c | 2 +- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/check_interfaces.c b/check_interfaces.c index 5496c5f..8629719 100644 --- a/check_interfaces.c +++ b/check_interfaces.c @@ -183,21 +183,16 @@ int main(int argc, char *argv[]) { char **oid_aliasp; char **oid_namesp; char **oid_ifp = oid_if_bulkget; - if (config.mode == NONBULK) { - oid_ifp = oid_if_get; - size = (sizeof(oid_if_get) / sizeof(char *)) - 1; - oid_aliasp = oid_alias_get; - oid_namesp = oid_names_get; - } else if (config.mode == BINTEC) { - oid_ifp = oid_if_bintec; - size = (sizeof(oid_if_bintec) / sizeof(char *)) - 1; - oid_aliasp = oid_alias_bintec; - oid_namesp = oid_names_bintec; + if (config.mode == BINTEC) { + oid_ifp = oid_if_bintec; + size = (sizeof(oid_if_bintec) / sizeof(char *)) - 1; + oid_aliasp = oid_alias_bintec; + oid_namesp = oid_names_bintec; } else { - oid_ifp = oid_if_bulkget; - size = (sizeof(oid_if_bulkget) / sizeof(char *)) - 1; - oid_aliasp = oid_alias_bulkget; - oid_namesp = oid_names_bulkget; + oid_ifp = oid_if_bulkget; + size = (sizeof(oid_if_bulkget) / sizeof(char *)) - 1; + oid_aliasp = oid_alias_bulkget; + oid_namesp = oid_names_bulkget; } /* allocate the space for the interface OIDs */ diff --git a/snmp_bulkget.c b/snmp_bulkget.c index de68473..92b0e08 100644 --- a/snmp_bulkget.c +++ b/snmp_bulkget.c @@ -515,7 +515,7 @@ void create_pdu(int mode, char **oidlist, netsnmp_pdu **pdu, struct OIDStruct ** int nonrepeaters, long max) { if (mode == NONBULK) { - *pdu = snmp_pdu_create(SNMP_MSG_GET); + *pdu = snmp_pdu_create(SNMP_MSG_GETNEXT); } else if (mode == BINTEC) {