// 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 any

enum ofp_bsn_vport_status {
    OF_BSN_VPORT_STATUS_OK = 0,
    OF_BSN_VPORT_STATUS_FAILED = 1,
};

// When the ingress or egress VID has this value, no outer tag should be used.
// In this case, the corresponding TPID is ignored.

enum ofp_bsn_vport_q_in_q_untagged(wire_type=uint16_t, complete=False) {
    OF_BSN_VPORT_Q_IN_Q_UNTAGGED = 0xffff,
};

enum ofp_bsn_vport_l2gre_flags(wire_type=uint32_t, bitmask=True) {
    OF_BSN_VPORT_L2GRE_LOCAL_MAC_IS_VALID = 0x1,

    /* DSCP flags are mutually exclusive */
    OF_BSN_VPORT_L2GRE_DSCP_ASSIGN = 0x2,
    OF_BSN_VPORT_L2GRE_DSCP_COPY = 0x4,

    OF_BSN_VPORT_L2GRE_LOOPBACK_IS_VALID = 0x8,
};

// BSN Virtual port object header
// FIXME For now, inheritance is not exercised.  See below.
struct of_bsn_vport {
    uint16_t type == ?;  /* Discriminate virtual port type */
    uint16_t length; /* Length in bytes of this structure with this header */
    /* Remainder of data is specific to the port type */
};


// Q-in-Q virtual port specification

struct of_bsn_vport_q_in_q : of_bsn_vport {
    uint16_t type == 0;
    uint16_t length;
    uint32_t port_no;     /* OF port number of parent; usually phys port */
    uint16_t ingress_tpid;
    uint16_t ingress_vlan_id;
    uint16_t egress_tpid;
    uint16_t egress_vlan_id;
    of_port_name_t if_name;  /* Name to use in create operation */
};


// L2GRE tunnel virtual port specification

struct of_bsn_vport_l2gre : of_bsn_vport {
    uint16_t type == 1;
    uint16_t length;
    enum ofp_bsn_vport_l2gre_flags flags;
    of_port_no_t port_no;           /* OF port number of parent */
    of_port_no_t loopback_port_no;  /* OF port number of loopback */
    of_mac_addr_t local_mac;        /* Local MAC */
    of_mac_addr_t nh_mac;           /* Next Hop MAC */
    of_ipv4_t src_ip;               /* Source IP */
    of_ipv4_t dst_ip;               /* Destination IP */
    uint8_t dscp;
    uint8_t ttl;
    pad(2);
    uint32_t vpn;                   /* VPN ID (for GRE Key) */
    of_port_name_t if_name;         /* Virtual Interface Name */
};


// Request from controller to switch to create vport
struct of_bsn_virtual_port_create_request : of_bsn_header {
    uint8_t version;
    uint8_t type == 4;
    uint16_t length;
    uint32_t xid;
    uint32_t experimenter == 0x5c16c7;
    uint32_t subtype == 15;
    of_bsn_vport_t vport;   // Description of vport to create
    // Additional data follows depending on header type
};

// Reply from switch to controller indicating port number created
// vport_no must be 16 bits to be compatible with 1.0
struct of_bsn_virtual_port_create_reply : of_bsn_header {
    uint8_t version;
    uint8_t type == 4;
    uint16_t length;
    uint32_t xid;           // Must match create_request
    uint32_t experimenter == 0x5c16c7;
    uint32_t subtype == 16;
    uint32_t status;        // 0 means success
    uint32_t vport_no;      // The OF port number created.  16-bits for OF 1.0
};

// Request from controller to switch to remove a vport
struct of_bsn_virtual_port_remove_request : of_bsn_header {
    uint8_t version;
    uint8_t type == 4;
    uint16_t length;
    uint32_t xid;
    uint32_t experimenter == 0x5c16c7;
    uint32_t subtype == 17;
    uint32_t vport_no;      // The OF port number to be removed
};

// Request from controller to switch to remove a vport
struct of_bsn_virtual_port_remove_reply : of_bsn_header {
    uint8_t version;
    uint8_t type == 4;
    uint16_t length;
    uint32_t xid;           // Must match request xid
    uint32_t experimenter == 0x5c16c7;
    uint32_t subtype == 26;
    uint32_t status;        // 0 means success
};
