An implementation of Analog cellular networks like A-Netz, B-Netz, C-Netz, NMT, AMPS, TACS, JTACS, Radiocom 2000, IMTS, MPT1327, Eurosignal and more http://osmocom-analog.eversberg.eu/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
osmocom-analog/src/test/test_dms.c

259 lines
7.3 KiB

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <unistd.h>
#include "../libsample/sample.h"
#include "../libdebug/debug.h"
#include "../nmt/nmt.h"
extern int dms_allow_loopback;
static void assert(int condition, char *why)
{
printf("%s = %s\n", why, (condition) ? "TRUE" : "FALSE");
if (!condition) {
printf("\n******************** FAILED ********************\n\n");
exit(-1);
}
}
void ok(void)
{
printf("\n OK ;->\n\n");
sleep(1);
}
static const char testsequence[] = "This is a test for DMS protocol layer. It will test the handing of transfer window. Also it will test what happens, if frames get dropped.";
static const char *check_sequence;
int check_length;
static const uint8_t test_null[][8] = {
{ 0x01, 0x02, 0x02, 0x04, 0x05, 0x06, 0x07, 7 },
{ 0x01, 0x02, 0x02, 0x04, 0x05, 0x06, 0x00, 6 },
{ 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 5 },
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 1 },
};
static char ack_bits[77];
void dms_receive(nmt_t *nmt, const uint8_t *data, int length, int eight_bits)
{
printf("(getting %d digits from DMS layer)\n", length);
assert(!memcmp((const char *)data, check_sequence, length), "Expecting received data to match");
check_sequence += length;
check_length = length;
}
void dms_all_sent(nmt_t *nmt)
{
}
nmt_t *alloc_nmt(void)
{
nmt_t *nmt;
nmt = calloc(sizeof(*nmt), 1);
nmt->sender.samplerate = 40 * 1200;
dms_init_sender(nmt);
dms_reset(nmt);
return nmt;
}
void free_nmt(nmt_t *nmt)
{
dms_cleanup_sender(nmt);
free(nmt);
}
extern void main_mobile_loop();
int main(void)
{
nmt_t *nmt;
dms_t *dms;
int i, j;
/* this is never called, it forces the linker to add mobile functions */
if (debuglevel == -1000) main_mobile_loop();
debuglevel = DEBUG_DEBUG;
dms_allow_loopback = 1;
nmt = alloc_nmt();
dms = &nmt->dms;
/* test if frame cycles until we send RAND */
check_sequence = testsequence;
dms_send(nmt, (uint8_t *)testsequence, strlen(testsequence) + 1, 1);
assert(dms->tx_frame_valid && dms->tx_frame_length == 127, "Expecting frame in queue with 127 bits");
assert(dms->state.n_s == 1, "Expecting next frame to have sequence number 1");
printf("Pretend that frame has been sent\n");
dms->tx_frame_valid = 0;
trigger_frame_transmission(nmt);
assert(dms->tx_frame_valid && dms->tx_frame_length == 127, "Expecting frame in queue with 127 bits");
assert(dms->state.n_s == 0, "Expecting next frame to have sequence number 0 (cycles due to unacked RAND)");
printf("Pretend that frame has been sent\n");
dms->tx_frame_valid = 0;
trigger_frame_transmission(nmt);
assert(dms->tx_frame_valid && dms->tx_frame_length == 127, "Expecting frame in queue with 127 bits");
assert(dms->state.n_s == 1, "Expecting next frame to have sequence number 1");
/* send back ID */
printf("Sending back ID\n");
for (i = 0; i < dms->tx_frame_length; i++)
fsk_receive_bit_dms(nmt, dms->tx_frame[i] & 1, 1.0, 1.0);
printf("Pretend that frame has been sent\n");
dms->tx_frame_valid = 0;
trigger_frame_transmission(nmt);
assert(dms->tx_frame_valid && dms->tx_frame_length == 77, "Expecting frame in queue with 77 bits");
printf("Pretend that frame has been sent\n");
dms->tx_frame_valid = 0;
trigger_frame_transmission(nmt);
assert(dms->tx_frame_valid && dms->tx_frame_length == 127, "Expecting frame in queue with 127 bits");
assert(dms->state.n_s == 0, "Expecting next frame to have sequence number 0");
/* send back RAND */
printf("Sending back RAND\n");
for (i = 0; i < dms->tx_frame_length; i++)
fsk_receive_bit_dms(nmt, dms->tx_frame[i] & 1, 1.0, 1.0);
printf("Pretend that frame has been sent\n");
dms->tx_frame_valid = 0;
trigger_frame_transmission(nmt);
assert(dms->tx_frame_valid && dms->tx_frame_length == 77, "Expecting frame in queue with 77 bits");
memcpy(ack_bits, dms->tx_frame, 77);
/* check if DT frame will be sent now */
printf("Pretend that frame has been sent\n");
dms->tx_frame_valid = 0;
trigger_frame_transmission(nmt);
assert(dms->tx_frame_valid && dms->tx_frame_length == 127, "Expecting frame in queue with 127 bits");
assert(dms->state.n_s == 1, "Expecting next frame to have sequence number 1");
printf("Pretend that frame has been sent\n");
dms->tx_frame_valid = 0;
trigger_frame_transmission(nmt);
assert(dms->tx_frame_valid && dms->tx_frame_length == 127, "Expecting frame in queue with 127 bits");
assert(dms->state.n_s == 2, "Expecting next frame to have sequence number 2");
printf("Pretend that frame has been sent\n");
dms->tx_frame_valid = 0;
trigger_frame_transmission(nmt);
assert(dms->tx_frame_valid && dms->tx_frame_length == 127, "Expecting frame in queue with 127 bits");
assert(dms->state.n_s == 3, "Expecting next frame to have sequence number 3");
printf("Pretend that frame has been sent\n");
dms->tx_frame_valid = 0;
trigger_frame_transmission(nmt);
assert(dms->tx_frame_valid && dms->tx_frame_length == 127, "Expecting frame in queue with 127 bits");
assert(dms->state.n_s == 0, "Expecting next frame to have sequence number 0");
/* send back ack bitss */
printf("Sending back RR(2)\n");
memcpy(dms->tx_frame, ack_bits, 77);
dms->tx_frame_length = 77;
for (i = 0; i < dms->tx_frame_length; i++)
fsk_receive_bit_dms(nmt, dms->tx_frame[i] & 1, 1.0, 1.0);
printf("Pretend that frame has been sent\n");
dms->tx_frame_valid = 0;
trigger_frame_transmission(nmt);
assert(dms->tx_frame_valid && dms->tx_frame_length == 127, "Expecting frame in queue with 127 bits");
assert(dms->state.n_s == 3, "Expecting next frame to have sequence number 0");
ok();
/* loopback frames */
printf("pipe through all data\n");
while (check_sequence[0]) {
printf("Sending back last received frame\n");
for (i = 0; i < dms->tx_frame_length; i++)
fsk_receive_bit_dms(nmt, dms->tx_frame[i] & 1, 1.0, 1.0);
printf("Pretend that frame has been sent\n");
dms->tx_frame_valid = 0;
trigger_frame_transmission(nmt);
}
ok();
debuglevel = DEBUG_INFO;
/* test again with pseudo random packet dropps */
srandom(0);
free_nmt(nmt);
nmt = alloc_nmt();
dms = &nmt->dms;
check_sequence = testsequence;
dms_send(nmt, (uint8_t *)testsequence, strlen(testsequence) + 1, 1);
/* loopback frames */
printf("pipe through all data\n");
while (check_sequence[0]) {
if ((random() & 1)) {
printf("Sending back last received frame\n");
for (i = 0; i < dms->tx_frame_length; i++)
fsk_receive_bit_dms(nmt, dms->tx_frame[i] & 1, 1.0, 1.0);
}
printf("Pretend that frame has been sent\n");
dms->tx_frame_valid = 0;
trigger_frame_transmission(nmt);
}
ok();
free_nmt(nmt);
nmt = alloc_nmt();
dms = &nmt->dms;
/* test zero termination */
for (j = 0; j < 4; j++) {
dms->tx_frame_length = 0;
printf("zero-termination test: %d bytes in frame\n", test_null[j][7]);
dms_send(nmt, test_null[j], test_null[j][7], 1);
check_sequence = (char *)test_null[j];
while (dms->tx_frame_length) {
printf("Sending back last received frame\n");
for (i = 0; i < dms->tx_frame_length; i++)
fsk_receive_bit_dms(nmt, dms->tx_frame[i] & 1, 1.0, 1.0);
dms->tx_frame_length = 0;
printf("Pretend that frame has been sent\n");
dms->tx_frame_valid = 0;
trigger_frame_transmission(nmt);
}
assert(check_length == test_null[j][7], "Expecting received length to match transmitted length");
}
ok();
return 0;
}
void call_down_clock(void) {}
const char *aaimage[] = { NULL };