Exemplo n.º 1
0
Arquivo: snmp.c Projeto: flavour/uwsgi
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;

}
Exemplo n.º 2
0
Arquivo: snmp.c Projeto: sashka/uwsgi
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;

		}