repeater_t *repeaters_findbyhost(char *host) { struct in_addr ipaddr; if (comm_hostname_to_ip(host, &ipaddr)) return repeaters_findbyip(&ipaddr); else return NULL; }
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; }
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); }
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; }
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; }