#To put this code in exp_port_desc_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  ???????
0C # 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.OTU2)
   				  .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();
         






