+ u_int caplen = h->caplen;
+ u_int hdrlen;
+ u_int16_t fc;
+ u_int8_t seq;
+
+ if (caplen < 3) {
+ printf("[|802.15.4] %x", caplen);
+ return caplen;
+ }
+
+ fc = EXTRACT_LE_16BITS(p);
+ hdrlen = extract_header_length(fc);
+
+ seq = EXTRACT_LE_8BITS(p + 2);
+
+ p += 3;
+ caplen -= 3;
+
+ printf("IEEE 802.15.4 %s packet ", ftypes[fc & 0x7]);
+ if (vflag)
+ printf("seq %02x ", seq);
+ if (hdrlen == -1) {
+ printf("malformed! ");
+ return caplen;
+ }
+
+
+ if (!vflag) {
+ p+= hdrlen;
+ caplen -= hdrlen;
+ } else {
+ u_int16_t panid;
+
+ switch ((fc >> 10) & 0x3) {
+ case 0x00:
+ printf("none ");
+ break;
+ case 0x02:
+ panid = EXTRACT_LE_16BITS(p);
+ p += 2;
+ printf("%04x:%04x ", panid, EXTRACT_LE_16BITS(p));
+ p += 2;
+ break;
+ case 0x03:
+ panid = EXTRACT_LE_16BITS(p);
+ p += 2;
+ printf("%04x:%s ", panid, le64addr_string(p));
+ p += 8;
+ break;
+ }
+ printf("< ");
+
+ switch ((fc >> 14) & 0x3) {
+ case 0x00:
+ printf("none ");
+ break;
+ case 0x02:
+ if (!(fc & (1 << 6))) {
+ panid = EXTRACT_LE_16BITS(p);
+ p += 2;
+ }
+ printf("%04x:%04x ", panid, EXTRACT_LE_16BITS(p));
+ p += 2;
+ break;
+ case 0x03:
+ if (!(fc & (1 << 6))) {
+ panid = EXTRACT_LE_16BITS(p);
+ p += 2;
+ }
+ printf("%04x:%s ", panid, le64addr_string(p));
+ p += 8;
+ break;
+ }
+
+ caplen -= hdrlen;
+ }
+
+ if (!suppress_default_print)
+ default_print(p, caplen);
+