# To be included in exp_port_dest_reply.data
-- binary
04 13 # version, type
00 58 # length
12 34 56 78 # xid
ff ff # stats_type
00 00 # flags
00 00 00 00 # pad
FF 00 00 07 # experimenter
00 00 00 01 # subtype
# entries[0]
00 00 00 01 # port
00 40 # length - ????????
00 00 # pad
00 00 00 00 00 00 # entries[0].hw_addr
00 00 # pad
69 6e 74 65 72 66 61 63 65 31 32 33 34 35 36 37 # entries[0].name
00 00 00 60 # entries[0].config
00 00 00 04 # entries[0].state
# properties[0]
00 02 # entries[0].properties[0].type 
00 18 # entries[0].properties[0].length  ???????
05 # port_signal_type OMSn = 2,OCH  = 5,OTU2 = 12(oduclt-10),OTU4 = 14(oduclt-100)
00 #reserved
00 00 #pad
# features[0]
00 02
00 10 # length - ????????
00 00 00 00
# layeres[0]
03 # layer class (PORT=1,OCH=2,ODU=3,DUCLT=4)
01 # signal_type;    /*OFP(OTP/OCH/ODU/ODUCL)T_*/
06 #(OTS_OMS=1,OMS_OCH=2,OPS_OCHr=3,OPSM_OTUk=4,OCH_OTUk=5,ODUk_ODUij=6,ODUk_ODUj21=7,
   #ODUkh_ODUj21=8,ODU0_CBRx=9,ODUk_CBRx=10,ODUk_CBRxg=11,ODUk_RSn=12,ODUk_ATM=13,ODUk_ETH=14,ODUkh_ETH=15,ODUk_ETHPPOS=16
00 00 00 00 00

-- python
ofp.message.exp_port_desc_stats_reply(
    xid=0x12345678,
    flags=0,
    entries=[
        ofp.exp_port_desc(
            port_no=1,
            hw_addr=[0,0,0,0,0,0],
            name="interface1234567",
            config=0x60,
            state=0x03,
            properties=[
                ofp.exp_port_desc_prop.ethernet(
                    curr=0x70,
                    max_speed=0x80)])])


-- java
builder
        .setXid(0x12345678)
        .setFlags(ImmutableSet.<OFStatsReplyFlags>of())
        .setEntries(ImmutableList.of(
                factory.buildExpPort()
                   .setPortNo(OFPort.of(1))
                   .setHwAddr(MacAddress.of("00:00:00:00:00:00"))
                   .setName("interface1234567")
                   .setConfig(Sets.immutableEnumSet(OFPortConfig.NO_FWD, OFPortConfig.NO_PACKET_IN))
                   .setState(Sets.immutableEnumSet(OFPortState.LIVE))
                   .setProperties(ImmutableList.of(
				  factory.buildExpPortDescPropOpticalTransport()
                                  .setPortSignalType(OFPortOpticalTransportSignalType.OCH)
   				  .setFeatures(ImmutableList.of(   
                                               factory.buildExpPortOpticalTransportLayerStack()
                                              .setValue(ImmutableList.of(
						         factory.buildExpPortOpticalTransportLayerEntry()
                                                        .setLayerClass(OFPortOpticalTransportLayerClass.ODU)
                                                        .setSignalType((short)1)
                                                        .setAdaptation(OFAdaptationsType.ODUK_ODUIJ)
                                                        .build()))
                                              .build()))
		                   .build()))
                     .build()))
          .build();
         






