]> The Tcpdump Group git mirrors - tcpdump/commitdiff
Handle switch tags more cleanly.
authorGuy Harris <[email protected]>
Tue, 23 Apr 2019 22:26:02 +0000 (15:26 -0700)
committerGuy Harris <[email protected]>
Tue, 23 Apr 2019 22:26:02 +0000 (15:26 -0700)
Have the switch tag dissectors handle *only* the switch tag, not
anything else in the Ethernet header.

Have a routine ether_print_switch_tag() that takes a pointer to a
routine to dissect the switch tag, and a switch tag length, as an
argument, and have a common Ethernet dissection routine called by
ether_print_switch_tag() and by ether_print(), passing a null pointer
for the switch tag dissector and 0 for the switch tag length.

Dissect the switch tag after the MAC addresses, if there's a non-null
switch tag routine dissector pointer.

Clean up the processing logic in the common Ethernet dissection code -
have a loop to process VLAN tags, if any, and, when it's done, handle
frames with a length field, frames with a regular type field, and Alteon
jumbo frames.

netdissect.h
print-brcmtag.c
print-dsa.c
print-ether.c
tests/brcm-tag-e.out
tests/dsa-e.out
tests/edsa-e.out

index 085aeac0e4c3e2664a0071577317d3ad10c464b9..f2839e0947dc8bb3a12eb386b499c0be72a805a1 100644 (file)
@@ -593,7 +593,7 @@ extern void egp_print(netdissect_options *, const u_char *, u_int);
 extern void eigrp_print(netdissect_options *, const u_char *, u_int);
 extern void esp_print(netdissect_options *, const u_char *, u_int, const u_char *, u_int, int, u_int);
 extern u_int ether_print(netdissect_options *, const u_char *, u_int, u_int, void (*)(netdissect_options *, const u_char *), const u_char *);
-extern u_int ether_hdr_len_print(netdissect_options *, const u_char *, u_int, u_int, void (*)(netdissect_options *, const u_char *), const u_char *, u_int);
+extern u_int ether_print_switch_tag(netdissect_options *, const u_char *, u_int, u_int, void (*)(netdissect_options *, const u_char *), u_int);
 extern int ethertype_print(netdissect_options *, u_short, const u_char *, u_int, u_int, const struct lladdr_info *, const struct lladdr_info *);
 extern u_int fddi_print(netdissect_options *, const u_char *, u_int, u_int);
 extern void forces_print(netdissect_options *, const u_char *, u_int);
index 47b114bbee704703f308a8df7fc091aef243676e..15449786aaaa6dcd2440522617dbbce310633c69 100644 (file)
@@ -77,16 +77,13 @@ static const struct tok brcm_tag_rc_values[] = {
        { 0, NULL }
 };
 
-static int brcm_tag_print_full(netdissect_options *ndo, const u_char *bp,
-                              u_int length)
+static void
+brcm_tag_print(netdissect_options *ndo, const u_char *bp)
 {
        uint8_t tag[BRCM_TAG_LEN];
        uint16_t dst_map;
        unsigned int i;
 
-       if (length < BRCM_TAG_LEN)
-               return (1);
-
        for (i = 0; i < BRCM_TAG_LEN; i++)
                tag[i] = GET_U_1(bp + i);
 
@@ -111,8 +108,6 @@ static int brcm_tag_print_full(netdissect_options *ndo, const u_char *bp,
                ND_PRINT(", port: %d", tag[3] & BRCM_EG_PID_MASK);
        }
        ND_PRINT(", ");
-
-       return (0);
 }
 
 u_int
@@ -121,51 +116,10 @@ brcm_tag_if_print(netdissect_options *ndo, const struct pcap_pkthdr *h,
 {
        u_int caplen = h->caplen;
        u_int length = h->len;
-       int save_eflag;
-       int ret;
 
        ndo->ndo_protocol = "brcm-tag";
-       if (caplen < 2*MAC_ADDR_LEN + BRCM_TAG_LEN) {
-               nd_print_trunc(ndo);
-               return (caplen);
-       }
-
-       if (length < 2*MAC_ADDR_LEN + BRCM_TAG_LEN) {
-               nd_print_trunc(ndo);
-               return (length);
-       }
-
-       if (ndo->ndo_eflag)
-               ND_PRINT("%s > %s, ",
-                        etheraddr_string(ndo, p + MAC_ADDR_LEN),
-                        etheraddr_string(ndo, p));
-
-       if (brcm_tag_print_full(ndo, p + 2*MAC_ADDR_LEN,
-                               caplen - 2*MAC_ADDR_LEN))
-               return (1);
-
-       /* We printed the Ethernet destination and source addresses already */
-       save_eflag = ndo->ndo_eflag;
-       ndo->ndo_eflag = 0;
-
-       /* Parse the rest of the Ethernet header, and the frame payload,
-        * telling ether_hdr_len_print() how big the non-standard Ethernet
-        * header is.
-        *
-        * +-----------+-----------+----------------+--------------+
-        * | MAC DA (6)| MAC SA (6)|Broadcom tag (4)|Type/Length(2)|
-        * +-----------+-----------+----------------+--------------+
-        */
-       ret = ether_hdr_len_print(ndo, p, length, caplen, NULL, NULL,
-                                 2*MAC_ADDR_LEN + BRCM_TAG_LEN + ETHER_TYPE_LEN);
-       ndo->ndo_eflag = save_eflag;
-       return ret;
-}
-
-static void brcm_tag_print_encap(netdissect_options *ndo,
-                                const u_char *p)
-{
-       brcm_tag_print_full(ndo, p, BRCM_TAG_LEN);
+       return (ether_print_switch_tag(ndo, p, length, caplen,
+           brcm_tag_print, BRCM_TAG_LEN));
 }
 
 u_int
@@ -186,14 +140,16 @@ brcm_tag_prepend_if_print(netdissect_options *ndo, const struct pcap_pkthdr *h,
                return (length);
        }
 
-       /* Parse the Ethernet frame regularly and utilize the encapsulation
-        * header printing facility to pring the pre-pended Broadcom tag.
-        *
-        * +-----------------++-----------++-----------++--------------+
-        * | Broadcom tag (4)|| MAC DA (6)|| MAC SA (6)||Type/Length(2)|
-        * +-----------------++-----------++-----------++--------------+
+       if (ndo->ndo_eflag) {
+               /* Print the prepended Broadcom tag. */
+               brcm_tag_print(ndo, p);
+       }
+       p += BRCM_TAG_LEN;
+       length -= BRCM_TAG_LEN;
+       caplen -= BRCM_TAG_LEN;
+
+       /*
+        * Now print the Ethernet frame following it.
         */
-       return ether_print(ndo, p + BRCM_TAG_LEN,
-                          length - BRCM_TAG_LEN,
-                          caplen - BRCM_TAG_LEN, brcm_tag_print_encap, p);
+       return ether_print(ndo, p, length, caplen, NULL, NULL);
 }
index ad247959b558d3a870ca5c4fc6307a900b83216e..975285c827867a82b39ae836f7378da20fdce074 100644 (file)
@@ -87,7 +87,6 @@
 #define DSA_CODE(tag) ((TOK(tag, 1, 0x06, 1) << 1) | TOK(tag, 2, 0x10, 4))
 
 #define EDSA_LEN 8
