diff --git a/nselib/snmp.lua b/nselib/snmp.lua index 5c3aeb261..26afe162d 100644 --- a/nselib/snmp.lua +++ b/nselib/snmp.lua @@ -3,6 +3,7 @@ -- -- @args snmp.version The SNMP protocol version. Use "v1" or 0 for SNMPv1 (default) and "v2c" or 1 for SNMPv2c. -- @args snmp.timeout The timeout for SNMP queries. Default: varies by target responsiveness, up to 5s. +-- @args snmp.retries The number of times a query should be reattempted. Default: 1 -- -- @author Patrik Karlsson -- @author Gioacchino Mazzurco @@ -25,6 +26,7 @@ if arg_timeout then arg_timeout = arg_timeout * 1000 end local default_max_timeout = 5000 --ms +local retries = stdnse.get_script_args("snmp.retries") or 1 -- SNMP ASN.1 Encoders local tagEncoder = {} @@ -523,13 +525,19 @@ Helper = { self.community ) ) - local status, err = self.socket:send(payload) - if not status then - stdnse.debug2("snmp.Helper.request: Send to %s failed: %s", self.host.ip, err) - return false, err + local received, data + for i=0, retries do + local status, err = self.socket:send(payload) + if not status then + stdnse.debug2("snmp.Helper.request: Send to %s failed: %s", self.host.ip, err) + return false, err + end + + received, data = self.socket:receive_bytes(1) + if received then break end end - return self.socket:receive_bytes(1) + return received, data end, --- Sends an SNMP Get Next request