Browse Source

Properly propagate destination frames

master
Jeroen Vreeken 5 years ago
parent
commit
3feb8bbd57
3 changed files with 51 additions and 3 deletions
  1. +26
    -1
      fprs_db.c
  2. +6
    -1
      fprs_db.h
  3. +19
    -1
      fprs_parse.c

+ 26
- 1
fprs_db.c View File

@ -26,6 +26,9 @@ struct fprs_db_data {
enum fprs_type type;
uint8_t *data;
size_t datasize;
unsigned int link;
time_t t;
time_t t_valid;
@ -122,7 +125,11 @@ int fprs_db_flush(time_t t)
}
int fprs_db_element_set(struct fprs_db_id *id, enum fprs_type type, time_t t, time_t t_valid, uint8_t *data, size_t datasize)
int fprs_db_element_set(struct fprs_db_id *id,
enum fprs_type type,
time_t t, time_t t_valid,
unsigned int link,
uint8_t *data, size_t datasize)
{
struct fprs_db_entry *entry;
@ -214,3 +221,21 @@ int fprs_db_element_del(struct fprs_db_id *id, enum fprs_type type)
return 0;
}
unsigned int fprs_db_link_get(struct fprs_db_id *id)
{
struct fprs_db_entry *entry;
entry = fprs_db_find(id);
if (!entry || !entry->elements) {
return 0;
}
unsigned int link = 0;
struct fprs_db_data *dentry;
for (dentry = entry->elements; dentry; dentry = dentry->next)
link |= dentry->link;
return link;
}

+ 6
- 1
fprs_db.h View File

@ -38,9 +38,14 @@ struct fprs_db_id {
} id;
};
int fprs_db_element_set(struct fprs_db_id *id, enum fprs_type type, time_t t, time_t t_valid, uint8_t *data, size_t datasize);
int fprs_db_element_set(struct fprs_db_id *id,
enum fprs_type type,
time_t t, time_t t_valid,
unsigned int link,
uint8_t *data, size_t datasize);
int fprs_db_element_get(struct fprs_db_id *id, enum fprs_type type, time_t *t, uint8_t **data, size_t *datasize);
int fprs_db_element_del(struct fprs_db_id *id, enum fprs_type type);
unsigned int fprs_db_link_get(struct fprs_db_id *id);
int fprs_db_flush(time_t t);


+ 19
- 1
fprs_parse.c View File

@ -206,6 +206,7 @@ int fprs_parse_data(void *data, size_t size, struct timespec *recv_time, unsigne
struct fprs_element *fprs_timestamp;
struct fprs_element *fprs_element = NULL;
struct fprs_element *fprs_request;
struct fprs_element *fprs_destination;
struct fprs_db_id id = { 0 }; /* initialize to null for comparison */
bool propagate = false;
time_t t_rx = recv_time->tv_sec;
@ -248,6 +249,23 @@ int fprs_parse_data(void *data, size_t size, struct timespec *recv_time, unsigne
fprs_request_add(&req_id, req_el[i], t_rx, link);
}
}
fprs_destination = fprs_frame_element_by_type(fprs_frame, FPRS_DESTINATION);
if (fprs_destination) {
struct fprs_db_id dest_id = { 0 };
dest_id.type = FPRS_DB_ID_CALLSIGN;
memcpy(dest_id.id.callsign, fprs_element_data(fprs_destination), 6);
unsigned int dest_link = fprs_db_link_get(&dest_id);
if (!dest_link) {
dest_link = FPRS_PARSE_UPLINK;
}
cb(data, size, dest_link, arg);
goto skip;
}
if (!fprs_callsign)
if (fprs_objectname) {
@ -315,7 +333,7 @@ int fprs_parse_data(void *data, size_t size, struct timespec *recv_time, unsigne
}
if (update)
fprs_db_element_set(&id, fprs_type,
t_rx, t_valid, el_data, el_size);
t_rx, t_valid, link, el_data, el_size);
if (prop_el) {
struct fprs_element *p_el = fprs_frame_element_add(
fprs_frame_prop, fprs_type, el_size);


Loading…
Cancel
Save