-#define EDSA_ETYPE(tag) ((u_short)((TOK(tag, 0, 0xff, 0) << 8) | (TOK(tag, 1, 0xff, 0))))
 
 static const struct tok dsa_mode_values[] = {
        { DSA_MODE_TO_CPU, "To CPU" },
@@ -107,141 +106,114 @@ static const struct tok dsa_code_values[] = {
        { 0, NULL }
 };
 
-static u_int
-dsa_if_print_full(netdissect_options *ndo, const struct pcap_pkthdr *h,
-                 const u_char *p, u_int taglen)
+static void
+tag_common_print(netdissect_options *ndo, const u_char *p)
 {
-       const u_char *edsa, *dsa;
-       int save_eflag;
-       int ret;
-
-       if (h->caplen < 2*MAC_ADDR_LEN + taglen) {
-               nd_print_trunc(ndo);
-               return (h->caplen);
-       }
-
-       if (h->len < 2*MAC_ADDR_LEN + taglen) {
-               nd_print_trunc(ndo);
-               return (h->len);
-       }
-
-       if (taglen == EDSA_LEN) {
-               edsa = p + 2*MAC_ADDR_LEN;
-               dsa = edsa + 4;
-       } else {
-               edsa = NULL;
-               dsa = p + 2*MAC_ADDR_LEN;
-       }
-
        if (ndo->ndo_eflag) {
-               ND_PRINT("%s > %s, ",
-                        etheraddr_string(ndo, p + MAC_ADDR_LEN),
-                        etheraddr_string(ndo, p));
-
-               if (edsa) {
-                       ND_PRINT("Marvell EDSA ethertype 0x%04x (%s), ", EDSA_ETYPE(edsa),
-                                tok2str(ethertype_values, "Unknown", EDSA_ETYPE(edsa)));
-                       ND_PRINT("rsvd %u %u, ", edsa[2], edsa[3]);
-               } else {
-                       ND_PRINT("Marvell DSA ");
-               }
+               ND_PRINT("mode %s, ", tok2str(dsa_mode_values, "unknown", DSA_MODE(p)));
 
-               ND_PRINT("mode %s, ", tok2str(dsa_mode_values, "unknown", DSA_MODE(dsa)));
-
-               switch (DSA_MODE(dsa)) {
+               switch (DSA_MODE(p)) {
                case DSA_MODE_FORWARD:
-                       ND_PRINT("dev %u, %s %u, ", DSA_DEV(dsa),
-                                DSA_TRUNK(dsa) ? "trunk" : "port", DSA_PORT(dsa));
+                       ND_PRINT("dev %u, %s %u, ", DSA_DEV(p),
+                                DSA_TRUNK(p) ? "trunk" : "port", DSA_PORT(p));
                        break;
                case DSA_MODE_FROM_CPU:
                        ND_PRINT("target dev %u, port %u, ",
-                                DSA_DEV(dsa), DSA_PORT(dsa));
+                                DSA_DEV(p), DSA_PORT(p));
                        break;
                case DSA_MODE_TO_CPU:
                        ND_PRINT("source dev %u, port %u, ",
-                                DSA_DEV(dsa), DSA_PORT(dsa));
+                                DSA_DEV(p), DSA_PORT(p));
                        ND_PRINT("code %s, ",
-                                tok2str(dsa_code_values, "reserved", DSA_CODE(dsa)));
+                                tok2str(dsa_code_values, "reserved", DSA_CODE(p)));
                        break;
                case DSA_MODE_TO_SNIFFER:
                        ND_PRINT("source dev %u, port %u, ",
-                                DSA_DEV(dsa), DSA_PORT(dsa));
+                                DSA_DEV(p), DSA_PORT(p));
                        ND_PRINT("%s sniff, ",
-                                DSA_RX_SNIFF(dsa) ? "ingress" : "egress");
+                                DSA_RX_SNIFF(p) ? "ingress" : "egress");
                        break;
                default:
                        break;
                }
 
-               ND_PRINT("%s, ", DSA_TAGGED(dsa) ? "tagged" : "untagged");
-               ND_PRINT("%s", DSA_CFI(dsa) ? "CFI, " : "");
-               ND_PRINT("VID %u, ", DSA_VID(dsa));
-               ND_PRINT("FPri %u, ", DSA_PRI(dsa));
+               ND_PRINT("%s, ", DSA_TAGGED(p) ? "tagged" : "untagged");
+               ND_PRINT("%s", DSA_CFI(p) ? "CFI, " : "");
+               ND_PRINT("VID %u, ", DSA_VID(p));
+               ND_PRINT("FPri %u, ", DSA_PRI(p));
        } else {
-               if (edsa) {
-                       ND_PRINT("EDSA 0x%04x, ", EDSA_ETYPE(edsa));
-               } else {
-                       ND_PRINT("DSA ");
-               }
-
-               switch (DSA_MODE(dsa)) {
+               switch (DSA_MODE(p)) {
                case DSA_MODE_FORWARD:
                        ND_PRINT("Forward %s %u.%u, ",
-                                DSA_TRUNK(dsa) ? "trunk" : "port",
-                                DSA_DEV(dsa), DSA_PORT(dsa));
+                                DSA_TRUNK(p) ? "trunk" : "port",
+                                DSA_DEV(p), DSA_PORT(p));
                        break;
                case DSA_MODE_FROM_CPU:
                        ND_PRINT("CPU > port %u.%u, ",
-                                DSA_DEV(dsa), DSA_PORT(dsa));
+                                DSA_DEV(p), DSA_PORT(p));
                        break;
                case DSA_MODE_TO_CPU:
                        ND_PRINT("port %u.%u > CPU, ",
-                                DSA_DEV(dsa), DSA_PORT(dsa));
+                                DSA_DEV(p), DSA_PORT(p));
                        break;
                case DSA_MODE_TO_SNIFFER:
                        ND_PRINT("port %u.%u > %s Sniffer, ",
-                                DSA_DEV(dsa), DSA_PORT(dsa),
-                                DSA_RX_SNIFF(dsa) ? "Rx" : "Tx");
+                                DSA_DEV(p), DSA_PORT(p),
+                                DSA_RX_SNIFF(p) ? "Rx" : "Tx");
                        break;
                default:
                        break;
                }
 
-               ND_PRINT("VLAN %u%c, ", DSA_VID(dsa), DSA_TAGGED(dsa) ? 't' : 'u');
+               ND_PRINT("VLAN %u%c, ", DSA_VID(p), DSA_TAGGED(p) ? 't' : 'u');
        }
+}
 
-       /* We printed the Ethernet destination and source addresses already */
-       save_eflag = ndo->ndo_eflag;
-       ndo->ndo_eflag = 0;
-
-       /* Parse the rest of the Ethernet header, and the frame payload,
-        * telling ether_hdr_len_print() how big the non-standard Ethernet
-        * header is.
-        *
-        * +-----------+-----------+---------------------+--------------+
-        * | MAC DA (6)| MAC SA (6)|DSA/EDSA tag (taglen)|Type/Length(2)|
-        * +-----------+-----------+---------------------+--------------+
-        */
-       ret = ether_hdr_len_print(ndo, p, h->len, h->caplen, NULL, NULL,
-                                 2*MAC_ADDR_LEN + taglen + 2);
+static void
+dsa_tag_print(netdissect_options *ndo, const u_char *bp)
+{
+       if (ndo->ndo_eflag)
+               ND_PRINT("Marvell DSA ");
+       else
+               ND_PRINT("DSA ");
+       tag_common_print(ndo, bp);
+}
 
