1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
|
/*
* Test program to test gs packet sub-system
*
* Self-Test:
* dd bs=1024k count=1024 if=/dev/urandom of=test1G.dat
* ./packet-test encode <test1M.dat 2>/dev/null | ./packet-test >test1M_rec.dat && md5 test1M*.dat
* ./packet-test encode <test1G.dat 2>/dev/null | ./packet-test >test1G_rec.dat && md5 test1G*.dat
*/
#include "common.h"
#include "utils.h"
#define PKT_TYPE_WSIZE 0x01
static void
pkt_cb_wsize(uint8_t type, const uint8_t *data, size_t len, void *arg)
{
uint16_t cols, rows;
memcpy(&cols, data, 2);
memcpy(&rows, data + 2, 2);
// DEBUGF("cols = %u, rows = %u\n", cols, rows);
cols = ntohs(cols);
rows = ntohs(rows);
}
static void
pkt_cb_channel(uint8_t channel, const uint8_t *data, size_t len, void *arg)
{
if (channel >= GS_PKT_MAX_CHN)
return;
// DEBUGF("Channel #%u, length %zu\n", channel, len);
}
static void
my_write(int fd, void *data, size_t len)
{
if (write(fd, data, len) != len)
ERREXIT("write()\n");
}
/*
*/
int
main(int argc, char *argv[])
{
size_t src_sz = 64;
uint8_t src[src_sz];
uint8_t dst[src_sz * 2];
size_t sz;
size_t dsz;
int ret;
GS_PKT pkt;
int is_encode = 0;
GS_library_init(stderr, stderr, NULL); // Library debug output
gopt.err_fp = stderr;
gopt.log_fp = stderr;
if (argc > 1)
is_encode = 1;
srand(time(NULL));
GS_PKT_init(&pkt);
GS_PKT_assign_msg(&pkt, PKT_TYPE_WSIZE, pkt_cb_wsize, NULL);
GS_PKT_assign_chn(&pkt, 0, pkt_cb_channel, NULL);
GS_PKT_assign_chn(&pkt, 1, pkt_cb_channel, NULL);
while (1)
{
/* Read random number of bytes for shits and giggles */
size_t rsz = rand() % src_sz + 1;
sz = read(0, src, rsz);
if (sz <= 0)
break;
if (is_encode)
{
GS_PKT_encode(&pkt, src, sz, dst, &dsz);
my_write(1, dst, dsz);
/* Randomly introduce an in-band packet */
#if 1
uint8_t buf[GS_PKT_MAX_SIZE];
memset(buf, 0x41, sizeof buf);
buf[0] = GS_PKT_ESC;
if (rand() % 100 == 0)
{
/* in-band MSG of size 4 */
buf[1] = 0x01;
memcpy(buf + 2, "1234", 4);
my_write(1, buf, 2 + 4);
}
if (rand() % 100 == 0)
{
/* in-band MSG of size 512 bytes */
buf[1] = 0x7f;
/* Add a larger inband packet for shits and giggles */
my_write(1, buf, 2 + 512);
}
if (rand() % 10 == 0)
{
/* in-band channel (stream) data on channel #1 */
buf[1] = 1 | (1<<7);
uint16_t len = rand() % (GS_PKT_MAX_SIZE);
uint16_t nlen = htons(len);
// DEBUGF("sending len = %u\n", len);
memcpy(buf + 2, &nlen, 2);
my_write(1, buf, 2 + 2 + len);
}
#endif
continue;
}
/* HERE: decode */
ret = GS_PKT_decode(&pkt, src, sz, dst, &dsz);
if (ret != 0)
exit(-1);
my_write(1, dst, dsz);
}
return 0;
}
|