3 * Siemens AG, All rights reserved.
4 * Dmitry Eremin-Solenikov (dbaryshkov@gmail.com)
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that: (1) source code distributions
8 * retain the above copyright notice and this paragraph in its entirety, (2)
9 * distributions including binary code include the above copyright notice and
10 * this paragraph in its entirety in the documentation or other materials
11 * provided with the distribution, and (3) all advertising materials mentioning
12 * features or use of this software display the following acknowledgement:
13 * ``This product includes software developed by the University of California,
14 * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
15 * the University nor the names of its contributors may be used to endorse
16 * or promote products derived from this software without specific prior
18 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
19 * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
20 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
27 #include <netdissect-stdinc.h>
29 #include "netdissect.h"
30 #include "addrtoname.h"
34 static const char *ftypes
[] = {
46 extract_header_length(uint16_t fc
)
50 switch ((fc
>> 10) & 0x3) {
52 if (fc
& (1 << 6)) /* intra-PAN with none dest addr */
65 switch ((fc
>> 14) & 0x3) {
89 ieee802_15_4_if_print(netdissect_options
*ndo
,
90 const struct pcap_pkthdr
*h
, const u_char
*p
)
92 u_int caplen
= h
->caplen
;
98 ND_PRINT((ndo
, "[|802.15.4] %x", caplen
));
102 fc
= EXTRACT_LE_16BITS(p
);
103 hdrlen
= extract_header_length(fc
);
105 seq
= EXTRACT_LE_8BITS(p
+ 2);
110 ND_PRINT((ndo
,"IEEE 802.15.4 %s packet ", ftypes
[fc
& 0x7]));
112 ND_PRINT((ndo
,"seq %02x ", seq
));
114 ND_PRINT((ndo
,"invalid! "));
119 if (!ndo
->ndo_vflag
) {
125 switch ((fc
>> 10) & 0x3) {
127 ND_PRINT((ndo
,"none "));
130 ND_PRINT((ndo
,"reserved destination addressing mode"));
133 panid
= EXTRACT_LE_16BITS(p
);
135 ND_PRINT((ndo
,"%04x:%04x ", panid
, EXTRACT_LE_16BITS(p
)));
139 panid
= EXTRACT_LE_16BITS(p
);
141 ND_PRINT((ndo
,"%04x:%s ", panid
, le64addr_string(ndo
, p
)));
145 ND_PRINT((ndo
,"< "));
147 switch ((fc
>> 14) & 0x3) {
149 ND_PRINT((ndo
,"none "));
152 ND_PRINT((ndo
,"reserved source addressing mode"));
155 if (!(fc
& (1 << 6))) {
156 panid
= EXTRACT_LE_16BITS(p
);
159 ND_PRINT((ndo
,"%04x:%04x ", panid
, EXTRACT_LE_16BITS(p
)));
163 if (!(fc
& (1 << 6))) {
164 panid
= EXTRACT_LE_16BITS(p
);
167 ND_PRINT((ndo
,"%04x:%s ", panid
, le64addr_string(ndo
, p
)));
175 if (!ndo
->ndo_suppress_default_print
)
176 ND_DEFAULTPRINT(p
, caplen
);