summaryrefslogtreecommitdiff
path: root/recipes-connectivity/lora/lora-packet-forwarder/lora-packet-forwarder-dedup-rx.patch
blob: c368033ab06f2e01ae7b4fb1b56f37c97e0f1913 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
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) {