diff --git a/config.c b/config.c index 8c74c0d..d745ccd 100644 --- a/config.c +++ b/config.c @@ -869,6 +869,7 @@ void config_init (char *fname, struct audio_s *p_audio_config, p_igate_config->tx_limit_1 = IGATE_TX_LIMIT_1_DEFAULT; p_igate_config->tx_limit_5 = IGATE_TX_LIMIT_5_DEFAULT; p_igate_config->igmsp = 1; + p_igate_config->rx2ig_dedupe_time = IGATE_RX2IG_DEDUPE_TIME; /* People find this confusing. */ @@ -2234,10 +2235,18 @@ void config_init (char *fname, struct audio_s *p_audio_config, t = split(NULL,0); } else if (strcasecmp(t, "DROP") == 0) { + text_color_set(DW_COLOR_ERROR); + dw_printf ("Config file, line %d: Preemptive digipeating DROP option is discouraged.\n", line); + dw_printf ("It can create a via path which is misleading about the actual path taken.\n"); + dw_printf ("TRACE is the best choice for this feature.\n"); p_digi_config->preempt[from_chan][to_chan] = PREEMPT_DROP; t = split(NULL,0); } else if (strcasecmp(t, "MARK") == 0) { + text_color_set(DW_COLOR_ERROR); + dw_printf ("Config file, line %d: Preemptive digipeating MARK option is discouraged.\n", line); + dw_printf ("It can create a via path which is misleading about the actual path taken.\n"); + dw_printf ("TRACE is the best choice for this feature.\n"); p_digi_config->preempt[from_chan][to_chan] = PREEMPT_MARK; t = split(NULL,0); } @@ -4160,13 +4169,13 @@ void config_init (char *fname, struct audio_s *p_audio_config, p_igate_config->igmsp = n; } else { - p_igate_config->satgate_delay = 1; + p_igate_config->igmsp = 1; text_color_set(DW_COLOR_ERROR); dw_printf ("Line %d: Unreasonable number of times for message sender position. Using default 1.\n", line); } } else { - p_igate_config->satgate_delay = 1; + p_igate_config->igmsp = 1; text_color_set(DW_COLOR_ERROR); dw_printf ("Line %d: Missing number of times for message sender position. Using default 1.\n", line); } @@ -4182,6 +4191,9 @@ void config_init (char *fname, struct audio_s *p_audio_config, else if (strcasecmp(t, "SATGATE") == 0) { + text_color_set(DW_COLOR_INFO); + dw_printf ("Line %d: SATGATE is pretty useless and will be removed in a future version.\n", line); + t = split(NULL,0); if (t != NULL) { diff --git a/doc/Successful-APRS-IGate-Operation.pdf b/doc/Successful-APRS-IGate-Operation.pdf index e0ebf95..26f8d24 100644 Binary files a/doc/Successful-APRS-IGate-Operation.pdf and b/doc/Successful-APRS-IGate-Operation.pdf differ diff --git a/doc/User-Guide.pdf b/doc/User-Guide.pdf index 867fff6..39d6385 100644 Binary files a/doc/User-Guide.pdf and b/doc/User-Guide.pdf differ diff --git a/igate.c b/igate.c index 5e0037d..af2bbda 100644 --- a/igate.c +++ b/igate.c @@ -33,6 +33,9 @@ * APRS iGate properties * http://wiki.ham.fi/APRS_iGate_properties * + * Notes to iGate developers + * https://github.com/hessu/aprsc/blob/master/doc/IGATE-HINTS.md#igates-dropping-duplicate-packets-unnecessarily + * * SATgate mode. * http://www.tapr.org/pipermail/aprssig/2016-January/045283.html * @@ -1959,9 +1962,37 @@ static void maybe_xmit_packet_from_igate (char *message, int to_chan) * There is a 1 / 65536 chance of getting a false positive match * which is good enough for this application. * + * + * Original thinking: + * + * Occasionally someone will get on one of the discussion groups and say: + * I don't think my IGate is working. I look at packets, from local stations, + * on aprs.fi or findu.com, and they are always through some other IGate station, + * never mine. + * Then someone has to explain, this is not a valid strategy for analyzing + * everything going thru the network. The APRS-IS servers drop duplicate + * packets (ignoring the via path) within a 30 second period. If some + * other IGate gets the same thing there a millisecond faster than you, + * the one you send is discarded. + * In this scenario, it would make sense to perform additional duplicate + * suppression before forwarding RF packets to the Server. + * I don't recall if I saw some specific recommendation to do this or if + * it just seemed like the obvious thing to do to avoid sending useless + * stuff that would just be discarded anyhow. It seems others came to the + * same conclusion. http://www.tapr.org/pipermail/aprssig/2016-July/045907.html + * + * Version 1.5: Rethink strategy. + * + * Issue 85, https://github.com/wb2osz/direwolf/issues/85 , + * got me thinking about this some more. Sending more information will + * allow the APRS-IS servers to perform future additional network analysis. + * To make a long story short, the RF>IS direction duplicate checking + * is now disabled. The code is still there in case I change my mind + * and want to add a configuration option to allow it. The dedupe + * time is set to 0 which means don't do the checking. + * *--------------------------------------------------------------------*/ -#define RX2IG_DEDUPE_TIME 60 /* Do not send duplicate within 60 seconds. */ #define RX2IG_HISTORY_MAX 30 /* Remember the last 30 sent to IGate server. */ static int rx2ig_insert_next; @@ -1982,6 +2013,12 @@ static void rx_to_ig_init (void) static void rx_to_ig_remember (packet_t pp) { +// No need to save the information if we are not doing duplicate checking. + + if (save_igate_config_p->rx2ig_dedupe_time == 0) { + return; + } + rx2ig_time_stamp[rx2ig_insert_next] = time(NULL); rx2ig_checksum[rx2ig_insert_next] = ax25_dedupe_crc(pp); @@ -2031,8 +2068,21 @@ static int rx_to_ig_allow (packet_t pp) dw_printf ("rx_to_ig_allow? %d \"%s>%s:%s\"\n", crc, src, dest, pinfo); } + +// Do we have duplicate checking at all in the RF>IS direction? + + if (save_igate_config_p->rx2ig_dedupe_time == 0) { + if (s_debug >= 2) { + text_color_set(DW_COLOR_DEBUG); + dw_printf ("rx_to_ig_allow? YES, no dedupe checking\n"); + } + return 1; + } + +// Yes, check for duplicates within certain time. + for (j=0; j= now - RX2IG_DEDUPE_TIME) { + if (rx2ig_checksum[j] == crc && rx2ig_time_stamp[j] >= now - save_igate_config_p->rx2ig_dedupe_time) { if (s_debug >= 2) { text_color_set(DW_COLOR_DEBUG); // could be multiple entries and this might not be the most recent. diff --git a/igate.h b/igate.h index b98e5a9..8203ac7 100644 --- a/igate.h +++ b/igate.h @@ -39,6 +39,9 @@ struct igate_config_s { char t2_passcode[8]; /* Max. 5 digits. Could be "-1". */ char *t2_filter; /* Optional filter for IS -> RF direction. */ + /* This is the "server side" filter. */ + /* A better name would be subscription or something */ + /* like that because we can only ask for more. */ /* * For transmitting. @@ -69,6 +72,11 @@ struct igate_config_s { /* We allow additional flexibility of 0 to disable feature */ /* or a small number to allow more. */ +/* + * Receiver to IS data options. + */ + int rx2ig_dedupe_time; /* seconds. 0 to disable. */ + /* * Special SATgate mode to delay packets heard directly. */ @@ -82,6 +90,10 @@ struct igate_config_s { #define IGATE_TX_LIMIT_5_DEFAULT 20 #define IGATE_TX_LIMIT_5_MAX 80 +#define IGATE_RX2IG_DEDUPE_TIME 0 /* Issue 85. 0 means disable dupe checking in RF>IS direction. */ + /* See comments in rx_to_ig_remember & rx_to_ig_allow. */ + /* Currently there is no configuration setting to change this. */ + #define DEFAULT_SATGATE_DELAY 10 #define MIN_SATGATE_DELAY 5 #define MAX_SATGATE_DELAY 30