openflow_input: add bsn_gentable extension and tests
See the documentation in openflow_input/bsn_gentable.
diff --git a/test_data/of13/bsn_gentable_entry_stats_reply.data b/test_data/of13/bsn_gentable_entry_stats_reply.data
new file mode 100644
index 0000000..cd4ab62
--- /dev/null
+++ b/test_data/of13/bsn_gentable_entry_stats_reply.data
@@ -0,0 +1,154 @@
+-- binary
+04 13 # version, type
+00 60 # 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 03 # subtype
+
+# entries[0]
+00 24 # length
+00 08 # key_length
+00 00 # key[0].type
+00 08 # key[0].length
+00 00 00 05 # key[0].value
+00 02 # stats[0].type
+00 0c # stats[0].length
+00 00 00 00 00 00 00 64 # stats[0].value
+00 03 # stats[0].type
+00 0c # stats[0].length
+00 00 00 00 00 00 00 65 # stats[0].value
+
+# entries[1]
+00 24 # length
+00 08 # key_length
+00 00 # key[0].type
+00 08 # key[0].length
+00 00 00 06 # key[0].value
+00 02 # stats[0].type
+00 0c # stats[0].length
+00 00 00 00 00 00 00 64 # stats[0].value
+00 03 # stats[0].type
+00 0c # stats[0].length
+00 00 00 00 00 00 00 65 # stats[0].value
+-- python
+ofp.message.bsn_gentable_entry_stats_reply(
+ xid=0x12345678,
+ entries=[
+ ofp.bsn_gentable_entry_stats_entry(
+ key=[
+ ofp.bsn_tlv.port(5),
+ ],
+ stats=[
+ ofp.bsn_tlv.rx_packets(100),
+ ofp.bsn_tlv.tx_packets(101),
+ ]),
+ ofp.bsn_gentable_entry_stats_entry(
+ key=[
+ ofp.bsn_tlv.port(6),
+ ],
+ stats=[
+ ofp.bsn_tlv.rx_packets(100),
+ ofp.bsn_tlv.tx_packets(101),
+ ]),
+ ])
+-- java
+builder.setXid(0x12345678)
+ .setEntries(
+ ImmutableList.<OFBsnGentableEntryStatsEntry>of(
+ factory.bsnGentableEntryStatsEntry(
+ ImmutableList.<OFBsnTlv>of(
+ factory.bsnTlvPort(OFPort.of(5))
+ ),
+ ImmutableList.<OFBsnTlv>of(
+ factory.bsnTlvRxPackets(U64.of(100)),
+ factory.bsnTlvTxPackets(U64.of(101))
+ )
+ ),
+ factory.bsnGentableEntryStatsEntry(
+ ImmutableList.<OFBsnTlv>of(
+ factory.bsnTlvPort(OFPort.of(6))
+ ),
+ ImmutableList.<OFBsnTlv>of(
+ factory.bsnTlvRxPackets(U64.of(100)),
+ factory.bsnTlvTxPackets(U64.of(101))
+ )
+ )
+ )
+ )
+-- c
+obj = of_bsn_gentable_entry_stats_reply_new(OF_VERSION_1_3);
+of_bsn_gentable_entry_stats_reply_xid_set(obj, 0x12345678);
+{
+ of_object_t *list = of_list_bsn_gentable_entry_stats_entry_new(OF_VERSION_1_3);
+ {
+ of_object_t *entry = of_bsn_gentable_entry_stats_entry_new(OF_VERSION_1_3);
+ {
+ 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_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_rx_packets_new(OF_VERSION_1_3);
+ of_bsn_tlv_rx_packets_value_set(tlv, 100);
+ of_list_append(tlvs, tlv);
+ of_object_delete(tlv);
+ }
+ {
+ of_object_t *tlv = of_bsn_tlv_tx_packets_new(OF_VERSION_1_3);
+ of_bsn_tlv_tx_packets_value_set(tlv, 101);
+ of_list_append(tlvs, tlv);
+ of_object_delete(tlv);
+ }
+ of_bsn_gentable_entry_stats_entry_stats_set(entry, tlvs);
+ of_object_delete(tlvs);
+ }
+ of_list_append(list, entry);
+ of_object_delete(entry);
+ }
+ {
+ of_object_t *entry = of_bsn_gentable_entry_stats_entry_new(OF_VERSION_1_3);
+ {
+ 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_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_rx_packets_new(OF_VERSION_1_3);
+ of_bsn_tlv_rx_packets_value_set(tlv, 100);
+ of_list_append(tlvs, tlv);
+ of_object_delete(tlv);
+ }
+ {
+ of_object_t *tlv = of_bsn_tlv_tx_packets_new(OF_VERSION_1_3);
+ of_bsn_tlv_tx_packets_value_set(tlv, 101);
+ of_list_append(tlvs, tlv);
+ of_object_delete(tlv);
+ }
+ of_bsn_gentable_entry_stats_entry_stats_set(entry, tlvs);
+ of_object_delete(tlvs);
+ }
+ of_list_append(list, entry);
+ of_object_delete(entry);
+ }
+ of_bsn_gentable_entry_stats_reply_entries_set(obj, list);
+ of_object_delete(list);
+}