#version 4

struct of_calient_port_desc_stats_request : of_calient_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 == 0x0080F958;
    uint32_t subtype == 1;
};


struct of_calient_port_desc_prop {
    uint16_t type == ?; /* One of OFPPDPT_*. */
    uint16_t length;    /* Length in bytes of this property. */
};


enum ofp_calient_optical_port_admin_state(wire_type=uint8_t, bitmask=True){
    OFPAS_IN_SERVICE = 0,     // Enabled to provide service
    OFPAS_OUT_OF_SERVICE = 1, //Not enabled to provide service
    OFPAS_OOS_NP = 2,          //Not yet added to system by operator
    OFPAS_UNDERMANAGEMENT=3, // Configured to provide service, but suspended for maintanance
    OFPAS_READY=4            // awaiting activation, IS but not monitored
};

enum ofp_calient_optical_port_oper_state(wire_type=uint8_t, bitmask=True){
    OFPOS_IN_SERVICE = 0,     // Functioning normally & providing service
    OFPOS_OUT_OF_SERVICE = 1, //Not providing service
    OFPOS_INITIALIZING = 2, // Initializing
    OFPOS_READY = 3,        // awaiting activation
    OFPOS_DEGRADED = 4,        // component failure causing reduced level of support
    OFPOS_DIAGNOSTICS=5      // performing diagnostics
};

enum ofp_calient_optical_port_oper_capability(wire_type=uint8_t, bitmask=True){
    OFPCS_NoHardware = 0,  /* when port is not in connection */
    OFPCS_Ok = 1,          /* port is in Connection which is made successfully */
    OFPCS_Failed = 2,      /* when port is in Connection which is Failed */
    OFPCS_Initializing = 3,/* when port is in Connection which is being made */
    OFPCS_Diagnostics=4,     // performing diagnostics
    OFPCS_Synchronizing=5    // Synchronizing
};


struct of_calient_port_desc_prop_optical : of_calient_port_desc_prop{
    uint16_t type == 2; /* OFPPDPT_OPTICAL_CIRCUIT */
    uint16_t length;    /* Length in bytes of this property. */
    enum ofp_calient_optical_port_admin_state in_admin_status;
    enum ofp_calient_optical_port_oper_state  in_oper_status;
    enum ofp_calient_optical_port_oper_capability in_oper_capability;/* currently not present in backend */
    enum ofp_calient_optical_port_admin_state out_admin_status;
    enum ofp_calient_optical_port_oper_state  out_oper_status;
    enum ofp_calient_optical_port_oper_capability out_oper_capability;
    of_str6_t inport_power;       /* Input Port Power */
    of_str6_t outport_power;      /* Output Port Power */
    pad(2);
    uint64_t in_peer_node;        /* Peer node datapath id connected to the input optical port */
    uint64_t out_peer_node;       /* Peer node datapath id connected to the output optical port */
    uint16_t in_peer_port;        /* Peer port number connected to the input optical port */
    uint16_t out_peer_port;       /* Peer port number connected to the output optical port */
    pad(4);
    of_str32_t in_circuit_id;     /* Circuit Id associated with the input port */
    of_str32_t out_circuit_id;    /* Circuit id associated with the output port */
    of_str64_t in_alias;          /* Alias(name) for the input port */
    of_str64_t out_alias;         /* Alias(name) for the output port */
};

struct of_calient_port_desc_stats_entry {
    uint16_t length;
    pad(2);
    of_port_no_t port_no;
    of_mac_addr_t hw_addr;
    pad(2);
    of_port_name_t name; /* Not used.NULL */
    uint32_t config;     /* Not used. Always 0. */
    uint32_t state;      /* Not used. Always 0. */
    list(of_calient_port_desc_prop_t) properties;
};

struct of_calient_port_desc_stats_reply : of_calient_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 == 0x0080F958;
    uint32_t subtype == 1;
    list(of_calient_port_desc_stats_entry_t)port_desc;
};


struct of_calient_port_status : of_experimenter{
  uint8_t version;
  uint8_t type == 4;
  uint16_t length;
  uint32_t xid;
  uint32_t experimenter == 0x0080F958;
  uint32_t subtype == 1;
  enum ofp_port_reason reason;
  pad(7);
  of_calient_port_desc_stats_entry_t desc;
   };

