X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fsnmp.c;h=98da2b824bc196a774029e6c2b75986254b22116;hb=270cadc40a1e935c7d126a70ea58f7d1c2144d7d;hp=322e0a3e1a1fbd146fab8901aa2c1ce05983670e;hpb=a485f5e7cb1854d9096d777fe2ba7ea4e697ce8a;p=collectd.git diff --git a/src/snmp.c b/src/snmp.c index 322e0a3e..98da2b82 100644 --- a/src/snmp.c +++ b/src/snmp.c @@ -99,7 +99,6 @@ struct host_definition_s { c_complain_t complaint; data_definition_t **data_list; int data_list_len; - int bulk_size; }; typedef struct host_definition_s host_definition_t; @@ -764,7 +763,7 @@ static int csnmp_config_add_host(oconfig_item_t *ci) { /* These mean that we have not set a timeout or retry value */ hd->timeout = 0; hd->retries = -1; - hd->build_size = 0; + hd->bulk_size = 0; for (int i = 0; i < ci->children_num; i++) { oconfig_item_t *option = ci->children + i; @@ -821,6 +820,11 @@ static int csnmp_config_add_host(oconfig_item_t *ci) { status = -1; break; } + if (hd->bulk_size > 0 && hd->version < 2) { + WARNING("snmp plugin: Bulk transfers is only available for SNMP v2 and " + "later, host '%s' is configured as version '%d'", + hd->name, hd->version); + } if (hd->version == 3) { if (hd->username == NULL) { WARNING("snmp plugin: `Username' not given for host `%s'", hd->name); @@ -1577,7 +1581,7 @@ static int csnmp_read_table(host_definition_t *host, data_definition_t *data) { csnmp_oid_type_t oid_list_todo[oid_list_len]; int status; - size_t i,j; + size_t i; /* `value_list_head' and `value_cells_tail' implement a linked list for each * value. `instance_cells_head' and `instance_cells_tail' implement a linked @@ -1593,8 +1597,8 @@ static int csnmp_read_table(host_definition_t *host, data_definition_t *data) { csnmp_cell_value_t **value_cells_head; csnmp_cell_value_t **value_cells_tail; - DEBUG("snmp plugin: csnmp_read_table (host = %s, data = %s (%ld))", host->name, - data->name, data->values_len); + DEBUG("snmp plugin: csnmp_read_table (host = %s, data = %s)", host->name, + data->name); if (host->sess_handle == NULL) { DEBUG("snmp plugin: csnmp_read_table: host->sess_handle == NULL"); @@ -1660,7 +1664,7 @@ static int csnmp_read_table(host_definition_t *host, data_definition_t *data) { status = 0; while (status == 0) { - /* If SNMP v2 and later and bulk transfert enabled, use GETBULK PDU */ + /* If SNMP v2 and later and bulk transfers enabled, use GETBULK PDU */ if (host->version > 1 && host->bulk_size > 0) { req = snmp_pdu_create(SNMP_MSG_GETBULK); req->non_repeaters = 0; @@ -1696,10 +1700,10 @@ static int csnmp_read_table(host_definition_t *host, data_definition_t *data) { } if (req->command == SNMP_MSG_GETBULK) { - /* In bulk mode the host will send 'max_repetitions' values per - requested variable, so we need to split it per number of variable - to stay 'in budget' */ - req->max_repetitions = floor(host->bulk_size/oid_list_todo_num); + /* In bulk mode the host will send 'max_repetitions' values per + requested variable, so we need to split it per number of variable + to stay 'in budget' */ + req->max_repetitions = floor(host->bulk_size / oid_list_todo_num); } res = NULL; @@ -1773,17 +1777,18 @@ static int csnmp_read_table(host_definition_t *host, data_definition_t *data) { continue; } + size_t j; for (vb = res->variables, j = 0; (vb != NULL); vb = vb->next_variable, j++) { + i = j; /* If bulk request is active convert value index of the extra value */ if (host->version > 1 && host->bulk_size > 0) { - i = j % oid_list_todo_num; - } else { - i = j; + i %= oid_list_todo_num; } /* Calculate value index from todo list */ while ((i < oid_list_len) && !oid_list_todo[i]) { - i++; j++; + i++; + j++; } if (i >= oid_list_len) { break;