/* This file input supports the Optical Transport Protocol Extentions - version 1.0 */

#version 4
/*Supported signal types for layer class OFPOTPL_ODU */
enum ofp_odu_signal_type (wire_type=uint8_t) {
    OFPODUT_ODU1           = 1,
    OFPODUT_ODU2           = 2,
    OFPODUT_ODU3           = 3,
    OFPODUT_ODU4           = 4,
    OFPODUT_ODU0           = 10,
    OFPODUT_ODU2E          = 11,
    OFPODUT_ODUfCBR        = 20,
    OFPODUT_ODUfGFPfHAO    = 21,
    OFPODUT_ODUfGFPf       = 22,
};


//enum ofp_experimenter_multipart_type_exp (wire_type=uint32_t){
  //OFPEMPTE = 1,
//};

//enum ofp_port_desc_prop_type_exp (wire_type=uint32_t){
 //OFPPDPT_OPTICAL_TRAMSPORT = 2,
//};

/* Supported signal types for layer class OFPPOTL_PORT */
enum ofp_port_optical_transport_signal_type (wire_type=uint8_t) {
     OFPPOTST_OTSn = 1,
     OFPPOTST_OMSn = 2,
     OFPPOTST_OPSn = 3,
     OFPPOTST_OPSM = 4,
     OFPPOTST_OCH  = 5,
     OFPPOTST_OTU1 = 11,
     OFPPOTST_OTU2 = 12,
     OFPPOTST_OTU3 = 13,
     OFPPOTST_OTU4 = 14,
};


/* Features of optical transport ports available in switch. */
enum ofp_port_optical_transport_feature_type (wire_type=uint16_t) {
    OFPPOTFT_OPT_INTERFACE_CLASS = 1,  /* Application code/ID encoding */
    OFPPOTFT_LAYER_STACK         = 2,  /* Supported signal types and adaptations */
};


/*Supported signal types for layer class OFPOTPL_ODUCLT */
enum ofp_oduclt_signal_type(wire_type=uint8_t) {
   OFPODUCLT_STM16 	= 1,
   OFPODUCLT_STM64  	= 2,
   OFPODUCLT_STM256 	= 3,
   OFPODUCLT_STM1       = 4,
   OFPODUCLT_STM4       = 5,
   OFPODUCLT_GBE1       = 6,
   OFPODUCLT_GBE10      = 7,
   OFPODUCLT_GBE40        = 8,
   OFPODUCLT_GBE100	  = 9,
   OFPODUCLT_FC100        = 10, 
   OFPODUCLT_FC200        = 11,
   OFPODUCLT_FC400        = 12,
   OFPODUCLT_FC800        = 13,
   OFPODUCLT_FC1200       = 14,
   OFPODUCLT_GPON         = 15,
   OFPODUCLT_XGPON        = 16,
   OFPODUCLT_IB_SDR       = 17,
   OFPODUCLT_IB_DDR       = 18,
   OFPODUCLT_IB_QDR       = 19,
   OFPODUCLT_SBCON_ESCON  = 20,
   OFPODUCLT_DVBASI       = 21,
   OFPODUCLT_SDI          = 22,
   OFPODUCLT_SDI1G5       = 23,
   OFPODUCLT_SDI3G        = 24,
   OFPODUCLT_ATM          = 25,
   OFPODUCLT_ETH          = 26,
   OFPODUCLT_MPLS         = 27,
   OFPODUCLT_IP           = 28,
};

/* Supported adaptations for optical transport port layer stack*/
enum ofp_adaptations_type (wire_type=uint8_t){
   OFPADAPT_OTS_OMS    = 1,
   OFPADAPT_OMS_OCH    = 2,
   OFPADAPT_OPS_OCHr   = 3,
   OFPADAPT_OPSM_OTUk  = 4,
   OFPADAPT_OCH_OTUk   = 5,
   OFPADAPT_ODUk_ODUij    = 6,
   OFPADAPT_ODUk_ODUj21   = 7,
   OFPADAPT_ODUkh_ODUj21  = 8,
   OFPADAPT_ODU0_CBRx     = 9,
   OFPADAPT_ODUk_CBRx     = 10,
   OFPADAPT_ODUk_CBRxg    = 11,
   OFPADAPT_ODUk_RSn      = 12,
   OFPADAPT_ODUk_ATM      = 13,
   OFPADAPT_ODUk_ETH      = 14,
   OFPADAPT_ODUkh_ETH     = 15,
   OFPADAPT_ODUk_ETHPPOS  = 16,
};

