static ssize_t build_snmp_metric_response(int64_t value, uint8_t type, uint8_t * buffer, int size, uint8_t * seq1, uint8_t * seq2, uint8_t * seq3) { uint8_t oid_sz; if (type == UWSGI_METRIC_GAUGE) { buffer[size - 2] = SNMP_GAUGE; oid_sz = snmp_int_to_snmp(value, SNMP_GAUGE, buffer + (size - 1)); } else { buffer[size - 2] = SNMP_COUNTER64; oid_sz = snmp_int_to_snmp(value, SNMP_COUNTER64, buffer + (size - 1)); } if (oid_sz < 1) return -1; oid_sz--; buffer[1] += oid_sz; *seq1 += oid_sz; *seq2 += oid_sz; *seq3 += oid_sz; return size + oid_sz; }
static int get_snmp_integer(uint8_t * ptr, uint64_t * val) { uint16_t tlen; int i, j; uint8_t *cval = (uint8_t *) val; tlen = *ptr; if (tlen > 4) return -1; #ifdef UWSGI_DEBUG uwsgi_debug("SNMP get integer TLEN %d %p\n", tlen, ptr); #endif j = 0; #ifdef __BIG_ENDIAN__ for (i = 0; i < tlen; i++) { #else for (i = tlen - 1; i >= 0; i--) { #endif cval[j] = ptr[1 + i]; j++; } return tlen + 1; } static uint8_t snmp_int_to_snmp(uint64_t snmp_val, uint8_t oid_type, uint8_t * buffer) { uint8_t tlen; int i, j; uint8_t *ptr = (uint8_t *) &snmp_val; // check for counter, counter64 or gauge if (oid_type == SNMP_COUNTER64) { tlen = 8; } else if (oid_type == SNMP_NULL || oid_type == 0) { tlen = 0; } else { tlen = 4; } buffer[0] = tlen; j = 1; #ifdef __BIG_ENDIAN__ for (i = 0; i < tlen; i++) { #else for (i = tlen - 1; i >= 0; i--) { #endif buffer[j] = ptr[i]; j++; } return tlen + 1; } static ssize_t build_snmp_response(uint8_t oid1, uint8_t oid2, uint8_t * buffer, int size, uint8_t * seq1, uint8_t * seq2, uint8_t * seq3) { uint64_t snmp_val; uint8_t oid_sz; uint8_t oid_type; if (oid1 == 1) { snmp_val = get_uwsgi_snmp_value(oid2, &oid_type); } else if (oid1 == 2) { snmp_val = get_uwsgi_custom_snmp_value(oid2, &oid_type); } else { return -1; } buffer[size - 2] = oid_type; oid_sz = snmp_int_to_snmp(snmp_val, oid_type, buffer + (size - 1)); if (oid_sz < 1) return -1; oid_sz--; buffer[1] += oid_sz; *seq1 += oid_sz; *seq2 += oid_sz; *seq3 += oid_sz; return size + oid_sz; }