]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-openflow-1.0.c
CI: Clean in ../libpcap only if present. [skip ci]
[tcpdump] / print-openflow-1.0.c
index aaef064912d02e3bf0387f573619379d8f774a21..1d7f2474875e9c3c4fed72e729b0393b894a792e 100644 (file)
@@ -1018,7 +1018,18 @@ of10_packet_data_print(netdissect_options *ndo,
        }
        ndo->ndo_vflag -= 3;
        ND_PRINT(", frame decoding below\n");
+       /*
+        * The encapsulated Ethernet frame is not necessarily the last
+        * data of this packet (i.e. there may be more OpenFlow messages
+        * after the current OFPT_PACKET_IN/OFPT_PACKET_OUT message, in
+        * which case the current (outer) packet's snapshot end is not
+        * what ether_print() needs to decode an Ethernet frame nested in
+        * the middle of a TCP payload.
+        */
+       const u_char *snapend_save = ndo->ndo_snapend;
+       ndo->ndo_snapend = ND_MIN(cp + len, ndo->ndo_snapend);
        ether_print(ndo, cp, len, ND_BYTES_AVAILABLE_AFTER(cp), NULL, NULL);
+       ndo->ndo_snapend = snapend_save;
        ndo->ndo_vflag += 3;
 }
 
@@ -1038,7 +1049,7 @@ of10_phy_port_print(netdissect_options *ndo,
        cp += MAC_ADDR_LEN;
        /* name */
        ND_PRINT(", name '");
-       (void)nd_print(ndo, cp, cp + OFP_MAX_PORT_NAME_LEN);
+       nd_printjnp(ndo, cp, OFP_MAX_PORT_NAME_LEN);
        ND_PRINT("'");
        cp += OFP_MAX_PORT_NAME_LEN;
 
@@ -1670,27 +1681,27 @@ of10_desc_stats_reply_print(netdissect_options *ndo,
                goto invalid;
        /* mfr_desc */
        ND_PRINT("\n\t  mfr_desc '");
-       (void)nd_print(ndo, cp, cp + DESC_STR_LEN);
+       nd_printjnp(ndo, cp, DESC_STR_LEN);
        ND_PRINT("'");
        OF_FWD(DESC_STR_LEN);
        /* hw_desc */
        ND_PRINT("\n\t  hw_desc '");
-       (void)nd_print(ndo, cp, cp + DESC_STR_LEN);
+       nd_printjnp(ndo, cp, DESC_STR_LEN);
        ND_PRINT("'");
        OF_FWD(DESC_STR_LEN);
        /* sw_desc */
        ND_PRINT("\n\t  sw_desc '");
-       (void)nd_print(ndo, cp, cp + DESC_STR_LEN);
+       nd_printjnp(ndo, cp, DESC_STR_LEN);
        ND_PRINT("'");
        OF_FWD(DESC_STR_LEN);
        /* serial_num */
        ND_PRINT("\n\t  serial_num '");
-       (void)nd_print(ndo, cp, cp + SERIAL_NUM_LEN);
+       nd_printjnp(ndo, cp, SERIAL_NUM_LEN);
        ND_PRINT("'");
        OF_FWD(SERIAL_NUM_LEN);
        /* dp_desc */
        ND_PRINT("\n\t  dp_desc '");
-       (void)nd_print(ndo, cp, cp + DESC_STR_LEN);
+       nd_printjnp(ndo, cp, DESC_STR_LEN);
        ND_PRINT("'");
        return;
 
@@ -1803,7 +1814,7 @@ of10_table_stats_reply_print(netdissect_options *ndo,
                OF_FWD(3);
                /* name */
                ND_PRINT(", name '");
-               (void)nd_print(ndo, cp, cp + OFP_MAX_TABLE_NAME_LEN);
+               nd_printjnp(ndo, cp, OFP_MAX_TABLE_NAME_LEN);
                ND_PRINT("'");
                OF_FWD(OFP_MAX_TABLE_NAME_LEN);
                /* wildcards */