Signed-off-by: Robert Marshall KI4MCW <ki4mcw@gmail.com>
authorbatt <batt@38d2e660-2303-0410-9eaa-f027e97ec537>
Tue, 7 Dec 2010 11:04:38 +0000 (11:04 +0000)
committerbatt <batt@38d2e660-2303-0410-9eaa-f027e97ec537>
Tue, 7 Dec 2010 11:04:38 +0000 (11:04 +0000)
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
bertos/net/ax25.h

index 2ea17efb3a8d1d8a9d1d76d97b1637c2a2ff0f27..3bd3e75ce2376c3d7220ee056daae962e3e21917 100644 (file)
 #include <string.h> //memset, memcmp
 #include <ctype.h>  //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
 
index 4eb77f6de0501e6b6c5c84a67a5d1ef3a1dff66a..dd439445465495b37357bff42766af1281bbe39b 100644 (file)
@@ -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