From b88ab4ad33932a6c95702f45ac1b6dac693c74ec Mon Sep 17 00:00:00 2001 From: batt Date: Tue, 7 Dec 2010 11:04:38 +0000 Subject: [PATCH] Signed-off-by: Robert Marshall KI4MCW Patch for the AX.25 module to provide support for the has-been-repeated flag in received frames. This flag is set using the high bit (0x80) of the SSID byte for each call sign in the path. The patch attached here checks for this flag when parsing incoming packets, and (per suggestion from Francesco) stores the flag bit-mapped to a single byte added to the AX25 context. git-svn-id: https://src.develer.com/svnoss/bertos/trunk@4640 38d2e660-2303-0410-9eaa-f027e97ec537 --- bertos/net/ax25.c | 24 ++++++++++++++++++++++-- bertos/net/ax25.h | 8 ++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/bertos/net/ax25.c b/bertos/net/ax25.c index 2ea17efb..3bd3e75c 100644 --- a/bertos/net/ax25.c +++ b/bertos/net/ax25.c @@ -50,6 +50,17 @@ #include //memset, memcmp #include //isalnum, toupper +#if CONFIG_AX25_RPT_LST + #define AX25_SET_REPEATED(msg, idx, val) \ + do \ + { \ + if (val) \ + (msg)->rpt_flags |= BV(idx) ; \ + else \ + (msg)->rpt_flags &= ~BV(idx) ; \ + } while(0) +#endif + #define DECODE_CALL(buf, addr) \ for (unsigned i = 0; i < sizeof((addr)); i++) \ { \ @@ -76,7 +87,12 @@ static void ax25_decode(AX25Ctx *ctx) { DECODE_CALL(buf, msg.rpt_lst[msg.rpt_cnt].call); msg.rpt_lst[msg.rpt_cnt].ssid = (*buf >> 1) & 0x0F; - LOG_INFO("RPT%d[%.6s-%d]\n", msg.rpt_cnt, msg.rpt_lst[msg.rpt_cnt].call, msg.rpt_lst[msg.rpt_cnt].ssid); + AX25_SET_REPEATED(&msg, msg.rpt_cnt, (*buf & 0x80)); + + LOG_INFO("RPT%d[%.6s-%d]%c\n", msg.rpt_cnt, + msg.rpt_lst[msg.rpt_cnt].call, + msg.rpt_lst[msg.rpt_cnt].ssid, + (AX25_REPEATED(&msg, msg.rpt_cnt) ? '*' : ' ')); } #else while (!(*buf++ & 0x01)) @@ -210,6 +226,7 @@ static void ax25_sendCall(AX25Ctx *ctx, const AX25Call *addr, bool last) for (unsigned i = 0; i < sizeof(addr->call) - len; i++) ax25_putchar(ctx, ' ' << 1); + /* The bit7 "has-been-repeated" flag is not implemented here */ /* Bits6:5 should be set to 1 for all SSIDs (0x60) */ /* The bit0 of last call SSID should be set to 1 */ uint8_t ssid = 0x60 | (addr->ssid << 1) | (last ? 0x01 : 0); @@ -282,7 +299,10 @@ void ax25_print(KFile *ch, const AX25Msg *msg) { kfile_putc(',', ch); print_call(ch, &msg->rpt_lst[i]); - // TODO: add * to the trasmitting digi + /* Print a '*' if packet has already been transmitted + * by this repeater */ + if (AX25_REPEATED(msg, i)) + kfile_putc('*', ch); } #endif diff --git a/bertos/net/ax25.h b/bertos/net/ax25.h index 4eb77f6d..dd439445 100644 --- a/bertos/net/ax25.h +++ b/bertos/net/ax25.h @@ -106,6 +106,11 @@ typedef struct AX25Call */ #define AX25_MAX_RPT 8 +/* + * Has to be lesser than 8 in order to fit in one byte + * change AX25Msg.rpt_flags if you need more repeaters. + */ +STATIC_ASSERT(AX25_MAX_RPT <= 8); /** * AX25 Message. @@ -118,6 +123,8 @@ typedef struct AX25Msg #if CONFIG_AX25_RPT_LST AX25Call rpt_lst[AX25_MAX_RPT]; ///< List of repeaters uint8_t rpt_cnt; ///< Number of repeaters in this message + uint8_t rpt_flags; ///< Has-been-repeated flags for each repeater (bit-mapped) + #define AX25_REPEATED(msg, idx) ((msg)->rpt_flags & BV(idx)) #endif uint16_t ctrl; ///< AX25 control field uint8_t pid; ///< AX25 PID field @@ -125,6 +132,7 @@ typedef struct AX25Msg size_t len; ///< Payload length } AX25Msg; + #define AX25_CTRL_UI 0x03 #define AX25_PID_NOLAYER3 0xF0 -- 2.25.1