struct of_oxm_exp_odu_sigtype : of_oxm {
    uint32_t type_len == 0xFFFF0401; 
    uint32_t experimenter == 0xFF000007;
    uint8_t  value;
};

struct of_oxm_exp_odu_sig_id : of_oxm {
     uint32_t type_len == 0xFFFF0610; 
     uint32_t experimenter == 0xFF000007;
     of_odu_sig_id_t value;// size of this struct is 16 bytes 2+2+10+2(pad)   
}; 
 
//This struct defenition is unnecessury for the openflow java ("make java" command )
//It is reqiured for wireshark dissector ("make wireshark" command) 
struct of_odu_sig_id_t { 
    uint16_t tpn;           //Tributary Port Number 
    uint16_t length;         // Number of Tributary Slots included in tsmap,
			    // based on the Server ODU type and TS Granularity
    of_octets_t tsmap;       //tsmap;
};
 
struct of_oxm_exp_och_sigtype : of_oxm {
    uint32_t type_len == 0xFFFF0801; 
    uint32_t experimenter == 0xFF000007;
    uint8_t  value;
};
 
struct of_oxm_exp_och_sig_id : of_oxm {
     uint32_t type_len == 0xFFFF0A06; 
     uint32_t experimenter == 0xFF000007;
     of_och_sig_id_t value;   
}; 


// open flow extention - support port description Extentions for OTN Ports 
struct of_exp_port_desc_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 == 0xFF000007;
    uint32_t subtype == 1;//enum ofp_experimenter_multipart_type exp_type == 1;
};

struct of_exp_port_desc_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 == 0xFF000007;
    uint32_t subtype == 1;//enum ofp_experimenter_multipart_type subtype == 1;
    list(of_exp_port_t) entries;
};

struct of_exp_port {
  of_port_no_t port_no;
  uint16_t length;
  pad(2);
  of_mac_addr_t hw_addr;
  pad(2);
  of_port_name_t name;
  enum ofp_port_config config;
  enum ofp_port_state state;
  list(of_exp_port_desc_prop_optical_transport_t) properties;
};

struct of_exp_port_des_prop_header {
  uint16_t type == 2; //enum ofp_port_desc_prop_type_exp type == 2;
  uint16_t length;
};

struct of_exp_port_desc_prop_optical_transport // : of_exp_port_des_prop_header 
{
  uint16_t type == 2;
  uint16_t length; // length in bytes of this property
  enum ofp_port_optical_transport_signal_type  port_signal_type;
                       //base port layer signal type (enum ofp_port_optical_transport_signal_type) 
  uint8_t reserved;
  pad(2);
  list(of_exp_port_optical_transport_layer_stack_t) features; // list of of_port_optical_transport_feature_header 
};

struct of_exp_port_optical_transport_feature_header {
  uint16_t feature_type == ?; // from enum ofp_port_optical_transport_feature_type
  uint16_t length;
};

/* OTN Layer Stack Feature Encoding */ //of_port_optical_transport_layer_stack (in circuit ) 
struct of_exp_port_optical_transport_layer_stack// : of_exp_port_optical_transport_feature_header
{
  uint16_t feature_type == 2; /* Set to OFPOTPF_LAYER_STACK */
  uint16_t length;            /* length of feature excluding padding*/
  pad(4);                     /* Zero bytes-see above for sizing */
  list(of_exp_port_optical_transport_layer_entry_t) value; /* 0 or more fields */
};

/*OTN Layer Stack Entry Encoding */ // can be found in circut of_port_optical_transport_layer_entry
struct of_exp_port_optical_transport_layer_entry {
  enum ofp_port_optical_transport_layer_class layer_class;    /* OFPPOTL_* */
  uint8_t signal_type;    /*OFP(OTP/OCH/ODU/ODUCL)T_*/
  enum ofp_adaptations_type adaptation;/* OFPADAPT_*/
  pad(5);         /* Align to 64-bit boundary */
};