-       ndo->ndo_eflag = save_eflag;
+static void
+edsa_tag_print(netdissect_options *ndo, const u_char *bp)
+{
+       const u_char *p = bp;
+       uint16_t edsa_etype;
 
-       return ret;
+       edsa_etype = GET_BE_U_2(p);
+       if (ndo->ndo_eflag) {
+               ND_PRINT("Marvell EDSA ethertype 0x%04x (%s), ", edsa_etype,
+                        tok2str(ethertype_values, "Unknown", edsa_etype));
+               ND_PRINT("rsvd %u %u, ", GET_U_1(p + 2), GET_U_1(p + 3));
+       } else
+               ND_PRINT("EDSA 0x%04x, ", edsa_etype);
+       p += 4;
+       tag_common_print(ndo, p);
 }
 
 u_int
 dsa_if_print(netdissect_options *ndo, const struct pcap_pkthdr *h, const u_char *p)
 {
-       ndo->ndo_protocol = "dsa";
+       u_int caplen = h->caplen;
+       u_int length = h->len;
 
-       return dsa_if_print_full(ndo, h, p, DSA_LEN);
+       ndo->ndo_protocol = "dsa";
+       return (ether_print_switch_tag(ndo, p, length, caplen,
+           dsa_tag_print, DSA_LEN));
 }
 
 u_int
 edsa_if_print(netdissect_options *ndo, const struct pcap_pkthdr *h, const u_char *p)
 {
-       ndo->ndo_protocol = "edsa";
+       u_int caplen = h->caplen;
+       u_int length = h->len;
 
-       return dsa_if_print_full(ndo, h, p, EDSA_LEN);
+       ndo->ndo_protocol = "edsa";
+       return (ether_print_switch_tag(ndo, p, length, caplen,
+           edsa_tag_print, EDSA_LEN));
 }
index 4e0d6f0fc653cf4ad46553613dad3a6d70e4b3ba..6202a6994a8be287dba8a5b60e28324ba470093d 100644 (file)
@@ -104,136 +104,112 @@ const struct tok ethertype_values[] = {
 };
 
 static void
-ether_hdr_print(netdissect_options *ndo,
-               const u_char *bp, u_int length,
-               u_int hdrlen)
+ether_addresses_print(netdissect_options *ndo, const u_char *src,
+                     const u_char *dst)
 {
-       const struct ether_header *ehp;
-       uint16_t length_type;
-
-       ehp = (const struct ether_header *)bp;
-
-       ND_PRINT("%s > %s",
-                etheraddr_string(ndo, ehp->ether_shost),
-                etheraddr_string(ndo, ehp->ether_dhost));
+       ND_PRINT("%s > %s, ",
+                etheraddr_string(ndo, src), etheraddr_string(ndo, dst));
+}
 
-       length_type = GET_BE_U_2(bp + (hdrlen - sizeof(ehp->ether_length_type)));
-       if (length_type <= MAX_ETHERNET_LENGTH_VAL) {
-               /*
-                * It's a length field.
-                */
-               ND_PRINT(", 802.3, length %u", length_type);
-               if (length_type > length - hdrlen)
-                       ND_PRINT(" (too large, > %u)", length - hdrlen);
-               ND_PRINT(": ");
-       } else {
-               /*
-                * It's a type field.
-                */
-               if (!ndo->ndo_qflag)
-                       ND_PRINT(", ethertype %s (0x%04x), length %u: ",
-                                tok2str(ethertype_values,"Unknown", length_type),
-                                length_type, length);
-               else
-                       ND_PRINT(", %s, length %u: ",
-                                tok2str(ethertype_values,"Unknown Ethertype (0x%04x)", length_type),
-                                length);
-       }
+static void
+ether_type_print(netdissect_options *ndo, uint16_t type)
+{
+       if (!ndo->ndo_qflag)
+               ND_PRINT("ethertype %s (0x%04x)",
+                        tok2str(ethertype_values, "Unknown", type), type);
+       else
+               ND_PRINT("%s",
+                        tok2str(ethertype_values, "Unknown Ethertype (0x%04x)", type));
 }
 
 /*
- * Print an Ethernet frame while specyfing a non-standard Ethernet header
- * length.
- * This might be encapsulated within another frame; we might be passed
- * a pointer to a function that can print header information for that
- * frame's protocol, and an argument to pass to that function.
+ * Common code for printing Ethernet frames.
  *
- * FIXME: caplen can and should be derived from ndo->ndo_snapend and p.
+ * It can handle Ethernet headers with extra tag information inserted
+ * after the destination and source addresses, as is inserted by some
+ * switch chips, and extra encapsulation header information before
+ * printing Ethernet header information (such as a LANE ID for ATM LANE).
  */
