// 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 removed
// 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 the LoxiGen Compiler."
//
// You may not use this file except in compliance with the EPL or
// LOXI Exception. You may obtain 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

/*
 * Bitmap of input ports
 *
 * The representation is not straightforward, but it works with existing OXM
 * semantics.
 *
 * The value should always be zero. The mask should be unset in every bit position
 * where the corresponding input port is allowed, and set in all other bits.
 * As a special case, the highest bit in the mask is reserved for higher port
 * numbers than can be represented in the bitmap.
 *
 * The value1 and value_mask1 fields contain the most significant bits. value2
 * and value_mask2 contain the least significant bits.
 *
 * Pseudocode for populating value or mask:
 *   bitmap |= in_port < 128 ? (1 << in_port) : (1 << 127)
 */

struct of_oxm_bsn_in_ports_128 : of_oxm {
    uint32_t type_len == 0x00030010;
    of_bitmap_128_t value;
};

struct of_oxm_bsn_in_ports_128_masked : of_oxm {
    uint32_t type_len == 0x00030120;
    of_bitmap_128_t value;
    of_bitmap_128_t value_mask;
};

struct of_oxm_bsn_in_ports_512 : of_oxm {
    uint32_t type_len == 0x00032640;
    of_bitmap_512_t value;
};

struct of_oxm_bsn_in_ports_512_masked : of_oxm {
    uint32_t type_len == 0x00032780;
    of_bitmap_512_t value;
    of_bitmap_512_t value_mask;
};
