1*05b00f60SXin Li /* 2*05b00f60SXin Li * Copyright (c) 2013 The TCPDUMP project 3*05b00f60SXin Li * All rights reserved. 4*05b00f60SXin Li * 5*05b00f60SXin Li * Redistribution and use in source and binary forms, with or without 6*05b00f60SXin Li * modification, are permitted provided that the following conditions 7*05b00f60SXin Li * are met: 8*05b00f60SXin Li * 1. Redistributions of source code must retain the above copyright 9*05b00f60SXin Li * notice, this list of conditions and the following disclaimer. 10*05b00f60SXin Li * 2. Redistributions in binary form must reproduce the above copyright 11*05b00f60SXin Li * notice, this list of conditions and the following disclaimer in the 12*05b00f60SXin Li * documentation and/or other materials provided with the distribution. 13*05b00f60SXin Li * 14*05b00f60SXin Li * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 15*05b00f60SXin Li * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 16*05b00f60SXin Li * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 17*05b00f60SXin Li * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 18*05b00f60SXin Li * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 19*05b00f60SXin Li * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 20*05b00f60SXin Li * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 21*05b00f60SXin Li * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 22*05b00f60SXin Li * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23*05b00f60SXin Li * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 24*05b00f60SXin Li * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25*05b00f60SXin Li * POSSIBILITY OF SUCH DAMAGE. 26*05b00f60SXin Li */ 27*05b00f60SXin Li 28*05b00f60SXin Li /* OpenFlow: protocol between controller and datapath. */ 29*05b00f60SXin Li 30*05b00f60SXin Li /* for netdissect_options */ 31*05b00f60SXin Li #include "netdissect.h" 32*05b00f60SXin Li 33*05b00f60SXin Li #define OF_FWD(n) { \ 34*05b00f60SXin Li cp += (n); \ 35*05b00f60SXin Li len -= (n); \ 36*05b00f60SXin Li } 37*05b00f60SXin Li 38*05b00f60SXin Li #define OF_CHK_FWD(n) { \ 39*05b00f60SXin Li ND_TCHECK_LEN(cp, (n)); \ 40*05b00f60SXin Li cp += (n); \ 41*05b00f60SXin Li len -= (n); \ 42*05b00f60SXin Li } 43*05b00f60SXin Li 44*05b00f60SXin Li #define OF_VER_1_0 0x01U 45*05b00f60SXin Li #define OF_VER_1_1 0x02U 46*05b00f60SXin Li #define OF_VER_1_2 0x03U 47*05b00f60SXin Li #define OF_VER_1_3 0x04U 48*05b00f60SXin Li #define OF_VER_1_4 0x05U 49*05b00f60SXin Li #define OF_VER_1_5 0x06U 50*05b00f60SXin Li 51*05b00f60SXin Li #define OF_HEADER_FIXLEN 8U 52*05b00f60SXin Li 53*05b00f60SXin Li #define ONF_EXP_ONF 0x4f4e4600 54*05b00f60SXin Li #define ONF_EXP_BUTE 0xff000001 55*05b00f60SXin Li #define ONF_EXP_NOVIFLOW 0xff000002 56*05b00f60SXin Li #define ONF_EXP_L3 0xff000003 57*05b00f60SXin Li #define ONF_EXP_L4L7 0xff000004 58*05b00f60SXin Li #define ONF_EXP_WMOB 0xff000005 59*05b00f60SXin Li #define ONF_EXP_FABS 0xff000006 60*05b00f60SXin Li #define ONF_EXP_OTRANS 0xff000007 61*05b00f60SXin Li #define ONF_EXP_NBLNCTU 0xff000008 62*05b00f60SXin Li #define ONF_EXP_MPCE 0xff000009 63*05b00f60SXin Li #define ONF_EXP_MPLSTPSPTN 0xff00000a 64*05b00f60SXin Li extern const struct tok onf_exp_str[]; 65*05b00f60SXin Li 66*05b00f60SXin Li extern const char * of_vendor_name(const uint32_t); 67*05b00f60SXin Li extern void of_bitmap_print(netdissect_options *ndo, 68*05b00f60SXin Li const struct tok *, const uint32_t, const uint32_t); 69*05b00f60SXin Li extern void of_data_print(netdissect_options *ndo, 70*05b00f60SXin Li const u_char *, const u_int); 71*05b00f60SXin Li 72*05b00f60SXin Li /* 73*05b00f60SXin Li * Routines to handle various versions of OpenFlow. 74*05b00f60SXin Li */ 75*05b00f60SXin Li 76*05b00f60SXin Li struct of_msgtypeinfo { 77*05b00f60SXin Li /* Should not be NULL. */ 78*05b00f60SXin Li const char *name; 79*05b00f60SXin Li /* May be NULL to mean "message body printing is not implemented". */ 80*05b00f60SXin Li void (*decoder)(netdissect_options *ndo, const u_char *, const u_int); 81*05b00f60SXin Li enum { 82*05b00f60SXin Li REQ_NONE, /* Message body length may be anything. */ 83*05b00f60SXin Li REQ_FIXLEN, /* Message body length must be == req_value. */ 84*05b00f60SXin Li REQ_MINLEN, /* Message body length must be >= req_value. */ 85*05b00f60SXin Li } req_what; 86*05b00f60SXin Li uint16_t req_value; 87*05b00f60SXin Li }; 88*05b00f60SXin Li 89*05b00f60SXin Li extern const struct of_msgtypeinfo *of10_identify_msgtype(const uint8_t); 90*05b00f60SXin Li extern const struct of_msgtypeinfo *of13_identify_msgtype(const uint8_t); 91