Merge branch 'logging'
diff --git a/openflow_input/standard-1.1 b/openflow_input/standard-1.1
index a6f511f..9b72e8c 100644
--- a/openflow_input/standard-1.1
+++ b/openflow_input/standard-1.1
@@ -72,9 +72,6 @@
OFPP_ALL = 0xfffffffc,
OFPP_CONTROLLER = 0xfffffffd,
OFPP_LOCAL = 0xfffffffe,
-};
-
-enum ofp_port_no(wire_type=uint32_t, complete=False) {
OFPP_ANY = 0xffffffff,
};
diff --git a/openflow_input/standard-1.2 b/openflow_input/standard-1.2
index cf146e0..e9d915a 100644
--- a/openflow_input/standard-1.2
+++ b/openflow_input/standard-1.2
@@ -68,9 +68,6 @@
OFPP_ALL = 0xfffffffc,
OFPP_CONTROLLER = 0xfffffffd,
OFPP_LOCAL = 0xfffffffe,
-};
-
-enum ofp_port_no(wire_type=uint32_t, complete=False) {
OFPP_ANY = 0xffffffff,
};
diff --git a/openflow_input/standard-1.3 b/openflow_input/standard-1.3
index 0d4a8c5..db7ff0d 100644
--- a/openflow_input/standard-1.3
+++ b/openflow_input/standard-1.3
@@ -58,10 +58,6 @@
OFPQ_MIN_RATE_UNCFG = 0xffff,
};
-enum ofp_port_no(wire_type=uint32_t, complete=False) {
- OFPP_ANY = 0xffffffff,
-};
-
enum ofp_port(wire_type=uint32_t) {
OFPP_MAX = 0xffffff00,
OFPP_IN_PORT = 0xfffffff8,
@@ -71,6 +67,7 @@
OFPP_ALL = 0xfffffffc,
OFPP_CONTROLLER = 0xfffffffd,
OFPP_LOCAL = 0xfffffffe,
+ OFPP_ANY = 0xffffffff,
};
enum ofp_type(wire_type=uint8_t) {
@@ -280,6 +277,13 @@
OFPR_NO_MATCH = 0,
OFPR_ACTION = 1,
OFPR_INVALID_TTL = 2,
+
+ // non-standard BSN extensions. OF does not have a standard-conformant
+ // way to extend the set of packet_in reasons
+ OFPR_BSN_NEW_HOST = 128,
+ OFPR_BSN_STATION_MOVE = 129,
+ OFPR_BSN_BAD_VLAN = 130,
+ OFPR_BSN_DESTINATION_LOOKUP_FAILURE = 131,
};
enum ofp_flow_removed_reason(wire_type=uint8_t) {
diff --git a/wireshark_gen/templates/_ofreader.lua b/wireshark_gen/templates/_ofreader.lua
index b25f7c8..a4c57be 100644
--- a/wireshark_gen/templates/_ofreader.lua
+++ b/wireshark_gen/templates/_ofreader.lua
@@ -64,5 +64,9 @@
return r
end
+ self.skip_align = function()
+ offset = math.floor((offset + 7)/8)*8
+ end
+
return self
end
diff --git a/wireshark_gen/templates/_oftype_readers.lua b/wireshark_gen/templates/_oftype_readers.lua
index fb6eb6f..1db9f1f 100644
--- a/wireshark_gen/templates/_oftype_readers.lua
+++ b/wireshark_gen/templates/_oftype_readers.lua
@@ -123,3 +123,29 @@
function read_list_of_packet_queue_t(reader, version, subtree, field_name)
-- TODO
end
+
+function read_list_of_oxm_t(reader, version, subtree, field_name)
+ if reader.is_empty() then
+ return
+ end
+ local list_len = reader.peek(-2,2):uint()
+ local reader2 = reader.slice(list_len - 4)
+ local list = subtree:add(fields[field_name], reader2.peek_all(0))
+ while not reader2.is_empty() do
+ local match_len = 4 + reader2.peek(3,1):uint()
+ local child_reader = reader2.slice(match_len)
+ local child_subtree = list:add(fields[field_name], child_reader.peek_all(0))
+ local info = dissect_of_oxm_v3(child_reader, child_subtree)
+ child_subtree:set_text(info)
+ end
+ reader.skip_align()
+end
+
+function read_list_of_instruction_t(reader, version, subtree, field_name)
+ if reader.is_empty() then
+ return
+ end
+ if not reader.is_empty() then
+ subtree:add(fields[field_name], reader.read_all())
+ end
+end
diff --git a/wireshark_gen/templates/openflow.lua b/wireshark_gen/templates/openflow.lua
index 1b1bc8a..bf1cdf5 100644
--- a/wireshark_gen/templates/openflow.lua
+++ b/wireshark_gen/templates/openflow.lua
@@ -53,10 +53,41 @@
:: #endfor
+
+:: values = {
+:: 'of13.flow_mod.type': 'enum_v4_ofp_type',
+:: 'of13.error_msg.type': 'enum_v4_ofp_type',
+:: 'of13.stats_request.type': 'enum_v4_ofp_type',
+:: 'of13.stats_request.stats_type': 'enum_v4_ofp_stats_type',
+:: 'of13.stats_request.flags': 'enum_v4_ofp_stats_request_flags',
+:: 'of13.stats_reply.type': 'enum_v4_ofp_type',
+:: 'of13.stats_reply.stats_type': 'enum_v4_ofp_stats_type',
+:: 'of13.stats_reply.flags': 'enum_v4_ofp_stats_reply_flags',
+:: 'of13.flow_mod.table_id': 'enum_v4_ofp_table',
+:: 'of13.flow_mod._command': 'enum_v4_ofp_flow_mod_command',
+:: 'of13.flow_mod.out_port': 'enum_v4_ofp_port',
+:: 'of13.flow_mod.out_group': 'enum_v4_ofp_group',
+:: 'of13.error_msg.err_type': 'enum_v4_ofp_error_type',
+:: 'of13.port_mod.type': 'enum_v4_ofp_type',
+:: 'of13.hello.type': 'enum_v4_ofp_type',
+:: 'of13.features_request.type': 'enum_v4_ofp_type',
+:: 'of13.features_reply.type': 'enum_v4_ofp_type',
+:: 'of13.barrier_request.type': 'enum_v4_ofp_type',
+:: 'of13.barrier_reply.type': 'enum_v4_ofp_type',
+:: 'of13.echo_request.type': 'enum_v4_ofp_type',
+:: 'of13.echo_reply.type': 'enum_v4_ofp_type',
+:: 'of13.match_t.type': 'enum_v4_ofp_match_type'
+:: }
+
+
fields = {}
:: for field in fields:
:: if field.type in ["uint8", "uint16", "uint32", "uint64"]:
+:: if field.fullname in values:
+fields[${repr(field.fullname)}] = ProtoField.${field.type}("${field.fullname}", "${field.name}", base.${field.base}, ${values[field.fullname]})
+:: else:
fields[${repr(field.fullname)}] = ProtoField.${field.type}("${field.fullname}", "${field.name}", base.${field.base})
+:: #endif
:: elif field.type in ["ipv4", "ipv6", "ether", "bytes", "stringz"]:
fields[${repr(field.fullname)}] = ProtoField.${field.type}("${field.fullname}", "${field.name}")
:: else:
@@ -119,6 +150,16 @@
return protocol, info
end
+function dissect_of_oxm_v3(reader, subtree)
+ local type_val = reader.peek(0,4):uint()
+
+ local info = "unknown"
+ if of_oxm_v3_dissectors[type_val] then
+ info = of_oxm_v3_dissectors[type_val](reader, subtree)
+ end
+
+ return info
+end
-- of dissector function
function p_of.dissector (buf, pkt, root)
local offset = 0