mirror of https://github.com/lwvmobile/dsd-fme.git
M17: Fix SRC Values in IP Frame Headers and Decode them;
This commit is contained in:
parent
0feb8dc73c
commit
deb9dbed61
168
src/m17.c
168
src/m17.c
|
|
@ -70,7 +70,7 @@ uint16_t crc16m17(const uint8_t *in, const uint16_t len)
|
||||||
|
|
||||||
void M17decodeCSD(dsd_state * state, unsigned long long int dst, unsigned long long int src)
|
void M17decodeCSD(dsd_state * state, unsigned long long int dst, unsigned long long int src)
|
||||||
{
|
{
|
||||||
//evaluate dst and src, and determine if they need to be converted to calsign
|
//evaluate dst and src, and determine if they need to be converted to callsign
|
||||||
int i;
|
int i;
|
||||||
char c;
|
char c;
|
||||||
|
|
||||||
|
|
@ -1642,13 +1642,13 @@ void encodeM17STR(dsd_opts * opts, dsd_state * state)
|
||||||
pong[0] = 0x50; pong[1] = 0x4F; pong[2] = 0x4E; pong[3] = 0x47;
|
pong[0] = 0x50; pong[1] = 0x4F; pong[2] = 0x4E; pong[3] = 0x47;
|
||||||
eotx[0] = 0x45; eotx[1] = 0x4F; eotx[2] = 0x54; eotx[3] = 0x58; //EOTX is not Standard, but going to send / receive anyways
|
eotx[0] = 0x45; eotx[1] = 0x4F; eotx[2] = 0x54; eotx[3] = 0x58; //EOTX is not Standard, but going to send / receive anyways
|
||||||
|
|
||||||
|
//these values were not loaded correctly before, so just manually handle one and copy to others
|
||||||
|
conn[4] = (src >> 40UL) & 0xFF; conn[5] = (src >> 32UL) & 0xFF; conn[6] = (src >> 24UL) & 0xFF;
|
||||||
|
conn[7] = (src >> 16UL) & 0xFF; conn[8] = (src >> 8UL) & 0xFF; conn[9] = (src >> 0UL) & 0xFF;
|
||||||
for (i = 0; i < 6; i++)
|
for (i = 0; i < 6; i++)
|
||||||
{
|
{
|
||||||
conn[i+4] = (src >> 48-(8*i)) & 0xFF;
|
disc[i+4] = conn[i+4]; ping[i+4] = conn[i+4];
|
||||||
disc[i+4] = (src >> 48-(8*i)) & 0xFF;
|
pong[i+4] = conn[i+4]; eotx[i+4] = conn[i+4];
|
||||||
ping[i+4] = (src >> 48-(8*i)) & 0xFF;
|
|
||||||
pong[i+4] = (src >> 48-(8*i)) & 0xFF;
|
|
||||||
eotx[i+4] = (src >> 48-(8*i)) & 0xFF;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//SEND CONN to reflector
|
//SEND CONN to reflector
|
||||||
|
|
@ -2442,8 +2442,8 @@ void encodeM17STR(dsd_opts * opts, dsd_state * state)
|
||||||
}
|
}
|
||||||
|
|
||||||
//SEND EOTX to reflector
|
//SEND EOTX to reflector
|
||||||
if (use_ip == 1)
|
// if (use_ip == 1)
|
||||||
udp_return = m17_socket_blaster (opts, state, 10, eotx);
|
// udp_return = m17_socket_blaster (opts, state, 10, eotx);
|
||||||
|
|
||||||
//SEND DISC to reflector
|
//SEND DISC to reflector
|
||||||
if (use_ip == 1)
|
if (use_ip == 1)
|
||||||
|
|
@ -2933,13 +2933,13 @@ void encodeM17PKT(dsd_opts * opts, dsd_state * state)
|
||||||
pong[0] = 0x50; pong[1] = 0x4F; pong[2] = 0x4E; pong[3] = 0x47;
|
pong[0] = 0x50; pong[1] = 0x4F; pong[2] = 0x4E; pong[3] = 0x47;
|
||||||
eotx[0] = 0x45; eotx[1] = 0x4F; eotx[2] = 0x54; eotx[3] = 0x58;
|
eotx[0] = 0x45; eotx[1] = 0x4F; eotx[2] = 0x54; eotx[3] = 0x58;
|
||||||
|
|
||||||
|
//these values were not loaded correctly before, so just manually handle one and copy to others
|
||||||
|
conn[4] = (src >> 40UL) & 0xFF; conn[5] = (src >> 32UL) & 0xFF; conn[6] = (src >> 24UL) & 0xFF;
|
||||||
|
conn[7] = (src >> 16UL) & 0xFF; conn[8] = (src >> 8UL) & 0xFF; conn[9] = (src >> 0UL) & 0xFF;
|
||||||
for (i = 0; i < 6; i++)
|
for (i = 0; i < 6; i++)
|
||||||
{
|
{
|
||||||
conn[i+4] = (src >> 48-(8*i)) & 0xFF;
|
disc[i+4] = conn[i+4]; ping[i+4] = conn[i+4];
|
||||||
disc[i+4] = (src >> 48-(8*i)) & 0xFF;
|
pong[i+4] = conn[i+4]; eotx[i+4] = conn[i+4];
|
||||||
ping[i+4] = (src >> 48-(8*i)) & 0xFF;
|
|
||||||
pong[i+4] = (src >> 48-(8*i)) & 0xFF;
|
|
||||||
eotx[i+4] = (src >> 48-(8*i)) & 0xFF;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//SEND CONN to reflector
|
//SEND CONN to reflector
|
||||||
|
|
@ -3420,6 +3420,9 @@ void processM17IPF(dsd_opts * opts, dsd_state * state)
|
||||||
uint8_t eotx[4] = {0x45, 0x4F, 0x54, 0x58}; //EOTX is not Standard, but going to send / receive anyways
|
uint8_t eotx[4] = {0x45, 0x4F, 0x54, 0x58}; //EOTX is not Standard, but going to send / receive anyways
|
||||||
uint8_t mpkt[4] = {0x4D, 0x50, 0x4B, 0x54}; //MPKT is not Standard, but I think sending PKT payloads would be viable over UDP (no reason not to)
|
uint8_t mpkt[4] = {0x4D, 0x50, 0x4B, 0x54}; //MPKT is not Standard, but I think sending PKT payloads would be viable over UDP (no reason not to)
|
||||||
|
|
||||||
|
unsigned long long int src = 0; //source derived from CONN, DISC, EOTX, and Other Headers
|
||||||
|
char c;
|
||||||
|
|
||||||
while (!exitflag)
|
while (!exitflag)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
@ -3438,6 +3441,9 @@ void processM17IPF(dsd_opts * opts, dsd_state * state)
|
||||||
}
|
}
|
||||||
else exitflag = 1;
|
else exitflag = 1;
|
||||||
|
|
||||||
|
src = ((unsigned long long int)ip_frame[4] << 40ULL) + ((unsigned long long int)ip_frame[5] << 32ULL) + ((unsigned long long int)ip_frame[6] << 24ULL) +
|
||||||
|
((unsigned long long int)ip_frame[7] << 16ULL) + ((unsigned long long int)ip_frame[8] << 8ULL) + ((unsigned long long int)ip_frame[9] << 0ULL);
|
||||||
|
|
||||||
//compare header to magic and decode IP voice frame w/ M17 magic header
|
//compare header to magic and decode IP voice frame w/ M17 magic header
|
||||||
if (memcmp(ip_frame, magic, 4) == 0)
|
if (memcmp(ip_frame, magic, 4) == 0)
|
||||||
{
|
{
|
||||||
|
|
@ -3527,8 +3533,33 @@ void processM17IPF(dsd_opts * opts, dsd_state * state)
|
||||||
else if (memcmp(ip_frame, conn, 4) == 0)
|
else if (memcmp(ip_frame, conn, 4) == 0)
|
||||||
{
|
{
|
||||||
fprintf (stderr, "\n M17 IP CONN: ");
|
fprintf (stderr, "\n M17 IP CONN: ");
|
||||||
|
|
||||||
|
//debug
|
||||||
|
// fprintf (stderr, "%X", src);
|
||||||
|
|
||||||
|
if (src == 0xFFFFFFFFFFFF)
|
||||||
|
fprintf (stderr, "SRC: UNKNOWN FFFFFFFFFFFF");
|
||||||
|
else if (src == 0)
|
||||||
|
fprintf (stderr, "SRC: RESERVED %012llx", src);
|
||||||
|
else if (src >= 0xEE6B28000000)
|
||||||
|
fprintf (stderr, "SRC: RESERVED %012llx", src);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf (stderr, "SRC: ");
|
||||||
|
for (i = 0; i < 9; i++)
|
||||||
|
{
|
||||||
|
c = b40[src % 40];
|
||||||
|
// state->m17_src_csd[i] = c;
|
||||||
|
fprintf (stderr, "%c", c);
|
||||||
|
src = src / 40;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// if (opts->payload == 1)
|
||||||
|
{
|
||||||
for (i = 0; i < 11; i++)
|
for (i = 0; i < 11; i++)
|
||||||
fprintf (stderr, "%02X ", ip_frame[i]);
|
fprintf (stderr, "%02X ", ip_frame[i]);
|
||||||
|
}
|
||||||
|
|
||||||
//clear frame
|
//clear frame
|
||||||
memset (ip_frame, 0, sizeof(ip_frame));
|
memset (ip_frame, 0, sizeof(ip_frame));
|
||||||
|
|
@ -3537,8 +3568,33 @@ void processM17IPF(dsd_opts * opts, dsd_state * state)
|
||||||
else if (memcmp(ip_frame, disc, 4) == 0)
|
else if (memcmp(ip_frame, disc, 4) == 0)
|
||||||
{
|
{
|
||||||
fprintf (stderr, "\n M17 IP DISC: ");
|
fprintf (stderr, "\n M17 IP DISC: ");
|
||||||
for (i = 0; i < 10; i++)
|
|
||||||
|
//debug
|
||||||
|
// fprintf (stderr, "%X", src);
|
||||||
|
|
||||||
|
if (src == 0xFFFFFFFFFFFF)
|
||||||
|
fprintf (stderr, "SRC: UNKNOWN FFFFFFFFFFFF");
|
||||||
|
else if (src == 0)
|
||||||
|
fprintf (stderr, "SRC: RESERVED %012llx", src);
|
||||||
|
else if (src >= 0xEE6B28000000)
|
||||||
|
fprintf (stderr, "SRC: RESERVED %012llx", src);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf (stderr, "SRC: ");
|
||||||
|
for (i = 0; i < 9; i++)
|
||||||
|
{
|
||||||
|
c = b40[src % 40];
|
||||||
|
// state->m17_src_csd[i] = c;
|
||||||
|
fprintf (stderr, "%c", c);
|
||||||
|
src = src / 40;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// if (opts->payload == 1)
|
||||||
|
{
|
||||||
|
for (i = 0; i < 11; i++)
|
||||||
fprintf (stderr, "%02X ", ip_frame[i]);
|
fprintf (stderr, "%02X ", ip_frame[i]);
|
||||||
|
}
|
||||||
|
|
||||||
//clear frame
|
//clear frame
|
||||||
memset (ip_frame, 0, sizeof(ip_frame));
|
memset (ip_frame, 0, sizeof(ip_frame));
|
||||||
|
|
@ -3550,8 +3606,33 @@ void processM17IPF(dsd_opts * opts, dsd_state * state)
|
||||||
else if (memcmp(ip_frame, eotx, 4) == 0)
|
else if (memcmp(ip_frame, eotx, 4) == 0)
|
||||||
{
|
{
|
||||||
fprintf (stderr, "\n M17 IP EOTX: ");
|
fprintf (stderr, "\n M17 IP EOTX: ");
|
||||||
for (i = 0; i < 10; i++)
|
|
||||||
|
//debug
|
||||||
|
// fprintf (stderr, "%X", src);
|
||||||
|
|
||||||
|
if (src == 0xFFFFFFFFFFFF)
|
||||||
|
fprintf (stderr, "SRC: UNKNOWN FFFFFFFFFFFF");
|
||||||
|
else if (src == 0)
|
||||||
|
fprintf (stderr, "SRC: RESERVED %012llx", src);
|
||||||
|
else if (src >= 0xEE6B28000000)
|
||||||
|
fprintf (stderr, "SRC: RESERVED %012llx", src);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf (stderr, "SRC: ");
|
||||||
|
for (i = 0; i < 9; i++)
|
||||||
|
{
|
||||||
|
c = b40[src % 40];
|
||||||
|
// state->m17_src_csd[i] = c;
|
||||||
|
fprintf (stderr, "%c", c);
|
||||||
|
src = src / 40;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// if (opts->payload == 1)
|
||||||
|
{
|
||||||
|
for (i = 0; i < 11; i++)
|
||||||
fprintf (stderr, "%02X ", ip_frame[i]);
|
fprintf (stderr, "%02X ", ip_frame[i]);
|
||||||
|
}
|
||||||
|
|
||||||
//clear frame
|
//clear frame
|
||||||
memset (ip_frame, 0, sizeof(ip_frame));
|
memset (ip_frame, 0, sizeof(ip_frame));
|
||||||
|
|
@ -3564,16 +3645,65 @@ void processM17IPF(dsd_opts * opts, dsd_state * state)
|
||||||
{
|
{
|
||||||
fprintf (stderr, "\n M17 IP PING: ");
|
fprintf (stderr, "\n M17 IP PING: ");
|
||||||
|
|
||||||
//clear frame
|
//debug
|
||||||
memset (ip_frame, 0, sizeof(ip_frame));
|
// fprintf (stderr, "%X", src);
|
||||||
|
|
||||||
|
if (src == 0xFFFFFFFFFFFF)
|
||||||
|
fprintf (stderr, "SRC: UNKNOWN FFFFFFFFFFFF");
|
||||||
|
else if (src == 0)
|
||||||
|
fprintf (stderr, "SRC: RESERVED %012llx", src);
|
||||||
|
else if (src >= 0xEE6B28000000)
|
||||||
|
fprintf (stderr, "SRC: RESERVED %012llx", src);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf (stderr, "SRC: ");
|
||||||
|
for (i = 0; i < 9; i++)
|
||||||
|
{
|
||||||
|
c = b40[src % 40];
|
||||||
|
// state->m17_src_csd[i] = c;
|
||||||
|
fprintf (stderr, "%c", c);
|
||||||
|
src = src / 40;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// if (opts->payload == 1)
|
||||||
|
{
|
||||||
|
for (i = 0; i < 11; i++)
|
||||||
|
fprintf (stderr, "%02X ", ip_frame[i]);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (memcmp(ip_frame, pong, 4) == 0)
|
else if (memcmp(ip_frame, pong, 4) == 0)
|
||||||
{
|
{
|
||||||
fprintf (stderr, "\n M17 IP PONG: ");
|
fprintf (stderr, "\n M17 IP PONG: ");
|
||||||
|
|
||||||
//clear frame
|
//debug
|
||||||
memset (ip_frame, 0, sizeof(ip_frame));
|
// fprintf (stderr, "%X", src);
|
||||||
|
|
||||||
|
if (src == 0xFFFFFFFFFFFF)
|
||||||
|
fprintf (stderr, "SRC: UNKNOWN FFFFFFFFFFFF");
|
||||||
|
else if (src == 0)
|
||||||
|
fprintf (stderr, "SRC: RESERVED %012llx", src);
|
||||||
|
else if (src >= 0xEE6B28000000)
|
||||||
|
fprintf (stderr, "SRC: RESERVED %012llx", src);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf (stderr, "SRC: ");
|
||||||
|
for (i = 0; i < 9; i++)
|
||||||
|
{
|
||||||
|
c = b40[src % 40];
|
||||||
|
// state->m17_src_csd[i] = c;
|
||||||
|
fprintf (stderr, "%c", c);
|
||||||
|
src = src / 40;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// if (opts->payload == 1)
|
||||||
|
{
|
||||||
|
for (i = 0; i < 11; i++)
|
||||||
|
fprintf (stderr, "%02X ", ip_frame[i]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (memcmp(ip_frame, mpkt, 4) == 0)
|
else if (memcmp(ip_frame, mpkt, 4) == 0)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue