-- binary
04 04 # version, type
00 24 # length
12 34 56 78 # xid
00 5c 16 c7 # experimenter
00 00 00 2f # subtype
00 14 # table_id

00 00 # key[0].type
00 08 # key[0].length
00 00 00 05 # key[0].value

00 01 # key[1].type
00 0a # key[1].length
01 23 45 67 89 ab # key[1].value
-- python
ofp.message.bsn_gentable_entry_delete(
    xid=0x12345678,
    table_id=20,
    key=[
        ofp.bsn_tlv.port(5),
        ofp.bsn_tlv.mac([0x01, 0x23, 0x45, 0x67, 0x89, 0xab]),
    ])
-- java
builder.setXid(0x12345678)
    .setTableId(20)
    .setKey(
        ImmutableList.<OFBsnTlv>of(
            factory.bsnTlvPort(OFPort.of(5)),
            factory.bsnTlvMac(MacAddress.of("01:23:45:67:89:ab"))
        )
    )
-- c
obj = of_bsn_gentable_entry_delete_new(OF_VERSION_1_3);
of_bsn_gentable_entry_delete_xid_set(obj, 0x12345678);
of_bsn_gentable_entry_delete_table_id_set(obj, 20);
{
    of_object_t *list = 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(list, tlv);
        of_object_delete(tlv);
    }
    {
        of_mac_addr_t mac = { { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab } };
        of_object_t *tlv = of_bsn_tlv_mac_new(OF_VERSION_1_3);
        of_bsn_tlv_mac_value_set(tlv, mac);
        of_list_append(list, tlv);
        of_object_delete(tlv);
    }
    of_bsn_gentable_entry_delete_key_set(obj, list);
    of_object_delete(list);
}
