diff --git a/lora_pkt_fwd/src/lora_pkt_fwd.c b/lora_pkt_fwd/src/lora_pkt_fwd.c index 801f28d..c35c64f 100644 --- a/lora_pkt_fwd/src/lora_pkt_fwd.c +++ b/lora_pkt_fwd/src/lora_pkt_fwd.c @@ -126,8 +126,9 @@ volatile bool quit_sig = false; /* 1 -> application terminates without shutting static bool fwd_valid_pkt = true; /* packets with PAYLOAD CRC OK are forwarded */ static bool fwd_error_pkt = false; /* packets with PAYLOAD CRC ERROR are NOT forwarded */ static bool fwd_nocrc_pkt = false; /* packets with NO PAYLOAD CRC are NOT forwarded */ +static bool fwd_best_pkt = true; /* duplicate packets with low SNR are NOT forwarded */ /* network configuration variables */ static uint64_t lgwm = 0; /* Lora gateway MAC address */ static char serv_addr[64] = STR(DEFAULT_SERVER); /* address of the server (host name or IPv4/IPv6) */ static char serv_port_up[8] = STR(DEFAULT_PORT_UP); /* server port for upstream traffic */ @@ -731,6 +742,12 @@ static int parse_gateway_configuration(const char * conf_file) { } /* packet filtering parameters */ + val = json_object_get_value(conf_obj, "best_packet_filter"); + if (json_value_get_type(val) == JSONBoolean) { + fwd_best_pkt = (bool)json_value_get_boolean(val); + } + MSG("INFO: duplicate packets received with low SNR will%s be forwarded\n", (!fwd_best_pkt ? "" : " NOT")); + val = json_object_get_value(conf_obj, "forward_crc_valid"); if (json_value_get_type(val) == JSONBoolean) { fwd_valid_pkt = (bool)json_value_get_boolean(val); @@ -1536,6 +1562,38 @@ void thread_up(void) { memcpy((void *)(buff_up + buff_index), (void *)"{\"rxpk\":[", 9); buff_index += 9; + if (fwd_best_pkt && nb_pkt > 1) { + uint32_t check_addr = 0; + uint32_t check_mic = 0; + uint16_t check_fcnt = 0; + float check_snr = -30.0; + + for (i=0; i < nb_pkt; ++i) { + p = &rxpkt[i]; + if (p->size < 12) + continue; + + memcpy(&check_addr, p->payload + 1, 4); + memcpy(&check_fcnt, p->payload + 6, 2); + memcpy(&check_mic, p->payload + p->size - 4, 4); + + check_snr = p->snr; + + for (j=0; j < nb_pkt; ++j) { + p = &rxpkt[j]; + + if (p->size >= 12 + && memcmp(&check_addr, p->payload + 1, 4) == 0 + && memcmp(&check_fcnt, p->payload + 6, 2) == 0 + && memcmp(&check_mic, p->payload + p->size - 4, 4) == 0 + && p->snr < check_snr) { + // set status of duplicate packets rx'd on wrong channel + p->status = 1; + } + } + } + } + /* serialize Lora packets metadata and payload */ pkt_in_dgram = 0; for (i=0; i < nb_pkt; ++i) {