Add support for t-frames and i-frames.
[wizzardx.tinyos2.x.git] / apps / BaseStation15.4 / seriallisten15-4.c
blobe84272a380241fecb57cf295cac9b56821f9919a
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
5 #include "serialsource.h"
7 static char *msgs[] = {
8 "unknown_packet_type",
9 "ack_timeout" ,
10 "sync" ,
11 "too_long" ,
12 "too_short" ,
13 "bad_sync" ,
14 "bad_crc" ,
15 "closed" ,
16 "no_memory" ,
17 "unix_error"
20 void stderr_msg(serial_source_msg problem)
22 fprintf(stderr, "Note: %s\n", msgs[problem]);
25 enum {
26 TOS_SERIAL_802_15_4_ID = 2,
29 int main(int argc, char **argv)
31 serial_source src;
32 int iframes = 0;
33 if (argc != 4) {
34 fprintf(stderr, "Usage: %s <iframe|tframe> <device> <rate> - dump packets from a serial port\n", argv[0]);
35 exit(2);
38 if (strncmp(argv[1], "tframe", strlen("tframe")) == 0) {
39 iframes = 0;
41 else if (strncmp(argv[1], "iframe", strlen("iframe")) == 0) {
42 iframes = 1;
44 else {
45 fprintf(stderr, "Usage: %s <iframe|tframe> <device> <rate> - dump packets from a serial port\n", argv[0]);
46 exit(3);
49 src = open_serial_source(argv[2], platform_baud_rate(argv[3]), 0, stderr_msg);
51 if (!src) {
52 fprintf(stderr, "Couldn't open serial port at %s:%s\n",
53 argv[2], argv[3]);
54 exit(1);
57 for (;;)
59 int len, i, plen;
60 short fcf;
61 const unsigned char *packet = read_serial_packet(src, &len);
62 int intraPan = 0;
64 if (!packet)
65 exit(0);
66 else if (packet[0] != TOS_SERIAL_802_15_4_ID) {
67 printf("bad packet (serial type is %02x, not %02x)\n", packet[0], TOS_SERIAL_802_15_4_ID);
70 plen = packet[1];
71 printf("Received packet of length %i: \n", plen);
72 if (plen != len) {
73 printf("Packet format error: read packet length (%hhx) is different than expected from frame (%hhx).\n", plen, len);
76 i = 2;
77 // Read in FCF and i+=2
78 fcf = packet[i+1] << 8 | packet[i];
79 i += 2;
83 if ((fcf & 0x7) == 0x01) {
84 printf(" Frame type: data\n");
86 else if ((fcf & 0x7) == 0x02) {
87 printf(" Frame type: acknowledgement\n");
89 else {
90 printf(" Frame type: other\n");
93 printf(" Security: %s\n", (fcf & (1 << 3)) ? "enabled":"disabled");
94 printf(" Frame pending: %s\n", (fcf & (1 << 4)) ? "yes":"no");
95 printf(" Ack request: %s\n", (fcf & (1 << 5)) ? "yes":"no");
96 printf(" Intra-PAN: %s\n", (fcf & (1 << 6)) ? "yes":"no");
97 intraPan = (fcf & (1 << 6));
102 char seqno = packet[i++];
103 printf(" Sequence number: 0x%hhx\n", seqno);
107 char addrLen = (fcf >> 10) & 0x3;
108 short saddr = 0;
109 long long laddr = 0;
111 // 16- and 64-bit destinations have a PAN ID
112 if (addrLen == 2 || addrLen == 3) {
113 short destPan = packet[i++] << 8 | packet[i++];
114 printf(" Destination PAN: 0x%02hx\n", destPan);
117 switch (addrLen) {
118 case 0:
119 printf(" Destination address: none\n");
120 break;
121 case 1:
122 printf(" Destination address: invalid? (0x01)\n");
123 break;
124 case 2:
125 saddr = (packet[i] << 8 | packet[i+1]);
126 i += 2;
127 printf(" Destination address: 0x%04hx\n", saddr);
128 break;
129 case 3: {
130 int j;
131 for (j = 0; j < 8; j++) {
132 laddr = laddr << 8;
133 laddr |= packet[i++];
135 printf(" Destination address: 0x%016llx\n", laddr);
136 break;
138 default:
139 printf(" Destination address: parse serror\n");
145 char addrLen = (fcf >> 14) & 0x3;
146 short saddr = 0;
147 long long laddr = 0;
149 if (!intraPan) { // Intra-PAN packet
150 short srcPan = packet[i] << 8 | packet[i+1];
151 i += 2;
152 printf(" Source PAN: 0x%02hx\n", srcPan);
155 switch (addrLen) {
156 case 0:
157 printf(" Source address: none\n");
158 break;
159 case 1:
160 printf(" Source address: invalid? (0x01)\n");
161 break;
162 case 2:
163 saddr = (packet[i] << 8 | packet[i + 1]);
164 i += 2;
165 printf(" Source address: 0x%04hx\n", saddr);
166 break;
167 case 3: {
168 int j;
169 for (j = 0; j < 8; j++) {
170 laddr = laddr << 8;
171 laddr |= packet[i++];
173 printf(" Source address: 0x%016llx\n", laddr);
174 break;
176 default:
177 printf(" Source address: parse serror\n");
181 if (iframes) {
182 printf(" I-Frame: %s\n", (packet[i++] == 0x3f)? "yes":"no");
185 printf(" AM type: 0x%02hhx\n", packet[i++]);
187 if (i >= plen) {
188 printf("Packet format error: read packet is shorter than expected.\n");
190 else {
191 printf(" Payload: ");
192 for (; i < plen; i++) {
193 printf("0x%02hhx ", packet[i]);
195 printf("\n\n");
196 putchar('\n');
198 free((void *)packet);