Revert "TODO epan/dissectors/asn1/kerberos/packet-kerberos-template.c new GSS flags"
[wireshark-sm.git] / epan / dissectors / packet-openflow_v4.c
blob6ebcc7cab039128c0b2d0fed6ce70800cf7b8fbc
1 /* packet-openflow_v4.c
2 * Routines for OpenFlow dissection
3 * Copyright 2013, Anders Broman <anders.broman@ericsson.com>
4 * Copyright 2013, Zoltan Lajos Kis <zoltan.lajos.kis@ericsson.com>
6 * Wireshark - Network traffic analyzer
7 * By Gerald Combs <gerald@wireshark.org>
8 * Copyright 1998 Gerald Combs
10 * SPDX-License-Identifier: GPL-2.0-or-later
12 * Ref https://www.opennetworking.org/sdn-resources/onf-specifications/openflow
15 #include "config.h"
17 #include <epan/packet.h>
18 #include <epan/etypes.h>
19 #include <epan/expert.h>
20 #include <epan/ipproto.h>
22 void proto_register_openflow_v4(void);
23 void proto_reg_handoff_openflow_v4(void);
24 static int dissect_openflow_message_v4(tvbuff_t *, packet_info *, proto_tree *, int);
26 static dissector_handle_t eth_withoutfcs_handle;
28 static int proto_openflow_v4;
29 static int hf_openflow_v4_version;
30 static int hf_openflow_v4_type;
31 static int hf_openflow_v4_length;
32 static int hf_openflow_v4_xid;
33 static int hf_openflow_v4_oxm_class;
34 static int hf_openflow_v4_oxm_field;
35 static int hf_openflow_v4_oxm_field_basic;
36 static int hf_openflow_v4_oxm_hm;
37 static int hf_openflow_v4_oxm_length;
38 static int hf_openflow_v4_oxm_experimenter_experimenter;
39 static int hf_openflow_v4_oxm_experimenter_value;
40 static int hf_openflow_v4_oxm_value;
41 static int hf_openflow_v4_oxm_value_etheraddr;
42 static int hf_openflow_v4_oxm_value_vlan_present;
43 static int hf_openflow_v4_oxm_value_vlan_vid;
44 static int hf_openflow_v4_oxm_value_ethertype;
45 static int hf_openflow_v4_oxm_value_ipv4addr;
46 static int hf_openflow_v4_oxm_value_ipv6addr;
47 static int hf_openflow_v4_oxm_value_ipproto;
48 static int hf_openflow_v4_oxm_value_uint16;
49 static int hf_openflow_v4_oxm_value_uint24;
50 static int hf_openflow_v4_oxm_value_uint32;
51 static int hf_openflow_v4_oxm_mask;
52 static int hf_openflow_v4_oxm_mask_etheraddr;
53 static int hf_openflow_v4_oxm_mask_ipv4addr;
54 static int hf_openflow_v4_oxm_mask_ipv6addr;
55 static int hf_openflow_v4_oxm_mask_vlan;
56 static int hf_openflow_v4_match_type;
57 static int hf_openflow_v4_match_length;
58 static int hf_openflow_v4_match_pad;
59 static int hf_openflow_v4_action_type;
60 static int hf_openflow_v4_action_length;
61 static int hf_openflow_v4_action_experimenter_experimenter;
62 static int hf_openflow_v4_action_output_port;
63 static int hf_openflow_v4_action_output_max_len;
64 static int hf_openflow_v4_action_output_pad;
65 static int hf_openflow_v4_action_copy_ttl_out_pad;
66 static int hf_openflow_v4_action_copy_ttl_in_pad;
67 static int hf_openflow_v4_action_set_mpls_ttl_ttl;
68 static int hf_openflow_v4_action_set_mpls_ttl_pad;
69 static int hf_openflow_v4_action_dec_mpls_ttl_pad;
70 static int hf_openflow_v4_action_push_vlan_ethertype;
71 static int hf_openflow_v4_action_push_vlan_pad;
72 static int hf_openflow_v4_action_pop_vlan_pad;
73 static int hf_openflow_v4_action_push_mpls_ethertype;
74 static int hf_openflow_v4_action_push_mpls_pad;
75 static int hf_openflow_v4_action_pop_mpls_ethertype;
76 static int hf_openflow_v4_action_pop_mpls_pad;
77 static int hf_openflow_v4_action_set_queue_queue_id;
78 static int hf_openflow_v4_action_group_group_id;
79 static int hf_openflow_v4_action_set_nw_ttl_ttl;
80 static int hf_openflow_v4_action_set_nw_ttl_pad;
81 static int hf_openflow_v4_action_dec_nw_ttl_pad;
82 static int hf_openflow_v4_action_set_field_pad;
83 static int hf_openflow_v4_action_push_pbb_ethertype;
84 static int hf_openflow_v4_action_push_pbb_pad;
85 static int hf_openflow_v4_action_pop_pbb_pad;
86 static int hf_openflow_v4_instruction_type;
87 static int hf_openflow_v4_instruction_length;
88 static int hf_openflow_v4_instruction_experimenter_experimenter;
89 static int hf_openflow_v4_instruction_goto_table_table_id;
90 static int hf_openflow_v4_instruction_goto_table_pad;
91 static int hf_openflow_v4_instruction_write_metadata_pad;
92 static int hf_openflow_v4_instruction_write_metadata_value;
93 static int hf_openflow_v4_instruction_write_metadata_mask;
94 static int hf_openflow_v4_instruction_actions_pad;
95 static int hf_openflow_v4_instruction_meter_meter_id;
96 static int hf_openflow_v4_port_port_no;
97 static int hf_openflow_v4_port_pad;
98 static int hf_openflow_v4_port_hw_addr;
99 static int hf_openflow_v4_port_pad2;
100 static int hf_openflow_v4_port_name;
101 static int hf_openflow_v4_port_config;
102 static int hf_openflow_v4_port_config_port_down;
103 static int hf_openflow_v4_port_config_no_recv;
104 static int hf_openflow_v4_port_config_no_fwd;
105 static int hf_openflow_v4_port_config_no_packet_in;
106 static int hf_openflow_v4_port_state;
107 static int hf_openflow_v4_port_state_link_down;
108 static int hf_openflow_v4_port_state_blocked;
109 static int hf_openflow_v4_port_state_live;
110 static int hf_openflow_v4_port_current;
111 static int hf_openflow_v4_port_current_10mb_hd;
112 static int hf_openflow_v4_port_current_10mb_fd;
113 static int hf_openflow_v4_port_current_100mb_hd;
114 static int hf_openflow_v4_port_current_100mb_fd;
115 static int hf_openflow_v4_port_current_1gb_hd;
116 static int hf_openflow_v4_port_current_1gb_fd;
117 static int hf_openflow_v4_port_current_10gb_fd;
118 static int hf_openflow_v4_port_current_40gb_fd;
119 static int hf_openflow_v4_port_current_100gb_fd;
120 static int hf_openflow_v4_port_current_1tb_fd;
121 static int hf_openflow_v4_port_current_other;
122 static int hf_openflow_v4_port_current_copper;
123 static int hf_openflow_v4_port_current_fiber;
124 static int hf_openflow_v4_port_current_autoneg;
125 static int hf_openflow_v4_port_current_pause;
126 static int hf_openflow_v4_port_current_pause_asym;
127 static int hf_openflow_v4_port_advertised;
128 static int hf_openflow_v4_port_advertised_10mb_hd;
129 static int hf_openflow_v4_port_advertised_10mb_fd;
130 static int hf_openflow_v4_port_advertised_100mb_hd;
131 static int hf_openflow_v4_port_advertised_100mb_fd;
132 static int hf_openflow_v4_port_advertised_1gb_hd;
133 static int hf_openflow_v4_port_advertised_1gb_fd;
134 static int hf_openflow_v4_port_advertised_10gb_fd;
135 static int hf_openflow_v4_port_advertised_40gb_fd;
136 static int hf_openflow_v4_port_advertised_100gb_fd;
137 static int hf_openflow_v4_port_advertised_1tb_fd;
138 static int hf_openflow_v4_port_advertised_other;
139 static int hf_openflow_v4_port_advertised_copper;
140 static int hf_openflow_v4_port_advertised_fiber;
141 static int hf_openflow_v4_port_advertised_autoneg;
142 static int hf_openflow_v4_port_advertised_pause;
143 static int hf_openflow_v4_port_advertised_pause_asym;
144 static int hf_openflow_v4_port_supported;
145 static int hf_openflow_v4_port_supported_10mb_hd;
146 static int hf_openflow_v4_port_supported_10mb_fd;
147 static int hf_openflow_v4_port_supported_100mb_hd;
148 static int hf_openflow_v4_port_supported_100mb_fd;
149 static int hf_openflow_v4_port_supported_1gb_hd;
150 static int hf_openflow_v4_port_supported_1gb_fd;
151 static int hf_openflow_v4_port_supported_10gb_fd;
152 static int hf_openflow_v4_port_supported_40gb_fd;
153 static int hf_openflow_v4_port_supported_100gb_fd;
154 static int hf_openflow_v4_port_supported_1tb_fd;
155 static int hf_openflow_v4_port_supported_other;
156 static int hf_openflow_v4_port_supported_copper;
157 static int hf_openflow_v4_port_supported_fiber;
158 static int hf_openflow_v4_port_supported_autoneg;
159 static int hf_openflow_v4_port_supported_pause;
160 static int hf_openflow_v4_port_supported_pause_asym;
161 static int hf_openflow_v4_port_peer;
162 static int hf_openflow_v4_port_peer_10mb_hd;
163 static int hf_openflow_v4_port_peer_10mb_fd;
164 static int hf_openflow_v4_port_peer_100mb_hd;
165 static int hf_openflow_v4_port_peer_100mb_fd;
166 static int hf_openflow_v4_port_peer_1gb_hd;
167 static int hf_openflow_v4_port_peer_1gb_fd;
168 static int hf_openflow_v4_port_peer_10gb_fd;
169 static int hf_openflow_v4_port_peer_40gb_fd;
170 static int hf_openflow_v4_port_peer_100gb_fd;
171 static int hf_openflow_v4_port_peer_1tb_fd;
172 static int hf_openflow_v4_port_peer_other;
173 static int hf_openflow_v4_port_peer_copper;
174 static int hf_openflow_v4_port_peer_fiber;
175 static int hf_openflow_v4_port_peer_autoneg;
176 static int hf_openflow_v4_port_peer_pause;
177 static int hf_openflow_v4_port_peer_pause_asym;
178 static int hf_openflow_v4_port_curr_speed;
179 static int hf_openflow_v4_port_max_speed;
180 static int hf_openflow_v4_meter_band_type;
181 static int hf_openflow_v4_meter_band_len;
182 static int hf_openflow_v4_meter_band_rate;
183 static int hf_openflow_v4_meter_band_burst_size;
184 static int hf_openflow_v4_meter_band_drop_pad;
185 static int hf_openflow_v4_meter_band_dscp_remark_prec_level;
186 static int hf_openflow_v4_meter_band_dscp_remark_pad;
187 static int hf_openflow_v4_meter_band_experimenter_experimenter;
188 static int hf_openflow_v4_hello_element_type;
189 static int hf_openflow_v4_hello_element_length;
190 static int hf_openflow_v4_hello_element_version_bitmap;
191 static int hf_openflow_v4_hello_element_pad;
192 static int hf_openflow_v4_error_type;
193 static int hf_openflow_v4_error_hello_failed_code;
194 static int hf_openflow_v4_error_bad_request_code;
195 static int hf_openflow_v4_error_bad_action_code;
196 static int hf_openflow_v4_error_bad_instruction_code;
197 static int hf_openflow_v4_error_bad_match_code;
198 static int hf_openflow_v4_error_flow_mod_failed_code;
199 static int hf_openflow_v4_error_group_mod_failed_code;
200 static int hf_openflow_v4_error_port_mod_failed_code;
201 static int hf_openflow_v4_error_table_mod_failed_code;
202 static int hf_openflow_v4_error_queue_op_failed_code;
203 static int hf_openflow_v4_error_switch_config_failed_code;
204 static int hf_openflow_v4_error_role_request_failed_code;
205 static int hf_openflow_v4_error_meter_mod_failed_code;
206 static int hf_openflow_v4_error_table_features_failed_code;
207 static int hf_openflow_v4_error_code;
208 static int hf_openflow_v4_error_data_text;
209 static int hf_openflow_v4_error_data_body;
210 static int hf_openflow_v4_error_experimenter;
211 static int hf_openflow_v4_echo_data;
212 static int hf_openflow_v4_experimenter_experimenter;
213 static int hf_openflow_v4_experimenter_exp_type;
214 static int hf_openflow_v4_switch_features_datapath_id;
215 static int hf_openflow_v4_switch_features_n_buffers;
216 static int hf_openflow_v4_switch_features_n_tables;
217 static int hf_openflow_v4_switch_features_auxiliary_id;
218 static int hf_openflow_v4_switch_features_pad;
219 static int hf_openflow_v4_switch_features_capabilities;
220 static int hf_openflow_v4_switch_features_capabilities_flow_stats;
221 static int hf_openflow_v4_switch_features_capabilities_table_stats;
222 static int hf_openflow_v4_switch_features_capabilities_port_stats;
223 static int hf_openflow_v4_switch_features_capabilities_group_stats;
224 static int hf_openflow_v4_switch_features_capabilities_ip_reasm;
225 static int hf_openflow_v4_switch_features_capabilities_queue_stats;
226 static int hf_openflow_v4_switch_features_capabilities_port_blocked;
227 static int hf_openflow_v4_switch_features_reserved;
228 static int hf_openflow_v4_switch_config_flags;
229 static int hf_openflow_v4_switch_config_flags_fragments;
230 static int hf_openflow_v4_switch_config_miss_send_len;
231 static int hf_openflow_v4_packet_in_buffer_id;
232 static int hf_openflow_v4_packet_in_total_len;
233 static int hf_openflow_v4_packet_in_reason;
234 static int hf_openflow_v4_packet_in_table_id;
235 static int hf_openflow_v4_packet_in_cookie;
236 static int hf_openflow_v4_packet_in_pad;
237 static int hf_openflow_v4_flow_removed_cookie;
238 static int hf_openflow_v4_flow_removed_priority;
239 static int hf_openflow_v4_flow_removed_reason;
240 static int hf_openflow_v4_flow_removed_table_id;
241 static int hf_openflow_v4_flow_removed_duration_sec;
242 static int hf_openflow_v4_flow_removed_duration_nsec;
243 static int hf_openflow_v4_flow_removed_idle_timeout;
244 static int hf_openflow_v4_flow_removed_hard_timeout;
245 static int hf_openflow_v4_flow_removed_packet_count;
246 static int hf_openflow_v4_flow_removed_byte_count;
247 static int hf_openflow_v4_port_status_reason;
248 static int hf_openflow_v4_port_status_pad;
249 static int hf_openflow_v4_packet_out_buffer_id;
250 static int hf_openflow_v4_packet_out_in_port;
251 static int hf_openflow_v4_packet_out_acts_len;
252 static int hf_openflow_v4_packet_out_pad;
253 static int hf_openflow_v4_flowmod_cookie;
254 static int hf_openflow_v4_flowmod_cookie_mask;
255 static int hf_openflow_v4_flowmod_table_id;
256 static int hf_openflow_v4_flowmod_command;
257 static int hf_openflow_v4_flowmod_idle_timeout;
258 static int hf_openflow_v4_flowmod_hard_timeout;
259 static int hf_openflow_v4_flowmod_priority;
260 static int hf_openflow_v4_flowmod_buffer_id;
261 static int hf_openflow_v4_flowmod_out_port;
262 static int hf_openflow_v4_flowmod_out_group;
263 static int hf_openflow_v4_flowmod_flags;
264 static int hf_openflow_v4_flowmod_flags_send_flow_rem;
265 static int hf_openflow_v4_flowmod_flags_check_overlap;
266 static int hf_openflow_v4_flowmod_flags_reset_counts;
267 static int hf_openflow_v4_flowmod_flags_no_packet_counts;
268 static int hf_openflow_v4_flowmod_flags_no_byte_counts;
269 static int hf_openflow_v4_flowmod_pad;
270 static int hf_openflow_v4_bucket_length;
271 static int hf_openflow_v4_bucket_weight;
272 static int hf_openflow_v4_bucket_watch_port;
273 static int hf_openflow_v4_bucket_watch_group;
274 static int hf_openflow_v4_bucket_pad;
275 static int hf_openflow_v4_groupmod_command;
276 static int hf_openflow_v4_groupmod_type;
277 static int hf_openflow_v4_groupmod_pad;
278 static int hf_openflow_v4_groupmod_group_id;
279 static int hf_openflow_v4_portmod_port_no;
280 static int hf_openflow_v4_portmod_pad;
281 static int hf_openflow_v4_portmod_hw_addr;
282 static int hf_openflow_v4_portmod_pad2;
283 static int hf_openflow_v4_portmod_config;
284 static int hf_openflow_v4_portmod_config_port_down;
285 static int hf_openflow_v4_portmod_config_no_recv;
286 static int hf_openflow_v4_portmod_config_no_fwd;
287 static int hf_openflow_v4_portmod_config_no_packet_in;
288 static int hf_openflow_v4_portmod_mask;
289 static int hf_openflow_v4_portmod_mask_port_down;
290 static int hf_openflow_v4_portmod_mask_no_recv;
291 static int hf_openflow_v4_portmod_mask_no_fwd;
292 static int hf_openflow_v4_portmod_mask_no_packet_in;
293 static int hf_openflow_v4_portmod_advertise;
294 static int hf_openflow_v4_portmod_advertise_10mb_hd;
295 static int hf_openflow_v4_portmod_advertise_10mb_fd;
296 static int hf_openflow_v4_portmod_advertise_100mb_hd;
297 static int hf_openflow_v4_portmod_advertise_100mb_fd;
298 static int hf_openflow_v4_portmod_advertise_1gb_hd;
299 static int hf_openflow_v4_portmod_advertise_1gb_fd;
300 static int hf_openflow_v4_portmod_advertise_10gb_fd;
301 static int hf_openflow_v4_portmod_advertise_40gb_fd;
302 static int hf_openflow_v4_portmod_advertise_100gb_fd;
303 static int hf_openflow_v4_portmod_advertise_1tb_fd;
304 static int hf_openflow_v4_portmod_advertise_other;
305 static int hf_openflow_v4_portmod_advertise_copper;
306 static int hf_openflow_v4_portmod_advertise_fiber;
307 static int hf_openflow_v4_portmod_advertise_autoneg;
308 static int hf_openflow_v4_portmod_advertise_pause;
309 static int hf_openflow_v4_portmod_advertise_pause_asym;
310 static int hf_openflow_v4_portmod_pad3;
311 static int hf_openflow_v4_tablemod_table_id;
312 static int hf_openflow_v4_tablemod_pad;
313 static int hf_openflow_v4_tablemod_config;
314 static int hf_openflow_v4_flow_stats_request_table_id;
315 static int hf_openflow_v4_flow_stats_request_pad;
316 static int hf_openflow_v4_flow_stats_request_out_port;
317 static int hf_openflow_v4_flow_stats_request_out_group;
318 static int hf_openflow_v4_flow_stats_request_pad2;
319 static int hf_openflow_v4_flow_stats_request_cookie;
320 static int hf_openflow_v4_flow_stats_request_cookie_mask;
321 static int hf_openflow_v4_aggregate_stats_request_table_id;
322 static int hf_openflow_v4_aggregate_stats_request_pad;
323 static int hf_openflow_v4_aggregate_stats_request_out_port;
324 static int hf_openflow_v4_aggregate_stats_request_out_group;
325 static int hf_openflow_v4_aggregate_stats_request_pad2;
326 static int hf_openflow_v4_aggregate_stats_request_cookie;
327 static int hf_openflow_v4_aggregate_stats_request_cookie_mask;
328 static int hf_openflow_v4_table_feature_prop_type;
329 static int hf_openflow_v4_table_feature_prop_length;
330 static int hf_openflow_v4_table_feature_prop_next_tables_next_table_id;
331 static int hf_openflow_v4_table_feature_prop_experimenter_experimenter;
332 static int hf_openflow_v4_table_feature_prop_experimenter_exp_type;
333 static int hf_openflow_v4_table_feature_prop_pad;
334 static int hf_openflow_v4_table_features_length;
335 static int hf_openflow_v4_table_features_table_id;
336 static int hf_openflow_v4_table_features_pad;
337 static int hf_openflow_v4_table_features_name;
338 static int hf_openflow_v4_table_features_metadata_match;
339 static int hf_openflow_v4_table_features_metadata_write;
340 static int hf_openflow_v4_table_features_config;
341 static int hf_openflow_v4_table_features_max_entries;
342 static int hf_openflow_v4_port_stats_request_port_no;
343 static int hf_openflow_v4_port_stats_request_pad;
344 static int hf_openflow_v4_queue_stats_request_port_no;
345 static int hf_openflow_v4_queue_stats_request_queue_id;
346 static int hf_openflow_v4_group_stats_request_group_id;
347 static int hf_openflow_v4_group_stats_request_pad;
348 static int hf_openflow_v4_meter_stats_request_meter_id;
349 static int hf_openflow_v4_meter_stats_request_pad;
350 static int hf_openflow_v4_meter_config_request_meter_id;
351 static int hf_openflow_v4_meter_config_request_pad;
352 static int hf_openflow_v4_multipart_request_type;
353 static int hf_openflow_v4_multipart_request_flags;
354 static int hf_openflow_v4_multipart_request_flags_more;
355 static int hf_openflow_v4_multipart_request_pad;
356 static int hf_openflow_v4_multipart_request_experimenter_experimenter;
357 static int hf_openflow_v4_multipart_request_experimenter_exp_type;
358 static int hf_openflow_v4_switch_description_mfr_desc;
359 static int hf_openflow_v4_switch_description_hw_desc;
360 static int hf_openflow_v4_switch_description_sw_desc;
361 static int hf_openflow_v4_switch_description_serial_num;
362 static int hf_openflow_v4_switch_description_dp_desc;
363 static int hf_openflow_v4_flow_stats_length;
364 static int hf_openflow_v4_flow_stats_table_id;
365 static int hf_openflow_v4_flow_stats_pad;
366 static int hf_openflow_v4_flow_stats_duration_sec;
367 static int hf_openflow_v4_flow_stats_duration_nsec;
368 static int hf_openflow_v4_flow_stats_priority;
369 static int hf_openflow_v4_flow_stats_idle_timeout;
370 static int hf_openflow_v4_flow_stats_hard_timeout;
371 static int hf_openflow_v4_flow_stats_flags;
372 static int hf_openflow_v4_flow_stats_flags_send_flow_rem;
373 static int hf_openflow_v4_flow_stats_flags_check_overlap;
374 static int hf_openflow_v4_flow_stats_flags_reset_counts;
375 static int hf_openflow_v4_flow_stats_flags_no_packet_counts;
376 static int hf_openflow_v4_flow_stats_flags_no_byte_counts;
377 static int hf_openflow_v4_flow_stats_pad2;
378 static int hf_openflow_v4_flow_stats_cookie;
379 static int hf_openflow_v4_flow_stats_packet_count;
380 static int hf_openflow_v4_flow_stats_byte_count;
381 static int hf_openflow_v4_aggregate_stats_packet_count;
382 static int hf_openflow_v4_aggregate_stats_byte_count;
383 static int hf_openflow_v4_aggregate_stats_flow_count;
384 static int hf_openflow_v4_aggregate_stats_pad;
385 static int hf_openflow_v4_table_stats_table_id;
386 static int hf_openflow_v4_table_stats_pad;
387 static int hf_openflow_v4_table_stats_active_count;
388 static int hf_openflow_v4_table_stats_lookup_count;
389 static int hf_openflow_v4_table_stats_match_count;
390 static int hf_openflow_v4_port_stats_port_no;
391 static int hf_openflow_v4_port_stats_pad;
392 static int hf_openflow_v4_port_stats_rx_packets;
393 static int hf_openflow_v4_port_stats_tx_packets;
394 static int hf_openflow_v4_port_stats_rx_bytes;
395 static int hf_openflow_v4_port_stats_tx_bytes;
396 static int hf_openflow_v4_port_stats_rx_dropped;
397 static int hf_openflow_v4_port_stats_tx_dropped;
398 static int hf_openflow_v4_port_stats_rx_errors;
399 static int hf_openflow_v4_port_stats_tx_errors;
400 static int hf_openflow_v4_port_stats_rx_frame_error;
401 static int hf_openflow_v4_port_stats_rx_over_error;
402 static int hf_openflow_v4_port_stats_rx_crc_error;
403 static int hf_openflow_v4_port_stats_collisions;
404 static int hf_openflow_v4_port_stats_duration_sec;
405 static int hf_openflow_v4_port_stats_duration_nsec;
406 static int hf_openflow_v4_queue_stats_port_no;
407 static int hf_openflow_v4_queue_stats_queue_id;
408 static int hf_openflow_v4_queue_stats_tx_bytes;
409 static int hf_openflow_v4_queue_stats_tx_packets;
410 static int hf_openflow_v4_queue_stats_tx_errors;
411 static int hf_openflow_v4_queue_stats_duration_sec;
412 static int hf_openflow_v4_queue_stats_duration_nsec;
413 static int hf_openflow_v4_bucket_counter_packet_count;
414 static int hf_openflow_v4_bucket_counter_byte_count;
415 static int hf_openflow_v4_group_stats_length;
416 static int hf_openflow_v4_group_stats_pad;
417 static int hf_openflow_v4_group_stats_group_id;
418 static int hf_openflow_v4_group_stats_ref_count;
419 static int hf_openflow_v4_group_stats_pad2;
420 static int hf_openflow_v4_group_stats_packet_count;
421 static int hf_openflow_v4_group_stats_byte_count;
422 static int hf_openflow_v4_group_desc_length;
423 static int hf_openflow_v4_group_desc_type;
424 static int hf_openflow_v4_group_desc_pad;
425 static int hf_openflow_v4_group_desc_group_id;
426 static int hf_openflow_v4_group_features_types;
427 static int hf_openflow_v4_group_features_types_all;
428 static int hf_openflow_v4_group_features_types_select;
429 static int hf_openflow_v4_group_features_types_indirect;
430 static int hf_openflow_v4_group_features_types_ff;
431 static int hf_openflow_v4_group_features_capabilities;
432 static int hf_openflow_v4_group_features_capabilities_select_weight;
433 static int hf_openflow_v4_group_features_capabilities_select_liveness;
434 static int hf_openflow_v4_group_features_capabilities_chaining;
435 static int hf_openflow_v4_group_features_capabilities_chaining_checks;
436 static int hf_openflow_v4_group_features_max_groups_all;
437 static int hf_openflow_v4_group_features_max_groups_select;
438 static int hf_openflow_v4_group_features_max_groups_indirect;
439 static int hf_openflow_v4_group_features_max_groups_ff;
440 static int hf_openflow_v4_group_features_actions_all;
441 static int hf_openflow_v4_group_features_actions_all_output;
442 static int hf_openflow_v4_group_features_actions_all_copy_ttl_out;
443 static int hf_openflow_v4_group_features_actions_all_copy_ttl_in;
444 static int hf_openflow_v4_group_features_actions_all_set_mpls_ttl;
445 static int hf_openflow_v4_group_features_actions_all_dec_mpls_ttl;
446 static int hf_openflow_v4_group_features_actions_all_push_vlan;
447 static int hf_openflow_v4_group_features_actions_all_pop_vlan;
448 static int hf_openflow_v4_group_features_actions_all_push_mpls;
449 static int hf_openflow_v4_group_features_actions_all_pop_mpls;
450 static int hf_openflow_v4_group_features_actions_all_set_queue;
451 static int hf_openflow_v4_group_features_actions_all_group;
452 static int hf_openflow_v4_group_features_actions_all_set_nw_ttl;
453 static int hf_openflow_v4_group_features_actions_all_dec_nw_ttl;
454 static int hf_openflow_v4_group_features_actions_all_set_field;
455 static int hf_openflow_v4_group_features_actions_all_push_pbb;
456 static int hf_openflow_v4_group_features_actions_all_pop_pbb;
457 static int hf_openflow_v4_group_features_actions_select;
458 static int hf_openflow_v4_group_features_actions_select_output;
459 static int hf_openflow_v4_group_features_actions_select_copy_ttl_out;
460 static int hf_openflow_v4_group_features_actions_select_copy_ttl_in;
461 static int hf_openflow_v4_group_features_actions_select_set_mpls_ttl;
462 static int hf_openflow_v4_group_features_actions_select_dec_mpls_ttl;
463 static int hf_openflow_v4_group_features_actions_select_push_vlan;
464 static int hf_openflow_v4_group_features_actions_select_pop_vlan;
465 static int hf_openflow_v4_group_features_actions_select_push_mpls;
466 static int hf_openflow_v4_group_features_actions_select_pop_mpls;
467 static int hf_openflow_v4_group_features_actions_select_set_queue;
468 static int hf_openflow_v4_group_features_actions_select_group;
469 static int hf_openflow_v4_group_features_actions_select_set_nw_ttl;
470 static int hf_openflow_v4_group_features_actions_select_dec_nw_ttl;
471 static int hf_openflow_v4_group_features_actions_select_set_field;
472 static int hf_openflow_v4_group_features_actions_select_push_pbb;
473 static int hf_openflow_v4_group_features_actions_select_pop_pbb;
474 static int hf_openflow_v4_group_features_actions_indirect;
475 static int hf_openflow_v4_group_features_actions_indirect_output;
476 static int hf_openflow_v4_group_features_actions_indirect_copy_ttl_out;
477 static int hf_openflow_v4_group_features_actions_indirect_copy_ttl_in;
478 static int hf_openflow_v4_group_features_actions_indirect_set_mpls_ttl;
479 static int hf_openflow_v4_group_features_actions_indirect_dec_mpls_ttl;
480 static int hf_openflow_v4_group_features_actions_indirect_push_vlan;
481 static int hf_openflow_v4_group_features_actions_indirect_pop_vlan;
482 static int hf_openflow_v4_group_features_actions_indirect_push_mpls;
483 static int hf_openflow_v4_group_features_actions_indirect_pop_mpls;
484 static int hf_openflow_v4_group_features_actions_indirect_set_queue;
485 static int hf_openflow_v4_group_features_actions_indirect_group;
486 static int hf_openflow_v4_group_features_actions_indirect_set_nw_ttl;
487 static int hf_openflow_v4_group_features_actions_indirect_dec_nw_ttl;
488 static int hf_openflow_v4_group_features_actions_indirect_set_field;
489 static int hf_openflow_v4_group_features_actions_indirect_push_pbb;
490 static int hf_openflow_v4_group_features_actions_indirect_pop_pbb;
491 static int hf_openflow_v4_group_features_actions_ff;
492 static int hf_openflow_v4_group_features_actions_ff_output;
493 static int hf_openflow_v4_group_features_actions_ff_copy_ttl_out;
494 static int hf_openflow_v4_group_features_actions_ff_copy_ttl_in;
495 static int hf_openflow_v4_group_features_actions_ff_set_mpls_ttl;
496 static int hf_openflow_v4_group_features_actions_ff_dec_mpls_ttl;
497 static int hf_openflow_v4_group_features_actions_ff_push_vlan;
498 static int hf_openflow_v4_group_features_actions_ff_pop_vlan;
499 static int hf_openflow_v4_group_features_actions_ff_push_mpls;
500 static int hf_openflow_v4_group_features_actions_ff_pop_mpls;
501 static int hf_openflow_v4_group_features_actions_ff_set_queue;
502 static int hf_openflow_v4_group_features_actions_ff_group;
503 static int hf_openflow_v4_group_features_actions_ff_set_nw_ttl;
504 static int hf_openflow_v4_group_features_actions_ff_dec_nw_ttl;
505 static int hf_openflow_v4_group_features_actions_ff_set_field;
506 static int hf_openflow_v4_group_features_actions_ff_push_pbb;
507 static int hf_openflow_v4_group_features_actions_ff_pop_pbb;
508 static int hf_openflow_v4_meter_band_stats_packet_band_count;
509 static int hf_openflow_v4_meter_band_stats_byte_band_count;
510 static int hf_openflow_v4_meter_stats_meter_id;
511 static int hf_openflow_v4_meter_stats_len;
512 static int hf_openflow_v4_meter_stats_pad;
513 static int hf_openflow_v4_meter_stats_flow_count;
514 static int hf_openflow_v4_meter_stats_packet_in_count;
515 static int hf_openflow_v4_meter_stats_byte_in_count;
516 static int hf_openflow_v4_meter_stats_duration_sec;
517 static int hf_openflow_v4_meter_stats_duration_nsec;
518 static int hf_openflow_v4_meter_config_len;
519 static int hf_openflow_v4_meter_config_flags;
520 static int hf_openflow_v4_meter_config_flags_kbps;
521 static int hf_openflow_v4_meter_config_flags_pktps;
522 static int hf_openflow_v4_meter_config_flags_burst;
523 static int hf_openflow_v4_meter_config_flags_stats;
524 static int hf_openflow_v4_meter_config_meter_id;
525 static int hf_openflow_v4_meter_features_max_meter;
526 static int hf_openflow_v4_meter_features_band_types;
527 static int hf_openflow_v4_meter_features_band_types_drop;
528 static int hf_openflow_v4_meter_features_band_types_dscp_remark;
529 static int hf_openflow_v4_meter_features_capabilities;
530 static int hf_openflow_v4_meter_features_capabilities_kbps;
531 static int hf_openflow_v4_meter_features_capabilities_pktps;
532 static int hf_openflow_v4_meter_features_capabilities_burst;
533 static int hf_openflow_v4_meter_features_capabilities_stats;
534 static int hf_openflow_v4_meter_features_max_bands;
535 static int hf_openflow_v4_meter_features_max_color;
536 static int hf_openflow_v4_meter_features_pad;
537 static int hf_openflow_v4_multipart_reply_type;
538 static int hf_openflow_v4_multipart_reply_flags;
539 static int hf_openflow_v4_multipart_reply_flags_more;
540 static int hf_openflow_v4_multipart_reply_pad;
541 static int hf_openflow_v4_multipart_reply_experimenter_experimenter;
542 static int hf_openflow_v4_multipart_reply_experimenter_exp_type;
543 static int hf_openflow_v4_queue_get_config_request_port;
544 static int hf_openflow_v4_queue_get_config_request_pad;
545 static int hf_openflow_v4_queue_prop_property;
546 static int hf_openflow_v4_queue_prop_len;
547 static int hf_openflow_v4_queue_prop_pad;
548 static int hf_openflow_v4_queue_prop_min_rate_rate;
549 static int hf_openflow_v4_queue_prop_min_rate_pad;
550 static int hf_openflow_v4_queue_prop_max_rate_rate;
551 static int hf_openflow_v4_queue_prop_max_rate_pad;
552 static int hf_openflow_v4_queue_prop_experimenter_experimenter;
553 static int hf_openflow_v4_queue_prop_experimenter_pad;
554 static int hf_openflow_v4_packet_queue_queue_id;
555 static int hf_openflow_v4_packet_queue_port;
556 static int hf_openflow_v4_packet_queue_len;
557 static int hf_openflow_v4_packet_queue_pad;
558 static int hf_openflow_v4_queue_get_config_reply_port;
559 static int hf_openflow_v4_queue_get_config_reply_pad;
560 static int hf_openflow_v4_role_request_role;
561 static int hf_openflow_v4_role_request_pad;
562 static int hf_openflow_v4_role_request_generation_id;
563 static int hf_openflow_v4_role_reply_role;
564 static int hf_openflow_v4_role_reply_pad;
565 static int hf_openflow_v4_role_reply_generation_id;
566 static int hf_openflow_v4_async_config_packet_in_mask_master;
567 static int hf_openflow_v4_async_config_packet_in_mask_master_no_match;
568 static int hf_openflow_v4_async_config_packet_in_mask_master_action;
569 static int hf_openflow_v4_async_config_packet_in_mask_master_invalid_ttl;
570 static int hf_openflow_v4_async_config_packet_in_mask_slave;
571 static int hf_openflow_v4_async_config_packet_in_mask_slave_no_match;
572 static int hf_openflow_v4_async_config_packet_in_mask_slave_action;
573 static int hf_openflow_v4_async_config_packet_in_mask_slave_invalid_ttl;
574 static int hf_openflow_v4_async_config_port_status_mask_master;
575 static int hf_openflow_v4_async_config_port_status_mask_master_add;
576 static int hf_openflow_v4_async_config_port_status_mask_master_delete;
577 static int hf_openflow_v4_async_config_port_status_mask_master_modify;
578 static int hf_openflow_v4_async_config_port_status_mask_slave;
579 static int hf_openflow_v4_async_config_port_status_mask_slave_add;
580 static int hf_openflow_v4_async_config_port_status_mask_slave_delete;
581 static int hf_openflow_v4_async_config_port_status_mask_slave_modify;
582 static int hf_openflow_v4_async_config_flow_removed_mask_master;
583 static int hf_openflow_v4_async_config_flow_removed_mask_master_idle_timeout;
584 static int hf_openflow_v4_async_config_flow_removed_mask_master_hard_timeout;
585 static int hf_openflow_v4_async_config_flow_removed_mask_master_delete;
586 static int hf_openflow_v4_async_config_flow_removed_mask_master_group_delete;
587 static int hf_openflow_v4_async_config_flow_removed_mask_slave;
588 static int hf_openflow_v4_async_config_flow_removed_mask_slave_idle_timeout;
589 static int hf_openflow_v4_async_config_flow_removed_mask_slave_hard_timeout;
590 static int hf_openflow_v4_async_config_flow_removed_mask_slave_delete;
591 static int hf_openflow_v4_async_config_flow_removed_mask_slave_group_delete;
592 static int hf_openflow_v4_metermod_command;
593 static int hf_openflow_v4_metermod_flags;
594 static int hf_openflow_v4_metermod_flags_kbps;
595 static int hf_openflow_v4_metermod_flags_pktps;
596 static int hf_openflow_v4_metermod_flags_burst;
597 static int hf_openflow_v4_metermod_flags_stats;
598 static int hf_openflow_v4_metermod_meter_id;
600 static int ett_openflow_v4;
601 static int ett_openflow_v4_flowmod_flags;
602 static int ett_openflow_v4_bucket;
603 static int ett_openflow_v4_oxm;
604 static int ett_openflow_v4_match;
605 static int ett_openflow_v4_action;
606 static int ett_openflow_v4_instruction;
607 static int ett_openflow_v4_port;
608 static int ett_openflow_v4_port_config;
609 static int ett_openflow_v4_port_state;
610 static int ett_openflow_v4_port_current;
611 static int ett_openflow_v4_port_advertised;
612 static int ett_openflow_v4_port_supported;
613 static int ett_openflow_v4_port_peer;
614 static int ett_openflow_v4_meter_band;
615 static int ett_openflow_v4_hello_element;
616 static int ett_openflow_v4_error_data;
617 static int ett_openflow_v4_switch_features_capabilities;
618 static int ett_openflow_v4_switch_config_flags;
619 static int ett_openflow_v4_packet_in_data;
620 static int ett_openflow_v4_packet_out_data;
621 static int ett_openflow_v4_portmod_config;
622 static int ett_openflow_v4_portmod_mask;
623 static int ett_openflow_v4_portmod_advertise;
624 static int ett_openflow_v4_table_features;
625 static int ett_openflow_v4_table_feature_prop;
626 static int ett_openflow_v4_table_feature_prop_instruction_id;
627 static int ett_openflow_v4_table_feature_prop_action_id;
628 static int ett_openflow_v4_table_feature_prop_oxm_id;
629 static int ett_openflow_v4_multipart_request_flags;
630 static int ett_openflow_v4_flow_stats;
631 static int ett_openflow_v4_flow_stats_flags;
632 static int ett_openflow_v4_table_stats;
633 static int ett_openflow_v4_port_stats;
634 static int ett_openflow_v4_queue_stats;
635 static int ett_openflow_v4_bucket_counter;
636 static int ett_openflow_v4_group_stats;
637 static int ett_openflow_v4_group_desc;
638 static int ett_openflow_v4_group_features_types;
639 static int ett_openflow_v4_group_features_capabilities;
640 static int ett_openflow_v4_group_features_actions_all;
641 static int ett_openflow_v4_group_features_actions_select;
642 static int ett_openflow_v4_group_features_actions_indirect;
643 static int ett_openflow_v4_group_features_actions_ff;
644 static int ett_openflow_v4_meter_band_stats;
645 static int ett_openflow_v4_meter_stats;
646 static int ett_openflow_v4_meter_config;
647 static int ett_openflow_v4_meter_config_flags;
648 static int ett_openflow_v4_meter_features_band_types;
649 static int ett_openflow_v4_meter_features_capabilities;
650 static int ett_openflow_v4_multipart_reply_flags;
651 static int ett_openflow_v4_queue_prop;
652 static int ett_openflow_v4_packet_queue;
653 static int ett_openflow_v4_async_config_packet_in_mask_master;
654 static int ett_openflow_v4_async_config_packet_in_mask_slave;
655 static int ett_openflow_v4_async_config_port_status_mask_master;
656 static int ett_openflow_v4_async_config_port_status_mask_slave;
657 static int ett_openflow_v4_async_config_flow_removed_mask_master;
658 static int ett_openflow_v4_async_config_flow_removed_mask_slave;
659 static int ett_openflow_v4_metermod_flags;
661 static expert_field ei_openflow_v4_match_undecoded;
662 static expert_field ei_openflow_v4_oxm_undecoded;
663 static expert_field ei_openflow_v4_action_undecoded;
664 static expert_field ei_openflow_v4_instruction_undecoded;
665 static expert_field ei_openflow_v4_meter_band_undecoded;
666 static expert_field ei_openflow_v4_hello_element_undecoded;
667 static expert_field ei_openflow_v4_error_undecoded;
668 static expert_field ei_openflow_v4_experimenter_undecoded;
669 static expert_field ei_openflow_v4_table_feature_prop_undecoded;
670 static expert_field ei_openflow_v4_multipart_request_undecoded;
671 static expert_field ei_openflow_v4_multipart_reply_undecoded;
672 static expert_field ei_openflow_v4_queue_prop_undecoded;
673 static expert_field ei_openflow_v4_message_undecoded;
675 static const value_string openflow_v4_version_values[] = {
676 { 0x04, "1.3" },
677 { 0, NULL }
680 #define OFPT_HELLO 0
681 #define OFPT_ERROR 1
682 #define OFPT_ECHO_REQUEST 2
683 #define OFPT_ECHO_REPLY 3
684 #define OFPT_EXPERIMENTER 4
685 #define OFPT_FEATURES_REQUEST 5
686 #define OFPT_FEATURES_REPLY 6
687 #define OFPT_GET_CONFIG_REQUEST 7
688 #define OFPT_GET_CONFIG_REPLY 8
689 #define OFPT_SET_CONFIG 9
690 #define OFPT_PACKET_IN 10
691 #define OFPT_FLOW_REMOVED 11
692 #define OFPT_PORT_STATUS 12
693 #define OFPT_PACKET_OUT 13
694 #define OFPT_FLOW_MOD 14
695 #define OFPT_GROUP_MOD 15
696 #define OFPT_PORT_MOD 16
697 #define OFPT_TABLE_MOD 17
698 #define OFPT_MULTIPART_REQUEST 18
699 #define OFPT_MULTIPART_REPLY 19
700 #define OFPT_BARRIER_REQUEST 20
701 #define OFPT_BARRIER_REPLY 21
702 #define OFPT_QUEUE_GET_CONFIG_REQUEST 22
703 #define OFPT_QUEUE_GET_CONFIG_REPLY 23
704 #define OFPT_ROLE_REQUEST 24
705 #define OFPT_ROLE_REPLY 25
706 #define OFPT_GET_ASYNC_REQUEST 26
707 #define OFPT_GET_ASYNC_REPLY 27
708 #define OFPT_SET_ASYNC 28
709 #define OFPT_METER_MOD 29
710 static const value_string openflow_v4_type_values[] = {
711 { OFPT_HELLO, "OFPT_HELLO" },
712 { OFPT_ERROR, "OFPT_ERROR" },
713 { OFPT_ECHO_REQUEST, "OFPT_ECHO_REQUEST" },
714 { OFPT_ECHO_REPLY, "OFPT_ECHO_REPLY" },
715 { OFPT_EXPERIMENTER, "OFPT_EXPERIMENTER" },
716 { OFPT_FEATURES_REQUEST, "OFPT_FEATURES_REQUEST" },
717 { OFPT_FEATURES_REPLY, "OFPT_FEATURES_REPLY" },
718 { OFPT_GET_CONFIG_REQUEST, "OFPT_GET_CONFIG_REQUEST" },
719 { OFPT_GET_CONFIG_REPLY, "OFPT_GET_CONFIG_REPLY" },
720 { OFPT_SET_CONFIG, "OFPT_SET_CONFIG" },
721 { OFPT_PACKET_IN, "OFPT_PACKET_IN" },
722 { OFPT_FLOW_REMOVED, "OFPT_FLOW_REMOVED" },
723 { OFPT_PORT_STATUS, "OFPT_PORT_STATUS" },
724 { OFPT_PACKET_OUT, "OFPT_PACKET_OUT" },
725 { OFPT_FLOW_MOD, "OFPT_FLOW_MOD" },
726 { OFPT_GROUP_MOD, "OFPT_GROUP_MOD" },
727 { OFPT_PORT_MOD, "OFPT_PORT_MOD" },
728 { OFPT_TABLE_MOD, "OFPT_TABLE_MOD" },
729 { OFPT_MULTIPART_REQUEST, "OFPT_MULTIPART_REQUEST" },
730 { OFPT_MULTIPART_REPLY, "OFPT_MULTIPART_REPLY" },
731 { OFPT_BARRIER_REQUEST, "OFPT_BARRIER_REQUEST" },
732 { OFPT_BARRIER_REPLY, "OFPT_BARRIER_REPLY" },
733 { OFPT_QUEUE_GET_CONFIG_REQUEST, "OFPT_QUEUE_GET_CONFIG_REQUEST" },
734 { OFPT_QUEUE_GET_CONFIG_REPLY, "OFPT_QUEUE_GET_CONFIG_REPLY" },
735 { OFPT_ROLE_REQUEST, "OFPT_ROLE_REQUEST" },
736 { OFPT_ROLE_REPLY, "OFPT_ROLE_REPLY" },
737 { OFPT_GET_ASYNC_REQUEST, "OFPT_GET_ASYNC_REQUEST" },
738 { OFPT_GET_ASYNC_REPLY, "OFPT_GET_ASYNC_REPLY" },
739 { OFPT_SET_ASYNC, "OFPT_SET_ASYNC" },
740 { OFPT_METER_MOD, "OFPT_METER_MOD" },
741 { 0, NULL }
743 static value_string_ext openflow_v4_type_values_ext = VALUE_STRING_EXT_INIT(openflow_v4_type_values);
745 static int
746 dissect_openflow_header_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
748 /* uint8_t version; */
749 proto_tree_add_item(tree, hf_openflow_v4_version, tvb, offset, 1, ENC_BIG_ENDIAN);
750 offset++;
752 /* uint8_t type; */
753 proto_tree_add_item(tree, hf_openflow_v4_type, tvb, offset, 1, ENC_BIG_ENDIAN);
754 offset++;
756 /* uint16_t length; */
757 proto_tree_add_item(tree, hf_openflow_v4_length, tvb, offset, 2, ENC_BIG_ENDIAN);
758 offset+=2;
760 /* uint32_t xid; */
761 proto_tree_add_item(tree, hf_openflow_v4_xid, tvb, offset, 4, ENC_BIG_ENDIAN);
762 offset+=4;
764 return offset;
767 #define OFPP_MAX 0xffffff00 /* Last usable port number. */
768 static const value_string openflow_v4_port_reserved_values[] = {
769 { 0xfffffff8, "OFPP_IN_PORT" },
770 { 0xfffffff9, "OFPP_TABLE" },
771 { 0xfffffffa, "OFPP_NORMAL" },
772 { 0xfffffffb, "OFPP_FLOOD" },
773 { 0xfffffffc, "OFPP_ALL" },
774 { 0xfffffffd, "OFPP_CONTROLLER" },
775 { 0xfffffffe, "OFPP_LOCAL" },
776 { 0xffffffff, "OFPP_ANY" },
777 { 0, NULL }
780 #define OFPG_MAX 0xffffff00 /* Last usable group number. */
781 static const value_string openflow_v4_group_reserved_values[] = {
782 { 0xfffffffc, "OFPG_ALL" },
783 { 0xffffffff, "OFPG_ANY" },
784 { 0, NULL }
787 #define OFPTT_MAX 254 /* Last usable table number. */
788 static const value_string openflow_v4_table_reserved_values[] = {
789 { 255, "OFPTT_ALL"},
790 { 0, NULL}
794 #define OFP_NO_BUFFER 0xffffffff /* No buffering. */
795 static const value_string openflow_v4_buffer_reserved_values[] = {
796 { 0xffffffff, "OFP_NO_BUFFER" },
797 { 0, NULL}
800 #define OFPXMC_NXM_0 0x0000 /* Backward compatibility with NXM */
801 #define OFPXMC_NXM_1 0x0001 /* Backward compatibility with NXM */
802 #define OFPXMC_OPENFLOW_BASIC 0x8000 /* Basic class for OpenFlow */
803 #define OFPXMC_EXPERIMENTER 0xFFFF /* Experimenter class */
804 static const value_string openflow_v4_oxm_class_values[] = {
805 { 0x0000, "OFPXMC_NMX_0" },
806 { 0x0001, "OFPXMC_NXM_1" },
807 { 0x8000, "OFPXMC_OPENFLOW_BASIC" },
808 { 0xFFFF, "OFPXMC_EXPERIMENTER" },
809 { 0, NULL}
812 #define OFPXMT_OFB_IN_PORT 0
813 #define OFPXMT_OFB_IN_PHY_PORT 1
814 #define OFPXMT_OFB_METADATA 2
815 #define OFPXMT_OFB_ETH_DST 3
816 #define OFPXMT_OFB_ETH_SRC 4
817 #define OFPXMT_OFB_ETH_TYPE 5
818 #define OFPXMT_OFB_VLAN_VID 6
819 #define OFPXMT_OFB_VLAN_PCP 7
820 #define OFPXMT_OFB_IP_DSCP 8
821 #define OFPXMT_OFB_IP_ECN 9
822 #define OFPXMT_OFB_IP_PROTO 10
823 #define OFPXMT_OFB_IPV4_SRC 11
824 #define OFPXMT_OFB_IPV4_DST 12
825 #define OFPXMT_OFB_TCP_SRC 13
826 #define OFPXMT_OFB_TCP_DST 14
827 #define OFPXMT_OFB_UDP_SRC 15
828 #define OFPXMT_OFB_UDP_DST 16
829 #define OFPXMT_OFB_SCTP_SRC 17
830 #define OFPXMT_OFB_SCTP_DST 18
831 #define OFPXMT_OFB_ICMPV4_TYPE 19
832 #define OFPXMT_OFB_ICMPV4_CODE 20
833 #define OFPXMT_OFB_ARP_OP 21
834 #define OFPXMT_OFB_ARP_SPA 22
835 #define OFPXMT_OFB_ARP_TPA 23
836 #define OFPXMT_OFB_ARP_SHA 24
837 #define OFPXMT_OFB_ARP_THA 25
838 #define OFPXMT_OFB_IPV6_SRC 26
839 #define OFPXMT_OFB_IPV6_DST 27
840 #define OFPXMT_OFB_IPV6_FLABEL 28
841 #define OFPXMT_OFB_ICMPV6_TYPE 29
842 #define OFPXMT_OFB_ICMPV6_CODE 30
843 #define OFPXMT_OFB_IPV6_ND_TARGET 31
844 #define OFPXMT_OFB_IPV6_ND_SLL 32
845 #define OFPXMT_OFB_IPV6_ND_TLL 33
846 #define OFPXMT_OFB_MPLS_LABEL 34
847 #define OFPXMT_OFB_MPLS_TC 35
848 #define OFPXMT_OFP_MPLS_BOS 36
849 #define OFPXMT_OFB_PBB_ISID 37
850 #define OFPXMT_OFB_TUNNEL_ID 38
851 #define OFPXMT_OFB_IPV6_EXTHDR 39
852 static const value_string openflow_v4_oxm_basic_field_values[] = {
853 { 0, "OFPXMT_OFB_IN_PORT" },
854 { 1, "OFPXMT_OFB_IN_PHY_PORT" },
855 { 2, "OFPXMT_OFB_METADATA" },
856 { 3, "OFPXMT_OFB_ETH_DST" },
857 { 4, "OFPXMT_OFB_ETH_SRC" },
858 { 5, "OFPXMT_OFB_ETH_TYPE" },
859 { 6, "OFPXMT_OFB_VLAN_VID" },
860 { 7, "OFPXMT_OFB_VLAN_PCP" },
861 { 8, "OFPXMT_OFB_IP_DSCP" },
862 { 9, "OFPXMT_OFB_IP_ECN" },
863 { 10, "OFPXMT_OFB_IP_PROTO" },
864 { 11, "OFPXMT_OFB_IPV4_SRC" },
865 { 12, "OFPXMT_OFB_IPV4_DST" },
866 { 13, "OFPXMT_OFB_TCP_SRC" },
867 { 14, "OFPXMT_OFB_TCP_DST" },
868 { 15, "OFPXMT_OFB_UDP_SRC" },
869 { 16, "OFPXMT_OFB_UDP_DST" },
870 { 17, "OFPXMT_OFB_SCTP_SRC" },
871 { 18, "OFPXMT_OFB_SCTP_DST" },
872 { 19, "OFPXMT_OFB_ICMPV4_TYPE" },
873 { 20, "OFPXMT_OFB_ICMPV4_CODE" },
874 { 21, "OFPXMT_OFB_ARP_OP" },
875 { 22, "OFPXMT_OFB_ARP_SPA" },
876 { 23, "OFPXMT_OFB_ARP_TPA" },
877 { 24, "OFPXMT_OFB_ARP_SHA" },
878 { 25, "OFPXMT_OFB_ARP_THA" },
879 { 26, "OFPXMT_OFB_IPV6_SRC" },
880 { 27, "OFPXMT_OFB_IPV6_DST" },
881 { 28, "OFPXMT_OFB_IPV6_FLABEL" },
882 { 29, "OFPXMT_OFB_ICMPV6_TYPE" },
883 { 30, "OFPXMT_OFB_ICMPV6_CODE" },
884 { 31, "OFPXMT_OFB_IPV6_ND_TARGET" },
885 { 32, "OFPXMT_OFB_IPV6_ND_SLL" },
886 { 33, "OFPXMT_OFB_IPV6_ND_TLL" },
887 { 34, "OFPXMT_OFB_MPLS_LABEL" },
888 { 35, "OFPXMT_OFB_MPLS_TC" },
889 { 36, "OFPXMT_OFP_MPLS_BOS" },
890 { 37, "OFPXMT_OFB_PBB_ISID" },
891 { 38, "OFPXMT_OFB_TUNNEL_ID" },
892 { 39, "OFPXMT_OFB_IPV6_EXTHDR" },
893 { 0, NULL }
895 static value_string_ext openflow_v4_oxm_basic_field_values_ext = VALUE_STRING_EXT_INIT(openflow_v4_oxm_basic_field_values);
897 #define OXM_FIELD_MASK 0xfe
898 #define OXM_FIELD_OFFSET 1
899 #define OXM_HM_MASK 0x01
900 static int
901 dissect_openflow_oxm_header_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
903 uint16_t oxm_class;
905 /* oxm_class */
906 oxm_class = tvb_get_ntohs(tvb, offset);
907 proto_tree_add_item(tree, hf_openflow_v4_oxm_class, tvb, offset, 2, ENC_BIG_ENDIAN);
908 offset+=2;
910 /* oxm_field */
911 if (oxm_class == OFPXMC_OPENFLOW_BASIC) {
912 proto_tree_add_bits_item(tree, hf_openflow_v4_oxm_field_basic, tvb, (offset * 8), 7, ENC_NA);
913 } else {
914 proto_tree_add_bits_item(tree, hf_openflow_v4_oxm_field, tvb, (offset * 8), 7, ENC_NA);
917 /* oxm_hm */
918 proto_tree_add_bits_item(tree, hf_openflow_v4_oxm_hm, tvb, (offset * 8) + 7, 1, ENC_NA);
919 offset+=1;
921 /* oxm_length */
922 proto_tree_add_item(tree, hf_openflow_v4_oxm_length, tvb, offset, 1, ENC_BIG_ENDIAN);
923 offset+=1;
925 return offset;
929 #define OFPVID_PRESENT 0x1000
930 static int
931 dissect_openflow_oxm_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
933 proto_tree *oxm_tree;
934 uint16_t oxm_class;
935 uint16_t oxm_end;
936 uint8_t oxm_field_hm;
937 uint8_t oxm_hm;
938 uint8_t oxm_field;
939 uint8_t oxm_length;
940 uint8_t field_length;
942 oxm_class = tvb_get_ntohs(tvb, offset);
943 oxm_field_hm = tvb_get_uint8(tvb, offset + 2);
944 oxm_length = tvb_get_uint8(tvb, offset + 3);
945 oxm_end = offset + 4 + oxm_length;
947 oxm_field = (oxm_field_hm & OXM_FIELD_MASK) >> OXM_FIELD_OFFSET;
948 oxm_hm = oxm_field_hm & OXM_HM_MASK;
949 field_length = (oxm_hm == 0) ? oxm_length : (oxm_length / 2);
951 oxm_tree = proto_tree_add_subtree(tree, tvb, offset, oxm_length + 4, ett_openflow_v4_oxm, NULL, "OXM field");
953 offset = dissect_openflow_oxm_header_v4(tvb, pinfo, oxm_tree, offset, length);
955 if (oxm_class == OFPXMC_OPENFLOW_BASIC) {
956 switch(oxm_field) {
957 case OFPXMT_OFB_IN_PORT:
958 case OFPXMT_OFB_IN_PHY_PORT:
959 proto_tree_add_item(oxm_tree, hf_openflow_v4_oxm_value_uint32, tvb, offset, 4, ENC_BIG_ENDIAN);
960 offset+=4;
961 break;
963 case OFPXMT_OFB_ETH_DST:
964 case OFPXMT_OFB_ETH_SRC:
965 case OFPXMT_OFB_ARP_SHA:
966 case OFPXMT_OFB_ARP_THA:
967 case OFPXMT_OFB_IPV6_ND_SLL: /*The source link-layer address option in an IPv6 Neighbor Discovery message */
968 case OFPXMT_OFB_IPV6_ND_TLL: /*The target link-layer address option in an IPv6 Neighbor Discovery message */
969 proto_tree_add_item(oxm_tree, hf_openflow_v4_oxm_value_etheraddr, tvb, offset, 6, ENC_NA);
970 offset+=6;
971 if (oxm_hm) {
972 proto_tree_add_item(oxm_tree, hf_openflow_v4_oxm_mask_etheraddr, tvb, offset, 6, ENC_NA);
973 offset+=6;
975 break;
977 case OFPXMT_OFB_ETH_TYPE:
978 proto_tree_add_item(oxm_tree, hf_openflow_v4_oxm_value_ethertype, tvb, offset, 2, ENC_BIG_ENDIAN);
979 offset+=2;
980 break;
982 case OFPXMT_OFB_VLAN_VID:
983 proto_tree_add_item(oxm_tree, hf_openflow_v4_oxm_value_vlan_present, tvb, offset, 2, ENC_BIG_ENDIAN);
984 proto_tree_add_item(oxm_tree, hf_openflow_v4_oxm_value_vlan_vid, tvb, offset, 2, ENC_BIG_ENDIAN);
985 offset+=2;
986 if (oxm_hm) {
987 proto_tree_add_item(oxm_tree, hf_openflow_v4_oxm_mask_vlan, tvb, offset, 2, ENC_NA);
988 offset+=2;
990 break;
992 case OFPXMT_OFB_IP_PROTO:
993 proto_tree_add_item(oxm_tree, hf_openflow_v4_oxm_value_ipproto, tvb, offset, 1, ENC_BIG_ENDIAN);
994 offset+=1;
995 break;
997 case OFPXMT_OFB_IPV4_SRC:
998 case OFPXMT_OFB_IPV4_DST:
999 case OFPXMT_OFB_ARP_SPA:
1000 case OFPXMT_OFB_ARP_TPA:
1001 proto_tree_add_item(oxm_tree, hf_openflow_v4_oxm_value_ipv4addr, tvb, offset, 4, ENC_BIG_ENDIAN);
1002 offset+=4;
1003 if (oxm_hm) {
1004 proto_tree_add_item(oxm_tree, hf_openflow_v4_oxm_mask_ipv4addr, tvb, offset, 4, ENC_BIG_ENDIAN);
1005 offset+=4;
1007 break;
1009 case OFPXMT_OFB_TCP_SRC:
1010 case OFPXMT_OFB_TCP_DST:
1011 case OFPXMT_OFB_UDP_SRC:
1012 case OFPXMT_OFB_UDP_DST:
1013 case OFPXMT_OFB_SCTP_SRC:
1014 case OFPXMT_OFB_SCTP_DST:
1015 proto_tree_add_item(oxm_tree, hf_openflow_v4_oxm_value_uint16, tvb, offset, 2, ENC_BIG_ENDIAN);
1016 offset+=2;
1017 break;
1019 case OFPXMT_OFB_IPV6_SRC:
1020 case OFPXMT_OFB_IPV6_DST:
1021 proto_tree_add_item(oxm_tree, hf_openflow_v4_oxm_value_ipv6addr, tvb, offset, 16, ENC_NA);
1022 offset+=16;
1023 if (oxm_hm) {
1024 proto_tree_add_item(oxm_tree, hf_openflow_v4_oxm_mask_ipv6addr, tvb, offset, 16, ENC_NA);
1025 offset+=16;
1027 break;
1029 case OFPXMT_OFB_MPLS_LABEL:
1030 /* size differs in specification and header file */
1031 if (field_length == 3) {
1032 proto_tree_add_item(oxm_tree, hf_openflow_v4_oxm_value_uint24, tvb, offset, 3, ENC_BIG_ENDIAN);
1033 offset+=3;
1034 } else if (field_length == 4) {
1035 proto_tree_add_item(oxm_tree, hf_openflow_v4_oxm_value_uint32, tvb, offset, 4, ENC_BIG_ENDIAN);
1036 offset+=4;
1038 break;
1040 default:
1041 /* value */
1042 if (field_length > 0) {
1043 proto_tree_add_item(oxm_tree, hf_openflow_v4_oxm_value, tvb, offset, field_length, ENC_NA);
1044 offset += field_length;
1047 /* mask */
1048 if (field_length > 0 && oxm_hm != 0) {
1049 proto_tree_add_item(oxm_tree, hf_openflow_v4_oxm_mask, tvb, offset, field_length, ENC_NA);
1050 offset += field_length;
1052 break;
1055 if(oxm_end > offset){
1056 proto_tree_add_expert_format(oxm_tree, pinfo, &ei_openflow_v4_oxm_undecoded,
1057 tvb, offset, oxm_end-offset, "Undecoded Data");
1058 offset = oxm_end;
1061 } else if (oxm_class == OFPXMC_EXPERIMENTER) {
1062 /* uint32_t experimenter; */
1063 proto_tree_add_item(oxm_tree, hf_openflow_v4_oxm_experimenter_experimenter, tvb, offset, 4, ENC_BIG_ENDIAN);
1064 offset+=4;
1065 proto_tree_add_item(oxm_tree, hf_openflow_v4_oxm_experimenter_value, tvb, offset, oxm_length - 4, ENC_NA);
1066 offset+=(oxm_length - 4);
1067 } else {
1068 proto_tree_add_expert_format(oxm_tree, pinfo, &ei_openflow_v4_oxm_undecoded,
1069 tvb, offset, oxm_length, "Unknown OXM body.");
1070 offset+=oxm_length;
1073 return offset;
1076 #define OFPMT_STANDARD 0 /* Standard Match. Deprecated. */
1077 #define OFPMT_OXM 1 /* OpenFlow Extensible Match */
1078 static const value_string openflow_v4_match_type_values[] = {
1079 { 0, "OFPMT_STANDARD" },
1080 { 1, "OFPMT_OXM" },
1081 { 0, NULL }
1084 static int
1085 dissect_openflow_match_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
1087 proto_item *ti;
1088 proto_tree *match_tree;
1089 uint16_t match_type;
1090 uint16_t match_length;
1091 int32_t fields_end;
1092 uint16_t pad_length;
1094 match_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_openflow_v4_match, &ti, "Match");
1096 /* uint16_t type; */
1097 match_type = tvb_get_ntohs(tvb, offset);
1098 proto_tree_add_item(match_tree, hf_openflow_v4_match_type, tvb, offset, 2, ENC_BIG_ENDIAN);
1099 offset+=2;
1101 /* uint16_t length; (excluding padding) */
1102 match_length = tvb_get_ntohs(tvb, offset);
1103 pad_length = (match_length + 7)/8*8 - match_length;
1104 proto_item_set_len(ti, match_length + pad_length);
1105 proto_tree_add_item(match_tree, hf_openflow_v4_match_length, tvb, offset, 2, ENC_BIG_ENDIAN);
1106 offset+=2;
1108 /* body */
1109 switch (match_type) {
1110 case OFPMT_STANDARD:
1111 proto_tree_add_expert_format(match_tree, pinfo, &ei_openflow_v4_match_undecoded,
1112 tvb, offset, match_length - 4, "Standard match body (deprecated).");
1113 if (match_length > 4)
1114 offset+=match_length-4;
1115 break;
1117 case OFPMT_OXM:
1118 fields_end = offset + match_length - 4;
1119 while(offset < fields_end) {
1120 offset = dissect_openflow_oxm_v4(tvb, pinfo, match_tree, offset, length);
1122 break;
1124 default:
1125 proto_tree_add_expert_format(match_tree, pinfo, &ei_openflow_v4_match_undecoded,
1126 tvb, offset, match_length - 4, "Unknown match body.");
1127 if (match_length > 4)
1128 offset+=match_length-4;
1129 break;
1132 /* pad; Exactly ((length + 7)/8*8 - length) (between 0 and 7) bytes of all-zero bytes. */
1133 if (pad_length > 0) {
1134 proto_tree_add_item(match_tree, hf_openflow_v4_match_pad, tvb, offset, pad_length, ENC_NA);
1135 offset+=pad_length;
1138 return offset;
1141 #define OFPM_MAX 0xffffff00 /* Last usable meter number. */
1142 static const value_string openflow_v4_meter_id_reserved_values[] = {
1143 { 0xfffffffd, "OFPM_SLOWPATH" },
1144 { 0xfffffffe, "OFPM_CONTROLLER" },
1145 { 0xffffffff, "OFPM_ALL" },
1146 { 0, NULL }
1149 #define OFPMBT_DROP 1
1150 #define OFPMBT_DSCP_REMARK 2
1151 #define OFPMBT_EXPERIMENTER 0xFFFF
1152 static const value_string openflow_v4_meter_band_type_values[] = {
1153 { OFPMBT_DROP, "OFPMBT_DROP" },
1154 { OFPMBT_DSCP_REMARK, "OFPMBT_DSCP_REMARK" },
1155 { OFPMBT_EXPERIMENTER, "OFPMBT_EXPERIMENTER" },
1156 { 0, NULL }
1159 #define OFPMF_KBPS 1 << 0
1160 #define OFPMF_PKTPS 1 << 1
1161 #define OFPMF_BURST 1 << 2
1162 #define OFPMF_STATS 1 << 3
1164 static int
1165 dissect_openflow_meter_band_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
1167 proto_item *ti;
1168 proto_tree *band_tree;
1169 uint16_t band_type;
1170 uint16_t band_len;
1172 band_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_openflow_v4_meter_band, &ti, "Meter band");
1174 /* uint16_t type; */
1175 band_type = tvb_get_ntohs(tvb, offset);
1176 proto_tree_add_item(band_tree, hf_openflow_v4_meter_band_type, tvb, offset, 2, ENC_BIG_ENDIAN);
1177 offset+=2;
1179 /* uint16_t len; */
1180 band_len = tvb_get_ntohs(tvb, offset);
1181 proto_item_set_len(ti, band_len);
1182 proto_tree_add_item(band_tree, hf_openflow_v4_meter_band_len, tvb, offset, 2, ENC_BIG_ENDIAN);
1183 offset+=2;
1185 /* uint32_t rate; */
1186 proto_tree_add_item(band_tree, hf_openflow_v4_meter_band_rate, tvb, offset, 4, ENC_BIG_ENDIAN);
1187 offset+=4;
1189 /* uint32_t burst_size; */
1190 proto_tree_add_item(band_tree, hf_openflow_v4_meter_band_burst_size, tvb, offset, 4, ENC_BIG_ENDIAN);
1191 offset+=4;
1193 switch (band_type) {
1194 case OFPMBT_DROP:
1195 /* uint8_t pad[4]; */
1196 proto_tree_add_item(band_tree, hf_openflow_v4_meter_band_drop_pad, tvb, offset, 4, ENC_NA);
1197 offset+=4;
1198 break;
1200 case OFPMBT_DSCP_REMARK:
1201 /* uint8_t prec_level; */
1202 proto_tree_add_item(band_tree, hf_openflow_v4_meter_band_dscp_remark_prec_level, tvb, offset, 1, ENC_BIG_ENDIAN);
1203 offset+=1;
1205 /* uint8_t pad[3]; */
1206 proto_tree_add_item(band_tree, hf_openflow_v4_meter_band_dscp_remark_pad, tvb, offset, 3, ENC_NA);
1207 offset+=3;
1208 break;
1210 case OFPMBT_EXPERIMENTER:
1211 /* uint32_t experimenter; */
1212 proto_tree_add_item(band_tree, hf_openflow_v4_meter_band_experimenter_experimenter, tvb, offset, 4, ENC_BIG_ENDIAN);
1213 offset+=4;
1215 /* uint32_t experimenter_data[0]; */
1216 proto_tree_add_expert_format(band_tree, pinfo, &ei_openflow_v4_meter_band_undecoded,
1217 tvb, offset, offset - 16 + band_len, "Experimenter meter band body.");
1218 if (band_len > 16)
1219 offset+=band_len-16;
1220 break;
1222 default:
1223 proto_tree_add_expert_format(band_tree, pinfo, &ei_openflow_v4_meter_band_undecoded,
1224 tvb, offset, offset - 12 + band_len, "Unknown meter band body.");
1225 if (band_len > 12)
1226 offset+=band_len-12;
1227 break;
1230 return offset;
1234 #define OFPHET_VERSIONBITMAP 1
1235 static const value_string openflow_v4_hello_element_type_values[] = {
1236 { 1, "OFPHET_VERSIONBITMAP" },
1237 { 0, NULL }
1240 static int
1241 dissect_openflow_hello_element_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length)
1243 proto_tree *elem_tree;
1244 uint16_t elem_type;
1245 uint16_t elem_length;
1246 uint16_t pad_length;
1248 elem_tree = proto_tree_add_subtree(tree, tvb, offset, length - offset, ett_openflow_v4_hello_element, NULL, "Element");
1250 /* uint16_t type; */
1251 elem_type = tvb_get_ntohs(tvb, offset);
1252 proto_tree_add_item(elem_tree, hf_openflow_v4_hello_element_type, tvb, offset, 2, ENC_BIG_ENDIAN);
1253 offset+=2;
1255 /* uint16_t length; */
1256 elem_length = tvb_get_ntohs(tvb, offset);
1257 pad_length = (elem_length + 7)/8*8 - elem_length;
1258 proto_tree_add_item(elem_tree, hf_openflow_v4_hello_element_length, tvb, offset, 2, ENC_BIG_ENDIAN);
1259 offset+=2;
1261 switch (elem_type) {
1262 case OFPHET_VERSIONBITMAP:
1263 /* bitmap */
1264 proto_tree_add_item(elem_tree, hf_openflow_v4_hello_element_version_bitmap, tvb, offset, elem_length - 4, ENC_NA);
1265 if (elem_length > 4)
1266 offset += elem_length - 4;
1267 break;
1269 default:
1270 proto_tree_add_expert_format(tree, pinfo, &ei_openflow_v4_hello_element_undecoded,
1271 tvb, offset, elem_length - 4, "Unknown hello element body.");
1272 if (elem_length > 4)
1273 offset += elem_length - 4;
1274 break;
1277 if (pad_length > 0) {
1278 proto_tree_add_item(tree, hf_openflow_v4_hello_element_pad, tvb, offset, pad_length, ENC_NA);
1279 offset+=pad_length;
1282 return offset;
1285 static void
1286 dissect_openflow_hello_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length)
1289 while (offset < length) {
1290 offset = dissect_openflow_hello_element_v4(tvb, pinfo, tree, offset, length);
1295 #define OFPET_HELLO_FAILED 0
1296 #define OFPET_BAD_REQUEST 1
1297 #define OFPET_BAD_ACTION 2
1298 #define OFPET_BAD_INSTRUCTION 3
1299 #define OFPET_BAD_MATCH 4
1300 #define OFPET_FLOW_MOD_FAILED 5
1301 #define OFPET_GROUP_MOD_FAILED 6
1302 #define OFPET_PORT_MOD_FAILED 7
1303 #define OFPET_TABLE_MOD_FAILED 8
1304 #define OFPET_QUEUE_OP_FAILED 9
1305 #define OFPET_SWITCH_CONFIG_FAILED 10
1306 #define OFPET_ROLE_REQUEST_FAILED 11
1307 #define OFPET_METER_MOD_FAILED 12
1308 #define OFPET_TABLE_FEATURES_FAILED 13
1309 #define OFPET_EXPERIMENTER 0xffff
1310 static const value_string openflow_v4_error_type_values[] = {
1311 { 0, "OFPET_HELLO_FAILED" },
1312 { 1, "OFPET_BAD_REQUEST" },
1313 { 2, "OFPET_BAD_ACTION" },
1314 { 3, "OFPET_BAD_INSTRUCTION" },
1315 { 4, "OFPET_BAD_MATCH" },
1316 { 5, "OFPET_FLOW_MOD_FAILED" },
1317 { 6, "OFPET_GROUP_MOD_FAILED" },
1318 { 7, "OFPET_PORT_MOD_FAILED" },
1319 { 8, "OFPET_TABLE_MOD_FAILED" },
1320 { 9, "OFPET_QUEUE_OP_FAILED" },
1321 { 10, "OFPET_SWITCH_CONFIG_FAILED" },
1322 { 11, "OFPET_ROLE_REQUEST_FAILED" },
1323 { 12, "OFPET_METER_MOD_FAILED" },
1324 { 13, "OFPET_TABLE_FEATURES_FAILED" },
1325 { 0xffff, "OFPET_EXPERIMENTER" },
1326 { 0, NULL}
1329 static const value_string openflow_v4_error_hello_failed_code_values[] = {
1330 { 0, "OFPHFC_INCOMPATIBLE" },
1331 { 1, "OFPHFC_EPERM" },
1332 { 0, NULL }
1335 static const value_string openflow_v4_error_bad_request_code_values[] = {
1336 { 0, "OFPBRC_BAD_VERSION" },
1337 { 1, "OFPBRC_BAD_TYPE" },
1338 { 2, "OFPBRC_BAD_MULTIPART" },
1339 { 3, "OFPBRC_BAD_EXPERIMENTER" },
1340 { 4, "OFPBRC_BAD_EXP_TYPE" },
1341 { 5, "OFPBRC_EPERM" },
1342 { 6, "OFPBRC_BAD_LEN" },
1343 { 7, "OFPBRC_BUFFER_EMPTY" },
1344 { 8, "OFPBRC_BUFFER_UNKNOWN" },
1345 { 9, "OFPBRC_BAD_TABLE_ID" },
1346 { 10, "OFPBRC_IS_SLAVE" },
1347 { 11, "OFPBRC_BAD_PORT" },
1348 { 12, "OFPBRC_BAD_PACKET" },
1349 { 13, "OFPBRC_MULTIPART_BUFFER_OVERFLOW" },
1350 { 0, NULL }
1353 static const value_string openflow_v4_error_bad_action_code_values[] = {
1354 { 0, "OFPBAC_BAD_TYPE" },
1355 { 1, "OFPBAC_BAD_LEN" },
1356 { 2, "OFPBAC_BAD_EXPERIMENTER" },
1357 { 3, "OFPBAC_BAD_EXP_TYPE" },
1358 { 4, "OFPBAC_BAD_OUT_PORT" },
1359 { 5, "OFPBAC_BAD_ARGUMENT" },
1360 { 6, "OFPBAC_EPERM" },
1361 { 7, "OFPBAC_TOO_MANY" },
1362 { 8, "OFPBAC_BAD_QUEUE" },
1363 { 9, "OFPBAC_BAD_OUT_GROUP" },
1364 { 10, "OFPBAC_MATCH_INCONSISTENT" },
1365 { 11, "OFPBAC_UNSUPPORTED_ORDER" },
1366 { 12, "OFPBAC_BAD_TAG" },
1367 { 13, "OFPBAC_BAD_SET_TYPE" },
1368 { 14, "OFPBAC_BAD_SET_LEN" },
1369 { 15, "OFPBAC_BAD_SET_ARGUMENT" },
1370 { 0, NULL }
1373 static const value_string openflow_v4_error_bad_instruction_code_values[] = {
1374 { 0, "OFPBIC_UNKNOWN_INST" },
1375 { 1, "OFPBIC_UNSUP_INST" },
1376 { 2, "OFPBIC_BAD_TABLE_ID" },
1377 { 3, "OFPBIC_UNSUP_METADATA" },
1378 { 4, "OFPBIC_UNSUP_METADATA_MASK" },
1379 { 5, "OFPBIC_BAD_EXPERIMENTER" },
1380 { 6, "OFPBIC_BAD_EXP_TYPE" },
1381 { 7, "OFPBIC_BAD_LEN" },
1382 { 8, "OFPBIC_EPERM" },
1383 { 0, NULL }
1386 static const value_string openflow_v4_error_bad_match_code_values[] = {
1387 { 0, "OFPBMC_BAD_TYPE" },
1388 { 1, "OFPBMC_BAD_LEN" },
1389 { 2, "OFPBMC_BAD_TAG" },
1390 { 3, "OFPBMC_BAD_DL_ADDR_MASK" },
1391 { 4, "OFPBMC_BAD_NW_ADDR_MASK" },
1392 { 5, "OFPBMC_BAD_WILDCARDS" },
1393 { 6, "OFPBMC_BAD_FIELD" },
1394 { 7, "OFPBMC_BAD_VALUE" },
1395 { 8, "OFPBMC_BAD_MASK" },
1396 { 9, "OFPBMC_BAD_PREREQ" },
1397 { 10, "OFPBMC_DUP_FIELD" },
1398 { 11, "OFPBMC_EPERM" },
1399 { 0, NULL }
1402 static const value_string openflow_v4_error_flow_mod_failed_code_values[] = {
1403 { 0, "OFPFMFC_UNKNOWN" },
1404 { 1, "OFPFMFC_TABLE_FULL" },
1405 { 2, "OFPFMFC_BAD_TABLE_ID" },
1406 { 3, "OFPFMFC_OVERLAP" },
1407 { 4, "OFPFMFC_EPERM" },
1408 { 5, "OFPFMFC_BAD_TIMEOUT" },
1409 { 6, "OFPFMFC_BAD_COMMAND" },
1410 { 7, "OFPFMFC_BAD_FLAGS" },
1411 { 0, NULL }
1414 static const value_string openflow_v4_error_group_mod_failed_code_values[] = {
1415 { 0, "OFPGMFC_GROUP_EXISTS" },
1416 { 1, "OFPGMFC_INVALID_GROUP" },
1417 { 2, "OFPGMFC_WEIGHT_UNSUPPORTED" },
1418 { 3, "OFPGMFC_OUT_OF_GROUPS" },
1419 { 4, "OFPGMFC_OUT_OF_BUCKETS" },
1420 { 5, "OFPGMFC_CHAINING_UNSUPPORTED" },
1421 { 6, "OFPGMFC_WATCH_UNSUPPORTED" },
1422 { 7, "OFPGMFC_LOOP" },
1423 { 8, "OFPGMFC_UNKNOWN_GROUP" },
1424 { 9, "OFPGMFC_CHAINED_GROUP" },
1425 { 10, "OFPGMFC_BAD_TYPE" },
1426 { 11, "OFPGMFC_BAD_COMMAND" },
1427 { 12, "OFPGMFC_BAD_BUCKET" },
1428 { 13, "OFPGMFC_BAD_WATCH" },
1429 { 14, "OFPGMFC_EPERM" },
1430 { 0, NULL }
1433 static const value_string openflow_v4_error_port_mod_failed_code_values[] = {
1434 { 0, "OFPPMFC_BAD_PORT" },
1435 { 1, "OFPPMFC_BAD_HW_ADDR" },
1436 { 2, "OFPPMFC_BAD_CONFIG" },
1437 { 3, "OFPPMFC_BAD_ADVERTISE" },
1438 { 4, "OFPPMFC_EPERM" },
1439 { 0, NULL }
1442 static const value_string openflow_v4_error_table_mod_failed_code_values[] = {
1443 { 0, "OFPTMFC_BAD_TABLE" },
1444 { 1, "OFPTMFC_BAD_CONFIG" },
1445 { 2, "OFPTMFC_EPERM" },
1446 { 0, NULL }
1449 static const value_string openflow_v4_error_queue_op_failed_code_values[] = {
1450 { 0, "OFPQOFC_BAD_PORT" },
1451 { 1, "OFPQOFC_BAD_QUEUE" },
1452 { 2, "OFPQOFC_EPERM" },
1453 { 0, NULL }
1456 static const value_string openflow_v4_error_switch_config_failed_code_values[] = {
1457 { 0, "OFPSCFC_BAD_FLAGS" },
1458 { 1, "OFPSCFC_BAD_LEN" },
1459 { 2, "OFPQCFC_EPERM" },
1460 { 0, NULL }
1463 static const value_string openflow_v4_error_role_request_failed_code_values[] = {
1464 { 0, "OFPRRFC_STALE" },
1465 { 1, "OFPRRFC_UNSUP" },
1466 { 2, "OFPRRFC_BAD_ROLE" },
1467 { 0, NULL }
1470 static const value_string openflow_v4_error_meter_mod_failed_code_values[] = {
1471 { 0, "OFPMMFC_UNKNOWN" },
1472 { 1, "OFPMMFC_METER_EXISTS" },
1473 { 2, "OFPMMFC_INVALID_METER" },
1474 { 3, "OFPMMFC_UNKNOWN_METER" },
1475 { 4, "OFPMMFC_BAD_COMMAND" },
1476 { 5, "OFPMMFC_BAD_FLAGS" },
1477 { 6, "OFPMMFC_BAD_RATE" },
1478 { 7, "OFPMMFC_BAD_BURST" },
1479 { 8, "OFPMMFC_BAD_BAND" },
1480 { 9, "OFPMMFC_BAD_BAND_VALUE" },
1481 { 10, "OFPMMFC_OUT_OF_METERS" },
1482 { 11, "OFPMMFC_OUT_OF_BANDS" },
1483 { 0, NULL }
1486 static const value_string openflow_v4_error_table_features_failed_code_values[] = {
1487 { 0, "OFPTFFC_BAD_TABLE" },
1488 { 1, "OFPTFFC_BAD_METADATA" },
1489 { 2, "OFPTFFC_BAD_TYPE" },
1490 { 3, "OFPTFFC_BAD_LEN" },
1491 { 4, "OFPTFFC_BAD_ARGUMENT" },
1492 { 5, "OFPTFFC_EPERM" },
1493 { 0, NULL }
1496 static void
1497 // NOLINTNEXTLINE(misc-no-recursion)
1498 dissect_openflow_error_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length)
1500 proto_tree *data_tree;
1501 proto_item *data_ti;
1502 uint16_t error_type;
1504 /* uint16_t type; */
1505 error_type = tvb_get_ntohs(tvb, offset);
1506 proto_tree_add_item(tree, hf_openflow_v4_error_type, tvb, offset, 2, ENC_BIG_ENDIAN);
1507 offset +=2;
1509 /* uint16_t code; */
1510 switch(error_type) {
1511 case OFPET_HELLO_FAILED:
1512 proto_tree_add_item(tree, hf_openflow_v4_error_hello_failed_code, tvb, offset, 2, ENC_BIG_ENDIAN);
1513 break;
1514 case OFPET_BAD_REQUEST:
1515 proto_tree_add_item(tree, hf_openflow_v4_error_bad_request_code, tvb, offset, 2, ENC_BIG_ENDIAN);
1516 break;
1517 case OFPET_BAD_ACTION:
1518 proto_tree_add_item(tree, hf_openflow_v4_error_bad_action_code, tvb, offset, 2, ENC_BIG_ENDIAN);
1519 break;
1520 case OFPET_BAD_INSTRUCTION:
1521 proto_tree_add_item(tree, hf_openflow_v4_error_bad_instruction_code, tvb, offset, 2, ENC_BIG_ENDIAN);
1522 break;
1523 case OFPET_BAD_MATCH:
1524 proto_tree_add_item(tree, hf_openflow_v4_error_bad_match_code, tvb, offset, 2, ENC_BIG_ENDIAN);
1525 break;
1526 case OFPET_FLOW_MOD_FAILED:
1527 proto_tree_add_item(tree, hf_openflow_v4_error_flow_mod_failed_code, tvb, offset, 2, ENC_BIG_ENDIAN);
1528 break;
1529 case OFPET_GROUP_MOD_FAILED:
1530 proto_tree_add_item(tree, hf_openflow_v4_error_group_mod_failed_code, tvb, offset, 2, ENC_BIG_ENDIAN);
1531 break;
1532 case OFPET_PORT_MOD_FAILED:
1533 proto_tree_add_item(tree, hf_openflow_v4_error_port_mod_failed_code, tvb, offset, 2, ENC_BIG_ENDIAN);
1534 break;
1535 case OFPET_TABLE_MOD_FAILED:
1536 proto_tree_add_item(tree, hf_openflow_v4_error_table_mod_failed_code, tvb, offset, 2, ENC_BIG_ENDIAN);
1537 break;
1538 case OFPET_QUEUE_OP_FAILED:
1539 proto_tree_add_item(tree, hf_openflow_v4_error_queue_op_failed_code, tvb, offset, 2, ENC_BIG_ENDIAN);
1540 break;
1541 case OFPET_SWITCH_CONFIG_FAILED:
1542 proto_tree_add_item(tree, hf_openflow_v4_error_switch_config_failed_code, tvb, offset, 2, ENC_BIG_ENDIAN);
1543 break;
1544 case OFPET_ROLE_REQUEST_FAILED:
1545 proto_tree_add_item(tree, hf_openflow_v4_error_role_request_failed_code, tvb, offset, 2, ENC_BIG_ENDIAN);
1546 break;
1547 case OFPET_METER_MOD_FAILED:
1548 proto_tree_add_item(tree, hf_openflow_v4_error_meter_mod_failed_code, tvb, offset, 2, ENC_BIG_ENDIAN);
1549 break;
1550 case OFPET_TABLE_FEATURES_FAILED:
1551 proto_tree_add_item(tree, hf_openflow_v4_error_table_features_failed_code, tvb, offset, 2, ENC_BIG_ENDIAN);
1552 break;
1553 case OFPET_EXPERIMENTER:
1554 default:
1555 proto_tree_add_item(tree, hf_openflow_v4_error_code, tvb, offset, 2, ENC_BIG_ENDIAN);
1556 break;
1558 offset +=2;
1560 switch(error_type) {
1561 case OFPET_HELLO_FAILED:
1562 /* uint8_t data[0]; contains an ASCII text string */
1563 proto_tree_add_item(tree, hf_openflow_v4_error_data_text, tvb, offset, length - 12, ENC_NA|ENC_ASCII);
1564 /*offset += length - 12;*/
1565 break;
1567 case OFPET_BAD_REQUEST:
1568 case OFPET_BAD_ACTION:
1569 case OFPET_BAD_INSTRUCTION:
1570 case OFPET_BAD_MATCH:
1571 case OFPET_FLOW_MOD_FAILED:
1572 case OFPET_GROUP_MOD_FAILED:
1573 case OFPET_PORT_MOD_FAILED:
1574 case OFPET_TABLE_MOD_FAILED:
1575 case OFPET_QUEUE_OP_FAILED:
1576 case OFPET_SWITCH_CONFIG_FAILED:
1577 case OFPET_ROLE_REQUEST_FAILED:
1578 case OFPET_METER_MOD_FAILED:
1579 case OFPET_TABLE_FEATURES_FAILED: {
1580 /* uint8_t data[0]; contains at least the first 64 bytes of the failed request. */
1581 bool save_in_error_pkt;
1583 data_ti = proto_tree_add_item(tree, hf_openflow_v4_error_data_body, tvb, offset, length - 20, ENC_NA);
1584 data_tree = proto_item_add_subtree(data_ti, ett_openflow_v4_error_data);
1586 /* Save error pkt */
1587 save_in_error_pkt = pinfo->flags.in_error_pkt;
1588 pinfo->flags.in_error_pkt = true;
1590 /* Disable update/change of column info */
1591 col_set_writable(pinfo->cinfo, -1, false);
1593 dissect_openflow_message_v4(tvb, pinfo, data_tree, offset);
1595 /* Restore the "we're inside an error packet" flag. */
1596 pinfo->flags.in_error_pkt = save_in_error_pkt;
1598 /* Restore the capability of update/change column info */
1599 col_set_writable(pinfo->cinfo, -1, true);
1601 /*offset += length - 12;*/
1603 break;
1605 case OFPET_EXPERIMENTER:
1606 /* uint32_t experimenter */
1607 proto_tree_add_item(tree, hf_openflow_v4_error_experimenter, tvb, offset, 4, ENC_BIG_ENDIAN);
1608 offset+=4;
1609 /* uint8_t data[0]; */
1610 proto_tree_add_expert_format(tree, pinfo, &ei_openflow_v4_error_undecoded,
1611 tvb, offset, length - 16, "Experimenter error body.");
1612 /*offset += length - 16;*/
1613 break;
1615 default:
1616 /* uint8_t data[0]; */
1617 proto_tree_add_expert_format(tree, pinfo, &ei_openflow_v4_error_undecoded,
1618 tvb, offset, length - 12, "Unknown error body.");
1619 /*offset += length - 12;*/
1620 break;
1625 static void
1626 dissect_openflow_echo_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length)
1628 /* data */
1629 if (offset < length) {
1630 proto_tree_add_item(tree, hf_openflow_v4_echo_data, tvb, offset, length - offset, ENC_NA);
1635 static void
1636 dissect_openflow_experimenter_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length)
1638 /* uint32_t experimenter; */
1639 proto_tree_add_item(tree, hf_openflow_v4_experimenter_experimenter, tvb, offset, 4, ENC_BIG_ENDIAN);
1640 offset+=4;
1642 /* uint32_t exp_type; */
1643 proto_tree_add_item(tree, hf_openflow_v4_experimenter_exp_type, tvb, offset, 4, ENC_BIG_ENDIAN);
1644 offset+=4;
1646 /* data */
1647 if (offset < length) {
1648 proto_tree_add_expert_format(tree, pinfo, &ei_openflow_v4_experimenter_undecoded,
1649 tvb, offset, length - 16, "Experimenter body.");
1653 #define OFPC_FLOW_STATS 1<<0
1654 #define OFPC_TABLE_STATS 1<<1
1655 #define OFPC_PORT_STATS 1<<2
1656 #define OFPC_GROUP_STATS 1<<3
1657 #define OFPC_IP_REASM 1<<5
1658 #define OFPC_QUEUE_STATS 1<<6
1659 #define OFPC_PORT_BLOCKED 1<<8
1660 static void
1661 dissect_openflow_switch_features_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
1663 proto_item *ti;
1664 proto_tree *cap_tree;
1666 /* uint64_t datapath_id; */
1667 proto_tree_add_item(tree, hf_openflow_v4_switch_features_datapath_id, tvb, offset, 8, ENC_BIG_ENDIAN);
1668 offset+=8;
1670 /* uint32_t n_buffers; */
1671 proto_tree_add_item(tree, hf_openflow_v4_switch_features_n_buffers, tvb, offset, 4, ENC_BIG_ENDIAN);
1672 offset+=4;
1674 /* uint8_t n_tables; */
1675 proto_tree_add_item(tree, hf_openflow_v4_switch_features_n_tables, tvb, offset, 1, ENC_BIG_ENDIAN);
1676 offset++;
1678 /* uint8_t auxiliary_id; */
1679 proto_tree_add_item(tree, hf_openflow_v4_switch_features_auxiliary_id, tvb, offset, 1, ENC_BIG_ENDIAN);
1680 offset++;
1682 /* uint8_t pad[2]; */
1683 proto_tree_add_item(tree, hf_openflow_v4_switch_features_pad, tvb, offset, 2, ENC_BIG_ENDIAN);
1684 offset+=2;
1686 /* uint32_t capabilities; */
1687 ti = proto_tree_add_item(tree, hf_openflow_v4_switch_features_capabilities, tvb, offset, 4, ENC_BIG_ENDIAN);
1688 cap_tree = proto_item_add_subtree(ti, ett_openflow_v4_switch_features_capabilities);
1690 proto_tree_add_item(cap_tree, hf_openflow_v4_switch_features_capabilities_flow_stats, tvb, offset, 4, ENC_BIG_ENDIAN);
1691 proto_tree_add_item(cap_tree, hf_openflow_v4_switch_features_capabilities_table_stats, tvb, offset, 4, ENC_BIG_ENDIAN);
1692 proto_tree_add_item(cap_tree, hf_openflow_v4_switch_features_capabilities_port_stats, tvb, offset, 4, ENC_BIG_ENDIAN);
1693 proto_tree_add_item(cap_tree, hf_openflow_v4_switch_features_capabilities_group_stats, tvb, offset, 4, ENC_BIG_ENDIAN);
1694 proto_tree_add_item(cap_tree, hf_openflow_v4_switch_features_capabilities_ip_reasm, tvb, offset, 4, ENC_BIG_ENDIAN);
1695 proto_tree_add_item(cap_tree, hf_openflow_v4_switch_features_capabilities_queue_stats, tvb, offset, 4, ENC_BIG_ENDIAN);
1696 proto_tree_add_item(cap_tree, hf_openflow_v4_switch_features_capabilities_port_blocked, tvb, offset, 4, ENC_BIG_ENDIAN);
1697 offset+=4;
1699 /* uint32_t reserved; */
1700 proto_tree_add_item(tree, hf_openflow_v4_switch_features_reserved, tvb, offset, 4, ENC_BIG_ENDIAN);
1701 /*offset+=4;*/
1704 static const value_string openflow_v4_switch_config_fragments_values[] = {
1705 { 0, "OFPC_FRAG_NORMAL" },
1706 { 1, "OFPC_FRAG_DROP" },
1707 { 2, "OFPC_FRAG_REASM" },
1708 { 0, NULL }
1711 #define OFPCML_MAX 0xffe5 /* Maximum max_len value. */
1712 static const value_string openflow_v4_controller_max_len_reserved_values[] = {
1713 { 0xffff, "OFPCML_NO_BUFFER" },
1714 { 0, NULL }
1717 static void
1718 dissect_openflow_switch_config_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
1720 proto_item *ti;
1721 proto_tree *flags_tree;
1723 /* uint16_t flags; */
1724 ti = proto_tree_add_item(tree, hf_openflow_v4_switch_config_flags, tvb, offset, 2, ENC_BIG_ENDIAN);
1725 flags_tree = proto_item_add_subtree(ti, ett_openflow_v4_switch_config_flags);
1727 /* fragments */
1728 proto_tree_add_bits_item(flags_tree, hf_openflow_v4_switch_config_flags_fragments, tvb, (offset * 8) + 14, 2, ENC_NA);
1729 offset+=2;
1731 /* uint16_t miss_send_len; */
1732 proto_tree_add_item(tree, hf_openflow_v4_switch_config_miss_send_len, tvb, offset, 2, ENC_BIG_ENDIAN);
1733 /*offset+=2;*/
1736 #define OFPR_NO_MATCH 0
1737 #define OFPR_ACTION 1
1738 #define OFPR_INVALID_TTL 2
1739 static const value_string openflow_v4_packet_in_reason_values[] = {
1740 { OFPR_NO_MATCH, "OFPR_NO_MATCH" },
1741 { OFPR_ACTION, "OFPR_ACTION" },
1742 { OFPR_INVALID_TTL, "OFPR_INVALID_TTL" },
1743 { 0, NULL }
1746 static void
1747 dissect_openflow_packet_in_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
1749 proto_tree *data_tree;
1750 tvbuff_t *next_tvb;
1751 bool save_writable;
1752 bool save_in_error_pkt;
1753 address save_dl_src, save_dl_dst, save_net_src, save_net_dst, save_src, save_dst;
1755 /* uint32_t buffer_id; */
1756 proto_tree_add_item(tree, hf_openflow_v4_packet_in_buffer_id, tvb, offset, 4, ENC_BIG_ENDIAN);
1757 offset+=4;
1759 /* uint16_t total_len; */
1760 proto_tree_add_item(tree, hf_openflow_v4_packet_in_total_len, tvb, offset, 2, ENC_BIG_ENDIAN);
1761 offset+=2;
1763 /* uint8_t reason; */
1764 proto_tree_add_item(tree, hf_openflow_v4_packet_in_reason, tvb, offset, 1, ENC_BIG_ENDIAN);
1765 offset+=1;
1767 /* uint8_t table_id; */
1768 proto_tree_add_item(tree, hf_openflow_v4_packet_in_table_id, tvb, offset, 1, ENC_BIG_ENDIAN);
1769 offset+=1;
1771 /* uint64_t cookie; */
1772 proto_tree_add_item(tree, hf_openflow_v4_packet_in_cookie, tvb, offset, 8, ENC_BIG_ENDIAN);
1773 offset+=8;
1775 /* struct ofp_match match; */
1776 offset = dissect_openflow_match_v4(tvb, pinfo, tree, offset, length);
1778 /* uint8_t pad[2]; */
1779 proto_tree_add_item(tree, hf_openflow_v4_packet_in_pad, tvb, offset, 2, ENC_NA);
1780 offset+=2;
1782 /* uint8_t data[0]; */
1783 if (offset < length) {
1784 data_tree = proto_tree_add_subtree(tree, tvb, offset, length - offset, ett_openflow_v4_packet_in_data, NULL, "Data");
1786 /* save some state */
1787 save_writable = col_get_writable(pinfo->cinfo, -1);
1788 save_in_error_pkt = pinfo->flags.in_error_pkt;
1789 copy_address_shallow(&save_dl_src, &pinfo->dl_src);
1790 copy_address_shallow(&save_dl_dst, &pinfo->dl_dst);
1791 copy_address_shallow(&save_net_src, &pinfo->net_src);
1792 copy_address_shallow(&save_net_dst, &pinfo->net_dst);
1793 copy_address_shallow(&save_src, &pinfo->src);
1794 copy_address_shallow(&save_dst, &pinfo->dst);
1796 /* dissect data */
1797 col_set_writable(pinfo->cinfo, -1, false);
1798 next_tvb = tvb_new_subset_length(tvb, offset, length - offset);
1799 call_dissector(eth_withoutfcs_handle, next_tvb, pinfo, data_tree);
1801 /* restore saved state */
1802 col_set_writable(pinfo->cinfo, -1, save_writable);
1803 pinfo->flags.in_error_pkt = save_in_error_pkt;
1804 copy_address_shallow(&pinfo->dl_src, &save_dl_src);
1805 copy_address_shallow(&pinfo->dl_dst, &save_dl_dst);
1806 copy_address_shallow(&pinfo->net_src, &save_net_src);
1807 copy_address_shallow(&pinfo->net_dst, &save_net_dst);
1808 copy_address_shallow(&pinfo->src, &save_src);
1809 copy_address_shallow(&pinfo->dst, &save_dst);
1814 #define OFPRR_IDLE_TIMEOUT 0
1815 #define OFPRR_HARD_TIMEOUT 1
1816 #define OFPRR_DELETE 2
1817 #define OFPRR_GROUP_DELETE 3
1818 static const value_string openflow_v4_flow_removed_reason_values[] = {
1819 { OFPRR_IDLE_TIMEOUT, "OFPRR_IDLE_TIMEOUT" },
1820 { OFPRR_HARD_TIMEOUT, "OFPRR_HARD_TIMEOUT" },
1821 { OFPRR_DELETE, "OFPRR_DELETE" },
1822 { OFPRR_GROUP_DELETE, "OFPRR_GROUP_DELETE" },
1823 { 0, NULL }
1826 static void
1827 dissect_openflow_flow_removed_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
1829 /* uint64_t cookie; */
1830 proto_tree_add_item(tree, hf_openflow_v4_flow_removed_cookie, tvb, offset, 8, ENC_BIG_ENDIAN);
1831 offset+=8;
1833 /* uint16_t priority; */
1834 proto_tree_add_item(tree, hf_openflow_v4_flow_removed_priority, tvb, offset, 2, ENC_BIG_ENDIAN);
1835 offset+=2;
1837 /* uint8_t reason; */
1838 proto_tree_add_item(tree, hf_openflow_v4_flow_removed_reason, tvb, offset, 1, ENC_BIG_ENDIAN);
1839 offset+=1;
1841 /* uint8_t table_id; */
1842 proto_tree_add_item(tree, hf_openflow_v4_flow_removed_table_id, tvb, offset, 1, ENC_BIG_ENDIAN);
1843 offset+=1;
1845 /* uint32_t duration_sec; */
1846 proto_tree_add_item(tree, hf_openflow_v4_flow_removed_duration_sec, tvb, offset, 4, ENC_BIG_ENDIAN);
1847 offset+=4;
1849 /* uint32_t duration_nsec; */
1850 proto_tree_add_item(tree, hf_openflow_v4_flow_removed_duration_nsec, tvb, offset, 4, ENC_BIG_ENDIAN);
1851 offset+=4;
1853 /* uint16_t idle_timeout; */
1854 proto_tree_add_item(tree, hf_openflow_v4_flow_removed_idle_timeout, tvb, offset, 2, ENC_BIG_ENDIAN);
1855 offset+=2;
1857 /* uint16_t hard_timeout; */
1858 proto_tree_add_item(tree, hf_openflow_v4_flow_removed_hard_timeout, tvb, offset, 2, ENC_BIG_ENDIAN);
1859 offset+=2;
1861 /* uint64_t packet_count; */
1862 proto_tree_add_item(tree, hf_openflow_v4_flow_removed_packet_count, tvb, offset, 8, ENC_BIG_ENDIAN);
1863 offset+=8;
1865 /* uint64_t byte_count; */
1866 proto_tree_add_item(tree, hf_openflow_v4_flow_removed_byte_count, tvb, offset, 8, ENC_BIG_ENDIAN);
1867 offset+=8;
1869 /* struct ofp_match match; */
1870 dissect_openflow_match_v4(tvb, pinfo, tree, offset, length);
1873 #define OFPAT_OUTPUT 0 /* Output to switch port. */
1874 #define OFPAT_COPY_TTL_OUT 11 /* Copy TTL "outwards" */
1875 #define OFPAT_COPY_TTL_IN 12 /* Copy TTL "inwards" */
1876 #define OFPAT_SET_MPLS_TTL 15 /* MPLS TTL */
1877 #define OFPAT_DEC_MPLS_TTL 16 /* Decrement MPLS TTL */
1878 #define OFPAT_PUSH_VLAN 17 /* Push a new VLAN tag */
1879 #define OFPAT_POP_VLAN 18 /* Pop the outer VLAN tag */
1880 #define OFPAT_PUSH_MPLS 19 /* Push a new MPLS tag */
1881 #define OFPAT_POP_MPLS 20 /* Pop the outer MPLS tag */
1882 #define OFPAT_SET_QUEUE 21 /* Set queue id when outputting to a port */
1883 #define OFPAT_GROUP 22 /* Apply group. */
1884 #define OFPAT_SET_NW_TTL 23 /* IP TTL. */
1885 #define OFPAT_DEC_NW_TTL 24 /* Decrement IP TTL. */
1886 #define OFPAT_SET_FIELD 25 /* Set a header field using OXM TLV format. */
1887 #define OFPAT_PUSH_PBB 26 /* Push a new PBB service tag (I-TAG) */
1888 #define OFPAT_POP_PBB 27 /* Pop the outer PBB service tag (I-TAG) */
1889 #define OFPAT_EXPERIMENTER 0xffff
1891 static const value_string openflow_v4_action_type_values[] = {
1892 { 0, "OFPAT_OUTPUT" },
1893 { 11, "OFPAT_COPY_TTL_OUT" },
1894 { 12, "OFPAT_COPY_TTL_IN" },
1895 { 15, "OFPAT_SET_MPLS_TTL" },
1896 { 16, "OFPAT_DEC_MPLS_TTL" },
1897 { 17, "OFPAT_PUSH_VLAN" },
1898 { 18, "OFPAT_POP_VLAN" },
1899 { 19, "OFPAT_PUSH_MPLS" },
1900 { 20, "OFPAT_POP_MPLS" },
1901 { 21, "OFPAT_SET_QUEUE" },
1902 { 22, "OFPAT_GROUP" },
1903 { 23, "OFPAT_SET_NW_TTL" },
1904 { 24, "OFPAT_DEC_NW_TTL" },
1905 { 25, "OFPAT_SET_FIELD" },
1906 { 26, "OFPAT_PUSH_PBB" },
1907 { 27, "OFPAT_POP_PBB" },
1908 { 0xffff, "OFPAT_EXPERIMENTER" },
1909 { 0, NULL}
1914 static int
1915 dissect_openflow_action_header_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
1917 uint16_t act_type;
1919 /* uint16_t type; */
1920 act_type = tvb_get_ntohs(tvb, offset);
1921 proto_tree_add_item(tree, hf_openflow_v4_action_type, tvb, offset, 2, ENC_BIG_ENDIAN);
1922 offset+=2;
1924 /* uint16_t length; */
1925 proto_tree_add_item(tree, hf_openflow_v4_action_length, tvb, offset, 2, ENC_BIG_ENDIAN);
1926 offset+=2;
1928 if (act_type == OFPAT_EXPERIMENTER) {
1929 /* uint32_t experimenter; */
1930 proto_tree_add_item(tree, hf_openflow_v4_action_experimenter_experimenter, tvb, offset, 4, ENC_BIG_ENDIAN);
1931 offset+=4;
1934 return offset;
1938 static int
1939 dissect_openflow_action_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
1941 proto_tree *act_tree;
1942 uint16_t act_type;
1943 uint16_t act_length;
1944 int32_t act_end;
1946 act_type = tvb_get_ntohs(tvb, offset);
1947 act_length = tvb_get_ntohs(tvb, offset + 2);
1948 act_end = offset + act_length;
1950 act_tree = proto_tree_add_subtree(tree, tvb, offset, act_length, ett_openflow_v4_action, NULL, "Action");
1952 offset = dissect_openflow_action_header_v4(tvb, pinfo, act_tree, offset, length);
1954 switch (act_type) {
1955 case OFPAT_OUTPUT:
1956 /* uint32_t port; */
1957 proto_tree_add_item(act_tree, hf_openflow_v4_action_output_port, tvb, offset, 4, ENC_BIG_ENDIAN);
1958 offset+=4;
1960 /* uint16_t max_len; */
1961 proto_tree_add_item(act_tree, hf_openflow_v4_action_output_max_len, tvb, offset, 2, ENC_BIG_ENDIAN);
1962 offset+=2;
1964 /* uint8_t pad[6]; */
1965 proto_tree_add_item(act_tree, hf_openflow_v4_action_output_pad, tvb, offset, 6, ENC_NA);
1966 offset+=6;
1968 break;
1970 case OFPAT_COPY_TTL_OUT:
1971 /* uint8_t pad[4]; */
1972 proto_tree_add_item(act_tree, hf_openflow_v4_action_copy_ttl_out_pad, tvb, offset, 4, ENC_NA);
1973 offset+=4;
1974 break;
1976 case OFPAT_COPY_TTL_IN:
1977 /* uint8_t pad[4]; */
1978 proto_tree_add_item(act_tree, hf_openflow_v4_action_copy_ttl_in_pad, tvb, offset, 4, ENC_NA);
1979 offset+=4;
1980 break;
1982 case OFPAT_SET_MPLS_TTL:
1983 /* uint8_t mpls_ttl; */
1984 proto_tree_add_item(act_tree, hf_openflow_v4_action_set_mpls_ttl_ttl, tvb, offset, 1, ENC_BIG_ENDIAN);
1985 offset+=1;
1987 /* uint8_t pad[3]; */
1988 proto_tree_add_item(act_tree, hf_openflow_v4_action_set_mpls_ttl_pad, tvb, offset, 3, ENC_NA);
1989 offset+=3;
1990 break;
1992 case OFPAT_DEC_MPLS_TTL:
1993 /* uint8_t pad[4]; */
1994 proto_tree_add_item(act_tree, hf_openflow_v4_action_dec_mpls_ttl_pad, tvb, offset, 4, ENC_NA);
1995 offset+=4;
1996 break;
1998 case OFPAT_PUSH_VLAN:
1999 /* uint16_t ethertype; */
2000 proto_tree_add_item(act_tree, hf_openflow_v4_action_push_vlan_ethertype, tvb, offset, 2, ENC_BIG_ENDIAN);
2001 offset+=2;
2003 /* uint8_t pad[2]; */
2004 proto_tree_add_item(act_tree, hf_openflow_v4_action_push_vlan_pad, tvb, offset, 2, ENC_NA);
2005 offset+=2;
2006 break;
2008 case OFPAT_POP_VLAN:
2009 /* uint8_t pad[4]; */
2010 proto_tree_add_item(act_tree, hf_openflow_v4_action_pop_vlan_pad, tvb, offset, 4, ENC_NA);
2011 offset+=4;
2012 break;
2014 case OFPAT_PUSH_MPLS:
2015 /* uint16_t ethertype; */
2016 proto_tree_add_item(act_tree, hf_openflow_v4_action_push_mpls_ethertype, tvb, offset, 2, ENC_BIG_ENDIAN);
2017 offset+=2;
2019 /* uint8_t pad[2]; */
2020 proto_tree_add_item(act_tree, hf_openflow_v4_action_push_mpls_pad, tvb, offset, 2, ENC_NA);
2021 offset+=2;
2022 break;
2024 case OFPAT_POP_MPLS:
2025 /* uint16_t ethertype; */
2026 proto_tree_add_item(act_tree, hf_openflow_v4_action_pop_mpls_ethertype, tvb, offset, 2, ENC_BIG_ENDIAN);
2027 offset+=2;
2029 /* uint8_t pad[2]; */
2030 proto_tree_add_item(act_tree, hf_openflow_v4_action_pop_mpls_pad, tvb, offset, 2, ENC_NA);
2031 offset+=2;
2032 break;
2034 case OFPAT_SET_QUEUE:
2035 /* uint32_t queue_id; */
2036 proto_tree_add_item(act_tree, hf_openflow_v4_action_set_queue_queue_id, tvb, offset, 4, ENC_BIG_ENDIAN);
2037 offset+=4;
2038 break;
2040 case OFPAT_GROUP:
2041 /* uint32_t group_id; */
2042 proto_tree_add_item(act_tree, hf_openflow_v4_action_group_group_id, tvb, offset, 4, ENC_BIG_ENDIAN);
2043 offset+=4;
2044 break;
2046 case OFPAT_SET_NW_TTL:
2047 /* uint8_t nw_ttl; */
2048 proto_tree_add_item(act_tree, hf_openflow_v4_action_set_nw_ttl_ttl, tvb, offset, 1, ENC_BIG_ENDIAN);
2049 offset+=1;
2051 /* uint8_t pad[3]; */
2052 proto_tree_add_item(act_tree, hf_openflow_v4_action_set_nw_ttl_pad, tvb, offset, 3, ENC_NA);
2053 offset+=3;
2054 break;
2056 case OFPAT_DEC_NW_TTL:
2057 /* uint8_t pad[4]; */
2058 proto_tree_add_item(act_tree, hf_openflow_v4_action_dec_nw_ttl_pad, tvb, offset, 4, ENC_NA);
2059 offset+=4;
2060 break;
2062 case OFPAT_SET_FIELD:
2063 offset = dissect_openflow_oxm_v4(tvb, pinfo, act_tree, offset, length);
2065 /* padded to 64 bits */
2066 if (offset < act_end) {
2067 proto_tree_add_item(act_tree, hf_openflow_v4_action_set_field_pad, tvb, offset, act_end - offset, ENC_NA);
2068 offset = act_end;
2070 break;
2072 case OFPAT_PUSH_PBB:
2073 /* uint16_t ethertype; */
2074 proto_tree_add_item(act_tree, hf_openflow_v4_action_push_pbb_ethertype, tvb, offset, 2, ENC_BIG_ENDIAN);
2075 offset+=2;
2077 /* uint8_t pad[2]; */
2078 proto_tree_add_item(act_tree, hf_openflow_v4_action_push_pbb_pad, tvb, offset, 2, ENC_NA);
2079 offset+=2;
2080 break;
2082 case OFPAT_POP_PBB:
2083 /* uint8_t pad[4]; */
2084 proto_tree_add_item(act_tree, hf_openflow_v4_action_pop_pbb_pad, tvb, offset, 4, ENC_NA);
2085 offset+=4;
2086 break;
2088 case OFPAT_EXPERIMENTER:
2089 proto_tree_add_expert_format(act_tree, pinfo, &ei_openflow_v4_action_undecoded,
2090 tvb, offset, act_length - 8, "Experimenter action body.");
2091 if (act_length > 8)
2092 offset += act_length - 8;
2093 break;
2095 default:
2096 proto_tree_add_expert_format(act_tree, pinfo, &ei_openflow_v4_action_undecoded,
2097 tvb, offset, act_length - 4, "Unknown action body.");
2098 if (act_length > 4)
2099 offset += act_length - 4;
2100 break;
2103 return offset;
2107 #define OFPPC_PORT_DOWN 1 << 0
2108 #define OFPPC_NO_RECV 1 << 2
2109 #define OFPPC_NO_FWD 1 << 5
2110 #define OFPPC_NO_PACKET_IN 1 << 6
2112 #define OFPPS_LINK_DOWN 1 << 0
2113 #define OFPPS_BLOCKED 1 << 1
2114 #define OFPPS_LIVE 1 << 2
2116 #define OFPPF_10MB_HD 1 << 0
2117 #define OFPPF_10MB_FD 1 << 1
2118 #define OFPPF_100MB_HD 1 << 2
2119 #define OFPPF_100MB_FD 1 << 3
2120 #define OFPPF_1GB_HD 1 << 4
2121 #define OFPPF_1GB_FD 1 << 5
2122 #define OFPPF_10GB_FD 1 << 6
2123 #define OFPPF_40GB_FD 1 << 7
2124 #define OFPPF_100GB_FD 1 << 8
2125 #define OFPPF_1TB_FD 1 << 9
2126 #define OFPPF_OTHER 1 << 10
2128 #define OFPPF_COPPER 1 << 11
2129 #define OFPPF_FIBER 1 << 12
2130 #define OFPPF_AUTONEG 1 << 13
2131 #define OFPPF_PAUSE 1 << 14
2132 #define OFPPF_PAUSE_ASYM 1 << 15
2134 #define OFP_ETH_ALEN 6
2135 #define OFP_MAX_PORT_NAME_LEN 16
2136 static int
2137 dissect_openflow_port_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
2139 proto_item *ti;
2140 proto_tree *port_tree, *conf_tree, *state_tree, *curr_tree, *adv_tree, *supp_tree, *peer_tree;
2142 port_tree = proto_tree_add_subtree(tree, tvb, offset, 64, ett_openflow_v4_port, NULL, "Port");
2144 /* uint32_t port_no; */
2145 proto_tree_add_item(port_tree, hf_openflow_v4_port_port_no, tvb, offset, 4, ENC_BIG_ENDIAN);
2146 offset+=4;
2148 /* uint8_t pad[4]; */
2149 proto_tree_add_item(port_tree, hf_openflow_v4_port_pad, tvb, offset, 4, ENC_NA);
2150 offset+=4;
2152 /* uint8_t hw_addr[OFP_ETH_ALEN]; */
2153 proto_tree_add_item(port_tree, hf_openflow_v4_port_hw_addr, tvb, offset, OFP_ETH_ALEN, ENC_NA);
2154 offset+=OFP_ETH_ALEN;
2156 /* uint8_t pad2[2]; */
2157 proto_tree_add_item(port_tree, hf_openflow_v4_port_pad2, tvb, offset, 2, ENC_NA);
2158 offset+=2;
2160 /* char name[OFP_MAX_PORT_NAME_LEN]; Null-terminated */
2161 proto_tree_add_item(port_tree, hf_openflow_v4_port_name, tvb, offset, OFP_MAX_PORT_NAME_LEN, ENC_ASCII);
2162 offset+=OFP_MAX_PORT_NAME_LEN;
2164 /* uint32_t config; */
2165 ti = proto_tree_add_item(port_tree, hf_openflow_v4_port_config, tvb, offset, 4, ENC_BIG_ENDIAN);
2166 conf_tree = proto_item_add_subtree(ti, ett_openflow_v4_port_config);
2168 proto_tree_add_item(conf_tree, hf_openflow_v4_port_config_port_down, tvb, offset, 4, ENC_BIG_ENDIAN);
2169 proto_tree_add_item(conf_tree, hf_openflow_v4_port_config_no_recv, tvb, offset, 4, ENC_BIG_ENDIAN);
2170 proto_tree_add_item(conf_tree, hf_openflow_v4_port_config_no_fwd, tvb, offset, 4, ENC_BIG_ENDIAN);
2171 proto_tree_add_item(conf_tree, hf_openflow_v4_port_config_no_packet_in, tvb, offset, 4, ENC_BIG_ENDIAN);
2172 offset+=4;
2174 /* uint32_t state; */
2175 ti = proto_tree_add_item(port_tree, hf_openflow_v4_port_state, tvb, offset, 4, ENC_BIG_ENDIAN);
2176 state_tree = proto_item_add_subtree(ti, ett_openflow_v4_port_state);
2178 proto_tree_add_item(state_tree, hf_openflow_v4_port_state_link_down, tvb, offset, 4, ENC_BIG_ENDIAN);
2179 proto_tree_add_item(state_tree, hf_openflow_v4_port_state_blocked, tvb, offset, 4, ENC_BIG_ENDIAN);
2180 proto_tree_add_item(state_tree, hf_openflow_v4_port_state_live, tvb, offset, 4, ENC_BIG_ENDIAN);
2181 offset+=4;
2183 /* uint32_t curr; */
2184 ti = proto_tree_add_item(port_tree, hf_openflow_v4_port_current, tvb, offset, 4, ENC_BIG_ENDIAN);
2185 curr_tree = proto_item_add_subtree(ti, ett_openflow_v4_port_current);
2187 proto_tree_add_item(curr_tree, hf_openflow_v4_port_current_10mb_hd, tvb, offset, 4, ENC_BIG_ENDIAN);
2188 proto_tree_add_item(curr_tree, hf_openflow_v4_port_current_10mb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2189 proto_tree_add_item(curr_tree, hf_openflow_v4_port_current_100mb_hd, tvb, offset, 4, ENC_BIG_ENDIAN);
2190 proto_tree_add_item(curr_tree, hf_openflow_v4_port_current_100mb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2191 proto_tree_add_item(curr_tree, hf_openflow_v4_port_current_1gb_hd, tvb, offset, 4, ENC_BIG_ENDIAN);
2192 proto_tree_add_item(curr_tree, hf_openflow_v4_port_current_1gb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2193 proto_tree_add_item(curr_tree, hf_openflow_v4_port_current_10gb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2194 proto_tree_add_item(curr_tree, hf_openflow_v4_port_current_40gb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2195 proto_tree_add_item(curr_tree, hf_openflow_v4_port_current_100gb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2196 proto_tree_add_item(curr_tree, hf_openflow_v4_port_current_1tb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2197 proto_tree_add_item(curr_tree, hf_openflow_v4_port_current_other, tvb, offset, 4, ENC_BIG_ENDIAN);
2198 proto_tree_add_item(curr_tree, hf_openflow_v4_port_current_copper, tvb, offset, 4, ENC_BIG_ENDIAN);
2199 proto_tree_add_item(curr_tree, hf_openflow_v4_port_current_fiber, tvb, offset, 4, ENC_BIG_ENDIAN);
2200 proto_tree_add_item(curr_tree, hf_openflow_v4_port_current_autoneg, tvb, offset, 4, ENC_BIG_ENDIAN);
2201 proto_tree_add_item(curr_tree, hf_openflow_v4_port_current_pause, tvb, offset, 4, ENC_BIG_ENDIAN);
2202 proto_tree_add_item(curr_tree, hf_openflow_v4_port_current_pause_asym, tvb, offset, 4, ENC_BIG_ENDIAN);
2203 offset+=4;
2205 /* uint32_t advertised; */
2206 ti = proto_tree_add_item(port_tree, hf_openflow_v4_port_advertised, tvb, offset, 4, ENC_BIG_ENDIAN);
2207 adv_tree = proto_item_add_subtree(ti, ett_openflow_v4_port_advertised);
2209 proto_tree_add_item(adv_tree, hf_openflow_v4_port_advertised_10mb_hd, tvb, offset, 4, ENC_BIG_ENDIAN);
2210 proto_tree_add_item(adv_tree, hf_openflow_v4_port_advertised_10mb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2211 proto_tree_add_item(adv_tree, hf_openflow_v4_port_advertised_100mb_hd, tvb, offset, 4, ENC_BIG_ENDIAN);
2212 proto_tree_add_item(adv_tree, hf_openflow_v4_port_advertised_100mb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2213 proto_tree_add_item(adv_tree, hf_openflow_v4_port_advertised_1gb_hd, tvb, offset, 4, ENC_BIG_ENDIAN);
2214 proto_tree_add_item(adv_tree, hf_openflow_v4_port_advertised_1gb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2215 proto_tree_add_item(adv_tree, hf_openflow_v4_port_advertised_10gb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2216 proto_tree_add_item(adv_tree, hf_openflow_v4_port_advertised_40gb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2217 proto_tree_add_item(adv_tree, hf_openflow_v4_port_advertised_100gb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2218 proto_tree_add_item(adv_tree, hf_openflow_v4_port_advertised_1tb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2219 proto_tree_add_item(adv_tree, hf_openflow_v4_port_advertised_other, tvb, offset, 4, ENC_BIG_ENDIAN);
2220 proto_tree_add_item(adv_tree, hf_openflow_v4_port_advertised_copper, tvb, offset, 4, ENC_BIG_ENDIAN);
2221 proto_tree_add_item(adv_tree, hf_openflow_v4_port_advertised_fiber, tvb, offset, 4, ENC_BIG_ENDIAN);
2222 proto_tree_add_item(adv_tree, hf_openflow_v4_port_advertised_autoneg, tvb, offset, 4, ENC_BIG_ENDIAN);
2223 proto_tree_add_item(adv_tree, hf_openflow_v4_port_advertised_pause, tvb, offset, 4, ENC_BIG_ENDIAN);
2224 proto_tree_add_item(adv_tree, hf_openflow_v4_port_advertised_pause_asym, tvb, offset, 4, ENC_BIG_ENDIAN);
2225 offset+=4;
2227 /* uint32_t supported; */
2228 ti = proto_tree_add_item(port_tree, hf_openflow_v4_port_supported, tvb, offset, 4, ENC_BIG_ENDIAN);
2229 supp_tree = proto_item_add_subtree(ti, ett_openflow_v4_port_supported);
2231 proto_tree_add_item(supp_tree, hf_openflow_v4_port_supported_10mb_hd, tvb, offset, 4, ENC_BIG_ENDIAN);
2232 proto_tree_add_item(supp_tree, hf_openflow_v4_port_supported_10mb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2233 proto_tree_add_item(supp_tree, hf_openflow_v4_port_supported_100mb_hd, tvb, offset, 4, ENC_BIG_ENDIAN);
2234 proto_tree_add_item(supp_tree, hf_openflow_v4_port_supported_100mb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2235 proto_tree_add_item(supp_tree, hf_openflow_v4_port_supported_1gb_hd, tvb, offset, 4, ENC_BIG_ENDIAN);
2236 proto_tree_add_item(supp_tree, hf_openflow_v4_port_supported_1gb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2237 proto_tree_add_item(supp_tree, hf_openflow_v4_port_supported_10gb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2238 proto_tree_add_item(supp_tree, hf_openflow_v4_port_supported_40gb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2239 proto_tree_add_item(supp_tree, hf_openflow_v4_port_supported_100gb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2240 proto_tree_add_item(supp_tree, hf_openflow_v4_port_supported_1tb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2241 proto_tree_add_item(supp_tree, hf_openflow_v4_port_supported_other, tvb, offset, 4, ENC_BIG_ENDIAN);
2242 proto_tree_add_item(supp_tree, hf_openflow_v4_port_supported_copper, tvb, offset, 4, ENC_BIG_ENDIAN);
2243 proto_tree_add_item(supp_tree, hf_openflow_v4_port_supported_fiber, tvb, offset, 4, ENC_BIG_ENDIAN);
2244 proto_tree_add_item(supp_tree, hf_openflow_v4_port_supported_autoneg, tvb, offset, 4, ENC_BIG_ENDIAN);
2245 proto_tree_add_item(supp_tree, hf_openflow_v4_port_supported_pause, tvb, offset, 4, ENC_BIG_ENDIAN);
2246 proto_tree_add_item(supp_tree, hf_openflow_v4_port_supported_pause_asym, tvb, offset, 4, ENC_BIG_ENDIAN);
2247 offset+=4;
2249 /* uint32_t peer; */
2250 ti = proto_tree_add_item(port_tree, hf_openflow_v4_port_peer, tvb, offset, 4, ENC_BIG_ENDIAN);
2251 peer_tree = proto_item_add_subtree(ti, ett_openflow_v4_port_peer);
2253 proto_tree_add_item(peer_tree, hf_openflow_v4_port_peer_10mb_hd, tvb, offset, 4, ENC_BIG_ENDIAN);
2254 proto_tree_add_item(peer_tree, hf_openflow_v4_port_peer_10mb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2255 proto_tree_add_item(peer_tree, hf_openflow_v4_port_peer_100mb_hd, tvb, offset, 4, ENC_BIG_ENDIAN);
2256 proto_tree_add_item(peer_tree, hf_openflow_v4_port_peer_100mb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2257 proto_tree_add_item(peer_tree, hf_openflow_v4_port_peer_1gb_hd, tvb, offset, 4, ENC_BIG_ENDIAN);
2258 proto_tree_add_item(peer_tree, hf_openflow_v4_port_peer_1gb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2259 proto_tree_add_item(peer_tree, hf_openflow_v4_port_peer_10gb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2260 proto_tree_add_item(peer_tree, hf_openflow_v4_port_peer_40gb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2261 proto_tree_add_item(peer_tree, hf_openflow_v4_port_peer_100gb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2262 proto_tree_add_item(peer_tree, hf_openflow_v4_port_peer_1tb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2263 proto_tree_add_item(peer_tree, hf_openflow_v4_port_peer_other, tvb, offset, 4, ENC_BIG_ENDIAN);
2264 proto_tree_add_item(peer_tree, hf_openflow_v4_port_peer_copper, tvb, offset, 4, ENC_BIG_ENDIAN);
2265 proto_tree_add_item(peer_tree, hf_openflow_v4_port_peer_fiber, tvb, offset, 4, ENC_BIG_ENDIAN);
2266 proto_tree_add_item(peer_tree, hf_openflow_v4_port_peer_autoneg, tvb, offset, 4, ENC_BIG_ENDIAN);
2267 proto_tree_add_item(peer_tree, hf_openflow_v4_port_peer_pause, tvb, offset, 4, ENC_BIG_ENDIAN);
2268 proto_tree_add_item(peer_tree, hf_openflow_v4_port_peer_pause_asym, tvb, offset, 4, ENC_BIG_ENDIAN);
2269 offset+=4;
2271 /* uint32_t curr_speed; */
2272 proto_tree_add_item(port_tree, hf_openflow_v4_port_curr_speed, tvb, offset, 4, ENC_BIG_ENDIAN);
2273 offset+=4;
2275 /* uint32_t max_speed; */
2276 proto_tree_add_item(port_tree, hf_openflow_v4_port_max_speed, tvb, offset, 4, ENC_BIG_ENDIAN);
2277 offset+=4;
2279 return offset;
2284 #define OFPPR_ADD 0
2285 #define OFPPR_DELETE 1
2286 #define OFPPR_MODIFY 2
2287 static const value_string openflow_v4_port_status_reason_values[] = {
2288 { OFPPR_ADD, "OFPPR_ADD" },
2289 { OFPPR_DELETE, "OFPPR_DELETE" },
2290 { OFPPR_MODIFY, "OFPPR_MODIFY" },
2291 { 0, NULL }
2294 static void
2295 dissect_openflow_port_status_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
2297 /* uint8_t reason; */
2298 proto_tree_add_item(tree, hf_openflow_v4_port_status_reason, tvb, offset, 1, ENC_BIG_ENDIAN);
2299 offset+=1;
2301 /* uint8_t pad[7]; */
2302 proto_tree_add_item(tree, hf_openflow_v4_port_status_pad, tvb, offset, 7, ENC_NA);
2303 offset+=7;
2305 /* struct ofp_port desc; */
2306 dissect_openflow_port_v4(tvb, pinfo, tree, offset, length);
2310 static void
2311 dissect_openflow_packet_out_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
2313 proto_tree *data_tree;
2314 uint16_t acts_len;
2315 int32_t acts_end;
2316 tvbuff_t *next_tvb;
2317 bool save_writable;
2318 bool save_in_error_pkt;
2319 address save_dl_src, save_dl_dst, save_net_src, save_net_dst, save_src, save_dst;
2321 /* uint32_t buffer_id; */
2322 proto_tree_add_item(tree, hf_openflow_v4_packet_out_buffer_id, tvb, offset, 4, ENC_BIG_ENDIAN);
2323 offset+=4;
2325 /* uint32_t in_port; */
2326 proto_tree_add_item(tree, hf_openflow_v4_packet_out_in_port, tvb, offset, 4, ENC_BIG_ENDIAN);
2327 offset+=4;
2329 /* uint16_t actions_len; */
2330 acts_len = tvb_get_ntohs(tvb, offset);
2331 proto_tree_add_item(tree, hf_openflow_v4_packet_out_acts_len, tvb, offset, 2, ENC_BIG_ENDIAN);
2332 offset+=2;
2334 /* uint8_t pad[6]; */
2335 proto_tree_add_item(tree, hf_openflow_v4_packet_out_pad, tvb, offset, 6, ENC_NA);
2336 offset+=6;
2338 /* struct ofp_action_header actions[0]; */
2339 acts_end = offset + acts_len;
2341 while (offset < acts_end) {
2342 offset = dissect_openflow_action_v4(tvb, pinfo, tree, offset, length);
2345 /* uint8_t data[0]; */
2346 if (offset < length) {
2347 data_tree = proto_tree_add_subtree(tree, tvb, offset, length - offset, ett_openflow_v4_packet_out_data, NULL, "Data");
2349 /* save some state */
2350 save_writable = col_get_writable(pinfo->cinfo, -1);
2351 save_in_error_pkt = pinfo->flags.in_error_pkt;
2352 copy_address_shallow(&save_dl_src, &pinfo->dl_src);
2353 copy_address_shallow(&save_dl_dst, &pinfo->dl_dst);
2354 copy_address_shallow(&save_net_src, &pinfo->net_src);
2355 copy_address_shallow(&save_net_dst, &pinfo->net_dst);
2356 copy_address_shallow(&save_src, &pinfo->src);
2357 copy_address_shallow(&save_dst, &pinfo->dst);
2359 /* dissect data */
2360 col_set_writable(pinfo->cinfo, -1, false);
2361 next_tvb = tvb_new_subset_length(tvb, offset, length - offset);
2362 call_dissector(eth_withoutfcs_handle, next_tvb, pinfo, data_tree);
2364 /* restore saved state */
2365 col_set_writable(pinfo->cinfo, -1, save_writable);
2366 pinfo->flags.in_error_pkt = save_in_error_pkt;
2367 copy_address_shallow(&pinfo->dl_src, &save_dl_src);
2368 copy_address_shallow(&pinfo->dl_dst, &save_dl_dst);
2369 copy_address_shallow(&pinfo->net_src, &save_net_src);
2370 copy_address_shallow(&pinfo->net_dst, &save_net_dst);
2371 copy_address_shallow(&pinfo->src, &save_src);
2372 copy_address_shallow(&pinfo->dst, &save_dst);
2377 #define OFPIT_GOTO_TABLE 1 /* Setup the next table in the lookup */
2378 #define OFPIT_WRITE_METADATA 2 /* Setup the metadata field for use later in */
2379 #define OFPIT_WRITE_ACTIONS 3 /* Write the action(s) onto the datapath action */
2380 #define OFPIT_APPLY_ACTIONS 4 /* Applies the action(s) immediately */
2381 #define OFPIT_CLEAR_ACTIONS 5 /* Clears all actions from the datapath */
2382 #define OFPIT_METER 6 /* Apply meter (rate limiter) */
2383 #define OFPIT_EXPERIMENTER 0xFFFF /* Experimenter instruction */
2384 static const value_string openflow_v4_instruction_type_values[] = {
2385 { 0x0001, "OFPIT_GOTO_TABLE" },
2386 { 0x0002, "OFPIT_WRITE_METADATA" },
2387 { 0x0003, "OFPIT_WRITE_ACTIONS" },
2388 { 0x0004, "OFPIT_APPLY_ACTIONS" },
2389 { 0x0005, "OFPIT_CLEAR_ACTIONS" },
2390 { 0x0006, "OFPIT_METER" },
2391 { 0xffff, "OFPIT_EXPERIMENTER = 0xFFFF" },
2392 { 0, NULL }
2397 static int
2398 dissect_openflow_instruction_header_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
2400 uint16_t inst_type;
2402 /* uint16_t type; */
2403 inst_type = tvb_get_ntohs(tvb, offset);
2404 proto_tree_add_item(tree, hf_openflow_v4_instruction_type, tvb, offset, 2, ENC_BIG_ENDIAN);
2405 offset+=2;
2407 /* uint16_t length; */
2408 proto_tree_add_item(tree, hf_openflow_v4_instruction_length, tvb, offset, 2, ENC_BIG_ENDIAN);
2409 offset+=2;
2411 if (inst_type == OFPIT_EXPERIMENTER) {
2412 /* uint32_t experimenter; */
2413 proto_tree_add_item(tree, hf_openflow_v4_instruction_experimenter_experimenter, tvb, offset, 4, ENC_BIG_ENDIAN);
2414 offset+=4;
2417 return offset;
2421 static int
2422 dissect_openflow_instruction_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
2424 proto_tree *inst_tree;
2425 uint16_t inst_type;
2426 uint16_t inst_length;
2427 int32_t acts_end;
2429 inst_type = tvb_get_ntohs(tvb, offset);
2430 inst_length = tvb_get_ntohs(tvb, offset + 2);
2432 if (inst_length < 8) {
2433 inst_length = 8;
2436 inst_tree = proto_tree_add_subtree(tree, tvb, offset, inst_length, ett_openflow_v4_instruction, NULL, "Instruction");
2438 offset = dissect_openflow_instruction_header_v4(tvb, pinfo, inst_tree, offset, length);
2440 switch (inst_type) {
2441 case OFPIT_GOTO_TABLE:
2442 /* uint8_t table_id; */
2443 proto_tree_add_item(inst_tree, hf_openflow_v4_instruction_goto_table_table_id, tvb, offset, 1, ENC_BIG_ENDIAN);
2444 offset+=1;
2446 /* uint8_t pad[3]; */
2447 proto_tree_add_item(inst_tree, hf_openflow_v4_instruction_goto_table_pad, tvb, offset, 3, ENC_NA);
2448 offset+=3;
2449 break;
2451 case OFPIT_WRITE_METADATA:
2452 /* uint8_t pad[4]; */
2453 proto_tree_add_item(inst_tree, hf_openflow_v4_instruction_write_metadata_pad, tvb, offset, 4, ENC_NA);
2454 offset+=4;
2456 /* uint64_t metadata; */
2457 proto_tree_add_item(inst_tree, hf_openflow_v4_instruction_write_metadata_value, tvb, offset, 8, ENC_BIG_ENDIAN);
2458 offset+=8;
2460 /* uint64_t metadata_mask; */
2461 proto_tree_add_item(inst_tree, hf_openflow_v4_instruction_write_metadata_mask, tvb, offset, 8, ENC_BIG_ENDIAN);
2462 offset+=8;
2463 break;
2465 case OFPIT_WRITE_ACTIONS:
2466 case OFPIT_APPLY_ACTIONS:
2467 case OFPIT_CLEAR_ACTIONS:
2468 proto_tree_add_item(inst_tree, hf_openflow_v4_instruction_actions_pad, tvb, offset, 4, ENC_NA);
2469 offset+=4;
2471 acts_end = offset + inst_length - 8;
2472 while (offset < acts_end) {
2473 offset = dissect_openflow_action_v4(tvb, pinfo, inst_tree, offset, length);
2475 break;
2477 case OFPIT_METER:
2478 /* uint32_t meter_id; */
2479 proto_tree_add_item(inst_tree, hf_openflow_v4_instruction_meter_meter_id, tvb, offset, 4, ENC_BIG_ENDIAN);
2480 offset+=4;
2481 break;
2483 case OFPIT_EXPERIMENTER:
2484 proto_tree_add_expert_format(inst_tree, pinfo, &ei_openflow_v4_instruction_undecoded,
2485 tvb, offset, inst_length - 8, "Experimenter instruction body.");
2486 offset += inst_length - 8;
2487 break;
2489 default:
2490 proto_tree_add_expert_format(inst_tree, pinfo, &ei_openflow_v4_instruction_undecoded,
2491 tvb, offset, inst_length - 4, "Unknown instruction body.");
2492 offset += inst_length - 4;
2493 break;
2496 return offset;
2500 static const value_string openflow_v4_flowmod_command_values[] = {
2501 { 0, "OFPFC_ADD" },
2502 { 1, "OFPFC_MODIFY" },
2503 { 2, "OFPFC_MODIFY_STRICT" },
2504 { 3, "OFPFC_DELETE" },
2505 { 4, "OFPFC_DELETE_STRICT" },
2506 { 0, NULL }
2509 #define OFPFF_SEND_FLOW_REM 1 << 0 /* Send flow removed message when flow expires or is deleted. */
2510 #define OFPFF_CHECK_OVERLAP 1 << 1 /* Check for overlapping entries first. */
2511 #define OFPFF_RESET_COUNTS 1 << 2 /* Reset flow packet and byte counts. */
2512 #define OFPFF_NO_PKT_COUNTS 1 << 3 /* Don't keep track of packet count. */
2513 #define OFPFF_NO_BYT_COUNTS 1 << 4 /* Don't keep track of byte count. */
2515 static void
2516 dissect_openflow_flowmod_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length)
2518 proto_item *ti;
2519 proto_tree *flags_tree;
2521 /* uint64_t cookie; */
2522 proto_tree_add_item(tree, hf_openflow_v4_flowmod_cookie, tvb, offset, 8, ENC_BIG_ENDIAN);
2523 offset+=8;
2525 /* uint64_t cookie_mask; */
2526 proto_tree_add_item(tree, hf_openflow_v4_flowmod_cookie_mask, tvb, offset, 8, ENC_BIG_ENDIAN);
2527 offset+=8;
2529 /* uint8_t table_id; */
2530 proto_tree_add_item(tree, hf_openflow_v4_flowmod_table_id, tvb, offset, 1, ENC_BIG_ENDIAN);
2531 offset+=1;
2533 /* uint8_t command; */
2534 proto_tree_add_item(tree, hf_openflow_v4_flowmod_command, tvb, offset, 1, ENC_BIG_ENDIAN);
2535 offset+=1;
2537 /* uint16_t idle_timeout; */
2538 proto_tree_add_item(tree, hf_openflow_v4_flowmod_idle_timeout, tvb, offset, 2, ENC_BIG_ENDIAN);
2539 offset+=2;
2541 /* uint16_t hard_timeout; */
2542 proto_tree_add_item(tree, hf_openflow_v4_flowmod_hard_timeout, tvb, offset, 2, ENC_BIG_ENDIAN);
2543 offset+=2;
2545 /* uint16_t priority; */
2546 proto_tree_add_item(tree, hf_openflow_v4_flowmod_priority, tvb, offset, 2, ENC_BIG_ENDIAN);
2547 offset+=2;
2549 /* uint32_t buffer_id; */
2550 proto_tree_add_item(tree, hf_openflow_v4_flowmod_buffer_id, tvb, offset, 4, ENC_BIG_ENDIAN);
2551 offset+=4;
2553 /* uint32_t out_port; */
2554 proto_tree_add_item(tree, hf_openflow_v4_flowmod_out_port, tvb, offset, 4, ENC_BIG_ENDIAN);
2555 offset+=4;
2557 /* uint32_t out_group; */
2558 proto_tree_add_item(tree, hf_openflow_v4_flowmod_out_group, tvb, offset, 4, ENC_BIG_ENDIAN);
2559 offset+=4;
2561 /* uint16_t flags; */
2562 ti = proto_tree_add_item(tree, hf_openflow_v4_flowmod_flags, tvb, offset, 2, ENC_BIG_ENDIAN);
2563 flags_tree = proto_item_add_subtree(ti, ett_openflow_v4_flowmod_flags);
2565 proto_tree_add_item(flags_tree, hf_openflow_v4_flowmod_flags_send_flow_rem, tvb, offset, 2, ENC_BIG_ENDIAN);
2566 proto_tree_add_item(flags_tree, hf_openflow_v4_flowmod_flags_check_overlap, tvb, offset, 2, ENC_BIG_ENDIAN);
2567 proto_tree_add_item(flags_tree, hf_openflow_v4_flowmod_flags_reset_counts, tvb, offset, 2, ENC_BIG_ENDIAN);
2568 proto_tree_add_item(flags_tree, hf_openflow_v4_flowmod_flags_no_packet_counts, tvb, offset, 2, ENC_BIG_ENDIAN);
2569 proto_tree_add_item(flags_tree, hf_openflow_v4_flowmod_flags_no_byte_counts, tvb, offset, 2, ENC_BIG_ENDIAN);
2570 offset+=2;
2572 /* uint8_t pad[2]; */
2573 proto_tree_add_item(tree, hf_openflow_v4_flowmod_pad, tvb, offset, 2, ENC_NA);
2574 offset+=2;
2576 /* struct ofp_match match; */
2577 offset = dissect_openflow_match_v4(tvb, pinfo, tree, offset, length);
2579 /* struct ofp_instruction instructions[0]; */
2580 while (offset < length) {
2581 offset = dissect_openflow_instruction_v4(tvb, pinfo, tree, offset, length);
2585 static int
2586 dissect_openflow_bucket_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length)
2588 proto_item *ti;
2589 proto_tree *bucket_tree;
2590 uint16_t bucket_length;
2591 int32_t acts_end;
2593 bucket_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_openflow_v4_bucket, &ti, "Bucket");
2595 /* uint16_t len; */
2596 bucket_length = tvb_get_ntohs(tvb, offset);
2597 proto_item_set_len(ti, bucket_length);
2598 proto_tree_add_item(bucket_tree, hf_openflow_v4_bucket_length, tvb, offset, 2, ENC_BIG_ENDIAN);
2599 offset+=2;
2601 if (bucket_length < 16) {
2602 bucket_length = 16;
2605 /* uint16_t weight; */
2606 proto_tree_add_item(bucket_tree, hf_openflow_v4_bucket_weight, tvb, offset, 2, ENC_BIG_ENDIAN);
2607 offset+=2;
2609 /* uint32_t watch_port; */
2610 proto_tree_add_item(bucket_tree, hf_openflow_v4_bucket_watch_port, tvb, offset, 4, ENC_BIG_ENDIAN);
2611 offset+=4;
2613 /* uint32_t watch_group; */
2614 proto_tree_add_item(bucket_tree, hf_openflow_v4_bucket_watch_group, tvb, offset, 4, ENC_BIG_ENDIAN);
2615 offset+=4;
2617 /* uint8_t pad[4]; */
2618 proto_tree_add_item(bucket_tree, hf_openflow_v4_bucket_pad, tvb, offset, 4, ENC_NA);
2619 offset+=4;
2621 /*struct ofp_action_header actions[0]; */
2622 acts_end = offset + bucket_length - 16;
2623 while (offset < acts_end) {
2624 offset = dissect_openflow_action_v4(tvb, pinfo, bucket_tree, offset, length);
2627 return offset;
2631 static const value_string openflow_v4_groupmod_command_values[] = {
2632 { 0, "OFPGC_ADD" },
2633 { 1, "OFPGC_MODIFY" },
2634 { 2, "OFPGC_DELETE" },
2635 { 0, NULL }
2638 #define OFPGT_ALL 0
2639 #define OFPGT_SELECT 1
2640 #define OFPGT_INDIRECT 2
2641 #define OFPGT_FF 3
2642 static const value_string openflow_v4_group_type_values[] = {
2643 { OFPGT_ALL, "OFPGT_ALL" },
2644 { OFPGT_SELECT, "OFPGT_SELECT" },
2645 { OFPGT_INDIRECT, "OFPGT_INDIRECT" },
2646 { OFPGT_FF, "OFPGT_FF" },
2647 { 0, NULL }
2650 static void
2651 dissect_openflow_groupmod_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length)
2653 /* uint16_t command; */
2654 proto_tree_add_item(tree, hf_openflow_v4_groupmod_command, tvb, offset, 2, ENC_BIG_ENDIAN);
2655 offset+=2;
2657 /* uint8_t type; */
2658 proto_tree_add_item(tree, hf_openflow_v4_groupmod_type, tvb, offset, 1, ENC_BIG_ENDIAN);
2659 offset+=1;
2661 /* uint8_t pad; */
2662 proto_tree_add_item(tree, hf_openflow_v4_groupmod_pad, tvb, offset, 1, ENC_NA);
2663 offset+=1;
2665 /* uint32_t group_id; */
2666 proto_tree_add_item(tree, hf_openflow_v4_groupmod_group_id, tvb, offset, 4, ENC_BIG_ENDIAN);
2667 offset+=4;
2669 /* struct ofp_bucket buckets[0]; */
2670 while (offset < length) {
2671 offset = dissect_openflow_bucket_v4(tvb, pinfo, tree, offset, length);
2676 static void
2677 dissect_openflow_portmod_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
2679 proto_item *ti;
2680 proto_tree *conf_tree, *mask_tree, *adv_tree;
2682 /* uint32_t port_no; */
2683 proto_tree_add_item(tree, hf_openflow_v4_portmod_port_no, tvb, offset, 4, ENC_BIG_ENDIAN);
2684 offset+=4;
2686 /* uint8_t pad[4]; */
2687 proto_tree_add_item(tree, hf_openflow_v4_portmod_pad, tvb, offset, 4, ENC_NA);
2688 offset+=4;
2690 /* uint8_t hw_addr[OFP_ETH_ALEN]; */
2691 proto_tree_add_item(tree, hf_openflow_v4_portmod_hw_addr, tvb, offset, OFP_ETH_ALEN, ENC_NA);
2692 offset+=OFP_ETH_ALEN;
2694 /* uint8_t pad2[2]; */
2695 proto_tree_add_item(tree, hf_openflow_v4_portmod_pad2, tvb, offset, 2, ENC_NA);
2696 offset+=2;
2698 /* uint32_t config; */
2699 ti = proto_tree_add_item(tree, hf_openflow_v4_portmod_config, tvb, offset, 4, ENC_BIG_ENDIAN);
2700 conf_tree = proto_item_add_subtree(ti, ett_openflow_v4_portmod_config);
2702 proto_tree_add_item(conf_tree, hf_openflow_v4_portmod_config_port_down, tvb, offset, 4, ENC_BIG_ENDIAN);
2703 proto_tree_add_item(conf_tree, hf_openflow_v4_portmod_config_no_recv, tvb, offset, 4, ENC_BIG_ENDIAN);
2704 proto_tree_add_item(conf_tree, hf_openflow_v4_portmod_config_no_fwd, tvb, offset, 4, ENC_BIG_ENDIAN);
2705 proto_tree_add_item(conf_tree, hf_openflow_v4_portmod_config_no_packet_in, tvb, offset, 4, ENC_BIG_ENDIAN);
2706 offset+=4;
2708 /* uint32_t mask; */
2709 ti = proto_tree_add_item(tree, hf_openflow_v4_portmod_mask, tvb, offset, 4, ENC_BIG_ENDIAN);
2710 mask_tree = proto_item_add_subtree(ti, ett_openflow_v4_portmod_mask);
2712 proto_tree_add_item(mask_tree, hf_openflow_v4_portmod_mask_port_down, tvb, offset, 4, ENC_BIG_ENDIAN);
2713 proto_tree_add_item(mask_tree, hf_openflow_v4_portmod_mask_no_recv, tvb, offset, 4, ENC_BIG_ENDIAN);
2714 proto_tree_add_item(mask_tree, hf_openflow_v4_portmod_mask_no_fwd, tvb, offset, 4, ENC_BIG_ENDIAN);
2715 proto_tree_add_item(mask_tree, hf_openflow_v4_portmod_mask_no_packet_in, tvb, offset, 4, ENC_BIG_ENDIAN);
2716 offset+=4;
2718 /* uint32_t advertise; */
2719 ti = proto_tree_add_item(tree, hf_openflow_v4_portmod_advertise, tvb, offset, 4, ENC_BIG_ENDIAN);
2720 adv_tree = proto_item_add_subtree(ti, ett_openflow_v4_portmod_advertise);
2722 proto_tree_add_item(adv_tree, hf_openflow_v4_portmod_advertise_10mb_hd, tvb, offset, 4, ENC_BIG_ENDIAN);
2723 proto_tree_add_item(adv_tree, hf_openflow_v4_portmod_advertise_10mb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2724 proto_tree_add_item(adv_tree, hf_openflow_v4_portmod_advertise_100mb_hd, tvb, offset, 4, ENC_BIG_ENDIAN);
2725 proto_tree_add_item(adv_tree, hf_openflow_v4_portmod_advertise_100mb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2726 proto_tree_add_item(adv_tree, hf_openflow_v4_portmod_advertise_1gb_hd, tvb, offset, 4, ENC_BIG_ENDIAN);
2727 proto_tree_add_item(adv_tree, hf_openflow_v4_portmod_advertise_1gb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2728 proto_tree_add_item(adv_tree, hf_openflow_v4_portmod_advertise_10gb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2729 proto_tree_add_item(adv_tree, hf_openflow_v4_portmod_advertise_40gb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2730 proto_tree_add_item(adv_tree, hf_openflow_v4_portmod_advertise_100gb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2731 proto_tree_add_item(adv_tree, hf_openflow_v4_portmod_advertise_1tb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2732 proto_tree_add_item(adv_tree, hf_openflow_v4_portmod_advertise_other, tvb, offset, 4, ENC_BIG_ENDIAN);
2733 proto_tree_add_item(adv_tree, hf_openflow_v4_portmod_advertise_copper, tvb, offset, 4, ENC_BIG_ENDIAN);
2734 proto_tree_add_item(adv_tree, hf_openflow_v4_portmod_advertise_fiber, tvb, offset, 4, ENC_BIG_ENDIAN);
2735 proto_tree_add_item(adv_tree, hf_openflow_v4_portmod_advertise_autoneg, tvb, offset, 4, ENC_BIG_ENDIAN);
2736 proto_tree_add_item(adv_tree, hf_openflow_v4_portmod_advertise_pause, tvb, offset, 4, ENC_BIG_ENDIAN);
2737 proto_tree_add_item(adv_tree, hf_openflow_v4_portmod_advertise_pause_asym, tvb, offset, 4, ENC_BIG_ENDIAN);
2738 offset+=4;
2740 /* uint8_t pad3[4]; */
2741 proto_tree_add_item(tree, hf_openflow_v4_portmod_pad3, tvb, offset, 4, ENC_NA);
2742 /*offset+=4;*/
2746 static void
2747 dissect_openflow_tablemod_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
2749 /* uint8_t table_id; */
2750 proto_tree_add_item(tree, hf_openflow_v4_tablemod_table_id, tvb, offset, 1, ENC_BIG_ENDIAN);
2751 offset+=1;
2753 /* uint8_t pad[3]; */
2754 proto_tree_add_item(tree, hf_openflow_v4_tablemod_pad, tvb, offset, 3, ENC_NA);
2755 offset+=3;
2757 /* uint32_t config; */
2758 proto_tree_add_item(tree, hf_openflow_v4_tablemod_config, tvb, offset, 4, ENC_NA);
2759 /*offset+=4;*/
2763 static void
2764 dissect_openflow_flow_stats_request_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length)
2767 /* uint8_t table_id; */
2768 proto_tree_add_item(tree, hf_openflow_v4_flow_stats_request_table_id, tvb, offset, 1, ENC_BIG_ENDIAN);
2769 offset+=1;
2771 /* uint8_t pad[3]; */
2772 proto_tree_add_item(tree, hf_openflow_v4_flow_stats_request_pad, tvb, offset, 3, ENC_NA);
2773 offset+=3;
2775 /* uint32_t out_port; */
2776 proto_tree_add_item(tree, hf_openflow_v4_flow_stats_request_out_port, tvb, offset, 4, ENC_BIG_ENDIAN);
2777 offset+=4;
2779 /* uint32_t out_group; */
2780 proto_tree_add_item(tree, hf_openflow_v4_flow_stats_request_out_group, tvb, offset, 4, ENC_BIG_ENDIAN);
2781 offset+=4;
2783 /* uint8_t pad2[4]; */
2784 proto_tree_add_item(tree, hf_openflow_v4_flow_stats_request_pad2, tvb, offset, 4, ENC_NA);
2785 offset+=4;
2787 /* uint64_t cookie; */
2788 proto_tree_add_item(tree, hf_openflow_v4_flow_stats_request_cookie, tvb, offset, 8, ENC_BIG_ENDIAN);
2789 offset+=8;
2791 /* uint64_t cookie_mask; */
2792 proto_tree_add_item(tree, hf_openflow_v4_flow_stats_request_cookie_mask, tvb, offset, 8, ENC_BIG_ENDIAN);
2793 offset+=8;
2795 /* struct ofp_match match; */
2796 dissect_openflow_match_v4(tvb, pinfo, tree, offset, length);
2799 static void
2800 dissect_openflow_aggregate_stats_request_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length)
2802 /* uint8_t table_id; */
2803 proto_tree_add_item(tree, hf_openflow_v4_aggregate_stats_request_table_id, tvb, offset, 1, ENC_BIG_ENDIAN);
2804 offset+=1;
2806 /* uint8_t pad[3]; */
2807 proto_tree_add_item(tree, hf_openflow_v4_aggregate_stats_request_pad, tvb, offset, 3, ENC_NA);
2808 offset+=3;
2810 /* uint32_t out_port; */
2811 proto_tree_add_item(tree, hf_openflow_v4_aggregate_stats_request_out_port, tvb, offset, 4, ENC_BIG_ENDIAN);
2812 offset+=4;
2814 /* uint32_t out_group; */
2815 proto_tree_add_item(tree, hf_openflow_v4_aggregate_stats_request_out_group, tvb, offset, 4, ENC_BIG_ENDIAN);
2816 offset+=4;
2818 /* uint8_t pad2[4]; */
2819 proto_tree_add_item(tree, hf_openflow_v4_aggregate_stats_request_pad2, tvb, offset, 4, ENC_NA);
2820 offset+=4;
2822 /* uint64_t cookie; */
2823 proto_tree_add_item(tree, hf_openflow_v4_aggregate_stats_request_cookie, tvb, offset, 8, ENC_BIG_ENDIAN);
2824 offset+=8;
2826 /* uint64_t cookie_mask; */
2827 proto_tree_add_item(tree, hf_openflow_v4_aggregate_stats_request_cookie_mask, tvb, offset, 8, ENC_BIG_ENDIAN);
2828 offset+=8;
2830 /* struct ofp_match match; */
2831 dissect_openflow_match_v4(tvb, pinfo, tree, offset, length);
2835 #define OFPTFPT_INSTRUCTIONS 0
2836 #define OFPTFPT_INSTRUCTIONS_MISS 1
2837 #define OFPTFPT_NEXT_TABLES 2
2838 #define OFPTFPT_NEXT_TABLES_MISS 3
2839 #define OFPTFPT_WRITE_ACTIONS 4
2840 #define OFPTFPT_WRITE_ACTIONS_MISS 5
2841 #define OFPTFPT_APPLY_ACTIONS 6
2842 #define OFPTFPT_APPLY_ACTIONS_MISS 7
2843 #define OFPTFPT_MATCH 8
2844 #define OFPTFPT_WILDCARDS 10
2845 #define OFPTFPT_WRITE_SETFIELD 12
2846 #define OFPTFPT_WRITE_SETFIELD_MISS 13
2847 #define OFPTFPT_APPLY_SETFIELD 14
2848 #define OFPTFPT_APPLY_SETFIELD_MISS 15
2849 #define OFPTFPT_EXPERIMENTER 0xFFFE
2850 #define OFPTFPT_EXPERIMENTER_MISS 0xFFFF
2851 static const value_string openflow_v4_table_feature_prop_type_values[] = {
2852 { OFPTFPT_INSTRUCTIONS, "OFPTFPT_INSTRUCTIONS" },
2853 { OFPTFPT_INSTRUCTIONS_MISS, "OFPTFPT_INSTRUCTIONS_MISS" },
2854 { OFPTFPT_NEXT_TABLES, "OFPTFPT_NEXT_TABLES" },
2855 { OFPTFPT_NEXT_TABLES_MISS, "OFPTFPT_NEXT_TABLES_MISS" },
2856 { OFPTFPT_WRITE_ACTIONS, "OFPTFPT_WRITE_ACTIONS" },
2857 { OFPTFPT_WRITE_ACTIONS_MISS, "OFPTFPT_WRITE_ACTIONS_MISS" },
2858 { OFPTFPT_APPLY_ACTIONS, "OFPTFPT_APPLY_ACTIONS" },
2859 { OFPTFPT_APPLY_ACTIONS_MISS, "OFPTFPT_APPLY_ACTIONS_MISS" },
2860 { OFPTFPT_MATCH, "OFPTFPT_MATCH" },
2861 { OFPTFPT_WILDCARDS, "OFPTFPT_WILDCARDS" },
2862 { OFPTFPT_WRITE_SETFIELD, "OFPTFPT_WRITE_SETFIELD" },
2863 { OFPTFPT_WRITE_SETFIELD_MISS, "OFPTFPT_WRITE_SETFIELD_MISS" },
2864 { OFPTFPT_APPLY_SETFIELD, "OFPTFPT_APPLY_SETFIELD" },
2865 { OFPTFPT_APPLY_SETFIELD_MISS, "OFPTFPT_APPLY_SETFIELD_MISS" },
2866 { OFPTFPT_EXPERIMENTER, "OFPTFPT_EXPERIMENTER" },
2867 { OFPTFPT_EXPERIMENTER_MISS, "OFPTFPT_EXPERIMENTER_MISS" },
2868 { 0, NULL }
2872 static int
2873 dissect_openflow_table_feature_prop_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length)
2875 proto_item *ti;
2876 proto_tree *prop_tree, *elem_tree;
2877 uint16_t prop_type;
2878 uint16_t prop_length;
2879 uint16_t elem_begin;
2880 int32_t body_end;
2881 uint16_t pad_length;
2883 prop_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_openflow_v4_table_feature_prop, &ti, "Table feature property");
2885 /* uint16_t type; */
2886 prop_type = tvb_get_ntohs(tvb, offset);
2887 proto_tree_add_item(prop_tree, hf_openflow_v4_table_feature_prop_type, tvb, offset, 2, ENC_BIG_ENDIAN);
2888 offset+=2;
2890 /* uint16_t length; */
2891 prop_length = tvb_get_ntohs(tvb, offset);
2892 proto_item_set_len(ti, prop_length);
2893 proto_tree_add_item(prop_tree, hf_openflow_v4_table_feature_prop_length, tvb, offset, 2, ENC_BIG_ENDIAN);
2894 offset+=2;
2896 if (prop_length < 4)
2897 return offset;
2899 body_end = offset + prop_length - 4;
2901 /* body */
2902 switch (prop_type) {
2903 case OFPTFPT_INSTRUCTIONS:
2904 case OFPTFPT_INSTRUCTIONS_MISS:
2905 while (offset < body_end) {
2906 elem_begin = offset;
2907 elem_tree = proto_tree_add_subtree(prop_tree, tvb, offset, -1,
2908 ett_openflow_v4_table_feature_prop_instruction_id, &ti, "Instruction ID");
2910 offset = dissect_openflow_instruction_header_v4(tvb, pinfo, elem_tree, offset, length);
2911 proto_item_set_len(ti, offset - elem_begin);
2913 break;
2915 case OFPTFPT_NEXT_TABLES:
2916 case OFPTFPT_NEXT_TABLES_MISS:
2917 while (offset < body_end) {
2918 proto_tree_add_item(prop_tree, hf_openflow_v4_table_feature_prop_next_tables_next_table_id, tvb, offset, 1, ENC_BIG_ENDIAN);
2919 offset+=1;
2921 break;
2923 case OFPTFPT_WRITE_ACTIONS:
2924 case OFPTFPT_WRITE_ACTIONS_MISS:
2925 case OFPTFPT_APPLY_ACTIONS:
2926 case OFPTFPT_APPLY_ACTIONS_MISS:
2927 while (offset < body_end) {
2928 elem_begin = offset;
2929 elem_tree = proto_tree_add_subtree(prop_tree, tvb, offset, -1, ett_openflow_v4_table_feature_prop_action_id, &ti, "Action ID");
2931 offset = dissect_openflow_action_header_v4(tvb, pinfo, elem_tree, offset, length);
2932 proto_item_set_len(ti, offset - elem_begin);
2934 break;
2936 case OFPTFPT_MATCH:
2937 case OFPTFPT_WILDCARDS:
2938 case OFPTFPT_WRITE_SETFIELD:
2939 case OFPTFPT_WRITE_SETFIELD_MISS:
2940 case OFPTFPT_APPLY_SETFIELD:
2941 case OFPTFPT_APPLY_SETFIELD_MISS:
2942 while (offset < body_end) {
2943 elem_begin = offset;
2944 elem_tree = proto_tree_add_subtree(prop_tree, tvb, offset, -1, ett_openflow_v4_table_feature_prop_oxm_id, &ti, "OXM ID");
2946 offset = dissect_openflow_oxm_header_v4(tvb, pinfo, elem_tree, offset, length);
2947 proto_item_set_len(ti, offset - elem_begin);
2949 break;
2951 case OFPTFPT_EXPERIMENTER:
2952 case OFPTFPT_EXPERIMENTER_MISS:
2953 /* uint32_t experimenter; */
2954 proto_tree_add_item(prop_tree, hf_openflow_v4_table_feature_prop_experimenter_experimenter, tvb, offset, 4, ENC_BIG_ENDIAN);
2955 offset+=4;
2957 /* uint32_t exp_type; */
2958 proto_tree_add_item(prop_tree, hf_openflow_v4_table_feature_prop_experimenter_exp_type, tvb, offset, 4, ENC_BIG_ENDIAN);
2959 offset+=4;
2961 /* uint32_t experimenter_data[0]; */
2962 proto_tree_add_expert_format(prop_tree, pinfo, &ei_openflow_v4_table_feature_prop_undecoded,
2963 tvb, offset, body_end - offset, "Experimenter table property body.");
2964 offset = body_end;
2965 break;
2967 default:
2968 proto_tree_add_expert_format(prop_tree, pinfo, &ei_openflow_v4_table_feature_prop_undecoded,
2969 tvb, offset, body_end - offset, "Unknown table property body.");
2970 offset = body_end;
2971 break;
2974 pad_length = (prop_length + 7)/8*8 - prop_length;
2975 if (pad_length > 0) {
2976 proto_tree_add_item(prop_tree, hf_openflow_v4_table_feature_prop_pad, tvb, offset, pad_length, ENC_NA);
2977 offset+=pad_length;
2980 return offset;
2984 #define OFP_MAX_TABLE_NAME_LEN 32
2985 static int
2986 dissect_openflow_table_features_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length)
2988 proto_item *ti;
2989 proto_tree *feat_tree;
2990 uint16_t feat_length;
2991 int32_t feat_end;
2993 feat_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_openflow_v4_table_features, &ti, "Table features");
2995 /* uint16_t length; */
2996 feat_length = tvb_get_ntohs(tvb, offset);
2997 feat_end = offset + feat_length;
2998 proto_item_set_len(ti, feat_length);
2999 proto_tree_add_item(feat_tree, hf_openflow_v4_table_features_length, tvb, offset, 2, ENC_BIG_ENDIAN);
3000 offset+=2;
3002 /* uint8_t table_id; */
3003 proto_tree_add_item(feat_tree, hf_openflow_v4_table_features_table_id, tvb, offset, 1, ENC_BIG_ENDIAN);
3004 offset+=1;
3006 /* uint8_t pad[5]; */
3007 proto_tree_add_item(feat_tree, hf_openflow_v4_table_features_pad, tvb, offset, 5, ENC_NA);
3008 offset+=5;
3010 /* char name[OFP_MAX_TABLE_NAME_LEN]; */
3011 proto_tree_add_item(feat_tree, hf_openflow_v4_table_features_name, tvb, offset, OFP_MAX_TABLE_NAME_LEN, ENC_ASCII);
3012 offset+=OFP_MAX_TABLE_NAME_LEN;
3014 /* uint64_t metadata_match; */
3015 proto_tree_add_item(feat_tree, hf_openflow_v4_table_features_metadata_match, tvb, offset, 8, ENC_BIG_ENDIAN);
3016 offset+=8;
3018 /* uint64_t metadata_write; */
3019 proto_tree_add_item(feat_tree, hf_openflow_v4_table_features_metadata_write, tvb, offset, 8, ENC_BIG_ENDIAN);
3020 offset+=8;
3022 /* uint32_t config; */
3023 proto_tree_add_item(feat_tree, hf_openflow_v4_table_features_config, tvb, offset, 4, ENC_NA);
3024 offset+=4;
3026 /* uint32_t max_entries; */
3027 proto_tree_add_item(feat_tree, hf_openflow_v4_table_features_max_entries, tvb, offset, 4, ENC_BIG_ENDIAN);
3028 offset+=4;
3030 /* struct ofp_table_feature_prop_header properties[0]; */
3031 while (offset < feat_end) {
3032 offset = dissect_openflow_table_feature_prop_v4(tvb, pinfo, feat_tree, offset, length);
3035 return offset;
3039 static void
3040 dissect_openflow_port_stats_request_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
3042 /* uint32_t port_no; */
3043 proto_tree_add_item(tree, hf_openflow_v4_port_stats_request_port_no, tvb, offset, 4, ENC_BIG_ENDIAN);
3044 offset+=4;
3046 /* uint8_t pad[4]; */
3047 proto_tree_add_item(tree, hf_openflow_v4_port_stats_request_pad, tvb, offset, 4, ENC_NA);
3048 /*offset+=4;*/
3051 #define OFPQ_ALL 0xffffffff
3052 static const value_string openflow_v4_queue_reserved_values[] = {
3053 { OFPQ_ALL, "OFPQ_ALL" },
3054 { 0, NULL }
3057 static void
3058 dissect_openflow_queue_stats_request_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
3060 /* uint32_t port_no; */
3061 proto_tree_add_item(tree, hf_openflow_v4_queue_stats_request_port_no, tvb, offset, 4, ENC_BIG_ENDIAN);
3062 offset+=4;
3064 /* uint32_t queue_id; */
3065 proto_tree_add_item(tree, hf_openflow_v4_queue_stats_request_queue_id, tvb, offset, 4, ENC_BIG_ENDIAN);
3066 /*offset+=4;*/
3070 static void
3071 dissect_openflow_group_stats_request_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
3073 /* uint32_t group_id; */
3074 proto_tree_add_item(tree, hf_openflow_v4_group_stats_request_group_id, tvb, offset, 4, ENC_BIG_ENDIAN);
3075 offset+=4;
3077 /* uint8_t pad[4]; */
3078 proto_tree_add_item(tree, hf_openflow_v4_group_stats_request_pad, tvb, offset, 4, ENC_NA);
3079 /*offset+=4;*/
3083 static void
3084 dissect_openflow_meter_stats_request_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
3086 /* uint32_t meter_id; */
3087 proto_tree_add_item(tree, hf_openflow_v4_meter_stats_request_meter_id, tvb, offset, 4, ENC_BIG_ENDIAN);
3088 offset+=4;
3090 /* uint8_t pad[4]; */
3091 proto_tree_add_item(tree, hf_openflow_v4_meter_stats_request_pad, tvb, offset, 4, ENC_NA);
3092 /*offset+=4;*/
3096 static void
3097 dissect_openflow_meter_config_request_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
3099 /* uint32_t meter_id; */
3100 proto_tree_add_item(tree, hf_openflow_v4_meter_config_request_meter_id, tvb, offset, 4, ENC_BIG_ENDIAN);
3101 offset+=4;
3103 /* uint8_t pad[4]; */
3104 proto_tree_add_item(tree, hf_openflow_v4_meter_config_request_pad, tvb, offset, 4, ENC_NA);
3105 /*offset+=4;*/
3109 #define OFPMP_DESC 0
3110 #define OFPMP_FLOW 1
3111 #define OFPMP_AGGREGATE 2
3112 #define OFPMP_TABLE 3
3113 #define OFPMP_PORT_STATS 4
3114 #define OFPMP_QUEUE 5
3115 #define OFPMP_GROUP 6
3116 #define OFPMP_GROUP_DESC 7
3117 #define OFPMP_GROUP_FEATURES 8
3118 #define OFPMP_METER 9
3119 #define OFPMP_METER_CONFIG 10
3120 #define OFPMP_METER_FEATURES 11
3121 #define OFPMP_TABLE_FEATURES 12
3122 #define OFPMP_PORT_DESC 13
3123 #define OFPMP_EXPERIMENTER 0xffff
3124 static const value_string openflow_v4_multipart_type_values[] = {
3125 { OFPMP_DESC, "OFPMP_DESC" },
3126 { OFPMP_FLOW, "OFPMP_FLOW" },
3127 { OFPMP_AGGREGATE, "OFPMP_AGGREGATE" },
3128 { OFPMP_TABLE, "OFPMP_TABLE" },
3129 { OFPMP_PORT_STATS, "OFPMP_PORT_STATS" },
3130 { OFPMP_QUEUE, "OFPMP_QUEUE" },
3131 { OFPMP_GROUP, "OFPMP_GROUP" },
3132 { OFPMP_GROUP_DESC, "OFPMP_GROUP_DESC" },
3133 { OFPMP_GROUP_FEATURES, "OFPMP_GROUP_FEATURES" },
3134 { OFPMP_METER, "OFPMP_METER" },
3135 { OFPMP_METER_CONFIG, "OFPMP_METER_CONFIG" },
3136 { OFPMP_METER_FEATURES, "OFPMP_METER_FEATURES" },
3137 { OFPMP_TABLE_FEATURES, "OFPMP_TABLE_FEATURES" },
3138 { OFPMP_PORT_DESC, "OFPMP_PORT_DESC" },
3139 { OFPMP_EXPERIMENTER, "OFPMP_EXPERIMENTER" },
3140 { 0, NULL }
3143 #define OFPMPF_REQ_MORE 1 << 0
3144 static void
3145 dissect_openflow_multipart_request_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length)
3147 proto_item *ti;
3148 proto_tree *flags_tree;
3149 uint16_t type;
3151 /* uint16_t type; */
3152 type = tvb_get_ntohs(tvb, offset);
3153 proto_tree_add_item(tree, hf_openflow_v4_multipart_request_type , tvb, offset, 2, ENC_BIG_ENDIAN);
3154 offset+=2;
3156 col_append_fstr(pinfo->cinfo, COL_INFO, ", %s",
3157 val_to_str_const(type, openflow_v4_multipart_type_values, "Unknown type"));
3159 /* uint16_t flags; */
3160 ti = proto_tree_add_item(tree, hf_openflow_v4_multipart_request_flags, tvb, offset, 2, ENC_BIG_ENDIAN);
3161 flags_tree = proto_item_add_subtree(ti, ett_openflow_v4_multipart_request_flags);
3163 proto_tree_add_item(flags_tree, hf_openflow_v4_multipart_request_flags_more, tvb, offset, 2, ENC_BIG_ENDIAN);
3164 offset+=2;
3166 /* uint8_t pad[4]; */
3167 proto_tree_add_item(tree, hf_openflow_v4_multipart_request_pad, tvb, offset, 4, ENC_NA);
3168 offset+=4;
3170 /* uint8_t body[0]; */
3171 switch(type){
3172 case OFPMP_DESC:
3173 /* The request body is empty. */
3174 break;
3175 case OFPMP_FLOW:
3176 dissect_openflow_flow_stats_request_v4(tvb, pinfo, tree, offset, length);
3177 break;
3178 case OFPMP_AGGREGATE:
3179 dissect_openflow_aggregate_stats_request_v4(tvb, pinfo, tree, offset, length);
3180 break;
3181 case OFPMP_TABLE:
3182 /* The request body is empty. */
3183 break;
3184 case OFPMP_PORT_STATS:
3185 dissect_openflow_port_stats_request_v4(tvb, pinfo, tree, offset, length);
3186 break;
3187 case OFPMP_QUEUE:
3188 dissect_openflow_queue_stats_request_v4(tvb, pinfo, tree, offset, length);
3189 break;
3190 case OFPMP_GROUP:
3191 dissect_openflow_group_stats_request_v4(tvb, pinfo, tree, offset, length);
3192 break;
3193 case OFPMP_GROUP_DESC:
3194 /* The request body is empty. */
3195 break;
3196 case OFPMP_GROUP_FEATURES:
3197 /* The request body is empty. */
3198 break;
3199 case OFPMP_METER:
3200 dissect_openflow_meter_stats_request_v4(tvb, pinfo, tree, offset, length);
3201 break;
3202 case OFPMP_METER_CONFIG:
3203 dissect_openflow_meter_config_request_v4(tvb, pinfo, tree, offset, length);
3204 break;
3205 case OFPMP_METER_FEATURES:
3206 /* The request body is empty. */
3207 break;
3208 case OFPMP_TABLE_FEATURES:
3209 while (offset < length) {
3210 offset = dissect_openflow_table_features_v4(tvb, pinfo, tree, offset, length);
3212 break;
3213 case OFPMP_PORT_DESC:
3214 /* The request body is empty. */
3215 break;
3216 case OFPMP_EXPERIMENTER:
3217 /* uint32_t experimenter; */
3218 proto_tree_add_item(tree, hf_openflow_v4_multipart_request_experimenter_experimenter, tvb, offset, 4, ENC_BIG_ENDIAN);
3219 offset+=4;
3221 /* uint32_t exp_type; */
3222 proto_tree_add_item(tree, hf_openflow_v4_multipart_request_experimenter_exp_type, tvb, offset, 4, ENC_BIG_ENDIAN);
3223 offset+=4;
3225 /* uint32_t experimenter_data[0]; */
3226 if (offset < length) {
3227 proto_tree_add_expert_format(tree, pinfo, &ei_openflow_v4_multipart_request_undecoded,
3228 tvb, offset, length - offset, "Experimenter multipart request body.");
3230 break;
3231 default:
3232 proto_tree_add_expert_format(tree, pinfo, &ei_openflow_v4_multipart_request_undecoded,
3233 tvb, offset, length - offset, "Unknown multipart request body.");
3234 break;
3239 #define DESC_STR_LEN 256
3240 #define SERIAL_NUM_LEN 32
3241 static void
3242 dissect_openflow_switch_description_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
3244 /* char mfr_desc[DESC_STR_LEN]; */
3245 proto_tree_add_item(tree, hf_openflow_v4_switch_description_mfr_desc, tvb, offset, DESC_STR_LEN, ENC_ASCII);
3246 offset+=DESC_STR_LEN;
3248 /* char hw_desc[DESC_STR_LEN]; */
3249 proto_tree_add_item(tree, hf_openflow_v4_switch_description_hw_desc, tvb, offset, DESC_STR_LEN, ENC_ASCII);
3250 offset+=DESC_STR_LEN;
3252 /* char sw_desc[DESC_STR_LEN]; */
3253 proto_tree_add_item(tree, hf_openflow_v4_switch_description_sw_desc, tvb, offset, DESC_STR_LEN, ENC_ASCII);
3254 offset+=DESC_STR_LEN;
3256 /* char serial_num[SERIAL_NUM_LEN]; */
3257 proto_tree_add_item(tree, hf_openflow_v4_switch_description_serial_num, tvb, offset, SERIAL_NUM_LEN, ENC_ASCII);
3258 offset+=SERIAL_NUM_LEN;
3260 /* char dp_desc[DESC_STR_LEN]; */
3261 proto_tree_add_item(tree, hf_openflow_v4_switch_description_dp_desc, tvb, offset, DESC_STR_LEN, ENC_ASCII);
3262 /*offset+=DESC_STR_LEN;*/
3266 static int
3267 dissect_openflow_flow_stats_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
3269 proto_item *ti;
3270 proto_tree *stats_tree, *flags_tree;
3271 uint16_t stats_len;
3272 int32_t stats_end;
3274 stats_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_openflow_v4_flow_stats, &ti, "Flow stats");
3276 /* uint16_t length; */
3277 stats_len = tvb_get_ntohs(tvb, offset);
3278 stats_end = offset + stats_len;
3279 proto_item_set_len(ti, stats_len);
3280 proto_tree_add_item(stats_tree, hf_openflow_v4_flow_stats_length, tvb, offset, 2, ENC_BIG_ENDIAN);
3281 offset+=2;
3283 /* uint8_t table_id; */
3284 proto_tree_add_item(stats_tree, hf_openflow_v4_flow_stats_table_id, tvb, offset, 1, ENC_BIG_ENDIAN);
3285 offset+=1;
3287 /* uint8_t pad; */
3288 proto_tree_add_item(stats_tree, hf_openflow_v4_flow_stats_pad, tvb, offset, 1, ENC_NA);
3289 offset+=1;
3291 /* uint32_t duration_sec; */
3292 proto_tree_add_item(stats_tree, hf_openflow_v4_flow_stats_duration_sec, tvb, offset, 4, ENC_BIG_ENDIAN);
3293 offset+=4;
3295 /* uint32_t duration_nsec; */
3296 proto_tree_add_item(stats_tree, hf_openflow_v4_flow_stats_duration_nsec, tvb, offset, 4, ENC_BIG_ENDIAN);
3297 offset+=4;
3299 /* uint16_t priority; */
3300 proto_tree_add_item(stats_tree, hf_openflow_v4_flow_stats_priority, tvb, offset, 2, ENC_BIG_ENDIAN);
3301 offset+=2;
3303 /* uint16_t idle_timeout; */
3304 proto_tree_add_item(stats_tree, hf_openflow_v4_flow_stats_idle_timeout, tvb, offset, 2, ENC_BIG_ENDIAN);
3305 offset+=2;
3307 /* uint16_t hard_timeout; */
3308 proto_tree_add_item(stats_tree, hf_openflow_v4_flow_stats_hard_timeout, tvb, offset, 2, ENC_BIG_ENDIAN);
3309 offset+=2;
3311 /* uint16_t flags; */
3312 ti = proto_tree_add_item(stats_tree, hf_openflow_v4_flow_stats_flags, tvb, offset, 2, ENC_BIG_ENDIAN);
3313 flags_tree = proto_item_add_subtree(ti, ett_openflow_v4_flow_stats_flags);
3315 proto_tree_add_item(flags_tree, hf_openflow_v4_flow_stats_flags_send_flow_rem, tvb, offset, 2, ENC_BIG_ENDIAN);
3316 proto_tree_add_item(flags_tree, hf_openflow_v4_flow_stats_flags_check_overlap, tvb, offset, 2, ENC_BIG_ENDIAN);
3317 proto_tree_add_item(flags_tree, hf_openflow_v4_flow_stats_flags_reset_counts, tvb, offset, 2, ENC_BIG_ENDIAN);
3318 proto_tree_add_item(flags_tree, hf_openflow_v4_flow_stats_flags_no_packet_counts, tvb, offset, 2, ENC_BIG_ENDIAN);
3319 proto_tree_add_item(flags_tree, hf_openflow_v4_flow_stats_flags_no_byte_counts, tvb, offset, 2, ENC_BIG_ENDIAN);
3320 offset+=2;
3322 /* uint8_t pad2[4]; */
3323 proto_tree_add_item(stats_tree, hf_openflow_v4_flow_stats_pad2, tvb, offset, 4, ENC_NA);
3324 offset+=4;
3326 /* uint64_t cookie; */
3327 proto_tree_add_item(stats_tree, hf_openflow_v4_flow_stats_cookie, tvb, offset, 8, ENC_BIG_ENDIAN);
3328 offset+=8;
3330 /* uint64_t packet_count; */
3331 proto_tree_add_item(stats_tree, hf_openflow_v4_flow_stats_packet_count, tvb, offset, 8, ENC_BIG_ENDIAN);
3332 offset+=8;
3334 /* uint64_t byte_count; */
3335 proto_tree_add_item(stats_tree, hf_openflow_v4_flow_stats_byte_count, tvb, offset, 8, ENC_BIG_ENDIAN);
3336 offset+=8;
3338 /* struct ofp_match match; */
3339 offset = dissect_openflow_match_v4(tvb, pinfo, stats_tree, offset, length);
3341 /* struct ofp_instruction instructions[0]; */
3342 while (offset < stats_end) {
3343 offset = dissect_openflow_instruction_v4(tvb, pinfo, stats_tree, offset, length);
3346 return offset;
3350 static void
3351 dissect_openflow_aggregate_stats_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
3353 /* uint64_t packet_count; */
3354 proto_tree_add_item(tree, hf_openflow_v4_aggregate_stats_packet_count, tvb, offset, 8, ENC_BIG_ENDIAN);
3355 offset+=8;
3357 /* uint64_t byte_count; */
3358 proto_tree_add_item(tree, hf_openflow_v4_aggregate_stats_byte_count, tvb, offset, 8, ENC_BIG_ENDIAN);
3359 offset+=8;
3361 /* uint32_t flow_count; */
3362 proto_tree_add_item(tree, hf_openflow_v4_aggregate_stats_flow_count, tvb, offset, 4, ENC_BIG_ENDIAN);
3363 offset+=4;
3365 /* uint8_t pad[4]; */
3366 proto_tree_add_item(tree, hf_openflow_v4_aggregate_stats_pad, tvb, offset, 4, ENC_NA);
3367 /*offset+=4;*/
3371 static int
3372 dissect_openflow_table_stats_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
3374 proto_tree *stats_tree;
3376 stats_tree = proto_tree_add_subtree(tree, tvb, offset, 24, ett_openflow_v4_table_stats, NULL, "Table stats");
3378 /* uint8_t table_id; */
3379 proto_tree_add_item(stats_tree, hf_openflow_v4_table_stats_table_id, tvb, offset, 1, ENC_BIG_ENDIAN);
3380 offset+=1;
3382 /* uint8_t pad[3]; */
3383 proto_tree_add_item(stats_tree, hf_openflow_v4_table_stats_pad, tvb, offset, 3, ENC_NA);
3384 offset+=3;
3386 /* uint32_t active_count; */
3387 proto_tree_add_item(stats_tree, hf_openflow_v4_table_stats_active_count, tvb, offset, 4, ENC_BIG_ENDIAN);
3388 offset+=4;
3390 /* uint64_t lookup_count; */
3391 proto_tree_add_item(stats_tree, hf_openflow_v4_table_stats_lookup_count, tvb, offset, 8, ENC_BIG_ENDIAN);
3392 offset+=8;
3394 /* uint64_t matched_count; */
3395 proto_tree_add_item(stats_tree, hf_openflow_v4_table_stats_match_count, tvb, offset, 8, ENC_BIG_ENDIAN);
3396 offset+=8;
3398 return offset;
3402 static int
3403 dissect_openflow_port_stats_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
3405 proto_tree *stats_tree;
3407 stats_tree = proto_tree_add_subtree(tree, tvb, offset, 112, ett_openflow_v4_port_stats, NULL, "Port stats");
3409 /* uint8_t port_no; */
3410 proto_tree_add_item(stats_tree, hf_openflow_v4_port_stats_port_no, tvb, offset, 4, ENC_BIG_ENDIAN);
3411 offset+=4;
3413 /* uint8_t pad[4]; */
3414 proto_tree_add_item(stats_tree, hf_openflow_v4_port_stats_pad, tvb, offset, 4, ENC_NA);
3415 offset+=4;
3417 /* uint64_t rx_packets; */
3418 proto_tree_add_item(stats_tree, hf_openflow_v4_port_stats_rx_packets, tvb, offset, 8, ENC_BIG_ENDIAN);
3419 offset+=8;
3421 /* uint64_t tx_packets; */
3422 proto_tree_add_item(stats_tree, hf_openflow_v4_port_stats_tx_packets, tvb, offset, 8, ENC_BIG_ENDIAN);
3423 offset+=8;
3425 /* uint64_t rx_bytes; */
3426 proto_tree_add_item(stats_tree, hf_openflow_v4_port_stats_rx_bytes, tvb, offset, 8, ENC_BIG_ENDIAN);
3427 offset+=8;
3429 /* uint64_t tx_bytes; */
3430 proto_tree_add_item(stats_tree, hf_openflow_v4_port_stats_tx_bytes, tvb, offset, 8, ENC_BIG_ENDIAN);
3431 offset+=8;
3433 /* uint64_t rx_dropped; */
3434 proto_tree_add_item(stats_tree, hf_openflow_v4_port_stats_rx_dropped, tvb, offset, 8, ENC_BIG_ENDIAN);
3435 offset+=8;
3437 /* uint64_t tx_dropped; */
3438 proto_tree_add_item(stats_tree, hf_openflow_v4_port_stats_tx_dropped, tvb, offset, 8, ENC_BIG_ENDIAN);
3439 offset+=8;
3441 /* uint64_t rx_errors; */
3442 proto_tree_add_item(stats_tree, hf_openflow_v4_port_stats_rx_errors, tvb, offset, 8, ENC_BIG_ENDIAN);
3443 offset+=8;
3445 /* uint64_t tx_errors; */
3446 proto_tree_add_item(stats_tree, hf_openflow_v4_port_stats_tx_errors, tvb, offset, 8, ENC_BIG_ENDIAN);
3447 offset+=8;
3449 /* uint64_t rx_frame_error; */
3450 proto_tree_add_item(stats_tree, hf_openflow_v4_port_stats_rx_frame_error, tvb, offset, 8, ENC_BIG_ENDIAN);
3451 offset+=8;
3453 /* uint64_t rx_over_error; */
3454 proto_tree_add_item(stats_tree, hf_openflow_v4_port_stats_rx_over_error, tvb, offset, 8, ENC_BIG_ENDIAN);
3455 offset+=8;
3457 /* uint64_t rx_crc_error; */
3458 proto_tree_add_item(stats_tree, hf_openflow_v4_port_stats_rx_crc_error, tvb, offset, 8, ENC_BIG_ENDIAN);
3459 offset+=8;
3461 /* uint64_t collisions; */
3462 proto_tree_add_item(stats_tree, hf_openflow_v4_port_stats_collisions, tvb, offset, 8, ENC_BIG_ENDIAN);
3463 offset+=8;
3465 /* uint32_t duration_sec; */
3466 proto_tree_add_item(stats_tree, hf_openflow_v4_port_stats_duration_sec, tvb, offset, 4, ENC_BIG_ENDIAN);
3467 offset+=4;
3469 /* uint32_t duration_nsec; */
3470 proto_tree_add_item(stats_tree, hf_openflow_v4_port_stats_duration_nsec, tvb, offset, 4, ENC_BIG_ENDIAN);
3471 offset+=4;
3473 return offset;
3477 static int
3478 dissect_openflow_queue_stats_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
3480 proto_tree *stats_tree;
3482 stats_tree = proto_tree_add_subtree(tree, tvb, offset, 40, ett_openflow_v4_queue_stats, NULL, "Queue stats");
3484 /* uint32_t port_no; */
3485 proto_tree_add_item(stats_tree, hf_openflow_v4_queue_stats_port_no, tvb, offset, 4, ENC_BIG_ENDIAN);
3486 offset+=4;
3488 /* uint32_t queue_id; */
3489 proto_tree_add_item(stats_tree, hf_openflow_v4_queue_stats_queue_id, tvb, offset, 4, ENC_BIG_ENDIAN);
3490 offset+=4;
3492 /* uint64_t tx_bytes; */
3493 proto_tree_add_item(stats_tree, hf_openflow_v4_queue_stats_tx_bytes, tvb, offset, 8, ENC_BIG_ENDIAN);
3494 offset+=8;
3496 /* uint64_t tx_packets; */
3497 proto_tree_add_item(stats_tree, hf_openflow_v4_queue_stats_tx_packets, tvb, offset, 8, ENC_BIG_ENDIAN);
3498 offset+=8;
3500 /* uint64_t tx_errors; */
3501 proto_tree_add_item(stats_tree, hf_openflow_v4_queue_stats_tx_errors, tvb, offset, 8, ENC_BIG_ENDIAN);
3502 offset+=8;
3504 /* uint32_t duration_sec; */
3505 proto_tree_add_item(stats_tree, hf_openflow_v4_queue_stats_duration_sec, tvb, offset, 4, ENC_BIG_ENDIAN);
3506 offset+=4;
3508 /* uint32_t duration_nsec; */
3509 proto_tree_add_item(stats_tree, hf_openflow_v4_queue_stats_duration_nsec, tvb, offset, 4, ENC_BIG_ENDIAN);
3510 offset+=4;
3512 return offset;
3516 static int
3517 dissect_openflow_bucket_counter_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
3519 proto_tree *counter_tree;
3521 counter_tree = proto_tree_add_subtree(tree, tvb, offset, 16, ett_openflow_v4_bucket_counter, NULL, "Bucket counter");
3523 /* uint64_t packet_count; */
3524 proto_tree_add_item(counter_tree, hf_openflow_v4_bucket_counter_packet_count, tvb, offset, 8, ENC_BIG_ENDIAN);
3525 offset+=8;
3527 /* uint64_t byte_count; */
3528 proto_tree_add_item(counter_tree, hf_openflow_v4_bucket_counter_byte_count, tvb, offset, 8, ENC_BIG_ENDIAN);
3529 offset+=8;
3531 return offset;
3535 static int
3536 dissect_openflow_group_stats_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
3538 proto_item *ti;
3539 proto_tree *stats_tree;
3540 uint16_t stats_len;
3541 int32_t stats_end;
3543 stats_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_openflow_v4_group_stats, &ti, "Group stats");
3545 /* uint16_t length; */
3546 stats_len = tvb_get_ntohs(tvb, offset);
3547 stats_end = offset + stats_len;
3548 proto_item_set_len(ti, stats_len);
3549 proto_tree_add_item(stats_tree, hf_openflow_v4_group_stats_length, tvb, offset, 2, ENC_BIG_ENDIAN);
3550 offset+=2;
3552 /* uint8_t pad[2]; */
3553 proto_tree_add_item(stats_tree, hf_openflow_v4_group_stats_pad, tvb, offset, 2, ENC_NA);
3554 offset+=2;
3556 /* uint32_t group_id; */
3557 proto_tree_add_item(stats_tree, hf_openflow_v4_group_stats_group_id, tvb, offset, 4, ENC_BIG_ENDIAN);
3558 offset+=4;
3560 /* uint32_t ref_count; */
3561 proto_tree_add_item(stats_tree, hf_openflow_v4_group_stats_ref_count, tvb, offset, 4, ENC_BIG_ENDIAN);
3562 offset+=4;
3564 /* uint8_t pad2[4]; */
3565 proto_tree_add_item(stats_tree, hf_openflow_v4_group_stats_pad2, tvb, offset, 4, ENC_NA);
3566 offset+=4;
3568 /* uint64_t packet_count; */
3569 proto_tree_add_item(stats_tree, hf_openflow_v4_group_stats_packet_count, tvb, offset, 8, ENC_BIG_ENDIAN);
3570 offset+=8;
3572 /* uint64_t byte_count; */
3573 proto_tree_add_item(stats_tree, hf_openflow_v4_group_stats_byte_count, tvb, offset, 8, ENC_BIG_ENDIAN);
3574 offset+=8;
3576 /* uint32_t duration_sec; */
3577 proto_tree_add_item(stats_tree, hf_openflow_v4_flow_stats_duration_sec, tvb, offset, 4, ENC_BIG_ENDIAN);
3578 offset+=4;
3580 /* uint32_t duration_nsec; */
3581 proto_tree_add_item(stats_tree, hf_openflow_v4_flow_stats_duration_nsec, tvb, offset, 4, ENC_BIG_ENDIAN);
3582 offset+=4;
3584 /* struct ofp_bucket_counter bucket_stats[0]; */
3585 while (offset < stats_end) {
3586 offset = dissect_openflow_bucket_counter_v4(tvb, pinfo, stats_tree, offset, length);
3589 return offset;
3592 static int
3593 dissect_openflow_group_desc_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length)
3595 proto_item *ti;
3596 proto_tree *desc_tree;
3598 uint16_t desc_len;
3599 int32_t desc_end;
3601 desc_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_openflow_v4_group_desc, &ti, "Group description");
3603 /* uint16_t length; */
3604 desc_len = tvb_get_ntohs(tvb, offset);
3605 desc_end = offset + desc_len;
3606 proto_item_set_len(ti, desc_len);
3607 proto_tree_add_item(desc_tree, hf_openflow_v4_group_desc_length, tvb, offset, 2, ENC_BIG_ENDIAN);
3608 offset+=2;
3610 /* uint8_t type; */
3611 proto_tree_add_item(desc_tree, hf_openflow_v4_group_desc_type, tvb, offset, 1, ENC_BIG_ENDIAN);
3612 offset+=1;
3614 /* uint8_t pad; */
3615 proto_tree_add_item(desc_tree, hf_openflow_v4_group_desc_pad, tvb, offset, 1, ENC_NA);
3616 offset+=1;
3618 /* uint32_t group_id; */
3619 proto_tree_add_item(desc_tree, hf_openflow_v4_group_desc_group_id, tvb, offset, 4, ENC_BIG_ENDIAN);
3620 offset+=4;
3622 /* struct ofp_bucket buckets[0]; */
3623 while (offset < desc_end) {
3624 offset = dissect_openflow_bucket_v4(tvb, pinfo, desc_tree, offset, length);
3627 return offset;
3631 #define OFPGFC_SELECT_WEIGHT 1 << 0
3632 #define OFPGFC_SELECT_LIVENESS 1 << 1
3633 #define OFPGFC_CHAINING 1 << 2
3634 #define OFPGFC_CHAINING_CHECKS 1 << 3
3635 static void
3636 dissect_openflow_group_features_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
3638 proto_item *ti;
3639 proto_tree *types_tree, *caps_tree, *acts_tree;
3641 /* uint32_t types; */
3642 ti = proto_tree_add_item(tree, hf_openflow_v4_group_features_types, tvb, offset, 4, ENC_BIG_ENDIAN);
3643 types_tree = proto_item_add_subtree(ti, ett_openflow_v4_group_features_types);
3645 proto_tree_add_item(types_tree, hf_openflow_v4_group_features_types_all, tvb, offset, 4, ENC_BIG_ENDIAN);
3646 proto_tree_add_item(types_tree, hf_openflow_v4_group_features_types_select, tvb, offset, 4, ENC_BIG_ENDIAN);
3647 proto_tree_add_item(types_tree, hf_openflow_v4_group_features_types_indirect, tvb, offset, 4, ENC_BIG_ENDIAN);
3648 proto_tree_add_item(types_tree, hf_openflow_v4_group_features_types_ff, tvb, offset, 4, ENC_BIG_ENDIAN);
3649 offset+=4;
3651 /* uint32_t capabilities; */
3652 ti = proto_tree_add_item(tree, hf_openflow_v4_group_features_capabilities, tvb, offset, 4, ENC_BIG_ENDIAN);
3653 caps_tree = proto_item_add_subtree(ti, ett_openflow_v4_group_features_capabilities);
3655 proto_tree_add_item(caps_tree, hf_openflow_v4_group_features_capabilities_select_weight, tvb, offset, 4, ENC_BIG_ENDIAN);
3656 proto_tree_add_item(caps_tree, hf_openflow_v4_group_features_capabilities_select_liveness, tvb, offset, 4, ENC_BIG_ENDIAN);
3657 proto_tree_add_item(caps_tree, hf_openflow_v4_group_features_capabilities_chaining, tvb, offset, 4, ENC_BIG_ENDIAN);
3658 proto_tree_add_item(caps_tree, hf_openflow_v4_group_features_capabilities_chaining_checks, tvb, offset, 4, ENC_BIG_ENDIAN);
3659 offset+=4;
3661 /* max_groups[4]; */
3662 proto_tree_add_item(tree, hf_openflow_v4_group_features_max_groups_all, tvb, offset, 4, ENC_BIG_ENDIAN);
3663 offset+=4;
3664 proto_tree_add_item(tree, hf_openflow_v4_group_features_max_groups_select, tvb, offset, 4, ENC_BIG_ENDIAN);
3665 offset+=4;
3666 proto_tree_add_item(tree, hf_openflow_v4_group_features_max_groups_indirect, tvb, offset, 4, ENC_BIG_ENDIAN);
3667 offset+=4;
3668 proto_tree_add_item(tree, hf_openflow_v4_group_features_max_groups_ff, tvb, offset, 4, ENC_BIG_ENDIAN);
3669 offset+=4;
3671 /* uint32_t actions[4]; */
3672 ti = proto_tree_add_item(tree, hf_openflow_v4_group_features_actions_all, tvb, offset, 4, ENC_BIG_ENDIAN);
3673 acts_tree = proto_item_add_subtree(ti, ett_openflow_v4_group_features_actions_all);
3675 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_all_output, tvb, offset, 4, ENC_BIG_ENDIAN);
3676 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_all_copy_ttl_out, tvb, offset, 4, ENC_BIG_ENDIAN);
3677 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_all_copy_ttl_in, tvb, offset, 4, ENC_BIG_ENDIAN);
3678 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_all_set_mpls_ttl, tvb, offset, 4, ENC_BIG_ENDIAN);
3679 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_all_dec_mpls_ttl, tvb, offset, 4, ENC_BIG_ENDIAN);
3680 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_all_push_vlan, tvb, offset, 4, ENC_BIG_ENDIAN);
3681 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_all_pop_vlan, tvb, offset, 4, ENC_BIG_ENDIAN);
3682 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_all_push_mpls, tvb, offset, 4, ENC_BIG_ENDIAN);
3683 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_all_pop_mpls, tvb, offset, 4, ENC_BIG_ENDIAN);
3684 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_all_set_queue, tvb, offset, 4, ENC_BIG_ENDIAN);
3685 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_all_group, tvb, offset, 4, ENC_BIG_ENDIAN);
3686 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_all_set_nw_ttl, tvb, offset, 4, ENC_BIG_ENDIAN);
3687 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_all_dec_nw_ttl, tvb, offset, 4, ENC_BIG_ENDIAN);
3688 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_all_set_field, tvb, offset, 4, ENC_BIG_ENDIAN);
3689 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_all_push_pbb, tvb, offset, 4, ENC_BIG_ENDIAN);
3690 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_all_pop_pbb, tvb, offset, 4, ENC_BIG_ENDIAN);
3691 offset+=4;
3693 ti = proto_tree_add_item(tree, hf_openflow_v4_group_features_actions_select, tvb, offset, 4, ENC_BIG_ENDIAN);
3694 acts_tree = proto_item_add_subtree(ti, ett_openflow_v4_group_features_actions_select);
3696 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_select_output, tvb, offset, 4, ENC_BIG_ENDIAN);
3697 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_select_copy_ttl_out, tvb, offset, 4, ENC_BIG_ENDIAN);
3698 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_select_copy_ttl_in, tvb, offset, 4, ENC_BIG_ENDIAN);
3699 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_select_set_mpls_ttl, tvb, offset, 4, ENC_BIG_ENDIAN);
3700 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_select_dec_mpls_ttl, tvb, offset, 4, ENC_BIG_ENDIAN);
3701 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_select_push_vlan, tvb, offset, 4, ENC_BIG_ENDIAN);
3702 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_select_pop_vlan, tvb, offset, 4, ENC_BIG_ENDIAN);
3703 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_select_push_mpls, tvb, offset, 4, ENC_BIG_ENDIAN);
3704 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_select_pop_mpls, tvb, offset, 4, ENC_BIG_ENDIAN);
3705 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_select_set_queue, tvb, offset, 4, ENC_BIG_ENDIAN);
3706 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_select_group, tvb, offset, 4, ENC_BIG_ENDIAN);
3707 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_select_set_nw_ttl, tvb, offset, 4, ENC_BIG_ENDIAN);
3708 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_select_dec_nw_ttl, tvb, offset, 4, ENC_BIG_ENDIAN);
3709 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_select_set_field, tvb, offset, 4, ENC_BIG_ENDIAN);
3710 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_select_push_pbb, tvb, offset, 4, ENC_BIG_ENDIAN);
3711 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_select_pop_pbb, tvb, offset, 4, ENC_BIG_ENDIAN);
3712 offset+=4;
3714 ti = proto_tree_add_item(tree, hf_openflow_v4_group_features_actions_indirect, tvb, offset, 4, ENC_BIG_ENDIAN);
3715 acts_tree = proto_item_add_subtree(ti, ett_openflow_v4_group_features_actions_indirect);
3717 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_indirect_output, tvb, offset, 4, ENC_BIG_ENDIAN);
3718 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_indirect_copy_ttl_out, tvb, offset, 4, ENC_BIG_ENDIAN);
3719 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_indirect_copy_ttl_in, tvb, offset, 4, ENC_BIG_ENDIAN);
3720 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_indirect_set_mpls_ttl, tvb, offset, 4, ENC_BIG_ENDIAN);
3721 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_indirect_dec_mpls_ttl, tvb, offset, 4, ENC_BIG_ENDIAN);
3722 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_indirect_push_vlan, tvb, offset, 4, ENC_BIG_ENDIAN);
3723 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_indirect_pop_vlan, tvb, offset, 4, ENC_BIG_ENDIAN);
3724 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_indirect_push_mpls, tvb, offset, 4, ENC_BIG_ENDIAN);
3725 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_indirect_pop_mpls, tvb, offset, 4, ENC_BIG_ENDIAN);
3726 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_indirect_set_queue, tvb, offset, 4, ENC_BIG_ENDIAN);
3727 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_indirect_group, tvb, offset, 4, ENC_BIG_ENDIAN);
3728 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_indirect_set_nw_ttl, tvb, offset, 4, ENC_BIG_ENDIAN);
3729 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_indirect_dec_nw_ttl, tvb, offset, 4, ENC_BIG_ENDIAN);
3730 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_indirect_set_field, tvb, offset, 4, ENC_BIG_ENDIAN);
3731 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_indirect_push_pbb, tvb, offset, 4, ENC_BIG_ENDIAN);
3732 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_indirect_pop_pbb, tvb, offset, 4, ENC_BIG_ENDIAN);
3733 offset+=4;
3735 ti = proto_tree_add_item(tree, hf_openflow_v4_group_features_actions_ff, tvb, offset, 4, ENC_BIG_ENDIAN);
3736 acts_tree = proto_item_add_subtree(ti, ett_openflow_v4_group_features_actions_ff);
3738 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_ff_output, tvb, offset, 4, ENC_BIG_ENDIAN);
3739 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_ff_copy_ttl_out, tvb, offset, 4, ENC_BIG_ENDIAN);
3740 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_ff_copy_ttl_in, tvb, offset, 4, ENC_BIG_ENDIAN);
3741 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_ff_set_mpls_ttl, tvb, offset, 4, ENC_BIG_ENDIAN);
3742 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_ff_dec_mpls_ttl, tvb, offset, 4, ENC_BIG_ENDIAN);
3743 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_ff_push_vlan, tvb, offset, 4, ENC_BIG_ENDIAN);
3744 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_ff_pop_vlan, tvb, offset, 4, ENC_BIG_ENDIAN);
3745 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_ff_push_mpls, tvb, offset, 4, ENC_BIG_ENDIAN);
3746 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_ff_pop_mpls, tvb, offset, 4, ENC_BIG_ENDIAN);
3747 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_ff_set_queue, tvb, offset, 4, ENC_BIG_ENDIAN);
3748 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_ff_group, tvb, offset, 4, ENC_BIG_ENDIAN);
3749 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_ff_set_nw_ttl, tvb, offset, 4, ENC_BIG_ENDIAN);
3750 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_ff_dec_nw_ttl, tvb, offset, 4, ENC_BIG_ENDIAN);
3751 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_ff_set_field, tvb, offset, 4, ENC_BIG_ENDIAN);
3752 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_ff_push_pbb, tvb, offset, 4, ENC_BIG_ENDIAN);
3753 proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_ff_pop_pbb, tvb, offset, 4, ENC_BIG_ENDIAN);
3754 /*offset+=4;*/
3758 static int
3759 dissect_openflow_meter_band_stats_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
3761 proto_tree *stats_tree;
3763 stats_tree = proto_tree_add_subtree(tree, tvb, offset, 16, ett_openflow_v4_meter_band_stats, NULL, "Meter band stats");
3765 /* uint64_t packet_band_count; */
3766 proto_tree_add_item(stats_tree, hf_openflow_v4_meter_band_stats_packet_band_count, tvb, offset, 8, ENC_BIG_ENDIAN);
3767 offset+=8;
3769 /* uint64_t byte_band_count; */
3770 proto_tree_add_item(stats_tree, hf_openflow_v4_meter_band_stats_byte_band_count, tvb, offset, 8, ENC_BIG_ENDIAN);
3771 offset+=8;
3773 return offset;
3777 static int
3778 dissect_openflow_meter_stats_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
3780 proto_item *ti;
3781 proto_tree *stats_tree;
3782 uint16_t stats_len;
3783 uint16_t stats_end;
3785 stats_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_openflow_v4_meter_stats, &ti, "Meter stats");
3787 /* uint32_t meter_id; */
3788 proto_tree_add_item(stats_tree, hf_openflow_v4_meter_stats_meter_id, tvb, offset, 4, ENC_BIG_ENDIAN);
3789 offset+=4;
3791 /* uint16_t len; */
3792 stats_len = tvb_get_ntohs(tvb, offset);
3793 stats_end = offset - 4 + stats_len;
3794 proto_item_set_len(ti, stats_len);
3795 proto_tree_add_item(stats_tree, hf_openflow_v4_meter_stats_len, tvb, offset, 2, ENC_BIG_ENDIAN);
3796 offset+=2;
3798 /* uint8_t pad[6]; */
3799 proto_tree_add_item(stats_tree, hf_openflow_v4_meter_stats_pad, tvb, offset, 6, ENC_NA);
3800 offset+=6;
3802 /* uint32_t flow_count; */
3803 proto_tree_add_item(stats_tree, hf_openflow_v4_meter_stats_flow_count, tvb, offset, 4, ENC_BIG_ENDIAN);
3804 offset+=4;
3806 /* uint64_t packet_in_count; */
3807 proto_tree_add_item(stats_tree, hf_openflow_v4_meter_stats_packet_in_count, tvb, offset, 8, ENC_BIG_ENDIAN);
3808 offset+=8;
3810 /* uint64_t byte_in_count; */
3811 proto_tree_add_item(stats_tree, hf_openflow_v4_meter_stats_byte_in_count, tvb, offset, 8, ENC_BIG_ENDIAN);
3812 offset+=8;
3814 /* uint32_t duration_sec; */
3815 proto_tree_add_item(stats_tree, hf_openflow_v4_meter_stats_duration_sec, tvb, offset, 4, ENC_BIG_ENDIAN);
3816 offset+=4;
3818 /* uint32_t duration_nsec; */
3819 proto_tree_add_item(stats_tree, hf_openflow_v4_meter_stats_duration_nsec, tvb, offset, 4, ENC_BIG_ENDIAN);
3820 offset+=4;
3822 /* struct ofp_meter_band_stats band_stats[0]; */
3823 while (offset < stats_end) {
3824 offset = dissect_openflow_meter_band_stats_v4(tvb, pinfo, stats_tree, offset, length);
3827 return offset;
3831 static int
3832 dissect_openflow_meter_config_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
3834 proto_item *ti;
3835 proto_tree *conf_tree, *flags_tree;
3836 uint16_t config_len;
3837 int32_t config_end;
3839 conf_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_openflow_v4_meter_config, &ti, "Meter config");
3841 /* uint16_t len; */
3842 config_len = tvb_get_ntohs(tvb, offset);
3843 config_end = offset + config_len;
3844 proto_item_set_len(ti, config_len);
3845 proto_tree_add_item(conf_tree, hf_openflow_v4_meter_config_len, tvb, offset, 2, ENC_BIG_ENDIAN);
3846 offset+=2;
3848 /* uint16_t flags; */
3849 ti = proto_tree_add_item(conf_tree, hf_openflow_v4_meter_config_flags, tvb, offset, 2, ENC_BIG_ENDIAN);
3850 flags_tree = proto_item_add_subtree(ti, ett_openflow_v4_meter_config_flags);
3852 proto_tree_add_item(flags_tree, hf_openflow_v4_meter_config_flags_kbps, tvb, offset, 2, ENC_BIG_ENDIAN);
3853 proto_tree_add_item(flags_tree, hf_openflow_v4_meter_config_flags_pktps, tvb, offset, 2, ENC_BIG_ENDIAN);
3854 proto_tree_add_item(flags_tree, hf_openflow_v4_meter_config_flags_burst, tvb, offset, 2, ENC_BIG_ENDIAN);
3855 proto_tree_add_item(flags_tree, hf_openflow_v4_meter_config_flags_stats, tvb, offset, 2, ENC_BIG_ENDIAN);
3856 offset+=2;
3858 /* uint32_t meter_id; */
3859 proto_tree_add_item(conf_tree, hf_openflow_v4_meter_config_meter_id, tvb, offset, 4, ENC_BIG_ENDIAN);
3860 offset+=4;
3862 /* struct ofp_meter_band_header bands[0]; */
3863 while (offset < config_end) {
3864 offset = dissect_openflow_meter_band_v4(tvb, pinfo, conf_tree, offset, length);
3867 return offset;
3871 #define OFPMF_KBPS 1 << 0
3872 #define OFPMF_PKTPS 1 << 1
3873 #define OFPMF_BURST 1 << 2
3874 #define OFPMF_STATS 1 << 3
3875 static void
3876 dissect_openflow_meter_features_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
3878 proto_item *ti;
3879 proto_tree *bands_tree, *caps_tree;
3881 /* uint32_t max_meter; */
3882 proto_tree_add_item(tree, hf_openflow_v4_meter_features_max_meter, tvb, offset, 4, ENC_BIG_ENDIAN);
3883 offset+=4;
3885 /* uint32_t band_types; */
3886 ti = proto_tree_add_item(tree, hf_openflow_v4_meter_features_band_types, tvb, offset, 4, ENC_BIG_ENDIAN);
3887 bands_tree = proto_item_add_subtree(ti, ett_openflow_v4_meter_features_band_types);
3889 proto_tree_add_item(bands_tree, hf_openflow_v4_meter_features_band_types_drop, tvb, offset, 4, ENC_BIG_ENDIAN);
3890 proto_tree_add_item(bands_tree, hf_openflow_v4_meter_features_band_types_dscp_remark, tvb, offset, 4, ENC_BIG_ENDIAN);
3891 offset+=4;
3893 /* uint32_t capabilities; */
3894 ti = proto_tree_add_item(tree, hf_openflow_v4_meter_features_capabilities, tvb, offset, 4, ENC_BIG_ENDIAN);
3895 caps_tree = proto_item_add_subtree(ti, ett_openflow_v4_meter_features_capabilities);
3897 proto_tree_add_item(caps_tree, hf_openflow_v4_meter_features_capabilities_kbps, tvb, offset, 4, ENC_BIG_ENDIAN);
3898 proto_tree_add_item(caps_tree, hf_openflow_v4_meter_features_capabilities_pktps, tvb, offset, 4, ENC_BIG_ENDIAN);
3899 proto_tree_add_item(caps_tree, hf_openflow_v4_meter_features_capabilities_burst, tvb, offset, 4, ENC_BIG_ENDIAN);
3900 proto_tree_add_item(caps_tree, hf_openflow_v4_meter_features_capabilities_stats, tvb, offset, 4, ENC_BIG_ENDIAN);
3901 offset+=4;
3903 /* uint8_t max_bands; */
3904 proto_tree_add_item(tree, hf_openflow_v4_meter_features_max_bands, tvb, offset, 1, ENC_BIG_ENDIAN);
3905 offset+=1;
3907 /* uint8_t max_color; */
3908 proto_tree_add_item(tree, hf_openflow_v4_meter_features_max_color, tvb, offset, 1, ENC_BIG_ENDIAN);
3909 offset+=1;
3911 /* uint8_t pad[2]; */
3912 proto_tree_add_item(tree, hf_openflow_v4_meter_features_pad, tvb, offset, 2, ENC_NA);
3913 /*offset+=2;*/
3917 #define OFPMPF_REPLY_MORE 1 << 0
3918 static void
3919 dissect_openflow_multipart_reply_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length)
3921 proto_item *ti;
3922 proto_tree *flags_tree;
3923 uint16_t type;
3925 /* uint16_t type; */
3926 type = tvb_get_ntohs(tvb, offset);
3927 proto_tree_add_item(tree, hf_openflow_v4_multipart_reply_type, tvb, offset, 2, ENC_BIG_ENDIAN);
3928 offset+=2;
3930 col_append_fstr(pinfo->cinfo, COL_INFO, ", %s",
3931 val_to_str_const(type, openflow_v4_multipart_type_values, "Unknown type"));
3933 /* uint16_t flags; */
3934 ti = proto_tree_add_item(tree, hf_openflow_v4_multipart_reply_flags, tvb, offset, 2, ENC_BIG_ENDIAN);
3935 flags_tree = proto_item_add_subtree(ti, ett_openflow_v4_multipart_reply_flags);
3937 proto_tree_add_item(flags_tree, hf_openflow_v4_multipart_reply_flags_more, tvb, offset, 2, ENC_BIG_ENDIAN);
3938 offset+=2;
3940 /* uint8_t pad[4]; */
3941 proto_tree_add_item(tree, hf_openflow_v4_multipart_reply_pad, tvb, offset, 4, ENC_NA);
3942 offset+=4;
3944 switch(type){
3945 case OFPMP_DESC:
3946 dissect_openflow_switch_description_v4(tvb, pinfo, tree, offset, length);
3947 break;
3948 case OFPMP_FLOW:
3949 while (offset < length) {
3950 offset = dissect_openflow_flow_stats_v4(tvb, pinfo, tree, offset, length);
3952 break;
3953 case OFPMP_AGGREGATE:
3954 dissect_openflow_aggregate_stats_v4(tvb, pinfo, tree, offset, length);
3955 break;
3956 case OFPMP_TABLE:
3957 while (offset < length) {
3958 offset = dissect_openflow_table_stats_v4(tvb, pinfo, tree, offset, length);
3960 break;
3961 case OFPMP_PORT_STATS:
3962 while (offset < length) {
3963 offset = dissect_openflow_port_stats_v4(tvb, pinfo, tree, offset, length);
3965 break;
3966 case OFPMP_QUEUE:
3967 while (offset < length) {
3968 offset = dissect_openflow_queue_stats_v4(tvb, pinfo, tree, offset, length);
3970 break;
3971 case OFPMP_GROUP:
3972 while (offset < length) {
3973 offset = dissect_openflow_group_stats_v4(tvb, pinfo, tree, offset, length);
3975 break;
3976 case OFPMP_GROUP_DESC:
3977 while (offset < length) {
3978 offset = dissect_openflow_group_desc_v4(tvb, pinfo, tree, offset, length);
3980 break;
3981 case OFPMP_GROUP_FEATURES:
3982 dissect_openflow_group_features_v4(tvb, pinfo, tree, offset, length);
3983 break;
3984 case OFPMP_METER:
3985 while (offset < length) {
3986 offset = dissect_openflow_meter_stats_v4(tvb, pinfo, tree, offset, length);
3988 break;
3989 case OFPMP_METER_CONFIG:
3990 while (offset < length) {
3991 offset = dissect_openflow_meter_config_v4(tvb, pinfo, tree, offset, length);
3993 break;
3994 case OFPMP_METER_FEATURES:
3995 dissect_openflow_meter_features_v4(tvb, pinfo, tree, offset, length);
3996 break;
3997 case OFPMP_TABLE_FEATURES:
3998 while (offset < length) {
3999 offset = dissect_openflow_table_features_v4(tvb, pinfo, tree, offset, length);
4001 break;
4002 case OFPMP_PORT_DESC:
4003 while (offset < length) {
4004 offset = dissect_openflow_port_v4(tvb, pinfo, tree, offset, length);
4006 break;
4008 case OFPMP_EXPERIMENTER:
4009 /* uint32_t experimenter; */
4010 proto_tree_add_item(tree, hf_openflow_v4_multipart_reply_experimenter_experimenter, tvb, offset, 4, ENC_BIG_ENDIAN);
4011 offset+=4;
4013 /* uint32_t exp_type; */
4014 proto_tree_add_item(tree, hf_openflow_v4_multipart_reply_experimenter_exp_type, tvb, offset, 4, ENC_BIG_ENDIAN);
4015 offset+=4;
4017 /* uint32_t experimenter_data[0]; */
4018 proto_tree_add_expert_format(tree, pinfo, &ei_openflow_v4_multipart_reply_undecoded,
4019 tvb, offset, length - 16, "Experimenter multipart reply body.");
4021 break;
4022 default:
4023 proto_tree_add_expert_format(tree, pinfo, &ei_openflow_v4_multipart_reply_undecoded,
4024 tvb, offset, length - 8, "Unknown multipart reply body.");
4025 break;
4031 static void
4032 dissect_openflow_queue_get_config_request_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
4034 /* uint32_t port; */
4035 proto_tree_add_item(tree, hf_openflow_v4_queue_get_config_request_port, tvb, offset, 4, ENC_BIG_ENDIAN);
4036 offset+=4;
4038 /* uint8_t pad[4]; */
4039 proto_tree_add_item(tree, hf_openflow_v4_queue_get_config_request_pad, tvb, offset, 4, ENC_NA);
4040 /*offset+=4;*/
4045 #define OFPQ_MIN_RATE_MAX 1000
4046 static const value_string openflow_v4_queue_prop_min_rate_reserved_values[] = {
4047 { 0xffff, "OFPQ_MIN_RATE_UNCFG" },
4048 { 0, NULL }
4051 #define OFPQ_MAX_RATE_MAX 1000
4052 static const value_string openflow_v4_queue_prop_max_rate_reserved_values[] = {
4053 { 0xffff, "OFPQ_MAX_RATE_UNCFG" },
4054 { 0, NULL }
4057 #define OFPQT_MIN_RATE 1
4058 #define OFPQT_MAX_RATE 2
4059 #define OFPQT_EXPERIMENTER 0xffff
4060 static const value_string openflow_v4_queue_prop_property_values[] = {
4061 { OFPQT_MIN_RATE, "OFPQT_MIN_RATE" },
4062 { OFPQT_MAX_RATE, "OFPQT_MAX_RATE" },
4063 { OFPQT_EXPERIMENTER, "OFPQT_EXPERIMENTER" },
4064 { 0, NULL },
4067 static int
4068 dissect_openflow_queue_prop_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
4070 proto_item *ti;
4071 proto_tree *prop_tree;
4072 uint16_t prop_type;
4073 uint16_t prop_len;
4075 prop_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_openflow_v4_queue_prop, &ti, "Queue property");
4077 /* uint16_t property; */
4078 prop_type = tvb_get_ntohs(tvb, offset);
4079 proto_tree_add_item(prop_tree, hf_openflow_v4_queue_prop_property, tvb, offset, 2, ENC_BIG_ENDIAN);
4080 offset+=2;
4082 /* uint16_t len; */
4083 prop_len = tvb_get_ntohs(tvb, offset);
4084 proto_item_set_len(ti, prop_len);
4085 proto_tree_add_item(prop_tree, hf_openflow_v4_queue_prop_len, tvb, offset, 2, ENC_BIG_ENDIAN);
4086 offset+=2;
4088 /* uint8_t pad[4]; */
4089 proto_tree_add_item(prop_tree, hf_openflow_v4_queue_prop_pad, tvb, offset, 4, ENC_NA);
4090 offset+=4;
4092 switch (prop_type) {
4093 case OFPQT_MIN_RATE:
4094 /* uint16_t rate; */
4095 proto_tree_add_item(prop_tree, hf_openflow_v4_queue_prop_min_rate_rate, tvb, offset, 2, ENC_BIG_ENDIAN);
4097 offset+=2;
4099 /* uint8_t pad[6]; */
4100 proto_tree_add_item(prop_tree, hf_openflow_v4_queue_prop_min_rate_pad, tvb, offset, 6, ENC_NA);
4101 offset+=6;
4102 break;
4104 case OFPQT_MAX_RATE:
4105 /* uint16_t rate; */
4106 proto_tree_add_item(prop_tree, hf_openflow_v4_queue_prop_max_rate_rate, tvb, offset, 2, ENC_BIG_ENDIAN);
4107 offset+=2;
4109 /* uint8_t pad[6]; */
4110 proto_tree_add_item(prop_tree, hf_openflow_v4_queue_prop_max_rate_pad, tvb, offset, 6, ENC_NA);
4111 offset+=6;
4112 break;
4114 case OFPQT_EXPERIMENTER:
4115 /* uint32_t experimenter; */
4116 proto_tree_add_item(prop_tree, hf_openflow_v4_queue_prop_experimenter_experimenter, tvb, offset, 4, ENC_BIG_ENDIAN);
4117 offset+=4;
4119 /* uint8_t pad[4]; */
4120 proto_tree_add_item(prop_tree, hf_openflow_v4_queue_prop_experimenter_pad, tvb, offset, 4, ENC_NA);
4121 offset+=4;
4123 /* uint8_t data[0]; */
4124 proto_tree_add_expert_format(prop_tree, pinfo, &ei_openflow_v4_queue_prop_undecoded,
4125 tvb, offset, prop_len - 16, "Experimenter queue property body.");
4126 if (prop_len > 16)
4127 offset+=prop_len-16;
4128 break;
4130 default:
4131 proto_tree_add_expert_format(prop_tree, pinfo, &ei_openflow_v4_queue_prop_undecoded,
4132 tvb, offset, prop_len - 8, "Unknown queue property body.");
4133 if (prop_len > 8)
4134 offset+=prop_len-8;
4135 break;
4138 return offset;
4142 #define OFPQ_ALL 0xffffffff
4143 static const value_string openflow_v4_queue_id_reserved_values[] = {
4144 { OFPQ_ALL, "OFPQ_ALL" },
4145 { 0, NULL }
4148 static int
4149 dissect_openflow_packet_queue_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
4151 proto_item *ti;
4152 proto_tree *queue_tree;
4153 uint16_t queue_len;
4154 uint16_t queue_end;
4156 queue_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_openflow_v4_packet_queue, &ti, "Queue");
4158 /* uint32_t queue_id; */
4159 proto_tree_add_item(queue_tree, hf_openflow_v4_packet_queue_queue_id, tvb, offset, 4, ENC_BIG_ENDIAN);
4160 offset+=4;
4162 /* uint32_t port; */
4163 proto_tree_add_item(queue_tree, hf_openflow_v4_packet_queue_port, tvb, offset, 4, ENC_BIG_ENDIAN);
4164 offset+=4;
4166 /* uint16_t len; */
4167 queue_len = tvb_get_ntohs(tvb, offset);
4168 queue_end = offset - 8 + queue_len;
4169 proto_item_set_len(ti, queue_len);
4170 proto_tree_add_item(queue_tree, hf_openflow_v4_packet_queue_len, tvb, offset, 2, ENC_BIG_ENDIAN);
4171 offset+=2;
4173 /* uint8_t pad[6]; */
4174 proto_tree_add_item(queue_tree, hf_openflow_v4_packet_queue_pad, tvb, offset, 6, ENC_NA);
4175 offset+=6;
4177 /* struct ofp_queue_prop_header properties[0]; */
4178 while (offset < queue_end) {
4179 offset = dissect_openflow_queue_prop_v4(tvb, pinfo, queue_tree, offset, length);
4182 return offset;
4185 static void
4186 dissect_openflow_queue_get_config_reply_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length)
4188 /* uint32_t port; */
4189 proto_tree_add_item(tree, hf_openflow_v4_queue_get_config_reply_port, tvb, offset, 4, ENC_BIG_ENDIAN);
4190 offset+=4;
4192 /* uint8_t pad[4]; */
4193 proto_tree_add_item(tree, hf_openflow_v4_queue_get_config_reply_pad, tvb, offset, 4, ENC_NA);
4194 offset+=4;
4196 /* struct ofp_packet_queue queues[0]; */
4197 while (offset < length) {
4198 offset = dissect_openflow_packet_queue_v4(tvb, pinfo, tree, offset, length);
4202 static const value_string openflow_v4_controller_role_values[] = {
4203 { 0, "OFPCR_ROLE_NOCHANGE" },
4204 { 1, "OFPCR_ROLE_EQUAL" },
4205 { 2, "OFPCR_ROLE_MASTER" },
4206 { 3, "OFPCR_ROLE_SLAVE" },
4207 { 0, NULL }
4210 static void
4211 dissect_openflow_role_request_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
4213 /* uint32_t role; */
4214 proto_tree_add_item(tree, hf_openflow_v4_role_request_role, tvb, offset, 4, ENC_BIG_ENDIAN);
4215 offset+=4;
4217 /* uint8_t pad[4]; */
4218 proto_tree_add_item(tree, hf_openflow_v4_role_request_pad, tvb, offset, 4, ENC_NA);
4219 offset+=4;
4221 /* uint64_t generation_id; */
4222 proto_tree_add_item(tree, hf_openflow_v4_role_request_generation_id, tvb, offset, 8, ENC_BIG_ENDIAN);
4223 /*offset+=8;*/
4227 static void
4228 dissect_openflow_role_reply_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
4230 /* uint32_t role; */
4231 proto_tree_add_item(tree, hf_openflow_v4_role_reply_role, tvb, offset, 4, ENC_BIG_ENDIAN);
4232 offset+=4;
4234 /* uint8_t pad[4]; */
4235 proto_tree_add_item(tree, hf_openflow_v4_role_reply_pad, tvb, offset, 4, ENC_NA);
4236 offset+=4;
4238 /* uint64_t generation_id; */
4239 proto_tree_add_item(tree, hf_openflow_v4_role_reply_generation_id, tvb, offset, 8, ENC_BIG_ENDIAN);
4240 /*offset+=8;*/
4244 static void
4245 dissect_openflow_async_config_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
4247 proto_item *ti;
4248 proto_tree *pimm_tree, *psmm_tree, *frmm_tree;
4249 proto_tree *pims_tree, *psms_tree, *frms_tree;
4251 /* uint32_t packet_in_mask[2]; */
4252 ti = proto_tree_add_item(tree, hf_openflow_v4_async_config_packet_in_mask_master, tvb, offset, 4, ENC_BIG_ENDIAN);
4253 pimm_tree = proto_item_add_subtree(ti, ett_openflow_v4_async_config_packet_in_mask_master);
4255 proto_tree_add_item(pimm_tree, hf_openflow_v4_async_config_packet_in_mask_master_no_match, tvb, offset, 4, ENC_BIG_ENDIAN);
4256 proto_tree_add_item(pimm_tree, hf_openflow_v4_async_config_packet_in_mask_master_action, tvb, offset, 4, ENC_BIG_ENDIAN);
4257 proto_tree_add_item(pimm_tree, hf_openflow_v4_async_config_packet_in_mask_master_invalid_ttl, tvb, offset, 4, ENC_BIG_ENDIAN);
4258 offset+=4;
4260 ti = proto_tree_add_item(tree, hf_openflow_v4_async_config_packet_in_mask_slave, tvb, offset, 4, ENC_BIG_ENDIAN);
4261 pims_tree = proto_item_add_subtree(ti, ett_openflow_v4_async_config_packet_in_mask_slave);
4263 proto_tree_add_item(pims_tree, hf_openflow_v4_async_config_packet_in_mask_slave_no_match, tvb, offset, 4, ENC_BIG_ENDIAN);
4264 proto_tree_add_item(pims_tree, hf_openflow_v4_async_config_packet_in_mask_slave_action, tvb, offset, 4, ENC_BIG_ENDIAN);
4265 proto_tree_add_item(pims_tree, hf_openflow_v4_async_config_packet_in_mask_slave_invalid_ttl, tvb, offset, 4, ENC_BIG_ENDIAN);
4266 offset+=4;
4268 /* uint32_t port_status_mask[2]; */
4269 ti = proto_tree_add_item(tree, hf_openflow_v4_async_config_port_status_mask_master, tvb, offset, 4, ENC_BIG_ENDIAN);
4270 psmm_tree = proto_item_add_subtree(ti, ett_openflow_v4_async_config_port_status_mask_master);
4272 proto_tree_add_item(psmm_tree, hf_openflow_v4_async_config_port_status_mask_master_add, tvb, offset, 4, ENC_BIG_ENDIAN);
4273 proto_tree_add_item(psmm_tree, hf_openflow_v4_async_config_port_status_mask_master_delete, tvb, offset, 4, ENC_BIG_ENDIAN);
4274 proto_tree_add_item(psmm_tree, hf_openflow_v4_async_config_port_status_mask_master_modify, tvb, offset, 4, ENC_BIG_ENDIAN);
4275 offset+=4;
4277 ti = proto_tree_add_item(tree, hf_openflow_v4_async_config_port_status_mask_slave, tvb, offset, 4, ENC_BIG_ENDIAN);
4278 psms_tree = proto_item_add_subtree(ti, ett_openflow_v4_async_config_port_status_mask_slave);
4280 proto_tree_add_item(psms_tree, hf_openflow_v4_async_config_port_status_mask_slave_add, tvb, offset, 4, ENC_BIG_ENDIAN);
4281 proto_tree_add_item(psms_tree, hf_openflow_v4_async_config_port_status_mask_slave_delete, tvb, offset, 4, ENC_BIG_ENDIAN);
4282 proto_tree_add_item(psms_tree, hf_openflow_v4_async_config_port_status_mask_slave_modify, tvb, offset, 4, ENC_BIG_ENDIAN);
4283 offset+=4;
4285 /* uint32_t flow_removed_mask[2]; */
4286 ti = proto_tree_add_item(tree, hf_openflow_v4_async_config_flow_removed_mask_master, tvb, offset, 4, ENC_BIG_ENDIAN);
4287 frmm_tree = proto_item_add_subtree(ti, ett_openflow_v4_async_config_flow_removed_mask_master);
4289 proto_tree_add_item(frmm_tree, hf_openflow_v4_async_config_flow_removed_mask_master_idle_timeout, tvb, offset, 4, ENC_BIG_ENDIAN);
4290 proto_tree_add_item(frmm_tree, hf_openflow_v4_async_config_flow_removed_mask_master_hard_timeout, tvb, offset, 4, ENC_BIG_ENDIAN);
4291 proto_tree_add_item(frmm_tree, hf_openflow_v4_async_config_flow_removed_mask_master_delete, tvb, offset, 4, ENC_BIG_ENDIAN);
4292 proto_tree_add_item(frmm_tree, hf_openflow_v4_async_config_flow_removed_mask_master_group_delete, tvb, offset, 4, ENC_BIG_ENDIAN);
4293 offset+=4;
4295 ti = proto_tree_add_item(tree, hf_openflow_v4_async_config_flow_removed_mask_slave, tvb, offset, 4, ENC_BIG_ENDIAN);
4296 frms_tree = proto_item_add_subtree(ti, ett_openflow_v4_async_config_flow_removed_mask_slave);
4298 proto_tree_add_item(frms_tree, hf_openflow_v4_async_config_flow_removed_mask_slave_idle_timeout, tvb, offset, 4, ENC_BIG_ENDIAN);
4299 proto_tree_add_item(frms_tree, hf_openflow_v4_async_config_flow_removed_mask_slave_hard_timeout, tvb, offset, 4, ENC_BIG_ENDIAN);
4300 proto_tree_add_item(frms_tree, hf_openflow_v4_async_config_flow_removed_mask_slave_delete, tvb, offset, 4, ENC_BIG_ENDIAN);
4301 proto_tree_add_item(frms_tree, hf_openflow_v4_async_config_flow_removed_mask_slave_group_delete, tvb, offset, 4, ENC_BIG_ENDIAN);
4302 /*offset+=4;*/
4307 static const value_string openflow_v4_metermod_command_values[] = {
4308 { 0, "OFPMC_ADD" },
4309 { 1, "OFPMC_MODIFY" },
4310 { 2, "OFPMC_DELETE" },
4311 { 0, NULL }
4314 static void
4315 dissect_openflow_metermod_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
4317 proto_item *ti;
4318 proto_tree *flags_tree;
4320 /* uint16_t command; */
4321 proto_tree_add_item(tree, hf_openflow_v4_metermod_command, tvb, offset, 2, ENC_BIG_ENDIAN);
4322 offset+=2;
4324 /* uint16_t flags; */
4325 ti = proto_tree_add_item(tree, hf_openflow_v4_metermod_flags, tvb, offset, 2, ENC_BIG_ENDIAN);
4326 flags_tree = proto_item_add_subtree(ti, ett_openflow_v4_metermod_flags);
4328 proto_tree_add_item(flags_tree, hf_openflow_v4_metermod_flags_kbps, tvb, offset, 2, ENC_BIG_ENDIAN);
4329 proto_tree_add_item(flags_tree, hf_openflow_v4_metermod_flags_pktps, tvb, offset, 2, ENC_BIG_ENDIAN);
4330 proto_tree_add_item(flags_tree, hf_openflow_v4_metermod_flags_burst, tvb, offset, 2, ENC_BIG_ENDIAN);
4331 proto_tree_add_item(flags_tree, hf_openflow_v4_metermod_flags_stats, tvb, offset, 2, ENC_BIG_ENDIAN);
4332 offset+=2;
4334 /* uint32_t meter_id; */
4335 proto_tree_add_item(tree, hf_openflow_v4_metermod_meter_id, tvb, offset, 4, ENC_BIG_ENDIAN);
4336 offset+=4;
4338 /* struct ofp_meter_band_header bands[0]; */
4339 while (offset < length) {
4340 offset = dissect_openflow_meter_band_v4(tvb, pinfo, tree, offset, length);
4345 static int
4346 // NOLINTNEXTLINE(misc-no-recursion)
4347 dissect_openflow_message_v4(tvbuff_t *tvb, packet_info *pinfo, proto_tree *openflow_tree, int offset)
4350 uint8_t type;
4351 uint16_t length;
4352 int32_t msg_end;
4354 type = tvb_get_uint8(tvb, offset + 1);
4355 length = tvb_get_ntohs(tvb, offset + 2);
4356 msg_end = offset + length;
4358 offset = dissect_openflow_header_v4(tvb, pinfo, openflow_tree, offset, length);
4360 switch(type){
4361 case OFPT_HELLO:
4362 dissect_openflow_hello_v4(tvb, pinfo, openflow_tree, offset, length);
4363 break;
4364 case OFPT_ERROR:
4365 dissect_openflow_error_v4(tvb, pinfo, openflow_tree, offset, length);
4366 break;
4367 case OFPT_ECHO_REQUEST:
4368 case OFPT_ECHO_REPLY:
4369 dissect_openflow_echo_v4(tvb, pinfo, openflow_tree, offset, length);
4370 break;
4371 case OFPT_EXPERIMENTER:
4372 dissect_openflow_experimenter_v4(tvb, pinfo, openflow_tree, offset, length);
4373 break;
4374 case OFPT_FEATURES_REQUEST:
4375 /* message has no body */
4376 break;
4377 case OFPT_FEATURES_REPLY:
4378 dissect_openflow_switch_features_v4(tvb, pinfo, openflow_tree, offset, length);
4379 break;
4380 case OFPT_GET_CONFIG_REQUEST:
4381 /* message has no body */
4382 break;
4383 case OFPT_GET_CONFIG_REPLY:
4384 case OFPT_SET_CONFIG:
4385 dissect_openflow_switch_config_v4(tvb, pinfo, openflow_tree, offset, length);
4386 break;
4387 case OFPT_PACKET_IN:
4388 dissect_openflow_packet_in_v4(tvb, pinfo, openflow_tree, offset, length);
4389 break;
4390 case OFPT_FLOW_REMOVED:
4391 dissect_openflow_flow_removed_v4(tvb, pinfo, openflow_tree, offset, length);
4392 break;
4393 case OFPT_PORT_STATUS:
4394 dissect_openflow_port_status_v4(tvb, pinfo, openflow_tree, offset, length);
4395 break;
4396 case OFPT_PACKET_OUT:
4397 dissect_openflow_packet_out_v4(tvb, pinfo, openflow_tree, offset, length);
4398 break;
4399 case OFPT_FLOW_MOD:
4400 dissect_openflow_flowmod_v4(tvb, pinfo, openflow_tree, offset, length);
4401 break;
4402 case OFPT_GROUP_MOD:
4403 dissect_openflow_groupmod_v4(tvb, pinfo, openflow_tree, offset, length);
4404 break;
4405 case OFPT_PORT_MOD:
4406 dissect_openflow_portmod_v4(tvb, pinfo, openflow_tree, offset, length);
4407 break;
4408 case OFPT_TABLE_MOD:
4409 dissect_openflow_tablemod_v4(tvb, pinfo, openflow_tree, offset, length);
4410 break;
4411 case OFPT_MULTIPART_REQUEST:
4412 dissect_openflow_multipart_request_v4(tvb, pinfo, openflow_tree, offset, length);
4413 break;
4414 case OFPT_MULTIPART_REPLY:
4415 dissect_openflow_multipart_reply_v4(tvb, pinfo, openflow_tree, offset, length);
4416 break;
4417 case OFPT_BARRIER_REQUEST:
4418 case OFPT_BARRIER_REPLY:
4419 /* message has no body */
4420 break;
4421 case OFPT_QUEUE_GET_CONFIG_REQUEST:
4422 dissect_openflow_queue_get_config_request_v4(tvb, pinfo, openflow_tree, offset, length);
4423 break;
4424 case OFPT_QUEUE_GET_CONFIG_REPLY:
4425 dissect_openflow_queue_get_config_reply_v4(tvb, pinfo, openflow_tree, offset, length);
4426 break;
4427 case OFPT_ROLE_REQUEST:
4428 dissect_openflow_role_request_v4(tvb, pinfo, openflow_tree, offset, length);
4429 break;
4430 case OFPT_ROLE_REPLY:
4431 dissect_openflow_role_reply_v4(tvb, pinfo, openflow_tree, offset, length);
4432 break;
4433 case OFPT_GET_ASYNC_REQUEST:
4434 /* message has no body */
4435 break;
4436 case OFPT_GET_ASYNC_REPLY:
4437 case OFPT_SET_ASYNC:
4438 dissect_openflow_async_config_v4(tvb, pinfo, openflow_tree, offset, length);
4439 break;
4440 case OFPT_METER_MOD:
4441 dissect_openflow_metermod_v4(tvb, pinfo, openflow_tree, offset, length);
4442 break;
4444 default:
4445 if (length > 8) {
4446 proto_tree_add_expert_format(openflow_tree, pinfo, &ei_openflow_v4_message_undecoded,
4447 tvb, offset, length - 8, "Unknown message body.");
4449 break;
4452 return msg_end;
4455 static int
4456 dissect_openflow_v4(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
4458 proto_item *ti;
4459 proto_tree *openflow_tree;
4460 unsigned offset = 0;
4461 uint8_t type;
4463 type = tvb_get_uint8(tvb, 1);
4465 col_append_fstr(pinfo->cinfo, COL_INFO, "Type: %s",
4466 val_to_str_ext_const(type, &openflow_v4_type_values_ext, "Unknown message type"));
4468 /* Create display subtree for the protocol */
4469 ti = proto_tree_add_item(tree, proto_openflow_v4, tvb, 0, -1, ENC_NA);
4470 openflow_tree = proto_item_add_subtree(ti, ett_openflow_v4);
4472 dissect_openflow_message_v4(tvb, pinfo, openflow_tree, offset);
4474 return tvb_reported_length(tvb);
4478 * Register the protocol with Wireshark.
4480 void
4481 proto_register_openflow_v4(void)
4484 static hf_register_info hf[] = {
4485 { &hf_openflow_v4_version,
4486 { "Version", "openflow_v4.version",
4487 FT_UINT8, BASE_HEX, VALS(openflow_v4_version_values), 0x0,
4488 NULL, HFILL }
4490 { &hf_openflow_v4_type,
4491 { "Type", "openflow_v4.type",
4492 FT_UINT8, BASE_DEC | BASE_EXT_STRING, &openflow_v4_type_values_ext, 0x0,
4493 NULL, HFILL }
4495 { &hf_openflow_v4_xid,
4496 { "Transaction ID", "openflow_v4.xid",
4497 FT_UINT32, BASE_DEC, NULL, 0x0,
4498 NULL, HFILL }
4500 { &hf_openflow_v4_length,
4501 { "Length", "openflow_v4.length",
4502 FT_UINT16, BASE_DEC, NULL, 0x0,
4503 NULL, HFILL }
4505 { &hf_openflow_v4_oxm_class,
4506 { "Class", "openflow_v4.oxm.class",
4507 FT_UINT16, BASE_HEX, VALS(openflow_v4_oxm_class_values), 0x0,
4508 NULL, HFILL }
4510 { &hf_openflow_v4_oxm_field,
4511 { "Field", "openflow_v4.oxm.field",
4512 FT_UINT8, BASE_DEC, NULL, 0x0,
4513 NULL, HFILL }
4515 { &hf_openflow_v4_oxm_field_basic,
4516 { "Field", "openflow_v4.oxm.field",
4517 FT_UINT8, BASE_DEC | BASE_EXT_STRING, &openflow_v4_oxm_basic_field_values_ext, 0x0,
4518 NULL, HFILL }
4520 { &hf_openflow_v4_oxm_hm,
4521 { "Has mask", "openflow_v4.oxm.hm",
4522 FT_BOOLEAN, BASE_NONE, NULL, 0x0,
4523 NULL, HFILL }
4525 { &hf_openflow_v4_oxm_length,
4526 { "Length", "openflow_v4.oxm.length",
4527 FT_UINT8, BASE_DEC, NULL, 0x0,
4528 NULL, HFILL }
4530 { &hf_openflow_v4_oxm_experimenter_experimenter,
4531 { "Experimenter", "openflow_v4.oxm_experimenter.experimenter",
4532 FT_UINT32, BASE_HEX, NULL, 0x0,
4533 NULL, HFILL }
4535 { &hf_openflow_v4_oxm_experimenter_value,
4536 { "Experimenter Value", "openflow_v4.oxm_experimenter.value",
4537 FT_BYTES, BASE_NONE, NULL, 0x0,
4538 NULL, HFILL }
4540 { &hf_openflow_v4_oxm_value,
4541 { "Value", "openflow_v4.oxm.value",
4542 FT_BYTES, BASE_NONE, NULL, 0x0,
4543 NULL, HFILL }
4545 { &hf_openflow_v4_oxm_value_etheraddr,
4546 { "Value", "openflow_v4.oxm.value_etheraddr",
4547 FT_ETHER, BASE_NONE, NULL, 0x0,
4548 NULL, HFILL }
4550 { &hf_openflow_v4_oxm_value_ethertype,
4551 { "Value", "openflow_v4.oxm.value_ethertype",
4552 FT_UINT16, BASE_HEX, VALS(etype_vals), 0x0,
4553 NULL, HFILL }
4555 { &hf_openflow_v4_oxm_value_vlan_present,
4556 { "OFPVID_PRESENT", "openflow_v4.oxm.value_vlan_present",
4557 FT_BOOLEAN, 16, NULL, OFPVID_PRESENT,
4558 NULL, HFILL }
4560 { &hf_openflow_v4_oxm_value_vlan_vid,
4561 { "Value", "openflow_v4.oxm.value_vlan_vid",
4562 FT_UINT16, BASE_DEC, NULL, 0x0fff,
4563 NULL, HFILL }
4565 { &hf_openflow_v4_oxm_value_ipv4addr,
4566 { "Value", "openflow_v4.oxm.value_ipv4addr",
4567 FT_IPv4, BASE_NONE, NULL, 0x0,
4568 NULL, HFILL }
4570 { &hf_openflow_v4_oxm_value_ipv6addr,
4571 { "Value", "openflow_v4.oxm.value_ipv6addr",
4572 FT_IPv6, BASE_NONE, NULL, 0x0,
4573 NULL, HFILL }
4575 { &hf_openflow_v4_oxm_value_ipproto,
4576 { "Value", "openflow_v4.oxm.value_ipproto",
4577 FT_UINT8, BASE_DEC|BASE_EXT_STRING, &ipproto_val_ext, 0x0,
4578 NULL, HFILL }
4580 { &hf_openflow_v4_oxm_value_uint16,
4581 { "Value", "openflow_v4.oxm.value_uint16",
4582 FT_UINT16, BASE_DEC, NULL, 0x0,
4583 NULL, HFILL }
4585 { &hf_openflow_v4_oxm_value_uint24,
4586 { "Value", "openflow_v4.oxm.value_uint24",
4587 FT_UINT24, BASE_DEC, NULL, 0x0,
4588 NULL, HFILL }
4590 { &hf_openflow_v4_oxm_value_uint32,
4591 { "Value", "openflow_v4.oxm.value_uint32",
4592 FT_UINT32, BASE_DEC, NULL, 0x0,
4593 NULL, HFILL }
4595 { &hf_openflow_v4_oxm_mask,
4596 { "Mask", "openflow_v4.oxm.mask",
4597 FT_BYTES, BASE_NONE, NULL, 0x0,
4598 NULL, HFILL }
4600 { &hf_openflow_v4_oxm_mask_etheraddr,
4601 { "Mask", "openflow_v4.oxm.ether_mask",
4602 FT_ETHER, BASE_NONE, NULL, 0x0,
4603 NULL, HFILL }
4605 { &hf_openflow_v4_oxm_mask_ipv4addr,
4606 { "Mask", "openflow_v4.oxm.ipv4_mask",
4607 FT_IPv4, BASE_NONE, NULL, 0x0,
4608 NULL, HFILL }
4610 { &hf_openflow_v4_oxm_mask_ipv6addr,
4611 { "Mask", "openflow_v4.oxm.ipv6_mask",
4612 FT_IPv6, BASE_NONE, NULL, 0x0,
4613 NULL, HFILL }
4615 { &hf_openflow_v4_oxm_mask_vlan,
4616 { "Mask", "openflow_v4.oxm.vlan_mask",
4617 FT_UINT16, BASE_HEX, NULL, 0x0,
4618 NULL, HFILL }
4620 { &hf_openflow_v4_match_type,
4621 { "Type", "openflow_v4.match.type",
4622 FT_UINT16, BASE_DEC, VALS(openflow_v4_match_type_values), 0x0,
4623 NULL, HFILL }
4625 { &hf_openflow_v4_match_length,
4626 { "Length", "openflow_v4.match.length",
4627 FT_UINT16, BASE_DEC, NULL, 0x0,
4628 NULL, HFILL }
4630 { &hf_openflow_v4_match_pad,
4631 { "Pad", "openflow_v4.match.pad",
4632 FT_BYTES, BASE_NONE, NULL, 0x0,
4633 NULL, HFILL }
4635 { &hf_openflow_v4_action_type,
4636 { "Type", "openflow_v4.action.type",
4637 FT_UINT16, BASE_DEC, VALS(openflow_v4_action_type_values), 0x0,
4638 NULL, HFILL }
4640 { &hf_openflow_v4_action_length,
4641 { "Length", "openflow_v4.action.length",
4642 FT_UINT16, BASE_DEC, NULL, 0x0,
4643 NULL, HFILL }
4645 { &hf_openflow_v4_action_experimenter_experimenter,
4646 { "Experimenter", "openflow_v4.action_experimenter.experimenter",
4647 FT_UINT32, BASE_HEX, NULL, 0x0,
4648 NULL, HFILL }
4650 { &hf_openflow_v4_action_output_port,
4651 { "Port", "openflow_v4.action.output.port",
4652 FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_port_reserved_values), 0x0,
4653 NULL, HFILL }
4655 { &hf_openflow_v4_action_output_max_len,
4656 { "Max length", "openflow_v4.action.output.max_len",
4657 FT_UINT16, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_controller_max_len_reserved_values), 0x0,
4658 NULL, HFILL }
4660 { &hf_openflow_v4_action_output_pad,
4661 { "Pad", "openflow_v4.action.output.pad",
4662 FT_BYTES, BASE_NONE, NULL, 0x0,
4663 NULL, HFILL }
4665 { &hf_openflow_v4_action_copy_ttl_out_pad,
4666 { "Pad", "openflow_v4.action.copy_ttl_out.pad",
4667 FT_BYTES, BASE_NONE, NULL, 0x0,
4668 NULL, HFILL }
4670 { &hf_openflow_v4_action_copy_ttl_in_pad,
4671 { "Pad", "openflow_v4.action.copy_ttl_in.pad",
4672 FT_BYTES, BASE_NONE, NULL, 0x0,
4673 NULL, HFILL }
4675 { &hf_openflow_v4_action_set_mpls_ttl_ttl,
4676 { "TTL", "openflow_v4.action.set_mpls_ttl.ttl",
4677 FT_UINT8, BASE_DEC, NULL, 0x0,
4678 NULL, HFILL }
4680 { &hf_openflow_v4_action_set_mpls_ttl_pad,
4681 { "Pad", "openflow_v4.action.set_mpls_ttl.pad",
4682 FT_BYTES, BASE_NONE, NULL, 0x0,
4683 NULL, HFILL }
4685 { &hf_openflow_v4_action_dec_mpls_ttl_pad,
4686 { "Pad", "openflow_v4.action.dec_mpls_ttl.pad",
4687 FT_BYTES, BASE_NONE, NULL, 0x0,
4688 NULL, HFILL }
4690 { &hf_openflow_v4_action_push_vlan_ethertype,
4691 { "Ethertype", "openflow_v4.action.push_vlan.ethertype",
4692 FT_UINT16, BASE_HEX, VALS(etype_vals), 0x0,
4693 NULL, HFILL }
4695 { &hf_openflow_v4_action_push_vlan_pad,
4696 { "Pad", "openflow_v4.action.push_vlan.pad",
4697 FT_BYTES, BASE_NONE, NULL, 0x0,
4698 NULL, HFILL }
4700 { &hf_openflow_v4_action_pop_vlan_pad,
4701 { "Pad", "openflow_v4.action.pop_vlan.pad",
4702 FT_BYTES, BASE_NONE, NULL, 0x0,
4703 NULL, HFILL }
4705 { &hf_openflow_v4_action_push_mpls_ethertype,
4706 { "Ethertype", "openflow_v4.action.push_mpls.ethertype",
4707 FT_UINT16, BASE_HEX, VALS(etype_vals), 0x0,
4708 NULL, HFILL }
4710 { &hf_openflow_v4_action_push_mpls_pad,
4711 { "Pad", "openflow_v4.action.push_mpls.pad",
4712 FT_BYTES, BASE_NONE, NULL, 0x0,
4713 NULL, HFILL }
4715 { &hf_openflow_v4_action_pop_mpls_ethertype,
4716 { "Ethertype", "openflow_v4.action.pop_mpls.ethertype",
4717 FT_UINT16, BASE_HEX, VALS(etype_vals), 0x0,
4718 NULL, HFILL }
4720 { &hf_openflow_v4_action_pop_mpls_pad,
4721 { "Pad", "openflow_v4.action.pop_mpls.pad",
4722 FT_BYTES, BASE_NONE, NULL, 0x0,
4723 NULL, HFILL }
4725 { &hf_openflow_v4_action_set_queue_queue_id,
4726 { "Queue ID", "openflow_v4.action.set_queue.queue_id",
4727 FT_UINT32, BASE_DEC, NULL, 0x0,
4728 NULL, HFILL }
4730 { &hf_openflow_v4_action_group_group_id,
4731 { "Group ID", "openflow_v4.action.group.group_id",
4732 FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_port_reserved_values), 0x0,
4733 NULL, HFILL }
4735 { &hf_openflow_v4_action_set_nw_ttl_ttl,
4736 { "TTL", "openflow_v4.action.set_nw_ttl.ttl",
4737 FT_UINT8, BASE_DEC, NULL, 0x0,
4738 NULL, HFILL }
4740 { &hf_openflow_v4_action_set_nw_ttl_pad,
4741 { "Pad", "openflow_v4.action.set_nw_ttl.pad",
4742 FT_BYTES, BASE_NONE, NULL, 0x0,
4743 NULL, HFILL }
4745 { &hf_openflow_v4_action_dec_nw_ttl_pad,
4746 { "Pad", "openflow_v4.action.dec_nw_ttl.pad",
4747 FT_BYTES, BASE_NONE, NULL, 0x0,
4748 NULL, HFILL }
4750 { &hf_openflow_v4_action_set_field_pad,
4751 { "Pad", "openflow_v4.action.set_field.pad",
4752 FT_BYTES, BASE_NONE, NULL, 0x0,
4753 NULL, HFILL }
4755 { &hf_openflow_v4_action_push_pbb_ethertype,
4756 { "Ethertype", "openflow_v4.action.push_pbb.ethertype",
4757 FT_UINT16, BASE_HEX, VALS(etype_vals), 0x0,
4758 NULL, HFILL }
4760 { &hf_openflow_v4_action_push_pbb_pad,
4761 { "Pad", "openflow_v4.action.push_pbb.pad",
4762 FT_BYTES, BASE_NONE, NULL, 0x0,
4763 NULL, HFILL }
4765 { &hf_openflow_v4_action_pop_pbb_pad,
4766 { "Pad", "openflow_v4.action.pop_pbb.pad",
4767 FT_BYTES, BASE_NONE, NULL, 0x0,
4768 NULL, HFILL }
4770 { &hf_openflow_v4_instruction_type,
4771 { "Type", "openflow_v4.instruction.type",
4772 FT_UINT16, BASE_DEC, VALS(openflow_v4_instruction_type_values), 0x0,
4773 NULL, HFILL }
4775 { &hf_openflow_v4_instruction_length,
4776 { "Length", "openflow_v4.instruction.length",
4777 FT_UINT16, BASE_DEC, NULL, 0x0,
4778 NULL, HFILL }
4780 { &hf_openflow_v4_instruction_experimenter_experimenter,
4781 { "Experimenter", "openflow_v4.instruction_experimenter.experimenter",
4782 FT_UINT32, BASE_HEX, NULL, 0x0,
4783 NULL, HFILL }
4785 { &hf_openflow_v4_instruction_goto_table_table_id,
4786 { "Table ID", "openflow_v4.instruction.goto_table.table_id",
4787 FT_UINT8, BASE_DEC, NULL, 0x0,
4788 NULL, HFILL }
4790 { &hf_openflow_v4_instruction_goto_table_pad,
4791 { "Pad", "openflow_v4.instruction.goto_table.pad",
4792 FT_BYTES, BASE_NONE, NULL, 0x0,
4793 NULL, HFILL }
4795 { &hf_openflow_v4_instruction_write_metadata_pad,
4796 { "Pad", "openflow_v4.instruction.write_metadata.pad",
4797 FT_BYTES, BASE_NONE, NULL, 0x0,
4798 NULL, HFILL }
4800 { &hf_openflow_v4_instruction_write_metadata_value,
4801 { "Value", "openflow_v4.instruction.write_metadata.value",
4802 FT_UINT64, BASE_HEX, NULL, 0x0,
4803 NULL, HFILL }
4805 { &hf_openflow_v4_instruction_write_metadata_mask,
4806 { "Mask", "openflow_v4.instruction.write_metadata.mask",
4807 FT_UINT64, BASE_HEX, NULL, 0x0,
4808 NULL, HFILL }
4810 { &hf_openflow_v4_instruction_actions_pad,
4811 { "Pad", "openflow_v4.instruction.actions.pad",
4812 FT_BYTES, BASE_NONE, NULL, 0x0,
4813 NULL, HFILL }
4815 { &hf_openflow_v4_instruction_meter_meter_id,
4816 { "Meter ID", "openflow_v4.instruction.meter.meter_id",
4817 FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_meter_id_reserved_values), 0x0,
4818 NULL, HFILL }
4820 { &hf_openflow_v4_port_port_no,
4821 { "Port no", "openflow_v4.port.port_no",
4822 FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_port_reserved_values), 0x0,
4823 NULL, HFILL }
4825 { &hf_openflow_v4_port_pad,
4826 { "Pad", "openflow_v4.port.pad",
4827 FT_BYTES, BASE_NONE, NULL, 0x0,
4828 NULL, HFILL }
4830 { &hf_openflow_v4_port_hw_addr,
4831 { "Hw addr", "openflow_v4.port.hw_addr",
4832 FT_ETHER, BASE_NONE, NULL, 0x0,
4833 NULL, HFILL }
4835 { &hf_openflow_v4_port_pad2,
4836 { "Pad", "openflow_v4.port.pad2",
4837 FT_BYTES, BASE_NONE, NULL, 0x0,
4838 NULL, HFILL }
4840 { &hf_openflow_v4_port_name,
4841 { "Name", "openflow_v4.port.name",
4842 FT_STRING, BASE_NONE, NULL, 0x0,
4843 NULL, HFILL }
4845 { &hf_openflow_v4_port_config,
4846 { "Config", "openflow_v4.port.config",
4847 FT_UINT32, BASE_HEX, NULL, 0x0,
4848 NULL, HFILL }
4850 { &hf_openflow_v4_port_config_port_down,
4851 { "OFPPC_PORT_DOWN", "openflow_v4.port.config.port_down",
4852 FT_BOOLEAN, 32, NULL, OFPPC_PORT_DOWN,
4853 NULL, HFILL }
4855 { &hf_openflow_v4_port_config_no_recv,
4856 { "OFPPC_NO_RECV", "openflow_v4.port.config.no_recv",
4857 FT_BOOLEAN, 32, NULL, OFPPC_NO_RECV,
4858 NULL, HFILL }
4860 { &hf_openflow_v4_port_config_no_fwd,
4861 { "OFPPC_NO_FWD", "openflow_v4.port.config.no_fwd",
4862 FT_BOOLEAN, 32, NULL, OFPPC_NO_FWD,
4863 NULL, HFILL }
4865 { &hf_openflow_v4_port_config_no_packet_in,
4866 { "OFPPC_NO_PACKET_IN", "openflow_v4.port.config.no_packet_in",
4867 FT_BOOLEAN, 32, NULL, OFPPC_NO_PACKET_IN,
4868 NULL, HFILL }
4870 { &hf_openflow_v4_port_state,
4871 { "State", "openflow_v4.port.sate",
4872 FT_UINT32, BASE_HEX, NULL, 0x0,
4873 NULL, HFILL }
4875 { &hf_openflow_v4_port_state_link_down,
4876 { "OFPPS_LINK_DOWN", "openflow_v4.port.state.link_down",
4877 FT_BOOLEAN, 32, NULL, OFPPS_LINK_DOWN,
4878 NULL, HFILL }
4880 { &hf_openflow_v4_port_state_blocked,
4881 { "OFPPS_BLOCKED", "openflow_v4.port.state.blocked",
4882 FT_BOOLEAN, 32, NULL, OFPPS_BLOCKED,
4883 NULL, HFILL }
4885 { &hf_openflow_v4_port_state_live,
4886 { "OFPPS_LIVE", "openflow_v4.port.state.live",
4887 FT_BOOLEAN, 32, NULL, OFPPS_LIVE,
4888 NULL, HFILL }
4890 { &hf_openflow_v4_port_current,
4891 { "Current", "openflow_v4.port.current",
4892 FT_UINT32, BASE_HEX, NULL, 0x0,
4893 NULL, HFILL }
4895 { &hf_openflow_v4_port_current_10mb_hd,
4896 { "OFPPF_10MB_HD", "openflow_v4.port.current.10mb_hd",
4897 FT_BOOLEAN, 32, NULL, OFPPF_10MB_HD,
4898 NULL, HFILL }
4900 { &hf_openflow_v4_port_current_10mb_fd,
4901 { "OFPPF_10MB_FD", "openflow_v4.port.current.10mb_fd",
4902 FT_BOOLEAN, 32, NULL, OFPPF_10MB_FD,
4903 NULL, HFILL }
4905 { &hf_openflow_v4_port_current_100mb_hd,
4906 { "OFPPF_100MB_HD", "openflow_v4.port.current.100mb_hd",
4907 FT_BOOLEAN, 32, NULL, OFPPF_100MB_HD,
4908 NULL, HFILL }
4910 { &hf_openflow_v4_port_current_100mb_fd,
4911 { "OFPPF_100MB_FD", "openflow_v4.port.current.100mb_fd",
4912 FT_BOOLEAN, 32, NULL, OFPPF_100MB_FD,
4913 NULL, HFILL }
4915 { &hf_openflow_v4_port_current_1gb_hd,
4916 { "OFPPF_1GB_HD", "openflow_v4.port.current.1gb_hd",
4917 FT_BOOLEAN, 32, NULL, OFPPF_1GB_HD,
4918 NULL, HFILL }
4920 { &hf_openflow_v4_port_current_1gb_fd,
4921 { "OFPPF_1GB_FD", "openflow_v4.port.current.1gb_fd",
4922 FT_BOOLEAN, 32, NULL, OFPPF_1GB_FD,
4923 NULL, HFILL }
4925 { &hf_openflow_v4_port_current_10gb_fd,
4926 { "OFPPF_10_GB_FD", "openflow_v4.port.current.10gb_fd",
4927 FT_BOOLEAN, 32, NULL, OFPPF_10GB_FD,
4928 NULL, HFILL }
4930 { &hf_openflow_v4_port_current_40gb_fd,
4931 { "OFPPF_40GB_FD", "openflow_v4.port.current.40gb_fd",
4932 FT_BOOLEAN, 32, NULL, OFPPF_40GB_FD,
4933 NULL, HFILL }
4935 { &hf_openflow_v4_port_current_100gb_fd,
4936 { "OFPPF_100_GB_FD", "openflow_v4.port.current.100_gb_fd",
4937 FT_BOOLEAN, 32, NULL, OFPPF_100GB_FD,
4938 NULL, HFILL }
4940 { &hf_openflow_v4_port_current_1tb_fd,
4941 { "OFPPF_1TB_FD", "openflow_v4.port.current.1tb_fd",
4942 FT_BOOLEAN, 32, NULL, OFPPF_1TB_FD,
4943 NULL, HFILL }
4945 { &hf_openflow_v4_port_current_other,
4946 { "OFPPF_OTHER", "openflow_v4.port.current.other",
4947 FT_BOOLEAN, 32, NULL, OFPPF_OTHER,
4948 NULL, HFILL }
4950 { &hf_openflow_v4_port_current_copper,
4951 { "OFPPF_COPPER", "openflow_v4.port.current.copper",
4952 FT_BOOLEAN, 32, NULL, OFPPF_COPPER,
4953 NULL, HFILL }
4955 { &hf_openflow_v4_port_current_fiber,
4956 { "OFPPF_FIBER", "openflow_v4.port.current.fiber",
4957 FT_BOOLEAN, 32, NULL, OFPPF_FIBER,
4958 NULL, HFILL }
4960 { &hf_openflow_v4_port_current_autoneg,
4961 { "OFPPF_AUTONEG", "openflow_v4.port.current.autoneg",
4962 FT_BOOLEAN, 32, NULL, OFPPF_AUTONEG,
4963 NULL, HFILL }
4965 { &hf_openflow_v4_port_current_pause,
4966 { "OFPPF_PAUSE", "openflow_v4.port.current.pause",
4967 FT_BOOLEAN, 32, NULL, OFPPF_PAUSE,
4968 NULL, HFILL }
4970 { &hf_openflow_v4_port_current_pause_asym,
4971 { "OFPPF_PAUSE_ASYM", "openflow_v4.port.current.pause_asym",
4972 FT_BOOLEAN, 32, NULL, OFPPF_PAUSE_ASYM,
4973 NULL, HFILL }
4975 { &hf_openflow_v4_port_advertised,
4976 { "Advertised", "openflow_v4.port.advertised",
4977 FT_UINT32, BASE_HEX, NULL, 0x0,
4978 NULL, HFILL }
4980 { &hf_openflow_v4_port_advertised_10mb_hd,
4981 { "OFPPF_10MB_HD", "openflow_v4.port.advertised.10mb_hd",
4982 FT_BOOLEAN, 32, NULL, OFPPF_10MB_HD,
4983 NULL, HFILL }
4985 { &hf_openflow_v4_port_advertised_10mb_fd,
4986 { "OFPPF_10MB_FD", "openflow_v4.port.advertised.10mb_fd",
4987 FT_BOOLEAN, 32, NULL, OFPPF_10MB_FD,
4988 NULL, HFILL }
4990 { &hf_openflow_v4_port_advertised_100mb_hd,
4991 { "OFPPF_100MB_HD", "openflow_v4.port.advertised.100mb_hd",
4992 FT_BOOLEAN, 32, NULL, OFPPF_100MB_HD,
4993 NULL, HFILL }
4995 { &hf_openflow_v4_port_advertised_100mb_fd,
4996 { "OFPPF_100MB_FD", "openflow_v4.port.advertised.100mb_fd",
4997 FT_BOOLEAN, 32, NULL, OFPPF_100MB_FD,
4998 NULL, HFILL }
5000 { &hf_openflow_v4_port_advertised_1gb_hd,
5001 { "OFPPF_1GB_HD", "openflow_v4.port.advertised.1gb_hd",
5002 FT_BOOLEAN, 32, NULL, OFPPF_1GB_HD,
5003 NULL, HFILL }
5005 { &hf_openflow_v4_port_advertised_1gb_fd,
5006 { "OFPPF_1GB_FD", "openflow_v4.port.advertised.1gb_fd",
5007 FT_BOOLEAN, 32, NULL, OFPPF_1GB_FD,
5008 NULL, HFILL }
5010 { &hf_openflow_v4_port_advertised_10gb_fd,
5011 { "OFPPF_10_GB_FD", "openflow_v4.port.advertised.10gb_fd",
5012 FT_BOOLEAN, 32, NULL, OFPPF_10GB_FD,
5013 NULL, HFILL }
5015 { &hf_openflow_v4_port_advertised_40gb_fd,
5016 { "OFPPF_40GB_FD", "openflow_v4.port.advertised.40gb_fd",
5017 FT_BOOLEAN, 32, NULL, OFPPF_40GB_FD,
5018 NULL, HFILL }
5020 { &hf_openflow_v4_port_advertised_100gb_fd,
5021 { "OFPPF_100GB_FD", "openflow_v4.port.advertised.100gb_fd",
5022 FT_BOOLEAN, 32, NULL, OFPPF_100GB_FD,
5023 NULL, HFILL }
5025 { &hf_openflow_v4_port_advertised_1tb_fd,
5026 { "OFPPF_1TB_FD", "openflow_v4.port.advertised.1tb_fd",
5027 FT_BOOLEAN, 32, NULL, OFPPF_1TB_FD,
5028 NULL, HFILL }
5030 { &hf_openflow_v4_port_advertised_other,
5031 { "OFPPF_OTHER", "openflow_v4.port.advertised.other",
5032 FT_BOOLEAN, 32, NULL, OFPPF_OTHER,
5033 NULL, HFILL }
5035 { &hf_openflow_v4_port_advertised_copper,
5036 { "OFPPF_COPPER", "openflow_v4.port.advertised.copper",
5037 FT_BOOLEAN, 32, NULL, OFPPF_COPPER,
5038 NULL, HFILL }
5040 { &hf_openflow_v4_port_advertised_fiber,
5041 { "OFPPF_FIBER", "openflow_v4.port.advertised.fiber",
5042 FT_BOOLEAN, 32, NULL, OFPPF_FIBER,
5043 NULL, HFILL }
5045 { &hf_openflow_v4_port_advertised_autoneg,
5046 { "OFPPF_AUTONEG", "openflow_v4.port.advertised.autoneg",
5047 FT_BOOLEAN, 32, NULL, OFPPF_AUTONEG,
5048 NULL, HFILL }
5050 { &hf_openflow_v4_port_advertised_pause,
5051 { "OFPPF_PAUSE", "openflow_v4.port.advertised.pause",
5052 FT_BOOLEAN, 32, NULL, OFPPF_PAUSE,
5053 NULL, HFILL }
5055 { &hf_openflow_v4_port_advertised_pause_asym,
5056 { "OFPPF_PAUSE_ASYM", "openflow_v4.port.advertised.pause_asym",
5057 FT_BOOLEAN, 32, NULL, OFPPF_PAUSE_ASYM,
5058 NULL, HFILL }
5060 { &hf_openflow_v4_port_supported,
5061 { "Supported", "openflow_v4.port.supported",
5062 FT_UINT32, BASE_HEX, NULL, 0x0,
5063 NULL, HFILL }
5065 { &hf_openflow_v4_port_supported_10mb_hd,
5066 { "OFPPF_10MB_HD", "openflow_v4.port.supported.10mb_hd",
5067 FT_BOOLEAN, 32, NULL, OFPPF_10MB_HD,
5068 NULL, HFILL }
5070 { &hf_openflow_v4_port_supported_10mb_fd,
5071 { "OFPPF_10MB_FD", "openflow_v4.port.supported.10mb_fd",
5072 FT_BOOLEAN, 32, NULL, OFPPF_10MB_FD,
5073 NULL, HFILL }
5075 { &hf_openflow_v4_port_supported_100mb_hd,
5076 { "OFPPF_100MB_HD", "openflow_v4.port.supported.100mb_hd",
5077 FT_BOOLEAN, 32, NULL, OFPPF_100MB_HD,
5078 NULL, HFILL }
5080 { &hf_openflow_v4_port_supported_100mb_fd,
5081 { "OFPPF_100MB_FD", "openflow_v4.port.supported.100mb_fd",
5082 FT_BOOLEAN, 32, NULL, OFPPF_100MB_FD,
5083 NULL, HFILL }
5085 { &hf_openflow_v4_port_supported_1gb_hd,
5086 { "OFPPF_1GB_HD", "openflow_v4.port.supported.1gb_hd",
5087 FT_BOOLEAN, 32, NULL, OFPPF_1GB_HD,
5088 NULL, HFILL }
5090 { &hf_openflow_v4_port_supported_1gb_fd,
5091 { "OFPPF_1GB_FD", "openflow_v4.port.supported.1gb_fd",
5092 FT_BOOLEAN, 32, NULL, OFPPF_1GB_FD,
5093 NULL, HFILL }
5095 { &hf_openflow_v4_port_supported_10gb_fd,
5096 { "OFPPF_10_GB_FD", "openflow_v4.port.supported.10gb_fd",
5097 FT_BOOLEAN, 32, NULL, OFPPF_10GB_FD,
5098 NULL, HFILL }
5100 { &hf_openflow_v4_port_supported_40gb_fd,
5101 { "OFPPF_40GB_FD", "openflow_v4.port.supported.40gb_fd",
5102 FT_BOOLEAN, 32, NULL, OFPPF_40GB_FD,
5103 NULL, HFILL }
5105 { &hf_openflow_v4_port_supported_100gb_fd,
5106 { "OFPPF_100GB_FD", "openflow_v4.port.supported.100gb_fd",
5107 FT_BOOLEAN, 32, NULL, OFPPF_100GB_FD,
5108 NULL, HFILL }
5110 { &hf_openflow_v4_port_supported_1tb_fd,
5111 { "OFPPF_1TB_FD", "openflow_v4.port.supported.1tb_fd",
5112 FT_BOOLEAN, 32, NULL, OFPPF_1TB_FD,
5113 NULL, HFILL }
5115 { &hf_openflow_v4_port_supported_other,
5116 { "OFPPF_OTHER", "openflow_v4.port.supported.other",
5117 FT_BOOLEAN, 32, NULL, OFPPF_OTHER,
5118 NULL, HFILL }
5120 { &hf_openflow_v4_port_supported_copper,
5121 { "OFPPF_COPPER", "openflow_v4.port.supported.copper",
5122 FT_BOOLEAN, 32, NULL, OFPPF_COPPER,
5123 NULL, HFILL }
5125 { &hf_openflow_v4_port_supported_fiber,
5126 { "OFPPF_FIBER", "openflow_v4.port.supported.fiber",
5127 FT_BOOLEAN, 32, NULL, OFPPF_FIBER,
5128 NULL, HFILL }
5130 { &hf_openflow_v4_port_supported_autoneg,
5131 { "OFPPF_AUTONEG", "openflow_v4.port.supported.autoneg",
5132 FT_BOOLEAN, 32, NULL, OFPPF_AUTONEG,
5133 NULL, HFILL }
5135 { &hf_openflow_v4_port_supported_pause,
5136 { "OFPPF_PAUSE", "openflow_v4.port.supported.pause",
5137 FT_BOOLEAN, 32, NULL, OFPPF_PAUSE,
5138 NULL, HFILL }
5140 { &hf_openflow_v4_port_supported_pause_asym,
5141 { "OFPPF_PAUSE_ASYM", "openflow_v4.port.supported.pause_asym",
5142 FT_BOOLEAN, 32, NULL, OFPPF_PAUSE_ASYM,
5143 NULL, HFILL }
5145 { &hf_openflow_v4_port_peer,
5146 { "Peer", "openflow_v4.port.peer",
5147 FT_UINT32, BASE_HEX, NULL, 0x0,
5148 NULL, HFILL }
5150 { &hf_openflow_v4_port_peer_10mb_hd,
5151 { "OFPPF_10MB_HD", "openflow_v4.port.peer.10mb_hd",
5152 FT_BOOLEAN, 32, NULL, OFPPF_10MB_HD,
5153 NULL, HFILL }
5155 { &hf_openflow_v4_port_peer_10mb_fd,
5156 { "OFPPF_10MB_FD", "openflow_v4.port.peer.10mb_fd",
5157 FT_BOOLEAN, 32, NULL, OFPPF_10MB_FD,
5158 NULL, HFILL }
5160 { &hf_openflow_v4_port_peer_100mb_hd,
5161 { "OFPPF_100MB_HD", "openflow_v4.port.peer.100mb_hd",
5162 FT_BOOLEAN, 32, NULL, OFPPF_100MB_HD,
5163 NULL, HFILL }
5165 { &hf_openflow_v4_port_peer_100mb_fd,
5166 { "OFPPF_100MB_FD", "openflow_v4.port.peer.100mb_fd",
5167 FT_BOOLEAN, 32, NULL, OFPPF_100MB_FD,
5168 NULL, HFILL }
5170 { &hf_openflow_v4_port_peer_1gb_hd,
5171 { "OFPPF_1GB_HD", "openflow_v4.port.peer.1gb_hd",
5172 FT_BOOLEAN, 32, NULL, OFPPF_1GB_HD,
5173 NULL, HFILL }
5175 { &hf_openflow_v4_port_peer_1gb_fd,
5176 { "OFPPF_1GB_FD", "openflow_v4.port.peer.1gb_fd",
5177 FT_BOOLEAN, 32, NULL, OFPPF_1GB_FD,
5178 NULL, HFILL }
5180 { &hf_openflow_v4_port_peer_10gb_fd,
5181 { "OFPPF_10_GB_FD", "openflow_v4.port.peer.10gb_fd",
5182 FT_BOOLEAN, 32, NULL, OFPPF_10GB_FD,
5183 NULL, HFILL }
5185 { &hf_openflow_v4_port_peer_40gb_fd,
5186 { "OFPPF_40GB_FD", "openflow_v4.port.peer.40gb_fd",
5187 FT_BOOLEAN, 32, NULL, OFPPF_40GB_FD,
5188 NULL, HFILL }
5190 { &hf_openflow_v4_port_peer_100gb_fd,
5191 { "OFPPF_100GB_FD", "openflow_v4.port.peer.100gb_fd",
5192 FT_BOOLEAN, 32, NULL, OFPPF_100GB_FD,
5193 NULL, HFILL }
5195 { &hf_openflow_v4_port_peer_1tb_fd,
5196 { "OFPPF_1TB_FD", "openflow_v4.port.peer.1tb_fd",
5197 FT_BOOLEAN, 32, NULL, OFPPF_1TB_FD,
5198 NULL, HFILL }
5200 { &hf_openflow_v4_port_peer_other,
5201 { "OFPPF_OTHER", "openflow_v4.port.peer.other",
5202 FT_BOOLEAN, 32, NULL, OFPPF_OTHER,
5203 NULL, HFILL }
5205 { &hf_openflow_v4_port_peer_copper,
5206 { "OFPPF_COPPER", "openflow_v4.port.peer.copper",
5207 FT_BOOLEAN, 32, NULL, OFPPF_COPPER,
5208 NULL, HFILL }
5210 { &hf_openflow_v4_port_peer_fiber,
5211 { "OFPPF_FIBER", "openflow_v4.port.peer.fiber",
5212 FT_BOOLEAN, 32, NULL, OFPPF_FIBER,
5213 NULL, HFILL }
5215 { &hf_openflow_v4_port_peer_autoneg,
5216 { "OFPPF_AUTONEG", "openflow_v4.port.peer.autoneg",
5217 FT_BOOLEAN, 32, NULL, OFPPF_AUTONEG,
5218 NULL, HFILL }
5220 { &hf_openflow_v4_port_peer_pause,
5221 { "OFPPF_PAUSE", "openflow_v4.port.peer.pause",
5222 FT_BOOLEAN, 32, NULL, OFPPF_PAUSE,
5223 NULL, HFILL }
5225 { &hf_openflow_v4_port_peer_pause_asym,
5226 { "OFPPF_PAUSE_ASYM", "openflow_v4.port.peer.pause_asym",
5227 FT_BOOLEAN, 32, NULL, OFPPF_PAUSE_ASYM,
5228 NULL, HFILL }
5230 { &hf_openflow_v4_port_curr_speed,
5231 { "Curr speed", "openflow_v4.port.curr_speed",
5232 FT_UINT32, BASE_DEC, NULL, 0x0,
5233 NULL, HFILL }
5235 { &hf_openflow_v4_port_max_speed,
5236 { "Max speed", "openflow_v4.port.max_speed",
5237 FT_UINT32, BASE_DEC, NULL, 0x0,
5238 NULL, HFILL }
5240 { &hf_openflow_v4_meter_band_type,
5241 { "Type", "openflow_v4.meter_band.type",
5242 FT_UINT16, BASE_DEC, VALS(openflow_v4_meter_band_type_values), 0x0,
5243 NULL, HFILL }
5245 { &hf_openflow_v4_meter_band_len,
5246 { "Length", "openflow_v4.meter_band.length",
5247 FT_UINT16, BASE_DEC, NULL, 0x0,
5248 NULL, HFILL }
5250 { &hf_openflow_v4_meter_band_rate,
5251 { "Rate", "openflow_v4.meter_band.rate",
5252 FT_UINT32, BASE_DEC, NULL, 0x0,
5253 NULL, HFILL }
5255 { &hf_openflow_v4_meter_band_burst_size,
5256 { "Burst size", "openflow_v4.meter_band.burst_size",
5257 FT_UINT32, BASE_DEC, NULL, 0x0,
5258 NULL, HFILL }
5260 { &hf_openflow_v4_meter_band_drop_pad,
5261 { "Pad", "openflow_v4.meter_band.drop.pad",
5262 FT_BYTES, BASE_NONE, NULL, 0x0,
5263 NULL, HFILL }
5265 { &hf_openflow_v4_meter_band_dscp_remark_prec_level,
5266 { "Precedence level", "openflow_v4.meter_band.dscp_remark.prec_level",
5267 FT_UINT8, BASE_DEC, NULL, 0x0,
5268 NULL, HFILL }
5270 { &hf_openflow_v4_meter_band_dscp_remark_pad,
5271 { "Pad", "openflow_v4.meter_band.dscp_remark.pad",
5272 FT_BYTES, BASE_NONE, NULL, 0x0,
5273 NULL, HFILL }
5275 { &hf_openflow_v4_meter_band_experimenter_experimenter,
5276 { "Experimenter", "openflow_v4.meter_band.experimenter.experimenter",
5277 FT_UINT32, BASE_DEC, NULL, 0x0,
5278 NULL, HFILL }
5280 { &hf_openflow_v4_hello_element_type,
5281 { "Type", "openflow_v4.hello_element.type",
5282 FT_UINT16, BASE_DEC, VALS(openflow_v4_hello_element_type_values), 0x0,
5283 NULL, HFILL }
5285 { &hf_openflow_v4_hello_element_length,
5286 { "Length", "openflow_v4.hello_element.length",
5287 FT_UINT16, BASE_DEC, NULL, 0x0,
5288 NULL, HFILL }
5290 { &hf_openflow_v4_hello_element_version_bitmap,
5291 { "Bitmap", "openflow_v4.hello_element.version.bitmap",
5292 FT_BYTES, BASE_NONE, NULL, 0x0,
5293 NULL, HFILL }
5295 { &hf_openflow_v4_hello_element_pad,
5296 { "Pad", "openflow_v4.hello_element.pad",
5297 FT_BYTES, BASE_NONE, NULL, 0x0,
5298 NULL, HFILL }
5300 { &hf_openflow_v4_error_type,
5301 { "Type", "openflow_v4.error.type",
5302 FT_UINT16, BASE_DEC, VALS(openflow_v4_error_type_values), 0x0,
5303 NULL, HFILL }
5305 { &hf_openflow_v4_error_hello_failed_code,
5306 { "Code", "openflow_v4.error.code",
5307 FT_UINT16, BASE_DEC, VALS(openflow_v4_error_hello_failed_code_values), 0x0,
5308 NULL, HFILL }
5310 { &hf_openflow_v4_error_bad_request_code,
5311 { "Code", "openflow_v4.error.code",
5312 FT_UINT16, BASE_DEC, VALS(openflow_v4_error_bad_request_code_values), 0x0,
5313 NULL, HFILL }
5315 { &hf_openflow_v4_error_bad_action_code,
5316 { "Code", "openflow_v4.error.code",
5317 FT_UINT16, BASE_DEC, VALS(openflow_v4_error_bad_action_code_values), 0x0,
5318 NULL, HFILL }
5320 { &hf_openflow_v4_error_bad_instruction_code,
5321 { "Code", "openflow_v4.error.code",
5322 FT_UINT16, BASE_DEC, VALS(openflow_v4_error_bad_instruction_code_values), 0x0,
5323 NULL, HFILL }
5325 { &hf_openflow_v4_error_bad_match_code,
5326 { "Code", "openflow_v4.error.code",
5327 FT_UINT16, BASE_DEC, VALS(openflow_v4_error_bad_match_code_values), 0x0,
5328 NULL, HFILL }
5330 { &hf_openflow_v4_error_flow_mod_failed_code,
5331 { "Code", "openflow_v4.error.code",
5332 FT_UINT16, BASE_DEC, VALS(openflow_v4_error_flow_mod_failed_code_values), 0x0,
5333 NULL, HFILL }
5335 { &hf_openflow_v4_error_group_mod_failed_code,
5336 { "Code", "openflow_v4.error.code",
5337 FT_UINT16, BASE_DEC, VALS(openflow_v4_error_group_mod_failed_code_values), 0x0,
5338 NULL, HFILL }
5340 { &hf_openflow_v4_error_port_mod_failed_code,
5341 { "Code", "openflow_v4.error.code",
5342 FT_UINT16, BASE_DEC, VALS(openflow_v4_error_port_mod_failed_code_values), 0x0,
5343 NULL, HFILL }
5345 { &hf_openflow_v4_error_table_mod_failed_code,
5346 { "Code", "openflow_v4.error.code",
5347 FT_UINT16, BASE_DEC, VALS(openflow_v4_error_table_mod_failed_code_values), 0x0,
5348 NULL, HFILL }
5350 { &hf_openflow_v4_error_queue_op_failed_code,
5351 { "Code", "openflow_v4.error.code",
5352 FT_UINT16, BASE_DEC, VALS(openflow_v4_error_queue_op_failed_code_values), 0x0,
5353 NULL, HFILL }
5355 { &hf_openflow_v4_error_switch_config_failed_code,
5356 { "Code", "openflow_v4.error.code",
5357 FT_UINT16, BASE_DEC, VALS(openflow_v4_error_switch_config_failed_code_values), 0x0,
5358 NULL, HFILL }
5360 { &hf_openflow_v4_error_role_request_failed_code,
5361 { "Code", "openflow_v4.error.code",
5362 FT_UINT16, BASE_DEC, VALS(openflow_v4_error_role_request_failed_code_values), 0x0,
5363 NULL, HFILL }
5365 { &hf_openflow_v4_error_meter_mod_failed_code,
5366 { "Code", "openflow_v4.error.code",
5367 FT_UINT16, BASE_DEC, VALS(openflow_v4_error_meter_mod_failed_code_values), 0x0,
5368 NULL, HFILL }
5370 { &hf_openflow_v4_error_table_features_failed_code,
5371 { "Code", "openflow_v4.error.code",
5372 FT_UINT16, BASE_DEC, VALS(openflow_v4_error_table_features_failed_code_values), 0x0,
5373 NULL, HFILL }
5375 { &hf_openflow_v4_error_code,
5376 { "Code", "openflow_v4.error.code",
5377 FT_UINT16, BASE_DEC, NULL, 0x0,
5378 NULL, HFILL }
5380 { &hf_openflow_v4_error_data_text,
5381 { "Data", "openflow_v4.error.data",
5382 FT_STRING, BASE_NONE, NULL, 0x0,
5383 NULL, HFILL }
5385 { &hf_openflow_v4_echo_data,
5386 { "Data", "openflow_v4.echo.data",
5387 FT_BYTES, BASE_NONE, NULL, 0x0,
5388 NULL, HFILL }
5390 { &hf_openflow_v4_error_data_body,
5391 { "Body", "openflow_v4.error.data.body",
5392 FT_BYTES, BASE_NONE, NULL, 0x0,
5393 NULL, HFILL }
5395 { &hf_openflow_v4_error_experimenter,
5396 { "Experimenter", "openflow_v4.error.experimenter",
5397 FT_UINT32, BASE_HEX, NULL, 0x0,
5398 NULL, HFILL }
5400 { &hf_openflow_v4_experimenter_experimenter,
5401 { "Experimenter", "openflow_v4.experimenter.experimenter",
5402 FT_UINT32, BASE_HEX, NULL, 0x0,
5403 NULL, HFILL }
5405 { &hf_openflow_v4_experimenter_exp_type,
5406 { "Experimenter type", "openflow_v4.experimenter.exp_type",
5407 FT_UINT32, BASE_DEC, NULL, 0x0,
5408 NULL, HFILL }
5410 { &hf_openflow_v4_switch_features_datapath_id,
5411 { "datapath_id", "openflow_v4.switch_features.datapath_id",
5412 FT_UINT64, BASE_HEX, NULL, 0x0,
5413 NULL, HFILL }
5415 { &hf_openflow_v4_switch_features_n_buffers,
5416 { "n_buffers", "openflow_v4.switch_features.n_buffers",
5417 FT_UINT32, BASE_DEC, NULL, 0x0,
5418 NULL, HFILL }
5420 { &hf_openflow_v4_switch_features_n_tables,
5421 { "n_tables", "openflow_v4.switch_features.n_tables",
5422 FT_UINT8, BASE_DEC, NULL, 0x0,
5423 NULL, HFILL }
5425 { &hf_openflow_v4_switch_features_auxiliary_id,
5426 { "auxiliary_id", "openflow_v4.switch_features.auxiliary_id",
5427 FT_UINT8, BASE_DEC, NULL, 0x0,
5428 NULL, HFILL }
5430 { &hf_openflow_v4_switch_features_pad,
5431 { "Pad", "openflow_v4.switch_features.pad",
5432 FT_UINT16, BASE_DEC, NULL, 0x0,
5433 NULL, HFILL }
5435 { &hf_openflow_v4_switch_features_capabilities,
5436 { "capabilities", "openflow_v4.switch_features.capabilities",
5437 FT_UINT32, BASE_HEX, NULL, 0x0,
5438 NULL, HFILL }
5440 { &hf_openflow_v4_switch_features_capabilities_flow_stats,
5441 { "OFPC_FLOW_STATS", "openflow_v4.switch_features.capabilities.flow_stats",
5442 FT_BOOLEAN, 32, NULL, OFPC_FLOW_STATS,
5443 NULL, HFILL }
5445 { &hf_openflow_v4_switch_features_capabilities_table_stats,
5446 { "OFPC_TABLE_STATS", "openflow_v4.switch_features.capabilities.table_stats",
5447 FT_BOOLEAN, 32, NULL, OFPC_TABLE_STATS,
5448 NULL, HFILL }
5450 { &hf_openflow_v4_switch_features_capabilities_port_stats,
5451 { "OFPC_PORT_STATS", "openflow_v4.switch_features.capabilities.port_stats",
5452 FT_BOOLEAN, 32, NULL, OFPC_PORT_STATS,
5453 NULL, HFILL }
5455 { &hf_openflow_v4_switch_features_capabilities_group_stats,
5456 { "OFPC_GROUP_STATS", "openflow_v4.switch_features.capabilities.group_stats",
5457 FT_BOOLEAN, 32, NULL, OFPC_GROUP_STATS,
5458 NULL, HFILL }
5460 { &hf_openflow_v4_switch_features_capabilities_ip_reasm,
5461 { "OFPC_IP_REASM", "openflow_v4.switch_features.capabilities.ip_reasm",
5462 FT_BOOLEAN, 32, NULL, OFPC_IP_REASM,
5463 NULL, HFILL }
5465 { &hf_openflow_v4_switch_features_capabilities_queue_stats,
5466 { "OFPC_QUEUE_STATS", "openflow_v4.switch_features.capabilities.queue_stats",
5467 FT_BOOLEAN, 32, NULL, OFPC_QUEUE_STATS,
5468 NULL, HFILL }
5470 { &hf_openflow_v4_switch_features_capabilities_port_blocked,
5471 { "OFPC_PORT_BLOCKED", "openflow_v4.switch_features.capabilities.port_blocked",
5472 FT_BOOLEAN, 32, NULL, OFPC_PORT_BLOCKED,
5473 NULL, HFILL }
5475 { &hf_openflow_v4_switch_features_reserved,
5476 { "Reserved", "openflow_v4.switch_features_reserved",
5477 FT_UINT32, BASE_HEX, NULL, 0x0,
5478 NULL, HFILL }
5480 { &hf_openflow_v4_switch_config_flags,
5481 { "Flags", "openflow_v4.switch_config.flags",
5482 FT_UINT16, BASE_HEX, NULL, 0x0,
5483 NULL, HFILL }
5485 { &hf_openflow_v4_switch_config_flags_fragments,
5486 { "IP Fragments", "openflow_v4.switch_config.flags.fragments",
5487 FT_UINT16, BASE_DEC, VALS(openflow_v4_switch_config_fragments_values), 0x0,
5488 NULL, HFILL }
5490 { &hf_openflow_v4_switch_config_miss_send_len,
5491 { "Miss send length", "openflow_v4.switch_config.miss_send_len",
5492 FT_UINT16, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_controller_max_len_reserved_values), 0x0,
5493 NULL, HFILL }
5495 { &hf_openflow_v4_packet_in_buffer_id,
5496 { "Buffer ID", "openflow_v4.packet_in.buffer_id",
5497 FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_buffer_reserved_values), 0x0,
5498 NULL, HFILL }
5500 { &hf_openflow_v4_packet_in_total_len,
5501 { "Total length", "openflow_v4.packet_in.total_len",
5502 FT_UINT16, BASE_DEC, NULL, 0x0,
5503 NULL, HFILL }
5505 { &hf_openflow_v4_packet_in_reason,
5506 { "Reason", "openflow_v4.packet_in.reason",
5507 FT_UINT8, BASE_DEC, VALS(openflow_v4_packet_in_reason_values), 0x0,
5508 NULL, HFILL }
5510 { &hf_openflow_v4_packet_in_table_id,
5511 { "Table ID", "openflow_v4.packet_in.table_id",
5512 FT_UINT8, BASE_DEC, NULL, 0x0,
5513 NULL, HFILL }
5515 { &hf_openflow_v4_packet_in_cookie,
5516 { "Cookie", "openflow_v4.packet_in.cookie",
5517 FT_UINT64, BASE_HEX, NULL, 0x0,
5518 NULL, HFILL }
5520 { &hf_openflow_v4_packet_in_pad,
5521 { "Pad", "openflow_v4.packet_in.pad",
5522 FT_BYTES, BASE_NONE, NULL, 0x0,
5523 NULL, HFILL }
5525 { &hf_openflow_v4_flow_removed_cookie,
5526 { "Cookie", "openflow_v4.flow_removed.cookie",
5527 FT_UINT64, BASE_HEX, NULL, 0x0,
5528 NULL, HFILL }
5530 { &hf_openflow_v4_flow_removed_priority,
5531 { "Priority", "openflow_v4.flow_removed.priority",
5532 FT_UINT16, BASE_DEC, NULL, 0x0,
5533 NULL, HFILL }
5535 { &hf_openflow_v4_flow_removed_reason,
5536 { "Reason", "openflow_v4.flow_removed.reason",
5537 FT_UINT8, BASE_DEC, VALS(openflow_v4_flow_removed_reason_values), 0x0,
5538 NULL, HFILL }
5540 { &hf_openflow_v4_flow_removed_table_id,
5541 { "Table ID", "openflow_v4.flow_removed.table_id",
5542 FT_UINT8, BASE_DEC, NULL, 0x0,
5543 NULL, HFILL }
5545 { &hf_openflow_v4_flow_removed_duration_sec,
5546 { "Duration sec", "openflow_v4.flow_removed.duration_sec",
5547 FT_UINT32, BASE_DEC, NULL, 0x0,
5548 NULL, HFILL }
5550 { &hf_openflow_v4_flow_removed_duration_nsec,
5551 { "Duration nsec", "openflow_v4.flow_removed.duration_nsec",
5552 FT_UINT32, BASE_DEC, NULL, 0x0,
5553 NULL, HFILL }
5555 { &hf_openflow_v4_flow_removed_idle_timeout,
5556 { "Idle timeout", "openflow_v4.flow_removed.idle_timeout",
5557 FT_UINT16, BASE_DEC, NULL, 0x0,
5558 NULL, HFILL }
5560 { &hf_openflow_v4_flow_removed_hard_timeout,
5561 { "Hard timeout", "openflow_v4.flow_removed.hard_timeout",
5562 FT_UINT16, BASE_DEC, NULL, 0x0,
5563 NULL, HFILL }
5565 { &hf_openflow_v4_flow_removed_packet_count,
5566 { "Packet count", "openflow_v4.flow_removed.packet_count",
5567 FT_UINT64, BASE_DEC, NULL, 0x0,
5568 NULL, HFILL }
5570 { &hf_openflow_v4_flow_removed_byte_count,
5571 { "Byte count", "openflow_v4.flow_removed.byte_count",
5572 FT_UINT64, BASE_DEC, NULL, 0x0,
5573 NULL, HFILL }
5575 { &hf_openflow_v4_port_status_reason,
5576 { "Reason", "openflow_v4.port_status.reason",
5577 FT_UINT8, BASE_DEC, VALS(openflow_v4_port_status_reason_values), 0x0,
5578 NULL, HFILL }
5580 { &hf_openflow_v4_port_status_pad,
5581 { "Pad", "openflow_v4.port_status.pad",
5582 FT_BYTES, BASE_NONE, NULL, 0x0,
5583 NULL, HFILL }
5585 { &hf_openflow_v4_packet_out_buffer_id,
5586 { "Buffer ID", "openflow_v4.packet_out.buffer_id",
5587 FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_buffer_reserved_values), 0x0,
5588 NULL, HFILL }
5590 { &hf_openflow_v4_packet_out_in_port,
5591 { "In port", "openflow_v4.packet_out.in_port",
5592 FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_port_reserved_values), 0x0,
5593 NULL, HFILL }
5595 { &hf_openflow_v4_packet_out_acts_len,
5596 { "Actions length", "openflow_v4.packet_out.acts_len",
5597 FT_UINT16, BASE_DEC, NULL, 0x0,
5598 NULL, HFILL }
5600 { &hf_openflow_v4_packet_out_pad,
5601 { "Pad", "openflow_v4.packet_out.pad",
5602 FT_BYTES, BASE_NONE, NULL, 0x0,
5603 NULL, HFILL }
5605 { &hf_openflow_v4_flowmod_cookie,
5606 { "Cookie", "openflow_v4.flowmod.cookie",
5607 FT_UINT64, BASE_HEX, NULL, 0x0,
5608 NULL, HFILL }
5610 { &hf_openflow_v4_flowmod_cookie_mask,
5611 { "Cookie mask", "openflow_v4.flowmod.cookie_mask",
5612 FT_UINT64, BASE_HEX, NULL, 0x0,
5613 NULL, HFILL }
5615 { &hf_openflow_v4_flowmod_table_id,
5616 { "Table ID", "openflow_v4.flowmod.table_id",
5617 FT_UINT8, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_table_reserved_values), 0x0,
5618 NULL, HFILL }
5620 { &hf_openflow_v4_flowmod_command,
5621 { "Command", "openflow_v4.flowmod.command",
5622 FT_UINT8, BASE_DEC, VALS(openflow_v4_flowmod_command_values), 0x0,
5623 NULL, HFILL }
5625 { &hf_openflow_v4_flowmod_idle_timeout,
5626 { "Idle timeout", "openflow_v4.flowmod.idle_timeout",
5627 FT_UINT16, BASE_DEC, NULL, 0x0,
5628 NULL, HFILL }
5630 { &hf_openflow_v4_flowmod_hard_timeout,
5631 { "Hard timeout", "openflow_v4.flowmod.hard_timeout",
5632 FT_UINT16, BASE_DEC, NULL, 0x0,
5633 NULL, HFILL }
5635 { &hf_openflow_v4_flowmod_priority,
5636 { "Priority", "openflow_v4.flowmod.priority",
5637 FT_UINT16, BASE_DEC, NULL, 0x0,
5638 NULL, HFILL }
5640 { &hf_openflow_v4_flowmod_buffer_id,
5641 { "Buffer ID", "openflow_v4.flowmod.buffer_id",
5642 FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_buffer_reserved_values), 0x0,
5643 NULL, HFILL }
5645 { &hf_openflow_v4_flowmod_out_port,
5646 { "Out port", "openflow_v4.flowmod.out_port",
5647 FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_port_reserved_values), 0x0,
5648 NULL, HFILL }
5650 { &hf_openflow_v4_flowmod_out_group,
5651 { "Out group", "openflow_v4.flowmod.out_group",
5652 FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_group_reserved_values), 0x0,
5653 NULL, HFILL }
5655 { &hf_openflow_v4_flowmod_flags,
5656 { "Flags", "openflow_v4.flowmod.flags",
5657 FT_UINT16, BASE_HEX, NULL, 0x0,
5658 NULL, HFILL }
5660 { &hf_openflow_v4_flowmod_flags_send_flow_rem,
5661 { "Send flow removed", "openflow_v4.flowmod.flags.send_flow_rem",
5662 FT_BOOLEAN, 16, NULL, OFPFF_SEND_FLOW_REM,
5663 NULL, HFILL }
5665 { &hf_openflow_v4_flowmod_flags_check_overlap,
5666 { "Check overlap", "openflow_v4.flowmod.flags.check_overlap",
5667 FT_BOOLEAN, 16, NULL, OFPFF_CHECK_OVERLAP,
5668 NULL, HFILL }
5670 { &hf_openflow_v4_flowmod_flags_reset_counts,
5671 { "Reset counts", "openflow_v4.flowmod.flags.reset_counts",
5672 FT_BOOLEAN, 16, NULL, OFPFF_RESET_COUNTS,
5673 NULL, HFILL }
5675 { &hf_openflow_v4_flowmod_flags_no_packet_counts,
5676 { "Don't count packets", "openflow_v4.flowmod.flags.no_packet_counts",
5677 FT_BOOLEAN, 16, NULL, OFPFF_NO_PKT_COUNTS,
5678 NULL, HFILL }
5680 { &hf_openflow_v4_flowmod_flags_no_byte_counts,
5681 { "Don't count bytes", "openflow_v4.flowmod.flags.no_byte_counts",
5682 FT_BOOLEAN, 16, NULL, OFPFF_NO_BYT_COUNTS,
5683 NULL, HFILL }
5685 { &hf_openflow_v4_flowmod_pad,
5686 { "Pad", "openflow_v4.flowmod.pad",
5687 FT_BYTES, BASE_NONE, NULL, 0x0,
5688 NULL, HFILL }
5690 { &hf_openflow_v4_bucket_length,
5691 { "Length", "openflow_v4.bucket.length",
5692 FT_UINT16, BASE_DEC, NULL, 0x0,
5693 NULL, HFILL }
5695 { &hf_openflow_v4_bucket_weight,
5696 { "Weight", "openflow_v4.bucket.weight",
5697 FT_UINT16, BASE_DEC, NULL, 0x0,
5698 NULL, HFILL }
5700 { &hf_openflow_v4_bucket_watch_port,
5701 { "Watch port", "openflow_v4.bucket.watch_port",
5702 FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_port_reserved_values), 0x0,
5703 NULL, HFILL }
5705 { &hf_openflow_v4_bucket_watch_group,
5706 { "Watch group", "openflow_v4.bucket.watch_group",
5707 FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_group_reserved_values), 0x0,
5708 NULL, HFILL }
5710 { &hf_openflow_v4_bucket_pad,
5711 { "Pad", "openflow_v4.bucket.pad",
5712 FT_BYTES, BASE_NONE, NULL, 0x0,
5713 NULL, HFILL }
5715 { &hf_openflow_v4_groupmod_command,
5716 { "Command", "openflow_v4.groupmod.command",
5717 FT_UINT16, BASE_DEC, VALS(openflow_v4_groupmod_command_values), 0x0,
5718 NULL, HFILL }
5720 { &hf_openflow_v4_groupmod_type,
5721 { "Type", "openflow_v4.groupmod.type",
5722 FT_UINT8, BASE_DEC, VALS(openflow_v4_group_type_values), 0x0,
5723 NULL, HFILL }
5725 { &hf_openflow_v4_groupmod_pad,
5726 { "Pad", "openflow_v4.groupmod.pad",
5727 FT_BYTES, BASE_NONE, NULL, 0x0,
5728 NULL, HFILL }
5730 { &hf_openflow_v4_groupmod_group_id,
5731 { "Group ID", "openflow_v4.groupmod.group_id",
5732 FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_group_reserved_values), 0x0,
5733 NULL, HFILL }
5735 { &hf_openflow_v4_portmod_port_no,
5736 { "Port no", "openflow_v4.portmod.port_no",
5737 FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_port_reserved_values), 0x0,
5738 NULL, HFILL }
5740 { &hf_openflow_v4_portmod_pad,
5741 { "Pad", "openflow_v4.portmod.pad",
5742 FT_BYTES, BASE_NONE, NULL, 0x0,
5743 NULL, HFILL }
5745 { &hf_openflow_v4_portmod_hw_addr,
5746 { "Hw addr", "openflow_v4.portmod.hw_addr",
5747 FT_ETHER, BASE_NONE, NULL, 0x0,
5748 NULL, HFILL }
5750 { &hf_openflow_v4_portmod_pad2,
5751 { "Pad", "openflow_v4.portmod.pad2",
5752 FT_BYTES, BASE_NONE, NULL, 0x0,
5753 NULL, HFILL }
5755 { &hf_openflow_v4_portmod_config,
5756 { "Config", "openflow_v4.portmod.config",
5757 FT_UINT32, BASE_HEX, NULL, 0x0,
5758 NULL, HFILL }
5760 { &hf_openflow_v4_portmod_config_port_down,
5761 { "OFPPC_PORT_DOWN", "openflow_v4.portmod.config.port_down",
5762 FT_BOOLEAN, 32, NULL, OFPPC_PORT_DOWN,
5763 NULL, HFILL }
5765 { &hf_openflow_v4_portmod_config_no_recv,
5766 { "OFPPC_NO_RECV", "openflow_v4.portmod.config.no_recv",
5767 FT_BOOLEAN, 32, NULL, OFPPC_NO_RECV,
5768 NULL, HFILL }
5770 { &hf_openflow_v4_portmod_config_no_fwd,
5771 { "OFPPC_NO_FWD", "openflow_v4.portmod.config.no_fwd",
5772 FT_BOOLEAN, 32, NULL, OFPPC_NO_FWD,
5773 NULL, HFILL }
5775 { &hf_openflow_v4_portmod_config_no_packet_in,
5776 { "OFPPC_NO_PACKET_IN", "openflow_v4.portmod.config.no_packet_in",
5777 FT_BOOLEAN, 32, NULL, OFPPC_NO_PACKET_IN,
5778 NULL, HFILL }
5780 { &hf_openflow_v4_portmod_mask,
5781 { "Mask", "openflow_v4.portmod.mask",
5782 FT_UINT32, BASE_HEX, NULL, 0x0,
5783 NULL, HFILL }
5785 { &hf_openflow_v4_portmod_mask_port_down,
5786 { "OFPPC_PORT_DOWN", "openflow_v4.portmod.mask.port_down",
5787 FT_BOOLEAN, 32, NULL, OFPPC_PORT_DOWN,
5788 NULL, HFILL }
5790 { &hf_openflow_v4_portmod_mask_no_recv,
5791 { "OFPPC_NO_RECV", "openflow_v4.portmod.mask.no_recv",
5792 FT_BOOLEAN, 32, NULL, OFPPC_NO_RECV,
5793 NULL, HFILL }
5795 { &hf_openflow_v4_portmod_mask_no_fwd,
5796 { "OFPPC_NO_FWD", "openflow_v4.portmod.mask.no_fwd",
5797 FT_BOOLEAN, 32, NULL, OFPPC_NO_FWD,
5798 NULL, HFILL }
5800 { &hf_openflow_v4_portmod_mask_no_packet_in,
5801 { "OFPPC_NO_PACKET_IN", "openflow_v4.portmod.mask.no_packet_in",
5802 FT_BOOLEAN, 32, NULL, OFPPC_NO_PACKET_IN,
5803 NULL, HFILL }
5805 { &hf_openflow_v4_portmod_advertise,
5806 { "Advertise", "openflow_v4.portmod.advertise",
5807 FT_UINT32, BASE_HEX, NULL, 0x0,
5808 NULL, HFILL }
5810 { &hf_openflow_v4_portmod_advertise_10mb_hd,
5811 { "OFPPF_10MB_HD", "openflow_v4.portmod.advertise.10mb_hd",
5812 FT_BOOLEAN, 32, NULL, OFPPF_10MB_HD,
5813 NULL, HFILL }
5815 { &hf_openflow_v4_portmod_advertise_10mb_fd,
5816 { "OFPPF_10MB_FD", "openflow_v4.portmod.advertise.10mb_fd",
5817 FT_BOOLEAN, 32, NULL, OFPPF_10MB_FD,
5818 NULL, HFILL }
5820 { &hf_openflow_v4_portmod_advertise_100mb_hd,
5821 { "OFPPF_100MB_HD", "openflow_v4.portmod.advertise.100mb_hd",
5822 FT_BOOLEAN, 32, NULL, OFPPF_100MB_HD,
5823 NULL, HFILL }
5825 { &hf_openflow_v4_portmod_advertise_100mb_fd,
5826 { "OFPPF_100MB_FD", "openflow_v4.portmod.advertise.100mb_fd",
5827 FT_BOOLEAN, 32, NULL, OFPPF_100MB_FD,
5828 NULL, HFILL }
5830 { &hf_openflow_v4_portmod_advertise_1gb_hd,
5831 { "OFPPF_1GB_HD", "openflow_v4.portmod.advertise.1gb_hd",
5832 FT_BOOLEAN, 32, NULL, OFPPF_1GB_HD,
5833 NULL, HFILL }
5835 { &hf_openflow_v4_portmod_advertise_1gb_fd,
5836 { "OFPPF_1GB_FD", "openflow_v4.portmod.advertise.1gb_fd",
5837 FT_BOOLEAN, 32, NULL, OFPPF_1GB_FD,
5838 NULL, HFILL }
5840 { &hf_openflow_v4_portmod_advertise_10gb_fd,
5841 { "OFPPF_10_GB_FD", "openflow_v4.portmod.advertise.10gb_fd",
5842 FT_BOOLEAN, 32, NULL, OFPPF_10GB_FD,
5843 NULL, HFILL }
5845 { &hf_openflow_v4_portmod_advertise_40gb_fd,
5846 { "OFPPF_40GB_FD", "openflow_v4.portmod.advertise.40gb_fd",
5847 FT_BOOLEAN, 32, NULL, OFPPF_40GB_FD,
5848 NULL, HFILL }
5850 { &hf_openflow_v4_portmod_advertise_100gb_fd,
5851 { "OFPPF_100_GB_FD", "openflow_v4.portmod.advertise.100_gb_fd",
5852 FT_BOOLEAN, 32, NULL, OFPPF_100GB_FD,
5853 NULL, HFILL }
5855 { &hf_openflow_v4_portmod_advertise_1tb_fd,
5856 { "OFPPF_1TB_FD", "openflow_v4.portmod.advertise.1tb_fd",
5857 FT_BOOLEAN, 32, NULL, OFPPF_1TB_FD,
5858 NULL, HFILL }
5860 { &hf_openflow_v4_portmod_advertise_other,
5861 { "OFPPF_OTHER", "openflow_v4.portmod.advertise.other",
5862 FT_BOOLEAN, 32, NULL, OFPPF_OTHER,
5863 NULL, HFILL }
5865 { &hf_openflow_v4_portmod_advertise_copper,
5866 { "OFPPF_COPPER", "openflow_v4.portmod.advertise.copper",
5867 FT_BOOLEAN, 32, NULL, OFPPF_COPPER,
5868 NULL, HFILL }
5870 { &hf_openflow_v4_portmod_advertise_fiber,
5871 { "OFPPF_FIBER", "openflow_v4.portmod.advertise.fiber",
5872 FT_BOOLEAN, 32, NULL, OFPPF_FIBER,
5873 NULL, HFILL }
5875 { &hf_openflow_v4_portmod_advertise_autoneg,
5876 { "OFPPF_AUTONEG", "openflow_v4.portmod.advertise.autoneg",
5877 FT_BOOLEAN, 32, NULL, OFPPF_AUTONEG,
5878 NULL, HFILL }
5880 { &hf_openflow_v4_portmod_advertise_pause,
5881 { "OFPPF_PAUSE", "openflow_v4.portmod.advertise.pause",
5882 FT_BOOLEAN, 32, NULL, OFPPF_PAUSE,
5883 NULL, HFILL }
5885 { &hf_openflow_v4_portmod_advertise_pause_asym,
5886 { "OFPPF_PAUSE_ASYM", "openflow_v4.portmod.advertise.pause_asym",
5887 FT_BOOLEAN, 32, NULL, OFPPF_PAUSE_ASYM,
5888 NULL, HFILL }
5890 { &hf_openflow_v4_portmod_pad3,
5891 { "Pad", "openflow_v4.portmod.pad3",
5892 FT_BYTES, BASE_NONE, NULL, 0x0,
5893 NULL, HFILL }
5895 { &hf_openflow_v4_tablemod_table_id,
5896 { "Table ID", "openflow_v4.tablemod.table_id",
5897 FT_UINT8, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_table_reserved_values), 0x0,
5898 NULL, HFILL }
5900 { &hf_openflow_v4_tablemod_pad,
5901 { "Pad", "openflow_v4.tablemod.pad",
5902 FT_BYTES, BASE_NONE, NULL, 0x0,
5903 NULL, HFILL }
5905 { &hf_openflow_v4_tablemod_config,
5906 { "Config", "openflow_v4.tablemod.config",
5907 FT_BYTES, BASE_NONE, NULL, 0x0,
5908 NULL, HFILL }
5910 { &hf_openflow_v4_flow_stats_request_table_id,
5911 { "Table ID", "openflow_v4.flow_stats_request.table_id",
5912 FT_UINT8, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_table_reserved_values), 0x0,
5913 NULL, HFILL }
5915 { &hf_openflow_v4_flow_stats_request_pad,
5916 { "Pad", "openflow_v4.flow_stats_request.pad",
5917 FT_BYTES, BASE_NONE, NULL, 0x0,
5918 NULL, HFILL }
5920 { &hf_openflow_v4_flow_stats_request_out_port,
5921 { "Out port", "openflow_v4.flow_stats_request.out_port",
5922 FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_port_reserved_values), 0x0,
5923 NULL, HFILL }
5925 { &hf_openflow_v4_flow_stats_request_out_group,
5926 { "Out group", "openflow_v4.flow_stats_request.out_group",
5927 FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_group_reserved_values), 0x0,
5928 NULL, HFILL }
5930 { &hf_openflow_v4_flow_stats_request_pad2,
5931 { "Pad", "openflow_v4.flow_stats_request.pad2",
5932 FT_BYTES, BASE_NONE, NULL, 0x0,
5933 NULL, HFILL }
5935 { &hf_openflow_v4_flow_stats_request_cookie,
5936 { "Cookie", "openflow_v4.flow_stats_request.cookie",
5937 FT_UINT64, BASE_HEX, NULL, 0x0,
5938 NULL, HFILL }
5940 { &hf_openflow_v4_flow_stats_request_cookie_mask,
5941 { "Cookie mask", "openflow_v4.flow_stats_request.cookie_mask",
5942 FT_UINT64, BASE_HEX, NULL, 0x0,
5943 NULL, HFILL }
5945 { &hf_openflow_v4_aggregate_stats_request_table_id,
5946 { "Table ID", "openflow_v4.aggregate_stats_request.table_id",
5947 FT_UINT8, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_table_reserved_values), 0x0,
5948 NULL, HFILL }
5950 { &hf_openflow_v4_aggregate_stats_request_pad,
5951 { "Pad", "openflow_v4.aggregate_stats_request.pad",
5952 FT_BYTES, BASE_NONE, NULL, 0x0,
5953 NULL, HFILL }
5955 { &hf_openflow_v4_aggregate_stats_request_out_port,
5956 { "Out port", "openflow_v4.aggregate_stats_request.out_port",
5957 FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_port_reserved_values), 0x0,
5958 NULL, HFILL }
5960 { &hf_openflow_v4_aggregate_stats_request_out_group,
5961 { "Out group", "openflow_v4.aggregate_stats_request.out_group",
5962 FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_group_reserved_values), 0x0,
5963 NULL, HFILL }
5965 { &hf_openflow_v4_aggregate_stats_request_pad2,
5966 { "Pad", "openflow_v4.aggregate_stats_request.pad2",
5967 FT_BYTES, BASE_NONE, NULL, 0x0,
5968 NULL, HFILL }
5970 { &hf_openflow_v4_aggregate_stats_request_cookie,
5971 { "Cookie", "openflow_v4.aggregate_stats_request.cookie",
5972 FT_UINT64, BASE_HEX, NULL, 0x0,
5973 NULL, HFILL }
5975 { &hf_openflow_v4_aggregate_stats_request_cookie_mask,
5976 { "Cookie mask", "openflow_v4.aggregate_stats_request.cookie_mask",
5977 FT_UINT64, BASE_HEX, NULL, 0x0,
5978 NULL, HFILL }
5980 { &hf_openflow_v4_table_feature_prop_type,
5981 { "Type", "openflow_v4.table_feature_prop.type",
5982 FT_UINT16, BASE_DEC, VALS(openflow_v4_table_feature_prop_type_values), 0x0,
5983 NULL, HFILL }
5985 { &hf_openflow_v4_table_feature_prop_length,
5986 { "Length", "openflow_v4.table_feature_prop.length",
5987 FT_UINT16, BASE_DEC, NULL, 0x0,
5988 NULL, HFILL }
5990 { &hf_openflow_v4_table_feature_prop_next_tables_next_table_id,
5991 { "Next table ID", "openflow_v4.table_feature_prop.next_tables.next_table_id",
5992 FT_UINT8, BASE_DEC, NULL, 0x0,
5993 NULL, HFILL }
5995 { &hf_openflow_v4_table_feature_prop_experimenter_experimenter,
5996 { "Experimenter", "openflow_v4.table_feature_prop.experimenter.experimenter",
5997 FT_UINT32, BASE_HEX, NULL, 0x0,
5998 NULL, HFILL }
6000 { &hf_openflow_v4_table_feature_prop_experimenter_exp_type,
6001 { "Experimenter type", "openflow_v4.table_feature_prop.experimenter.exp_type",
6002 FT_UINT32, BASE_DEC, NULL, 0x0,
6003 NULL, HFILL }
6005 { &hf_openflow_v4_table_feature_prop_pad,
6006 { "Pad", "openflow_v4.table_feature_prop.pad",
6007 FT_BYTES, BASE_NONE, NULL, 0x0,
6008 NULL, HFILL }
6010 { &hf_openflow_v4_table_features_length,
6011 { "Length", "openflow_v4.table_features.length",
6012 FT_UINT16, BASE_DEC, NULL, 0x0,
6013 NULL, HFILL }
6015 { &hf_openflow_v4_table_features_table_id,
6016 { "Table ID", "openflow_v4.table_features.table_id",
6017 FT_UINT8, BASE_DEC, NULL, 0x0,
6018 NULL, HFILL }
6020 { &hf_openflow_v4_table_features_pad,
6021 { "Pad", "openflow_v4.table_features.pad",
6022 FT_BYTES, BASE_NONE, NULL, 0x0,
6023 NULL, HFILL }
6025 { &hf_openflow_v4_table_features_name,
6026 { "Name", "openflow_v4.table_features.name",
6027 FT_STRING, BASE_NONE, NULL, 0x0,
6028 NULL, HFILL }
6030 { &hf_openflow_v4_table_features_metadata_match,
6031 { "Metadata match", "openflow_v4.table_features.metadata_match",
6032 FT_UINT64, BASE_HEX, NULL, 0x0,
6033 NULL, HFILL }
6035 { &hf_openflow_v4_table_features_metadata_write,
6036 { "Metadata write", "openflow_v4.table_features.metadata_write",
6037 FT_UINT64, BASE_HEX, NULL, 0x0,
6038 NULL, HFILL }
6040 { &hf_openflow_v4_table_features_config,
6041 { "Config", "openflow_v4.table_features.config",
6042 FT_BYTES, BASE_NONE, NULL, 0x0,
6043 NULL, HFILL }
6045 { &hf_openflow_v4_table_features_max_entries,
6046 { "Max entries", "openflow_v4.table_features.max_entries",
6047 FT_UINT32, BASE_DEC, NULL, 0x0,
6048 NULL, HFILL }
6050 { &hf_openflow_v4_port_stats_request_port_no,
6051 { "Port number", "openflow_v4.port_stats_request.port_no",
6052 FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_port_reserved_values), 0x0,
6053 NULL, HFILL }
6055 { &hf_openflow_v4_port_stats_request_pad,
6056 { "Pad", "openflow_v4.port_stats_request.pad",
6057 FT_BYTES, BASE_NONE, NULL, 0x0,
6058 NULL, HFILL }
6060 { &hf_openflow_v4_queue_stats_request_port_no,
6061 { "Port number", "openflow_v4.queue_stats_request.port_no",
6062 FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_port_reserved_values), 0x0,
6063 NULL, HFILL }
6065 { &hf_openflow_v4_queue_stats_request_queue_id,
6066 { "Queue ID", "openflow_v4.queue_stats_request.queue_id",
6067 FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_queue_reserved_values), 0x0,
6068 NULL, HFILL }
6070 { &hf_openflow_v4_group_stats_request_group_id,
6071 { "Group ID", "openflow_v4.group_stats_request.group_id",
6072 FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_group_reserved_values), 0x0,
6073 NULL, HFILL }
6075 { &hf_openflow_v4_group_stats_request_pad,
6076 { "Pad", "openflow_v4.group_stats_request.pad",
6077 FT_BYTES, BASE_NONE, NULL, 0x0,
6078 NULL, HFILL }
6080 { &hf_openflow_v4_meter_stats_request_meter_id,
6081 { "Meter ID", "openflow_v4.meter_stats_request.meter_id",
6082 FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_meter_id_reserved_values), 0x0,
6083 NULL, HFILL }
6085 { &hf_openflow_v4_meter_stats_request_pad,
6086 { "Pad", "openflow_v4.meter_stats_request.pad",
6087 FT_BYTES, BASE_NONE, NULL, 0x0,
6088 NULL, HFILL }
6090 { &hf_openflow_v4_meter_config_request_meter_id,
6091 { "Meter ID", "openflow_v4.meter_config_request.meter_id",
6092 FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_meter_id_reserved_values), 0x0,
6093 NULL, HFILL }
6095 { &hf_openflow_v4_meter_config_request_pad,
6096 { "Pad", "openflow_v4.meter_config_request.pad",
6097 FT_BYTES, BASE_NONE, NULL, 0x0,
6098 NULL, HFILL }
6100 { &hf_openflow_v4_multipart_request_type ,
6101 { "Type", "openflow_v4.multipart_request.type",
6102 FT_UINT16, BASE_DEC, VALS(openflow_v4_multipart_type_values), 0x0,
6103 NULL, HFILL }
6105 { &hf_openflow_v4_multipart_request_flags,
6106 { "Flags", "openflow_v4.multipart_request.flags",
6107 FT_UINT16, BASE_HEX, NULL, 0x0,
6108 NULL, HFILL }
6110 { &hf_openflow_v4_multipart_request_flags_more,
6111 { "OFPMPF_REQ_MORE", "openflow_v4.multipart_request.flags.more",
6112 FT_UINT16, BASE_HEX, NULL, OFPMPF_REQ_MORE,
6113 NULL, HFILL }
6115 { &hf_openflow_v4_multipart_request_pad,
6116 { "Pad", "openflow_v4.multipart_request.pad",
6117 FT_BYTES, BASE_NONE, NULL, 0x0,
6118 NULL, HFILL }
6120 { &hf_openflow_v4_multipart_request_experimenter_experimenter,
6121 { "Experimenter", "openflow_v4.multipart_request.experimenter.experimenter",
6122 FT_UINT32, BASE_HEX, NULL, 0x0,
6123 NULL, HFILL }
6125 { &hf_openflow_v4_multipart_request_experimenter_exp_type,
6126 { "Experimenter type", "openflow_v4.multipart_request.experimenter.exp_type",
6127 FT_UINT32, BASE_DEC, NULL, 0x0,
6128 NULL, HFILL }
6130 { &hf_openflow_v4_switch_description_mfr_desc,
6131 { "Manufacturer desc.", "openflow_v4.switch_description.mfr_desc",
6132 FT_STRING, BASE_NONE, NULL, 0x0,
6133 NULL, HFILL }
6135 { &hf_openflow_v4_switch_description_hw_desc,
6136 { "Hardware desc.", "openflow_v4.switch_description.hw_desc",
6137 FT_STRING, BASE_NONE, NULL, 0x0,
6138 NULL, HFILL }
6140 { &hf_openflow_v4_switch_description_sw_desc,
6141 { "Software desc.", "openflow_v4.switch_description.sw_desc",
6142 FT_STRING, BASE_NONE, NULL, 0x0,
6143 NULL, HFILL }
6145 { &hf_openflow_v4_switch_description_serial_num,
6146 { "Serial no.", "openflow_v4.switch_description.serial_num",
6147 FT_STRING, BASE_NONE, NULL, 0x0,
6148 NULL, HFILL }
6150 { &hf_openflow_v4_switch_description_dp_desc,
6151 { "Datapath desc.", "openflow_v4.switch_description.dp_desc",
6152 FT_STRING, BASE_NONE, NULL, 0x0,
6153 NULL, HFILL }
6155 { &hf_openflow_v4_flow_stats_length,
6156 { "Length", "openflow_v4.flow_stats.length",
6157 FT_UINT16, BASE_DEC, NULL, 0x0,
6158 NULL, HFILL }
6160 { &hf_openflow_v4_flow_stats_table_id,
6161 { "Table ID", "openflow_v4.flow_stats.table_id",
6162 FT_UINT8, BASE_DEC, NULL, 0x0,
6163 NULL, HFILL }
6165 { &hf_openflow_v4_flow_stats_pad,
6166 { "Pad", "openflow_v4.flow_stats.pad",
6167 FT_BYTES, BASE_NONE, NULL, 0x0,
6168 NULL, HFILL }
6170 { &hf_openflow_v4_flow_stats_duration_sec,
6171 { "Duration sec", "openflow_v4.flow_stats.duration_sec",
6172 FT_UINT32, BASE_DEC, NULL, 0x0,
6173 NULL, HFILL }
6175 { &hf_openflow_v4_flow_stats_duration_nsec,
6176 { "Duration nsec", "openflow_v4.flow_stats.duration_nsec",
6177 FT_UINT32, BASE_DEC, NULL, 0x0,
6178 NULL, HFILL }
6180 { &hf_openflow_v4_flow_stats_priority,
6181 { "Priority", "openflow_v4.flow_stats.priority",
6182 FT_UINT16, BASE_DEC, NULL, 0x0,
6183 NULL, HFILL }
6185 { &hf_openflow_v4_flow_stats_idle_timeout,
6186 { "Idle timeout", "openflow_v4.flow_stats.idle_timeout",
6187 FT_UINT16, BASE_DEC, NULL, 0x0,
6188 NULL, HFILL }
6190 { &hf_openflow_v4_flow_stats_hard_timeout,
6191 { "Hard timeout", "openflow_v4.flow_stats.hard_timeout",
6192 FT_UINT16, BASE_DEC, NULL, 0x0,
6193 NULL, HFILL }
6195 { &hf_openflow_v4_flow_stats_flags,
6196 { "Flags", "openflow_v4.flow_stats.flags",
6197 FT_UINT16, BASE_HEX, NULL, 0x0,
6198 NULL, HFILL }
6200 { &hf_openflow_v4_flow_stats_flags_send_flow_rem,
6201 { "Send flow removed", "openflow_v4.flow_stats.flags.send_flow_rem",
6202 FT_BOOLEAN, 16, NULL, OFPFF_SEND_FLOW_REM,
6203 NULL, HFILL }
6205 { &hf_openflow_v4_flow_stats_flags_check_overlap,
6206 { "Check overlap", "openflow_v4.flow_stats.flags.check_overlap",
6207 FT_BOOLEAN, 16, NULL, OFPFF_CHECK_OVERLAP,
6208 NULL, HFILL }
6210 { &hf_openflow_v4_flow_stats_flags_reset_counts,
6211 { "Reset counts", "openflow_v4.flow_stats.flags.reset_counts",
6212 FT_BOOLEAN, 16, NULL, OFPFF_RESET_COUNTS,
6213 NULL, HFILL }
6215 { &hf_openflow_v4_flow_stats_flags_no_packet_counts,
6216 { "Don't count packets", "openflow_v4.flow_stats.flags.no_packet_counts",
6217 FT_BOOLEAN, 16, NULL, OFPFF_NO_PKT_COUNTS,
6218 NULL, HFILL }
6220 { &hf_openflow_v4_flow_stats_flags_no_byte_counts,
6221 { "Don't count bytes", "openflow_v4.flow_stats.flags.no_byte_counts",
6222 FT_BOOLEAN, 16, NULL, OFPFF_NO_BYT_COUNTS,
6223 NULL, HFILL }
6225 { &hf_openflow_v4_flow_stats_pad2,
6226 { "Pad", "openflow_v4.flow_stats.pad2",
6227 FT_BYTES, BASE_NONE, NULL, 0x0,
6228 NULL, HFILL }
6230 { &hf_openflow_v4_flow_stats_cookie,
6231 { "Cookie", "openflow_v4.flow_stats.cookie",
6232 FT_UINT64, BASE_HEX, NULL, 0x0,
6233 NULL, HFILL }
6235 { &hf_openflow_v4_flow_stats_packet_count,
6236 { "Packet count", "openflow_v4.flow_stats.packet_count",
6237 FT_UINT64, BASE_DEC, NULL, 0x0,
6238 NULL, HFILL }
6240 { &hf_openflow_v4_flow_stats_byte_count,
6241 { "Byte count", "openflow_v4.flow_stats.byte_count",
6242 FT_UINT64, BASE_DEC, NULL, 0x0,
6243 NULL, HFILL }
6245 { &hf_openflow_v4_aggregate_stats_packet_count,
6246 { "Packet count", "openflow_v4.aggregate_stats.packet_count",
6247 FT_UINT64, BASE_DEC, NULL, 0x0,
6248 NULL, HFILL }
6250 { &hf_openflow_v4_aggregate_stats_byte_count,
6251 { "Byte count", "openflow_v4.aggregate_stats.byte_count",
6252 FT_UINT64, BASE_DEC, NULL, 0x0,
6253 NULL, HFILL }
6255 { &hf_openflow_v4_aggregate_stats_flow_count,
6256 { "Flow count", "openflow_v4.aggregate_stats.flow_count",
6257 FT_UINT64, BASE_DEC, NULL, 0x0,
6258 NULL, HFILL }
6260 { &hf_openflow_v4_aggregate_stats_pad,
6261 { "Pad", "openflow_v4.aggregate_stats.pad",
6262 FT_BYTES, BASE_NONE, NULL, 0x0,
6263 NULL, HFILL }
6265 { &hf_openflow_v4_table_stats_table_id,
6266 { "Table ID", "openflow_v4.table_stats.table_id",
6267 FT_UINT8, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_table_reserved_values), 0x0,
6268 NULL, HFILL }
6270 { &hf_openflow_v4_table_stats_pad,
6271 { "Pad", "openflow_v4.table_stats.pad",
6272 FT_BYTES, BASE_NONE, NULL, 0x0,
6273 NULL, HFILL }
6275 { &hf_openflow_v4_table_stats_active_count,
6276 { "Active count", "openflow_v4.table_stats.active_count",
6277 FT_UINT32, BASE_DEC, NULL, 0x0,
6278 NULL, HFILL }
6280 { &hf_openflow_v4_table_stats_lookup_count,
6281 { "Lookup count", "openflow_v4.table_stats.lookup_count",
6282 FT_UINT64, BASE_DEC, NULL, 0x0,
6283 NULL, HFILL }
6285 { &hf_openflow_v4_table_stats_match_count,
6286 { "Match count", "openflow_v4.table_stats.match_count",
6287 FT_UINT64, BASE_DEC, NULL, 0x0,
6288 NULL, HFILL }
6290 { &hf_openflow_v4_port_stats_port_no,
6291 { "Port number", "openflow_v4.port_stats.port_no",
6292 FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_port_reserved_values), 0x0,
6293 NULL, HFILL }
6295 { &hf_openflow_v4_port_stats_pad,
6296 { "Pad", "openflow_v4.port_stats.pad",
6297 FT_BYTES, BASE_NONE, NULL, 0x0,
6298 NULL, HFILL }
6300 { &hf_openflow_v4_port_stats_rx_packets,
6301 { "Rx packets", "openflow_v4.port_stats.rx_packets",
6302 FT_UINT64, BASE_DEC, NULL, 0x0,
6303 NULL, HFILL }
6305 { &hf_openflow_v4_port_stats_tx_packets,
6306 { "Tx packets", "openflow_v4.port_stats.tx_packets",
6307 FT_UINT64, BASE_DEC, NULL, 0x0,
6308 NULL, HFILL }
6310 { &hf_openflow_v4_port_stats_rx_bytes,
6311 { "Rx bytes", "openflow_v4.port_stats.rx_bytes",
6312 FT_UINT64, BASE_DEC, NULL, 0x0,
6313 NULL, HFILL }
6315 { &hf_openflow_v4_port_stats_tx_bytes,
6316 { "Tx bytes", "openflow_v4.port_stats.tx_bytes",
6317 FT_UINT64, BASE_DEC, NULL, 0x0,
6318 NULL, HFILL }
6320 { &hf_openflow_v4_port_stats_rx_dropped,
6321 { "Rx dropped", "openflow_v4.port_stats.rx_dropped",
6322 FT_UINT64, BASE_DEC, NULL, 0x0,
6323 NULL, HFILL }
6325 { &hf_openflow_v4_port_stats_tx_dropped,
6326 { "Tx dropped", "openflow_v4.port_stats.tx_dropped",
6327 FT_UINT64, BASE_DEC, NULL, 0x0,
6328 NULL, HFILL }
6330 { &hf_openflow_v4_port_stats_rx_errors,
6331 { "Rx errors", "openflow_v4.port_stats.rx_errors",
6332 FT_UINT64, BASE_DEC, NULL, 0x0,
6333 NULL, HFILL }
6335 { &hf_openflow_v4_port_stats_tx_errors,
6336 { "Tx errors", "openflow_v4.port_stats.tx_errors",
6337 FT_UINT64, BASE_DEC, NULL, 0x0,
6338 NULL, HFILL }
6340 { &hf_openflow_v4_port_stats_rx_frame_error,
6341 { "Rx frame errors", "openflow_v4.port_stats.rx_frame_error",
6342 FT_UINT64, BASE_DEC, NULL, 0x0,
6343 NULL, HFILL }
6345 { &hf_openflow_v4_port_stats_rx_over_error,
6346 { "Rx overrun errors", "openflow_v4.port_stats.rx_over_error",
6347 FT_UINT64, BASE_DEC, NULL, 0x0,
6348 NULL, HFILL }
6350 { &hf_openflow_v4_port_stats_rx_crc_error,
6351 { "Rx CRC errors", "openflow_v4.port_stats.rx_crc_error",
6352 FT_UINT64, BASE_DEC, NULL, 0x0,
6353 NULL, HFILL }
6355 { &hf_openflow_v4_port_stats_collisions,
6356 { "Collisions", "openflow_v4.port_stats.collisions",
6357 FT_UINT64, BASE_DEC, NULL, 0x0,
6358 NULL, HFILL }
6360 { &hf_openflow_v4_port_stats_duration_sec,
6361 { "Duration sec", "openflow_v4.port_stats.duration_sec",
6362 FT_UINT32, BASE_DEC, NULL, 0x0,
6363 NULL, HFILL }
6365 { &hf_openflow_v4_port_stats_duration_nsec,
6366 { "Duration nsec", "openflow_v4.port_stats.duration_nsec",
6367 FT_UINT32, BASE_DEC, NULL, 0x0,
6368 NULL, HFILL }
6370 { &hf_openflow_v4_queue_stats_port_no,
6371 { "Port number", "openflow_v4.queue_stats.port_no",
6372 FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_port_reserved_values), 0x0,
6373 NULL, HFILL }
6375 { &hf_openflow_v4_queue_stats_queue_id,
6376 { "Queue ID", "openflow_v4.queue_stats.queue_id",
6377 FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_queue_reserved_values), 0x0,
6378 NULL, HFILL }
6380 { &hf_openflow_v4_queue_stats_tx_bytes,
6381 { "Tx bytes", "openflow_v4.queue_stats.tx_bytes",
6382 FT_UINT64, BASE_DEC, NULL, 0x0,
6383 NULL, HFILL }
6385 { &hf_openflow_v4_queue_stats_tx_packets,
6386 { "Tx packets", "openflow_v4.quee_stats.tx_packets",
6387 FT_UINT64, BASE_DEC, NULL, 0x0,
6388 NULL, HFILL }
6390 { &hf_openflow_v4_queue_stats_tx_errors,
6391 { "Tx errors", "openflow_v4.port_stats.tx_errors",
6392 FT_UINT64, BASE_DEC, NULL, 0x0,
6393 NULL, HFILL }
6395 { &hf_openflow_v4_queue_stats_duration_sec,
6396 { "Duration sec", "openflow_v4.queue_stats.duration_sec",
6397 FT_UINT32, BASE_DEC, NULL, 0x0,
6398 NULL, HFILL }
6400 { &hf_openflow_v4_queue_stats_duration_nsec,
6401 { "Duration nsec", "openflow_v4.queue_stats.duration_nsec",
6402 FT_UINT32, BASE_DEC, NULL, 0x0,
6403 NULL, HFILL }
6405 { &hf_openflow_v4_bucket_counter_packet_count,
6406 { "Packet count", "openflow_v4.bucket_counter.packet_count",
6407 FT_UINT64, BASE_DEC, NULL, 0x0,
6408 NULL, HFILL }
6410 { &hf_openflow_v4_bucket_counter_byte_count,
6411 { "Byte count", "openflow_v4.bucket_counter.byte_count",
6412 FT_UINT64, BASE_DEC, NULL, 0x0,
6413 NULL, HFILL }
6415 { &hf_openflow_v4_group_stats_length,
6416 { "Length", "openflow_v4.group_stats.length",
6417 FT_UINT16, BASE_DEC, NULL, 0x0,
6418 NULL, HFILL }
6420 { &hf_openflow_v4_group_stats_pad,
6421 { "Pad", "openflow_v4.group_stats.pad",
6422 FT_BYTES, BASE_NONE, NULL, 0x0,
6423 NULL, HFILL }
6425 { &hf_openflow_v4_group_stats_group_id,
6426 { "Group ID", "openflow_v4.group_stats.group_id",
6427 FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_group_reserved_values), 0x0,
6428 NULL, HFILL }
6430 { &hf_openflow_v4_group_stats_ref_count,
6431 { "Ref. count", "openflow_v4.group_stats.ref_count",
6432 FT_UINT32, BASE_DEC, NULL, 0x0,
6433 NULL, HFILL }
6435 { &hf_openflow_v4_group_stats_pad2,
6436 { "Pad", "openflow_v4.group_stats.pad2",
6437 FT_BYTES, BASE_NONE, NULL, 0x0,
6438 NULL, HFILL }
6440 { &hf_openflow_v4_group_stats_packet_count,
6441 { "Packet count", "openflow_v4.group_stats.packet_count",
6442 FT_UINT64, BASE_DEC, NULL, 0x0,
6443 NULL, HFILL }
6445 { &hf_openflow_v4_group_stats_byte_count,
6446 { "Byte count", "openflow_v4.group_stats.byte_count",
6447 FT_UINT64, BASE_DEC, NULL, 0x0,
6448 NULL, HFILL }
6450 { &hf_openflow_v4_group_desc_length,
6451 { "Length", "openflow_v4.group_desc.length",
6452 FT_UINT16, BASE_DEC, NULL, 0x0,
6453 NULL, HFILL }
6455 { &hf_openflow_v4_group_desc_type,
6456 { "Type", "openflow_v4.group_desc.type",
6457 FT_UINT8, BASE_DEC, VALS(openflow_v4_group_type_values), 0x0,
6458 NULL, HFILL }
6460 { &hf_openflow_v4_group_desc_pad,
6461 { "Pad", "openflow_v4.group_desc.pad2",
6462 FT_BYTES, BASE_NONE, NULL, 0x0,
6463 NULL, HFILL }
6465 { &hf_openflow_v4_group_desc_group_id,
6466 { "Group ID", "openflow_v4.group_desc.group_id",
6467 FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_group_reserved_values), 0x0,
6468 NULL, HFILL }
6470 { &hf_openflow_v4_group_features_types,
6471 { "Types", "openflow_v4.group_features.types",
6472 FT_UINT32, BASE_HEX, NULL, 0x0,
6473 NULL, HFILL }
6475 { &hf_openflow_v4_group_features_types_all,
6476 { "OFPGT_ALL", "openflow_v4.group_features.types.all",
6477 FT_BOOLEAN, 32, NULL, 1 << OFPGT_ALL,
6478 NULL, HFILL }
6480 { &hf_openflow_v4_group_features_types_select,
6481 { "OFPGT_SELECT", "openflow_v4.group_features.types.select",
6482 FT_BOOLEAN, 32, NULL, 1 << OFPGT_SELECT,
6483 NULL, HFILL }
6485 { &hf_openflow_v4_group_features_types_indirect,
6486 { "OFPGT_INDIRECT", "openflow_v4.group_features.types.indirect",
6487 FT_BOOLEAN, 32, NULL, 1 << OFPGT_INDIRECT,
6488 NULL, HFILL }
6490 { &hf_openflow_v4_group_features_types_ff,
6491 { "OFPGT_FF", "openflow_v4.group_features.types.ff",
6492 FT_BOOLEAN, 32, NULL, 1 << OFPGT_FF,
6493 NULL, HFILL }
6495 { &hf_openflow_v4_group_features_capabilities,
6496 { "Capabilities", "openflow_v4.group_features.capabilities",
6497 FT_UINT32, BASE_HEX, NULL, 0x0,
6498 NULL, HFILL }
6500 { &hf_openflow_v4_group_features_capabilities_select_weight,
6501 { "OFPGFC_SELECT_WEIGHT", "openflow_v4.group_features.capabilities.select_weight",
6502 FT_BOOLEAN, 32, NULL, OFPGFC_SELECT_WEIGHT,
6503 NULL, HFILL }
6505 { &hf_openflow_v4_group_features_capabilities_select_liveness,
6506 { "OFPGFC_SELECT_LIVENESS", "openflow_v4.group_features.capabilities.select_liveness",
6507 FT_BOOLEAN, 32, NULL, OFPGFC_SELECT_LIVENESS,
6508 NULL, HFILL }
6510 { &hf_openflow_v4_group_features_capabilities_chaining,
6511 { "OFPGFC_CHAINING", "openflow_v4.group_features.capabilities.chaining",
6512 FT_BOOLEAN, 32, NULL, OFPGFC_CHAINING,
6513 NULL, HFILL }
6515 { &hf_openflow_v4_group_features_capabilities_chaining_checks,
6516 { "OFPGFC_CHAINING_CHECKS", "openflow_v4.group_features.capabilities.chaining_checks",
6517 FT_BOOLEAN, 32, NULL, OFPGFC_CHAINING_CHECKS,
6518 NULL, HFILL }
6520 { &hf_openflow_v4_group_features_max_groups_all,
6521 { "Max groups (all)", "openflow_v4.group_stats.max_groups.all",
6522 FT_UINT32, BASE_DEC, NULL, 0x0,
6523 NULL, HFILL }
6525 { &hf_openflow_v4_group_features_max_groups_select,
6526 { "Max groups (select)", "openflow_v4.group_stats.max_groups.select",
6527 FT_UINT32, BASE_DEC, NULL, 0x0,
6528 NULL, HFILL }
6530 { &hf_openflow_v4_group_features_max_groups_indirect,
6531 { "Max groups (indirect)", "openflow_v4.group_stats.max_groups.indirect",
6532 FT_UINT32, BASE_DEC, NULL, 0x0,
6533 NULL, HFILL }
6535 { &hf_openflow_v4_group_features_max_groups_ff,
6536 { "Max groups (ff)", "openflow_v4.group_stats.max_groups.ff",
6537 FT_UINT32, BASE_DEC, NULL, 0x0,
6538 NULL, HFILL }
6540 { &hf_openflow_v4_group_features_actions_all,
6541 { "Actions (all)", "openflow_v4.group_features.actions.all",
6542 FT_UINT32, BASE_HEX, NULL, 0x0,
6543 NULL, HFILL }
6545 { &hf_openflow_v4_group_features_actions_all_output,
6546 { "OFPAT_OUTPUT", "openflow_v4.group_features.actions.all.output",
6547 FT_BOOLEAN, 32, NULL, 1 << OFPAT_OUTPUT,
6548 NULL, HFILL }
6550 { &hf_openflow_v4_group_features_actions_all_copy_ttl_out,
6551 { "OFPAT_COPY_TTL_OUT", "openflow_v4.group_features.actions.all.copy_ttl_out",
6552 FT_BOOLEAN, 32, NULL, 1 << OFPAT_COPY_TTL_OUT,
6553 NULL, HFILL }
6555 { &hf_openflow_v4_group_features_actions_all_copy_ttl_in,
6556 { "OFPAT_COPY_TTL_IN", "openflow_v4.group_features.actions.all.copy_ttl_in",
6557 FT_BOOLEAN, 32, NULL, 1 << OFPAT_COPY_TTL_IN,
6558 NULL, HFILL }
6560 { &hf_openflow_v4_group_features_actions_all_set_mpls_ttl,
6561 { "OFPAT_SET_MPLS_TTL", "openflow_v4.group_features.actions.all.set_mpls_ttl",
6562 FT_BOOLEAN, 32, NULL, 1 << OFPAT_SET_MPLS_TTL,
6563 NULL, HFILL }
6565 { &hf_openflow_v4_group_features_actions_all_dec_mpls_ttl,
6566 { "OFPAT_DEC_MPLS_TTL", "openflow_v4.group_features.actions.all.dec_mpls_ttl",
6567 FT_BOOLEAN, 32, NULL, 1 << OFPAT_DEC_MPLS_TTL,
6568 NULL, HFILL }
6570 { &hf_openflow_v4_group_features_actions_all_push_vlan,
6571 { "OFPAT_PUSH_VLAN", "openflow_v4.group_features.actions.all.push_vlan",
6572 FT_BOOLEAN, 32, NULL, 1 << OFPAT_PUSH_VLAN,
6573 NULL, HFILL }
6575 { &hf_openflow_v4_group_features_actions_all_pop_vlan,
6576 { "OFPAT_POP_VLAN", "openflow_v4.group_features.actions.all.pop_vlan",
6577 FT_BOOLEAN, 32, NULL, 1 << OFPAT_POP_VLAN,
6578 NULL, HFILL }
6580 { &hf_openflow_v4_group_features_actions_all_push_mpls,
6581 { "OFPAT_PUSH_MPLS", "openflow_v4.group_features.actions.all.push_mpls",
6582 FT_BOOLEAN, 32, NULL, 1 << OFPAT_PUSH_MPLS,
6583 NULL, HFILL }
6585 { &hf_openflow_v4_group_features_actions_all_pop_mpls,
6586 { "OFPAT_POP_MPLS", "openflow_v4.group_features.actions.all.pop_mpls",
6587 FT_BOOLEAN, 32, NULL, 1 << OFPAT_POP_MPLS,
6588 NULL, HFILL }
6590 { &hf_openflow_v4_group_features_actions_all_set_queue,
6591 { "OFPAT_SET_QUEUE", "openflow_v4.group_features.actions.all.set_queue",
6592 FT_BOOLEAN, 32, NULL, 1 << OFPAT_SET_QUEUE,
6593 NULL, HFILL }
6595 { &hf_openflow_v4_group_features_actions_all_group,
6596 { "OFPAT_GROUP", "openflow_v4.group_features.actions.all.group",
6597 FT_BOOLEAN, 32, NULL, 1 << OFPAT_GROUP,
6598 NULL, HFILL }
6600 { &hf_openflow_v4_group_features_actions_all_set_nw_ttl,
6601 { "OFPAT_SET_NW_TTL", "openflow_v4.group_features.actions.all.set_nw_ttl",
6602 FT_BOOLEAN, 32, NULL, 1 << OFPAT_SET_NW_TTL,
6603 NULL, HFILL }
6605 { &hf_openflow_v4_group_features_actions_all_dec_nw_ttl,
6606 { "OFPAT_DEC_NW_TTL", "openflow_v4.group_features.actions.all.dec_nw_ttl",
6607 FT_BOOLEAN, 32, NULL, 1 << OFPAT_DEC_NW_TTL,
6608 NULL, HFILL }
6610 { &hf_openflow_v4_group_features_actions_all_set_field,
6611 { "OFPAT_SET_FIELD", "openflow_v4.group_features.actions.all.set_field",
6612 FT_BOOLEAN, 32, NULL, 1 << OFPAT_SET_FIELD,
6613 NULL, HFILL }
6615 { &hf_openflow_v4_group_features_actions_all_push_pbb,
6616 { "OFPAT_PUSH_PBB", "openflow_v4.group_features.actions.all.push_pbb",
6617 FT_BOOLEAN, 32, NULL, 1 << OFPAT_PUSH_PBB,
6618 NULL, HFILL }
6620 { &hf_openflow_v4_group_features_actions_all_pop_pbb,
6621 { "OFPAT_POP_PBB", "openflow_v4.group_features.actions.all.pop_pbb",
6622 FT_BOOLEAN, 32, NULL, 1 << OFPAT_POP_PBB,
6623 NULL, HFILL }
6625 { &hf_openflow_v4_group_features_actions_select,
6626 { "Actions (select)", "openflow_v4.group_features.actions.select",
6627 FT_UINT32, BASE_HEX, NULL, 0x0,
6628 NULL, HFILL }
6630 { &hf_openflow_v4_group_features_actions_select_output,
6631 { "OFPAT_OUTPUT", "openflow_v4.group_features.actions.select.output",
6632 FT_BOOLEAN, 32, NULL, 1 << OFPAT_OUTPUT,
6633 NULL, HFILL }
6635 { &hf_openflow_v4_group_features_actions_select_copy_ttl_out,
6636 { "OFPAT_COPY_TTL_OUT", "openflow_v4.group_features.actions.select.copy_ttl_out",
6637 FT_BOOLEAN, 32, NULL, 1 << OFPAT_COPY_TTL_OUT,
6638 NULL, HFILL }
6640 { &hf_openflow_v4_group_features_actions_select_copy_ttl_in,
6641 { "OFPAT_COPY_TTL_IN", "openflow_v4.group_features.actions.select.copy_ttl_in",
6642 FT_BOOLEAN, 32, NULL, 1 << OFPAT_COPY_TTL_IN,
6643 NULL, HFILL }
6645 { &hf_openflow_v4_group_features_actions_select_set_mpls_ttl,
6646 { "OFPAT_SET_MPLS_TTL", "openflow_v4.group_features.actions.select.set_mpls_ttl",
6647 FT_BOOLEAN, 32, NULL, 1 << OFPAT_SET_MPLS_TTL,
6648 NULL, HFILL }
6650 { &hf_openflow_v4_group_features_actions_select_dec_mpls_ttl,
6651 { "OFPAT_DEC_MPLS_TTL", "openflow_v4.group_features.actions.select.dec_mpls_ttl",
6652 FT_BOOLEAN, 32, NULL, 1 << OFPAT_DEC_MPLS_TTL,
6653 NULL, HFILL }
6655 { &hf_openflow_v4_group_features_actions_select_push_vlan,
6656 { "OFPAT_PUSH_VLAN", "openflow_v4.group_features.actions.select.push_vlan",
6657 FT_BOOLEAN, 32, NULL, 1 << OFPAT_PUSH_VLAN,
6658 NULL, HFILL }
6660 { &hf_openflow_v4_group_features_actions_select_pop_vlan,
6661 { "OFPAT_POP_VLAN", "openflow_v4.group_features.actions.select.pop_vlan",
6662 FT_BOOLEAN, 32, NULL, 1 << OFPAT_POP_VLAN,
6663 NULL, HFILL }
6665 { &hf_openflow_v4_group_features_actions_select_push_mpls,
6666 { "OFPAT_PUSH_MPLS", "openflow_v4.group_features.actions.select.push_mpls",
6667 FT_BOOLEAN, 32, NULL, 1 << OFPAT_PUSH_MPLS,
6668 NULL, HFILL }
6670 { &hf_openflow_v4_group_features_actions_select_pop_mpls,
6671 { "OFPAT_POP_MPLS", "openflow_v4.group_features.actions.select.pop_mpls",
6672 FT_BOOLEAN, 32, NULL, 1 << OFPAT_POP_MPLS,
6673 NULL, HFILL }
6675 { &hf_openflow_v4_group_features_actions_select_set_queue,
6676 { "OFPAT_SET_QUEUE", "openflow_v4.group_features.actions.select.set_queue",
6677 FT_BOOLEAN, 32, NULL, 1 << OFPAT_SET_QUEUE,
6678 NULL, HFILL }
6680 { &hf_openflow_v4_group_features_actions_select_group,
6681 { "OFPAT_GROUP", "openflow_v4.group_features.actions.select.group",
6682 FT_BOOLEAN, 32, NULL, 1 << OFPAT_GROUP,
6683 NULL, HFILL }
6685 { &hf_openflow_v4_group_features_actions_select_set_nw_ttl,
6686 { "OFPAT_SET_NW_TTL", "openflow_v4.group_features.actions.select.set_nw_ttl",
6687 FT_BOOLEAN, 32, NULL, 1 << OFPAT_SET_NW_TTL,
6688 NULL, HFILL }
6690 { &hf_openflow_v4_group_features_actions_select_dec_nw_ttl,
6691 { "OFPAT_DEC_NW_TTL", "openflow_v4.group_features.actions.select.dec_nw_ttl",
6692 FT_BOOLEAN, 32, NULL, 1 << OFPAT_DEC_NW_TTL,
6693 NULL, HFILL }
6695 { &hf_openflow_v4_group_features_actions_select_set_field,
6696 { "OFPAT_SET_FIELD", "openflow_v4.group_features.actions.select.set_field",
6697 FT_BOOLEAN, 32, NULL, 1 << OFPAT_SET_FIELD,
6698 NULL, HFILL }
6700 { &hf_openflow_v4_group_features_actions_select_push_pbb,
6701 { "OFPAT_PUSH_PBB", "openflow_v4.group_features.actions.select.push_pbb",
6702 FT_BOOLEAN, 32, NULL, 1 << OFPAT_PUSH_PBB,
6703 NULL, HFILL }
6705 { &hf_openflow_v4_group_features_actions_select_pop_pbb,
6706 { "OFPAT_POP_PBB", "openflow_v4.group_features.actions.select.pop_pbb",
6707 FT_BOOLEAN, 32, NULL, 1 << OFPAT_POP_PBB,
6708 NULL, HFILL }
6710 { &hf_openflow_v4_group_features_actions_indirect,
6711 { "Actions (indirect)", "openflow_v4.group_features.actions.indirect",
6712 FT_UINT32, BASE_HEX, NULL, 0x0,
6713 NULL, HFILL }
6715 { &hf_openflow_v4_group_features_actions_indirect_output,
6716 { "OFPAT_OUTPUT", "openflow_v4.group_features.actions.indirect.output",
6717 FT_BOOLEAN, 32, NULL, 1 << OFPAT_OUTPUT,
6718 NULL, HFILL }
6720 { &hf_openflow_v4_group_features_actions_indirect_copy_ttl_out,
6721 { "OFPAT_COPY_TTL_OUT", "openflow_v4.group_features.actions.indirect.copy_ttl_out",
6722 FT_BOOLEAN, 32, NULL, 1 << OFPAT_COPY_TTL_OUT,
6723 NULL, HFILL }
6725 { &hf_openflow_v4_group_features_actions_indirect_copy_ttl_in,
6726 { "OFPAT_COPY_TTL_IN", "openflow_v4.group_features.actions.indirect.copy_ttl_in",
6727 FT_BOOLEAN, 32, NULL, 1 << OFPAT_COPY_TTL_IN,
6728 NULL, HFILL }
6730 { &hf_openflow_v4_group_features_actions_indirect_set_mpls_ttl,
6731 { "OFPAT_SET_MPLS_TTL", "openflow_v4.group_features.actions.indirect.set_mpls_ttl",
6732 FT_BOOLEAN, 32, NULL, 1 << OFPAT_SET_MPLS_TTL,
6733 NULL, HFILL }
6735 { &hf_openflow_v4_group_features_actions_indirect_dec_mpls_ttl,
6736 { "OFPAT_DEC_MPLS_TTL", "openflow_v4.group_features.actions.indirect.dec_mpls_ttl",
6737 FT_BOOLEAN, 32, NULL, 1 << OFPAT_DEC_MPLS_TTL,
6738 NULL, HFILL }
6740 { &hf_openflow_v4_group_features_actions_indirect_push_vlan,
6741 { "OFPAT_PUSH_VLAN", "openflow_v4.group_features.actions.indirect.push_vlan",
6742 FT_BOOLEAN, 32, NULL, 1 << OFPAT_PUSH_VLAN,
6743 NULL, HFILL }
6745 { &hf_openflow_v4_group_features_actions_indirect_pop_vlan,
6746 { "OFPAT_POP_VLAN", "openflow_v4.group_features.actions.indirect.pop_vlan",
6747 FT_BOOLEAN, 32, NULL, 1 << OFPAT_POP_VLAN,
6748 NULL, HFILL }
6750 { &hf_openflow_v4_group_features_actions_indirect_push_mpls,
6751 { "OFPAT_PUSH_MPLS", "openflow_v4.group_features.actions.indirect.push_mpls",
6752 FT_BOOLEAN, 32, NULL, 1 << OFPAT_PUSH_MPLS,
6753 NULL, HFILL }
6755 { &hf_openflow_v4_group_features_actions_indirect_pop_mpls,
6756 { "OFPAT_POP_MPLS", "openflow_v4.group_features.actions.indirect.pop_mpls",
6757 FT_BOOLEAN, 32, NULL, 1 << OFPAT_POP_MPLS,
6758 NULL, HFILL }
6760 { &hf_openflow_v4_group_features_actions_indirect_set_queue,
6761 { "OFPAT_SET_QUEUE", "openflow_v4.group_features.actions.indirect.set_queue",
6762 FT_BOOLEAN, 32, NULL, 1 << OFPAT_SET_QUEUE,
6763 NULL, HFILL }
6765 { &hf_openflow_v4_group_features_actions_indirect_group,
6766 { "OFPAT_GROUP", "openflow_v4.group_features.actions.indirect.group",
6767 FT_BOOLEAN, 32, NULL, 1 << OFPAT_GROUP,
6768 NULL, HFILL }
6770 { &hf_openflow_v4_group_features_actions_indirect_set_nw_ttl,
6771 { "OFPAT_SET_NW_TTL", "openflow_v4.group_features.actions.indirect.set_nw_ttl",
6772 FT_BOOLEAN, 32, NULL, 1 << OFPAT_SET_NW_TTL,
6773 NULL, HFILL }
6775 { &hf_openflow_v4_group_features_actions_indirect_dec_nw_ttl,
6776 { "OFPAT_DEC_NW_TTL", "openflow_v4.group_features.actions.indirect.dec_nw_ttl",
6777 FT_BOOLEAN, 32, NULL, 1 << OFPAT_DEC_NW_TTL,
6778 NULL, HFILL }
6780 { &hf_openflow_v4_group_features_actions_indirect_set_field,
6781 { "OFPAT_SET_FIELD", "openflow_v4.group_features.actions.indirect.set_field",
6782 FT_BOOLEAN, 32, NULL, 1 << OFPAT_SET_FIELD,
6783 NULL, HFILL }
6785 { &hf_openflow_v4_group_features_actions_indirect_push_pbb,
6786 { "OFPAT_PUSH_PBB", "openflow_v4.group_features.actions.indirect.push_pbb",
6787 FT_BOOLEAN, 32, NULL, 1 << OFPAT_PUSH_PBB,
6788 NULL, HFILL }
6790 { &hf_openflow_v4_group_features_actions_indirect_pop_pbb,
6791 { "OFPAT_POP_PBB", "openflow_v4.group_features.actions.indirect.pop_pbb",
6792 FT_BOOLEAN, 32, NULL, 1 << OFPAT_POP_PBB,
6793 NULL, HFILL }
6795 { &hf_openflow_v4_group_features_actions_ff,
6796 { "Actions (ff)", "openflow_v4.group_features.actions.ff",
6797 FT_UINT32, BASE_HEX, NULL, 0x0,
6798 NULL, HFILL }
6800 { &hf_openflow_v4_group_features_actions_ff_output,
6801 { "OFPAT_OUTPUT", "openflow_v4.group_features.actions.ff.output",
6802 FT_BOOLEAN, 32, NULL, 1 << OFPAT_OUTPUT,
6803 NULL, HFILL }
6805 { &hf_openflow_v4_group_features_actions_ff_copy_ttl_out,
6806 { "OFPAT_COPY_TTL_OUT", "openflow_v4.group_features.actions.ff.copy_ttl_out",
6807 FT_BOOLEAN, 32, NULL, 1 << OFPAT_COPY_TTL_OUT,
6808 NULL, HFILL }
6810 { &hf_openflow_v4_group_features_actions_ff_copy_ttl_in,
6811 { "OFPAT_COPY_TTL_IN", "openflow_v4.group_features.actions.ff.copy_ttl_in",
6812 FT_BOOLEAN, 32, NULL, 1 << OFPAT_COPY_TTL_IN,
6813 NULL, HFILL }
6815 { &hf_openflow_v4_group_features_actions_ff_set_mpls_ttl,
6816 { "OFPAT_SET_MPLS_TTL", "openflow_v4.group_features.actions.ff.set_mpls_ttl",
6817 FT_BOOLEAN, 32, NULL, 1 << OFPAT_SET_MPLS_TTL,
6818 NULL, HFILL }
6820 { &hf_openflow_v4_group_features_actions_ff_dec_mpls_ttl,
6821 { "OFPAT_DEC_MPLS_TTL", "openflow_v4.group_features.actions.ff.dec_mpls_ttl",
6822 FT_BOOLEAN, 32, NULL, 1 << OFPAT_DEC_MPLS_TTL,
6823 NULL, HFILL }
6825 { &hf_openflow_v4_group_features_actions_ff_push_vlan,
6826 { "OFPAT_PUSH_VLAN", "openflow_v4.group_features.actions.ff.push_vlan",
6827 FT_BOOLEAN, 32, NULL, 1 << OFPAT_PUSH_VLAN,
6828 NULL, HFILL }
6830 { &hf_openflow_v4_group_features_actions_ff_pop_vlan,
6831 { "OFPAT_POP_VLAN", "openflow_v4.group_features.actions.ff.pop_vlan",
6832 FT_BOOLEAN, 32, NULL, 1 << OFPAT_POP_VLAN,
6833 NULL, HFILL }
6835 { &hf_openflow_v4_group_features_actions_ff_push_mpls,
6836 { "OFPAT_PUSH_MPLS", "openflow_v4.group_features.actions.ff.push_mpls",
6837 FT_BOOLEAN, 32, NULL, 1 << OFPAT_PUSH_MPLS,
6838 NULL, HFILL }
6840 { &hf_openflow_v4_group_features_actions_ff_pop_mpls,
6841 { "OFPAT_POP_MPLS", "openflow_v4.group_features.actions.ff.pop_mpls",
6842 FT_BOOLEAN, 32, NULL, 1 << OFPAT_POP_MPLS,
6843 NULL, HFILL }
6845 { &hf_openflow_v4_group_features_actions_ff_set_queue,
6846 { "OFPAT_SET_QUEUE", "openflow_v4.group_features.actions.ff.set_queue",
6847 FT_BOOLEAN, 32, NULL, 1 << OFPAT_SET_QUEUE,
6848 NULL, HFILL }
6850 { &hf_openflow_v4_group_features_actions_ff_group,
6851 { "OFPAT_GROUP", "openflow_v4.group_features.actions.ff.group",
6852 FT_BOOLEAN, 32, NULL, 1 << OFPAT_GROUP,
6853 NULL, HFILL }
6855 { &hf_openflow_v4_group_features_actions_ff_set_nw_ttl,
6856 { "OFPAT_SET_NW_TTL", "openflow_v4.group_features.actions.ff.set_nw_ttl",
6857 FT_BOOLEAN, 32, NULL, 1 << OFPAT_SET_NW_TTL,
6858 NULL, HFILL }
6860 { &hf_openflow_v4_group_features_actions_ff_dec_nw_ttl,
6861 { "OFPAT_DEC_NW_TTL", "openflow_v4.group_features.actions.ff.dec_nw_ttl",
6862 FT_BOOLEAN, 32, NULL, 1 << OFPAT_DEC_NW_TTL,
6863 NULL, HFILL }
6865 { &hf_openflow_v4_group_features_actions_ff_set_field,
6866 { "OFPAT_SET_FIELD", "openflow_v4.group_features.actions.ff.set_field",
6867 FT_BOOLEAN, 32, NULL, 1 << OFPAT_SET_FIELD,
6868 NULL, HFILL }
6870 { &hf_openflow_v4_group_features_actions_ff_push_pbb,
6871 { "OFPAT_PUSH_PBB", "openflow_v4.group_features.actions.ff.push_pbb",
6872 FT_BOOLEAN, 32, NULL, 1 << OFPAT_PUSH_PBB,
6873 NULL, HFILL }
6875 { &hf_openflow_v4_group_features_actions_ff_pop_pbb,
6876 { "OFPAT_POP_PBB", "openflow_v4.group_features.actions.ff.pop_pbb",
6877 FT_BOOLEAN, 32, NULL, 1 << OFPAT_POP_PBB,
6878 NULL, HFILL }
6880 { &hf_openflow_v4_meter_band_stats_packet_band_count,
6881 { "Packet count", "openflow_v4.meter_band_stats.packet_band_count",
6882 FT_UINT64, BASE_DEC, NULL, 0x0,
6883 NULL, HFILL }
6885 { &hf_openflow_v4_meter_band_stats_byte_band_count,
6886 { "Byte count", "openflow_v4.meter_band_stats.byte_band_count",
6887 FT_UINT64, BASE_DEC, NULL, 0x0,
6888 NULL, HFILL }
6890 { &hf_openflow_v4_meter_stats_meter_id,
6891 { "Meter ID", "openflow_v4.meter_stats.meter_id",
6892 FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_meter_id_reserved_values), 0x0,
6893 NULL, HFILL }
6895 { &hf_openflow_v4_meter_stats_len,
6896 { "Length", "openflow_v4.meter_stats.length",
6897 FT_UINT16, BASE_DEC, NULL, 0x0,
6898 NULL, HFILL }
6900 { &hf_openflow_v4_meter_stats_pad,
6901 { "Pad", "openflow_v4.meter_stats.pad",
6902 FT_BYTES, BASE_NONE, NULL, 0x0,
6903 NULL, HFILL }
6905 { &hf_openflow_v4_meter_stats_flow_count,
6906 { "Flow count", "openflow_v4.meter_stats.flow_count",
6907 FT_UINT32, BASE_DEC, NULL, 0x0,
6908 NULL, HFILL }
6910 { &hf_openflow_v4_meter_stats_packet_in_count,
6911 { "Packet in count", "openflow_v4.meter_stats.packet_in_count",
6912 FT_UINT64, BASE_DEC, NULL, 0x0,
6913 NULL, HFILL }
6915 { &hf_openflow_v4_meter_stats_byte_in_count,
6916 { "Byte in count", "openflow_v4.meter_stats.byte_in_count",
6917 FT_UINT64, BASE_DEC, NULL, 0x0,
6918 NULL, HFILL }
6920 { &hf_openflow_v4_meter_stats_duration_sec,
6921 { "Duration sec", "openflow_v4.meter_stats.duration_sec",
6922 FT_UINT32, BASE_DEC, NULL, 0x0,
6923 NULL, HFILL }
6925 { &hf_openflow_v4_meter_stats_duration_nsec,
6926 { "Duration nsec", "openflow_v4.meter_stats.duration_nsec",
6927 FT_UINT32, BASE_DEC, NULL, 0x0,
6928 NULL, HFILL }
6930 { &hf_openflow_v4_meter_config_len,
6931 { "Length", "openflow_v4.meter_config.len",
6932 FT_UINT16, BASE_DEC, NULL, 0x0,
6933 NULL, HFILL }
6935 { &hf_openflow_v4_meter_config_flags,
6936 { "Flags", "openflow_v4.meter_config.flags",
6937 FT_UINT32, BASE_HEX, NULL, 0x0,
6938 NULL, HFILL }
6940 { &hf_openflow_v4_meter_config_flags_kbps,
6941 { "OFPMF_KBPS", "openflow_v4.meter_config.flags.kbps",
6942 FT_BOOLEAN, 32, NULL, OFPMF_KBPS,
6943 NULL, HFILL }
6945 { &hf_openflow_v4_meter_config_flags_pktps,
6946 { "OFPMF_PKTPS", "openflow_v4.meter_config.flags.ptkps",
6947 FT_BOOLEAN, 32, NULL, OFPMF_PKTPS,
6948 NULL, HFILL }
6950 { &hf_openflow_v4_meter_config_flags_burst,
6951 { "OFPMF_BURST", "openflow_v4.meter_config.flags.burst",
6952 FT_BOOLEAN, 32, NULL, OFPMF_BURST,
6953 NULL, HFILL }
6955 { &hf_openflow_v4_meter_config_flags_stats,
6956 { "OFPMF_STATS", "openflow_v4.meter_config.flags.stats",
6957 FT_BOOLEAN, 32, NULL, OFPMF_STATS,
6958 NULL, HFILL }
6960 { &hf_openflow_v4_meter_config_meter_id,
6961 { "Meter ID", "openflow_v4.meter_config.meter_id",
6962 FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_meter_id_reserved_values), 0x0,
6963 NULL, HFILL }
6965 { &hf_openflow_v4_meter_features_max_meter,
6966 { "Max meters", "openflow_v4.meter_features.max_meter",
6967 FT_UINT32, BASE_DEC, NULL, 0x0,
6968 NULL, HFILL }
6970 { &hf_openflow_v4_meter_features_band_types,
6971 { "Band types", "openflow_v4.features.band_types",
6972 FT_UINT32, BASE_HEX, NULL, 0x0,
6973 NULL, HFILL }
6975 { &hf_openflow_v4_meter_features_band_types_drop,
6976 { "OFPMBT_DROP", "openflow_v4.meter_features.band_types.drop",
6977 FT_BOOLEAN, 32, NULL, 1 << OFPMBT_DROP,
6978 NULL, HFILL }
6980 { &hf_openflow_v4_meter_features_band_types_dscp_remark,
6981 { "OFPMBT_DSCP_REMARK", "openflow_v4.meter_features.band_types.dscp_remark",
6982 FT_BOOLEAN, 32, NULL, 1 << OFPMBT_DSCP_REMARK,
6983 NULL, HFILL }
6985 { &hf_openflow_v4_meter_features_capabilities,
6986 { "Capabilities", "openflow_v4.meter_features.capabilities",
6987 FT_UINT32, BASE_HEX, NULL, 0x0,
6988 NULL, HFILL }
6990 { &hf_openflow_v4_meter_features_capabilities_kbps,
6991 { "OFPMF_KBPS", "openflow_v4.meter_features.capabilities.kbps",
6992 FT_BOOLEAN, 32, NULL, OFPMF_KBPS,
6993 NULL, HFILL }
6995 { &hf_openflow_v4_meter_features_capabilities_pktps,
6996 { "OFPMF_PKTPS", "openflow_v4.meter_features.capabilities.ptkps",
6997 FT_BOOLEAN, 32, NULL, OFPMF_PKTPS,
6998 NULL, HFILL }
7000 { &hf_openflow_v4_meter_features_capabilities_burst,
7001 { "OFPMF_BURST", "openflow_v4.meter_features.capabilities.burst",
7002 FT_BOOLEAN, 32, NULL, OFPMF_BURST,
7003 NULL, HFILL }
7005 { &hf_openflow_v4_meter_features_capabilities_stats,
7006 { "OFPMF_STATS", "openflow_v4.meter_features.capabilities.stats",
7007 FT_BOOLEAN, 32, NULL, OFPMF_STATS,
7008 NULL, HFILL }
7010 { &hf_openflow_v4_meter_features_max_bands,
7011 { "Max bands", "openflow_v4.meter_features.max_bands",
7012 FT_UINT8, BASE_DEC, NULL, 0x0,
7013 NULL, HFILL }
7015 { &hf_openflow_v4_meter_features_max_color,
7016 { "Max colors", "openflow_v4.meter_features.max_color",
7017 FT_UINT8, BASE_DEC, NULL, 0x0,
7018 NULL, HFILL }
7020 { &hf_openflow_v4_meter_features_pad,
7021 { "Pad", "openflow_v4.meter_features.pad",
7022 FT_BYTES, BASE_NONE, NULL, 0x0,
7023 NULL, HFILL }
7025 { &hf_openflow_v4_multipart_reply_type ,
7026 { "Type", "openflow_v4.multipart_reply.type",
7027 FT_UINT16, BASE_DEC, VALS(openflow_v4_multipart_type_values), 0x0,
7028 NULL, HFILL }
7030 { &hf_openflow_v4_multipart_reply_flags,
7031 { "Flags", "openflow_v4.multipart_reply.flags",
7032 FT_UINT16, BASE_HEX, NULL, 0x0,
7033 NULL, HFILL }
7035 { &hf_openflow_v4_multipart_reply_flags_more,
7036 { "OFPMPF_REPLY_MORE", "openflow_v4.multipart_reply.flags.more",
7037 FT_UINT16, BASE_HEX, NULL, OFPMPF_REPLY_MORE,
7038 NULL, HFILL }
7040 { &hf_openflow_v4_multipart_reply_pad,
7041 { "Pad", "openflow_v4.multipart_reply.pad",
7042 FT_BYTES, BASE_NONE, NULL, 0x0,
7043 NULL, HFILL }
7045 { &hf_openflow_v4_multipart_reply_experimenter_experimenter,
7046 { "Experimenter", "openflow_v4.multipart_reply.experimenter.experimenter",
7047 FT_UINT32, BASE_HEX, NULL, 0x0,
7048 NULL, HFILL }
7050 { &hf_openflow_v4_multipart_reply_experimenter_exp_type,
7051 { "Experimenter type", "openflow_v4.multipart_reply.experimenter.exp_type",
7052 FT_UINT32, BASE_DEC, NULL, 0x0,
7053 NULL, HFILL }
7055 { &hf_openflow_v4_queue_get_config_request_port,
7056 { "Port", "openflow_v4.queue_get_config_request.port",
7057 FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_port_reserved_values), 0x0,
7058 NULL, HFILL }
7060 { &hf_openflow_v4_queue_get_config_request_pad,
7061 { "Pad", "openflow_v4.queue_get_config_request.pad",
7062 FT_BYTES, BASE_NONE, NULL, 0x0,
7063 NULL, HFILL }
7065 { &hf_openflow_v4_queue_prop_property,
7066 { "Property", "openflow_v4.queue_prop.property",
7067 FT_UINT16, BASE_DEC, VALS(openflow_v4_queue_prop_property_values), 0x0,
7068 NULL, HFILL }
7070 { &hf_openflow_v4_queue_prop_len,
7071 { "Length", "openflow_v4.queue_prop.len",
7072 FT_UINT16, BASE_DEC, NULL, 0x0,
7073 NULL, HFILL }
7075 { &hf_openflow_v4_queue_prop_pad,
7076 { "Pad", "openflow_v4.queue_prop.pad",
7077 FT_BYTES, BASE_NONE, NULL, 0x0,
7078 NULL, HFILL }
7080 { &hf_openflow_v4_queue_prop_min_rate_rate,
7081 { "Rate", "openflow_v4.queue_prop.min_rate.rate",
7082 FT_UINT16, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_queue_prop_min_rate_reserved_values), 0x0,
7083 NULL, HFILL }
7085 { &hf_openflow_v4_queue_prop_min_rate_pad,
7086 { "Pad", "openflow_v4.queue_prop.min_rate.pad",
7087 FT_BYTES, BASE_NONE, NULL, 0x0,
7088 NULL, HFILL }
7090 { &hf_openflow_v4_queue_prop_max_rate_rate,
7091 { "Rate", "openflow_v4.queue_prop.max_rate.rate",
7092 FT_UINT16, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_queue_prop_max_rate_reserved_values), 0x0,
7093 NULL, HFILL }
7095 { &hf_openflow_v4_queue_prop_max_rate_pad,
7096 { "Pad", "openflow_v4.queue_prop.max_rate.pad",
7097 FT_BYTES, BASE_NONE, NULL, 0x0,
7098 NULL, HFILL }
7100 { &hf_openflow_v4_queue_prop_experimenter_experimenter,
7101 { "Experimenter", "openflow_v4.queue_prop.experimenter.experimenter",
7102 FT_UINT32, BASE_DEC, NULL, 0x0,
7103 NULL, HFILL }
7105 { &hf_openflow_v4_queue_prop_experimenter_pad,
7106 { "Pad", "openflow_v4.queue_prop.experimenter.pad",
7107 FT_BYTES, BASE_NONE, NULL, 0x0,
7108 NULL, HFILL }
7110 { &hf_openflow_v4_packet_queue_queue_id,
7111 { "Queue ID", "openflow_v4.packet_queue.queue_id",
7112 FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_queue_id_reserved_values), 0x0,
7113 NULL, HFILL }
7115 { &hf_openflow_v4_packet_queue_port,
7116 { "Port", "openflow_v4.packet_queue.port",
7117 FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_port_reserved_values), 0x0,
7118 NULL, HFILL }
7120 { &hf_openflow_v4_packet_queue_len,
7121 { "Length", "openflow_v4.packet_queue.len",
7122 FT_UINT16, BASE_DEC, NULL, 0x0,
7123 NULL, HFILL }
7125 { &hf_openflow_v4_packet_queue_pad,
7126 { "Pad", "openflow_v4.packet_queue.pad",
7127 FT_BYTES, BASE_NONE, NULL, 0x0,
7128 NULL, HFILL }
7130 { &hf_openflow_v4_queue_get_config_reply_port,
7131 { "Port", "openflow_v4.queue_get_config_reply.port",
7132 FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_port_reserved_values), 0x0,
7133 NULL, HFILL }
7135 { &hf_openflow_v4_queue_get_config_reply_pad,
7136 { "Pad", "openflow_v4.queue_get_config_reply.pad",
7137 FT_BYTES, BASE_NONE, NULL, 0x0,
7138 NULL, HFILL }
7140 { &hf_openflow_v4_role_request_role,
7141 { "Role", "openflow_v4.role_request.role",
7142 FT_UINT32, BASE_HEX, VALS(openflow_v4_controller_role_values), 0x0,
7143 NULL, HFILL }
7145 { &hf_openflow_v4_role_request_pad,
7146 { "Pad", "openflow_v4.role_request.pad",
7147 FT_BYTES, BASE_NONE, NULL, 0x0,
7148 NULL, HFILL }
7150 { &hf_openflow_v4_role_request_generation_id,
7151 { "Generation ID", "openflow_v4.role_request.generation_id",
7152 FT_UINT64, BASE_HEX, NULL, 0x0,
7153 NULL, HFILL }
7155 { &hf_openflow_v4_role_reply_role,
7156 { "Role", "openflow_v4.role_reply.role",
7157 FT_UINT32, BASE_HEX, VALS(openflow_v4_controller_role_values), 0x0,
7158 NULL, HFILL }
7160 { &hf_openflow_v4_role_reply_pad,
7161 { "Pad", "openflow_v4.role_reply.pad",
7162 FT_BYTES, BASE_NONE, NULL, 0x0,
7163 NULL, HFILL }
7165 { &hf_openflow_v4_role_reply_generation_id,
7166 { "Generation ID", "openflow_v4.role_reply.generation_id",
7167 FT_UINT64, BASE_HEX, NULL, 0x0,
7168 NULL, HFILL }
7170 { &hf_openflow_v4_async_config_packet_in_mask_master,
7171 { "Packet_in mask (master)", "openflow_v4.async_config.packet_in_mask.master",
7172 FT_UINT32, BASE_HEX, NULL, 0x0,
7173 NULL, HFILL }
7175 { &hf_openflow_v4_async_config_packet_in_mask_master_no_match,
7176 { "OFPR_NO_MATCH", "openflow_v4.async_config.packet_in_mask.master.no_match",
7177 FT_BOOLEAN, 32, NULL, 1 << OFPR_NO_MATCH,
7178 NULL, HFILL }
7180 { &hf_openflow_v4_async_config_packet_in_mask_master_action,
7181 { "OFPR_ACTION", "openflow_v4.async_config.packet_in_mask.master.action",
7182 FT_BOOLEAN, 32, NULL, 1 << OFPR_ACTION,
7183 NULL, HFILL }
7185 { &hf_openflow_v4_async_config_packet_in_mask_master_invalid_ttl,
7186 { "OFPR_INVALID_TTL", "openflow_v4.async_config.packet_in_mask.master.invalid_ttl",
7187 FT_BOOLEAN, 32, NULL, 1 << OFPR_INVALID_TTL,
7188 NULL, HFILL }
7190 { &hf_openflow_v4_async_config_packet_in_mask_slave,
7191 { "Packet_in mask (slave)", "openflow_v4.async_config.packet_in_mask.slave",
7192 FT_UINT32, BASE_HEX, NULL, 0x0,
7193 NULL, HFILL }
7195 { &hf_openflow_v4_async_config_packet_in_mask_slave_no_match,
7196 { "OFPR_NO_MATCH", "openflow_v4.async_config.packet_in_mask.slave.no_match",
7197 FT_BOOLEAN, 32, NULL, 1 << OFPR_NO_MATCH,
7198 NULL, HFILL }
7200 { &hf_openflow_v4_async_config_packet_in_mask_slave_action,
7201 { "OFPR_ACTION", "openflow_v4.async_config.packet_in_mask.slave.action",
7202 FT_BOOLEAN, 32, NULL, 1 << OFPR_ACTION,
7203 NULL, HFILL }
7205 { &hf_openflow_v4_async_config_packet_in_mask_slave_invalid_ttl,
7206 { "OFPR_INVALID_TTL", "openflow_v4.async_config.packet_in_mask.slave.invalid_ttl",
7207 FT_BOOLEAN, 32, NULL, 1 << OFPR_INVALID_TTL,
7208 NULL, HFILL }
7210 { &hf_openflow_v4_async_config_port_status_mask_master,
7211 { "Port status mask (master)", "openflow_v4.async_config.port_status_mask.master",
7212 FT_UINT32, BASE_HEX, NULL, 0x0,
7213 NULL, HFILL }
7215 { &hf_openflow_v4_async_config_port_status_mask_master_add,
7216 { "OFPPR_ADD", "openflow_v4.async_config.port_status_mask.master.add",
7217 FT_BOOLEAN, 32, NULL, 1 << OFPPR_ADD,
7218 NULL, HFILL }
7220 { &hf_openflow_v4_async_config_port_status_mask_master_delete,
7221 { "OFPPR_DELETE", "openflow_v4.async_config.port_status_mask.master.delete",
7222 FT_BOOLEAN, 32, NULL, 1 << OFPPR_DELETE,
7223 NULL, HFILL }
7225 { &hf_openflow_v4_async_config_port_status_mask_master_modify,
7226 { "OFPPR_MODIFY", "openflow_v4.async_config.port_status_mask.master.modify",
7227 FT_BOOLEAN, 32, NULL, 1 << OFPPR_MODIFY,
7228 NULL, HFILL }
7230 { &hf_openflow_v4_async_config_port_status_mask_slave,
7231 { "Port status mask (slave)", "openflow_v4.async_config.port_status_mask.slave",
7232 FT_UINT32, BASE_HEX, NULL, 0x0,
7233 NULL, HFILL }
7235 { &hf_openflow_v4_async_config_port_status_mask_slave_add,
7236 { "OFPPR_ADD", "openflow_v4.async_config.port_status_mask.slave.add",
7237 FT_BOOLEAN, 32, NULL, 1 << OFPPR_ADD,
7238 NULL, HFILL }
7240 { &hf_openflow_v4_async_config_port_status_mask_slave_delete,
7241 { "OFPPR_DELETE", "openflow_v4.async_config.port_status_mask.slave.delete",
7242 FT_BOOLEAN, 32, NULL, 1 << OFPPR_DELETE,
7243 NULL, HFILL }
7245 { &hf_openflow_v4_async_config_port_status_mask_slave_modify,
7246 { "OFPPR_MODIFY", "openflow_v4.async_config.port_status_mask.slave.modify",
7247 FT_BOOLEAN, 32, NULL, 1 << OFPPR_MODIFY,
7248 NULL, HFILL }
7250 { &hf_openflow_v4_async_config_flow_removed_mask_master,
7251 { "Flow removed mask (master)", "openflow_v4.async_config.flow_removed_mask.master",
7252 FT_UINT32, BASE_HEX, NULL, 0x0,
7253 NULL, HFILL }
7255 { &hf_openflow_v4_async_config_flow_removed_mask_master_idle_timeout,
7256 { "OFPRR_IDLE_TIMEOUT", "openflow_v4.async_config.flow_removed_mask.master.idle_timeout",
7257 FT_BOOLEAN, 32, NULL, 1 << OFPRR_IDLE_TIMEOUT,
7258 NULL, HFILL }
7260 { &hf_openflow_v4_async_config_flow_removed_mask_master_hard_timeout,
7261 { "OFPRR_HARD_TIMEOUT", "openflow_v4.async_config.flow_removed_mask.master.hard_timeout",
7262 FT_BOOLEAN, 32, NULL, 1 << OFPRR_HARD_TIMEOUT,
7263 NULL, HFILL }
7265 { &hf_openflow_v4_async_config_flow_removed_mask_master_delete,
7266 { "OFPRR_DELETE", "openflow_v4.async_config.flow_removed_mask.master.delete",
7267 FT_BOOLEAN, 32, NULL, 1 << OFPRR_DELETE,
7268 NULL, HFILL }
7270 { &hf_openflow_v4_async_config_flow_removed_mask_master_group_delete,
7271 { "OFPRR_GROUP_DELETE", "openflow_v4.async_config.flow_removed_mask.master.group_delete",
7272 FT_BOOLEAN, 32, NULL, 1 << OFPRR_GROUP_DELETE,
7273 NULL, HFILL }
7275 { &hf_openflow_v4_async_config_flow_removed_mask_slave,
7276 { "Flow removed mask (slave)", "openflow_v4.async_config.flow_removed_mask.slave",
7277 FT_UINT32, BASE_HEX, NULL, 0x0,
7278 NULL, HFILL }
7280 { &hf_openflow_v4_async_config_flow_removed_mask_slave_idle_timeout,
7281 { "OFPRR_IDLE_TIMEOUT", "openflow_v4.async_config.flow_removed_mask.slave.idle_timeout",
7282 FT_BOOLEAN, 32, NULL, 1 << OFPRR_IDLE_TIMEOUT,
7283 NULL, HFILL }
7285 { &hf_openflow_v4_async_config_flow_removed_mask_slave_hard_timeout,
7286 { "OFPRR_HARD_TIMEOUT", "openflow_v4.async_config.flow_removed_mask.slave.hard_timeout",
7287 FT_BOOLEAN, 32, NULL, 1 << OFPRR_HARD_TIMEOUT,
7288 NULL, HFILL }
7290 { &hf_openflow_v4_async_config_flow_removed_mask_slave_delete,
7291 { "OFPRR_DELETE", "openflow_v4.async_config.flow_removed_mask.slave.delete",
7292 FT_BOOLEAN, 32, NULL, 1 << OFPRR_DELETE,
7293 NULL, HFILL }
7295 { &hf_openflow_v4_async_config_flow_removed_mask_slave_group_delete,
7296 { "OFPRR_GROUP_DELETE", "openflow_v4.async_config.flow_removed_mask.slave.group_delete",
7297 FT_BOOLEAN, 32, NULL, 1 << OFPRR_GROUP_DELETE,
7298 NULL, HFILL }
7300 { &hf_openflow_v4_metermod_command,
7301 { "Command", "openflow_v4.metermod.command",
7302 FT_UINT16, BASE_DEC, VALS(openflow_v4_metermod_command_values), 0x0,
7303 NULL, HFILL }
7305 { &hf_openflow_v4_metermod_flags,
7306 { "Flags", "openflow_v4.metermod.flags",
7307 FT_UINT32, BASE_HEX, NULL, 0x0,
7308 NULL, HFILL }
7310 { &hf_openflow_v4_metermod_flags_kbps,
7311 { "OFPMF_KBPS", "openflow_v4.metermod.flags.kbps",
7312 FT_BOOLEAN, 32, NULL, OFPMF_KBPS,
7313 NULL, HFILL }
7315 { &hf_openflow_v4_metermod_flags_pktps,
7316 { "OFPMF_PKTPS", "openflow_v4.metermod.flags.ptkps",
7317 FT_BOOLEAN, 32, NULL, OFPMF_PKTPS,
7318 NULL, HFILL }
7320 { &hf_openflow_v4_metermod_flags_burst,
7321 { "OFPMF_BURST", "openflow_v4.metermod.flags.burst",
7322 FT_BOOLEAN, 32, NULL, OFPMF_BURST,
7323 NULL, HFILL }
7325 { &hf_openflow_v4_metermod_flags_stats,
7326 { "OFPMF_STATS", "openflow_v4.metermod.flags.stats",
7327 FT_BOOLEAN, 32, NULL, OFPMF_STATS,
7328 NULL, HFILL }
7330 { &hf_openflow_v4_metermod_meter_id,
7331 { "Meter ID", "openflow_v4.metermod.meter_id",
7332 FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_meter_id_reserved_values), 0x0,
7333 NULL, HFILL }
7337 static int *ett[] = {
7338 &ett_openflow_v4,
7339 &ett_openflow_v4_flowmod_flags,
7340 &ett_openflow_v4_bucket,
7341 &ett_openflow_v4_oxm,
7342 &ett_openflow_v4_match,
7343 &ett_openflow_v4_action,
7344 &ett_openflow_v4_instruction,
7345 &ett_openflow_v4_port,
7346 &ett_openflow_v4_port_config,
7347 &ett_openflow_v4_port_state,
7348 &ett_openflow_v4_port_current,
7349 &ett_openflow_v4_port_advertised,
7350 &ett_openflow_v4_port_supported,
7351 &ett_openflow_v4_port_peer,
7352 &ett_openflow_v4_meter_band,
7353 &ett_openflow_v4_hello_element,
7354 &ett_openflow_v4_error_data,
7355 &ett_openflow_v4_switch_features_capabilities,
7356 &ett_openflow_v4_switch_config_flags,
7357 &ett_openflow_v4_packet_in_data,
7358 &ett_openflow_v4_packet_out_data,
7359 &ett_openflow_v4_portmod_config,
7360 &ett_openflow_v4_portmod_mask,
7361 &ett_openflow_v4_portmod_advertise,
7362 &ett_openflow_v4_table_features,
7363 &ett_openflow_v4_table_feature_prop,
7364 &ett_openflow_v4_table_feature_prop_instruction_id,
7365 &ett_openflow_v4_table_feature_prop_action_id,
7366 &ett_openflow_v4_table_feature_prop_oxm_id,
7367 &ett_openflow_v4_multipart_request_flags,
7368 &ett_openflow_v4_flow_stats,
7369 &ett_openflow_v4_flow_stats_flags,
7370 &ett_openflow_v4_table_stats,
7371 &ett_openflow_v4_port_stats,
7372 &ett_openflow_v4_queue_stats,
7373 &ett_openflow_v4_bucket_counter,
7374 &ett_openflow_v4_group_stats,
7375 &ett_openflow_v4_group_desc,
7376 &ett_openflow_v4_group_features_types,
7377 &ett_openflow_v4_group_features_capabilities,
7378 &ett_openflow_v4_group_features_actions_all,
7379 &ett_openflow_v4_group_features_actions_select,
7380 &ett_openflow_v4_group_features_actions_indirect,
7381 &ett_openflow_v4_group_features_actions_ff,
7382 &ett_openflow_v4_meter_band_stats,
7383 &ett_openflow_v4_meter_stats,
7384 &ett_openflow_v4_meter_config,
7385 &ett_openflow_v4_meter_config_flags,
7386 &ett_openflow_v4_meter_features_band_types,
7387 &ett_openflow_v4_meter_features_capabilities,
7388 &ett_openflow_v4_multipart_reply_flags,
7389 &ett_openflow_v4_queue_prop,
7390 &ett_openflow_v4_packet_queue,
7391 &ett_openflow_v4_async_config_packet_in_mask_master,
7392 &ett_openflow_v4_async_config_packet_in_mask_slave,
7393 &ett_openflow_v4_async_config_port_status_mask_master,
7394 &ett_openflow_v4_async_config_port_status_mask_slave,
7395 &ett_openflow_v4_async_config_flow_removed_mask_master,
7396 &ett_openflow_v4_async_config_flow_removed_mask_slave,
7397 &ett_openflow_v4_metermod_flags
7400 static ei_register_info ei[] = {
7401 { &ei_openflow_v4_oxm_undecoded,
7402 { "openflow_v4.oxm.undecoded", PI_UNDECODED, PI_NOTE,
7403 "Unknown OMX body.", EXPFILL }
7405 { &ei_openflow_v4_match_undecoded,
7406 { "openflow_v4.match.undecoded", PI_UNDECODED, PI_NOTE,
7407 "Unknown match body.", EXPFILL }
7409 { &ei_openflow_v4_action_undecoded,
7410 { "openflow_v4.action.undecoded", PI_UNDECODED, PI_NOTE,
7411 "Unknown action body.", EXPFILL }
7413 { &ei_openflow_v4_instruction_undecoded,
7414 { "openflow_v4.instruction.undecoded", PI_UNDECODED, PI_NOTE,
7415 "Unknown instruction body.", EXPFILL }
7417 { &ei_openflow_v4_meter_band_undecoded,
7418 { "openflow_v4.meter_band.undecoded", PI_UNDECODED, PI_NOTE,
7419 "Unknown meter band body.", EXPFILL }
7421 { &ei_openflow_v4_hello_element_undecoded,
7422 { "openflow_v4.hello_element.undecoded", PI_UNDECODED, PI_NOTE,
7423 "Unknown hello element body.", EXPFILL }
7425 { &ei_openflow_v4_error_undecoded,
7426 { "openflow_v4.error.undecoded", PI_UNDECODED, PI_NOTE,
7427 "Unknown error data.", EXPFILL }
7429 { &ei_openflow_v4_experimenter_undecoded,
7430 { "openflow_v4.experimenter.undecoded", PI_UNDECODED, PI_NOTE,
7431 "Unknown experimenter body.", EXPFILL }
7433 { &ei_openflow_v4_table_feature_prop_undecoded,
7434 { "openflow_v4.table_feature_prop.undecoded", PI_UNDECODED, PI_NOTE,
7435 "Unknown table feature property body.", EXPFILL }
7437 { &ei_openflow_v4_multipart_request_undecoded,
7438 { "openflow_v4.multipart_request.undecoded", PI_UNDECODED, PI_NOTE,
7439 "Unknown multipart request body.", EXPFILL }
7441 { &ei_openflow_v4_multipart_reply_undecoded,
7442 { "openflow_v4.multipart_reply.undecoded", PI_UNDECODED, PI_NOTE,
7443 "Unknown multipart reply body.", EXPFILL }
7445 { &ei_openflow_v4_queue_prop_undecoded,
7446 { "openflow_v4.queue_prop.undecoded", PI_UNDECODED, PI_NOTE,
7447 "Unknown queue property body.", EXPFILL }
7449 {&ei_openflow_v4_message_undecoded,
7450 { "openflow_v4.message.undecoded", PI_UNDECODED, PI_NOTE,
7451 "Unknown message body.", EXPFILL }
7455 expert_module_t *expert_openflow_v4;
7457 /* Register the protocol name and description */
7458 proto_openflow_v4 = proto_register_protocol("OpenFlow 1.3", "openflow_v4", "openflow_v4");
7460 register_dissector("openflow_v4", dissect_openflow_v4, proto_openflow_v4);
7462 /* Required function calls to register the header fields and subtrees */
7463 proto_register_field_array(proto_openflow_v4, hf, array_length(hf));
7464 proto_register_subtree_array(ett, array_length(ett));
7465 expert_openflow_v4 = expert_register_protocol(proto_openflow_v4);
7466 expert_register_field_array(expert_openflow_v4, ei, array_length(ei));
7469 void
7470 proto_reg_handoff_openflow_v4(void)
7472 eth_withoutfcs_handle = find_dissector_add_dependency("eth_withoutfcs", proto_openflow_v4);
7476 * Editor modelines - https://www.wireshark.org/tools/modelines.html
7478 * Local variables:
7479 * c-basic-offset: 4
7480 * tab-width: 8
7481 * indent-tabs-mode: nil
7482 * End:
7484 * vi: set shiftwidth=4 tabstop=8 expandtab:
7485 * :indentSize=4:tabSize=8:noTabs=true: