#include <config.h>
#endif
+#ifdef HAVE_NET_IF_H
+#include <net/if.h>
+#endif
+
#include "netdissect-stdinc.h"
#include "netdissect.h"
u_short ether_type;
ndo->ndo_protocol = "sll";
- ND_PRINT("%3s ",tok2str(sll_pkttype_values,"?",EXTRACT_BE_U_2(sllp->sll_pkttype)));
+ ND_PRINT("%3s ",
+ tok2str(sll_pkttype_values,"?",GET_BE_U_2(sllp->sll_pkttype)));
/*
* XXX - check the link-layer address type value?
* For now, we just assume 6 means Ethernet.
* XXX - print others as strings of hex?
*/
- if (EXTRACT_BE_U_2(sllp->sll_halen) == 6)
+ if (GET_BE_U_2(sllp->sll_halen) == 6)
ND_PRINT("%s ", etheraddr_string(ndo, sllp->sll_addr));
if (!ndo->ndo_qflag) {
- ether_type = EXTRACT_BE_U_2(sllp->sll_protocol);
+ ether_type = GET_BE_U_2(sllp->sll_protocol);
if (ether_type <= MAX_ETHERNET_LENGTH_VAL) {
/*
u_int caplen = h->caplen;
u_int length = h->len;
const struct sll_header *sllp;
+ u_short hatype;
u_short ether_type;
int llc_hdrlen;
u_int hdrlen;
p += SLL_HDR_LEN;
hdrlen = SLL_HDR_LEN;
- ether_type = EXTRACT_BE_U_2(sllp->sll_protocol);
+ hatype = GET_BE_U_2(sllp->sll_hatype);
+ switch (hatype) {
+
+ case 803:
+ /*
+ * This is an packet with a radiotap header;
+ * just dissect the payload as such.
+ */
+ return (SLL_HDR_LEN + ieee802_11_radio_print(ndo, p, length, caplen));
+ }
+ ether_type = GET_BE_U_2(sllp->sll_protocol);
recurse:
/*
* the enclosed type field.
*/
if (caplen < 4) {
- ND_PRINT("[|vlan]");
+ ndo->ndo_protocol = "vlan";
+ nd_print_trunc(ndo);
return (hdrlen + caplen);
}
- if (length < 4) {
- ND_PRINT("[|vlan]");
- return (hdrlen + length);
- }
if (ndo->ndo_eflag) {
- uint16_t tag = EXTRACT_BE_U_2(p);
+ uint16_t tag = GET_BE_U_2(p);
ND_PRINT("%s, ", ieee8021q_tci_string(tag));
}
- ether_type = EXTRACT_BE_U_2(p + 2);
+ ether_type = GET_BE_U_2(p + 2);
if (ether_type <= MAX_ETHERNET_LENGTH_VAL)
ether_type = LINUX_SLL_P_802_2;
if (!ndo->ndo_qflag) {
u_short ether_type;
ndo->ndo_protocol = "sll2";
- ND_PRINT("%3s ",tok2str(sll_pkttype_values,"?",EXTRACT_U_1(sllp->sll2_pkttype)));
+ ND_PRINT("%3s ",
+ tok2str(sll_pkttype_values,"?",GET_U_1(sllp->sll2_pkttype)));
/*
* XXX - check the link-layer address type value?
* For now, we just assume 6 means Ethernet.
* XXX - print others as strings of hex?
*/
- if (EXTRACT_U_1(sllp->sll2_halen) == 6)
+ if (GET_U_1(sllp->sll2_halen) == 6)
ND_PRINT("%s ", etheraddr_string(ndo, sllp->sll2_addr));
if (!ndo->ndo_qflag) {
- ether_type = EXTRACT_BE_U_2(sllp->sll2_protocol);
+ ether_type = GET_BE_U_2(sllp->sll2_protocol);
if (ether_type <= MAX_ETHERNET_LENGTH_VAL) {
/*
u_int caplen = h->caplen;
u_int length = h->len;
const struct sll2_header *sllp;
+ u_short hatype;
u_short ether_type;
int llc_hdrlen;
u_int hdrlen;
+#ifdef HAVE_NET_IF_H
+ uint32_t if_index;
+ char ifname[IF_NAMESIZE];
+#endif
ndo->ndo_protocol = "sll2_if";
if (caplen < SLL2_HDR_LEN) {
}
sllp = (const struct sll2_header *)p;
+#ifdef HAVE_NET_IF_H
+ if_index = GET_BE_U_4(sllp->sll2_if_index);
+ if (if_indextoname(if_index, ifname))
+ ND_PRINT("ifindex %u (%s) ", if_index, ifname);
+ else
+ ND_PRINT("ifindex %u ", if_index);
+#endif
if (ndo->ndo_eflag)
sll2_print(ndo, sllp, length);
p += SLL2_HDR_LEN;
hdrlen = SLL2_HDR_LEN;
- ether_type = EXTRACT_BE_U_2(sllp->sll2_protocol);
+ hatype = GET_BE_U_2(sllp->sll2_hatype);
+ switch (hatype) {
+
+ case 803:
+ /*
+ * This is an packet with a radiotap header;
+ * just dissect the payload as such.
+ */
+ return (SLL_HDR_LEN + ieee802_11_radio_print(ndo, p, length, caplen));
+ }
+ ether_type = GET_BE_U_2(sllp->sll2_protocol);
recurse:
/*
* the enclosed type field.
*/
if (caplen < 4) {
- ND_PRINT("[|vlan]");
+ ndo->ndo_protocol = "vlan";
+ nd_print_trunc(ndo);
return (hdrlen + caplen);
}
- if (length < 4) {
- ND_PRINT("[|vlan]");
- return (hdrlen + length);
- }
if (ndo->ndo_eflag) {
- uint16_t tag = EXTRACT_BE_U_2(p);
+ uint16_t tag = GET_BE_U_2(p);
ND_PRINT("%s, ", ieee8021q_tci_string(tag));
}
- ether_type = EXTRACT_BE_U_2(p + 2);
+ ether_type = GET_BE_U_2(p + 2);
if (ether_type <= MAX_ETHERNET_LENGTH_VAL)
ether_type = LINUX_SLL_P_802_2;
if (!ndo->ndo_qflag) {