aboutsummaryrefslogtreecommitdiffstats
path: root/src/nmt
diff options
context:
space:
mode:
authorAndreas Eversberg <jolly@eversberg.eu>2016-07-20 07:51:28 +0200
committerAndreas Eversberg <jolly@eversberg.eu>2016-07-24 12:31:07 +0200
commitefb50532c6bb462fce834706770822a29c517c1b (patch)
tree1217ce7635ea6d9f5a5de5b1986e34d0f9fb6de3 /src/nmt
parent8906deb5dd6fa288852478cdddc8a80fbfb21ad2 (diff)
NMT: Rework on frame (message) types
Diffstat (limited to 'src/nmt')
-rw-r--r--src/nmt/frame.c214
-rw-r--r--src/nmt/frame.h95
-rw-r--r--src/nmt/main.c6
3 files changed, 174 insertions, 141 deletions
diff --git a/src/nmt/frame.c b/src/nmt/frame.c
index 4c7f931..d76418f 100644
--- a/src/nmt/frame.c
+++ b/src/nmt/frame.c
@@ -113,59 +113,61 @@ uint16_t nmt_encode_area_no(uint8_t area_no)
/* NMT Doc 450-1 4.3.2 */
static struct nmt_frame {
+ enum nmt_mt message_type;
const char *digits;
enum nmt_direction direction;
int prefix;
const char *nr;
const char *description;
} nmt_frame[] = {
-/* Digits Dir. Prefix Nr. Description */
-/*0*/ { "NNNPYYHHHHHHHHHH", MTX_TO_MS, 12, "1a", "Calling channel indication" },
-/*1*/ { "NNNPYYHHHHHHHHHH", MTX_TO_MS, 4, "1b", "Combined calling and traffic channel indication" },
-/*2*/ { "NNNPYYZXXXXXXHHH", MTX_TO_MS, 12, "2a", "Call to mobile subscriber on calling channel" },
-/*3*/ { "NNNPYYZXXXXXXnnn", MTX_TO_MS, 12, "2b", "Traffic channel allocation on calling channel" },
-/*4*/ { "NNNPYYZXXXXXXHHH", MTX_TO_MS, 12, "2c", "Queueing information to MS with priority on calling channel" },
-/*5*/ { "NNNPYYZXXXXXXHHH", MTX_TO_MS, 12, "2d", "Traffic channel scanning order on calling channel" },
-/*6*/ { "NNNPYYZXXXXXXHHH", MTX_TO_MS, 12, "2f", "Queuing information to ordinary MS" },
-/*7*/ { "NNNPYYZXXXXXXnnn", MTX_TO_MS, 5, "3a", "Traffic channel allocation on traffic channel" },
-/*8*/ { "NNNPYYZXXXXXXHHH", MTX_TO_MS, 5, "3b", "Identity request on traffic channel" },
-/*9*/ { "NNNPYYZXXXXXXnnn", MTX_TO_MS, 9, "3c", "Traffic channel allocation on traffic channel, short procedure" },
-/*10*/ { "NNNPYYJJJJJJJHHH", MTX_TO_MS, 3, "4", "Free traffic channel indication" },
-/*11*/ { "NNNPYYZXXXXXXLLL", MTX_TO_MS, 6, "5a", "Line signal" },
-/*12*/ { "NNNPYYZXXXXXXLQQ", MTX_TO_MS, 6, "5b", "Line signal: Answer to coin-box" },
-/*13*/ { "JJJPJJJJJJJJJJJJ", MTX_TO_XX, 0, "6", "Idle frame" },
-/*14*/ { "NNNPYYCCCCCCCJJJ", MTX_TO_MS, 8, "7", "Authentication request" },
-/*15*/ { "NNNPZXXXXXXTJJJJ", MS_TO_MTX, 1, "10a", "Call acknowledgement from MS on calling channel (shortened frame)" },
-/*16*/ { "NNNPZXXXXXXTYKKK", MS_TO_MTX, 1, "10b", "Seizure from ordinary MS and identity on traffic channel" },
-/*17*/ { "NNNPZXXXXXXTYKKK", MS_TO_MTX, 6, "10c", "Seizure and identity from called MS on traffic channel" },
-/*18*/ { "NNNPZXXXXXXTYKKK", MS_TO_MTX, 14, "11a", "Roaming updating seizure and identity on traffic channel" },
-/*19*/ { "NNNPZXXXXXXTYKKK", MS_TO_MTX, 15, "11b", "Seizure and call achnowledgement on calling channel from MS with priority (shortened frame)" },
-/*20*/ { "NNNPZXXXXXXTYKKK", MS_TO_MTX, 11, "12", "Seizure from coin-box on traffic channel" },
-/*21*/ { "NNNPZXXXXXXLLLLL", MS_TO_MTX, 8, "13a", "Line signal" },
-/*22*/ { "NNNPZXXXXXXLLLQQ", MS_TO_MTX, 8, "13b", "Line signal: Answer acknowledgement from coin box" },
-/*23*/ { "NNNPZXXXXXXSSSSS", MS_TO_MTX, 7, "14a", "Digit signal (1st, 3rd, 5th ........digit)" },
-/*24*/ { "NNNPZXXXXXXSSSSS", MS_TO_MTX, 7, "14b", "Digit signal (2nd, 4th, 6th ........digit)" },
-/*25*/ { "JJJPJJJJJJJJJJJJ", XX_TO_MTX, 0, "15", "Idle frame" },
-/*26*/ { "NNNPRRRRRRRRRRRR", MS_TO_MTX, 12, "16", "Signed response" },
-/*27*/ { "NNNPYYZJJJAfffff", MTX_TO_BS, 15, "20", "Channel activation order" },
-/*28*/ { "NNNPYYZJJJAJJJJJ", MTX_TO_BS, 15, "20", "Channel activation order" },
-/*29*/ { "NNNPYYZJJJAfffff", MTX_TO_BS, 15, "20", "Channel activation order" },
-/*30*/ { "NNNPYYZJJJAlllff", MTX_TO_BS, 15, "20", "Channel activation order" },
-/*31*/ { "NNNPYYZJJJAlllJJ", MTX_TO_BS, 15, "20", "Channel activation order" },
-/*32*/ { "NNNPYYZJJJVJJnnn", MTX_TO_BS, 3, "21b", "Signal strength measurement order on data channel or idle or free marked traffic channel" },
-/*33*/ { "NNNPYYZJJJVJJnnn", MTX_TO_BS, 5, "21c", "Signal strength measurement order on traffic actually used" },
-/*34*/ { "NNNPYYZJJJVVVVVV", MTX_TO_BS, 14, "22", "Order management/maintenance order on idle channel or data channel" },
-/*35*/ { "NNNPZJJAJJJJJJJJ", BS_TO_MTX, 9, "25", "Channel status information" },
-/*36*/ { "NNNPZJJAJJJfllJJ", BS_TO_MTX, 9, "25", "Channel status information" },
-/*37*/ { "NNNPZJJAJJJJllJJ", BS_TO_MTX, 9, "25", "Channel status information" },
-/*38*/ { "NNNPZJJAJJJcccJJ", BS_TO_MTX, 9, "25", "Channel status information" },
-/*39*/ { "NNNPZJJnnnrrrrrr", BS_TO_MTX, 2, "26", "Signal strength measurement result" },
-/*40*/ { "NNNPZJJVVVVJJJJJ", BS_TO_MTX, 4, "27", "Response on other management/maintenance order on idle channel or data channel" },
-/*41*/ { "NNNPZJJVVVVJJJJJ", BS_TO_MTX, 13, "28", "Other maintenance information from BS" },
-/*42*/ { "NNNPYYJJJJJJJHHH", MTX_TO_MS, 10, "30", "Test channel indication" },
-/*43*/ { "---P------------", MTX_TO_XX, 0, "", "illegal (Spare)" },
-/*44*/ { "---P------------", XX_TO_MTX, 0, "", "illegal (Spare)" },
- { NULL, 0, 0, NULL, NULL }
+/* Define Digits Dir. Prefix Nr. Description */
+ { NMT_MESSAGE_1a, "NNNPYYHHHHHHHHHH", MTX_TO_MS, 12, "1a", "Calling channel indication" },
+ { NMT_MESSAGE_1b, "NNNPYYHHHHHHHHHH", MTX_TO_MS, 4, "1b", "Combined calling and traffic channel indication" },
+ { NMT_MESSAGE_2a, "NNNPYYZXXXXXXHHH", MTX_TO_MS, 12, "2a", "Call to mobile subscriber on calling channel" },
+ { NMT_MESSAGE_2b, "NNNPYYZXXXXXXnnn", MTX_TO_MS, 12, "2b", "Traffic channel allocation on calling channel" },
+ { NMT_MESSAGE_2c, "NNNPYYZXXXXXXHHH", MTX_TO_MS, 12, "2c", "Queueing information to MS with priority on calling channel" },
+ { NMT_MESSAGE_2d, "NNNPYYZXXXXXXHHH", MTX_TO_MS, 12, "2d", "Traffic channel scanning order on calling channel" },
+ { NMT_MESSAGE_2f, "NNNPYYZXXXXXXHHH", MTX_TO_MS, 12, "2f", "Queuing information to ordinary MS" },
+ { NMT_MESSAGE_3a, "NNNPYYZXXXXXXnnn", MTX_TO_MS, 5, "3a", "Traffic channel allocation on traffic channel" },
+ { NMT_MESSAGE_3b, "NNNPYYZXXXXXXHHH", MTX_TO_MS, 5, "3b", "Identity request on traffic channel" },
+ { NMT_MESSAGE_3c, "NNNPYYZXXXXXXnnn", MTX_TO_MS, 9, "3c", "Traffic channel allocation on traffic channel, short procedure" },
+ { NMT_MESSAGE_4, "NNNPYYJJJJJJJHHH", MTX_TO_MS, 3, "4", "Free traffic channel indication" },
+ { NMT_MESSAGE_5a, "NNNPYYZXXXXXXLLL", MTX_TO_MS, 6, "5a", "Line signal" },
+ { NMT_MESSAGE_5b, "NNNPYYZXXXXXXLQQ", MTX_TO_MS, 6, "5b", "Line signal: Answer to coin-box" },
+ { NMT_MESSAGE_6, "JJJPJJJJJJJJJJJJ", MTX_TO_XX, 0, "6", "Idle frame" },
+ { NMT_MESSAGE_7, "NNNPYYCCCCCCCJJJ", MTX_TO_MS, 8, "7", "Authentication request" },
+ { NMT_MESSAGE_8, "NNNPYYMHHHHHHHWW", MTX_TO_MS, 1, "8", "A-subscriber number" },
+ { NMT_MESSAGE_10a, "NNNPZXXXXXXTJJJJ", MS_TO_MTX, 1, "10a", "Call acknowledgement from MS on calling channel (shortened frame)" },
+ { NMT_MESSAGE_10b, "NNNPZXXXXXXTYKKK", MS_TO_MTX, 1, "10b", "Seizure from ordinary MS and identity on traffic channel" },
+ { NMT_MESSAGE_10c, "NNNPZXXXXXXTYKKK", MS_TO_MTX, 6, "10c", "Seizure and identity from called MS on traffic channel" },
+ { NMT_MESSAGE_11a, "NNNPZXXXXXXTYKKK", MS_TO_MTX, 14, "11a", "Roaming updating seizure and identity on traffic channel" },
+ { NMT_MESSAGE_11b, "NNNPZXXXXXXTYKKK", MS_TO_MTX, 15, "11b", "Seizure and call achnowledgement on calling channel from MS with priority (shortened frame)" },
+ { NMT_MESSAGE_12, "NNNPZXXXXXXTYKKK", MS_TO_MTX, 11, "12", "Seizure from coin-box on traffic channel" },
+ { NMT_MESSAGE_13a, "NNNPZXXXXXXLLLLL", MS_TO_MTX, 8, "13a", "Line signal" },
+ { NMT_MESSAGE_13b, "NNNPZXXXXXXLLLQQ", MS_TO_MTX, 8, "13b", "Line signal: Answer acknowledgement from coin box" },
+ { NMT_MESSAGE_14a, "NNNPZXXXXXXSSSSS", MS_TO_MTX, 7, "14a", "Digit signal (1st, 3rd, 5th ........digit)" },
+ { NMT_MESSAGE_14b, "NNNPZXXXXXXSSSSS", MS_TO_MTX, 7, "14b", "Digit signal (2nd, 4th, 6th ........digit)" },
+ { NMT_MESSAGE_15, "JJJPJJJJJJJJJJJJ", XX_TO_MTX, 0, "15", "Idle frame" },
+ { NMT_MESSAGE_16, "NNNPRRRRRRRRRRRR", MS_TO_MTX, 12, "16", "Signed response" },
+ { NMT_MESSAGE_20_1, "NNNPYYZJJJAfffff", MTX_TO_BS, 15, "20", "Channel activation order" },
+ { NMT_MESSAGE_20_2, "NNNPYYZJJJAJJJJJ", MTX_TO_BS, 15, "20", "Channel activation order" },
+ { NMT_MESSAGE_20_3, "NNNPYYZJJJAfffff", MTX_TO_BS, 15, "20", "Channel activation order" },
+ { NMT_MESSAGE_20_4, "NNNPYYZJJJAlllff", MTX_TO_BS, 15, "20", "Channel activation order" },
+ { NMT_MESSAGE_20_5, "NNNPYYZJJJAlllJJ", MTX_TO_BS, 15, "20", "Channel activation order" },
+ { NMT_MESSAGE_21b, "NNNPYYZJJJVJJnnn", MTX_TO_BS, 3, "21b", "Signal strength measurement order on data channel or idle or free marked traffic channel" },
+ { NMT_MESSAGE_21c, "NNNPYYZJJJVJJnnn", MTX_TO_BS, 5, "21c", "Signal strength measurement order on traffic actually used" },
+ { NMT_MESSAGE_22, "NNNPYYZJJJVVVVVV", MTX_TO_BS, 14, "22", "Order management/maintenance order on idle channel or data channel" },
+ { NMT_MESSAGE_25_1, "NNNPZJJAJJJJJJJJ", BS_TO_MTX, 9, "25", "Channel status information" },
+ { NMT_MESSAGE_25_2, "NNNPZJJAJJJfllJJ", BS_TO_MTX, 9, "25", "Channel status information" },
+ { NMT_MESSAGE_25_3, "NNNPZJJAJJJJllJJ", BS_TO_MTX, 9, "25", "Channel status information" },
+ { NMT_MESSAGE_25_4, "NNNPZJJAJJJcccJJ", BS_TO_MTX, 9, "25", "Channel status information" },
+ { NMT_MESSAGE_26, "NNNPZJJnnnrrrrrr", BS_TO_MTX, 2, "26", "Signal strength measurement result" },
+ { NMT_MESSAGE_27, "NNNPZJJVVVVJJJJJ", BS_TO_MTX, 4, "27", "Response on other management/maintenance order on idle channel or data channel" },
+ { NMT_MESSAGE_28, "NNNPZJJVVVVJJJJJ", BS_TO_MTX, 13, "28", "Other maintenance information from BS" },
+ { NMT_MESSAGE_30, "NNNPYYJJJJJJJHHH", MTX_TO_MS, 10, "30", "Test channel indication" },
+ { NMT_MESSAGE_UKN_MTX, "---P------------", MTX_TO_XX, 0, "", "illegal (Spare)" },
+ { NMT_MESSAGE_UKN_B, "---P------------", XX_TO_MTX, 0, "", "illegal (Spare)" },
+ { 0, NULL, 0, 0, NULL, NULL }
};
/* store actual number of frames for run-time range check */
@@ -395,11 +397,13 @@ static struct nmt_parameter {
{ 'R', "Signed response", param_hex },
{ 'l', "Limit strength evaluation", param_hex },
{ 'c', "c", param_hex },
+ { 'M', "Sequence Number", param_integer },
+ { 'W', "Checksum", param_hex },
{ 0, NULL }
};
/* Depending on P-value, direction and additional info, frame index (used for
- * nmt_frame[]) is recoded.
+ * nmt_frame[]) is decoded.
*/
static int decode_frame_index(const uint8_t *digits, enum nmt_direction direction, int callack)
{
@@ -407,151 +411,151 @@ static int decode_frame_index(const uint8_t *digits, enum nmt_direction directio
/* MS/BS TO MTX */
switch (digits[3]) {
case 0:
- return 25;
+ return NMT_MESSAGE_15;
case 1:
if (callack)
- return 15;
- return 16;
+ return NMT_MESSAGE_10a;
+ return NMT_MESSAGE_10b;
case 2:
- return 39;
+ return NMT_MESSAGE_26;
case 3:
break;
case 4:
- return 40;
+ return NMT_MESSAGE_27;
case 5:
break;
case 6:
- return 17;
+ return NMT_MESSAGE_10c;
case 7:
if (digits[11] == 0)
- return 23;
+ return NMT_MESSAGE_14a;
if (digits[11] == 15)
- return 24;
+ return NMT_MESSAGE_14b;
return -1;
case 8:
if (digits[11] == 2)
- return 22;
- return 21;
+ return NMT_MESSAGE_13b;
+ return NMT_MESSAGE_13a;
case 9:
switch((digits[13] << 8) + (digits[14] << 4) + digits[15]) {
case 2:
case 6:
- return 36;
+ return NMT_MESSAGE_25_2;
case 14:
- return 37;
+ return NMT_MESSAGE_25_3;
case 7:
case 8:
- return 38;
+ return NMT_MESSAGE_25_4;
default:
- return 35;
+ return NMT_MESSAGE_25_1;
}
case 10:
break;
case 11:
- return 20;
+ return NMT_MESSAGE_12;
case 12:
- return 26;
+ return NMT_MESSAGE_16;
case 13:
- return 41;
+ return NMT_MESSAGE_28;
case 14:
- return 18;
+ return NMT_MESSAGE_11a;
case 15:
- return 19;
+ return NMT_MESSAGE_11b;
}
- return 44;
+ return NMT_MESSAGE_UKN_B;
} else {
/* MTX to MS/BS */
switch (digits[3]) {
case 0:
- return 13;
+ return NMT_MESSAGE_6;
case 1:
- break;
+ return NMT_MESSAGE_8;
case 2:
break;
case 3:
if (digits[6] == 15)
- return 32;
- return 10;
+ return NMT_MESSAGE_21b;
+ return NMT_MESSAGE_4;
case 4:
- return 1;
+ return NMT_MESSAGE_1b;
case 5:
if (digits[6] == 15)
- return 33;
+ return NMT_MESSAGE_21c;
switch((digits[13] << 8) + (digits[14] << 4) + digits[15]) {
case 0x3f3:
case 0x3f4:
case 0x3f5:
case 0x3f6:
case 0x000:
- return 8;
+ return NMT_MESSAGE_3b;
default:
- return 7;
+ return NMT_MESSAGE_3a;
}
case 6:
if (digits[13] == 0)
- return 12;
- return 11;
+ return NMT_MESSAGE_5b;
+ return NMT_MESSAGE_5a;
case 7:
break;
case 8:
- return 14;
+ return NMT_MESSAGE_7;
case 9:
- return 9;
+ return NMT_MESSAGE_3c;
case 10:
- return 42;
+ return NMT_MESSAGE_30;
case 11:
break;
case 12:
/* no subscriber */
if (digits[6] == 0)
- return 0;
+ return NMT_MESSAGE_1a;
/* battery saving */
if (digits[6] == 14)
- return 0;
+ return NMT_MESSAGE_1a;
/* info to BS (should not happen here) */
if (digits[6] == 15)
- return 0;
+ return NMT_MESSAGE_1a;
switch((digits[13] << 8) + (digits[14] << 4) + digits[15]) {
case 0x3f3:
case 0x3f4:
case 0x3f5:
case 0x3f6:
case 0x000:
- return 2;
+ return NMT_MESSAGE_2a;
case 0x3f0:
- return 6;
+ return NMT_MESSAGE_2f;
case 0x3f1:
- return 4;
+ return NMT_MESSAGE_2c;
case 0x3f2:
- return 5;
+ return NMT_MESSAGE_2d;
default:
- return 3;
+ return NMT_MESSAGE_2b;
}
case 13:
break;
case 14:
if (digits[13] != 15)
break;
- return 34;
+ return NMT_MESSAGE_22;
case 15:
if (digits[13] != 15)
break;
switch (digits[10]) {
case 3:
- return 27;
+ return NMT_MESSAGE_20_1;
case 6:
case 13:
- return 29;
+ return NMT_MESSAGE_20_3;
case 7:
case 14:
- return 30;
+ return NMT_MESSAGE_20_4;
case 15:
- return 31;
+ return NMT_MESSAGE_20_5;
default:
- return 28;
+ return NMT_MESSAGE_20_2;
}
}
- return 43;
+ return NMT_MESSAGE_UKN_MTX;
}
}
@@ -562,6 +566,12 @@ int init_frame(void)
/* check if all digits actually exist */
for (i = 0; nmt_frame[i].digits; i++) {
+ /* check mesage type */
+ if (nmt_frame[i].message_type != i) {
+ PDEBUG(DFRAME, DEBUG_ERROR, "Message type at message index #%d does not have a value of %d, but has %d, please fix!\n", i, i + 1, nmt_frame[i].message_type);
+ return -1;
+ }
+ /* check IEs */
for (j = 0; j < 16; j++) {
digit = nmt_frame[i].digits[j];
if (digit == '-')
@@ -677,6 +687,12 @@ static void disassemble_frame(frame_t *frame, const uint8_t *digits, enum nmt_di
case 'c':
frame->c = value;
break;
+ case 'M':
+ frame->seq_number = value;
+ break;
+ case 'W':
+ frame->checksum = value;
+ break;
default:
PDEBUG(DFRAME, DEBUG_ERROR, "Digit '%c' does not exist, please fix!\n", digit);
abort();
@@ -796,6 +812,12 @@ static void assemble_frame(frame_t *frame, uint8_t *digits, int debug)
case 'c':
value = frame->c;
break;
+ case 'M':
+ value = frame->seq_number;
+ break;
+ case 'W':
+ value = frame->checksum;
+ break;
default:
PDEBUG(DFRAME, DEBUG_ERROR, "Digit '%c' does not exist, please fix!\n", digit);
abort();
diff --git a/src/nmt/frame.h b/src/nmt/frame.h
index 4130568..adc7a3d 100644
--- a/src/nmt/frame.h
+++ b/src/nmt/frame.h
@@ -1,48 +1,53 @@
-#define NMT_MESSAGE_1a 0
-#define NMT_MESSAGE_1b 1
-#define NMT_MESSAGE_2a 2
-#define NMT_MESSAGE_2b 3
-#define NMT_MESSAGE_2c 4
-#define NMT_MESSAGE_2d 5
-#define NMT_MESSAGE_2f 6
-#define NMT_MESSAGE_3a 7
-#define NMT_MESSAGE_3b 8
-#define NMT_MESSAGE_3c 9
-#define NMT_MESSAGE_4 10
-#define NMT_MESSAGE_5a 11
-#define NMT_MESSAGE_5b 12
-#define NMT_MESSAGE_6 13
-#define NMT_MESSAGE_7 14
-#define NMT_MESSAGE_10a 15
-#define NMT_MESSAGE_10b 16
-#define NMT_MESSAGE_10c 17
-#define NMT_MESSAGE_11a 18
-#define NMT_MESSAGE_11b 19
-#define NMT_MESSAGE_12 20
-#define NMT_MESSAGE_13a 21
-#define NMT_MESSAGE_13b 22
-#define NMT_MESSAGE_14a 23
-#define NMT_MESSAGE_14b 24
-#define NMT_MESSAGE_15 25
-#define NMT_MESSAGE_16 26
-#define NMT_MESSAGE_20a 27
-#define NMT_MESSAGE_20b 28
-#define NMT_MESSAGE_20c 29
-#define NMT_MESSAGE_20d 30
-#define NMT_MESSAGE_20e 31
-#define NMT_MESSAGE_21b 32
-#define NMT_MESSAGE_21c 33
-#define NMT_MESSAGE_22 34
-#define NMT_MESSAGE_25a 35
-#define NMT_MESSAGE_25b 36
-#define NMT_MESSAGE_25c 37
-#define NMT_MESSAGE_25d 38
-#define NMT_MESSAGE_26 39
-#define NMT_MESSAGE_27 40
-#define NMT_MESSAGE_28 41
-#define NMT_MESSAGE_30 42
-
+enum nmt_mt {
+ NMT_MESSAGE_1a = 0,
+ NMT_MESSAGE_1b,
+ NMT_MESSAGE_2a,
+ NMT_MESSAGE_2b,
+ NMT_MESSAGE_2c,
+ NMT_MESSAGE_2d,
+ NMT_MESSAGE_2f,
+ NMT_MESSAGE_3a,
+ NMT_MESSAGE_3b,
+ NMT_MESSAGE_3c,
+ NMT_MESSAGE_4,
+ NMT_MESSAGE_5a,
+ NMT_MESSAGE_5b,
+ NMT_MESSAGE_6,
+ NMT_MESSAGE_7,
+ NMT_MESSAGE_8,
+ NMT_MESSAGE_10a,
+ NMT_MESSAGE_10b,
+ NMT_MESSAGE_10c,
+ NMT_MESSAGE_11a,
+ NMT_MESSAGE_11b,
+ NMT_MESSAGE_12,
+ NMT_MESSAGE_13a,
+ NMT_MESSAGE_13b,
+ NMT_MESSAGE_14a,
+ NMT_MESSAGE_14b,
+ NMT_MESSAGE_15,
+ NMT_MESSAGE_16,
+ NMT_MESSAGE_20_1,
+ NMT_MESSAGE_20_2,
+ NMT_MESSAGE_20_3,
+ NMT_MESSAGE_20_4,
+ NMT_MESSAGE_20_5,
+ NMT_MESSAGE_21b,
+ NMT_MESSAGE_21c,
+ NMT_MESSAGE_22,
+ NMT_MESSAGE_25_1,
+ NMT_MESSAGE_25_2,
+ NMT_MESSAGE_25_3,
+ NMT_MESSAGE_25_4,
+ NMT_MESSAGE_26,
+ NMT_MESSAGE_27,
+ NMT_MESSAGE_28,
+ NMT_MESSAGE_30,
+ NMT_MESSAGE_UKN_MTX,
+ NMT_MESSAGE_UKN_B,
+};
+
typedef struct frame {
uint8_t index;
uint16_t channel_no;
@@ -66,6 +71,8 @@ typedef struct frame {
uint64_t sres;
uint16_t limit_strength_eval;
uint16_t c;
+ uint8_t seq_number;
+ uint16_t checksum;
} frame_t;
int init_frame(void);
diff --git a/src/nmt/main.c b/src/nmt/main.c
index 56470db..b29bb2b 100644
--- a/src/nmt/main.c
+++ b/src/nmt/main.c
@@ -323,7 +323,11 @@ int main(int argc, char *argv[])
return -1;
}
}
- init_frame();
+ rc = init_frame();
+ if (rc < 0) {
+ fprintf(stderr, "Failed to setup frames. Quitting!\n");
+ return -1;
+ }
dsp_init();
rc = call_init(station_id, call_sounddev, samplerate, latency, 7, loopback);
if (rc < 0) {