// Copyright 2013, Big Switch Networks, Inc.
//
// LoxiGen is licensed under the Eclipse Public License, version 1.0 (EPL), with
// the following special exception:
//
// LOXI Exception
//
// As a special exception to the terms of the EPL, you may distribute libraries
// generated by LoxiGen (LoxiGen Libraries) under the terms of your choice, provided
// that copyright and licensing notices generated by LoxiGen are not altered or removd
// from the LoxiGen Libraries and the notice provided below is (i) included in
// the LoxiGen Libraries, if distributed in source code form and (ii) included in any
// documentation for the LoxiGen Libraries, if distributed in binary form.
//
// Notice: "Copyright 2013, Big Switch Networks, Inc. This library was generated by t"
//
// You may not use this file except in compliance with the EPL or LOXI Exception. Youn
// a copy of the EPL at:
//
// http://www.eclipse.org/legal/epl-v10.html
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// EPL for the specific language governing permissions and limitations
// under the EPL.

#version 3
#version 4
#version 5
#version 6

// Nicira extension for tun_ipv4_src (31)
struct of_oxm_tunnel_ipv4_src : of_oxm {
    uint32_t type_len == 0x00013e04;
    of_ipv4_t value;
};

struct of_oxm_tunnel_ipv4_src_masked : of_oxm {
    uint32_t type_len == 0x00013f08;
    of_ipv4_t value;
    of_ipv4_t value_mask;
};

// Nicira extension for tun_ipv4_dst (32)
struct of_oxm_tunnel_ipv4_dst : of_oxm {
    uint32_t type_len == 0x00014004;
    of_ipv4_t value;
};

struct of_oxm_tunnel_ipv4_dst_masked : of_oxm {
    uint32_t type_len == 0x00014108;
    of_ipv4_t value;
    of_ipv4_t value_mask;
};

// Nicira extension for tun_ipv6_dst
struct of_oxm_tunnel_ipv6_dst : of_oxm {
    uint32_t type_len == 0x0001dc10;
    of_ipv6_t value;
};

// Nicira extension for tun_flags (104)
struct of_oxm_tun_flags : of_oxm {
    uint32_t type_len == 0x0001d002;
    uint16_t value;
};

struct of_oxm_tun_flags_masked : of_oxm {
    uint32_t type_len == 0x0001d104;
    uint16_t value;
    uint16_t value_mask;
};

// Nicira extension for tun_gbp_id (38)
struct of_oxm_tun_gbp_id : of_oxm {
    uint32_t type_len == 0x00014c02;
    uint16_t value;
};

struct of_oxm_tun_gbp_id_masked : of_oxm {
    uint32_t type_len == 0x00014d04;
    uint16_t value;
    uint16_t value_mask;
};

// Nicira extension for tun_gbp_flags (39)
struct of_oxm_tun_gbp_flags : of_oxm {
    uint32_t type_len == 0x00014e01;
    uint8_t value;
};

struct of_oxm_tun_gbp_flags_masked : of_oxm {
    uint32_t type_len == 0x00014f02;
    uint8_t value;
    uint8_t value_mask;
};

// Nicira extension for tun_gpe_np (111)
struct of_oxm_tun_gpe_np : of_oxm {
    uint32_t type_len == 0x0001de01;
    uint8_t value;
};

struct of_oxm_tun_gpe_np_masked : of_oxm {
    uint32_t type_len == 0x0001df02;
    uint8_t value;
    uint8_t value_mask;
};

// Nicira extension for tun_gpe_flags (112)
struct of_oxm_tun_gpe_flags : of_oxm {
    uint32_t type_len == 0x0001e001;
    uint8_t value;
};

struct of_oxm_tun_gpe_flags_masked : of_oxm {
    uint32_t type_len == 0x0001e102;
    uint8_t value;
    uint8_t value_mask;
};

