X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/a6c16ed8abc9d0a126a18a39279a9e7b3bde0ef3..d08b4abef4de825b3aecbb7c7e7601ac010806fc:/print-openflow-1.0.c diff --git a/print-openflow-1.0.c b/print-openflow-1.0.c index 08739f09..73a9fd88 100644 --- a/print-openflow-1.0.c +++ b/print-openflow-1.0.c @@ -8,6 +8,13 @@ * * [OF10] http://www.openflow.org/documents/openflow-spec-v1.0.0.pdf * + * Decoding of Ethernet frames nested in OFPT_PACKET_IN and OFPT_PACKET_OUT + * messages is done only when the verbosity level set by command-line argument + * is "-vvv" or higher. In that case the verbosity level is temporarily + * decremented by 3 during the nested frame decoding. For example, running + * tcpdump with "-vvvv" will do full decoding of OpenFlow and "-v" decoding of + * the nested frames. + * * * Copyright (c) 2013 The TCPDUMP project * All rights reserved. @@ -44,11 +51,36 @@ #include "interface.h" #include "extract.h" #include "addrtoname.h" +#include "ether.h" #include "ethertype.h" #include "ipproto.h" #include "openflow.h" -#include "openflow-1.0.h" +static const char tstr[] = " [|openflow]"; +static const char cstr[] = " (corrupt)"; + +#define OFPT_HELLO 0x00 +#define OFPT_ERROR 0x01 +#define OFPT_ECHO_REQUEST 0x02 +#define OFPT_ECHO_REPLY 0x03 +#define OFPT_VENDOR 0x04 +#define OFPT_FEATURES_REQUEST 0x05 +#define OFPT_FEATURES_REPLY 0x06 +#define OFPT_GET_CONFIG_REQUEST 0x07 +#define OFPT_GET_CONFIG_REPLY 0x08 +#define OFPT_SET_CONFIG 0x09 +#define OFPT_PACKET_IN 0x0a +#define OFPT_FLOW_REMOVED 0x0b +#define OFPT_PORT_STATUS 0x0c +#define OFPT_PACKET_OUT 0x0d +#define OFPT_FLOW_MOD 0x0e +#define OFPT_PORT_MOD 0x0f +#define OFPT_STATS_REQUEST 0x10 +#define OFPT_STATS_REPLY 0x11 +#define OFPT_BARRIER_REQUEST 0x12 +#define OFPT_BARRIER_REPLY 0x13 +#define OFPT_QUEUE_GET_CONFIG_REQUEST 0x14 +#define OFPT_QUEUE_GET_CONFIG_REPLY 0x15 static const struct tok ofpt_str[] = { { OFPT_HELLO, "HELLO" }, { OFPT_ERROR, "ERROR" }, @@ -75,6 +107,13 @@ static const struct tok ofpt_str[] = { { 0, NULL } }; +#define OFPPC_PORT_DOWN (1 << 0) +#define OFPPC_NO_STP (1 << 1) +#define OFPPC_NO_RECV (1 << 2) +#define OFPPC_NO_RECV_STP (1 << 3) +#define OFPPC_NO_FLOOD (1 << 4) +#define OFPPC_NO_FWD (1 << 5) +#define OFPPC_NO_PACKET_IN (1 << 6) static const struct tok ofppc_bm[] = { { OFPPC_PORT_DOWN, "PORT_DOWN" }, { OFPPC_NO_STP, "NO_STP" }, @@ -89,6 +128,12 @@ static const struct tok ofppc_bm[] = { OFPPC_NO_RECV_STP | OFPPC_NO_FLOOD | OFPPC_NO_FWD | \ OFPPC_NO_PACKET_IN)) +#define OFPPS_LINK_DOWN (1 << 0) +#define OFPPS_STP_LISTEN (0 << 8) +#define OFPPS_STP_LEARN (1 << 8) +#define OFPPS_STP_FORWARD (2 << 8) +#define OFPPS_STP_BLOCK (3 << 8) +#define OFPPS_STP_MASK (3 << 8) static const struct tok ofpps_bm[] = { { OFPPS_LINK_DOWN, "LINK_DOWN" }, { OFPPS_STP_LISTEN, "STP_LISTEN" }, @@ -100,6 +145,15 @@ static const struct tok ofpps_bm[] = { #define OFPPS_U (~(OFPPS_LINK_DOWN | OFPPS_STP_LISTEN | OFPPS_STP_LEARN | \ OFPPS_STP_FORWARD | OFPPS_STP_BLOCK)) +#define OFPP_MAX 0xff00 +#define OFPP_IN_PORT 0xfff8 +#define OFPP_TABLE 0xfff9 +#define OFPP_NORMAL 0xfffa +#define OFPP_FLOOD 0xfffb +#define OFPP_ALL 0xfffc +#define OFPP_CONTROLLER 0xfffd +#define OFPP_LOCAL 0xfffe +#define OFPP_NONE 0xffff static const struct tok ofpp_str[] = { { OFPP_MAX, "MAX" }, { OFPP_IN_PORT, "IN_PORT" }, @@ -113,6 +167,18 @@ static const struct tok ofpp_str[] = { { 0, NULL } }; +#define OFPPF_10MB_HD (1 << 0) +#define OFPPF_10MB_FD (1 << 1) +#define OFPPF_100MB_HD (1 << 2) +#define OFPPF_100MB_FD (1 << 3) +#define OFPPF_1GB_HD (1 << 4) +#define OFPPF_1GB_FD (1 << 5) +#define OFPPF_10GB_FD (1 << 6) +#define OFPPF_COPPER (1 << 7) +#define OFPPF_FIBER (1 << 8) +#define OFPPF_AUTONEG (1 << 9) +#define OFPPF_PAUSE (1 << 10) +#define OFPPF_PAUSE_ASYM (1 << 11) static const struct tok ofppf_bm[] = { { OFPPF_10MB_HD, "10MB_HD" }, { OFPPF_10MB_FD, "10MB_FD" }, @@ -133,12 +199,31 @@ static const struct tok ofppf_bm[] = { OFPPF_10GB_FD | OFPPF_COPPER | OFPPF_FIBER | \ OFPPF_AUTONEG | OFPPF_PAUSE | OFPPF_PAUSE_ASYM)) +#define OFPQT_NONE 0x0000 +#define OFPQT_MIN_RATE 0x0001 static const struct tok ofpqt_str[] = { { OFPQT_NONE, "NONE" }, { OFPQT_MIN_RATE, "MIN_RATE" }, { 0, NULL } }; +#define OFPFW_IN_PORT (1 << 0) +#define OFPFW_DL_VLAN (1 << 1) +#define OFPFW_DL_SRC (1 << 2) +#define OFPFW_DL_DST (1 << 3) +#define OFPFW_DL_TYPE (1 << 4) +#define OFPFW_NW_PROTO (1 << 5) +#define OFPFW_TP_SRC (1 << 6) +#define OFPFW_TP_DST (1 << 7) +#define OFPFW_NW_SRC_SHIFT 8 +#define OFPFW_NW_SRC_BITS 6 +#define OFPFW_NW_SRC_MASK (((1 << OFPFW_NW_SRC_BITS) - 1) << OFPFW_NW_SRC_SHIFT) +#define OFPFW_NW_DST_SHIFT 14 +#define OFPFW_NW_DST_BITS 6 +#define OFPFW_NW_DST_MASK (((1 << OFPFW_NW_DST_BITS) - 1) << OFPFW_NW_DST_SHIFT) +#define OFPFW_DL_VLAN_PCP (1 << 20) +#define OFPFW_NW_TOS (1 << 21) +#define OFPFW_ALL ((1 << 22) - 1) static const struct tok ofpfw_bm[] = { { OFPFW_IN_PORT, "IN_PORT" }, { OFPFW_DL_VLAN, "DL_VLAN" }, @@ -158,6 +243,19 @@ static const struct tok ofpfw_bm[] = { * they are not reported as bogus in the decoding. */ #define OFPFW_U (~(OFPFW_ALL)) +#define OFPAT_OUTPUT 0x0000 +#define OFPAT_SET_VLAN_VID 0x0001 +#define OFPAT_SET_VLAN_PCP 0x0002 +#define OFPAT_STRIP_VLAN 0x0003 +#define OFPAT_SET_DL_SRC 0x0004 +#define OFPAT_SET_DL_DST 0x0005 +#define OFPAT_SET_NW_SRC 0x0006 +#define OFPAT_SET_NW_DST 0x0007 +#define OFPAT_SET_NW_TOS 0x0008 +#define OFPAT_SET_TP_SRC 0x0009 +#define OFPAT_SET_TP_DST 0x000a +#define OFPAT_ENQUEUE 0x000b +#define OFPAT_VENDOR 0xffff static const struct tok ofpat_str[] = { { OFPAT_OUTPUT, "OUTPUT" }, { OFPAT_SET_VLAN_VID, "SET_VLAN_VID" }, @@ -198,6 +296,14 @@ static const struct tok ofpat_bm[] = { 1 << OFPAT_SET_NW_TOS | 1 << OFPAT_SET_TP_SRC | \ 1 << OFPAT_SET_TP_DST | 1 << OFPAT_ENQUEUE)) +#define OFPC_FLOW_STATS (1 << 0) +#define OFPC_TABLE_STATS (1 << 1) +#define OFPC_PORT_STATS (1 << 2) +#define OFPC_STP (1 << 3) +#define OFPC_RESERVED (1 << 4) +#define OFPC_IP_REASM (1 << 5) +#define OFPC_QUEUE_STATS (1 << 6) +#define OFPC_ARP_MATCH_IP (1 << 7) static const struct tok ofp_capabilities_bm[] = { { OFPC_FLOW_STATS, "FLOW_STATS" }, { OFPC_TABLE_STATS, "TABLE_STATS" }, @@ -213,6 +319,10 @@ static const struct tok ofp_capabilities_bm[] = { OFPC_STP | OFPC_IP_REASM | OFPC_QUEUE_STATS | \ OFPC_ARP_MATCH_IP)) +#define OFPC_FRAG_NORMAL 0x0000 +#define OFPC_FRAG_DROP 0x0001 +#define OFPC_FRAG_REASM 0x0002 +#define OFPC_FRAG_MASK 0x0003 static const struct tok ofp_config_str[] = { { OFPC_FRAG_NORMAL, "FRAG_NORMAL" }, { OFPC_FRAG_DROP, "FRAG_DROP" }, @@ -220,6 +330,11 @@ static const struct tok ofp_config_str[] = { { 0, NULL } }; +#define OFPFC_ADD 0x0000 +#define OFPFC_MODIFY 0x0001 +#define OFPFC_MODIFY_STRICT 0x0002 +#define OFPFC_DELETE 0x0003 +#define OFPFC_DELETE_STRICT 0x0004 static const struct tok ofpfc_str[] = { { OFPFC_ADD, "ADD" }, { OFPFC_MODIFY, "MODIFY" }, @@ -234,6 +349,9 @@ static const struct tok bufferid_str[] = { { 0, NULL } }; +#define OFPFF_SEND_FLOW_REM (1 << 0) +#define OFPFF_CHECK_OVERLAP (1 << 1) +#define OFPFF_EMERG (1 << 2) static const struct tok ofpff_bm[] = { { OFPFF_SEND_FLOW_REM, "SEND_FLOW_REM" }, { OFPFF_CHECK_OVERLAP, "CHECK_OVERLAP" }, @@ -242,6 +360,13 @@ static const struct tok ofpff_bm[] = { }; #define OFPFF_U (~(OFPFF_SEND_FLOW_REM | OFPFF_CHECK_OVERLAP | OFPFF_EMERG)) +#define OFPST_DESC 0x0000 +#define OFPST_FLOW 0x0001 +#define OFPST_AGGREGATE 0x0002 +#define OFPST_TABLE 0x0003 +#define OFPST_PORT 0x0004 +#define OFPST_QUEUE 0x0005 +#define OFPST_VENDOR 0xffff static const struct tok ofpst_str[] = { { OFPST_DESC, "DESC" }, { OFPST_FLOW, "FLOW" }, @@ -259,23 +384,30 @@ static const struct tok tableid_str[] = { { 0, NULL } }; +#define OFPQ_ALL 0xffffffff static const struct tok ofpq_str[] = { { OFPQ_ALL, "ALL" }, { 0, NULL } }; +#define OFPSF_REPLY_MORE 0x0001 static const struct tok ofpsf_reply_bm[] = { { OFPSF_REPLY_MORE, "MORE" }, { 0, NULL } }; #define OFPSF_REPLY_U (~(OFPSF_REPLY_MORE)) +#define OFPR_NO_MATCH 0x00 +#define OFPR_ACTION 0x01 static const struct tok ofpr_str[] = { { OFPR_NO_MATCH, "NO_MATCH" }, { OFPR_ACTION, "ACTION" }, { 0, NULL } }; +#define OFPRR_IDLE_TIMEOUT 0x00 +#define OFPRR_HARD_TIMEOUT 0x01 +#define OFPRR_DELETE 0x02 static const struct tok ofprr_str[] = { { OFPRR_IDLE_TIMEOUT, "IDLE_TIMEOUT" }, { OFPRR_HARD_TIMEOUT, "HARD_TIMEOUT" }, @@ -283,6 +415,9 @@ static const struct tok ofprr_str[] = { { 0, NULL } }; +#define OFPPR_ADD 0x00 +#define OFPPR_DELETE 0x01 +#define OFPPR_MODIFY 0x02 static const struct tok ofppr_str[] = { { OFPPR_ADD, "ADD" }, { OFPPR_DELETE, "DELETE" }, @@ -290,6 +425,12 @@ static const struct tok ofppr_str[] = { { 0, NULL } }; +#define OFPET_HELLO_FAILED 0x0000 +#define OFPET_BAD_REQUEST 0x0001 +#define OFPET_BAD_ACTION 0x0002 +#define OFPET_FLOW_MOD_FAILED 0x0003 +#define OFPET_PORT_MOD_FAILED 0x0004 +#define OFPET_QUEUE_OP_FAILED 0x0005 static const struct tok ofpet_str[] = { { OFPET_HELLO_FAILED, "HELLO_FAILED" }, { OFPET_BAD_REQUEST, "BAD_REQUEST" }, @@ -300,12 +441,23 @@ static const struct tok ofpet_str[] = { { 0, NULL } }; +#define OFPHFC_INCOMPATIBLE 0x0000 +#define OFPHFC_EPERM 0x0001 static const struct tok ofphfc_str[] = { { OFPHFC_INCOMPATIBLE, "INCOMPATIBLE" }, { OFPHFC_EPERM, "EPERM" }, { 0, NULL } }; +#define OFPBRC_BAD_VERSION 0x0000 +#define OFPBRC_BAD_TYPE 0x0001 +#define OFPBRC_BAD_STAT 0x0002 +#define OFPBRC_BAD_VENDOR 0x0003 +#define OFPBRC_BAD_SUBTYPE 0x0004 +#define OFPBRC_EPERM 0x0005 +#define OFPBRC_BAD_LEN 0x0006 +#define OFPBRC_BUFFER_EMPTY 0x0007 +#define OFPBRC_BUFFER_UNKNOWN 0x0008 static const struct tok ofpbrc_str[] = { { OFPBRC_BAD_VERSION, "BAD_VERSION" }, { OFPBRC_BAD_TYPE, "BAD_TYPE" }, @@ -319,6 +471,15 @@ static const struct tok ofpbrc_str[] = { { 0, NULL } }; +#define OFPBAC_BAD_TYPE 0x0000 +#define OFPBAC_BAD_LEN 0x0001 +#define OFPBAC_BAD_VENDOR 0x0002 +#define OFPBAC_BAD_VENDOR_TYPE 0x0003 +#define OFPBAC_BAD_OUT_PORT 0x0004 +#define OFPBAC_BAD_ARGUMENT 0x0005 +#define OFPBAC_EPERM 0x0006 +#define OFPBAC_TOO_MANY 0x0007 +#define OFPBAC_BAD_QUEUE 0x0008 static const struct tok ofpbac_str[] = { { OFPBAC_BAD_TYPE, "BAD_TYPE" }, { OFPBAC_BAD_LEN, "BAD_LEN" }, @@ -332,6 +493,12 @@ static const struct tok ofpbac_str[] = { { 0, NULL } }; +#define OFPFMFC_ALL_TABLES_FULL 0x0000 +#define OFPFMFC_OVERLAP 0x0001 +#define OFPFMFC_EPERM 0x0002 +#define OFPFMFC_BAD_EMERG_TIMEOUT 0x0003 +#define OFPFMFC_BAD_COMMAND 0x0004 +#define OFPFMFC_UNSUPPORTED 0x0005 static const struct tok ofpfmfc_str[] = { { OFPFMFC_ALL_TABLES_FULL, "ALL_TABLES_FULL" }, { OFPFMFC_OVERLAP, "OVERLAP" }, @@ -342,12 +509,17 @@ static const struct tok ofpfmfc_str[] = { { 0, NULL } }; +#define OFPPMFC_BAD_PORT 0x0000 +#define OFPPMFC_BAD_HW_ADDR 0x0001 static const struct tok ofppmfc_str[] = { { OFPPMFC_BAD_PORT, "BAD_PORT" }, { OFPPMFC_BAD_HW_ADDR, "BAD_HW_ADDR" }, { 0, NULL } }; +#define OFPQOFC_BAD_PORT 0x0000 +#define OFPQOFC_BAD_QUEUE 0x0001 +#define OFPQOFC_EPERM 0x0002 static const struct tok ofpqofc_str[] = { { OFPQOFC_BAD_PORT, "BAD_PORT" }, { OFPQOFC_BAD_QUEUE, "BAD_QUEUE" }, @@ -359,6 +531,53 @@ static const struct tok empty_str[] = { { 0, NULL } }; +/* lengths (fixed or minimal) of particular protocol structures */ +#define OF_SWITCH_CONFIG_LEN 12 +#define OF_PHY_PORT_LEN 48 +#define OF_SWITCH_FEATURES_LEN 32 +#define OF_PORT_STATUS_LEN 64 +#define OF_PORT_MOD_LEN 32 +#define OF_PACKET_IN_LEN 20 +#define OF_ACTION_OUTPUT_LEN 8 +#define OF_ACTION_VLAN_VID_LEN 8 +#define OF_ACTION_VLAN_PCP_LEN 8 +#define OF_ACTION_DL_ADDR_LEN 16 +#define OF_ACTION_NW_ADDR_LEN 8 +#define OF_ACTION_TP_PORT_LEN 8 +#define OF_ACTION_NW_TOS_LEN 8 +#define OF_ACTION_VENDOR_HEADER_LEN 8 +#define OF_ACTION_HEADER_LEN 8 +#define OF_PACKET_OUT_LEN 16 +#define OF_MATCH_LEN 40 +#define OF_FLOW_MOD_LEN 72 +#define OF_FLOW_REMOVED_LEN 88 +#define OF_ERROR_MSG_LEN 12 +#define OF_STATS_REQUEST_LEN 12 +#define OF_STATS_REPLY_LEN 12 +#define OF_DESC_STATS_LEN 1056 +#define OF_FLOW_STATS_REQUEST_LEN 44 +#define OF_FLOW_STATS_LEN 88 +#define OF_AGGREGATE_STATS_REQUEST_LEN 44 +#define OF_AGGREGATE_STATS_REPLY_LEN 24 +#define OF_TABLE_STATS_LEN 64 +#define OF_PORT_STATS_REQUEST_LEN 8 +#define OF_PORT_STATS_LEN 104 +#define OF_VENDOR_HEADER_LEN 12 +#define OF_QUEUE_PROP_HEADER_LEN 8 +#define OF_QUEUE_PROP_MIN_RATE_LEN 16 +#define OF_PACKET_QUEUE_LEN 8 +#define OF_QUEUE_GET_CONFIG_REQUEST_LEN 12 +#define OF_QUEUE_GET_CONFIG_REPLY_LEN 16 +#define OF_ACTION_ENQUEUE_LEN 16 +#define OF_QUEUE_STATS_REQUEST_LEN 8 +#define OF_QUEUE_STATS_LEN 32 + +/* miscellaneous constants from [OF10] */ +#define OFP_MAX_TABLE_NAME_LEN 32 +#define OFP_MAX_PORT_NAME_LEN 16 +#define DESC_STR_LEN 256 +#define SERIAL_NUM_LEN 32 +#define OFP_VLAN_NONE 0xffff static const char * vlan_str(const uint16_t vid) { @@ -407,7 +626,7 @@ of10_data_print(const u_char *cp, const u_char *ep, const u_int len) { return cp + len; trunc: - printf(" [|openflow]"); + printf("%s", tstr); return ep; } @@ -424,11 +643,31 @@ of10_vendor_data_print(const u_char *cp, const u_char *ep, const u_int len) { return of10_data_print(cp, ep, len - 4); corrupt: /* skip the undersized data */ - printf(" (corrupt)"); + printf("%s", cstr); TCHECK2(*cp, len); return cp + len; trunc: - printf(" [|openflow]"); + printf("%s", tstr); + return ep; +} + +static const u_char * +of10_packet_data_print(const u_char *cp, const u_char *ep, const u_int len) { + if (len == 0) + return cp; + /* data */ + printf("\n\t data (%u octets)", len); + if (vflag < 3) + return cp + len; + TCHECK2(*cp, len); + vflag -= 3; + printf(", frame decoding below\n"); + ether_print(gndo, cp, len, snapend - cp, NULL, NULL); + vflag += 3; + return cp + len; + +trunc: + printf("%s", tstr); return ep; } @@ -446,9 +685,9 @@ of10_phy_ports_print(const u_char *cp, const u_char *ep, u_int len) { printf("\n\t port_no %s", tok2str(ofpp_str, "%u", EXTRACT_16BITS(cp))); cp += 2; /* hw_addr */ - TCHECK2(*cp, OFP_ETH_ALEN); + TCHECK2(*cp, ETHER_ADDR_LEN); printf(", hw_addr %s", etheraddr_string(cp)); - cp += OFP_ETH_ALEN; + cp += ETHER_ADDR_LEN; /* name */ TCHECK2(*cp, OFP_MAX_PORT_NAME_LEN); printf(", name '"); @@ -497,11 +736,11 @@ next_port: return cp; corrupt: /* skip the undersized trailing data */ - printf(" (corrupt)"); + printf("%s", cstr); TCHECK2(*cp0, len0); return cp0 + len0; trunc: - printf(" [|openflow]"); + printf("%s", tstr); return ep; } @@ -571,11 +810,11 @@ next_property: return cp; corrupt: /* skip the rest of queue properties */ - printf(" (corrupt)"); + printf("%s", cstr); TCHECK2(*cp0, len0); return cp0 + len0; trunc: - printf(" [|openflow]"); + printf("%s", tstr); return ep; } @@ -617,11 +856,11 @@ next_queue: return cp; corrupt: /* skip the rest of queues */ - printf(" (corrupt)"); + printf("%s", cstr); TCHECK2(*cp0, len0); return cp0 + len0; trunc: - printf(" [|openflow]"); + printf("%s", tstr); return ep; } @@ -646,15 +885,15 @@ of10_match_print(const char *pfx, const u_char *cp, const u_char *ep) { printf("%smatch in_port %s", pfx, tok2str(ofpp_str, "%u", EXTRACT_16BITS(cp))); cp += 2; /* dl_src */ - TCHECK2(*cp, OFP_ETH_ALEN); + TCHECK2(*cp, ETHER_ADDR_LEN); if (! (wildcards & OFPFW_DL_SRC)) printf("%smatch dl_src %s", pfx, etheraddr_string(cp)); - cp += OFP_ETH_ALEN; + cp += ETHER_ADDR_LEN; /* dl_dst */ - TCHECK2(*cp, OFP_ETH_ALEN); + TCHECK2(*cp, ETHER_ADDR_LEN); if (! (wildcards & OFPFW_DL_DST)) printf("%smatch dl_dst %s", pfx, etheraddr_string(cp)); - cp += OFP_ETH_ALEN; + cp += ETHER_ADDR_LEN; /* dl_vlan */ TCHECK2(*cp, 2); if (! (wildcards & OFPFW_DL_VLAN)) @@ -723,7 +962,7 @@ of10_match_print(const char *pfx, const u_char *cp, const u_char *ep) { return cp + 2; trunc: - printf(" [|openflow]"); + printf("%s", tstr); return ep; } @@ -822,9 +1061,9 @@ of10_actions_print(const char *pfx, const u_char *cp, const u_char *ep, case OFPAT_SET_DL_SRC: case OFPAT_SET_DL_DST: /* dl_addr */ - TCHECK2(*cp, OFP_ETH_ALEN); + TCHECK2(*cp, ETHER_ADDR_LEN); printf(", dl_addr %s", etheraddr_string(cp)); - cp += OFP_ETH_ALEN; + cp += ETHER_ADDR_LEN; /* pad */ TCHECK2(*cp, 6); cp += 6; @@ -884,11 +1123,11 @@ next_action: return cp; corrupt: /* skip the rest of actions */ - printf(" (corrupt)"); + printf("%s", cstr); TCHECK2(*cp0, len0); return cp0 + len0; trunc: - printf(" [|openflow]"); + printf("%s", tstr); return ep; } @@ -924,7 +1163,7 @@ of10_features_reply_print(const u_char *cp, const u_char *ep, const u_int len) { return of10_phy_ports_print(cp, ep, len - OF_SWITCH_FEATURES_LEN); trunc: - printf(" [|openflow]"); + printf("%s", tstr); return ep; } @@ -980,7 +1219,7 @@ of10_flow_mod_print(const u_char *cp, const u_char *ep, const u_int len) { return of10_actions_print("\n\t ", cp, ep, len - OF_FLOW_MOD_LEN); trunc: - printf(" [|openflow]"); + printf("%s", tstr); return ep; } @@ -992,9 +1231,9 @@ of10_port_mod_print(const u_char *cp, const u_char *ep) { printf("\n\t port_no %s", tok2str(ofpp_str, "%u", EXTRACT_16BITS(cp))); cp += 2; /* hw_addr */ - TCHECK2(*cp, OFP_ETH_ALEN); + TCHECK2(*cp, ETHER_ADDR_LEN); printf(", hw_addr %s", etheraddr_string(cp)); - cp += OFP_ETH_ALEN; + cp += ETHER_ADDR_LEN; /* config */ TCHECK2(*cp, 4); printf("\n\t config 0x%08x", EXTRACT_32BITS(cp)); @@ -1015,7 +1254,7 @@ of10_port_mod_print(const u_char *cp, const u_char *ep) { return cp + 4; trunc: - printf(" [|openflow]"); + printf("%s", tstr); return ep; } @@ -1093,11 +1332,11 @@ of10_stats_request_print(const u_char *cp, const u_char *ep, u_int len) { return cp; corrupt: /* skip the message body */ - printf(" (corrupt)"); + printf("%s", cstr); TCHECK2(*cp0, len0); return cp0 + len0; trunc: - printf(" [|openflow]"); + printf("%s", tstr); return ep; } @@ -1138,11 +1377,11 @@ of10_desc_stats_reply_print(const u_char *cp, const u_char *ep, const u_int len) return cp + DESC_STR_LEN; corrupt: /* skip the message body */ - printf(" (corrupt)"); + printf("%s", cstr); TCHECK2(*cp, len); return cp + len; trunc: - printf(" [|openflow]"); + printf("%s", tstr); return ep; } @@ -1217,11 +1456,11 @@ of10_flow_stats_reply_print(const u_char *cp, const u_char *ep, u_int len) { return cp; corrupt: /* skip the rest of flow statistics entries */ - printf(" (corrupt)"); + printf("%s", cstr); TCHECK2(*cp0, len0); return cp0 + len0; trunc: - printf(" [|openflow]"); + printf("%s", tstr); return ep; } @@ -1248,11 +1487,11 @@ of10_aggregate_stats_reply_print(const u_char *cp, const u_char *ep, return cp + 4; corrupt: /* skip the message body */ - printf(" (corrupt)"); + printf("%s", cstr); TCHECK2(*cp, len); return cp + len; trunc: - printf(" [|openflow]"); + printf("%s", tstr); return ep; } @@ -1305,11 +1544,11 @@ of10_table_stats_reply_print(const u_char *cp, const u_char *ep, u_int len) { return cp; corrupt: /* skip the undersized trailing data */ - printf(" (corrupt)"); + printf("%s", cstr); TCHECK2(*cp0, len0); return cp0 + len0; trunc: - printf(" [|openflow]"); + printf("%s", tstr); return ep; } @@ -1388,11 +1627,11 @@ next_port: return cp; corrupt: /* skip the undersized trailing data */ - printf(" (corrupt)"); + printf("%s", cstr); TCHECK2(*cp0, len0); return cp0 + len0; trunc: - printf(" [|openflow]"); + printf("%s", tstr); return ep; } @@ -1434,11 +1673,11 @@ of10_queue_stats_reply_print(const u_char *cp, const u_char *ep, u_int len) { return cp; corrupt: /* skip the undersized trailing data */ - printf(" (corrupt)"); + printf("%s", cstr); TCHECK2(*cp0, len0); return cp0 + len0; trunc: - printf(" [|openflow]"); + printf("%s", tstr); return ep; } @@ -1476,7 +1715,7 @@ of10_stats_reply_print(const u_char *cp, const u_char *ep, const u_int len) { return cp0 + len; trunc: - printf(" [|openflow]"); + printf("%s", tstr); return ep; } @@ -1505,14 +1744,14 @@ of10_packet_out_print(const u_char *cp, const u_char *ep, const u_int len) { if (ep == (cp = of10_actions_print("\n\t ", cp, ep, actions_len))) return ep; /* end of snapshot */ /* data */ - return of10_data_print(cp, ep, len - OF_PACKET_OUT_LEN - actions_len); + return of10_packet_data_print(cp, ep, len - OF_PACKET_OUT_LEN - actions_len); corrupt: /* skip the rest of the message body */ - printf(" (corrupt)"); + printf("%s", cstr); TCHECK2(*cp0, len0); return cp0 + len0; trunc: - printf(" [|openflow]"); + printf("%s", tstr); return ep; } @@ -1540,10 +1779,10 @@ of10_packet_in_print(const u_char *cp, const u_char *ep, const u_int len) { cp += 1; /* data */ /* 2 mock octets count in OF_PACKET_IN_LEN but not in len */ - return of10_data_print(cp, ep, len - (OF_PACKET_IN_LEN - 2)); + return of10_packet_data_print(cp, ep, len - (OF_PACKET_IN_LEN - 2)); trunc: - printf(" [|openflow]"); + printf("%s", tstr); return ep; } @@ -1595,7 +1834,7 @@ of10_flow_removed_print(const u_char *cp, const u_char *ep) { return cp + 8; trunc: - printf(" [|openflow]"); + printf("%s", tstr); return ep; } @@ -1626,7 +1865,7 @@ of10_error_print(const u_char *cp, const u_char *ep, const u_int len) { return of10_data_print(cp, ep, len - OF_ERROR_MSG_LEN); trunc: - printf(" [|openflow]"); + printf("%s", tstr); return ep; } @@ -1803,11 +2042,11 @@ of10_header_body_print(const u_char *cp, const u_char *ep, const uint8_t type, goto next_message; corrupt: /* skip the message body */ - printf(" (corrupt)"); + printf("%s", cstr); next_message: TCHECK2(*cp0, len0 - OF_HEADER_LEN); return cp0 + len0 - OF_HEADER_LEN; trunc: - printf(" [|openflow]"); + printf("%s", tstr); return ep; }