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