summaryrefslogtreecommitdiff
path: root/recipes-connectivity/lora/lora-packet-forwarder
diff options
context:
space:
mode:
authorJason Reiss <jreiss@multitech.com>2015-10-21 15:27:41 -0500
committerJason Reiss <jreiss@multitech.com>2015-10-21 15:27:41 -0500
commitfa81575b149642029920d2947c113603915ec62b (patch)
tree353db7c0ca9ead1634d4ab48822e4b7adecf5a25 /recipes-connectivity/lora/lora-packet-forwarder
parent51bbefebaca5e8ac51ac9f965dd571cb4b3b9255 (diff)
downloadmeta-mlinux-fa81575b149642029920d2947c113603915ec62b.tar.gz
meta-mlinux-fa81575b149642029920d2947c113603915ec62b.tar.bz2
meta-mlinux-fa81575b149642029920d2947c113603915ec62b.zip
lora: patch gps_pkt_fwd with same changes made to basic_pkt_fwd
Diffstat (limited to 'recipes-connectivity/lora/lora-packet-forwarder')
-rw-r--r--recipes-connectivity/lora/lora-packet-forwarder/lora-packet-forwarder-add-no-header-option.patch21
-rw-r--r--recipes-connectivity/lora/lora-packet-forwarder/lora-packet-forwarder-add-queue.patch316
-rw-r--r--recipes-connectivity/lora/lora-packet-forwarder/lora-packet-forwarder-mts-enhancements.patch76
-rw-r--r--recipes-connectivity/lora/lora-packet-forwarder/lora-packet-forwarder-skip-bad-packets.patch55
-rw-r--r--recipes-connectivity/lora/lora-packet-forwarder/lora-packet-forwarder-synch-word.patch58
5 files changed, 513 insertions, 13 deletions
diff --git a/recipes-connectivity/lora/lora-packet-forwarder/lora-packet-forwarder-add-no-header-option.patch b/recipes-connectivity/lora/lora-packet-forwarder/lora-packet-forwarder-add-no-header-option.patch
index ca8d106..fd2fa24 100644
--- a/recipes-connectivity/lora/lora-packet-forwarder/lora-packet-forwarder-add-no-header-option.patch
+++ b/recipes-connectivity/lora/lora-packet-forwarder/lora-packet-forwarder-add-no-header-option.patch
@@ -25,6 +25,21 @@ index e20dfc1..2223b4a 100644
/* parse target frequency (mandatory) */
val = json_object_get_value(txpk_obj,"freq");
---
-1.7.10.4
-
+
+diff --git a/gps_pkt_fwd/src/gps_pkt_fwd.c b/gps_pkt_fwd/src/gps_pkt_fwd.c
+index 79f7584..d073540 100644
+--- a/gps_pkt_fwd/src/gps_pkt_fwd.c
++++ b/gps_pkt_fwd/src/gps_pkt_fwd.c
+@@ -1534,6 +1534,12 @@ void thread_down(void) {
+ txpkt.no_crc = (bool)json_value_get_boolean(val);
+ }
+
++ /* Parse "No Header" flag (optional field) */
++ val = json_object_get_value(txpk_obj,"nhdr");
++ if (val != NULL) {
++ txpkt.no_header = (bool)json_value_get_boolean(val);
++ }
++
+ /* parse target frequency (mandatory) */
+ val = json_object_get_value(txpk_obj,"freq");
+ if (val == NULL) {
diff --git a/recipes-connectivity/lora/lora-packet-forwarder/lora-packet-forwarder-add-queue.patch b/recipes-connectivity/lora/lora-packet-forwarder/lora-packet-forwarder-add-queue.patch
new file mode 100644
index 0000000..bef41c9
--- /dev/null
+++ b/recipes-connectivity/lora/lora-packet-forwarder/lora-packet-forwarder-add-queue.patch
@@ -0,0 +1,316 @@
+From fdf5d6669d5132da9016840dfe2c1c99f525e4bc Mon Sep 17 00:00:00 2001
+From: Jason Reiss <jreiss@multitech.com>
+Date: Tue, 29 Sep 2015 12:01:12 -0500
+Subject: [PATCH] add-queue to pkt-fwd
+
+---
+ basic_pkt_fwd/src/basic_pkt_fwd.c | 93 +++++++++++++++++++++++++++++++++++--
+ 1 file changed, 88 insertions(+), 5 deletions(-)
+
+diff --git a/basic_pkt_fwd/src/basic_pkt_fwd.c b/basic_pkt_fwd/src/basic_pkt_fwd.c
+index e20dfc1..4d0bb35 100644
+--- a/basic_pkt_fwd/src/basic_pkt_fwd.c
++++ b/basic_pkt_fwd/src/basic_pkt_fwd.c
+@@ -162,8 +162,19 @@ static int parse_gateway_configuration(const char * conf_file);
+
+ static double difftimespec(struct timespec end, struct timespec beginning);
+
++typedef struct tx_queue_s {
++ struct lgw_pkt_tx_s pkt;
++ struct tx_queue_s* next;
++} tx_queue_s;
++
++
++struct tx_queue_s* tx_queue = NULL;
++struct tx_queue_s* tx_queue_end = NULL;
++
++
+ /* threads */
+ void thread_up(void);
++void thread_queue(void);
+ void thread_down(void);
+
+ /* -------------------------------------------------------------------------- */
+@@ -479,6 +490,7 @@ int main(void)
+
+ /* threads */
+ pthread_t thrid_up;
++ pthread_t thrid_queue;
+ pthread_t thrid_down;
+
+ /* network socket creation */
+@@ -649,6 +661,11 @@ int main(void)
+ MSG("ERROR: [main] impossible to create downstream thread\n");
+ exit(EXIT_FAILURE);
+ }
++ i = pthread_create( &thrid_queue, NULL, (void * (*)(void *))thread_queue, NULL);
++ if (i != 0) {
++ MSG("ERROR: [main] impossible to create queue thread\n");
++ exit(EXIT_FAILURE);
++ }
+
+ /* configure signal handling */
+ sigemptyset(&sigact.sa_mask);
+@@ -744,6 +761,7 @@ int main(void)
+
+ /* wait for upstream thread to finish (1 fetch cycle max) */
+ pthread_join(thrid_up, NULL);
++ pthread_cancel(thrid_queue);
+ pthread_cancel(thrid_down); /* don't wait for downstream thread */
+
+ /* if an exit signal was received, try to quit properly */
+@@ -1121,9 +1139,9 @@ void thread_up(void) {
+ }
+
+ /* -------------------------------------------------------------------------- */
+-/* --- THREAD 2: POLLING SERVER AND EMITTING PACKETS ------------------------ */
++/* --- THREAD 2: POLLING SERVER AND QUEUEING PACKETS ------------------------ */
+
+-void thread_down(void) {
++void thread_queue(void) {
+ int i; /* loop variables */
+
+ /* configuration and metadata for an outbound packet */
+@@ -1462,11 +1480,48 @@ void thread_down(void) {
+ meas_dw_dgram_rcv += 1; /* count only datagrams with no JSON errors */
+ meas_dw_network_byte += msg_len; /* meas_dw_network_byte */
+ meas_dw_payload_byte += txpkt.size;
++ pthread_mutex_unlock(&mx_meas_dw);
++
++ pthread_mutex_lock(&mx_concent); /* may have to wait for a fetch to finish */
++ if (tx_queue == NULL) {
++ tx_queue = malloc(sizeof(tx_queue_s));
++ tx_queue_end = tx_queue;
++ tx_queue->pkt = txpkt;
++ tx_queue->next = NULL;
++ } else {
++ struct tx_queue_s* item = malloc(sizeof(tx_queue_s));
++ item->next = NULL;
++ item->pkt = txpkt;
++ tx_queue_end->next = item;
++ tx_queue_end = item;
++ }
++ pthread_mutex_unlock(&mx_concent);
++ }
++ wait_ms(1);
++ }
++ MSG("\nINFO: End of queue thread\n");
++}
++
++/* -------------------------------------------------------------------------- */
++/* --- THREAD 3: POLLING QUEUE AND EMITTING PACKETS ------------------------ */
++
++void thread_down(void) {
++ MSG("\nINFO: Start of downstream thread\n");
+
++ struct lgw_pkt_tx_s txpkt;
++
++ while (!exit_sig && !quit_sig) {
++ pthread_mutex_lock(&mx_concent); /* may have to wait for a fetch to finish */
++ if (tx_queue != NULL) {
++ struct tx_queue_s* del = tx_queue;
++ txpkt = tx_queue->pkt;
++ tx_queue = tx_queue->next;
++ free(del);
+ /* transfer data and metadata to the concentrator, and schedule TX */
+- pthread_mutex_lock(&mx_concent); /* may have to wait for a fetch to finish */
+- i = lgw_send(txpkt);
++ int i = lgw_send(txpkt);
+ pthread_mutex_unlock(&mx_concent); /* free concentrator ASAP */
++
++ pthread_mutex_lock(&mx_meas_dw);
+ if (i == LGW_HAL_ERROR) {
+ meas_nb_tx_fail += 1;
+ pthread_mutex_unlock(&mx_meas_dw);
+@@ -1476,7 +1531,35 @@ void thread_down(void) {
+ meas_nb_tx_ok += 1;
+ pthread_mutex_unlock(&mx_meas_dw);
+ }
+- }
++
++ uint8_t tx_status_var = TX_STATUS_UNKNOWN;
++ // wait for 200 ms and ensure packet is transmitted
++ for (i=0; (i < 20) && (tx_status_var != TX_EMITTING); ++i) {
++ wait_ms(10);
++ pthread_mutex_lock(&mx_concent);
++ lgw_status(TX_STATUS, &tx_status_var);
++ pthread_mutex_unlock(&mx_concent);
++ }
++ if (tx_status_var != TX_EMITTING) {
++ MSG("WARNING: [down] packet was scheduled but failed to TX\n");
++ } else {
++ // if packet is transmitting then wait for end of TX or timeout after 4 seconds
++ for (i=0; (i < 400) && (tx_status_var != TX_FREE); ++i) {
++ wait_ms(10);
++ pthread_mutex_lock(&mx_concent);
++ lgw_status(TX_STATUS, &tx_status_var);
++ pthread_mutex_unlock(&mx_concent);
++ }
++
++ if (tx_status_var != TX_FREE) {
++ MSG("WARNING: [down] timedout waiting for end of TX\n");
++ }
++ }
++
++ } else {
++ pthread_mutex_unlock(&mx_concent); /* free concentrator ASAP */
++ }
++ wait_ms(1);
+ }
+ MSG("\nINFO: End of downstream thread\n");
+ }
+
+diff --git a/gps_pkt_fwd/src/gps_pkt_fwd.c b/gps_pkt_fwd/src/gps_pkt_fwd.c
+index 79f7584..3d1cbf8 100644
+--- a/gps_pkt_fwd/src/gps_pkt_fwd.c
++++ b/gps_pkt_fwd/src/gps_pkt_fwd.c
+@@ -192,8 +192,18 @@ static int parse_gateway_configuration(const char * conf_file);
+
+ static double difftimespec(struct timespec end, struct timespec beginning);
+
++typedef struct tx_queue_s {
++ struct lgw_pkt_tx_s pkt;
++ struct tx_queue_s* next;
++} tx_queue_s;
++
++
++struct tx_queue_s* tx_queue = NULL;
++struct tx_queue_s* tx_queue_end = NULL;
++
+ /* threads */
+ void thread_up(void);
++void thread_queue(void);
+ void thread_down(void);
+ void thread_gps(void);
+ void thread_valid(void);
+@@ -546,6 +556,7 @@ int main(void)
+
+ /* threads */
+ pthread_t thrid_up;
++ pthread_t thrid_queue;
+ pthread_t thrid_down;
+ pthread_t thrid_gps;
+ pthread_t thrid_valid;
+@@ -739,6 +750,12 @@ int main(void)
+ exit(EXIT_FAILURE);
+ }
+
++ i = pthread_create( &thrid_queue, NULL, (void * (*)(void *))thread_queue, NULL);
++ if (i != 0) {
++ MSG("ERROR: [main] impossible to create queue thread\n");
++ exit(EXIT_FAILURE);
++ }
++
+ /* spawn thread to manage GPS */
+ if (gps_enabled == true) {
+ i = pthread_create( &thrid_gps, NULL, (void * (*)(void *))thread_gps, NULL);
+@@ -891,6 +908,7 @@ int main(void)
+
+ /* wait for upstream thread to finish (1 fetch cycle max) */
+ pthread_join(thrid_up, NULL);
++ pthread_cancel(thrid_queue);
+ pthread_cancel(thrid_down); /* don't wait for downstream thread */
+ pthread_cancel(thrid_gps); /* don't wait for GPS thread */
+ pthread_cancel(thrid_valid); /* don't wait for validation thread */
+@@ -1325,9 +1343,9 @@ void thread_up(void) {
+ }
+
+ /* -------------------------------------------------------------------------- */
+-/* --- THREAD 2: POLLING SERVER AND EMITTING PACKETS ------------------------ */
++/* --- THREAD 2: POLLING SERVER AND QUEUE PACKETS ------------------------ */
+
+-void thread_down(void) {
++void thread_queue(void) {
+ int i; /* loop variables */
+
+ /* configuration and metadata for an outbound packet */
+@@ -1719,11 +1737,49 @@ void thread_down(void) {
+ meas_dw_dgram_rcv += 1; /* count only datagrams with no JSON errors */
+ meas_dw_network_byte += msg_len; /* meas_dw_network_byte */
+ meas_dw_payload_byte += txpkt.size;
++ pthread_mutex_unlock(&mx_meas_dw);
++
++ pthread_mutex_lock(&mx_concent); /* may have to wait for a fetch to finish */
++ if (tx_queue == NULL) {
++ tx_queue = malloc(sizeof(tx_queue_s));
++ tx_queue_end = tx_queue;
++ tx_queue->pkt = txpkt;
++ tx_queue->next = NULL;
++ } else {
++ struct tx_queue_s* item = malloc(sizeof(tx_queue_s));
++ item->next = NULL;
++ item->pkt = txpkt;
++ tx_queue_end->next = item;
++ tx_queue_end = item;
++ }
++ pthread_mutex_unlock(&mx_concent);
++ }
++ wait_ms(1);
++ }
++ MSG("\nINFO: End of queue thread\n");
++}
++
++/* -------------------------------------------------------------------------- */
++/* --- THREAD 3: POLLING QUEUE AND EMITTING PACKETS ------------------------ */
++
++void thread_down(void) {
++ MSG("\nINFO: Start of downstream thread\n");
+
++ struct lgw_pkt_tx_s txpkt;
++
++ while (!exit_sig && !quit_sig) {
++ pthread_mutex_lock(&mx_concent); /* may have to wait for a fetch to finish */
++ if (tx_queue != NULL) {
++ struct tx_queue_s* del = tx_queue;
++ txpkt = tx_queue->pkt;
++ tx_queue = tx_queue->next;
++ free(del);
++
+ /* transfer data and metadata to the concentrator, and schedule TX */
+- pthread_mutex_lock(&mx_concent); /* may have to wait for a fetch to finish */
+- i = lgw_send(txpkt);
++ int i = lgw_send(txpkt);
+ pthread_mutex_unlock(&mx_concent); /* free concentrator ASAP */
++
++ pthread_mutex_lock(&mx_meas_dw);
+ if (i == LGW_HAL_ERROR) {
+ meas_nb_tx_fail += 1;
+ pthread_mutex_unlock(&mx_meas_dw);
+@@ -1733,7 +1789,35 @@ void thread_down(void) {
+ meas_nb_tx_ok += 1;
+ pthread_mutex_unlock(&mx_meas_dw);
+ }
+- }
++
++ uint8_t tx_status_var = TX_STATUS_UNKNOWN;
++ // wait for 200 ms and ensure packet is transmitted
++ for (i=0; (i < 20) && (tx_status_var != TX_EMITTING); ++i) {
++ wait_ms(10);
++ pthread_mutex_lock(&mx_concent);
++ lgw_status(TX_STATUS, &tx_status_var);
++ pthread_mutex_unlock(&mx_concent);
++ }
++ if (tx_status_var != TX_EMITTING) {
++ MSG("WARNING: [down] packet was scheduled but failed to TX\n");
++ } else {
++ // if packet is transmitting then wait for end of TX or timeout after 4 seconds
++ for (i=0; (i < 400) && (tx_status_var != TX_FREE); ++i) {
++ wait_ms(10);
++ pthread_mutex_lock(&mx_concent);
++ lgw_status(TX_STATUS, &tx_status_var);
++ pthread_mutex_unlock(&mx_concent);
++ }
++
++ if (tx_status_var != TX_FREE) {
++ MSG("WARNING: [down] timedout waiting for end of TX\n");
++ }
++ }
++
++ } else {
++ pthread_mutex_unlock(&mx_concent); /* free concentrator ASAP */
++ }
++ wait_ms(1);
+ }
+ MSG("\nINFO: End of downstream thread\n");
+ }
+
diff --git a/recipes-connectivity/lora/lora-packet-forwarder/lora-packet-forwarder-mts-enhancements.patch b/recipes-connectivity/lora/lora-packet-forwarder/lora-packet-forwarder-mts-enhancements.patch
index 2bf82ff..e1da462 100644
--- a/recipes-connectivity/lora/lora-packet-forwarder/lora-packet-forwarder-mts-enhancements.patch
+++ b/recipes-connectivity/lora/lora-packet-forwarder/lora-packet-forwarder-mts-enhancements.patch
@@ -105,11 +105,11 @@ Index: git/basic_pkt_fwd/src/basic_pkt_fwd.c
/* display version informations */
MSG("*** Basic Packet Forwarder for Lora Gateway ***\nVersion: " VERSION_STRING "\n");
-Index: git/gps_pkt_fwd/src/gps_pkt_fwd.c
-===================================================================
---- git.orig/gps_pkt_fwd/src/gps_pkt_fwd.c 2015-04-01 15:14:12.160933893 -0500
-+++ git/gps_pkt_fwd/src/gps_pkt_fwd.c 2015-04-01 15:14:12.280932001 -0500
-@@ -44,6 +44,8 @@
+diff --git a/gps_pkt_fwd/src/gps_pkt_fwd.c b/gps_pkt_fwd/src/gps_pkt_fwd.c
+index 79f7584..3f2f91c 100644
+--- a/gps_pkt_fwd/src/gps_pkt_fwd.c
++++ b/gps_pkt_fwd/src/gps_pkt_fwd.c
+@@ -44,6 +44,8 @@ Maintainer: Sylvain Miermont
#include <netdb.h> /* gai_strerror */
#include <pthread.h>
@@ -118,19 +118,20 @@ Index: git/gps_pkt_fwd/src/gps_pkt_fwd.c
#include "parson.h"
#include "base64.h"
-@@ -539,19 +541,60 @@
+@@ -531,19 +533,65 @@ static double difftimespec(struct timespec end, struct timespec beginning) {
return x;
}
+void usage(char *proc_name) {
-+ fprintf(stderr, "Usage: %s [-c config_dir]\n", proc_name);
++ fprintf(stderr, "Usage: %s [-c config_dir] [-l logfile]\n", proc_name);
+ exit(1);
+}
+
+
-+static char *short_options = "c:h";
++static char *short_options = "c:l:h";
+static struct option long_options[] = {
+ {"config-dir", 1, 0, 'c'},
++ {"logfile", 1, 0, 'l'},
+ {"help", 0, 0, 'h'},
+ {0, 0, 0, 0},
+};
@@ -158,6 +159,7 @@ Index: git/gps_pkt_fwd/src/gps_pkt_fwd.c
+ char global_cfg_path[PATH_MAX] = {0};
+ char local_cfg_path[PATH_MAX] = {0};
+ char debug_cfg_path[PATH_MAX] = {0};
++ char *logfile_path = NULL;
+ char *proc_name = argv[0];
+
+ while((i = getopt_long(argc, argv, short_options, long_options, &opt_ind)) >= 0) {
@@ -168,6 +170,9 @@ Index: git/gps_pkt_fwd/src/gps_pkt_fwd.c
+ strncpy(cfg_dir, optarg, sizeof(cfg_dir)-2);
+ strcat(cfg_dir, "/");
+ break;
++ case 'l':
++ logfile_path = optarg;
++ break;
+ case 'h':
+ usage(proc_name);
+ break;
@@ -184,6 +189,29 @@ Index: git/gps_pkt_fwd/src/gps_pkt_fwd.c
/* threads */
pthread_t thrid_up;
pthread_t thrid_down;
+@@ -589,6 +637,22 @@ int main(void)
+ float up_ack_ratio;
+ float dw_ack_ratio;
+
++ /* redirect stdout, stderr to logfile if specified */
++ int logfile_fd;
++ FILE *logfile = NULL;
++ if (logfile_path) {
++ logfile = fopen(logfile_path, "w");
++ if (logfile) {
++ logfile_fd = fileno(logfile);
++ dup2(logfile_fd, STDOUT_FILENO);
++ dup2(logfile_fd, STDERR_FILENO);
++ }
++ else {
++ printf("Error opening log file %s\n", logfile_path);
++ exit(1);
++ }
++ }
++
+ /* display version informations */
+ MSG("*** GPS Packet Forwarder for Lora Gateway ***\nVersion: " VERSION_STRING "\n");
+ MSG("*** Lora concentrator HAL library version info ***\n%s\n***\n", lgw_version_info());
Index: git/beacon_pkt_fwd/src/beacon_pkt_fwd.c
===================================================================
--- git.orig/beacon_pkt_fwd/src/beacon_pkt_fwd.c 2015-04-01 15:14:12.156933956 -0500
@@ -197,12 +225,12 @@ Index: git/beacon_pkt_fwd/src/beacon_pkt_fwd.c
#include "parson.h"
#include "base64.h"
-@@ -618,19 +620,60 @@
+@@ -618,19 +620,65 @@
return x;
}
+void usage(char *proc_name) {
-+ fprintf(stderr, "Usage: %s [-c config_dir]\n", proc_name);
++ fprintf(stderr, "Usage: %s [-c config_dir] [-l logfile]\n", proc_name);
+ exit(1);
+}
+
@@ -210,6 +238,7 @@ Index: git/beacon_pkt_fwd/src/beacon_pkt_fwd.c
+static char *short_options = "c:h";
+static struct option long_options[] = {
+ {"config-dir", 1, 0, 'c'},
++ {"logfile", 1, 0, 'l'},
+ {"help", 0, 0, 'h'},
+ {0, 0, 0, 0},
+};
@@ -237,6 +266,7 @@ Index: git/beacon_pkt_fwd/src/beacon_pkt_fwd.c
+ char global_cfg_path[PATH_MAX] = {0};
+ char local_cfg_path[PATH_MAX] = {0};
+ char debug_cfg_path[PATH_MAX] = {0};
++ char *logfile_path = NULL;
+ char *proc_name = argv[0];
+
+ while((i = getopt_long(argc, argv, short_options, long_options, &opt_ind)) >= 0) {
@@ -247,6 +277,9 @@ Index: git/beacon_pkt_fwd/src/beacon_pkt_fwd.c
+ strncpy(cfg_dir, optarg, sizeof(cfg_dir)-2);
+ strcat(cfg_dir, "/");
+ break;
++ case 'l':
++ logfile_path = optarg;
++ break;
+ case 'h':
+ usage(proc_name);
+ break;
@@ -263,3 +296,26 @@ Index: git/beacon_pkt_fwd/src/beacon_pkt_fwd.c
/* threads */
pthread_t thrid_up;
pthread_t thrid_down;
+@@ -767,6 +715,22 @@
+ float rx_nocrc_ratio;
+ float up_ack_ratio;
+ float dw_ack_ratio;
++
++ /* redirect stdout, stderr to logfile if specified */
++ int logfile_fd;
++ FILE *logfile = NULL;
++ if (logfile_path) {
++ logfile = fopen(logfile_path, "w");
++ if (logfile) {
++ logfile_fd = fileno(logfile);
++ dup2(logfile_fd, STDOUT_FILENO);
++ dup2(logfile_fd, STDERR_FILENO);
++ }
++ else {
++ printf("Error opening log file %s\n", logfile_path);
++ exit(1);
++ }
++ }
+
+ /* display version informations */
+ MSG("*** Beacon Packet Forwarder for Lora Gateway ***\nVersion: " VERSION_STRING "\n");
diff --git a/recipes-connectivity/lora/lora-packet-forwarder/lora-packet-forwarder-skip-bad-packets.patch b/recipes-connectivity/lora/lora-packet-forwarder/lora-packet-forwarder-skip-bad-packets.patch
index cb12a97..eb9450f 100644
--- a/recipes-connectivity/lora/lora-packet-forwarder/lora-packet-forwarder-skip-bad-packets.patch
+++ b/recipes-connectivity/lora/lora-packet-forwarder/lora-packet-forwarder-skip-bad-packets.patch
@@ -52,3 +52,58 @@ Index: git/basic_pkt_fwd/src/basic_pkt_fwd.c
}
/* Packet RSSI, payload size, 18-23 useful chars */
+
+diff --git a/gps_pkt_fwd/src/gps_pkt_fwd.c b/gps_pkt_fwd/src/gps_pkt_fwd.c
+index 79f7584..933de29 100644
+--- a/gps_pkt_fwd/src/gps_pkt_fwd.c
++++ b/gps_pkt_fwd/src/gps_pkt_fwd.c
+@@ -1107,7 +1107,8 @@ void thread_up(void) {
+ MSG("ERROR: [up] received packet with unknown status\n");
+ memcpy((void *)(buff_up + buff_index), (void *)",\"stat\":?", 9);
+ buff_index += 9;
+- exit(EXIT_FAILURE);
++ continue; // skip packet
++ //exit(EXIT_FAILURE);
+ }
+
+ /* Packet modulation, 13-14 useful chars */
+@@ -1145,7 +1146,8 @@ void thread_up(void) {
+ MSG("ERROR: [up] lora packet with unknown datarate\n");
+ memcpy((void *)(buff_up + buff_index), (void *)",\"datr\":\"SF?", 12);
+ buff_index += 12;
+- exit(EXIT_FAILURE);
++ continue; // skip packet
++ //exit(EXIT_FAILURE);
+ }
+ switch (p->bandwidth) {
+ case BW_125KHZ:
+@@ -1164,7 +1166,8 @@ void thread_up(void) {
+ MSG("ERROR: [up] lora packet with unknown bandwidth\n");
+ memcpy((void *)(buff_up + buff_index), (void *)"BW?\"", 4);
+ buff_index += 4;
+- exit(EXIT_FAILURE);
++ continue; // skip packet
++ //exit(EXIT_FAILURE);
+ }
+
+ /* Packet ECC coding rate, 11-13 useful chars */
+@@ -1193,7 +1196,8 @@ void thread_up(void) {
+ MSG("ERROR: [up] lora packet with unknown coderate\n");
+ memcpy((void *)(buff_up + buff_index), (void *)",\"codr\":\"?\"", 11);
+ buff_index += 11;
+- exit(EXIT_FAILURE);
++ continue; // skip packet
++ //exit(EXIT_FAILURE);
+ }
+
+ /* Lora SNR, 11-13 useful chars */
+@@ -1218,7 +1222,8 @@ void thread_up(void) {
+ }
+ } else {
+ MSG("ERROR: [up] received packet with unknown modulation\n");
+- exit(EXIT_FAILURE);
++ continue; // skip packet
++ //exit(EXIT_FAILURE);
+ }
+
+ /* Packet RSSI, payload size, 18-23 useful chars */
diff --git a/recipes-connectivity/lora/lora-packet-forwarder/lora-packet-forwarder-synch-word.patch b/recipes-connectivity/lora/lora-packet-forwarder/lora-packet-forwarder-synch-word.patch
index 8da6273..2f04eb1 100644
--- a/recipes-connectivity/lora/lora-packet-forwarder/lora-packet-forwarder-synch-word.patch
+++ b/recipes-connectivity/lora/lora-packet-forwarder/lora-packet-forwarder-synch-word.patch
@@ -12,6 +12,18 @@ index 2223b4a..2db6e26 100644
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 */
static char serv_port_down[8] = STR(DEFAULT_PORT_DW); /* server port for downstream traffic */
+@@ -281,6 +282,11 @@ static int parse_SX1301_configuration(const char * conf_file) {
+ MSG("INFO: %s does contain a JSON object named %s, parsing SX1301 parameters\n", conf_file, conf_obj_name);
+ }
+
++ val = json_object_get_value(conf_obj, "lorawan_public"); /* fetch value (if possible) */
++ if (json_value_get_type(val) == JSONBoolean && (bool)json_value_get_boolean(val) == true) {
++ synch_word = 0x34;
++ }
++
+ /* set configuration for RF chains */
+ for (i = 0; i < LGW_RF_CHAIN_NB; ++i) {
+ memset(&rfconf, 0, sizeof rfconf); /* initialize configuration structure */
@@ -404,7 +415,14 @@ static int parse_gateway_configuration(const char * conf_file) {
snprintf(serv_port_down, sizeof serv_port_down, "%u", (uint16_t)json_value_get_number(val));
MSG("INFO: downstream port is configured to \"%s\"\n", serv_port_down);
@@ -39,3 +51,49 @@ index 2223b4a..2db6e26 100644
/* spawn threads to manage upstream and downstream */
i = pthread_create( &thrid_up, NULL, (void * (*)(void *))thread_up, NULL);
if (i != 0) {
+diff --git a/gps_pkt_fwd/src/gps_pkt_fwd.c b/gps_pkt_fwd/src/gps_pkt_fwd.c
+index 79f7584..8addbc0 100644
+--- a/gps_pkt_fwd/src/gps_pkt_fwd.c
++++ b/gps_pkt_fwd/src/gps_pkt_fwd.c
+@@ -108,6 +108,7 @@ static bool fwd_error_pkt = false; /* packets with PAYLOAD CRC ERROR are NOT for
+ static bool fwd_nocrc_pkt = false; /* packets with NO PAYLOAD CRC are NOT forwarded */
+
+ /* network configuration variables */
++static uint8_t synch_word = 0x12;
+ 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 */
+@@ -237,6 +238,11 @@ static int parse_SX1301_configuration(const char * conf_file) {
+ MSG("INFO: %s does contain a JSON object named %s, parsing SX1301 parameters\n", conf_file, conf_obj_name);
+ }
+
++ val = json_object_get_value(conf_obj, "lorawan_public"); /* fetch value (if possible) */
++ if (json_value_get_type(val) == JSONBoolean && (bool)json_value_get_boolean(val) == true) {
++ synch_word = 0x34;
++ }
++
+ /* set configuration for RF chains */
+ for (i = 0; i < LGW_RF_CHAIN_NB; ++i) {
+ memset(&rfconf, 0, sizeof rfconf); /* initialize configuration structure */
+@@ -437,6 +443,12 @@ static int parse_gateway_configuration(const char * conf_file) {
+ MSG("INFO: downstream port is configured to \"%s\"\n", serv_port_down);
+ }
+
++ val = json_object_get_value(conf_obj, "synch_word");
++ if (val != NULL) {
++ synch_word = (uint8_t)json_value_get_number(val);
++ MSG("INFO: synch word is configured to %02x\n", synch_word);
++ }
++
+ /* get keep-alive interval (in seconds) for downstream (optional) */
+ val = json_object_get_value(conf_obj, "keepalive_interval");
+ if (val != NULL) {
+@@ -727,6 +739,8 @@ int main(void)
+ exit(EXIT_FAILURE);
+ }
+
++ lgw_conf_lora_synch_word(synch_word);
++
+ /* spawn threads to manage upstream and downstream */
+ i = pthread_create( &thrid_up, NULL, (void * (*)(void *))thread_up, NULL);
+ if (i != 0) {