// Copyright 2016, 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.
//
// Also derived from the OpenFlow header files which have these copyrights:
// Copyright (c) 2008 The Board of Trustees of The Leland Stanford Junior University
// Copyright (c) 2011, 2012, 2015 Open Networking Foundation

#version 4

/* Oplink experimenter message header*/
struct of_oplink_exp_header : of_experimenter {
    uint8_t version;
    uint8_t type == 4;
    uint16_t length;
    uint32_t xid;
    uint32_t experimenter == 0xFF000088;
    uint32_t exp_type == ?;
};

/* this message is used for OFP_SET_POWER */
struct of_oplink_port_power_set : of_oplink_exp_header {
    uint8_t version;
    uint8_t type == 4;
    uint16_t length;
    uint32_t xid;
    uint32_t experimenter == 0xFF000088;
    uint32_t exp_type == 10;
    uint16_t port;
    uint16_t power_value;
};

enum ofp_oplink_stat_exp_subtype (wire_type=uint32_t, bitmask=True){
    OFP_PD_POWER    = 20,
    OFP_CH_POWER    = 21
};

struct of_oplink_stats_request : of_experimenter_stats_request {
    uint8_t version;
    uint8_t type == 18;
    uint16_t length;
    uint32_t xid;
    uint16_t stats_type == 0xffff;
    enum ofp_stats_request_flags flags;
    pad(4);
    uint32_t experimenter == 0xFF000088;
    uint32_t subtype == ?;
};

struct of_oplink_stats_reply : of_experimenter_stats_reply {
    uint8_t version;
    uint8_t type == 19;
    uint16_t length;
    uint32_t xid;
    uint16_t stats_type == 0xffff;
    enum ofp_stats_reply_flags flags;
    pad(4);
    uint32_t experimenter == 0xFF000088;
    uint32_t subtype == ?;
};

struct of_oplink_port_power_request : of_oplink_stats_request {
    uint8_t version;
    uint8_t type == 18;
    uint16_t length;
    uint32_t xid;
    uint16_t stats_type == 0xffff;
    enum ofp_stats_request_flags flags;
    pad(4);
    uint32_t experimenter == 0xFF000088;
    uint32_t subtype == 20;
};

struct of_oplink_port_power {
    uint16_t port;
    uint16_t power_value;
};

struct of_oplink_port_power_reply : of_oplink_stats_reply {
    uint8_t version;
    uint8_t type == 19;
    uint16_t length;
    uint32_t xid;
    uint16_t stats_type == 0xffff;
    enum ofp_stats_reply_flags flags;
    pad(4);
    uint32_t experimenter == 0xFF000088;
    uint32_t subtype == 20;
    list(of_oplink_port_power_t) entries;
};


struct of_oplink_channel_power {
    uint16_t in_port;
    uint16_t out_port;
    uint16_t channel;
    uint16_t power_value;
};

struct of_oplink_channel_power_request : of_oplink_stats_request {
    uint8_t version;
    uint8_t type == 18;
    uint16_t length;
    uint32_t xid;
    uint16_t stats_type == 0xffff;
    enum ofp_stats_request_flags flags;
    pad(4);
    uint32_t experimenter == 0xFF000088;
    uint32_t subtype == 21;
};

struct of_oplink_channel_power_reply : of_oplink_stats_reply {
    uint8_t version;
    uint8_t type == 19;
    uint16_t length;
    uint32_t xid;
    uint16_t stats_type == 0xffff;
    enum ofp_stats_reply_flags flags;
    pad(4);
    uint32_t experimenter == 0xFF000088;
    uint32_t subtype == 21;
    list(of_oplink_channel_power_t) entries;
};

/* Oplink roadm attenuation defined with ONOS type */
struct of_oxm_och_sigatt : of_oxm {
    uint32_t type_len == 0x00085C04;
    uint32_t value;
};

/* Oplink roadm attenuation defined with standard type */
struct of_oxm_och_sigatt_basic : of_oxm {
    uint32_t type_len == 0x80005C04;
    uint32_t value;
};

/* Oplink roadm attenuation action */
struct of_action_oplink_att : of_action_experimenter {
    uint16_t type == 65535;
    uint16_t len;
    uint32_t experimenter == 0xFF000088;
    uint16_t subtype == 1;
    uint16_t hlength == 16; // fix length of OXM field
    of_oxm_t field;
    pad(4);
};
