Esempio n. 1
0
repeater_t *repeaters_findbyhost(char *host) {
	struct in_addr ipaddr;

	if (comm_hostname_to_ip(host, &ipaddr))
		return repeaters_findbyip(&ipaddr);
	else
		return NULL;
}
Esempio n. 2
0
repeater_t *repeaters_add(struct in_addr *ipaddr) {
	flag_t error = 0;
	repeater_t *repeater = repeaters_findbyip(ipaddr);

	if (ipaddr == NULL)
		return NULL;

	if (repeater == NULL) {
		repeater = (repeater_t *)calloc(sizeof(repeater_t), 1);
		if (repeater == NULL) {
			console_log("repeaters [%s]: can't add new repeater, not enough memory\n", repeaters_get_display_string_for_ip(&repeater->ipaddr));
			return NULL;
		}
		memcpy(&repeater->ipaddr, ipaddr, sizeof(struct in_addr));

		// Expecting 8 rows of variable length BPTC coded embedded LC data.
		// It will contain 77 data bits (without the Hamming (16,11) checksums
		// and the last row of parity bits).
		if (!vbptc_16_11_init(&repeater->slot[0].emb_sig_lc_vbptc_storage, 8))
			error = 1;
		else {
			if (!vbptc_16_11_init(&repeater->slot[1].emb_sig_lc_vbptc_storage, 8)) {
				vbptc_16_11_free(&repeater->slot[0].emb_sig_lc_vbptc_storage);
				error = 1;
			}
		}
		if (error) {
			console_log("repeaters [%s]: can't add, not enough memory for embedded signalling lc storage\n", repeaters_get_display_string_for_ip(&repeater->ipaddr));
			free(repeater);
			return NULL;
		}

		if (repeaters_issnmpignoredforip(ipaddr))
			repeater->snmpignored = 1;

		repeater->slot[0].voicestream = voicestreams_get_stream_for_repeater(ipaddr, 1);
#ifdef AMBEDECODEVOICE
		voicestreams_decode_ambe_init(repeater->slot[0].voicestream);
#endif
		repeater->slot[1].voicestream = voicestreams_get_stream_for_repeater(ipaddr, 2);
#ifdef AMBEDECODEVOICE
		voicestreams_decode_ambe_init(repeater->slot[1].voicestream);
#endif
		if (repeaters != NULL) {
			repeaters->prev = repeater;
			repeater->next = repeaters;
		}
		repeaters = repeater;

		console_log("repeaters [%s]: added, snmp ignored: %u ts1 stream: %s ts2 stream: %s\n",
			repeaters_get_display_string_for_ip(&repeater->ipaddr), repeater->snmpignored,
			repeater->slot[0].voicestream != NULL ? repeater->slot[0].voicestream->name : "no stream defined",
			repeater->slot[1].voicestream != NULL ? repeater->slot[1].voicestream->name : "no stream defined");
	}
	repeater->last_active_time = time(NULL);

	return repeater;
}
Esempio n. 3
0
char *repeaters_get_display_string_for_ip(struct in_addr *ipaddr) {
	repeater_t *foundrep;

	foundrep = repeaters_findbyip(ipaddr);
	if (foundrep && foundrep->callsign_lowercase[0] != 0)
		return foundrep->callsign_lowercase;
	if (comm_is_our_ipaddr(ipaddr))
		return "ds";

	return comm_get_ip_str(ipaddr);
}
Esempio n. 4
0
static int snmp_get_rssi_cb(int operation, struct snmp_session *sp, int reqid, struct snmp_pdu *pdu, void *magic) {
	char value[15] = {0,};
	char *endptr = NULL;
	int value_num = 0;
	struct variable_list *vars = NULL;
	repeater_t *repeater = NULL;
	in_addr_t ipaddr;
	flag_t dodbupdate = 0;

	if (operation == NETSNMP_CALLBACK_OP_RECEIVED_MESSAGE) {
		if (pdu->errstat == SNMP_ERR_NOERROR) {
			ipaddr = inet_addr(sp->peername);
			repeater = repeaters_findbyip((struct in_addr *)&ipaddr);

			for (vars = pdu->variables; vars; vars = vars->next_variable) {
				if (netsnmp_oid_equals(vars->name, vars->name_length, oid_rssi_ts1, oid_rssi_ts1_length) == 0) {
					snprint_value(value, sizeof(value), vars->name, vars->name_length, vars);
					errno = 0;
					value_num = strtol(value+9, &endptr, 10); // +9: cutting "INTEGER: " text returned by snprint_value().
					if (*endptr != 0 || errno != 0)
						console_log(LOGLEVEL_DEBUG LOGLEVEL_SNMP "snmp: invalid ts1 rssi value received: %s\n", sp->peername);
					else {
						if (value_num > -200) {
							if (repeater != NULL) {
								repeater->slot[0].rssi = value_num;
								if (repeater->slot[0].avg_rssi == 0)
									repeater->slot[0].avg_rssi = value_num;
								else
									repeater->slot[0].avg_rssi = (repeater->slot[0].avg_rssi+value_num)/2.0;
								dodbupdate = 1;
							}
							console_log(LOGLEVEL_SNMP "snmp [%s]: got ts1 rssi value %d\n", sp->peername, value_num);
						}
					}
				} else if (netsnmp_oid_equals(vars->name, vars->name_length, oid_rssi_ts2, oid_rssi_ts2_length) == 0) {
					snprint_value(value, sizeof(value), vars->name, vars->name_length, vars);
					errno = 0;
					value_num = strtol(value+9, &endptr, 10); // +9: cutting "INTEGER: " text returned by snprint_value().
					if (*endptr != 0 || errno != 0)
						console_log(LOGLEVEL_DEBUG LOGLEVEL_SNMP "snmp: invalid ts2 rssi value received: %s\n", value);
					else {
						if (value_num > -200) {
							if (repeater != NULL) {
								repeater->slot[1].rssi = value_num;
								if (repeater->slot[1].avg_rssi == 0)
									repeater->slot[1].avg_rssi = value_num;
								else
									repeater->slot[1].avg_rssi = (repeater->slot[1].avg_rssi+value_num)/2.0;
								dodbupdate = 1;
							}
							console_log(LOGLEVEL_SNMP "snmp [%s]: got ts2 rssi value %d\n", sp->peername, value_num);
						}
					}
				}
			}

			if (dodbupdate)
				remotedb_update(repeater);

			snmp_rssi_received = 1;
		} else
			console_log(LOGLEVEL_DEBUG "snmp: rssi read error\n");
    } else
    	console_log(LOGLEVEL_DEBUG "snmp: rssi read timeout\n");

	return 1;
}
Esempio n. 5
0
static int snmp_get_repeaterinfo_cb(int operation, struct snmp_session *sp, int reqid, struct snmp_pdu *pdu, void *magic) {
	char value[200] = {0,};
	char *endptr = NULL;
	int value_num = 0;
	struct variable_list *vars = NULL;
	repeater_t *repeater = NULL;
	in_addr_t ipaddr;
	char value_utf16[sizeof(value)/2] = {0,};
	char value_utf8[sizeof(value_utf16)/2] = {0,};
	int length = 0;
	flag_t dodbupdate = 0;

	if (operation == NETSNMP_CALLBACK_OP_RECEIVED_MESSAGE) {
		if (pdu->errstat == SNMP_ERR_NOERROR) {
			ipaddr = inet_addr(sp->peername);
			repeater = repeaters_findbyip((struct in_addr *)&ipaddr);

			for (vars = pdu->variables; vars; vars = vars->next_variable) {
				if (netsnmp_oid_equals(vars->name, vars->name_length, oid_id, oid_id_length) == 0) {
					snprint_value(value, sizeof(value), vars->name, vars->name_length, vars);
					errno = 0;
					value_num = strtol(value+9, &endptr, 10); // +9: cutting "INTEGER: " text returned by snprint_value().
					if (*endptr != 0 || errno != 0)
						console_log(LOGLEVEL_DEBUG "snmp [%s]: invalid id value received: %s\n", sp->peername, value);
					else {
						if (repeater != NULL) {
							repeater->id = value_num;
							dodbupdate = 1;
						}
						console_log("snmp [%s]: got id value %d\n", sp->peername, value_num);
					}
				} else if (netsnmp_oid_equals(vars->name, vars->name_length, oid_repeatertype, oid_repeatertype_length) == 0) {
					snprint_value(value, sizeof(value), vars->name, vars->name_length, vars);
					length = snmp_hexstring_to_bytearray(value+12, value_utf16, sizeof(value_utf16)); // +12: cutting "Hex-STRING: " text returned by snprint_value().
					snmp_utf16_to_utf8(value_utf16, length, value_utf8, sizeof(value_utf8));
					if (repeater != NULL) {
						strncpy(repeater->type, value_utf8, sizeof(repeater->type));
						dodbupdate = 1;
					}
					console_log("snmp [%s]: got repeater type value %s\n", sp->peername, value_utf8);
				} else if (netsnmp_oid_equals(vars->name, vars->name_length, oid_fwversion, oid_fwversion_length) == 0) {
					snprint_value(value, sizeof(value), vars->name, vars->name_length, vars);
					length = snmp_hexstring_to_bytearray(value+12, value_utf16, sizeof(value_utf16)); // +12: cutting "Hex-STRING: " text returned by snprint_value().
					snmp_utf16_to_utf8(value_utf16, length, value_utf8, sizeof(value_utf8));
					if (repeater != NULL) {
						strncpy(repeater->fwversion, value_utf8, sizeof(repeater->fwversion));
						dodbupdate = 1;
					}
					console_log("snmp [%s]: got repeater fw version value %s\n", sp->peername, value_utf8);
				} else if (netsnmp_oid_equals(vars->name, vars->name_length, oid_callsign, oid_callsign_length) == 0) {
					snprint_value(value, sizeof(value), vars->name, vars->name_length, vars);
					length = snmp_hexstring_to_bytearray(value+12, value_utf16, sizeof(value_utf16)); // +12: cutting "Hex-STRING: " text returned by snprint_value().
					snmp_utf16_to_utf8(value_utf16, length, value_utf8, sizeof(value_utf8));
					if (repeater != NULL) {
						strncpy(repeater->callsign, value_utf8, sizeof(repeater->callsign));
						dodbupdate = 1;
					}
					console_log("snmp [%s]: got repeater callsign value %s\n", sp->peername, value_utf8);
				} else if (netsnmp_oid_equals(vars->name, vars->name_length, oid_dlfreq, oid_dlfreq_length) == 0) {
					snprint_value(value, sizeof(value), vars->name, vars->name_length, vars);
					errno = 0;
					value_num = strtol(value+9, &endptr, 10); // +9: cutting "INTEGER: " text returned by snprint_value().
					if (*endptr != 0 || errno != 0)
						console_log(LOGLEVEL_DEBUG "snmp [%s]: invalid dl freq value received: %s\n", sp->peername, value);
					else {
						if (repeater != NULL) {
							repeater->dlfreq = value_num;
							dodbupdate = 1;
						}
						console_log("snmp [%s]: got dl freq value %d\n", sp->peername, value_num);
					}
				} else if (netsnmp_oid_equals(vars->name, vars->name_length, oid_ulfreq, oid_ulfreq_length) == 0) {
					snprint_value(value, sizeof(value), vars->name, vars->name_length, vars);
					errno = 0;
					value_num = strtol(value+9, &endptr, 10); // +9: cutting "INTEGER: " text returned by snprint_value().
					if (*endptr != 0 || errno != 0)
						console_log(LOGLEVEL_DEBUG "snmp [%s]: invalid dl freq value received: %s\n", sp->peername, value);
					else {
						if (repeater != NULL) {
							repeater->ulfreq = value_num;
							dodbupdate = 1;
						}
						console_log("snmp [%s]: got ul freq value %d\n", sp->peername, value_num);
					}
				}
			}

			if (dodbupdate)
				remotedb_update_repeater(repeater);

			snmp_repeaterinfo_received = 1;
		} else
			console_log(LOGLEVEL_DEBUG "snmp [%s]: repeater info read error\n", sp->peername);
    } else
    	console_log(LOGLEVEL_DEBUG "snmp [%s]: repeater info read timeout\n", sp->peername);

	return 1;
}