5 #include "serialsource.h"
7 static char *msgs
[] = {
20 void stderr_msg(serial_source_msg problem
)
22 fprintf(stderr
, "Note: %s\n", msgs
[problem
]);
26 TOS_SERIAL_802_15_4_ID
= 2,
29 int main(int argc
, char **argv
)
34 fprintf(stderr
, "Usage: %s <iframe|tframe> <device> <rate> - dump packets from a serial port\n", argv
[0]);
38 if (strncmp(argv
[1], "tframe", strlen("tframe")) == 0) {
41 else if (strncmp(argv
[1], "iframe", strlen("iframe")) == 0) {
45 fprintf(stderr
, "Usage: %s <iframe|tframe> <device> <rate> - dump packets from a serial port\n", argv
[0]);
49 src
= open_serial_source(argv
[2], platform_baud_rate(argv
[3]), 0, stderr_msg
);
52 fprintf(stderr
, "Couldn't open serial port at %s:%s\n",
61 const unsigned char *packet
= read_serial_packet(src
, &len
);
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
);
71 printf("Received packet of length %i: \n", plen
);
73 printf("Packet format error: read packet length (%hhx) is different than expected from frame (%hhx).\n", plen
, len
);
77 // Read in FCF and i+=2
78 fcf
= packet
[i
+1] << 8 | packet
[i
];
83 if ((fcf
& 0x7) == 0x01) {
84 printf(" Frame type: data\n");
86 else if ((fcf
& 0x7) == 0x02) {
87 printf(" Frame type: acknowledgement\n");
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;
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
);
119 printf(" Destination address: none\n");
122 printf(" Destination address: invalid? (0x01)\n");
125 saddr
= (packet
[i
] << 8 | packet
[i
+1]);
127 printf(" Destination address: 0x%04hx\n", saddr
);
131 for (j
= 0; j
< 8; j
++) {
133 laddr
|= packet
[i
++];
135 printf(" Destination address: 0x%016llx\n", laddr
);
139 printf(" Destination address: parse serror\n");
145 char addrLen
= (fcf
>> 14) & 0x3;
149 if (!intraPan
) { // Intra-PAN packet
150 short srcPan
= packet
[i
] << 8 | packet
[i
+1];
152 printf(" Source PAN: 0x%02hx\n", srcPan
);
157 printf(" Source address: none\n");
160 printf(" Source address: invalid? (0x01)\n");
163 saddr
= (packet
[i
] << 8 | packet
[i
+ 1]);
165 printf(" Source address: 0x%04hx\n", saddr
);
169 for (j
= 0; j
< 8; j
++) {
171 laddr
|= packet
[i
++];
173 printf(" Source address: 0x%016llx\n", laddr
);
177 printf(" Source address: parse serror\n");
182 printf(" I-Frame: %s\n", (packet
[i
++] == 0x3f)? "yes":"no");
185 printf(" AM type: 0x%02hhx\n", packet
[i
++]);
188 printf("Packet format error: read packet is shorter than expected.\n");
191 printf(" Payload: ");
192 for (; i
< plen
; i
++) {
193 printf("0x%02hhx ", packet
[i
]);
198 free((void *)packet
);