-u_int
-ether_hdr_len_print(netdissect_options *ndo,
-                   const u_char *p, u_int length, u_int caplen,
-                   void (*print_encap_header)(netdissect_options *ndo, const u_char *),
-                   const u_char *encap_header_arg, u_int hdrlen)
+static u_int
+ether_print_common(netdissect_options *ndo, const u_char *p, u_int length,
+    u_int caplen,
+    void (*print_switch_tag)(netdissect_options *ndo, const u_char *),
+    u_int switch_tag_len,
+    void (*print_encap_header)(netdissect_options *ndo, const u_char *),
+    const u_char *encap_header_arg)
 {
        const struct ether_header *ehp;
        u_int orig_length;
+       u_int hdrlen;
        u_short length_type;
+       int printed_length;
        int llc_hdrlen;
        struct lladdr_info src, dst;
 
-       /* Unless specified otherwise, assume a standard Ethernet header */
-       if (hdrlen == ETHER_HDRLEN)
-               ndo->ndo_protocol = "ether";
-
-       if (caplen < hdrlen) {
+       if (caplen < ETHER_HDRLEN + switch_tag_len) {
                nd_print_trunc(ndo);
                return (caplen);
        }
-       if (length < hdrlen) {
+       if (length < ETHER_HDRLEN + switch_tag_len) {
                nd_print_trunc(ndo);
                return (length);
        }
 
-       /* If the offset is set, then the upper printer is responsible for
-        * printing the relevant part of the Ethernet header.
-        */
-       if (ndo->ndo_eflag) {
-               if (print_encap_header != NULL)
-                       (*print_encap_header)(ndo, encap_header_arg);
-               ether_hdr_print(ndo, p, length, hdrlen);
-       }
+       if (print_encap_header != NULL)
+               (*print_encap_header)(ndo, encap_header_arg);
 
        orig_length = length;
 
-       length -= hdrlen;
-       caplen -= hdrlen;
+       /*
+        * Get the source and destination addresses, skip past them,
+        * and print them if we're printing the link-layer header.
+        */
        ehp = (const struct ether_header *)p;
-       p += hdrlen;
-
        src.addr = ehp->ether_shost;
        src.addr_string = etheraddr_string;
        dst.addr = ehp->ether_dhost;
        dst.addr_string = etheraddr_string;
-       length_type = GET_BE_U_2((const u_char *)ehp + (hdrlen - sizeof(ehp->ether_length_type)));
 
-recurse:
+       length -= 2*MAC_ADDR_LEN;
+       caplen -= 2*MAC_ADDR_LEN;
+       p += 2*MAC_ADDR_LEN;
+       hdrlen = 2*MAC_ADDR_LEN;
+
+       if (ndo->ndo_eflag)
+               ether_addresses_print(ndo, src.addr, dst.addr);
+
        /*
-        * Is it (gag) an 802.3 encapsulation?
+        * Print the switch tag, if we have one, and skip past it.
         */
-       if (length_type <= MAX_ETHERNET_LENGTH_VAL) {
-               /*
-                * The length/type field contains the length of the
-                * remaining payload; use it as such, as long as
-                * it's not too large (bigger than the actual payload).
-                */
-               if (length_type < length) {
-                       length = length_type;
-                       if (caplen > length)
-                               caplen = length;
-               }
+       if (print_switch_tag != NULL)
+               (*print_switch_tag)(ndo, p);
 
-               /*
-                * Cut off the snapshot length to the end of the payload.
-                */
-               nd_push_snapend(ndo, p + length);
+       length -= switch_tag_len;
+       caplen -= switch_tag_len;
+       p += switch_tag_len;
+       hdrlen += switch_tag_len;
 
-               /* Try to print the LLC-layer header & higher layers */
-               llc_hdrlen = llc_print(ndo, p, length, caplen, &src, &dst);
-               if (llc_hdrlen < 0) {
-                       /* packet type not known, print raw packet */
-                       if (!ndo->ndo_suppress_default_print)
-                               ND_DEFAULTPRINT(p, caplen);
-                       llc_hdrlen = -llc_hdrlen;
-               }
-               hdrlen += llc_hdrlen;
-               nd_pop_packet_info(ndo);
-               return (hdrlen);
-       } else if (length_type == ETHERTYPE_8021Q  ||
+       /*
+        * Get the length/type field, skip past it, and print it
+        * if we're printing the link-layer header.
+        */
+       length_type = GET_BE_U_2(p);
+
+       length -= 2;
+       caplen += 2;
+       p += 2;
+       hdrlen += 2;
+
+       /*
+        * Process VLAN tag types.
+        */
+       printed_length = 0;
+       while (length_type == ETHERTYPE_8021Q  ||
                length_type == ETHERTYPE_8021Q9100 ||
                length_type == ETHERTYPE_8021Q9200 ||
                length_type == ETHERTYPE_8021QinQ) {
                /*
+                * It has a VLAN tag.
                 * Print VLAN information, and then go back and process
                 * the enclosed type field.
                 */
@@ -250,27 +226,65 @@ recurse:
                if (ndo->ndo_eflag) {
                        uint16_t tag = GET_BE_U_2(p);
 
+                       ether_type_print(ndo, length_type);
+                       if (!printed_length) {
+                               ND_PRINT(", length %u: ", orig_length);
+                               printed_length = 1;
+                       } else
+                               ND_PRINT(", ");
                        ND_PRINT("%s, ", ieee8021q_tci_string(tag));
                }
 
                length_type = GET_BE_U_2(p + 2);
-               if (ndo->ndo_eflag && length_type > MAX_ETHERNET_LENGTH_VAL) {
-                       if (!ndo->ndo_qflag)
-                               ND_PRINT("ethertype %s (0x%04x), ",
-                                        tok2str(ethertype_values,"Unknown", length_type),
-                                        length_type);
-                       else
-                               ND_PRINT("%s, ",
-                                        tok2str(ethertype_values,"Unknown Ethertype (0x%04x)", length_type));
-               }
                p += 4;
                length -= 4;
                caplen -= 4;
                hdrlen += 4;
-               goto recurse;
+       }
+
+       /*
+        * We now have the final length/type field.
+        */
+       if (length_type <= MAX_ETHERNET_LENGTH_VAL) {
+               /*
+                * It's a length field, containing the length of the
+                * remaining payload; use it as such, as long as
+                * it's not too large (bigger than the actual payload).
+                */
+               if (length_type < length) {
+                       length = length_type;
+                       if (caplen > length)
+                               caplen = length;
+               }
+
+               /*
+                * Cut off the snapshot length to the end of the
+                * payload.
+                */
+               nd_push_snapend(ndo, p + length);
+
+               if (ndo->ndo_eflag) {
+                       ND_PRINT("802.3");
+                       if (!printed_length)
+                               ND_PRINT(", length %u: ", length);
+               }
+
+               /*
+                * An LLC header follows the length.  Print that and
+                * higher layers.
+                */
+               llc_hdrlen = llc_print(ndo, p, length, caplen, &src, &dst);
+               if (llc_hdrlen < 0) {
+                       /* packet type not known, print raw packet */
+                       if (!ndo->ndo_suppress_default_print)
+                               ND_DEFAULTPRINT(p, caplen);
+                       llc_hdrlen = -llc_hdrlen;
+               }
+               hdrlen += llc_hdrlen;
+               nd_pop_packet_info(ndo);
        } else if (length_type == ETHERTYPE_JUMBO) {
                /*
-                * Alteon jumbo frames.
+                * It's a type field, with the type for Alteon jumbo frames.
                 * See
                 *
                 *      http://tools.ietf.org/html/draft-ietf-isis-ext-eth-01
@@ -288,13 +302,29 @@ recurse:
                }
                hdrlen += llc_hdrlen;
        } else {
+               /*
+                * It's a type field with some other value.
+                */
+               if (ndo->ndo_eflag) {
+                       ether_type_print(ndo, length_type);
+                       if (!printed_length)
+                               ND_PRINT(", length %u: ", orig_length);
+                       else
+                               ND_PRINT(", ");
+               }
                if (ethertype_print(ndo, length_type, p, length, caplen, &src, &dst) == 0) {
                        /* type not known, print raw packet */
                        if (!ndo->ndo_eflag) {
-                               if (print_encap_header != NULL)
-                                       (*print_encap_header)(ndo, encap_header_arg);
-                               ether_hdr_print(ndo, (const u_char *)ehp, orig_length,
-                                               hdrlen);
+                               /*
+                                * We didn't print the full link-layer
+                                * header, as -e wasn't specified, so
+                                * print only the source and destination
+                                * MAC addresses and the final Ethernet
+                                * type.
+                                */
+                               ether_addresses_print(ndo, src.addr, dst.addr);
+                               ether_type_print(ndo, length_type);
+                               ND_PRINT(", length %u: ", orig_length);
                        }
 
                        if (!ndo->ndo_suppress_default_print)
@@ -304,6 +334,25 @@ recurse:
        return (hdrlen);
 }
 
+/*
+ * Print an Ethernet frame while specyfing a non-standard Ethernet header
+ * length.
+ * This might be encapsulated within another frame; we might be passed
+ * a pointer to a function that can print header information for that
+ * frame's protocol, and an argument to pass to that function.
+ *
+ * FIXME: caplen can and should be derived from ndo->ndo_snapend and p.
+ */
+u_int
+ether_print_switch_tag(netdissect_options *ndo, const u_char *p, u_int length,
+    u_int caplen,
+    void (*print_switch_tag)(netdissect_options *, const u_char *),
+    u_int switch_tag_len)
+{
+       return (ether_print_common(ndo, p, length, caplen, print_switch_tag,
+                                  switch_tag_len, NULL, NULL));
+}
+
 /*
  * Print an Ethernet frame.
  * This might be encapsulated within another frame; we might be passed
@@ -318,9 +367,9 @@ ether_print(netdissect_options *ndo,
            void (*print_encap_header)(netdissect_options *ndo, const u_char *),
            const u_char *encap_header_arg)
 {
-       return (ether_hdr_len_print(ndo, p, length, caplen,
-                                   print_encap_header, encap_header_arg,
-                                   ETHER_HDRLEN));
+       ndo->ndo_protocol = "ether";
+       return (ether_print_common(ndo, p, length, caplen, NULL, 0,
+                                   print_encap_header, encap_header_arg));
 }
 
 /*
index 34e5d58bf4707207551eb7c15ac50af0511b6c4d..71770147c5fc9968d94508c15af3e61b63c0bb6c 100644 (file)
@@ -1,23 +1,23 @@
-    1  02:10:20.634030 00:10:18:de:38:1e > ff:ff:ff:ff:ff:ff, BRCM tag OP: IG, TC: 0, TE: None, TS: 0, DST map: 0x0080, IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:10:18:de:38:1e, length 300
-    2  02:10:20.696008 00:10:18:de:38:1e > ff:ff:ff:ff:ff:ff, BRCM tag OP: IG, TC: 0, TE: None, TS: 0, DST map: 0x0020, IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:10:18:de:38:1e, length 300
-    3  02:10:23.151503 68:05:ca:18:47:70 > ff:ff:ff:ff:ff:ff, BRCM tag OP: EG, CID: 0, RC: exception, TC: 0, port: 0, IP 192.168.1.1 > 192.168.1.255: ICMP echo request, id 22737, seq 1, length 64
-    4  02:10:23.650963 00:10:18:de:38:1e > ff:ff:ff:ff:ff:ff, BRCM tag OP: IG, TC: 0, TE: None, TS: 0, DST map: 0x0080, IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:10:18:de:38:1e, length 300
-    5  02:10:23.712960 00:10:18:de:38:1e > ff:ff:ff:ff:ff:ff, BRCM tag OP: IG, TC: 0, TE: None, TS: 0, DST map: 0x0020, IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:10:18:de:38:1e, length 300
-    6  02:10:24.177588 68:05:ca:18:47:70 > ff:ff:ff:ff:ff:ff, BRCM tag OP: EG, CID: 0, RC: exception, TC: 0, port: 0, IP 192.168.1.1 > 192.168.1.255: ICMP echo request, id 22737, seq 2, length 64
-    7  02:10:25.201640 68:05:ca:18:47:70 > ff:ff:ff:ff:ff:ff, BRCM tag OP: EG, CID: 0, RC: exception, TC: 0, port: 0, IP 192.168.1.1 > 192.168.1.255: ICMP echo request, id 22737, seq 3, length 64
-    8  02:10:30.015266 68:05:ca:18:47:70 > 00:10:18:de:38:1e, BRCM tag OP: EG, CID: 0, RC: exception, TC: 0, port: 0, IP 192.168.1.1 > 192.168.1.115: ICMP echo request, id 22744, seq 1, length 64
-    9  02:10:30.015480 00:10:18:de:38:1e > 68:05:ca:18:47:70, BRCM tag OP: IG, TC: 0, TE: None, TS: 0, DST map: 0x0001, IP 192.168.1.115 > 192.168.1.1: ICMP echo reply, id 22744, seq 1, length 64
-   10  02:10:30.158348 00:10:18:de:38:1e > 68:05:ca:18:47:70, BRCM tag OP: IG, TC: 0, TE: None, TS: 0, DST map: 0x0001, IP 192.168.1.115.68 > 192.168.1.1.67: BOOTP/DHCP, Request from 00:10:18:de:38:1e, length 300
-   11  02:10:30.170023 68:05:ca:18:47:70 > 00:10:18:de:38:1e, BRCM tag OP: EG, CID: 0, RC: exception, TC: 0, port: 0, IP 192.168.1.1.67 > 192.168.1.115.68: BOOTP/DHCP, Reply, length 300
-   12  02:10:33.178632 00:10:18:de:38:1e > 68:05:ca:18:47:74, BRCM tag OP: IG, TC: 0, TE: None, TS: 0, DST map: 0x0002, IP 192.168.3.23.68 > 192.168.3.1.67: BOOTP/DHCP, Request from 00:10:18:de:38:1e, length 300
-   13  02:10:33.191027 68:05:ca:18:47:74 > 00:10:18:de:38:1e, BRCM tag OP: EG, CID: 0, RC: exception, TC: 0, port: 1, IP 192.168.3.1.67 > 192.168.3.23.68: BOOTP/DHCP, Reply, length 300
-   14  02:10:35.080973 00:10:18:de:38:1e > 68:05:ca:18:47:70, BRCM tag OP: IG, TC: 0, TE: None, TS: 0, DST map: 0x0001, ARP, Request who-has 192.168.1.1 tell 192.168.1.115, length 50
-   15  02:10:35.081198 68:05:ca:18:47:70 > 00:10:18:de:38:1e, BRCM tag OP: EG, CID: 0, RC: exception, TC: 0, port: 0, ARP, Reply 192.168.1.1 is-at 68:05:ca:18:47:70, length 46
-   16  02:10:35.249563 68:05:ca:18:47:70 > 00:10:18:de:38:1e, BRCM tag OP: EG, CID: 0, RC: exception, TC: 0, port: 0, ARP, Request who-has 192.168.1.115 tell 192.168.1.1, length 46
-   17  02:10:35.249634 00:10:18:de:38:1e > 68:05:ca:18:47:70, BRCM tag OP: IG, TC: 0, TE: None, TS: 0, DST map: 0x0001, ARP, Reply 192.168.1.115 is-at 00:10:18:de:38:1e, length 50
-   18  02:10:36.495763 68:05:ca:18:47:74 > 00:10:18:de:38:1e, BRCM tag OP: EG, CID: 0, RC: exception, TC: 0, port: 1, IP 192.168.3.1 > 192.168.3.23: ICMP echo request, id 22748, seq 1, length 64
-   19  02:10:36.495906 00:10:18:de:38:1e > 68:05:ca:18:47:74, BRCM tag OP: IG, TC: 0, TE: None, TS: 0, DST map: 0x0002, IP 192.168.3.23 > 192.168.3.1: ICMP echo reply, id 22748, seq 1, length 64
-   20  02:10:37.521654 68:05:ca:18:47:74 > 00:10:18:de:38:1e, BRCM tag OP: EG, CID: 0, RC: exception, TC: 0, port: 1, IP 192.168.3.1 > 192.168.3.23: ICMP echo request, id 22748, seq 2, length 64
-   21  02:10:37.521717 00:10:18:de:38:1e > 68:05:ca:18:47:74, BRCM tag OP: IG, TC: 0, TE: None, TS: 0, DST map: 0x0002, IP 192.168.3.23 > 192.168.3.1: ICMP echo reply, id 22748, seq 2, length 64
-   22  02:10:38.321557 68:05:ca:18:47:74 > 00:10:18:de:38:1e, BRCM tag OP: EG, CID: 0, RC: exception, TC: 0, port: 1, ARP, Request who-has 192.168.3.23 tell 192.168.3.1, length 46
-   23  02:10:38.321602 00:10:18:de:38:1e > 68:05:ca:18:47:74, BRCM tag OP: IG, TC: 0, TE: None, TS: 0, DST map: 0x0002, ARP, Reply 192.168.3.23 is-at 00:10:18:de:38:1e, length 50
+    1  02:10:20.634030 00:10:18:de:38:1e > ff:ff:ff:ff:ff:ff, BRCM tag OP: IG, TC: 0, TE: None, TS: 0, DST map: 0x0080, ethertype IPv4 (0x0800), length 346: 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:10:18:de:38:1e, length 300
+    2  02:10:20.696008 00:10:18:de:38:1e > ff:ff:ff:ff:ff:ff, BRCM tag OP: IG, TC: 0, TE: None, TS: 0, DST map: 0x0020, ethertype IPv4 (0x0800), length 346: 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:10:18:de:38:1e, length 300
+    3  02:10:23.151503 68:05:ca:18:47:70 > ff:ff:ff:ff:ff:ff, BRCM tag OP: EG, CID: 0, RC: exception, TC: 0, port: 0, ethertype IPv4 (0x0800), length 102: 192.168.1.1 > 192.168.1.255: ICMP echo request, id 22737, seq 1, length 64
+    4  02:10:23.650963 00:10:18:de:38:1e > ff:ff:ff:ff:ff:ff, BRCM tag OP: IG, TC: 0, TE: None, TS: 0, DST map: 0x0080, ethertype IPv4 (0x0800), length 346: 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:10:18:de:38:1e, length 300
+    5  02:10:23.712960 00:10:18:de:38:1e > ff:ff:ff:ff:ff:ff, BRCM tag OP: IG, TC: 0, TE: None, TS: 0, DST map: 0x0020, ethertype IPv4 (0x0800), length 346: 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:10:18:de:38:1e, length 300
+    6  02:10:24.177588 68:05:ca:18:47:70 > ff:ff:ff:ff:ff:ff, BRCM tag OP: EG, CID: 0, RC: exception, TC: 0, port: 0, ethertype IPv4 (0x0800), length 102: 192.168.1.1 > 192.168.1.255: ICMP echo request, id 22737, seq 2, length 64
+    7  02:10:25.201640 68:05:ca:18:47:70 > ff:ff:ff:ff:ff:ff, BRCM tag OP: EG, CID: 0, RC: exception, TC: 0, port: 0, ethertype IPv4 (0x0800), length 102: 192.168.1.1 > 192.168.1.255: ICMP echo request, id 22737, seq 3, length 64
+    8  02:10:30.015266 68:05:ca:18:47:70 > 00:10:18:de:38:1e, BRCM tag OP: EG, CID: 0, RC: exception, TC: 0, port: 0, ethertype IPv4 (0x0800), length 102: 192.168.1.1 > 192.168.1.115: ICMP echo request, id 22744, seq 1, length 64
+    9  02:10:30.015480 00:10:18:de:38:1e > 68:05:ca:18:47:70, BRCM tag OP: IG, TC: 0, TE: None, TS: 0, DST map: 0x0001, ethertype IPv4 (0x0800), length 102: 192.168.1.115 > 192.168.1.1: ICMP echo reply, id 22744, seq 1, length 64
+   10  02:10:30.158348 00:10:18:de:38:1e > 68:05:ca:18:47:70, BRCM tag OP: IG, TC: 0, TE: None, TS: 0, DST map: 0x0001, ethertype IPv4 (0x0800), length 346: 192.168.1.115.68 > 192.168.1.1.67: BOOTP/DHCP, Request from 00:10:18:de:38:1e, length 300
+   11  02:10:30.170023 68:05:ca:18:47:70 > 00:10:18:de:38:1e, BRCM tag OP: EG, CID: 0, RC: exception, TC: 0, port: 0, ethertype IPv4 (0x0800), length 346: 192.168.1.1.67 > 192.168.1.115.68: BOOTP/DHCP, Reply, length 300
+   12  02:10:33.178632 00:10:18:de:38:1e > 68:05:ca:18:47:74, BRCM tag OP: IG, TC: 0, TE: None, TS: 0, DST map: 0x0002, ethertype IPv4 (0x0800), length 346: 192.168.3.23.68 > 192.168.3.1.67: BOOTP/DHCP, Request from 00:10:18:de:38:1e, length 300
+   13  02:10:33.191027 68:05:ca:18:47:74 > 00:10:18:de:38:1e, BRCM tag OP: EG, CID: 0, RC: exception, TC: 0, port: 1, ethertype IPv4 (0x0800), length 346: 192.168.3.1.67 > 192.168.3.23.68: BOOTP/DHCP, Reply, length 300
+   14  02:10:35.080973 00:10:18:de:38:1e > 68:05:ca:18:47:70, BRCM tag OP: IG, TC: 0, TE: None, TS: 0, DST map: 0x0001, ethertype ARP (0x0806), length 68: Request who-has 192.168.1.1 tell 192.168.1.115, length 50
+   15  02:10:35.081198 68:05:ca:18:47:70 > 00:10:18:de:38:1e, BRCM tag OP: EG, CID: 0, RC: exception, TC: 0, port: 0, ethertype ARP (0x0806), length 64: Reply 192.168.1.1 is-at 68:05:ca:18:47:70, length 46
+   16  02:10:35.249563 68:05:ca:18:47:70 > 00:10:18:de:38:1e, BRCM tag OP: EG, CID: 0, RC: exception, TC: 0, port: 0, ethertype ARP (0x0806), length 64: Request who-has 192.168.1.115 tell 192.168.1.1, length 46
+   17  02:10:35.249634 00:10:18:de:38:1e > 68:05:ca:18:47:70, BRCM tag OP: IG, TC: 0, TE: None, TS: 0, DST map: 0x0001, ethertype ARP (0x0806), length 68: Reply 192.168.1.115 is-at 00:10:18:de:38:1e, length 50
+   18  02:10:36.495763 68:05:ca:18:47:74 > 00:10:18:de:38:1e, BRCM tag OP: EG, CID: 0, RC: exception, TC: 0, port: 1, ethertype IPv4 (0x0800), length 102: 192.168.3.1 > 192.168.3.23: ICMP echo request, id 22748, seq 1, length 64
+   19  02:10:36.495906 00:10:18:de:38:1e > 68:05:ca:18:47:74, BRCM tag OP: IG, TC: 0, TE: None, TS: 0, DST map: 0x0002, ethertype IPv4 (0x0800), length 102: 192.168.3.23 > 192.168.3.1: ICMP echo reply, id 22748, seq 1, length 64
+   20  02:10:37.521654 68:05:ca:18:47:74 > 00:10:18:de:38:1e, BRCM tag OP: EG, CID: 0, RC: exception, TC: 0, port: 1, ethertype IPv4 (0x0800), length 102: 192.168.3.1 > 192.168.3.23: ICMP echo request, id 22748, seq 2, length 64
+   21  02:10:37.521717 00:10:18:de:38:1e > 68:05:ca:18:47:74, BRCM tag OP: IG, TC: 0, TE: None, TS: 0, DST map: 0x0002, ethertype IPv4 (0x0800), length 102: 192.168.3.23 > 192.168.3.1: ICMP echo reply, id 22748, seq 2, length 64
+   22  02:10:38.321557 68:05:ca:18:47:74 > 00:10:18:de:38:1e, BRCM tag OP: EG, CID: 0, RC: exception, TC: 0, port: 1, ethertype ARP (0x0806), length 64: Request who-has 192.168.3.23 tell 192.168.3.1, length 46
+   23  02:10:38.321602 00:10:18:de:38:1e > 68:05:ca:18:47:74, BRCM tag OP: IG, TC: 0, TE: None, TS: 0, DST map: 0x0002, ethertype ARP (0x0806), length 68: Reply 192.168.3.23 is-at 00:10:18:de:38:1e, length 50
index 6dcadf25a794df1461901dfbf35f99da50d8d277..b22dbec715260715b4b300933b283fc424a1c544 100644 (file)
@@ -1,8 +1,8 @@
-    1  22:21:39.544060 00:50:b6:29:10:70 > d6:c5:28:21:3e:af, Marvell DSA mode Forward, dev 0, port 1, untagged, VID 0, FPri 0, IP 192.168.30.1 > 192.168.30.2: ICMP echo request, id 13586, seq 1, length 64
-    2  22:21:39.544382 d6:c5:28:21:3e:af > 00:50:b6:29:10:70, Marvell DSA mode From CPU, target dev 0, port 1, untagged, VID 0, FPri 0, IP 192.168.30.2 > 192.168.30.1: ICMP echo reply, id 13586, seq 1, length 64
-    3  22:21:40.563126 00:50:b6:29:10:70 > d6:c5:28:21:3e:af, Marvell DSA mode Forward, dev 0, port 1, untagged, VID 0, FPri 0, IP 192.168.30.1 > 192.168.30.2: ICMP echo request, id 13586, seq 2, length 64
-    4  22:21:40.563252 d6:c5:28:21:3e:af > 00:50:b6:29:10:70, Marvell DSA mode From CPU, target dev 0, port 1, untagged, VID 0, FPri 0, IP 192.168.30.2 > 192.168.30.1: ICMP echo reply, id 13586, seq 2, length 64
-    5  22:21:41.576445 00:50:b6:29:10:70 > d6:c5:28:21:3e:af, Marvell DSA mode Forward, dev 0, port 1, untagged, VID 0, FPri 0, IP 192.168.30.1 > 192.168.30.2: ICMP echo request, id 13586, seq 3, length 64
-    6  22:21:41.576541 d6:c5:28:21:3e:af > 00:50:b6:29:10:70, Marvell DSA mode From CPU, target dev 0, port 1, untagged, VID 0, FPri 0, IP 192.168.30.2 > 192.168.30.1: ICMP echo reply, id 13586, seq 3, length 64
-    7  22:21:44.560086 d6:c5:28:21:3e:af > 00:50:b6:29:10:70, Marvell DSA mode From CPU, target dev 0, port 1, untagged, VID 0, FPri 0, ARP, Request who-has 192.168.30.1 tell 192.168.30.2, length 28
-    8  22:21:44.560415 00:50:b6:29:10:70 > d6:c5:28:21:3e:af, Marvell DSA mode Forward, dev 0, port 1, untagged, VID 0, FPri 0, ARP, Reply 192.168.30.1 is-at 00:50:b6:29:10:70, length 46
+    1  22:21:39.544060 00:50:b6:29:10:70 > d6:c5:28:21:3e:af, Marvell DSA mode Forward, dev 0, port 1, untagged, VID 0, FPri 0, ethertype IPv4 (0x0800), length 102: 192.168.30.1 > 192.168.30.2: ICMP echo request, id 13586, seq 1, length 64
+    2  22:21:39.544382 d6:c5:28:21:3e:af > 00:50:b6:29:10:70, Marvell DSA mode From CPU, target dev 0, port 1, untagged, VID 0, FPri 0, ethertype IPv4 (0x0800), length 102: 192.168.30.2 > 192.168.30.1: ICMP echo reply, id 13586, seq 1, length 64
+    3  22:21:40.563126 00:50:b6:29:10:70 > d6:c5:28:21:3e:af, Marvell DSA mode Forward, dev 0, port 1, untagged, VID 0, FPri 0, ethertype IPv4 (0x0800), length 102: 192.168.30.1 > 192.168.30.2: ICMP echo request, id 13586, seq 2, length 64
+    4  22:21:40.563252 d6:c5:28:21:3e:af > 00:50:b6:29:10:70, Marvell DSA mode From CPU, target dev 0, port 1, untagged, VID 0, FPri 0, ethertype IPv4 (0x0800), length 102: 192.168.30.2 > 192.168.30.1: ICMP echo reply, id 13586, seq 2, length 64
+    5  22:21:41.576445 00:50:b6:29:10:70 > d6:c5:28:21:3e:af, Marvell DSA mode Forward, dev 0, port 1, untagged, VID 0, FPri 0, ethertype IPv4 (0x0800), length 102: 192.168.30.1 > 192.168.30.2: ICMP echo request, id 13586, seq 3, length 64
+    6  22:21:41.576541 d6:c5:28:21:3e:af > 00:50:b6:29:10:70, Marvell DSA mode From CPU, target dev 0, port 1, untagged, VID 0, FPri 0, ethertype IPv4 (0x0800), length 102: 192.168.30.2 > 192.168.30.1: ICMP echo reply, id 13586, seq 3, length 64
+    7  22:21:44.560086 d6:c5:28:21:3e:af > 00:50:b6:29:10:70, Marvell DSA mode From CPU, target dev 0, port 1, untagged, VID 0, FPri 0, ethertype ARP (0x0806), length 46: Request who-has 192.168.30.1 tell 192.168.30.2, length 28
+    8  22:21:44.560415 00:50:b6:29:10:70 > d6:c5:28:21:3e:af, Marvell DSA mode Forward, dev 0, port 1, untagged, VID 0, FPri 0, ethertype ARP (0x0806), length 64: Reply 192.168.30.1 is-at 00:50:b6:29:10:70, length 46
index 314eccfde4f873b03007131e6094a901b2ec1114..2c04deee31e7b626557fd63c8bcc50fe29787fc6 100644 (file)
@@ -1,10 +1,10 @@
-    1  22:21:44.604675 00:50:b6:29:10:7e > c6:e8:9f:7d:69:da, Marvell EDSA ethertype 0xdada (Unknown), rsvd 0 0, mode Forward, dev 0, port 0, untagged, VID 0, FPri 0, IP 192.168.20.1 > 192.168.20.2: ICMP echo request, id 13583, seq 1, length 64
-    2  22:21:44.604995 c6:e8:9f:7d:69:da > 00:50:b6:29:10:7e, Marvell EDSA ethertype 0xdada (Unknown), rsvd 0 0, mode From CPU, target dev 0, port 0, untagged, VID 0, FPri 0, IP 192.168.20.2 > 192.168.20.1: ICMP echo reply, id 13583, seq 1, length 64
-    3  22:21:45.622749 00:50:b6:29:10:7e > c6:e8:9f:7d:69:da, Marvell EDSA ethertype 0xdada (Unknown), rsvd 0 0, mode Forward, dev 0, port 0, untagged, VID 0, FPri 0, IP 192.168.20.1 > 192.168.20.2: ICMP echo request, id 13583, seq 2, length 64
-    4  22:21:45.622883 c6:e8:9f:7d:69:da > 00:50:b6:29:10:7e, Marvell EDSA ethertype 0xdada (Unknown), rsvd 0 0, mode From CPU, target dev 0, port 0, untagged, VID 0, FPri 0, IP 192.168.20.2 > 192.168.20.1: ICMP echo reply, id 13583, seq 2, length 64
-    5  22:21:46.636035 00:50:b6:29:10:7e > c6:e8:9f:7d:69:da, Marvell EDSA ethertype 0xdada (Unknown), rsvd 0 0, mode Forward, dev 0, port 0, untagged, VID 0, FPri 0, IP 192.168.20.1 > 192.168.20.2: ICMP echo request, id 13583, seq 3, length 64
-    6  22:21:46.636142 c6:e8:9f:7d:69:da > 00:50:b6:29:10:7e, Marvell EDSA ethertype 0xdada (Unknown), rsvd 0 0, mode From CPU, target dev 0, port 0, untagged, VID 0, FPri 0, IP 192.168.20.2 > 192.168.20.1: ICMP echo reply, id 13583, seq 3, length 64
-    7  22:21:49.680084 c6:e8:9f:7d:69:da > 00:50:b6:29:10:7e, Marvell EDSA ethertype 0xdada (Unknown), rsvd 0 0, mode From CPU, target dev 0, port 0, untagged, VID 0, FPri 0, ARP, Request who-has 192.168.20.1 tell 192.168.20.2, length 28
-    8  22:21:49.680474 00:50:b6:29:10:7e > c6:e8:9f:7d:69:da, Marvell EDSA ethertype 0xdada (Unknown), rsvd 0 0, mode Forward, dev 0, port 0, untagged, VID 0, FPri 0, ARP, Reply 192.168.20.1 is-at 00:50:b6:29:10:7e, length 46
-    9  22:21:49.809266 00:50:b6:29:10:7e > c6:e8:9f:7d:69:da, Marvell EDSA ethertype 0xdada (Unknown), rsvd 0 0, mode Forward, dev 0, port 0, untagged, VID 0, FPri 0, ARP, Request who-has 192.168.20.2 tell 192.168.20.1, length 46
-   10  22:21:49.809342 c6:e8:9f:7d:69:da > 00:50:b6:29:10:7e, Marvell EDSA ethertype 0xdada (Unknown), rsvd 0 0, mode From CPU, target dev 0, port 0, untagged, VID 0, FPri 0, ARP, Reply 192.168.20.2 is-at c6:e8:9f:7d:69:da, length 28
+    1  22:21:44.604675 00:50:b6:29:10:7e > c6:e8:9f:7d:69:da, Marvell EDSA ethertype 0xdada (Unknown), rsvd 0 0, mode Forward, dev 0, port 0, untagged, VID 0, FPri 0, ethertype IPv4 (0x0800), length 106: 192.168.20.1 > 192.168.20.2: ICMP echo request, id 13583, seq 1, length 64
+    2  22:21:44.604995 c6:e8:9f:7d:69:da > 00:50:b6:29:10:7e, Marvell EDSA ethertype 0xdada (Unknown), rsvd 0 0, mode From CPU, target dev 0, port 0, untagged, VID 0, FPri 0, ethertype IPv4 (0x0800), length 106: 192.168.20.2 > 192.168.20.1: ICMP echo reply, id 13583, seq 1, length 64
+    3  22:21:45.622749 00:50:b6:29:10:7e > c6:e8:9f:7d:69:da, Marvell EDSA ethertype 0xdada (Unknown), rsvd 0 0, mode Forward, dev 0, port 0, untagged, VID 0, FPri 0, ethertype IPv4 (0x0800), length 106: 192.168.20.1 > 192.168.20.2: ICMP echo request, id 13583, seq 2, length 64
+    4  22:21:45.622883 c6:e8:9f:7d:69:da > 00:50:b6:29:10:7e, Marvell EDSA ethertype 0xdada (Unknown), rsvd 0 0, mode From CPU, target dev 0, port 0, untagged, VID 0, FPri 0, ethertype IPv4 (0x0800), length 106: 192.168.20.2 > 192.168.20.1: ICMP echo reply, id 13583, seq 2, length 64
+    5  22:21:46.636035 00:50:b6:29:10:7e > c6:e8:9f:7d:69:da, Marvell EDSA ethertype 0xdada (Unknown), rsvd 0 0, mode Forward, dev 0, port 0, untagged, VID 0, FPri 0, ethertype IPv4 (0x0800), length 106: 192.168.20.1 > 192.168.20.2: ICMP echo request, id 13583, seq 3, length 64
+    6  22:21:46.636142 c6:e8:9f:7d:69:da > 00:50:b6:29:10:7e, Marvell EDSA ethertype 0xdada (Unknown), rsvd 0 0, mode From CPU, target dev 0, port 0, untagged, VID 0, FPri 0, ethertype IPv4 (0x0800), length 106: 192.168.20.2 > 192.168.20.1: ICMP echo reply, id 13583, seq 3, length 64
+    7  22:21:49.680084 c6:e8:9f:7d:69:da > 00:50:b6:29:10:7e, Marvell EDSA ethertype 0xdada (Unknown), rsvd 0 0, mode From CPU, target dev 0, port 0, untagged, VID 0, FPri 0, ethertype ARP (0x0806), length 50: Request who-has 192.168.20.1 tell 192.168.20.2, length 28
+    8  22:21:49.680474 00:50:b6:29:10:7e > c6:e8:9f:7d:69:da, Marvell EDSA ethertype 0xdada (Unknown), rsvd 0 0, mode Forward, dev 0, port 0, untagged, VID 0, FPri 0, ethertype ARP (0x0806), length 68: Reply 192.168.20.1 is-at 00:50:b6:29:10:7e, length 46
+    9  22:21:49.809266 00:50:b6:29:10:7e > c6:e8:9f:7d:69:da, Marvell EDSA ethertype 0xdada (Unknown), rsvd 0 0, mode Forward, dev 0, port 0, untagged, VID 0, FPri 0, ethertype ARP (0x0806), length 68: Request who-has 192.168.20.2 tell 192.168.20.1, length 46
+   10  22:21:49.809342 c6:e8:9f:7d:69:da > 00:50:b6:29:10:7e, Marvell EDSA ethertype 0xdada (Unknown), rsvd 0 0, mode From CPU, target dev 0, port 0, untagged, VID 0, FPri 0, ethertype ARP (0x0806), length 50: Reply 192.168.20.2 is-at c6:e8:9f:7d:69:da, length 28