1*ee67461eSJoseph Mingrone /* 2*ee67461eSJoseph Mingrone * This module implements decoding of OpenFlow protocol version 1.3 (wire 3*ee67461eSJoseph Mingrone * protocol 0x04). It is based on the implementation conventions explained in 4*ee67461eSJoseph Mingrone * print-openflow-1.0.c. 5*ee67461eSJoseph Mingrone * 6*ee67461eSJoseph Mingrone * [OF13] https://www.opennetworking.org/wp-content/uploads/2014/10/openflow-switch-v1.3.5.pdf 7*ee67461eSJoseph Mingrone * 8*ee67461eSJoseph Mingrone * Copyright (c) 2020 The TCPDUMP project 9*ee67461eSJoseph Mingrone * All rights reserved. 10*ee67461eSJoseph Mingrone * 11*ee67461eSJoseph Mingrone * Redistribution and use in source and binary forms, with or without 12*ee67461eSJoseph Mingrone * modification, are permitted provided that the following conditions 13*ee67461eSJoseph Mingrone * are met: 14*ee67461eSJoseph Mingrone * 1. Redistributions of source code must retain the above copyright 15*ee67461eSJoseph Mingrone * notice, this list of conditions and the following disclaimer. 16*ee67461eSJoseph Mingrone * 2. Redistributions in binary form must reproduce the above copyright 17*ee67461eSJoseph Mingrone * notice, this list of conditions and the following disclaimer in the 18*ee67461eSJoseph Mingrone * documentation and/or other materials provided with the distribution. 19*ee67461eSJoseph Mingrone * 20*ee67461eSJoseph Mingrone * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21*ee67461eSJoseph Mingrone * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22*ee67461eSJoseph Mingrone * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 23*ee67461eSJoseph Mingrone * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 24*ee67461eSJoseph Mingrone * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 25*ee67461eSJoseph Mingrone * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 26*ee67461eSJoseph Mingrone * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 27*ee67461eSJoseph Mingrone * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 28*ee67461eSJoseph Mingrone * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29*ee67461eSJoseph Mingrone * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 30*ee67461eSJoseph Mingrone * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 31*ee67461eSJoseph Mingrone * POSSIBILITY OF SUCH DAMAGE. 32*ee67461eSJoseph Mingrone */ 33*ee67461eSJoseph Mingrone 34*ee67461eSJoseph Mingrone /* \summary: OpenFlow protocol version 1.3 printer */ 35*ee67461eSJoseph Mingrone 36*ee67461eSJoseph Mingrone #ifdef HAVE_CONFIG_H 37*ee67461eSJoseph Mingrone #include <config.h> 38*ee67461eSJoseph Mingrone #endif 39*ee67461eSJoseph Mingrone 40*ee67461eSJoseph Mingrone #include "netdissect-stdinc.h" 41*ee67461eSJoseph Mingrone 42*ee67461eSJoseph Mingrone #define ND_LONGJMP_FROM_TCHECK 43*ee67461eSJoseph Mingrone #include "netdissect.h" 44*ee67461eSJoseph Mingrone #include "extract.h" 45*ee67461eSJoseph Mingrone #include "addrtoname.h" 46*ee67461eSJoseph Mingrone #include "openflow.h" 47*ee67461eSJoseph Mingrone 48*ee67461eSJoseph Mingrone #define OFPT_HELLO 0U 49*ee67461eSJoseph Mingrone #define OFPT_ERROR 1U 50*ee67461eSJoseph Mingrone #define OFPT_ECHO_REQUEST 2U 51*ee67461eSJoseph Mingrone #define OFPT_ECHO_REPLY 3U 52*ee67461eSJoseph Mingrone #define OFPT_EXPERIMENTER 4U 53*ee67461eSJoseph Mingrone #define OFPT_FEATURES_REQUEST 5U 54*ee67461eSJoseph Mingrone #define OFPT_FEATURES_REPLY 6U 55*ee67461eSJoseph Mingrone #define OFPT_GET_CONFIG_REQUEST 7U 56*ee67461eSJoseph Mingrone #define OFPT_GET_CONFIG_REPLY 8U 57*ee67461eSJoseph Mingrone #define OFPT_SET_CONFIG 9U 58*ee67461eSJoseph Mingrone #define OFPT_PACKET_IN 10U 59*ee67461eSJoseph Mingrone #define OFPT_FLOW_REMOVED 11U 60*ee67461eSJoseph Mingrone #define OFPT_PORT_STATUS 12U 61*ee67461eSJoseph Mingrone #define OFPT_PACKET_OUT 13U 62*ee67461eSJoseph Mingrone #define OFPT_FLOW_MOD 14U 63*ee67461eSJoseph Mingrone #define OFPT_GROUP_MOD 15U 64*ee67461eSJoseph Mingrone #define OFPT_PORT_MOD 16U 65*ee67461eSJoseph Mingrone #define OFPT_TABLE_MOD 17U 66*ee67461eSJoseph Mingrone #define OFPT_MULTIPART_REQUEST 18U 67*ee67461eSJoseph Mingrone #define OFPT_MULTIPART_REPLY 19U 68*ee67461eSJoseph Mingrone #define OFPT_BARRIER_REQUEST 20U 69*ee67461eSJoseph Mingrone #define OFPT_BARRIER_REPLY 21U 70*ee67461eSJoseph Mingrone #define OFPT_QUEUE_GET_CONFIG_REQUEST 22U 71*ee67461eSJoseph Mingrone #define OFPT_QUEUE_GET_CONFIG_REPLY 23U 72*ee67461eSJoseph Mingrone #define OFPT_ROLE_REQUEST 24U 73*ee67461eSJoseph Mingrone #define OFPT_ROLE_REPLY 25U 74*ee67461eSJoseph Mingrone #define OFPT_GET_ASYNC_REQUEST 26U 75*ee67461eSJoseph Mingrone #define OFPT_GET_ASYNC_REPLY 27U 76*ee67461eSJoseph Mingrone #define OFPT_SET_ASYNC 28U 77*ee67461eSJoseph Mingrone #define OFPT_METER_MOD 29U 78*ee67461eSJoseph Mingrone #define OFPT_MAX OFPT_METER_MOD 79*ee67461eSJoseph Mingrone 80*ee67461eSJoseph Mingrone #define OFPC_FLOW_STATS (1U <<0) 81*ee67461eSJoseph Mingrone #define OFPC_TABLE_STATS (1U <<1) 82*ee67461eSJoseph Mingrone #define OFPC_PORT_STATS (1U <<2) 83*ee67461eSJoseph Mingrone #define OFPC_GROUP_STATS (1U <<3) 84*ee67461eSJoseph Mingrone #define OFPC_IP_REASM (1U <<5) 85*ee67461eSJoseph Mingrone #define OFPC_QUEUE_STATS (1U <<6) 86*ee67461eSJoseph Mingrone #define OFPC_PORT_BLOCKED (1U <<8) 87*ee67461eSJoseph Mingrone static const struct tok ofp_capabilities_bm[] = { 88*ee67461eSJoseph Mingrone { OFPC_FLOW_STATS, "FLOW_STATS" }, 89*ee67461eSJoseph Mingrone { OFPC_TABLE_STATS, "TABLE_STATS" }, 90*ee67461eSJoseph Mingrone { OFPC_PORT_STATS, "PORT_STATS" }, 91*ee67461eSJoseph Mingrone { OFPC_GROUP_STATS, "GROUP_STATS" }, 92*ee67461eSJoseph Mingrone { OFPC_IP_REASM, "IP_REASM" }, 93*ee67461eSJoseph Mingrone { OFPC_QUEUE_STATS, "QUEUE_STATS" }, 94*ee67461eSJoseph Mingrone { OFPC_PORT_BLOCKED, "PORT_BLOCKED" }, 95*ee67461eSJoseph Mingrone { 0, NULL } 96*ee67461eSJoseph Mingrone }; 97*ee67461eSJoseph Mingrone #define OFPCAP_U (~(OFPC_FLOW_STATS | OFPC_TABLE_STATS | OFPC_PORT_STATS | \ 98*ee67461eSJoseph Mingrone OFPC_GROUP_STATS | OFPC_IP_REASM | OFPC_QUEUE_STATS | \ 99*ee67461eSJoseph Mingrone OFPC_PORT_BLOCKED)) 100*ee67461eSJoseph Mingrone 101*ee67461eSJoseph Mingrone #define OFPC_FRAG_NORMAL 0U 102*ee67461eSJoseph Mingrone #define OFPC_FRAG_DROP 1U 103*ee67461eSJoseph Mingrone #define OFPC_FRAG_REASM 2U 104*ee67461eSJoseph Mingrone static const struct tok ofp_config_str[] = { 105*ee67461eSJoseph Mingrone { OFPC_FRAG_NORMAL, "FRAG_NORMAL" }, 106*ee67461eSJoseph Mingrone { OFPC_FRAG_DROP, "FRAG_DROP" }, 107*ee67461eSJoseph Mingrone { OFPC_FRAG_REASM, "FRAG_REASM" }, 108*ee67461eSJoseph Mingrone { 0, NULL } 109*ee67461eSJoseph Mingrone }; 110*ee67461eSJoseph Mingrone 111*ee67461eSJoseph Mingrone #define OFPTT_MAX 0xfeU 112*ee67461eSJoseph Mingrone #define OFPTT_ALL 0xffU 113*ee67461eSJoseph Mingrone static const struct tok ofptt_str[] = { 114*ee67461eSJoseph Mingrone { OFPTT_MAX, "MAX" }, 115*ee67461eSJoseph Mingrone { OFPTT_ALL, "ALL" }, 116*ee67461eSJoseph Mingrone { 0, NULL }, 117*ee67461eSJoseph Mingrone }; 118*ee67461eSJoseph Mingrone 119*ee67461eSJoseph Mingrone #define OFPCML_MAX 0xffe5U 120*ee67461eSJoseph Mingrone #define OFPCML_NO_BUFFER 0xffffU 121*ee67461eSJoseph Mingrone static const struct tok ofpcml_str[] = { 122*ee67461eSJoseph Mingrone { OFPCML_MAX, "MAX" }, 123*ee67461eSJoseph Mingrone { OFPCML_NO_BUFFER, "NO_BUFFER" }, 124*ee67461eSJoseph Mingrone { 0, NULL } 125*ee67461eSJoseph Mingrone }; 126*ee67461eSJoseph Mingrone 127*ee67461eSJoseph Mingrone #define OFPPC_PORT_DOWN (1U <<0) 128*ee67461eSJoseph Mingrone #define OFPPC_NO_RECV (1U <<2) 129*ee67461eSJoseph Mingrone #define OFPPC_NO_FWD (1U <<5) 130*ee67461eSJoseph Mingrone #define OFPPC_NO_PACKET_IN (1U <<6) 131*ee67461eSJoseph Mingrone static const struct tok ofppc_bm[] = { 132*ee67461eSJoseph Mingrone { OFPPC_PORT_DOWN, "PORT_DOWN" }, 133*ee67461eSJoseph Mingrone { OFPPC_NO_RECV, "NO_RECV" }, 134*ee67461eSJoseph Mingrone { OFPPC_NO_FWD, "NO_FWD" }, 135*ee67461eSJoseph Mingrone { OFPPC_NO_PACKET_IN, "NO_PACKET_IN" }, 136*ee67461eSJoseph Mingrone { 0, NULL } 137*ee67461eSJoseph Mingrone }; 138*ee67461eSJoseph Mingrone #define OFPPC_U (~(OFPPC_PORT_DOWN | OFPPC_NO_RECV | OFPPC_NO_FWD | \ 139*ee67461eSJoseph Mingrone OFPPC_NO_PACKET_IN)) 140*ee67461eSJoseph Mingrone 141*ee67461eSJoseph Mingrone #define OFPPS_LINK_DOWN (1U << 0) 142*ee67461eSJoseph Mingrone #define OFPPS_BLOCKED (1U << 1) 143*ee67461eSJoseph Mingrone #define OFPPS_LIVE (1U << 2) 144*ee67461eSJoseph Mingrone static const struct tok ofpps_bm[] = { 145*ee67461eSJoseph Mingrone { OFPPS_LINK_DOWN, "LINK_DOWN" }, 146*ee67461eSJoseph Mingrone { OFPPS_BLOCKED, "BLOCKED" }, 147*ee67461eSJoseph Mingrone { OFPPS_LIVE, "LIVE" }, 148*ee67461eSJoseph Mingrone { 0, NULL } 149*ee67461eSJoseph Mingrone }; 150*ee67461eSJoseph Mingrone #define OFPPS_U (~(OFPPS_LINK_DOWN | OFPPS_BLOCKED | OFPPS_LIVE)) 151*ee67461eSJoseph Mingrone 152*ee67461eSJoseph Mingrone #define OFPPF_10MB_HD (1U << 0) 153*ee67461eSJoseph Mingrone #define OFPPF_10MB_FD (1U << 1) 154*ee67461eSJoseph Mingrone #define OFPPF_100MB_HD (1U << 2) 155*ee67461eSJoseph Mingrone #define OFPPF_100MB_FD (1U << 3) 156*ee67461eSJoseph Mingrone #define OFPPF_1GB_HD (1U << 4) 157*ee67461eSJoseph Mingrone #define OFPPF_1GB_FD (1U << 5) 158*ee67461eSJoseph Mingrone #define OFPPF_10GB_FD (1U << 6) 159*ee67461eSJoseph Mingrone #define OFPPF_40GB_FD (1U << 7) 160*ee67461eSJoseph Mingrone #define OFPPF_100GB_FD (1U << 8) 161*ee67461eSJoseph Mingrone #define OFPPF_1TB_FD (1U << 9) 162*ee67461eSJoseph Mingrone #define OFPPF_OTHER (1U << 10) 163*ee67461eSJoseph Mingrone #define OFPPF_COPPER (1U << 11) 164*ee67461eSJoseph Mingrone #define OFPPF_FIBER (1U << 12) 165*ee67461eSJoseph Mingrone #define OFPPF_AUTONEG (1U << 13) 166*ee67461eSJoseph Mingrone #define OFPPF_PAUSE (1U << 14) 167*ee67461eSJoseph Mingrone #define OFPPF_PAUSE_ASYM (1U << 15) 168*ee67461eSJoseph Mingrone static const struct tok ofppf_bm[] = { 169*ee67461eSJoseph Mingrone { OFPPF_10MB_HD, "10MB_HD" }, 170*ee67461eSJoseph Mingrone { OFPPF_10MB_FD, "10MB_FD" }, 171*ee67461eSJoseph Mingrone { OFPPF_100MB_HD, "100MB_HD" }, 172*ee67461eSJoseph Mingrone { OFPPF_100MB_FD, "100MB_FD" }, 173*ee67461eSJoseph Mingrone { OFPPF_1GB_HD, "1GB_HD" }, 174*ee67461eSJoseph Mingrone { OFPPF_1GB_FD, "1GB_FD" }, 175*ee67461eSJoseph Mingrone { OFPPF_10GB_FD, "10GB_FD" }, 176*ee67461eSJoseph Mingrone { OFPPF_40GB_FD, "40GB_FD" }, 177*ee67461eSJoseph Mingrone { OFPPF_100GB_FD, "100GB_FD" }, 178*ee67461eSJoseph Mingrone { OFPPF_1TB_FD, "1TB_FD" }, 179*ee67461eSJoseph Mingrone { OFPPF_OTHER, "OTHER" }, 180*ee67461eSJoseph Mingrone { OFPPF_COPPER, "COPPER" }, 181*ee67461eSJoseph Mingrone { OFPPF_FIBER, "FIBER" }, 182*ee67461eSJoseph Mingrone { OFPPF_AUTONEG, "AUTONEG" }, 183*ee67461eSJoseph Mingrone { OFPPF_PAUSE, "PAUSE" }, 184*ee67461eSJoseph Mingrone { OFPPF_PAUSE_ASYM, "PAUSE_ASYM" }, 185*ee67461eSJoseph Mingrone { 0, NULL } 186*ee67461eSJoseph Mingrone }; 187*ee67461eSJoseph Mingrone #define OFPPF_U (~(OFPPF_10MB_HD | OFPPF_10MB_FD | OFPPF_100MB_HD | \ 188*ee67461eSJoseph Mingrone OFPPF_100MB_FD | OFPPF_1GB_HD | OFPPF_1GB_FD | \ 189*ee67461eSJoseph Mingrone OFPPF_10GB_FD | OFPPF_40GB_FD | OFPPF_100GB_FD | \ 190*ee67461eSJoseph Mingrone OFPPF_1TB_FD | OFPPF_OTHER | OFPPF_COPPER | OFPPF_FIBER | \ 191*ee67461eSJoseph Mingrone OFPPF_AUTONEG | OFPPF_PAUSE | OFPPF_PAUSE_ASYM)) 192*ee67461eSJoseph Mingrone 193*ee67461eSJoseph Mingrone #define OFPHET_VERSIONBITMAP 1U 194*ee67461eSJoseph Mingrone static const struct tok ofphet_str[] = { 195*ee67461eSJoseph Mingrone { OFPHET_VERSIONBITMAP, "VERSIONBITMAP" }, 196*ee67461eSJoseph Mingrone { 0, NULL } 197*ee67461eSJoseph Mingrone }; 198*ee67461eSJoseph Mingrone 199*ee67461eSJoseph Mingrone #define OFPP_MAX 0xffffff00U 200*ee67461eSJoseph Mingrone #define OFPP_IN_PORT 0xfffffff8U 201*ee67461eSJoseph Mingrone #define OFPP_TABLE 0xfffffff9U 202*ee67461eSJoseph Mingrone #define OFPP_NORMAL 0xfffffffaU 203*ee67461eSJoseph Mingrone #define OFPP_FLOOD 0xfffffffbU 204*ee67461eSJoseph Mingrone #define OFPP_ALL 0xfffffffcU 205*ee67461eSJoseph Mingrone #define OFPP_CONTROLLER 0xfffffffdU 206*ee67461eSJoseph Mingrone #define OFPP_LOCAL 0xfffffffeU 207*ee67461eSJoseph Mingrone #define OFPP_ANY 0xffffffffU 208*ee67461eSJoseph Mingrone static const struct tok ofpp_str[] = { 209*ee67461eSJoseph Mingrone { OFPP_MAX, "MAX" }, 210*ee67461eSJoseph Mingrone { OFPP_IN_PORT, "IN_PORT" }, 211*ee67461eSJoseph Mingrone { OFPP_TABLE, "TABLE" }, 212*ee67461eSJoseph Mingrone { OFPP_NORMAL, "NORMAL" }, 213*ee67461eSJoseph Mingrone { OFPP_FLOOD, "FLOOD" }, 214*ee67461eSJoseph Mingrone { OFPP_ALL, "ALL" }, 215*ee67461eSJoseph Mingrone { OFPP_CONTROLLER, "CONTROLLER" }, 216*ee67461eSJoseph Mingrone { OFPP_LOCAL, "LOCAL" }, 217*ee67461eSJoseph Mingrone { OFPP_ANY, "ANY" }, 218*ee67461eSJoseph Mingrone { 0, NULL } 219*ee67461eSJoseph Mingrone }; 220*ee67461eSJoseph Mingrone 221*ee67461eSJoseph Mingrone #define OFPCR_ROLE_NOCHANGE 0U 222*ee67461eSJoseph Mingrone #define OFPCR_ROLE_EQUAL 1U 223*ee67461eSJoseph Mingrone #define OFPCR_ROLE_MASTER 2U 224*ee67461eSJoseph Mingrone #define OFPCR_ROLE_SLAVE 3U 225*ee67461eSJoseph Mingrone static const struct tok ofpcr_str[] = { 226*ee67461eSJoseph Mingrone { OFPCR_ROLE_NOCHANGE, "NOCHANGE" }, 227*ee67461eSJoseph Mingrone { OFPCR_ROLE_EQUAL, "EQUAL" }, 228*ee67461eSJoseph Mingrone { OFPCR_ROLE_MASTER, "MASTER" }, 229*ee67461eSJoseph Mingrone { OFPCR_ROLE_SLAVE, "SLAVE" }, 230*ee67461eSJoseph Mingrone { 0, NULL } 231*ee67461eSJoseph Mingrone }; 232*ee67461eSJoseph Mingrone 233*ee67461eSJoseph Mingrone #define OF_BIT_VER_1_0 (1U << (OF_VER_1_0 - 1)) 234*ee67461eSJoseph Mingrone #define OF_BIT_VER_1_1 (1U << (OF_VER_1_1 - 1)) 235*ee67461eSJoseph Mingrone #define OF_BIT_VER_1_2 (1U << (OF_VER_1_2 - 1)) 236*ee67461eSJoseph Mingrone #define OF_BIT_VER_1_3 (1U << (OF_VER_1_3 - 1)) 237*ee67461eSJoseph Mingrone #define OF_BIT_VER_1_4 (1U << (OF_VER_1_4 - 1)) 238*ee67461eSJoseph Mingrone #define OF_BIT_VER_1_5 (1U << (OF_VER_1_5 - 1)) 239*ee67461eSJoseph Mingrone static const struct tok ofverbm_str[] = { 240*ee67461eSJoseph Mingrone { OF_BIT_VER_1_0, "1.0" }, 241*ee67461eSJoseph Mingrone { OF_BIT_VER_1_1, "1.1" }, 242*ee67461eSJoseph Mingrone { OF_BIT_VER_1_2, "1.2" }, 243*ee67461eSJoseph Mingrone { OF_BIT_VER_1_3, "1.3" }, 244*ee67461eSJoseph Mingrone { OF_BIT_VER_1_4, "1.4" }, 245*ee67461eSJoseph Mingrone { OF_BIT_VER_1_5, "1.5" }, 246*ee67461eSJoseph Mingrone { 0, NULL } 247*ee67461eSJoseph Mingrone }; 248*ee67461eSJoseph Mingrone #define OF_BIT_VER_U (~(OF_BIT_VER_1_0 | OF_BIT_VER_1_1 | OF_BIT_VER_1_2 | \ 249*ee67461eSJoseph Mingrone OF_BIT_VER_1_3 | OF_BIT_VER_1_4 | OF_BIT_VER_1_5)) 250*ee67461eSJoseph Mingrone 251*ee67461eSJoseph Mingrone #define OFPR_NO_MATCH 0U 252*ee67461eSJoseph Mingrone #define OFPR_ACTION 1U 253*ee67461eSJoseph Mingrone #define OFPR_INVALID_TTL 2U 254*ee67461eSJoseph Mingrone #if 0 /* for OFPT_PACKET_IN */ 255*ee67461eSJoseph Mingrone static const struct tok ofpr_str[] = { 256*ee67461eSJoseph Mingrone { OFPR_NO_MATCH, "NO_MATCH" }, 257*ee67461eSJoseph Mingrone { OFPR_ACTION, "ACTION" }, 258*ee67461eSJoseph Mingrone { OFPR_INVALID_TTL, "OFPR_INVALID_TTL" }, 259*ee67461eSJoseph Mingrone { 0, NULL } 260*ee67461eSJoseph Mingrone }; 261*ee67461eSJoseph Mingrone #endif 262*ee67461eSJoseph Mingrone 263*ee67461eSJoseph Mingrone #define ASYNC_OFPR_NO_MATCH (1U << OFPR_NO_MATCH ) 264*ee67461eSJoseph Mingrone #define ASYNC_OFPR_ACTION (1U << OFPR_ACTION ) 265*ee67461eSJoseph Mingrone #define ASYNC_OFPR_INVALID_TTL (1U << OFPR_INVALID_TTL) 266*ee67461eSJoseph Mingrone static const struct tok async_ofpr_bm[] = { 267*ee67461eSJoseph Mingrone { ASYNC_OFPR_NO_MATCH, "NO_MATCH" }, 268*ee67461eSJoseph Mingrone { ASYNC_OFPR_ACTION, "ACTION" }, 269*ee67461eSJoseph Mingrone { ASYNC_OFPR_INVALID_TTL, "INVALID_TTL" }, 270*ee67461eSJoseph Mingrone { 0, NULL } 271*ee67461eSJoseph Mingrone }; 272*ee67461eSJoseph Mingrone #define ASYNC_OFPR_U (~(ASYNC_OFPR_NO_MATCH | ASYNC_OFPR_ACTION | \ 273*ee67461eSJoseph Mingrone ASYNC_OFPR_INVALID_TTL)) 274*ee67461eSJoseph Mingrone 275*ee67461eSJoseph Mingrone #define OFPPR_ADD 0U 276*ee67461eSJoseph Mingrone #define OFPPR_DELETE 1U 277*ee67461eSJoseph Mingrone #define OFPPR_MODIFY 2U 278*ee67461eSJoseph Mingrone static const struct tok ofppr_str[] = { 279*ee67461eSJoseph Mingrone { OFPPR_ADD, "ADD" }, 280*ee67461eSJoseph Mingrone { OFPPR_DELETE, "DELETE" }, 281*ee67461eSJoseph Mingrone { OFPPR_MODIFY, "MODIFY" }, 282*ee67461eSJoseph Mingrone { 0, NULL } 283*ee67461eSJoseph Mingrone }; 284*ee67461eSJoseph Mingrone 285*ee67461eSJoseph Mingrone #define ASYNC_OFPPR_ADD (1U << OFPPR_ADD ) 286*ee67461eSJoseph Mingrone #define ASYNC_OFPPR_DELETE (1U << OFPPR_DELETE) 287*ee67461eSJoseph Mingrone #define ASYNC_OFPPR_MODIFY (1U << OFPPR_MODIFY) 288*ee67461eSJoseph Mingrone static const struct tok async_ofppr_bm[] = { 289*ee67461eSJoseph Mingrone { ASYNC_OFPPR_ADD, "ADD" }, 290*ee67461eSJoseph Mingrone { ASYNC_OFPPR_DELETE, "DELETE" }, 291*ee67461eSJoseph Mingrone { ASYNC_OFPPR_MODIFY, "MODIFY" }, 292*ee67461eSJoseph Mingrone { 0, NULL } 293*ee67461eSJoseph Mingrone }; 294*ee67461eSJoseph Mingrone #define ASYNC_OFPPR_U (~(ASYNC_OFPPR_ADD | ASYNC_OFPPR_DELETE | \ 295*ee67461eSJoseph Mingrone ASYNC_OFPPR_MODIFY)) 296*ee67461eSJoseph Mingrone 297*ee67461eSJoseph Mingrone #define OFPET_HELLO_FAILED 0U 298*ee67461eSJoseph Mingrone #define OFPET_BAD_REQUEST 1U 299*ee67461eSJoseph Mingrone #define OFPET_BAD_ACTION 2U 300*ee67461eSJoseph Mingrone #define OFPET_BAD_INSTRUCTION 3U 301*ee67461eSJoseph Mingrone #define OFPET_BAD_MATCH 4U 302*ee67461eSJoseph Mingrone #define OFPET_FLOW_MOD_FAILED 5U 303*ee67461eSJoseph Mingrone #define OFPET_GROUP_MOD_FAILED 6U 304*ee67461eSJoseph Mingrone #define OFPET_PORT_MOD_FAILED 7U 305*ee67461eSJoseph Mingrone #define OFPET_TABLE_MOD_FAILED 8U 306*ee67461eSJoseph Mingrone #define OFPET_QUEUE_OP_FAILED 9U 307*ee67461eSJoseph Mingrone #define OFPET_SWITCH_CONFIG_FAILED 10U 308*ee67461eSJoseph Mingrone #define OFPET_ROLE_REQUEST_FAILED 11U 309*ee67461eSJoseph Mingrone #define OFPET_METER_MOD_FAILED 12U 310*ee67461eSJoseph Mingrone #define OFPET_TABLE_FEATURES_FAILED 13U 311*ee67461eSJoseph Mingrone #define OFPET_EXPERIMENTER 0xffffU /* a special case */ 312*ee67461eSJoseph Mingrone static const struct tok ofpet_str[] = { 313*ee67461eSJoseph Mingrone { OFPET_HELLO_FAILED, "HELLO_FAILED" }, 314*ee67461eSJoseph Mingrone { OFPET_BAD_REQUEST, "BAD_REQUEST" }, 315*ee67461eSJoseph Mingrone { OFPET_BAD_ACTION, "BAD_ACTION" }, 316*ee67461eSJoseph Mingrone { OFPET_BAD_INSTRUCTION, "BAD_INSTRUCTION" }, 317*ee67461eSJoseph Mingrone { OFPET_BAD_MATCH, "BAD_MATCH" }, 318*ee67461eSJoseph Mingrone { OFPET_FLOW_MOD_FAILED, "FLOW_MOD_FAILED" }, 319*ee67461eSJoseph Mingrone { OFPET_GROUP_MOD_FAILED, "GROUP_MOD_FAILED" }, 320*ee67461eSJoseph Mingrone { OFPET_PORT_MOD_FAILED, "PORT_MOD_FAILED" }, 321*ee67461eSJoseph Mingrone { OFPET_TABLE_MOD_FAILED, "TABLE_MOD_FAILED" }, 322*ee67461eSJoseph Mingrone { OFPET_QUEUE_OP_FAILED, "QUEUE_OP_FAILED" }, 323*ee67461eSJoseph Mingrone { OFPET_SWITCH_CONFIG_FAILED, "SWITCH_CONFIG_FAILED" }, 324*ee67461eSJoseph Mingrone { OFPET_ROLE_REQUEST_FAILED, "ROLE_REQUEST_FAILED" }, 325*ee67461eSJoseph Mingrone { OFPET_METER_MOD_FAILED, "METER_MOD_FAILED" }, 326*ee67461eSJoseph Mingrone { OFPET_TABLE_FEATURES_FAILED, "TABLE_FEATURES_FAILED" }, 327*ee67461eSJoseph Mingrone { OFPET_EXPERIMENTER, "EXPERIMENTER" }, 328*ee67461eSJoseph Mingrone { 0, NULL } 329*ee67461eSJoseph Mingrone }; 330*ee67461eSJoseph Mingrone 331*ee67461eSJoseph Mingrone #define OFPHFC_INCOMPATIBLE 0U 332*ee67461eSJoseph Mingrone #define OFPHFC_EPERM 1U 333*ee67461eSJoseph Mingrone static const struct tok ofphfc_str[] = { 334*ee67461eSJoseph Mingrone { OFPHFC_INCOMPATIBLE, "INCOMPATIBLE" }, 335*ee67461eSJoseph Mingrone { OFPHFC_EPERM, "EPERM" }, 336*ee67461eSJoseph Mingrone { 0, NULL } 337*ee67461eSJoseph Mingrone }; 338*ee67461eSJoseph Mingrone 339*ee67461eSJoseph Mingrone #define OFPBRC_BAD_VERSION 0U 340*ee67461eSJoseph Mingrone #define OFPBRC_BAD_TYPE 1U 341*ee67461eSJoseph Mingrone #define OFPBRC_BAD_MULTIPART 2U 342*ee67461eSJoseph Mingrone #define OFPBRC_BAD_EXPERIMENTER 3U 343*ee67461eSJoseph Mingrone #define OFPBRC_BAD_EXP_TYPE 4U 344*ee67461eSJoseph Mingrone #define OFPBRC_EPERM 5U 345*ee67461eSJoseph Mingrone #define OFPBRC_BAD_LEN 6U 346*ee67461eSJoseph Mingrone #define OFPBRC_BUFFER_EMPTY 7U 347*ee67461eSJoseph Mingrone #define OFPBRC_BUFFER_UNKNOWN 8U 348*ee67461eSJoseph Mingrone #define OFPBRC_BAD_TABLE_ID 9U 349*ee67461eSJoseph Mingrone #define OFPBRC_IS_SLAVE 10U 350*ee67461eSJoseph Mingrone #define OFPBRC_BAD_PORT 11U 351*ee67461eSJoseph Mingrone #define OFPBRC_BAD_PACKET 12U 352*ee67461eSJoseph Mingrone #define OFPBRC_MULTIPART_BUFFER_OVERFLOW 13U 353*ee67461eSJoseph Mingrone static const struct tok ofpbrc_str[] = { 354*ee67461eSJoseph Mingrone { OFPBRC_BAD_VERSION, "BAD_VERSION" }, 355*ee67461eSJoseph Mingrone { OFPBRC_BAD_TYPE, "BAD_TYPE" }, 356*ee67461eSJoseph Mingrone { OFPBRC_BAD_MULTIPART, "BAD_MULTIPART" }, 357*ee67461eSJoseph Mingrone { OFPBRC_BAD_EXPERIMENTER, "BAD_EXPERIMENTER" }, 358*ee67461eSJoseph Mingrone { OFPBRC_BAD_EXP_TYPE, "BAD_EXP_TYPE" }, 359*ee67461eSJoseph Mingrone { OFPBRC_EPERM, "EPERM" }, 360*ee67461eSJoseph Mingrone { OFPBRC_BAD_LEN, "BAD_LEN" }, 361*ee67461eSJoseph Mingrone { OFPBRC_BUFFER_EMPTY, "BUFFER_EMPTY" }, 362*ee67461eSJoseph Mingrone { OFPBRC_BUFFER_UNKNOWN, "BUFFER_UNKNOWN" }, 363*ee67461eSJoseph Mingrone { OFPBRC_BAD_TABLE_ID, "BAD_TABLE_ID" }, 364*ee67461eSJoseph Mingrone { OFPBRC_IS_SLAVE, "IS_SLAVE" }, 365*ee67461eSJoseph Mingrone { OFPBRC_BAD_PORT, "BAD_PORT" }, 366*ee67461eSJoseph Mingrone { OFPBRC_BAD_PACKET, "BAD_PACKET" }, 367*ee67461eSJoseph Mingrone { OFPBRC_MULTIPART_BUFFER_OVERFLOW, "MULTIPART_BUFFER_OVERFLOW" }, 368*ee67461eSJoseph Mingrone { 0, NULL } 369*ee67461eSJoseph Mingrone }; 370*ee67461eSJoseph Mingrone 371*ee67461eSJoseph Mingrone #define OFPBAC_BAD_TYPE 0U 372*ee67461eSJoseph Mingrone #define OFPBAC_BAD_LEN 1U 373*ee67461eSJoseph Mingrone #define OFPBAC_BAD_EXPERIMENTER 2U 374*ee67461eSJoseph Mingrone #define OFPBAC_BAD_EXP_TYPE 3U 375*ee67461eSJoseph Mingrone #define OFPBAC_BAD_OUT_PORT 4U 376*ee67461eSJoseph Mingrone #define OFPBAC_BAD_ARGUMENT 5U 377*ee67461eSJoseph Mingrone #define OFPBAC_EPERM 6U 378*ee67461eSJoseph Mingrone #define OFPBAC_TOO_MANY 7U 379*ee67461eSJoseph Mingrone #define OFPBAC_BAD_QUEUE 8U 380*ee67461eSJoseph Mingrone #define OFPBAC_BAD_OUT_GROUP 9U 381*ee67461eSJoseph Mingrone #define OFPBAC_MATCH_INCONSISTENT 10U 382*ee67461eSJoseph Mingrone #define OFPBAC_UNSUPPORTED_ORDER 11U 383*ee67461eSJoseph Mingrone #define OFPBAC_BAD_TAG 12U 384*ee67461eSJoseph Mingrone #define OFPBAC_BAD_SET_TYPE 13U 385*ee67461eSJoseph Mingrone #define OFPBAC_BAD_SET_LEN 14U 386*ee67461eSJoseph Mingrone #define OFPBAC_BAD_SET_ARGUMENT 15U 387*ee67461eSJoseph Mingrone static const struct tok ofpbac_str[] = { 388*ee67461eSJoseph Mingrone { OFPBAC_BAD_TYPE, "BAD_TYPE" }, 389*ee67461eSJoseph Mingrone { OFPBAC_BAD_LEN, "BAD_LEN" }, 390*ee67461eSJoseph Mingrone { OFPBAC_BAD_EXPERIMENTER, "BAD_EXPERIMENTER" }, 391*ee67461eSJoseph Mingrone { OFPBAC_BAD_EXP_TYPE, "BAD_EXP_TYPE" }, 392*ee67461eSJoseph Mingrone { OFPBAC_BAD_OUT_PORT, "BAD_OUT_PORT" }, 393*ee67461eSJoseph Mingrone { OFPBAC_BAD_ARGUMENT, "BAD_ARGUMENT" }, 394*ee67461eSJoseph Mingrone { OFPBAC_EPERM, "EPERM" }, 395*ee67461eSJoseph Mingrone { OFPBAC_TOO_MANY, "TOO_MANY" }, 396*ee67461eSJoseph Mingrone { OFPBAC_BAD_QUEUE, "BAD_QUEUE" }, 397*ee67461eSJoseph Mingrone { OFPBAC_BAD_OUT_GROUP, "BAD_OUT_GROUP" }, 398*ee67461eSJoseph Mingrone { OFPBAC_MATCH_INCONSISTENT, "MATCH_INCONSISTENT" }, 399*ee67461eSJoseph Mingrone { OFPBAC_UNSUPPORTED_ORDER, "UNSUPPORTED_ORDER" }, 400*ee67461eSJoseph Mingrone { OFPBAC_BAD_TAG, "BAD_TAG" }, 401*ee67461eSJoseph Mingrone { OFPBAC_BAD_SET_TYPE, "BAD_SET_TYPE" }, 402*ee67461eSJoseph Mingrone { OFPBAC_BAD_SET_LEN, "BAD_SET_LEN" }, 403*ee67461eSJoseph Mingrone { OFPBAC_BAD_SET_ARGUMENT, "BAD_SET_ARGUMENT" }, 404*ee67461eSJoseph Mingrone { 0, NULL } 405*ee67461eSJoseph Mingrone }; 406*ee67461eSJoseph Mingrone 407*ee67461eSJoseph Mingrone #define OFPBIC_UNKNOWN_INST 0U 408*ee67461eSJoseph Mingrone #define OFPBIC_UNSUP_INST 1U 409*ee67461eSJoseph Mingrone #define OFPBIC_BAD_TABLE_ID 2U 410*ee67461eSJoseph Mingrone #define OFPBIC_UNSUP_METADATA 3U 411*ee67461eSJoseph Mingrone #define OFPBIC_UNSUP_METADATA_MASK 4U 412*ee67461eSJoseph Mingrone #define OFPBIC_BAD_EXPERIMENTER 5U 413*ee67461eSJoseph Mingrone #define OFPBIC_BAD_EXP_TYPE 6U 414*ee67461eSJoseph Mingrone #define OFPBIC_BAD_LEN 7U 415*ee67461eSJoseph Mingrone #define OFPBIC_EPERM 8U 416*ee67461eSJoseph Mingrone static const struct tok ofpbic_str[] = { 417*ee67461eSJoseph Mingrone { OFPBIC_UNKNOWN_INST, "UNKNOWN_INST" }, 418*ee67461eSJoseph Mingrone { OFPBIC_UNSUP_INST, "UNSUP_INST" }, 419*ee67461eSJoseph Mingrone { OFPBIC_BAD_TABLE_ID, "BAD_TABLE_ID" }, 420*ee67461eSJoseph Mingrone { OFPBIC_UNSUP_METADATA, "UNSUP_METADATA" }, 421*ee67461eSJoseph Mingrone { OFPBIC_UNSUP_METADATA_MASK, "UNSUP_METADATA_MASK" }, 422*ee67461eSJoseph Mingrone { OFPBIC_BAD_EXPERIMENTER, "BAD_EXPERIMENTER" }, 423*ee67461eSJoseph Mingrone { OFPBIC_BAD_EXP_TYPE, "BAD_EXP_TYPE" }, 424*ee67461eSJoseph Mingrone { OFPBIC_BAD_LEN, "BAD_LEN" }, 425*ee67461eSJoseph Mingrone { OFPBIC_EPERM, "EPERM" }, 426*ee67461eSJoseph Mingrone { 0, NULL } 427*ee67461eSJoseph Mingrone }; 428*ee67461eSJoseph Mingrone 429*ee67461eSJoseph Mingrone #define OFPBMC_BAD_TYPE 0U 430*ee67461eSJoseph Mingrone #define OFPBMC_BAD_LEN 1U 431*ee67461eSJoseph Mingrone #define OFPBMC_BAD_TAG 2U 432*ee67461eSJoseph Mingrone #define OFPBMC_BAD_DL_ADDR_MASK 3U 433*ee67461eSJoseph Mingrone #define OFPBMC_BAD_NW_ADDR_MASK 4U 434*ee67461eSJoseph Mingrone #define OFPBMC_BAD_WILDCARDS 5U 435*ee67461eSJoseph Mingrone #define OFPBMC_BAD_FIELD 6U 436*ee67461eSJoseph Mingrone #define OFPBMC_BAD_VALUE 7U 437*ee67461eSJoseph Mingrone #define OFPBMC_BAD_MASK 8U 438*ee67461eSJoseph Mingrone #define OFPBMC_BAD_PREREQ 9U 439*ee67461eSJoseph Mingrone #define OFPBMC_DUP_FIELD 10U 440*ee67461eSJoseph Mingrone #define OFPBMC_EPERM 11U 441*ee67461eSJoseph Mingrone static const struct tok ofpbmc_str[] = { 442*ee67461eSJoseph Mingrone { OFPBMC_BAD_TYPE, "BAD_TYPE" }, 443*ee67461eSJoseph Mingrone { OFPBMC_BAD_LEN, "BAD_LEN" }, 444*ee67461eSJoseph Mingrone { OFPBMC_BAD_TAG, "BAD_TAG" }, 445*ee67461eSJoseph Mingrone { OFPBMC_BAD_DL_ADDR_MASK, "BAD_DL_ADDR_MASK" }, 446*ee67461eSJoseph Mingrone { OFPBMC_BAD_NW_ADDR_MASK, "BAD_NW_ADDR_MASK" }, 447*ee67461eSJoseph Mingrone { OFPBMC_BAD_WILDCARDS, "BAD_WILDCARDS" }, 448*ee67461eSJoseph Mingrone { OFPBMC_BAD_FIELD, "BAD_FIELD" }, 449*ee67461eSJoseph Mingrone { OFPBMC_BAD_VALUE, "BAD_VALUE" }, 450*ee67461eSJoseph Mingrone { OFPBMC_BAD_MASK, "BAD_MASK" }, 451*ee67461eSJoseph Mingrone { OFPBMC_BAD_PREREQ, "BAD_PREREQ" }, 452*ee67461eSJoseph Mingrone { OFPBMC_DUP_FIELD, "DUP_FIELD" }, 453*ee67461eSJoseph Mingrone { OFPBMC_EPERM, "EPERM" }, 454*ee67461eSJoseph Mingrone { 0, NULL } 455*ee67461eSJoseph Mingrone }; 456*ee67461eSJoseph Mingrone 457*ee67461eSJoseph Mingrone #define OFPFMFC_UNKNOWN 0U 458*ee67461eSJoseph Mingrone #define OFPFMFC_TABLE_FULL 1U 459*ee67461eSJoseph Mingrone #define OFPFMFC_BAD_TABLE_ID 2U 460*ee67461eSJoseph Mingrone #define OFPFMFC_OVERLAP 3U 461*ee67461eSJoseph Mingrone #define OFPFMFC_EPERM 4U 462*ee67461eSJoseph Mingrone #define OFPFMFC_BAD_TIMEOUT 5U 463*ee67461eSJoseph Mingrone #define OFPFMFC_BAD_COMMAND 6U 464*ee67461eSJoseph Mingrone #define OFPFMFC_BAD_FLAGS 7U 465*ee67461eSJoseph Mingrone static const struct tok ofpfmfc_str[] = { 466*ee67461eSJoseph Mingrone { OFPFMFC_UNKNOWN, "UNKNOWN" }, 467*ee67461eSJoseph Mingrone { OFPFMFC_TABLE_FULL, "TABLE_FULL" }, 468*ee67461eSJoseph Mingrone { OFPFMFC_BAD_TABLE_ID, "BAD_TABLE_ID" }, 469*ee67461eSJoseph Mingrone { OFPFMFC_OVERLAP, "OVERLAP" }, 470*ee67461eSJoseph Mingrone { OFPFMFC_EPERM, "EPERM" }, 471*ee67461eSJoseph Mingrone { OFPFMFC_BAD_TIMEOUT, "BAD_TIMEOUT" }, 472*ee67461eSJoseph Mingrone { OFPFMFC_BAD_COMMAND, "BAD_COMMAND" }, 473*ee67461eSJoseph Mingrone { OFPFMFC_BAD_FLAGS, "BAD_FLAGS" }, 474*ee67461eSJoseph Mingrone { 0, NULL } 475*ee67461eSJoseph Mingrone }; 476*ee67461eSJoseph Mingrone 477*ee67461eSJoseph Mingrone #define OFPGMFC_GROUP_EXISTS 0U 478*ee67461eSJoseph Mingrone #define OFPGMFC_INVALID_GROUP 1U 479*ee67461eSJoseph Mingrone #define OFPGMFC_WEIGHT_UNSUPPORTED 2U 480*ee67461eSJoseph Mingrone #define OFPGMFC_OUT_OF_GROUPS 3U 481*ee67461eSJoseph Mingrone #define OFPGMFC_OUT_OF_BUCKETS 4U 482*ee67461eSJoseph Mingrone #define OFPGMFC_CHAINING_UNSUPPORTED 5U 483*ee67461eSJoseph Mingrone #define OFPGMFC_WATCH_UNSUPPORTED 6U 484*ee67461eSJoseph Mingrone #define OFPGMFC_LOOP 7U 485*ee67461eSJoseph Mingrone #define OFPGMFC_UNKNOWN_GROUP 8U 486*ee67461eSJoseph Mingrone #define OFPGMFC_CHAINED_GROUP 9U 487*ee67461eSJoseph Mingrone #define OFPGMFC_BAD_TYPE 10U 488*ee67461eSJoseph Mingrone #define OFPGMFC_BAD_COMMAND 11U 489*ee67461eSJoseph Mingrone #define OFPGMFC_BAD_BUCKET 12U 490*ee67461eSJoseph Mingrone #define OFPGMFC_BAD_MATCH 13U 491*ee67461eSJoseph Mingrone #define OFPGMFC_EPERM 14U 492*ee67461eSJoseph Mingrone static const struct tok ofpgmfc_str[] = { 493*ee67461eSJoseph Mingrone { OFPGMFC_GROUP_EXISTS, "GROUP_EXISTS" }, 494*ee67461eSJoseph Mingrone { OFPGMFC_INVALID_GROUP, "INVALID_GROUP" }, 495*ee67461eSJoseph Mingrone { OFPGMFC_WEIGHT_UNSUPPORTED, "WEIGHT_UNSUPPORTED" }, 496*ee67461eSJoseph Mingrone { OFPGMFC_OUT_OF_GROUPS, "OUT_OF_GROUPS" }, 497*ee67461eSJoseph Mingrone { OFPGMFC_OUT_OF_BUCKETS, "OUT_OF_BUCKETS" }, 498*ee67461eSJoseph Mingrone { OFPGMFC_CHAINING_UNSUPPORTED, "CHAINING_UNSUPPORTED" }, 499*ee67461eSJoseph Mingrone { OFPGMFC_WATCH_UNSUPPORTED, "WATCH_UNSUPPORTED" }, 500*ee67461eSJoseph Mingrone { OFPGMFC_LOOP, "LOOP" }, 501*ee67461eSJoseph Mingrone { OFPGMFC_UNKNOWN_GROUP, "UNKNOWN_GROUP" }, 502*ee67461eSJoseph Mingrone { OFPGMFC_CHAINED_GROUP, "CHAINED_GROUP" }, 503*ee67461eSJoseph Mingrone { OFPGMFC_BAD_TYPE, "BAD_TYPE" }, 504*ee67461eSJoseph Mingrone { OFPGMFC_BAD_COMMAND, "BAD_COMMAND" }, 505*ee67461eSJoseph Mingrone { OFPGMFC_BAD_BUCKET, "BAD_BUCKET" }, 506*ee67461eSJoseph Mingrone { OFPGMFC_BAD_MATCH, "BAD_MATCH" }, 507*ee67461eSJoseph Mingrone { OFPGMFC_EPERM, "EPERM" }, 508*ee67461eSJoseph Mingrone { 0, NULL } 509*ee67461eSJoseph Mingrone }; 510*ee67461eSJoseph Mingrone 511*ee67461eSJoseph Mingrone #define OFPPMFC_BAD_PORT 0U 512*ee67461eSJoseph Mingrone #define OFPPMFC_BAD_HW_ADDR 1U 513*ee67461eSJoseph Mingrone #define OFPPMFC_BAD_CONFIG 2U 514*ee67461eSJoseph Mingrone #define OFPPMFC_BAD_ADVERTISE 3U 515*ee67461eSJoseph Mingrone #define OFPPMFC_EPERM 4U 516*ee67461eSJoseph Mingrone static const struct tok ofppmfc_str[] = { 517*ee67461eSJoseph Mingrone { OFPPMFC_BAD_PORT, "BAD_PORT" }, 518*ee67461eSJoseph Mingrone { OFPPMFC_BAD_HW_ADDR, "BAD_HW_ADDR" }, 519*ee67461eSJoseph Mingrone { OFPPMFC_BAD_CONFIG, "BAD_CONFIG" }, 520*ee67461eSJoseph Mingrone { OFPPMFC_BAD_ADVERTISE, "BAD_ADVERTISE" }, 521*ee67461eSJoseph Mingrone { OFPPMFC_EPERM, "EPERM" }, 522*ee67461eSJoseph Mingrone { 0, NULL } 523*ee67461eSJoseph Mingrone }; 524*ee67461eSJoseph Mingrone 525*ee67461eSJoseph Mingrone #define OFPTMFC_BAD_TABLE 0U 526*ee67461eSJoseph Mingrone #define OFPTMFC_BAD_CONFIG 1U 527*ee67461eSJoseph Mingrone #define OFPTMFC_EPERM 2U 528*ee67461eSJoseph Mingrone static const struct tok ofptmfc_str[] = { 529*ee67461eSJoseph Mingrone { OFPTMFC_BAD_TABLE, "BAD_TABLE" }, 530*ee67461eSJoseph Mingrone { OFPTMFC_BAD_CONFIG, "BAD_CONFIG" }, 531*ee67461eSJoseph Mingrone { OFPTMFC_EPERM, "EPERM" }, 532*ee67461eSJoseph Mingrone { 0, NULL } 533*ee67461eSJoseph Mingrone }; 534*ee67461eSJoseph Mingrone 535*ee67461eSJoseph Mingrone #define OFPQOFC_BAD_PORT 0U 536*ee67461eSJoseph Mingrone #define OFPQOFC_BAD_QUEUE 1U 537*ee67461eSJoseph Mingrone #define OFPQOFC_EPERM 2U 538*ee67461eSJoseph Mingrone static const struct tok ofpqofc_str[] = { 539*ee67461eSJoseph Mingrone { OFPQOFC_BAD_PORT, "BAD_PORT" }, 540*ee67461eSJoseph Mingrone { OFPQOFC_BAD_QUEUE, "BAD_QUEUE" }, 541*ee67461eSJoseph Mingrone { OFPQOFC_EPERM, "EPERM" }, 542*ee67461eSJoseph Mingrone { 0, NULL } 543*ee67461eSJoseph Mingrone }; 544*ee67461eSJoseph Mingrone 545*ee67461eSJoseph Mingrone #define OFPSCFC_BAD_FLAGS 0U 546*ee67461eSJoseph Mingrone #define OFPSCFC_BAD_LEN 1U 547*ee67461eSJoseph Mingrone #define OFPSCFC_EPERM 2U 548*ee67461eSJoseph Mingrone static const struct tok ofpscfc_str[] = { 549*ee67461eSJoseph Mingrone { OFPSCFC_BAD_FLAGS, "BAD_FLAGS" }, 550*ee67461eSJoseph Mingrone { OFPSCFC_BAD_LEN, "BAD_LEN" }, 551*ee67461eSJoseph Mingrone { OFPSCFC_EPERM, "EPERM" }, 552*ee67461eSJoseph Mingrone { 0, NULL } 553*ee67461eSJoseph Mingrone }; 554*ee67461eSJoseph Mingrone 555*ee67461eSJoseph Mingrone #define OFPRRFC_STALE 0U 556*ee67461eSJoseph Mingrone #define OFPRRFC_UNSUP 1U 557*ee67461eSJoseph Mingrone #define OFPRRFC_BAD_ROLE 2U 558*ee67461eSJoseph Mingrone static const struct tok ofprrfc_str[] = { 559*ee67461eSJoseph Mingrone { OFPRRFC_STALE, "STALE" }, 560*ee67461eSJoseph Mingrone { OFPRRFC_UNSUP, "UNSUP" }, 561*ee67461eSJoseph Mingrone { OFPRRFC_BAD_ROLE, "BAD_ROLE" }, 562*ee67461eSJoseph Mingrone { 0, NULL } 563*ee67461eSJoseph Mingrone }; 564*ee67461eSJoseph Mingrone 565*ee67461eSJoseph Mingrone #define OFPMMFC_UNKNOWN 0U 566*ee67461eSJoseph Mingrone #define OFPMMFC_METER_EXISTS 1U 567*ee67461eSJoseph Mingrone #define OFPMMFC_INVALID_METER 2U 568*ee67461eSJoseph Mingrone #define OFPMMFC_UNKNOWN_METER 3U 569*ee67461eSJoseph Mingrone #define OFPMMFC_BAD_COMMAND 4U 570*ee67461eSJoseph Mingrone #define OFPMMFC_BAD_FLAGS 5U 571*ee67461eSJoseph Mingrone #define OFPMMFC_BAD_RATE 6U 572*ee67461eSJoseph Mingrone #define OFPMMFC_BAD_BURST 7U 573*ee67461eSJoseph Mingrone #define OFPMMFC_BAD_BAND 8U 574*ee67461eSJoseph Mingrone #define OFPMMFC_BAD_BAND_VALUE 9U 575*ee67461eSJoseph Mingrone #define OFPMMFC_OUT_OF_METERS 10U 576*ee67461eSJoseph Mingrone #define OFPMMFC_OUT_OF_BANDS 11U 577*ee67461eSJoseph Mingrone static const struct tok ofpmmfc_str[] = { 578*ee67461eSJoseph Mingrone { OFPMMFC_UNKNOWN, "UNKNOWN" }, 579*ee67461eSJoseph Mingrone { OFPMMFC_METER_EXISTS, "METER_EXISTS" }, 580*ee67461eSJoseph Mingrone { OFPMMFC_INVALID_METER, "INVALID_METER" }, 581*ee67461eSJoseph Mingrone { OFPMMFC_UNKNOWN_METER, "UNKNOWN_METER" }, 582*ee67461eSJoseph Mingrone { OFPMMFC_BAD_COMMAND, "BAD_COMMAND" }, 583*ee67461eSJoseph Mingrone { OFPMMFC_BAD_FLAGS, "BAD_FLAGS" }, 584*ee67461eSJoseph Mingrone { OFPMMFC_BAD_RATE, "BAD_RATE" }, 585*ee67461eSJoseph Mingrone { OFPMMFC_BAD_BURST, "BAD_BURST" }, 586*ee67461eSJoseph Mingrone { OFPMMFC_BAD_BAND, "BAD_BAND" }, 587*ee67461eSJoseph Mingrone { OFPMMFC_BAD_BAND_VALUE, "BAD_BAND_VALUE" }, 588*ee67461eSJoseph Mingrone { OFPMMFC_OUT_OF_METERS, "OUT_OF_METERS" }, 589*ee67461eSJoseph Mingrone { OFPMMFC_OUT_OF_BANDS, "OUT_OF_BANDS" }, 590*ee67461eSJoseph Mingrone { 0, NULL } 591*ee67461eSJoseph Mingrone }; 592*ee67461eSJoseph Mingrone 593*ee67461eSJoseph Mingrone #define OFPTFFC_BAD_TABLE 0U 594*ee67461eSJoseph Mingrone #define OFPTFFC_BAD_METADATA 1U 595*ee67461eSJoseph Mingrone #define OFPTFFC_BAD_TYPE 2U 596*ee67461eSJoseph Mingrone #define OFPTFFC_BAD_LEN 3U 597*ee67461eSJoseph Mingrone #define OFPTFFC_BAD_ARGUMENT 4U 598*ee67461eSJoseph Mingrone #define OFPTFFC_EPERM 5U 599*ee67461eSJoseph Mingrone static const struct tok ofptffc_str[] = { 600*ee67461eSJoseph Mingrone { OFPTFFC_BAD_TABLE, "BAD_TABLE" }, 601*ee67461eSJoseph Mingrone { OFPTFFC_BAD_METADATA, "BAD_METADATA" }, 602*ee67461eSJoseph Mingrone { OFPTFFC_BAD_TYPE, "BAD_TYPE" }, 603*ee67461eSJoseph Mingrone { OFPTFFC_BAD_LEN, "BAD_LEN" }, 604*ee67461eSJoseph Mingrone { OFPTFFC_BAD_ARGUMENT, "BAD_ARGUMENT" }, 605*ee67461eSJoseph Mingrone { OFPTFFC_EPERM, "EPERM" }, 606*ee67461eSJoseph Mingrone { 0, NULL } 607*ee67461eSJoseph Mingrone }; 608*ee67461eSJoseph Mingrone 609*ee67461eSJoseph Mingrone static const struct uint_tokary of13_ofpet2tokary[] = { 610*ee67461eSJoseph Mingrone { OFPET_HELLO_FAILED, ofphfc_str }, 611*ee67461eSJoseph Mingrone { OFPET_BAD_REQUEST, ofpbrc_str }, 612*ee67461eSJoseph Mingrone { OFPET_BAD_ACTION, ofpbac_str }, 613*ee67461eSJoseph Mingrone { OFPET_BAD_INSTRUCTION, ofpbic_str }, 614*ee67461eSJoseph Mingrone { OFPET_BAD_MATCH, ofpbmc_str }, 615*ee67461eSJoseph Mingrone { OFPET_FLOW_MOD_FAILED, ofpfmfc_str }, 616*ee67461eSJoseph Mingrone { OFPET_GROUP_MOD_FAILED, ofpgmfc_str }, 617*ee67461eSJoseph Mingrone { OFPET_PORT_MOD_FAILED, ofppmfc_str }, 618*ee67461eSJoseph Mingrone { OFPET_TABLE_MOD_FAILED, ofptmfc_str }, 619*ee67461eSJoseph Mingrone { OFPET_QUEUE_OP_FAILED, ofpqofc_str }, 620*ee67461eSJoseph Mingrone { OFPET_SWITCH_CONFIG_FAILED, ofpscfc_str }, 621*ee67461eSJoseph Mingrone { OFPET_ROLE_REQUEST_FAILED, ofprrfc_str }, 622*ee67461eSJoseph Mingrone { OFPET_METER_MOD_FAILED, ofpmmfc_str }, 623*ee67461eSJoseph Mingrone { OFPET_TABLE_FEATURES_FAILED, ofptffc_str }, 624*ee67461eSJoseph Mingrone { OFPET_EXPERIMENTER, NULL }, /* defines no codes */ 625*ee67461eSJoseph Mingrone /* uint2tokary() does not use array termination. */ 626*ee67461eSJoseph Mingrone }; 627*ee67461eSJoseph Mingrone 628*ee67461eSJoseph Mingrone /* lengths (fixed or minimal) of particular message types, where not 0 */ 629*ee67461eSJoseph Mingrone #define OF_ERROR_MSG_MINLEN (12U - OF_HEADER_FIXLEN) 630*ee67461eSJoseph Mingrone #define OF_FEATURES_REPLY_FIXLEN (32U - OF_HEADER_FIXLEN) 631*ee67461eSJoseph Mingrone #define OF_PORT_MOD_FIXLEN (40U - OF_HEADER_FIXLEN) 632*ee67461eSJoseph Mingrone #define OF_SWITCH_CONFIG_MSG_FIXLEN (12U - OF_HEADER_FIXLEN) 633*ee67461eSJoseph Mingrone #define OF_TABLE_MOD_FIXLEN (16U - OF_HEADER_FIXLEN) 634*ee67461eSJoseph Mingrone #define OF_QUEUE_GET_CONFIG_REQUEST_FIXLEN (16U - OF_HEADER_FIXLEN) 635*ee67461eSJoseph Mingrone #define OF_ROLE_MSG_FIXLEN (24U - OF_HEADER_FIXLEN) 636*ee67461eSJoseph Mingrone #define OF_ASYNC_MSG_FIXLEN (32U - OF_HEADER_FIXLEN) 637*ee67461eSJoseph Mingrone #define OF_PORT_STATUS_FIXLEN (80U - OF_HEADER_FIXLEN) 638*ee67461eSJoseph Mingrone #define OF_EXPERIMENTER_MSG_MINLEN (16U - OF_HEADER_FIXLEN) 639*ee67461eSJoseph Mingrone 640*ee67461eSJoseph Mingrone /* lengths (fixed or minimal) of particular protocol structures */ 641*ee67461eSJoseph Mingrone #define OF_HELLO_ELEM_MINSIZE 4U 642*ee67461eSJoseph Mingrone 643*ee67461eSJoseph Mingrone /* miscellaneous constants from [OF13] */ 644*ee67461eSJoseph Mingrone #define OFP_MAX_PORT_NAME_LEN 16U 645*ee67461eSJoseph Mingrone 646*ee67461eSJoseph Mingrone /* [OF13] Section 7.2.1 */ 647*ee67461eSJoseph Mingrone static void 648*ee67461eSJoseph Mingrone of13_port_print(netdissect_options *ndo, 649*ee67461eSJoseph Mingrone const u_char *cp) 650*ee67461eSJoseph Mingrone { 651*ee67461eSJoseph Mingrone /* port_no */ 652*ee67461eSJoseph Mingrone ND_PRINT("\n\t port_no %s", 653*ee67461eSJoseph Mingrone tok2str(ofpp_str, "%u", GET_BE_U_4(cp))); 654*ee67461eSJoseph Mingrone cp += 4; 655*ee67461eSJoseph Mingrone /* pad */ 656*ee67461eSJoseph Mingrone cp += 4; 657*ee67461eSJoseph Mingrone /* hw_addr */ 658*ee67461eSJoseph Mingrone ND_PRINT(", hw_addr %s", GET_ETHERADDR_STRING(cp)); 659*ee67461eSJoseph Mingrone cp += MAC_ADDR_LEN; 660*ee67461eSJoseph Mingrone /* pad2 */ 661*ee67461eSJoseph Mingrone cp += 2; 662*ee67461eSJoseph Mingrone /* name */ 663*ee67461eSJoseph Mingrone ND_PRINT(", name '"); 664*ee67461eSJoseph Mingrone nd_printjnp(ndo, cp, OFP_MAX_PORT_NAME_LEN); 665*ee67461eSJoseph Mingrone ND_PRINT("'"); 666*ee67461eSJoseph Mingrone cp += OFP_MAX_PORT_NAME_LEN; 667*ee67461eSJoseph Mingrone 668*ee67461eSJoseph Mingrone if (ndo->ndo_vflag < 2) { 669*ee67461eSJoseph Mingrone ND_TCHECK_LEN(cp, 32); 670*ee67461eSJoseph Mingrone return; 671*ee67461eSJoseph Mingrone } 672*ee67461eSJoseph Mingrone 673*ee67461eSJoseph Mingrone /* config */ 674*ee67461eSJoseph Mingrone ND_PRINT("\n\t config 0x%08x", GET_BE_U_4(cp)); 675*ee67461eSJoseph Mingrone of_bitmap_print(ndo, ofppc_bm, GET_BE_U_4(cp), OFPPC_U); 676*ee67461eSJoseph Mingrone cp += 4; 677*ee67461eSJoseph Mingrone /* state */ 678*ee67461eSJoseph Mingrone ND_PRINT("\n\t state 0x%08x", GET_BE_U_4(cp)); 679*ee67461eSJoseph Mingrone of_bitmap_print(ndo, ofpps_bm, GET_BE_U_4(cp), OFPPS_U);; 680*ee67461eSJoseph Mingrone cp += 4; 681*ee67461eSJoseph Mingrone /* curr */ 682*ee67461eSJoseph Mingrone ND_PRINT("\n\t curr 0x%08x", GET_BE_U_4(cp)); 683*ee67461eSJoseph Mingrone of_bitmap_print(ndo, ofppf_bm, GET_BE_U_4(cp), OFPPF_U); 684*ee67461eSJoseph Mingrone cp += 4; 685*ee67461eSJoseph Mingrone /* advertised */ 686*ee67461eSJoseph Mingrone ND_PRINT("\n\t advertised 0x%08x", GET_BE_U_4(cp)); 687*ee67461eSJoseph Mingrone of_bitmap_print(ndo, ofppf_bm, GET_BE_U_4(cp), OFPPF_U); 688*ee67461eSJoseph Mingrone cp += 4; 689*ee67461eSJoseph Mingrone /* supported */ 690*ee67461eSJoseph Mingrone ND_PRINT("\n\t supported 0x%08x", GET_BE_U_4(cp)); 691*ee67461eSJoseph Mingrone of_bitmap_print(ndo, ofppf_bm, GET_BE_U_4(cp), OFPPF_U); 692*ee67461eSJoseph Mingrone cp += 4; 693*ee67461eSJoseph Mingrone /* peer */ 694*ee67461eSJoseph Mingrone ND_PRINT("\n\t peer 0x%08x", GET_BE_U_4(cp)); 695*ee67461eSJoseph Mingrone of_bitmap_print(ndo, ofppf_bm, GET_BE_U_4(cp), OFPPF_U); 696*ee67461eSJoseph Mingrone cp += 4; 697*ee67461eSJoseph Mingrone /* curr_speed */ 698*ee67461eSJoseph Mingrone ND_PRINT("\n\t curr_speed %ukbps", GET_BE_U_4(cp)); 699*ee67461eSJoseph Mingrone cp += 4; 700*ee67461eSJoseph Mingrone /* max_speed */ 701*ee67461eSJoseph Mingrone ND_PRINT("\n\t max_speed %ukbps", GET_BE_U_4(cp)); 702*ee67461eSJoseph Mingrone } 703*ee67461eSJoseph Mingrone 704*ee67461eSJoseph Mingrone /* [OF13] Section 7.3.1 */ 705*ee67461eSJoseph Mingrone static void 706*ee67461eSJoseph Mingrone of13_features_reply_print(netdissect_options *ndo, 707*ee67461eSJoseph Mingrone const u_char *cp, u_int len _U_) 708*ee67461eSJoseph Mingrone { 709*ee67461eSJoseph Mingrone /* datapath_id */ 710*ee67461eSJoseph Mingrone ND_PRINT("\n\t dpid 0x%016" PRIx64, GET_BE_U_8(cp)); 711*ee67461eSJoseph Mingrone cp += 8; 712*ee67461eSJoseph Mingrone /* n_buffers */ 713*ee67461eSJoseph Mingrone ND_PRINT(", n_buffers %u", GET_BE_U_4(cp)); 714*ee67461eSJoseph Mingrone cp += 4; 715*ee67461eSJoseph Mingrone /* n_tables */ 716*ee67461eSJoseph Mingrone ND_PRINT(", n_tables %u", GET_U_1(cp)); 717*ee67461eSJoseph Mingrone cp += 1; 718*ee67461eSJoseph Mingrone /* auxiliary_id */ 719*ee67461eSJoseph Mingrone ND_PRINT(", auxiliary_id %u", GET_U_1(cp)); 720*ee67461eSJoseph Mingrone cp += 1; 721*ee67461eSJoseph Mingrone /* pad */ 722*ee67461eSJoseph Mingrone cp += 2; 723*ee67461eSJoseph Mingrone /* capabilities */ 724*ee67461eSJoseph Mingrone ND_PRINT("\n\t capabilities 0x%08x", GET_BE_U_4(cp)); 725*ee67461eSJoseph Mingrone of_bitmap_print(ndo, ofp_capabilities_bm, GET_BE_U_4(cp), OFPCAP_U); 726*ee67461eSJoseph Mingrone cp += 4; 727*ee67461eSJoseph Mingrone /* reserved */ 728*ee67461eSJoseph Mingrone ND_TCHECK_4(cp); 729*ee67461eSJoseph Mingrone } 730*ee67461eSJoseph Mingrone 731*ee67461eSJoseph Mingrone /* [OF13] Section 7.3.2 */ 732*ee67461eSJoseph Mingrone static void 733*ee67461eSJoseph Mingrone of13_switch_config_msg_print(netdissect_options *ndo, 734*ee67461eSJoseph Mingrone const u_char *cp, u_int len _U_) 735*ee67461eSJoseph Mingrone { 736*ee67461eSJoseph Mingrone /* flags */ 737*ee67461eSJoseph Mingrone ND_PRINT("\n\t flags %s", 738*ee67461eSJoseph Mingrone tok2str(ofp_config_str, "invalid (0x%04x)", GET_BE_U_2(cp))); 739*ee67461eSJoseph Mingrone cp += 2; 740*ee67461eSJoseph Mingrone /* miss_send_len */ 741*ee67461eSJoseph Mingrone ND_PRINT(", miss_send_len %s", 742*ee67461eSJoseph Mingrone tok2str(ofpcml_str, "%u", GET_BE_U_2(cp))); 743*ee67461eSJoseph Mingrone } 744*ee67461eSJoseph Mingrone 745*ee67461eSJoseph Mingrone /* [OF13] Section 7.3.3 */ 746*ee67461eSJoseph Mingrone static void 747*ee67461eSJoseph Mingrone of13_table_mod_print(netdissect_options *ndo, 748*ee67461eSJoseph Mingrone const u_char *cp, u_int len _U_) 749*ee67461eSJoseph Mingrone { 750*ee67461eSJoseph Mingrone /* table_id */ 751*ee67461eSJoseph Mingrone ND_PRINT("\n\t table_id %s", tok2str(ofptt_str, "%u", GET_U_1(cp))); 752*ee67461eSJoseph Mingrone cp += 1; 753*ee67461eSJoseph Mingrone /* pad */ 754*ee67461eSJoseph Mingrone cp += 3; 755*ee67461eSJoseph Mingrone /* config */ 756*ee67461eSJoseph Mingrone ND_PRINT(", config 0x%08x", GET_BE_U_4(cp)); 757*ee67461eSJoseph Mingrone } 758*ee67461eSJoseph Mingrone 759*ee67461eSJoseph Mingrone /* [OF13] Section 7.3.9 */ 760*ee67461eSJoseph Mingrone static void 761*ee67461eSJoseph Mingrone of13_role_msg_print(netdissect_options *ndo, 762*ee67461eSJoseph Mingrone const u_char *cp, u_int len _U_) 763*ee67461eSJoseph Mingrone { 764*ee67461eSJoseph Mingrone /* role */ 765*ee67461eSJoseph Mingrone ND_PRINT("\n\t role %s", 766*ee67461eSJoseph Mingrone tok2str(ofpcr_str, "invalid (0x%08x)", GET_BE_U_4(cp))); 767*ee67461eSJoseph Mingrone cp += 4; 768*ee67461eSJoseph Mingrone /* pad */ 769*ee67461eSJoseph Mingrone cp += 4; 770*ee67461eSJoseph Mingrone /* generation_id */ 771*ee67461eSJoseph Mingrone ND_PRINT(", generation_id 0x%016" PRIx64, GET_BE_U_8(cp)); 772*ee67461eSJoseph Mingrone } 773*ee67461eSJoseph Mingrone 774*ee67461eSJoseph Mingrone /* [OF13] Section 7.3.10 */ 775*ee67461eSJoseph Mingrone static void 776*ee67461eSJoseph Mingrone of13_async_msg_print(netdissect_options *ndo, 777*ee67461eSJoseph Mingrone const u_char *cp, u_int len _U_) 778*ee67461eSJoseph Mingrone { 779*ee67461eSJoseph Mingrone /* packet_in_mask[0] */ 780*ee67461eSJoseph Mingrone ND_PRINT("\n\t packet_in_mask[EM] 0x%08x", GET_BE_U_4(cp)); 781*ee67461eSJoseph Mingrone of_bitmap_print(ndo, async_ofpr_bm, GET_BE_U_4(cp), ASYNC_OFPR_U); 782*ee67461eSJoseph Mingrone cp += 4; 783*ee67461eSJoseph Mingrone /* packet_in_mask[1] */ 784*ee67461eSJoseph Mingrone ND_PRINT("\n\t packet_in_mask[S] 0x%08x", GET_BE_U_4(cp)); 785*ee67461eSJoseph Mingrone of_bitmap_print(ndo, async_ofpr_bm, GET_BE_U_4(cp), ASYNC_OFPR_U); 786*ee67461eSJoseph Mingrone cp += 4; 787*ee67461eSJoseph Mingrone /* port_status_mask[0] */ 788*ee67461eSJoseph Mingrone ND_PRINT("\n\t port_status_mask[EM] 0x%08x", GET_BE_U_4(cp)); 789*ee67461eSJoseph Mingrone of_bitmap_print(ndo, async_ofppr_bm, GET_BE_U_4(cp), ASYNC_OFPPR_U); 790*ee67461eSJoseph Mingrone cp += 4; 791*ee67461eSJoseph Mingrone /* port_status_mask[1] */ 792*ee67461eSJoseph Mingrone ND_PRINT("\n\t port_status_mask[S] 0x%08x", GET_BE_U_4(cp)); 793*ee67461eSJoseph Mingrone of_bitmap_print(ndo, async_ofppr_bm, GET_BE_U_4(cp), ASYNC_OFPPR_U); 794*ee67461eSJoseph Mingrone cp += 4; 795*ee67461eSJoseph Mingrone /* flow_removed_mask[0] */ 796*ee67461eSJoseph Mingrone ND_PRINT("\n\t flow_removed_mask[EM] 0x%08x", GET_BE_U_4(cp)); 797*ee67461eSJoseph Mingrone of_bitmap_print(ndo, async_ofppr_bm, GET_BE_U_4(cp), ASYNC_OFPPR_U); 798*ee67461eSJoseph Mingrone cp += 4; 799*ee67461eSJoseph Mingrone /* flow_removed_mask[1] */ 800*ee67461eSJoseph Mingrone ND_PRINT("\n\t flow_removed_mask[S] 0x%08x", GET_BE_U_4(cp)); 801*ee67461eSJoseph Mingrone of_bitmap_print(ndo, async_ofppr_bm, GET_BE_U_4(cp), ASYNC_OFPPR_U); 802*ee67461eSJoseph Mingrone } 803*ee67461eSJoseph Mingrone 804*ee67461eSJoseph Mingrone /* [OF13] Section 7.3.4.3 */ 805*ee67461eSJoseph Mingrone static void 806*ee67461eSJoseph Mingrone of13_port_mod_print(netdissect_options *ndo, 807*ee67461eSJoseph Mingrone const u_char *cp, u_int len _U_) 808*ee67461eSJoseph Mingrone { 809*ee67461eSJoseph Mingrone /* port_no */ 810*ee67461eSJoseph Mingrone ND_PRINT("\n\t port_no %s", tok2str(ofpp_str, "%u", GET_BE_U_4(cp))); 811*ee67461eSJoseph Mingrone cp += 4; 812*ee67461eSJoseph Mingrone /* pad */ 813*ee67461eSJoseph Mingrone cp += 4; 814*ee67461eSJoseph Mingrone /* hw_addr */ 815*ee67461eSJoseph Mingrone ND_PRINT(", hw_addr %s", GET_ETHERADDR_STRING(cp)); 816*ee67461eSJoseph Mingrone cp += MAC_ADDR_LEN; 817*ee67461eSJoseph Mingrone /* pad2 */ 818*ee67461eSJoseph Mingrone cp += 2; 819*ee67461eSJoseph Mingrone /* config */ 820*ee67461eSJoseph Mingrone ND_PRINT("\n\t config 0x%08x", GET_BE_U_4(cp)); 821*ee67461eSJoseph Mingrone of_bitmap_print(ndo, ofppc_bm, GET_BE_U_4(cp), OFPPC_U); 822*ee67461eSJoseph Mingrone cp += 4; 823*ee67461eSJoseph Mingrone /* mask */ 824*ee67461eSJoseph Mingrone ND_PRINT("\n\t mask 0x%08x", GET_BE_U_4(cp)); 825*ee67461eSJoseph Mingrone of_bitmap_print(ndo, ofppc_bm, GET_BE_U_4(cp), OFPPC_U); 826*ee67461eSJoseph Mingrone cp += 4; 827*ee67461eSJoseph Mingrone /* advertise */ 828*ee67461eSJoseph Mingrone ND_PRINT("\n\t advertise 0x%08x", GET_BE_U_4(cp)); 829*ee67461eSJoseph Mingrone of_bitmap_print(ndo, ofppf_bm, GET_BE_U_4(cp), OFPPF_U); 830*ee67461eSJoseph Mingrone cp += 4; 831*ee67461eSJoseph Mingrone /* pad3 */ 832*ee67461eSJoseph Mingrone /* Always the last field, check bounds. */ 833*ee67461eSJoseph Mingrone ND_TCHECK_4(cp); 834*ee67461eSJoseph Mingrone } 835*ee67461eSJoseph Mingrone 836*ee67461eSJoseph Mingrone /* [OF13] Section 7.4.3 */ 837*ee67461eSJoseph Mingrone static void 838*ee67461eSJoseph Mingrone of13_port_status_print(netdissect_options *ndo, 839*ee67461eSJoseph Mingrone const u_char *cp, u_int len _U_) 840*ee67461eSJoseph Mingrone { 841*ee67461eSJoseph Mingrone /* reason */ 842*ee67461eSJoseph Mingrone ND_PRINT("\n\t reason %s", 843*ee67461eSJoseph Mingrone tok2str(ofppr_str, "invalid (0x02x)", GET_U_1(cp))); 844*ee67461eSJoseph Mingrone cp += 1; 845*ee67461eSJoseph Mingrone /* pad */ 846*ee67461eSJoseph Mingrone cp += 7; 847*ee67461eSJoseph Mingrone /* desc */ 848*ee67461eSJoseph Mingrone of13_port_print(ndo, cp); 849*ee67461eSJoseph Mingrone } 850*ee67461eSJoseph Mingrone 851*ee67461eSJoseph Mingrone /* [OF13] Section 7.5.1 */ 852*ee67461eSJoseph Mingrone static void 853*ee67461eSJoseph Mingrone of13_hello_elements_print(netdissect_options *ndo, 854*ee67461eSJoseph Mingrone const u_char *cp, u_int len) 855*ee67461eSJoseph Mingrone { 856*ee67461eSJoseph Mingrone while (len) { 857*ee67461eSJoseph Mingrone uint16_t type, bmlen; 858*ee67461eSJoseph Mingrone 859*ee67461eSJoseph Mingrone if (len < OF_HELLO_ELEM_MINSIZE) 860*ee67461eSJoseph Mingrone goto invalid; 861*ee67461eSJoseph Mingrone /* type */ 862*ee67461eSJoseph Mingrone type = GET_BE_U_2(cp); 863*ee67461eSJoseph Mingrone OF_FWD(2); 864*ee67461eSJoseph Mingrone ND_PRINT("\n\t type %s", 865*ee67461eSJoseph Mingrone tok2str(ofphet_str, "unknown (0x%04x)", type)); 866*ee67461eSJoseph Mingrone /* length */ 867*ee67461eSJoseph Mingrone bmlen = GET_BE_U_2(cp); 868*ee67461eSJoseph Mingrone OF_FWD(2); 869*ee67461eSJoseph Mingrone ND_PRINT(", length %u", bmlen); 870*ee67461eSJoseph Mingrone /* cp is OF_HELLO_ELEM_MINSIZE bytes in */ 871*ee67461eSJoseph Mingrone if (bmlen < OF_HELLO_ELEM_MINSIZE || 872*ee67461eSJoseph Mingrone bmlen > OF_HELLO_ELEM_MINSIZE + len) 873*ee67461eSJoseph Mingrone goto invalid; 874*ee67461eSJoseph Mingrone switch (type) { 875*ee67461eSJoseph Mingrone case OFPHET_VERSIONBITMAP: 876*ee67461eSJoseph Mingrone /* 877*ee67461eSJoseph Mingrone * The specification obviously overprovisions the space 878*ee67461eSJoseph Mingrone * for version bitmaps in this element ("ofp versions 879*ee67461eSJoseph Mingrone * 32 to 63 are encoded in the second bitmap and so 880*ee67461eSJoseph Mingrone * on"). Keep this code simple for now and recognize 881*ee67461eSJoseph Mingrone * only a single bitmap with no padding. 882*ee67461eSJoseph Mingrone */ 883*ee67461eSJoseph Mingrone if (bmlen == OF_HELLO_ELEM_MINSIZE + 4) { 884*ee67461eSJoseph Mingrone uint32_t bitmap = GET_BE_U_4(cp); 885*ee67461eSJoseph Mingrone ND_PRINT(", bitmap 0x%08x", bitmap); 886*ee67461eSJoseph Mingrone of_bitmap_print(ndo, ofverbm_str, bitmap, 887*ee67461eSJoseph Mingrone OF_BIT_VER_U); 888*ee67461eSJoseph Mingrone } else { 889*ee67461eSJoseph Mingrone ND_PRINT(" (bogus)"); 890*ee67461eSJoseph Mingrone ND_TCHECK_LEN(cp, bmlen - OF_HELLO_ELEM_MINSIZE); 891*ee67461eSJoseph Mingrone } 892*ee67461eSJoseph Mingrone break; 893*ee67461eSJoseph Mingrone default: 894*ee67461eSJoseph Mingrone ND_TCHECK_LEN(cp, bmlen - OF_HELLO_ELEM_MINSIZE); 895*ee67461eSJoseph Mingrone } 896*ee67461eSJoseph Mingrone OF_FWD(bmlen - OF_HELLO_ELEM_MINSIZE); 897*ee67461eSJoseph Mingrone } 898*ee67461eSJoseph Mingrone return; 899*ee67461eSJoseph Mingrone 900*ee67461eSJoseph Mingrone invalid: 901*ee67461eSJoseph Mingrone nd_print_invalid(ndo); 902*ee67461eSJoseph Mingrone ND_TCHECK_LEN(cp, len); 903*ee67461eSJoseph Mingrone } 904*ee67461eSJoseph Mingrone 905*ee67461eSJoseph Mingrone /* [OF13] Section 7.5.4 */ 906*ee67461eSJoseph Mingrone static void 907*ee67461eSJoseph Mingrone of13_experimenter_message_print(netdissect_options *ndo, 908*ee67461eSJoseph Mingrone const u_char *cp, u_int len) 909*ee67461eSJoseph Mingrone { 910*ee67461eSJoseph Mingrone uint32_t experimenter; 911*ee67461eSJoseph Mingrone 912*ee67461eSJoseph Mingrone /* experimenter */ 913*ee67461eSJoseph Mingrone experimenter = GET_BE_U_4(cp); 914*ee67461eSJoseph Mingrone OF_FWD(4); 915*ee67461eSJoseph Mingrone ND_PRINT("\n\t experimenter 0x%08x (%s)", experimenter, 916*ee67461eSJoseph Mingrone of_vendor_name(experimenter)); 917*ee67461eSJoseph Mingrone /* exp_type */ 918*ee67461eSJoseph Mingrone ND_PRINT(", exp_type 0x%08x", GET_BE_U_4(cp)); 919*ee67461eSJoseph Mingrone OF_FWD(4); 920*ee67461eSJoseph Mingrone /* data */ 921*ee67461eSJoseph Mingrone of_data_print(ndo, cp, len); 922*ee67461eSJoseph Mingrone } 923*ee67461eSJoseph Mingrone 924*ee67461eSJoseph Mingrone /* [OF13] Section 7.3.6 */ 925*ee67461eSJoseph Mingrone static void 926*ee67461eSJoseph Mingrone of13_queue_get_config_request_print(netdissect_options *ndo, 927*ee67461eSJoseph Mingrone const u_char *cp, u_int len _U_) 928*ee67461eSJoseph Mingrone { 929*ee67461eSJoseph Mingrone /* port */ 930*ee67461eSJoseph Mingrone ND_PRINT("\n\t port %s", tok2str(ofpp_str, "%u", GET_BE_U_4(cp))); 931*ee67461eSJoseph Mingrone cp += 4; 932*ee67461eSJoseph Mingrone /* pad */ 933*ee67461eSJoseph Mingrone /* Always the last field, check bounds. */ 934*ee67461eSJoseph Mingrone ND_TCHECK_4(cp); 935*ee67461eSJoseph Mingrone } 936*ee67461eSJoseph Mingrone 937*ee67461eSJoseph Mingrone /* [OF13] Section 7.4.4 */ 938*ee67461eSJoseph Mingrone static void 939*ee67461eSJoseph Mingrone of13_error_print(netdissect_options *ndo, 940*ee67461eSJoseph Mingrone const u_char *cp, u_int len) 941*ee67461eSJoseph Mingrone { 942*ee67461eSJoseph Mingrone uint16_t type, code; 943*ee67461eSJoseph Mingrone const struct tok *code_str; 944*ee67461eSJoseph Mingrone 945*ee67461eSJoseph Mingrone /* type */ 946*ee67461eSJoseph Mingrone type = GET_BE_U_2(cp); 947*ee67461eSJoseph Mingrone OF_FWD(2); 948*ee67461eSJoseph Mingrone ND_PRINT("\n\t type %s", tok2str(ofpet_str, "invalid (0x%04x)", type)); 949*ee67461eSJoseph Mingrone /* code */ 950*ee67461eSJoseph Mingrone code = GET_BE_U_2(cp); 951*ee67461eSJoseph Mingrone OF_FWD(2); 952*ee67461eSJoseph Mingrone code_str = uint2tokary(of13_ofpet2tokary, type); 953*ee67461eSJoseph Mingrone if (code_str != NULL) 954*ee67461eSJoseph Mingrone ND_PRINT(", code %s", 955*ee67461eSJoseph Mingrone tok2str(code_str, "invalid (0x%04x)", code)); 956*ee67461eSJoseph Mingrone else 957*ee67461eSJoseph Mingrone ND_PRINT(", code invalid (0x%04x)", code); 958*ee67461eSJoseph Mingrone /* data */ 959*ee67461eSJoseph Mingrone of_data_print(ndo, cp, len); 960*ee67461eSJoseph Mingrone } 961*ee67461eSJoseph Mingrone 962*ee67461eSJoseph Mingrone static const struct of_msgtypeinfo of13_msgtypeinfo[OFPT_MAX + 1] = { 963*ee67461eSJoseph Mingrone /* 964*ee67461eSJoseph Mingrone * [OF13] Section 7.5.1 965*ee67461eSJoseph Mingrone * n * variable-size data units. 966*ee67461eSJoseph Mingrone */ 967*ee67461eSJoseph Mingrone { 968*ee67461eSJoseph Mingrone "HELLO", of13_hello_elements_print, 969*ee67461eSJoseph Mingrone REQ_MINLEN, 0 970*ee67461eSJoseph Mingrone }, 971*ee67461eSJoseph Mingrone /* 972*ee67461eSJoseph Mingrone * [OF13] Section 7.4.4 973*ee67461eSJoseph Mingrone * A fixed-size message body and variable-size data. 974*ee67461eSJoseph Mingrone */ 975*ee67461eSJoseph Mingrone { 976*ee67461eSJoseph Mingrone "ERROR", of13_error_print, 977*ee67461eSJoseph Mingrone REQ_MINLEN, OF_ERROR_MSG_MINLEN 978*ee67461eSJoseph Mingrone }, 979*ee67461eSJoseph Mingrone /* 980*ee67461eSJoseph Mingrone * [OF13] Section 7.5.2 981*ee67461eSJoseph Mingrone * Variable-size data. 982*ee67461eSJoseph Mingrone */ 983*ee67461eSJoseph Mingrone { 984*ee67461eSJoseph Mingrone "ECHO_REQUEST", of_data_print, 985*ee67461eSJoseph Mingrone REQ_MINLEN, 0 986*ee67461eSJoseph Mingrone }, 987*ee67461eSJoseph Mingrone /* 988*ee67461eSJoseph Mingrone * [OF13] Section 7.5.3 989*ee67461eSJoseph Mingrone * Variable-size data. 990*ee67461eSJoseph Mingrone */ 991*ee67461eSJoseph Mingrone { 992*ee67461eSJoseph Mingrone "ECHO_REPLY", of_data_print, 993*ee67461eSJoseph Mingrone REQ_MINLEN, 0 994*ee67461eSJoseph Mingrone }, 995*ee67461eSJoseph Mingrone /* 996*ee67461eSJoseph Mingrone * [OF13] Section 7.5.4 997*ee67461eSJoseph Mingrone * A fixed-size message body and variable-size data. 998*ee67461eSJoseph Mingrone */ 999*ee67461eSJoseph Mingrone { 1000*ee67461eSJoseph Mingrone "EXPERIMENTER", of13_experimenter_message_print, 1001*ee67461eSJoseph Mingrone REQ_MINLEN, OF_EXPERIMENTER_MSG_MINLEN 1002*ee67461eSJoseph Mingrone }, 1003*ee67461eSJoseph Mingrone /* 1004*ee67461eSJoseph Mingrone * [OF13] Section 7.3.1 1005*ee67461eSJoseph Mingrone * No message body. 1006*ee67461eSJoseph Mingrone */ 1007*ee67461eSJoseph Mingrone { 1008*ee67461eSJoseph Mingrone "FEATURES_REQUEST", NULL, 1009*ee67461eSJoseph Mingrone REQ_FIXLEN, 0 1010*ee67461eSJoseph Mingrone }, 1011*ee67461eSJoseph Mingrone /* 1012*ee67461eSJoseph Mingrone * [OF13] Section 7.3.1 1013*ee67461eSJoseph Mingrone * A fixed-size message body. 1014*ee67461eSJoseph Mingrone */ 1015*ee67461eSJoseph Mingrone { 1016*ee67461eSJoseph Mingrone "FEATURES_REPLY", of13_features_reply_print, 1017*ee67461eSJoseph Mingrone REQ_FIXLEN, OF_FEATURES_REPLY_FIXLEN 1018*ee67461eSJoseph Mingrone }, 1019*ee67461eSJoseph Mingrone /* 1020*ee67461eSJoseph Mingrone * [OF13] Section 7.3.2 1021*ee67461eSJoseph Mingrone * No message body. 1022*ee67461eSJoseph Mingrone */ 1023*ee67461eSJoseph Mingrone { 1024*ee67461eSJoseph Mingrone "GET_CONFIG_REQUEST", NULL, 1025*ee67461eSJoseph Mingrone REQ_FIXLEN, 0 1026*ee67461eSJoseph Mingrone }, 1027*ee67461eSJoseph Mingrone /* 1028*ee67461eSJoseph Mingrone * [OF13] Section 7.3.2 1029*ee67461eSJoseph Mingrone * A fixed-size message body. 1030*ee67461eSJoseph Mingrone */ 1031*ee67461eSJoseph Mingrone { 1032*ee67461eSJoseph Mingrone "GET_CONFIG_REPLY", of13_switch_config_msg_print, 1033*ee67461eSJoseph Mingrone REQ_FIXLEN, OF_SWITCH_CONFIG_MSG_FIXLEN 1034*ee67461eSJoseph Mingrone }, 1035*ee67461eSJoseph Mingrone /* 1036*ee67461eSJoseph Mingrone * [OF13] Section 7.3.2 1037*ee67461eSJoseph Mingrone * A fixed-size message body. 1038*ee67461eSJoseph Mingrone */ 1039*ee67461eSJoseph Mingrone { 1040*ee67461eSJoseph Mingrone "SET_CONFIG", of13_switch_config_msg_print, 1041*ee67461eSJoseph Mingrone REQ_FIXLEN, OF_SWITCH_CONFIG_MSG_FIXLEN 1042*ee67461eSJoseph Mingrone }, 1043*ee67461eSJoseph Mingrone /* 1044*ee67461eSJoseph Mingrone * [OF13] Section 7.4.1 1045*ee67461eSJoseph Mingrone * (to be done) 1046*ee67461eSJoseph Mingrone */ 1047*ee67461eSJoseph Mingrone { 1048*ee67461eSJoseph Mingrone "PACKET_IN", NULL, 1049*ee67461eSJoseph Mingrone REQ_NONE, 0 1050*ee67461eSJoseph Mingrone }, 1051*ee67461eSJoseph Mingrone /* 1052*ee67461eSJoseph Mingrone * [OF13] Section 7.4.2 1053*ee67461eSJoseph Mingrone * (to be done) 1054*ee67461eSJoseph Mingrone */ 1055*ee67461eSJoseph Mingrone { 1056*ee67461eSJoseph Mingrone "FLOW_REMOVED", NULL, 1057*ee67461eSJoseph Mingrone REQ_NONE, 0 1058*ee67461eSJoseph Mingrone }, 1059*ee67461eSJoseph Mingrone /* 1060*ee67461eSJoseph Mingrone * [OF13] Section 7.4.3 1061*ee67461eSJoseph Mingrone * A fixed-size message body. 1062*ee67461eSJoseph Mingrone */ 1063*ee67461eSJoseph Mingrone { 1064*ee67461eSJoseph Mingrone "PORT_STATUS", of13_port_status_print, 1065*ee67461eSJoseph Mingrone REQ_FIXLEN, OF_PORT_STATUS_FIXLEN 1066*ee67461eSJoseph Mingrone }, 1067*ee67461eSJoseph Mingrone /* 1068*ee67461eSJoseph Mingrone * [OF13] Section 7.3.7 1069*ee67461eSJoseph Mingrone * (to be done) 1070*ee67461eSJoseph Mingrone */ 1071*ee67461eSJoseph Mingrone { 1072*ee67461eSJoseph Mingrone "PACKET_OUT", NULL, 1073*ee67461eSJoseph Mingrone REQ_NONE, 0 1074*ee67461eSJoseph Mingrone }, 1075*ee67461eSJoseph Mingrone /* 1076*ee67461eSJoseph Mingrone * [OF13] Section 7.3.4.1 1077*ee67461eSJoseph Mingrone * (to be done) 1078*ee67461eSJoseph Mingrone */ 1079*ee67461eSJoseph Mingrone { 1080*ee67461eSJoseph Mingrone "FLOW_MOD", NULL, 1081*ee67461eSJoseph Mingrone REQ_NONE, 0 1082*ee67461eSJoseph Mingrone }, 1083*ee67461eSJoseph Mingrone /* 1084*ee67461eSJoseph Mingrone * [OF13] Section 7.3.4.2 1085*ee67461eSJoseph Mingrone * (to be done) 1086*ee67461eSJoseph Mingrone */ 1087*ee67461eSJoseph Mingrone { 1088*ee67461eSJoseph Mingrone "GROUP_MOD", NULL, 1089*ee67461eSJoseph Mingrone REQ_NONE, 0 1090*ee67461eSJoseph Mingrone }, 1091*ee67461eSJoseph Mingrone /* 1092*ee67461eSJoseph Mingrone * [OF13] Section 7.3.4.3 1093*ee67461eSJoseph Mingrone * A fixed-size message body. 1094*ee67461eSJoseph Mingrone */ 1095*ee67461eSJoseph Mingrone { 1096*ee67461eSJoseph Mingrone "PORT_MOD", of13_port_mod_print, 1097*ee67461eSJoseph Mingrone REQ_FIXLEN, OF_PORT_MOD_FIXLEN 1098*ee67461eSJoseph Mingrone }, 1099*ee67461eSJoseph Mingrone /* 1100*ee67461eSJoseph Mingrone * [OF13] Section 7.3.3 1101*ee67461eSJoseph Mingrone * A fixed-size message body. 1102*ee67461eSJoseph Mingrone */ 1103*ee67461eSJoseph Mingrone { 1104*ee67461eSJoseph Mingrone "TABLE_MOD", of13_table_mod_print, 1105*ee67461eSJoseph Mingrone REQ_FIXLEN, OF_TABLE_MOD_FIXLEN 1106*ee67461eSJoseph Mingrone }, 1107*ee67461eSJoseph Mingrone /* 1108*ee67461eSJoseph Mingrone * [OF13] Section 7.3.5 1109*ee67461eSJoseph Mingrone * (to be done) 1110*ee67461eSJoseph Mingrone */ 1111*ee67461eSJoseph Mingrone { 1112*ee67461eSJoseph Mingrone "MULTIPART_REQUEST", NULL, 1113*ee67461eSJoseph Mingrone REQ_NONE, 0 1114*ee67461eSJoseph Mingrone }, 1115*ee67461eSJoseph Mingrone /* 1116*ee67461eSJoseph Mingrone * [OF13] Section 7.3.5 1117*ee67461eSJoseph Mingrone * (to be done) 1118*ee67461eSJoseph Mingrone */ 1119*ee67461eSJoseph Mingrone { 1120*ee67461eSJoseph Mingrone "MULTIPART_REPLY", NULL, 1121*ee67461eSJoseph Mingrone REQ_NONE, 0 1122*ee67461eSJoseph Mingrone }, 1123*ee67461eSJoseph Mingrone /* 1124*ee67461eSJoseph Mingrone * [OF13] Section 7.3.8 1125*ee67461eSJoseph Mingrone * No message body. 1126*ee67461eSJoseph Mingrone */ 1127*ee67461eSJoseph Mingrone { 1128*ee67461eSJoseph Mingrone "BARRIER_REQUEST", NULL, 1129*ee67461eSJoseph Mingrone REQ_FIXLEN, 0 1130*ee67461eSJoseph Mingrone }, 1131*ee67461eSJoseph Mingrone /* 1132*ee67461eSJoseph Mingrone * [OF13] Section 7.3.8 1133*ee67461eSJoseph Mingrone * No message body. 1134*ee67461eSJoseph Mingrone */ 1135*ee67461eSJoseph Mingrone { 1136*ee67461eSJoseph Mingrone "BARRIER_REPLY", NULL, 1137*ee67461eSJoseph Mingrone REQ_FIXLEN, 0 1138*ee67461eSJoseph Mingrone }, 1139*ee67461eSJoseph Mingrone /* 1140*ee67461eSJoseph Mingrone * [OF13] Section 7.3.6 1141*ee67461eSJoseph Mingrone * A fixed-size message body. 1142*ee67461eSJoseph Mingrone */ 1143*ee67461eSJoseph Mingrone { 1144*ee67461eSJoseph Mingrone "QUEUE_GET_CONFIG_REQUEST", of13_queue_get_config_request_print, 1145*ee67461eSJoseph Mingrone REQ_FIXLEN, OF_QUEUE_GET_CONFIG_REQUEST_FIXLEN 1146*ee67461eSJoseph Mingrone }, 1147*ee67461eSJoseph Mingrone /* 1148*ee67461eSJoseph Mingrone * [OF13] Section 7.3.6 1149*ee67461eSJoseph Mingrone * (to be done) 1150*ee67461eSJoseph Mingrone */ 1151*ee67461eSJoseph Mingrone { 1152*ee67461eSJoseph Mingrone "QUEUE_GET_CONFIG_REPLY", NULL, 1153*ee67461eSJoseph Mingrone REQ_NONE, 0 1154*ee67461eSJoseph Mingrone }, 1155*ee67461eSJoseph Mingrone /* 1156*ee67461eSJoseph Mingrone * [OF13] Section 7.3.9 1157*ee67461eSJoseph Mingrone * A fixed-size message body. 1158*ee67461eSJoseph Mingrone */ 1159*ee67461eSJoseph Mingrone { 1160*ee67461eSJoseph Mingrone "ROLE_REQUEST", of13_role_msg_print, 1161*ee67461eSJoseph Mingrone REQ_FIXLEN, OF_ROLE_MSG_FIXLEN 1162*ee67461eSJoseph Mingrone }, 1163*ee67461eSJoseph Mingrone /* 1164*ee67461eSJoseph Mingrone * [OF13] Section 7.3.9 1165*ee67461eSJoseph Mingrone * A fixed-size message body. 1166*ee67461eSJoseph Mingrone */ 1167*ee67461eSJoseph Mingrone { 1168*ee67461eSJoseph Mingrone "ROLE_REPLY", of13_role_msg_print, 1169*ee67461eSJoseph Mingrone REQ_FIXLEN, OF_ROLE_MSG_FIXLEN 1170*ee67461eSJoseph Mingrone }, 1171*ee67461eSJoseph Mingrone /* 1172*ee67461eSJoseph Mingrone * [OF13] Section 7.3.10 1173*ee67461eSJoseph Mingrone * No message body. 1174*ee67461eSJoseph Mingrone */ 1175*ee67461eSJoseph Mingrone { 1176*ee67461eSJoseph Mingrone "GET_ASYNC_REQUEST", NULL, 1177*ee67461eSJoseph Mingrone REQ_FIXLEN, 0 1178*ee67461eSJoseph Mingrone }, 1179*ee67461eSJoseph Mingrone /* 1180*ee67461eSJoseph Mingrone * [OF13] Section 7.3.10 1181*ee67461eSJoseph Mingrone * A fixed-size message body. 1182*ee67461eSJoseph Mingrone */ 1183*ee67461eSJoseph Mingrone { 1184*ee67461eSJoseph Mingrone "GET_ASYNC_REPLY", of13_async_msg_print, 1185*ee67461eSJoseph Mingrone REQ_FIXLEN, OF_ASYNC_MSG_FIXLEN 1186*ee67461eSJoseph Mingrone }, 1187*ee67461eSJoseph Mingrone /* 1188*ee67461eSJoseph Mingrone * [OF13] Section 7.3.10 1189*ee67461eSJoseph Mingrone * A fixed-size message body. 1190*ee67461eSJoseph Mingrone */ 1191*ee67461eSJoseph Mingrone { 1192*ee67461eSJoseph Mingrone "SET_ASYNC", of13_async_msg_print, 1193*ee67461eSJoseph Mingrone REQ_FIXLEN, OF_ASYNC_MSG_FIXLEN 1194*ee67461eSJoseph Mingrone }, 1195*ee67461eSJoseph Mingrone /* 1196*ee67461eSJoseph Mingrone * [OF13] Section 7.3.4.4 1197*ee67461eSJoseph Mingrone * (to be done) 1198*ee67461eSJoseph Mingrone */ 1199*ee67461eSJoseph Mingrone { 1200*ee67461eSJoseph Mingrone "METER_MOD", NULL, 1201*ee67461eSJoseph Mingrone REQ_NONE, 0 1202*ee67461eSJoseph Mingrone }, 1203*ee67461eSJoseph Mingrone }; 1204*ee67461eSJoseph Mingrone 1205*ee67461eSJoseph Mingrone const struct of_msgtypeinfo * 1206*ee67461eSJoseph Mingrone of13_identify_msgtype(const uint8_t type) 1207*ee67461eSJoseph Mingrone { 1208*ee67461eSJoseph Mingrone return type <= OFPT_MAX ? &of13_msgtypeinfo[type] : NULL; 1209*ee67461eSJoseph Mingrone } 1210