-- binary
04 13 # version, type
00 64 # length
12 34 56 78 # xid
ff ff # stats_type
00 00 # flags
00 00 00 00 # pad
00 5c 16 c7 # experimenter
00 00 00 2 # subtype

# entries[0]
00 26 # length
00 08 # key_length
fe dc ba 98 76 54 32 10 ff ee cc bb aa 99 88 00 # checksum
00 00 # key[0].type
00 08 # key[0].length
00 00 00 05 # key[0].value
00 01 # value[0].type
00 0a # value[0].length
ff ee dd cc bb 00 # value[0].value

# entries[1]
00 26 # length
00 08 # key_length
fe dc ba 98 76 54 32 10 ff ee cc bb aa 99 88 01 # checksum
00 00 # key[0].type
00 08 # key[0].length
00 00 00 06 # key[0].value
00 01 # value[0].type
00 0a # value[0].length
ff ee dd cc bb 01 # value[0].value
-- python
ofp.message.bsn_gentable_entry_desc_stats_reply(
    xid=0x12345678,
    entries=[
        ofp.bsn_gentable_entry_desc_stats_entry(
            checksum=0xFEDCBA9876543210FFEECCBBAA998800,
            key=[
                ofp.bsn_tlv.port(5),
            ],
            value=[
                ofp.bsn_tlv.mac([0xff, 0xee, 0xdd, 0xcc, 0xbb, 0x00]),
            ]),
        ofp.bsn_gentable_entry_desc_stats_entry(
            checksum=0xFEDCBA9876543210FFEECCBBAA998801,
            key=[
                ofp.bsn_tlv.port(6),
            ],
            value=[
                ofp.bsn_tlv.mac([0xff, 0xee, 0xdd, 0xcc, 0xbb, 0x01]),
            ]),
    ])
-- java
builder.setXid(0x12345678)
    .setEntries(
        ImmutableList.<OFBsnGentableEntryDescStatsEntry>of(
            factory.buildBsnGentableEntryDescStatsEntry()
                .setChecksum(OFChecksum128.of(0xFEDCBA9876543210L, 0xFFEECCBBAA998800L))
                .setKey(ImmutableList.<OFBsnTlv>of(
                    factory.bsnTlvPort(OFPort.of(5))
                ))
                .setValue(ImmutableList.<OFBsnTlv>of(
                    factory.bsnTlvMac(MacAddress.of("ff:ee:dd:cc:bb:00"))
                ))
                .build(),
            factory.buildBsnGentableEntryDescStatsEntry()
                .setChecksum(OFChecksum128.of(0xFEDCBA9876543210L, 0xFFEECCBBAA998801L))
                .setKey(ImmutableList.<OFBsnTlv>of(
                    factory.bsnTlvPort(OFPort.of(6))
                ))
                .setValue(ImmutableList.<OFBsnTlv>of(
                    factory.bsnTlvMac(MacAddress.of("ff:ee:dd:cc:bb:01"))
                ))
                .build()
        )
    )
-- c
obj = of_bsn_gentable_entry_desc_stats_reply_new(OF_VERSION_1_3);
of_bsn_gentable_entry_desc_stats_reply_xid_set(obj, 0x12345678);
{
    of_object_t *list = of_list_bsn_gentable_entry_desc_stats_entry_new(OF_VERSION_1_3);
    {
        of_object_t *entry = of_bsn_gentable_entry_desc_stats_entry_new(OF_VERSION_1_3);
        {
            of_checksum_128_t checksum = { 0xFEDCBA9876543210L, 0xFFEECCBBAA998800L };
            of_bsn_gentable_entry_desc_stats_entry_checksum_set(entry, checksum);
        }
        {
            of_object_t *tlvs = of_list_bsn_tlv_new(OF_VERSION_1_3);
            {
                of_object_t *tlv = of_bsn_tlv_port_new(OF_VERSION_1_3);
                of_bsn_tlv_port_value_set(tlv, 5);
                of_list_append(tlvs, tlv);
                of_object_delete(tlv);
            }
            of_bsn_gentable_entry_desc_stats_entry_key_set(entry, tlvs);
            of_object_delete(tlvs);
        }
        {
            of_object_t *tlvs = of_list_bsn_tlv_new(OF_VERSION_1_3);
            {
                of_object_t *tlv = of_bsn_tlv_mac_new(OF_VERSION_1_3);
                of_mac_addr_t mac = { { 0xff, 0xee, 0xdd, 0xcc, 0xbb, 0x00 } };
                of_bsn_tlv_mac_value_set(tlv, mac);
                of_list_append(tlvs, tlv);
                of_object_delete(tlv);
            }
            of_bsn_gentable_entry_desc_stats_entry_value_set(entry, tlvs);
            of_object_delete(tlvs);
        }
        of_list_append(list, entry);
        of_object_delete(entry);
    }
    {
        of_object_t *entry = of_bsn_gentable_entry_desc_stats_entry_new(OF_VERSION_1_3);
        {
            of_checksum_128_t checksum = { 0xFEDCBA9876543210L, 0xFFEECCBBAA998801L };
            of_bsn_gentable_entry_desc_stats_entry_checksum_set(entry, checksum);
        }
        {
            of_object_t *tlvs = of_list_bsn_tlv_new(OF_VERSION_1_3);
            {
                of_object_t *tlv = of_bsn_tlv_port_new(OF_VERSION_1_3);
                of_bsn_tlv_port_value_set(tlv, 6);
                of_list_append(tlvs, tlv);
                of_object_delete(tlv);
            }
            of_bsn_gentable_entry_desc_stats_entry_key_set(entry, tlvs);
            of_object_delete(tlvs);
        }
        {
            of_object_t *tlvs = of_list_bsn_tlv_new(OF_VERSION_1_3);
            {
                of_object_t *tlv = of_bsn_tlv_mac_new(OF_VERSION_1_3);
                of_mac_addr_t mac = { { 0xff, 0xee, 0xdd, 0xcc, 0xbb, 0x01 } };
                of_bsn_tlv_mac_value_set(tlv, mac);
                of_list_append(tlvs, tlv);
                of_object_delete(tlv);
            }
            of_bsn_gentable_entry_desc_stats_entry_value_set(entry, tlvs);
            of_object_delete(tlvs);
        }
        of_list_append(list, entry);
        of_object_delete(entry);
    }
    of_bsn_gentable_entry_desc_stats_reply_entries_set(obj, list);
    of_object_delete(list);
}
