Coverage Report

Created: 2026-05-14 06:28

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/wireshark/epan/dissectors/packet-openflow_v4.c
Line
Count
Source
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>
5
 *
6
 * Wireshark - Network traffic analyzer
7
 * By Gerald Combs <gerald@wireshark.org>
8
 * Copyright 1998 Gerald Combs
9
 *
10
 * SPDX-License-Identifier: GPL-2.0-or-later
11
 *
12
 * Ref https://www.opennetworking.org/sdn-resources/onf-specifications/openflow
13
 */
14
15
#include "config.h"
16
17
#include <epan/packet.h>
18
#include <epan/etypes.h>
19
#include <epan/expert.h>
20
#include <epan/iana-info.h>
21
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);
25
26
static dissector_handle_t eth_withoutfcs_handle;
27
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;
599
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;
660
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;
674
675
static const value_string openflow_v4_version_values[] = {
676
    { 0x04, "1.3" },
677
    { 0, NULL }
678
};
679
680
1
#define OFPT_HELLO                      0
681
2
#define OFPT_ERROR                      1
682
0
#define OFPT_ECHO_REQUEST               2
683
0
#define OFPT_ECHO_REPLY                 3
684
1
#define OFPT_EXPERIMENTER               4
685
0
#define OFPT_FEATURES_REQUEST           5
686
0
#define OFPT_FEATURES_REPLY             6
687
0
#define OFPT_GET_CONFIG_REQUEST         7
688
0
#define OFPT_GET_CONFIG_REPLY           8
689
0
#define OFPT_SET_CONFIG                 9
690
0
#define OFPT_PACKET_IN                 10
691
0
#define OFPT_FLOW_REMOVED              11
692
0
#define OFPT_PORT_STATUS               12
693
3
#define OFPT_PACKET_OUT                13
694
12
#define OFPT_FLOW_MOD                  14
695
0
#define OFPT_GROUP_MOD                 15
696
0
#define OFPT_PORT_MOD                  16
697
0
#define OFPT_TABLE_MOD                 17
698
16
#define OFPT_MULTIPART_REQUEST         18
699
18
#define OFPT_MULTIPART_REPLY           19
700
0
#define OFPT_BARRIER_REQUEST           20
701
0
#define OFPT_BARRIER_REPLY             21
702
0
#define OFPT_QUEUE_GET_CONFIG_REQUEST  22
703
0
#define OFPT_QUEUE_GET_CONFIG_REPLY    23
704
0
#define OFPT_ROLE_REQUEST              24
705
0
#define OFPT_ROLE_REPLY                25
706
0
#define OFPT_GET_ASYNC_REQUEST         26
707
0
#define OFPT_GET_ASYNC_REPLY           27
708
0
#define OFPT_SET_ASYNC                 28
709
0
#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 }
742
};
743
static value_string_ext openflow_v4_type_values_ext = VALUE_STRING_EXT_INIT(openflow_v4_type_values);
744
745
static int
746
dissect_openflow_header_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
747
54
{
748
    /* uint8_t version; */
749
54
    proto_tree_add_item(tree, hf_openflow_v4_version, tvb, offset, 1, ENC_BIG_ENDIAN);
750
54
    offset++;
751
752
    /* uint8_t type; */
753
54
    proto_tree_add_item(tree, hf_openflow_v4_type, tvb, offset, 1, ENC_BIG_ENDIAN);
754
54
    offset++;
755
756
    /* uint16_t length; */
757
54
    proto_tree_add_item(tree, hf_openflow_v4_length, tvb, offset, 2, ENC_BIG_ENDIAN);
758
54
    offset+=2;
759
760
    /* uint32_t xid; */
761
54
    proto_tree_add_item(tree, hf_openflow_v4_xid, tvb, offset, 4, ENC_BIG_ENDIAN);
762
54
    offset+=4;
763
764
54
    return offset;
765
54
}
766
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 }
778
};
779
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 }
785
};
786
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}
791
};
792
793
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}
798
};
799
800
#define OFPXMC_NXM_0           0x0000  /* Backward compatibility with NXM */
801
#define OFPXMC_NXM_1           0x0001  /* Backward compatibility with NXM */
802
97
#define OFPXMC_OPENFLOW_BASIC  0x8000  /* Basic class for OpenFlow */
803
48
#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}
810
};
811
812
0
#define OFPXMT_OFB_IN_PORT          0
813
0
#define OFPXMT_OFB_IN_PHY_PORT      1
814
#define OFPXMT_OFB_METADATA         2
815
0
#define OFPXMT_OFB_ETH_DST          3
816
0
#define OFPXMT_OFB_ETH_SRC          4
817
0
#define OFPXMT_OFB_ETH_TYPE         5
818
0
#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
0
#define OFPXMT_OFB_IP_PROTO        10
823
0
#define OFPXMT_OFB_IPV4_SRC        11
824
0
#define OFPXMT_OFB_IPV4_DST        12
825
0
#define OFPXMT_OFB_TCP_SRC         13
826
0
#define OFPXMT_OFB_TCP_DST         14
827
0
#define OFPXMT_OFB_UDP_SRC         15
828
0
#define OFPXMT_OFB_UDP_DST         16
829
0
#define OFPXMT_OFB_SCTP_SRC        17
830
0
#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
0
#define OFPXMT_OFB_ARP_SPA         22
835
0
#define OFPXMT_OFB_ARP_TPA         23
836
0
#define OFPXMT_OFB_ARP_SHA         24
837
0
#define OFPXMT_OFB_ARP_THA         25
838
0
#define OFPXMT_OFB_IPV6_SRC        26
839
0
#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
0
#define OFPXMT_OFB_IPV6_ND_SLL     32
845
0
#define OFPXMT_OFB_IPV6_ND_TLL     33
846
0
#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 }
894
};
895
static value_string_ext openflow_v4_oxm_basic_field_values_ext = VALUE_STRING_EXT_INIT(openflow_v4_oxm_basic_field_values);
896
897
49
#define OXM_FIELD_MASK   0xfe
898
49
#define OXM_FIELD_OFFSET 1
899
49
#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_)
902
48
{
903
48
    uint16_t oxm_class;
904
905
    /* oxm_class */
906
48
    proto_tree_add_item_ret_uint16(tree, hf_openflow_v4_oxm_class, tvb, offset, 2, ENC_BIG_ENDIAN, &oxm_class);
907
48
    offset+=2;
908
909
    /* oxm_field */
910
48
    if (oxm_class == OFPXMC_OPENFLOW_BASIC) {
911
1
        proto_tree_add_bits_item(tree, hf_openflow_v4_oxm_field_basic, tvb, (offset * 8), 7, ENC_NA);
912
47
    } else {
913
47
        proto_tree_add_bits_item(tree, hf_openflow_v4_oxm_field, tvb, (offset * 8), 7, ENC_NA);
914
47
    }
915
916
    /* oxm_hm */
917
48
    proto_tree_add_bits_item(tree, hf_openflow_v4_oxm_hm, tvb, (offset * 8) + 7, 1, ENC_NA);
918
48
    offset+=1;
919
920
    /* oxm_length */
921
48
    proto_tree_add_item(tree, hf_openflow_v4_oxm_length, tvb, offset, 1, ENC_BIG_ENDIAN);
922
48
    offset+=1;
923
924
48
    return offset;
925
48
}
926
927
928
15
#define OFPVID_PRESENT  0x1000
929
static int
930
dissect_openflow_oxm_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
931
49
{
932
49
    proto_tree *oxm_tree;
933
49
    uint16_t oxm_class;
934
49
    uint16_t oxm_end;
935
49
    uint8_t oxm_field_hm;
936
49
    uint8_t oxm_hm;
937
49
    uint8_t oxm_field;
938
49
    uint8_t oxm_length;
939
49
    uint8_t field_length;
940
941
49
    oxm_class = tvb_get_ntohs(tvb, offset);
942
49
    oxm_field_hm = tvb_get_uint8(tvb, offset + 2);
943
49
    oxm_length = tvb_get_uint8(tvb, offset + 3);
944
49
    oxm_end = offset + 4 + oxm_length;
945
946
49
    oxm_field = (oxm_field_hm & OXM_FIELD_MASK) >> OXM_FIELD_OFFSET;
947
49
    oxm_hm = oxm_field_hm & OXM_HM_MASK;
948
49
    field_length = (oxm_hm == 0) ? oxm_length : (oxm_length / 2);
949
950
49
    oxm_tree = proto_tree_add_subtree(tree, tvb, offset, oxm_length + 4, ett_openflow_v4_oxm, NULL, "OXM field");
951
952
49
    offset = dissect_openflow_oxm_header_v4(tvb, pinfo, oxm_tree, offset, length);
953
954
49
    if (oxm_class == OFPXMC_OPENFLOW_BASIC) {
955
1
        switch(oxm_field) {
956
0
        case OFPXMT_OFB_IN_PORT:
957
0
        case OFPXMT_OFB_IN_PHY_PORT:
958
0
            proto_tree_add_item(oxm_tree, hf_openflow_v4_oxm_value_uint32, tvb, offset, 4, ENC_BIG_ENDIAN);
959
0
            offset+=4;
960
0
            break;
961
962
0
        case OFPXMT_OFB_ETH_DST:
963
0
        case OFPXMT_OFB_ETH_SRC:
964
0
        case OFPXMT_OFB_ARP_SHA:
965
0
        case OFPXMT_OFB_ARP_THA:
966
0
        case OFPXMT_OFB_IPV6_ND_SLL: /*The source link-layer address option in an IPv6 Neighbor Discovery message */
967
0
        case OFPXMT_OFB_IPV6_ND_TLL: /*The target link-layer address option in an IPv6 Neighbor Discovery message */
968
0
            proto_tree_add_item(oxm_tree, hf_openflow_v4_oxm_value_etheraddr, tvb, offset, 6, ENC_NA);
969
0
            offset+=6;
970
0
            if (oxm_hm) {
971
0
                proto_tree_add_item(oxm_tree, hf_openflow_v4_oxm_mask_etheraddr, tvb, offset, 6, ENC_NA);
972
0
                offset+=6;
973
0
            }
974
0
            break;
975
976
0
        case OFPXMT_OFB_ETH_TYPE:
977
0
            proto_tree_add_item(oxm_tree, hf_openflow_v4_oxm_value_ethertype, tvb, offset, 2, ENC_BIG_ENDIAN);
978
0
            offset+=2;
979
0
            break;
980
981
0
        case OFPXMT_OFB_VLAN_VID:
982
0
            proto_tree_add_item(oxm_tree, hf_openflow_v4_oxm_value_vlan_present, tvb, offset, 2, ENC_BIG_ENDIAN);
983
0
            proto_tree_add_item(oxm_tree, hf_openflow_v4_oxm_value_vlan_vid, tvb, offset, 2, ENC_BIG_ENDIAN);
984
0
            offset+=2;
985
0
            if (oxm_hm) {
986
0
                proto_tree_add_item(oxm_tree, hf_openflow_v4_oxm_mask_vlan, tvb, offset, 2, ENC_BIG_ENDIAN);
987
0
                offset+=2;
988
0
            }
989
0
            break;
990
991
0
        case OFPXMT_OFB_IP_PROTO:
992
0
            proto_tree_add_item(oxm_tree, hf_openflow_v4_oxm_value_ipproto, tvb, offset, 1, ENC_BIG_ENDIAN);
993
0
            offset+=1;
994
0
            break;
995
996
0
        case OFPXMT_OFB_IPV4_SRC:
997
0
        case OFPXMT_OFB_IPV4_DST:
998
0
        case OFPXMT_OFB_ARP_SPA:
999
0
        case OFPXMT_OFB_ARP_TPA:
1000
0
            proto_tree_add_item(oxm_tree, hf_openflow_v4_oxm_value_ipv4addr, tvb, offset, 4, ENC_BIG_ENDIAN);
1001
0
            offset+=4;
1002
0
            if (oxm_hm) {
1003
0
                proto_tree_add_item(oxm_tree, hf_openflow_v4_oxm_mask_ipv4addr, tvb, offset, 4, ENC_BIG_ENDIAN);
1004
0
                offset+=4;
1005
0
            }
1006
0
            break;
1007
1008
0
        case OFPXMT_OFB_TCP_SRC:
1009
0
        case OFPXMT_OFB_TCP_DST:
1010
0
        case OFPXMT_OFB_UDP_SRC:
1011
0
        case OFPXMT_OFB_UDP_DST:
1012
0
        case OFPXMT_OFB_SCTP_SRC:
1013
0
        case OFPXMT_OFB_SCTP_DST:
1014
0
            proto_tree_add_item(oxm_tree, hf_openflow_v4_oxm_value_uint16, tvb, offset, 2, ENC_BIG_ENDIAN);
1015
0
            offset+=2;
1016
0
            break;
1017
1018
0
        case OFPXMT_OFB_IPV6_SRC:
1019
0
        case OFPXMT_OFB_IPV6_DST:
1020
0
            proto_tree_add_item(oxm_tree, hf_openflow_v4_oxm_value_ipv6addr, tvb, offset, 16, ENC_NA);
1021
0
            offset+=16;
1022
0
            if (oxm_hm) {
1023
0
                proto_tree_add_item(oxm_tree, hf_openflow_v4_oxm_mask_ipv6addr, tvb, offset, 16, ENC_NA);
1024
0
                offset+=16;
1025
0
            }
1026
0
            break;
1027
1028
0
        case OFPXMT_OFB_MPLS_LABEL:
1029
            /* size differs in specification and header file */
1030
0
            if (field_length == 3) {
1031
0
                proto_tree_add_item(oxm_tree, hf_openflow_v4_oxm_value_uint24, tvb, offset, 3, ENC_BIG_ENDIAN);
1032
0
                offset+=3;
1033
0
            } else if (field_length == 4) {
1034
0
                proto_tree_add_item(oxm_tree, hf_openflow_v4_oxm_value_uint32, tvb, offset, 4, ENC_BIG_ENDIAN);
1035
0
                offset+=4;
1036
0
            }
1037
0
            break;
1038
1039
1
        default:
1040
            /* value */
1041
1
            if (field_length > 0) {
1042
1
                proto_tree_add_item(oxm_tree, hf_openflow_v4_oxm_value, tvb, offset, field_length, ENC_NA);
1043
1
                offset += field_length;
1044
1
            }
1045
1046
            /* mask */
1047
1
            if (field_length > 0 && oxm_hm != 0) {
1048
0
                proto_tree_add_item(oxm_tree, hf_openflow_v4_oxm_mask, tvb, offset, field_length, ENC_NA);
1049
0
                offset += field_length;
1050
0
            }
1051
1
            break;
1052
1
        }
1053
1054
1
        if(oxm_end > offset){
1055
0
            proto_tree_add_expert_format(oxm_tree, pinfo, &ei_openflow_v4_oxm_undecoded,
1056
0
                                         tvb, offset, oxm_end-offset, "Undecoded Data");
1057
0
            offset = oxm_end;
1058
0
        }
1059
1060
48
    } else if (oxm_class == OFPXMC_EXPERIMENTER) {
1061
        /* uint32_t experimenter; */
1062
0
        proto_tree_add_item(oxm_tree, hf_openflow_v4_oxm_experimenter_experimenter, tvb, offset, 4, ENC_BIG_ENDIAN);
1063
0
        offset+=4;
1064
0
        proto_tree_add_item(oxm_tree, hf_openflow_v4_oxm_experimenter_value, tvb, offset, oxm_length - 4, ENC_NA);
1065
0
        offset+=(oxm_length - 4);
1066
48
    } else {
1067
48
        proto_tree_add_expert_format(oxm_tree, pinfo, &ei_openflow_v4_oxm_undecoded,
1068
48
                                     tvb, offset, oxm_length, "Unknown OXM body.");
1069
48
        offset+=oxm_length;
1070
48
    }
1071
1072
49
    return offset;
1073
49
}
1074
1075
0
#define OFPMT_STANDARD  0  /* Standard Match. Deprecated. */
1076
6
#define OFPMT_OXM       1  /* OpenFlow Extensible Match */
1077
static const value_string openflow_v4_match_type_values[] = {
1078
    { 0, "OFPMT_STANDARD" },
1079
    { 1, "OFPMT_OXM" },
1080
    { 0, NULL }
1081
};
1082
1083
static int
1084
dissect_openflow_match_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
1085
12
{
1086
12
    proto_item *ti;
1087
12
    proto_tree *match_tree;
1088
12
    uint16_t match_type;
1089
12
    uint16_t match_length;
1090
12
    int32_t fields_end;
1091
12
    uint16_t pad_length;
1092
1093
12
    match_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_openflow_v4_match, &ti, "Match");
1094
1095
    /* uint16_t type; */
1096
12
    proto_tree_add_item_ret_uint16(match_tree, hf_openflow_v4_match_type, tvb, offset, 2, ENC_BIG_ENDIAN, &match_type);
1097
12
    offset+=2;
1098
1099
    /* uint16_t length; (excluding padding) */
1100
12
    match_length = tvb_get_ntohs(tvb, offset);
1101
12
    pad_length = (match_length + 7)/8*8 - match_length;
1102
12
    proto_item_set_len(ti, match_length + pad_length);
1103
12
    proto_tree_add_item(match_tree, hf_openflow_v4_match_length, tvb, offset, 2, ENC_BIG_ENDIAN);
1104
12
    offset+=2;
1105
1106
    /* body */
1107
12
    switch (match_type) {
1108
0
    case OFPMT_STANDARD:
1109
0
        proto_tree_add_expert_format(match_tree, pinfo, &ei_openflow_v4_match_undecoded,
1110
0
                                     tvb, offset, match_length - 4, "Standard match body (deprecated).");
1111
0
        if (match_length > 4)
1112
0
            offset+=match_length-4;
1113
0
        break;
1114
1115
6
    case OFPMT_OXM:
1116
6
        fields_end = offset + match_length - 4;
1117
55
        while(offset < fields_end) {
1118
49
            offset = dissect_openflow_oxm_v4(tvb, pinfo, match_tree, offset, length);
1119
49
        }
1120
6
        break;
1121
1122
6
    default:
1123
6
        proto_tree_add_expert_format(match_tree, pinfo, &ei_openflow_v4_match_undecoded,
1124
6
                                     tvb, offset, match_length - 4, "Unknown match body.");
1125
6
        if (match_length > 4)
1126
6
            offset+=match_length-4;
1127
6
        break;
1128
12
    }
1129
1130
    /* pad; Exactly ((length + 7)/8*8 - length) (between 0 and 7) bytes of all-zero bytes. */
1131
6
    if (pad_length > 0) {
1132
2
        proto_tree_add_item(match_tree, hf_openflow_v4_match_pad, tvb, offset, pad_length, ENC_NA);
1133
2
        offset+=pad_length;
1134
2
    }
1135
1136
6
    return offset;
1137
12
}
1138
1139
#define OFPM_MAX   0xffffff00  /* Last usable meter number. */
1140
static const value_string openflow_v4_meter_id_reserved_values[] = {
1141
    { 0xfffffffd, "OFPM_SLOWPATH" },
1142
    { 0xfffffffe, "OFPM_CONTROLLER" },
1143
    { 0xffffffff, "OFPM_ALL" },
1144
    { 0,          NULL }
1145
};
1146
1147
15
#define OFPMBT_DROP          1
1148
16
#define OFPMBT_DSCP_REMARK   2
1149
0
#define OFPMBT_EXPERIMENTER  0xFFFF
1150
static const value_string openflow_v4_meter_band_type_values[] = {
1151
    { OFPMBT_DROP,         "OFPMBT_DROP" },
1152
    { OFPMBT_DSCP_REMARK,  "OFPMBT_DSCP_REMARK" },
1153
    { OFPMBT_EXPERIMENTER, "OFPMBT_EXPERIMENTER" },
1154
    { 0,                   NULL }
1155
};
1156
1157
#define OFPMF_KBPS   1 << 0
1158
#define OFPMF_PKTPS  1 << 1
1159
#define OFPMF_BURST  1 << 2
1160
#define OFPMF_STATS  1 << 3
1161
1162
static int
1163
dissect_openflow_meter_band_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
1164
5
{
1165
5
    proto_item *ti;
1166
5
    proto_tree *band_tree;
1167
5
    uint16_t band_type;
1168
5
    uint16_t band_len;
1169
1170
5
    band_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_openflow_v4_meter_band, &ti, "Meter band");
1171
1172
    /* uint16_t type; */
1173
5
    proto_tree_add_item_ret_uint16(band_tree, hf_openflow_v4_meter_band_type, tvb, offset, 2, ENC_BIG_ENDIAN, &band_type);
1174
5
    offset+=2;
1175
1176
    /* uint16_t len; */
1177
5
    band_len = tvb_get_ntohs(tvb, offset);
1178
5
    proto_item_set_len(ti, band_len);
1179
5
    proto_tree_add_item(band_tree, hf_openflow_v4_meter_band_len, tvb, offset, 2, ENC_BIG_ENDIAN);
1180
5
    offset+=2;
1181
1182
    /* uint32_t rate; */
1183
5
    proto_tree_add_item(band_tree, hf_openflow_v4_meter_band_rate, tvb, offset, 4, ENC_BIG_ENDIAN);
1184
5
    offset+=4;
1185
1186
    /* uint32_t burst_size; */
1187
5
    proto_tree_add_item(band_tree, hf_openflow_v4_meter_band_burst_size, tvb, offset, 4, ENC_BIG_ENDIAN);
1188
5
    offset+=4;
1189
1190
5
    switch (band_type) {
1191
0
    case OFPMBT_DROP:
1192
        /* uint8_t pad[4]; */
1193
0
        proto_tree_add_item(band_tree, hf_openflow_v4_meter_band_drop_pad, tvb, offset, 4, ENC_NA);
1194
0
        offset+=4;
1195
0
        break;
1196
1197
1
    case OFPMBT_DSCP_REMARK:
1198
        /* uint8_t prec_level; */
1199
1
        proto_tree_add_item(band_tree, hf_openflow_v4_meter_band_dscp_remark_prec_level, tvb, offset, 1, ENC_BIG_ENDIAN);
1200
1
        offset+=1;
1201
1202
        /* uint8_t pad[3]; */
1203
1
        proto_tree_add_item(band_tree, hf_openflow_v4_meter_band_dscp_remark_pad, tvb, offset, 3, ENC_NA);
1204
1
        offset+=3;
1205
1
        break;
1206
1207
0
    case OFPMBT_EXPERIMENTER:
1208
        /* uint32_t experimenter; */
1209
0
        proto_tree_add_item(band_tree, hf_openflow_v4_meter_band_experimenter_experimenter, tvb, offset, 4, ENC_BIG_ENDIAN);
1210
0
        offset+=4;
1211
1212
        /* uint32_t experimenter_data[0]; */
1213
0
        proto_tree_add_expert_format(band_tree, pinfo, &ei_openflow_v4_meter_band_undecoded,
1214
0
                                     tvb, offset, offset - 16 + band_len, "Experimenter meter band body.");
1215
0
        if (band_len > 16)
1216
0
            offset+=band_len-16;
1217
0
        break;
1218
1219
4
    default:
1220
4
        proto_tree_add_expert_format(band_tree, pinfo, &ei_openflow_v4_meter_band_undecoded,
1221
4
                                     tvb, offset, offset - 12 + band_len, "Unknown meter band body.");
1222
4
        if (band_len > 12)
1223
0
            offset+=band_len-12;
1224
4
        break;
1225
5
    }
1226
1227
2
    return offset;
1228
5
}
1229
1230
1231
0
#define OFPHET_VERSIONBITMAP  1
1232
static const value_string openflow_v4_hello_element_type_values[] = {
1233
    { 1, "OFPHET_VERSIONBITMAP" },
1234
    { 0, NULL }
1235
};
1236
1237
static int
1238
dissect_openflow_hello_element_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length)
1239
0
{
1240
0
    proto_tree *elem_tree;
1241
0
    uint16_t elem_type;
1242
0
    uint16_t elem_length;
1243
0
    uint16_t pad_length;
1244
1245
0
    elem_tree = proto_tree_add_subtree(tree, tvb, offset, length - offset, ett_openflow_v4_hello_element, NULL, "Element");
1246
1247
    /* uint16_t type; */
1248
0
    elem_type = tvb_get_ntohs(tvb, offset);
1249
0
    proto_tree_add_item(elem_tree, hf_openflow_v4_hello_element_type, tvb, offset, 2, ENC_BIG_ENDIAN);
1250
0
    offset+=2;
1251
1252
    /* uint16_t length; */
1253
0
    elem_length = tvb_get_ntohs(tvb, offset);
1254
0
    pad_length = (elem_length + 7)/8*8 - elem_length;
1255
0
    proto_tree_add_item(elem_tree, hf_openflow_v4_hello_element_length, tvb, offset, 2, ENC_BIG_ENDIAN);
1256
0
    offset+=2;
1257
1258
0
    switch (elem_type) {
1259
0
    case OFPHET_VERSIONBITMAP:
1260
        /* bitmap */
1261
0
        proto_tree_add_item(elem_tree, hf_openflow_v4_hello_element_version_bitmap, tvb, offset, elem_length - 4, ENC_NA);
1262
0
        if (elem_length > 4)
1263
0
            offset += elem_length - 4;
1264
0
        break;
1265
1266
0
    default:
1267
0
        proto_tree_add_expert_format(tree, pinfo, &ei_openflow_v4_hello_element_undecoded,
1268
0
                                     tvb, offset, elem_length - 4, "Unknown hello element body.");
1269
0
        if (elem_length > 4)
1270
0
            offset += elem_length - 4;
1271
0
        break;
1272
0
    }
1273
1274
0
    if (pad_length > 0) {
1275
0
        proto_tree_add_item(tree, hf_openflow_v4_hello_element_pad, tvb, offset, pad_length, ENC_NA);
1276
0
        offset+=pad_length;
1277
0
    }
1278
1279
0
    return offset;
1280
0
}
1281
1282
static void
1283
dissect_openflow_hello_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length)
1284
1
{
1285
1286
1
    while (offset < length) {
1287
0
        offset = dissect_openflow_hello_element_v4(tvb, pinfo, tree, offset, length);
1288
0
    }
1289
1
}
1290
1291
1292
2
#define OFPET_HELLO_FAILED            0
1293
2
#define OFPET_BAD_REQUEST             1
1294
1
#define OFPET_BAD_ACTION              2
1295
1
#define OFPET_BAD_INSTRUCTION         3
1296
1
#define OFPET_BAD_MATCH               4
1297
1
#define OFPET_FLOW_MOD_FAILED         5
1298
1
#define OFPET_GROUP_MOD_FAILED        6
1299
1
#define OFPET_PORT_MOD_FAILED         7
1300
1
#define OFPET_TABLE_MOD_FAILED        8
1301
1
#define OFPET_QUEUE_OP_FAILED         9
1302
1
#define OFPET_SWITCH_CONFIG_FAILED   10
1303
1
#define OFPET_ROLE_REQUEST_FAILED    11
1304
1
#define OFPET_METER_MOD_FAILED       12
1305
1
#define OFPET_TABLE_FEATURES_FAILED  13
1306
0
#define OFPET_EXPERIMENTER           0xffff
1307
static const value_string openflow_v4_error_type_values[] = {
1308
    {      0, "OFPET_HELLO_FAILED" },
1309
    {      1, "OFPET_BAD_REQUEST" },
1310
    {      2, "OFPET_BAD_ACTION" },
1311
    {      3, "OFPET_BAD_INSTRUCTION" },
1312
    {      4, "OFPET_BAD_MATCH" },
1313
    {      5, "OFPET_FLOW_MOD_FAILED" },
1314
    {      6, "OFPET_GROUP_MOD_FAILED" },
1315
    {      7, "OFPET_PORT_MOD_FAILED" },
1316
    {      8, "OFPET_TABLE_MOD_FAILED" },
1317
    {      9, "OFPET_QUEUE_OP_FAILED" },
1318
    {     10, "OFPET_SWITCH_CONFIG_FAILED" },
1319
    {     11, "OFPET_ROLE_REQUEST_FAILED" },
1320
    {     12, "OFPET_METER_MOD_FAILED" },
1321
    {     13, "OFPET_TABLE_FEATURES_FAILED" },
1322
    { 0xffff, "OFPET_EXPERIMENTER" },
1323
    {      0, NULL}
1324
};
1325
1326
static const value_string openflow_v4_error_hello_failed_code_values[] = {
1327
    { 0, "OFPHFC_INCOMPATIBLE" },
1328
    { 1, "OFPHFC_EPERM" },
1329
    { 0, NULL }
1330
};
1331
1332
static const value_string openflow_v4_error_bad_request_code_values[] =  {
1333
    {  0, "OFPBRC_BAD_VERSION" },
1334
    {  1, "OFPBRC_BAD_TYPE" },
1335
    {  2, "OFPBRC_BAD_MULTIPART" },
1336
    {  3, "OFPBRC_BAD_EXPERIMENTER" },
1337
    {  4, "OFPBRC_BAD_EXP_TYPE" },
1338
    {  5, "OFPBRC_EPERM" },
1339
    {  6, "OFPBRC_BAD_LEN" },
1340
    {  7, "OFPBRC_BUFFER_EMPTY" },
1341
    {  8, "OFPBRC_BUFFER_UNKNOWN" },
1342
    {  9, "OFPBRC_BAD_TABLE_ID" },
1343
    { 10, "OFPBRC_IS_SLAVE" },
1344
    { 11, "OFPBRC_BAD_PORT" },
1345
    { 12, "OFPBRC_BAD_PACKET" },
1346
    { 13, "OFPBRC_MULTIPART_BUFFER_OVERFLOW" },
1347
    {  0, NULL }
1348
};
1349
1350
static const value_string openflow_v4_error_bad_action_code_values[] =  {
1351
    {  0, "OFPBAC_BAD_TYPE" },
1352
    {  1, "OFPBAC_BAD_LEN" },
1353
    {  2, "OFPBAC_BAD_EXPERIMENTER" },
1354
    {  3, "OFPBAC_BAD_EXP_TYPE" },
1355
    {  4, "OFPBAC_BAD_OUT_PORT" },
1356
    {  5, "OFPBAC_BAD_ARGUMENT" },
1357
    {  6, "OFPBAC_EPERM" },
1358
    {  7, "OFPBAC_TOO_MANY" },
1359
    {  8, "OFPBAC_BAD_QUEUE" },
1360
    {  9, "OFPBAC_BAD_OUT_GROUP" },
1361
    { 10, "OFPBAC_MATCH_INCONSISTENT" },
1362
    { 11, "OFPBAC_UNSUPPORTED_ORDER" },
1363
    { 12, "OFPBAC_BAD_TAG" },
1364
    { 13, "OFPBAC_BAD_SET_TYPE" },
1365
    { 14, "OFPBAC_BAD_SET_LEN" },
1366
    { 15, "OFPBAC_BAD_SET_ARGUMENT" },
1367
    {  0, NULL }
1368
};
1369
1370
static const value_string openflow_v4_error_bad_instruction_code_values[] =  {
1371
    { 0, "OFPBIC_UNKNOWN_INST" },
1372
    { 1, "OFPBIC_UNSUP_INST" },
1373
    { 2, "OFPBIC_BAD_TABLE_ID" },
1374
    { 3, "OFPBIC_UNSUP_METADATA" },
1375
    { 4, "OFPBIC_UNSUP_METADATA_MASK" },
1376
    { 5, "OFPBIC_BAD_EXPERIMENTER" },
1377
    { 6, "OFPBIC_BAD_EXP_TYPE" },
1378
    { 7, "OFPBIC_BAD_LEN" },
1379
    { 8, "OFPBIC_EPERM" },
1380
    { 0, NULL }
1381
};
1382
1383
static const value_string openflow_v4_error_bad_match_code_values[] =  {
1384
    {  0, "OFPBMC_BAD_TYPE" },
1385
    {  1, "OFPBMC_BAD_LEN" },
1386
    {  2, "OFPBMC_BAD_TAG" },
1387
    {  3, "OFPBMC_BAD_DL_ADDR_MASK" },
1388
    {  4, "OFPBMC_BAD_NW_ADDR_MASK" },
1389
    {  5, "OFPBMC_BAD_WILDCARDS" },
1390
    {  6, "OFPBMC_BAD_FIELD" },
1391
    {  7, "OFPBMC_BAD_VALUE" },
1392
    {  8, "OFPBMC_BAD_MASK" },
1393
    {  9, "OFPBMC_BAD_PREREQ" },
1394
    { 10, "OFPBMC_DUP_FIELD" },
1395
    { 11, "OFPBMC_EPERM" },
1396
    {  0, NULL }
1397
};
1398
1399
static const value_string openflow_v4_error_flow_mod_failed_code_values[] =  {
1400
    { 0, "OFPFMFC_UNKNOWN" },
1401
    { 1, "OFPFMFC_TABLE_FULL" },
1402
    { 2, "OFPFMFC_BAD_TABLE_ID" },
1403
    { 3, "OFPFMFC_OVERLAP" },
1404
    { 4, "OFPFMFC_EPERM" },
1405
    { 5, "OFPFMFC_BAD_TIMEOUT" },
1406
    { 6, "OFPFMFC_BAD_COMMAND" },
1407
    { 7, "OFPFMFC_BAD_FLAGS" },
1408
    { 0, NULL }
1409
};
1410
1411
static const value_string openflow_v4_error_group_mod_failed_code_values[] =  {
1412
    {  0, "OFPGMFC_GROUP_EXISTS" },
1413
    {  1, "OFPGMFC_INVALID_GROUP" },
1414
    {  2, "OFPGMFC_WEIGHT_UNSUPPORTED" },
1415
    {  3, "OFPGMFC_OUT_OF_GROUPS" },
1416
    {  4, "OFPGMFC_OUT_OF_BUCKETS" },
1417
    {  5, "OFPGMFC_CHAINING_UNSUPPORTED" },
1418
    {  6, "OFPGMFC_WATCH_UNSUPPORTED" },
1419
    {  7, "OFPGMFC_LOOP" },
1420
    {  8, "OFPGMFC_UNKNOWN_GROUP" },
1421
    {  9, "OFPGMFC_CHAINED_GROUP" },
1422
    { 10, "OFPGMFC_BAD_TYPE" },
1423
    { 11, "OFPGMFC_BAD_COMMAND" },
1424
    { 12, "OFPGMFC_BAD_BUCKET" },
1425
    { 13, "OFPGMFC_BAD_WATCH" },
1426
    { 14, "OFPGMFC_EPERM" },
1427
    {  0, NULL }
1428
};
1429
1430
static const value_string openflow_v4_error_port_mod_failed_code_values[] =  {
1431
    { 0, "OFPPMFC_BAD_PORT" },
1432
    { 1, "OFPPMFC_BAD_HW_ADDR" },
1433
    { 2, "OFPPMFC_BAD_CONFIG" },
1434
    { 3, "OFPPMFC_BAD_ADVERTISE" },
1435
    { 4, "OFPPMFC_EPERM" },
1436
    { 0, NULL }
1437
};
1438
1439
static const value_string openflow_v4_error_table_mod_failed_code_values[] =  {
1440
    { 0, "OFPTMFC_BAD_TABLE" },
1441
    { 1, "OFPTMFC_BAD_CONFIG" },
1442
    { 2, "OFPTMFC_EPERM" },
1443
    { 0, NULL }
1444
};
1445
1446
static const value_string openflow_v4_error_queue_op_failed_code_values[] =  {
1447
    { 0, "OFPQOFC_BAD_PORT" },
1448
    { 1, "OFPQOFC_BAD_QUEUE" },
1449
    { 2, "OFPQOFC_EPERM" },
1450
    { 0, NULL }
1451
};
1452
1453
static const value_string openflow_v4_error_switch_config_failed_code_values[] =  {
1454
    { 0, "OFPSCFC_BAD_FLAGS" },
1455
    { 1, "OFPSCFC_BAD_LEN" },
1456
    { 2, "OFPQCFC_EPERM" },
1457
    { 0, NULL }
1458
};
1459
1460
static const value_string openflow_v4_error_role_request_failed_code_values[] =  {
1461
    { 0, "OFPRRFC_STALE" },
1462
    { 1, "OFPRRFC_UNSUP" },
1463
    { 2, "OFPRRFC_BAD_ROLE" },
1464
    { 0, NULL }
1465
};
1466
1467
static const value_string openflow_v4_error_meter_mod_failed_code_values[] =  {
1468
    {   0, "OFPMMFC_UNKNOWN" },
1469
    {   1, "OFPMMFC_METER_EXISTS" },
1470
    {   2, "OFPMMFC_INVALID_METER" },
1471
    {   3, "OFPMMFC_UNKNOWN_METER" },
1472
    {   4, "OFPMMFC_BAD_COMMAND" },
1473
    {   5, "OFPMMFC_BAD_FLAGS" },
1474
    {   6, "OFPMMFC_BAD_RATE" },
1475
    {   7, "OFPMMFC_BAD_BURST" },
1476
    {   8, "OFPMMFC_BAD_BAND" },
1477
    {   9, "OFPMMFC_BAD_BAND_VALUE" },
1478
    {  10, "OFPMMFC_OUT_OF_METERS" },
1479
    {  11, "OFPMMFC_OUT_OF_BANDS" },
1480
    {  0, NULL }
1481
};
1482
1483
static const value_string openflow_v4_error_table_features_failed_code_values[] =  {
1484
    { 0, "OFPTFFC_BAD_TABLE" },
1485
    { 1, "OFPTFFC_BAD_METADATA" },
1486
    { 2, "OFPTFFC_BAD_TYPE" },
1487
    { 3, "OFPTFFC_BAD_LEN" },
1488
    { 4, "OFPTFFC_BAD_ARGUMENT" },
1489
    { 5, "OFPTFFC_EPERM" },
1490
    { 0, NULL }
1491
};
1492
1493
static void
1494
// NOLINTNEXTLINE(misc-no-recursion)
1495
dissect_openflow_error_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length)
1496
2
{
1497
2
    proto_tree *data_tree;
1498
2
    proto_item *data_ti;
1499
2
    uint16_t error_type;
1500
1501
    /* uint16_t type; */
1502
2
    proto_tree_add_item_ret_uint16(tree, hf_openflow_v4_error_type, tvb, offset, 2, ENC_BIG_ENDIAN, &error_type);
1503
2
    offset +=2;
1504
1505
    /* uint16_t code; */
1506
2
    switch(error_type) {
1507
1
    case OFPET_HELLO_FAILED:
1508
1
        proto_tree_add_item(tree, hf_openflow_v4_error_hello_failed_code, tvb, offset, 2, ENC_BIG_ENDIAN);
1509
1
        break;
1510
1
    case OFPET_BAD_REQUEST:
1511
1
        proto_tree_add_item(tree, hf_openflow_v4_error_bad_request_code, tvb, offset, 2, ENC_BIG_ENDIAN);
1512
1
        break;
1513
0
    case OFPET_BAD_ACTION:
1514
0
        proto_tree_add_item(tree, hf_openflow_v4_error_bad_action_code, tvb, offset, 2, ENC_BIG_ENDIAN);
1515
0
        break;
1516
0
    case OFPET_BAD_INSTRUCTION:
1517
0
        proto_tree_add_item(tree, hf_openflow_v4_error_bad_instruction_code, tvb, offset, 2, ENC_BIG_ENDIAN);
1518
0
        break;
1519
0
    case OFPET_BAD_MATCH:
1520
0
        proto_tree_add_item(tree, hf_openflow_v4_error_bad_match_code, tvb, offset, 2, ENC_BIG_ENDIAN);
1521
0
        break;
1522
0
    case OFPET_FLOW_MOD_FAILED:
1523
0
        proto_tree_add_item(tree, hf_openflow_v4_error_flow_mod_failed_code, tvb, offset, 2, ENC_BIG_ENDIAN);
1524
0
        break;
1525
0
    case OFPET_GROUP_MOD_FAILED:
1526
0
        proto_tree_add_item(tree, hf_openflow_v4_error_group_mod_failed_code, tvb, offset, 2, ENC_BIG_ENDIAN);
1527
0
        break;
1528
0
    case OFPET_PORT_MOD_FAILED:
1529
0
        proto_tree_add_item(tree, hf_openflow_v4_error_port_mod_failed_code, tvb, offset, 2, ENC_BIG_ENDIAN);
1530
0
        break;
1531
0
    case OFPET_TABLE_MOD_FAILED:
1532
0
        proto_tree_add_item(tree, hf_openflow_v4_error_table_mod_failed_code, tvb, offset, 2, ENC_BIG_ENDIAN);
1533
0
        break;
1534
0
    case OFPET_QUEUE_OP_FAILED:
1535
0
        proto_tree_add_item(tree, hf_openflow_v4_error_queue_op_failed_code, tvb, offset, 2, ENC_BIG_ENDIAN);
1536
0
        break;
1537
0
    case OFPET_SWITCH_CONFIG_FAILED:
1538
0
        proto_tree_add_item(tree, hf_openflow_v4_error_switch_config_failed_code, tvb, offset, 2, ENC_BIG_ENDIAN);
1539
0
        break;
1540
0
    case OFPET_ROLE_REQUEST_FAILED:
1541
0
        proto_tree_add_item(tree, hf_openflow_v4_error_role_request_failed_code, tvb, offset, 2, ENC_BIG_ENDIAN);
1542
0
        break;
1543
0
    case OFPET_METER_MOD_FAILED:
1544
0
        proto_tree_add_item(tree, hf_openflow_v4_error_meter_mod_failed_code, tvb, offset, 2, ENC_BIG_ENDIAN);
1545
0
        break;
1546
0
    case OFPET_TABLE_FEATURES_FAILED:
1547
0
        proto_tree_add_item(tree, hf_openflow_v4_error_table_features_failed_code, tvb, offset, 2, ENC_BIG_ENDIAN);
1548
0
        break;
1549
0
    case OFPET_EXPERIMENTER:
1550
0
    default:
1551
0
        proto_tree_add_item(tree, hf_openflow_v4_error_code, tvb, offset, 2, ENC_BIG_ENDIAN);
1552
0
        break;
1553
2
    }
1554
2
    offset +=2;
1555
1556
2
    switch(error_type) {
1557
1
    case OFPET_HELLO_FAILED:
1558
        /* uint8_t data[0]; contains an ASCII text string */
1559
1
        proto_tree_add_item(tree, hf_openflow_v4_error_data_text, tvb, offset, length - 12, ENC_ASCII);
1560
        /*offset += length - 12;*/
1561
1
        break;
1562
1563
1
    case OFPET_BAD_REQUEST:
1564
1
    case OFPET_BAD_ACTION:
1565
1
    case OFPET_BAD_INSTRUCTION:
1566
1
    case OFPET_BAD_MATCH:
1567
1
    case OFPET_FLOW_MOD_FAILED:
1568
1
    case OFPET_GROUP_MOD_FAILED:
1569
1
    case OFPET_PORT_MOD_FAILED:
1570
1
    case OFPET_TABLE_MOD_FAILED:
1571
1
    case OFPET_QUEUE_OP_FAILED:
1572
1
    case OFPET_SWITCH_CONFIG_FAILED:
1573
1
    case OFPET_ROLE_REQUEST_FAILED:
1574
1
    case OFPET_METER_MOD_FAILED:
1575
1
    case OFPET_TABLE_FEATURES_FAILED: {
1576
        /* uint8_t data[0]; contains at least the first 64 bytes of the failed request. */
1577
1
        bool save_in_error_pkt;
1578
1579
1
        data_ti = proto_tree_add_item(tree, hf_openflow_v4_error_data_body, tvb, offset, length - 20, ENC_NA);
1580
1
        data_tree = proto_item_add_subtree(data_ti, ett_openflow_v4_error_data);
1581
1582
        /* Save error pkt */
1583
1
        save_in_error_pkt = pinfo->flags.in_error_pkt;
1584
1
        pinfo->flags.in_error_pkt = true;
1585
1586
        /* Disable update/change of column info */
1587
1
        col_set_writable(pinfo->cinfo, -1, false);
1588
1589
1
        dissect_openflow_message_v4(tvb, pinfo, data_tree, offset);
1590
1591
        /* Restore the "we're inside an error packet" flag. */
1592
1
        pinfo->flags.in_error_pkt = save_in_error_pkt;
1593
1594
        /* Restore the capability of update/change column info */
1595
1
        col_set_writable(pinfo->cinfo, -1, true);
1596
1597
        /*offset += length - 12;*/
1598
1
        }
1599
1
        break;
1600
1601
0
    case OFPET_EXPERIMENTER:
1602
        /* uint32_t experimenter */
1603
0
        proto_tree_add_item(tree, hf_openflow_v4_error_experimenter, tvb, offset, 4, ENC_BIG_ENDIAN);
1604
0
        offset+=4;
1605
        /* uint8_t data[0]; */
1606
0
        proto_tree_add_expert_format(tree, pinfo, &ei_openflow_v4_error_undecoded,
1607
0
                                     tvb, offset, length - 16, "Experimenter error body.");
1608
        /*offset += length - 16;*/
1609
0
        break;
1610
1611
0
    default:
1612
        /* uint8_t data[0]; */
1613
0
        proto_tree_add_expert_format(tree, pinfo, &ei_openflow_v4_error_undecoded,
1614
0
                                     tvb, offset, length - 12, "Unknown error body.");
1615
        /*offset += length - 12;*/
1616
0
        break;
1617
2
    }
1618
2
}
1619
1620
1621
static void
1622
dissect_openflow_echo_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length)
1623
0
{
1624
    /* data */
1625
0
    if (offset < length) {
1626
0
        proto_tree_add_item(tree, hf_openflow_v4_echo_data, tvb, offset, length - offset, ENC_NA);
1627
0
    }
1628
0
}
1629
1630
1631
static void
1632
dissect_openflow_experimenter_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length)
1633
1
{
1634
    /* uint32_t experimenter; */
1635
1
    proto_tree_add_item(tree, hf_openflow_v4_experimenter_experimenter, tvb, offset, 4, ENC_BIG_ENDIAN);
1636
1
    offset+=4;
1637
1638
    /* uint32_t exp_type; */
1639
1
    proto_tree_add_item(tree, hf_openflow_v4_experimenter_exp_type, tvb, offset, 4, ENC_BIG_ENDIAN);
1640
1
    offset+=4;
1641
1642
    /* data */
1643
1
    if (offset < length) {
1644
1
        proto_tree_add_expert_format(tree, pinfo, &ei_openflow_v4_experimenter_undecoded,
1645
1
                                     tvb, offset, length - 16, "Experimenter body.");
1646
1
    }
1647
1
}
1648
1649
15
#define OFPC_FLOW_STATS    1<<0
1650
15
#define OFPC_TABLE_STATS   1<<1
1651
15
#define OFPC_PORT_STATS    1<<2
1652
15
#define OFPC_GROUP_STATS   1<<3
1653
15
#define OFPC_IP_REASM      1<<5
1654
15
#define OFPC_QUEUE_STATS   1<<6
1655
15
#define OFPC_PORT_BLOCKED  1<<8
1656
static void
1657
dissect_openflow_switch_features_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
1658
0
{
1659
0
    proto_item *ti;
1660
0
    proto_tree *cap_tree;
1661
1662
    /* uint64_t datapath_id; */
1663
0
    proto_tree_add_item(tree, hf_openflow_v4_switch_features_datapath_id, tvb, offset, 8, ENC_BIG_ENDIAN);
1664
0
    offset+=8;
1665
1666
    /* uint32_t n_buffers; */
1667
0
    proto_tree_add_item(tree, hf_openflow_v4_switch_features_n_buffers, tvb, offset, 4, ENC_BIG_ENDIAN);
1668
0
    offset+=4;
1669
1670
    /* uint8_t n_tables; */
1671
0
    proto_tree_add_item(tree, hf_openflow_v4_switch_features_n_tables, tvb, offset, 1, ENC_BIG_ENDIAN);
1672
0
    offset++;
1673
1674
    /* uint8_t auxiliary_id; */
1675
0
    proto_tree_add_item(tree, hf_openflow_v4_switch_features_auxiliary_id, tvb, offset, 1, ENC_BIG_ENDIAN);
1676
0
    offset++;
1677
1678
    /* uint8_t pad[2]; */
1679
0
    proto_tree_add_item(tree, hf_openflow_v4_switch_features_pad, tvb, offset, 2, ENC_BIG_ENDIAN);
1680
0
    offset+=2;
1681
1682
    /* uint32_t capabilities; */
1683
0
    ti = proto_tree_add_item(tree, hf_openflow_v4_switch_features_capabilities, tvb, offset, 4, ENC_BIG_ENDIAN);
1684
0
    cap_tree = proto_item_add_subtree(ti, ett_openflow_v4_switch_features_capabilities);
1685
1686
0
    proto_tree_add_item(cap_tree, hf_openflow_v4_switch_features_capabilities_flow_stats, tvb, offset, 4, ENC_BIG_ENDIAN);
1687
0
    proto_tree_add_item(cap_tree, hf_openflow_v4_switch_features_capabilities_table_stats, tvb, offset, 4, ENC_BIG_ENDIAN);
1688
0
    proto_tree_add_item(cap_tree, hf_openflow_v4_switch_features_capabilities_port_stats, tvb, offset, 4, ENC_BIG_ENDIAN);
1689
0
    proto_tree_add_item(cap_tree, hf_openflow_v4_switch_features_capabilities_group_stats, tvb, offset, 4, ENC_BIG_ENDIAN);
1690
0
    proto_tree_add_item(cap_tree, hf_openflow_v4_switch_features_capabilities_ip_reasm, tvb, offset, 4, ENC_BIG_ENDIAN);
1691
0
    proto_tree_add_item(cap_tree, hf_openflow_v4_switch_features_capabilities_queue_stats, tvb, offset, 4, ENC_BIG_ENDIAN);
1692
0
    proto_tree_add_item(cap_tree, hf_openflow_v4_switch_features_capabilities_port_blocked, tvb, offset, 4, ENC_BIG_ENDIAN);
1693
0
    offset+=4;
1694
1695
    /* uint32_t reserved; */
1696
0
    proto_tree_add_item(tree, hf_openflow_v4_switch_features_reserved, tvb, offset, 4, ENC_BIG_ENDIAN);
1697
    /*offset+=4;*/
1698
0
}
1699
1700
static const value_string openflow_v4_switch_config_fragments_values[] = {
1701
    { 0, "OFPC_FRAG_NORMAL" },
1702
    { 1, "OFPC_FRAG_DROP" },
1703
    { 2, "OFPC_FRAG_REASM" },
1704
    { 0, NULL }
1705
};
1706
1707
#define OFPCML_MAX   0xffe5  /* Maximum max_len value. */
1708
static const value_string openflow_v4_controller_max_len_reserved_values[] = {
1709
    { 0xffff, "OFPCML_NO_BUFFER" },
1710
    { 0,      NULL }
1711
};
1712
1713
static void
1714
dissect_openflow_switch_config_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
1715
0
{
1716
0
    proto_item *ti;
1717
0
    proto_tree *flags_tree;
1718
1719
    /* uint16_t flags; */
1720
0
    ti = proto_tree_add_item(tree, hf_openflow_v4_switch_config_flags, tvb, offset, 2, ENC_BIG_ENDIAN);
1721
0
    flags_tree = proto_item_add_subtree(ti, ett_openflow_v4_switch_config_flags);
1722
1723
    /* fragments */
1724
0
    proto_tree_add_bits_item(flags_tree, hf_openflow_v4_switch_config_flags_fragments, tvb, (offset * 8) + 14, 2, ENC_NA);
1725
0
    offset+=2;
1726
1727
    /* uint16_t miss_send_len; */
1728
0
    proto_tree_add_item(tree, hf_openflow_v4_switch_config_miss_send_len, tvb, offset, 2, ENC_BIG_ENDIAN);
1729
    /*offset+=2;*/
1730
0
}
1731
1732
30
#define OFPR_NO_MATCH     0
1733
30
#define OFPR_ACTION       1
1734
30
#define OFPR_INVALID_TTL  2
1735
static const value_string openflow_v4_packet_in_reason_values[] = {
1736
    { OFPR_NO_MATCH,    "OFPR_NO_MATCH" },
1737
    { OFPR_ACTION,      "OFPR_ACTION" },
1738
    { OFPR_INVALID_TTL, "OFPR_INVALID_TTL" },
1739
    { 0,                NULL }
1740
};
1741
1742
static void
1743
dissect_openflow_packet_in_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
1744
0
{
1745
0
    proto_tree *data_tree;
1746
0
    tvbuff_t *next_tvb;
1747
0
    bool     save_writable;
1748
0
    bool save_in_error_pkt;
1749
0
    address save_dl_src, save_dl_dst, save_net_src, save_net_dst, save_src, save_dst;
1750
1751
    /* uint32_t buffer_id; */
1752
0
    proto_tree_add_item(tree, hf_openflow_v4_packet_in_buffer_id, tvb, offset, 4, ENC_BIG_ENDIAN);
1753
0
    offset+=4;
1754
1755
    /* uint16_t total_len; */
1756
0
    proto_tree_add_item(tree, hf_openflow_v4_packet_in_total_len, tvb, offset, 2, ENC_BIG_ENDIAN);
1757
0
    offset+=2;
1758
1759
    /* uint8_t reason; */
1760
0
    proto_tree_add_item(tree, hf_openflow_v4_packet_in_reason, tvb, offset, 1, ENC_BIG_ENDIAN);
1761
0
    offset+=1;
1762
1763
    /* uint8_t table_id; */
1764
0
    proto_tree_add_item(tree, hf_openflow_v4_packet_in_table_id, tvb, offset, 1, ENC_BIG_ENDIAN);
1765
0
    offset+=1;
1766
1767
    /* uint64_t cookie; */
1768
0
    proto_tree_add_item(tree, hf_openflow_v4_packet_in_cookie, tvb, offset, 8, ENC_BIG_ENDIAN);
1769
0
    offset+=8;
1770
1771
    /* struct ofp_match match; */
1772
0
    offset = dissect_openflow_match_v4(tvb, pinfo, tree, offset, length);
1773
1774
    /* uint8_t pad[2]; */
1775
0
    proto_tree_add_item(tree, hf_openflow_v4_packet_in_pad, tvb, offset, 2, ENC_NA);
1776
0
    offset+=2;
1777
1778
    /* uint8_t data[0]; */
1779
0
    if (offset < length) {
1780
0
        data_tree = proto_tree_add_subtree(tree, tvb, offset, length - offset, ett_openflow_v4_packet_in_data, NULL, "Data");
1781
1782
        /* save some state */
1783
0
        save_writable = col_get_writable(pinfo->cinfo, -1);
1784
0
        save_in_error_pkt = pinfo->flags.in_error_pkt;
1785
0
        copy_address_shallow(&save_dl_src, &pinfo->dl_src);
1786
0
        copy_address_shallow(&save_dl_dst, &pinfo->dl_dst);
1787
0
        copy_address_shallow(&save_net_src, &pinfo->net_src);
1788
0
        copy_address_shallow(&save_net_dst, &pinfo->net_dst);
1789
0
        copy_address_shallow(&save_src, &pinfo->src);
1790
0
        copy_address_shallow(&save_dst, &pinfo->dst);
1791
1792
        /* dissect data */
1793
0
        col_set_writable(pinfo->cinfo, -1, false);
1794
0
        next_tvb = tvb_new_subset_length(tvb, offset, length - offset);
1795
0
        call_dissector(eth_withoutfcs_handle, next_tvb, pinfo, data_tree);
1796
1797
        /* restore saved state */
1798
0
        col_set_writable(pinfo->cinfo, -1, save_writable);
1799
0
        pinfo->flags.in_error_pkt = save_in_error_pkt;
1800
0
        copy_address_shallow(&pinfo->dl_src, &save_dl_src);
1801
0
        copy_address_shallow(&pinfo->dl_dst, &save_dl_dst);
1802
0
        copy_address_shallow(&pinfo->net_src, &save_net_src);
1803
0
        copy_address_shallow(&pinfo->net_dst, &save_net_dst);
1804
0
        copy_address_shallow(&pinfo->src, &save_src);
1805
0
        copy_address_shallow(&pinfo->dst, &save_dst);
1806
0
    }
1807
0
}
1808
1809
1810
30
#define OFPRR_IDLE_TIMEOUT  0
1811
30
#define OFPRR_HARD_TIMEOUT  1
1812
30
#define OFPRR_DELETE        2
1813
30
#define OFPRR_GROUP_DELETE  3
1814
static const value_string openflow_v4_flow_removed_reason_values[] = {
1815
    { OFPRR_IDLE_TIMEOUT, "OFPRR_IDLE_TIMEOUT" },
1816
    { OFPRR_HARD_TIMEOUT, "OFPRR_HARD_TIMEOUT" },
1817
    { OFPRR_DELETE,       "OFPRR_DELETE" },
1818
    { OFPRR_GROUP_DELETE, "OFPRR_GROUP_DELETE" },
1819
    { 0,                  NULL }
1820
};
1821
1822
static void
1823
dissect_openflow_flow_removed_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
1824
0
{
1825
    /* uint64_t cookie; */
1826
0
    proto_tree_add_item(tree, hf_openflow_v4_flow_removed_cookie, tvb, offset, 8, ENC_BIG_ENDIAN);
1827
0
    offset+=8;
1828
1829
    /* uint16_t priority; */
1830
0
    proto_tree_add_item(tree, hf_openflow_v4_flow_removed_priority, tvb, offset, 2, ENC_BIG_ENDIAN);
1831
0
    offset+=2;
1832
1833
    /* uint8_t reason; */
1834
0
    proto_tree_add_item(tree, hf_openflow_v4_flow_removed_reason, tvb, offset, 1, ENC_BIG_ENDIAN);
1835
0
    offset+=1;
1836
1837
    /* uint8_t table_id; */
1838
0
    proto_tree_add_item(tree, hf_openflow_v4_flow_removed_table_id, tvb, offset, 1, ENC_BIG_ENDIAN);
1839
0
    offset+=1;
1840
1841
    /* uint32_t duration_sec; */
1842
0
    proto_tree_add_item(tree, hf_openflow_v4_flow_removed_duration_sec, tvb, offset, 4, ENC_BIG_ENDIAN);
1843
0
    offset+=4;
1844
1845
    /* uint32_t duration_nsec; */
1846
0
    proto_tree_add_item(tree, hf_openflow_v4_flow_removed_duration_nsec, tvb, offset, 4, ENC_BIG_ENDIAN);
1847
0
    offset+=4;
1848
1849
    /* uint16_t idle_timeout; */
1850
0
    proto_tree_add_item(tree, hf_openflow_v4_flow_removed_idle_timeout, tvb, offset, 2, ENC_BIG_ENDIAN);
1851
0
    offset+=2;
1852
1853
    /* uint16_t hard_timeout; */
1854
0
    proto_tree_add_item(tree, hf_openflow_v4_flow_removed_hard_timeout, tvb, offset, 2, ENC_BIG_ENDIAN);
1855
0
    offset+=2;
1856
1857
    /* uint64_t packet_count; */
1858
0
    proto_tree_add_item(tree, hf_openflow_v4_flow_removed_packet_count, tvb, offset, 8, ENC_BIG_ENDIAN);
1859
0
    offset+=8;
1860
1861
    /* uint64_t byte_count; */
1862
0
    proto_tree_add_item(tree, hf_openflow_v4_flow_removed_byte_count, tvb, offset, 8, ENC_BIG_ENDIAN);
1863
0
    offset+=8;
1864
1865
    /* struct ofp_match match; */
1866
0
    dissect_openflow_match_v4(tvb, pinfo, tree, offset, length);
1867
0
}
1868
1869
80
#define OFPAT_OUTPUT         0  /* Output to switch port. */
1870
60
#define OFPAT_COPY_TTL_OUT  11  /* Copy TTL "outwards" */
1871
60
#define OFPAT_COPY_TTL_IN   12  /* Copy TTL "inwards" */
1872
60
#define OFPAT_SET_MPLS_TTL  15  /* MPLS TTL */
1873
60
#define OFPAT_DEC_MPLS_TTL  16  /* Decrement MPLS TTL */
1874
60
#define OFPAT_PUSH_VLAN     17  /* Push a new VLAN tag */
1875
60
#define OFPAT_POP_VLAN      18  /* Pop the outer VLAN tag */
1876
61
#define OFPAT_PUSH_MPLS     19  /* Push a new MPLS tag */
1877
60
#define OFPAT_POP_MPLS      20  /* Pop the outer MPLS tag */
1878
60
#define OFPAT_SET_QUEUE     21  /* Set queue id when outputting to a port */
1879
61
#define OFPAT_GROUP         22  /* Apply group. */
1880
60
#define OFPAT_SET_NW_TTL    23  /* IP TTL. */
1881
60
#define OFPAT_DEC_NW_TTL    24  /* Decrement IP TTL. */
1882
60
#define OFPAT_SET_FIELD     25  /* Set a header field using OXM TLV format. */
1883
60
#define OFPAT_PUSH_PBB      26  /* Push a new PBB service tag (I-TAG) */
1884
60
#define OFPAT_POP_PBB       27  /* Pop the outer PBB service tag (I-TAG) */
1885
44
#define OFPAT_EXPERIMENTER  0xffff
1886
1887
static const value_string openflow_v4_action_type_values[] = {
1888
    {      0, "OFPAT_OUTPUT" },
1889
    {     11, "OFPAT_COPY_TTL_OUT" },
1890
    {     12, "OFPAT_COPY_TTL_IN" },
1891
    {     15, "OFPAT_SET_MPLS_TTL" },
1892
    {     16, "OFPAT_DEC_MPLS_TTL" },
1893
    {     17, "OFPAT_PUSH_VLAN" },
1894
    {     18, "OFPAT_POP_VLAN" },
1895
    {     19, "OFPAT_PUSH_MPLS" },
1896
    {     20, "OFPAT_POP_MPLS" },
1897
    {     21, "OFPAT_SET_QUEUE" },
1898
    {     22, "OFPAT_GROUP" },
1899
    {     23, "OFPAT_SET_NW_TTL" },
1900
    {     24, "OFPAT_DEC_NW_TTL" },
1901
    {     25, "OFPAT_SET_FIELD" },
1902
    {     26, "OFPAT_PUSH_PBB" },
1903
    {     27, "OFPAT_POP_PBB" },
1904
    { 0xffff, "OFPAT_EXPERIMENTER" },
1905
    { 0,      NULL}
1906
};
1907
1908
1909
1910
static int
1911
dissect_openflow_action_header_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
1912
44
{
1913
44
    uint16_t act_type;
1914
1915
    /* uint16_t type; */
1916
44
    act_type = tvb_get_ntohs(tvb, offset);
1917
44
    proto_tree_add_item(tree, hf_openflow_v4_action_type, tvb, offset, 2, ENC_BIG_ENDIAN);
1918
44
    offset+=2;
1919
1920
    /* uint16_t length; */
1921
44
    proto_tree_add_item(tree, hf_openflow_v4_action_length, tvb, offset, 2, ENC_BIG_ENDIAN);
1922
44
    offset+=2;
1923
1924
44
    if (act_type == OFPAT_EXPERIMENTER) {
1925
        /* uint32_t experimenter; */
1926
1
        proto_tree_add_item(tree, hf_openflow_v4_action_experimenter_experimenter, tvb, offset, 4, ENC_BIG_ENDIAN);
1927
1
        offset+=4;
1928
1
    }
1929
1930
44
    return offset;
1931
44
}
1932
1933
1934
static int
1935
dissect_openflow_action_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
1936
28
{
1937
28
    proto_tree *act_tree;
1938
28
    uint16_t act_type;
1939
28
    uint16_t act_length;
1940
28
    int32_t act_end;
1941
1942
28
    act_type = tvb_get_ntohs(tvb, offset);
1943
28
    act_length = tvb_get_ntohs(tvb, offset + 2);
1944
28
    act_end = offset + act_length;
1945
1946
28
    act_tree = proto_tree_add_subtree(tree, tvb, offset, act_length, ett_openflow_v4_action, NULL, "Action");
1947
1948
28
    offset = dissect_openflow_action_header_v4(tvb, pinfo, act_tree, offset, length);
1949
1950
28
    switch (act_type) {
1951
20
    case OFPAT_OUTPUT:
1952
        /* uint32_t port; */
1953
20
        proto_tree_add_item(act_tree, hf_openflow_v4_action_output_port, tvb, offset, 4, ENC_BIG_ENDIAN);
1954
20
        offset+=4;
1955
1956
        /* uint16_t max_len; */
1957
20
        proto_tree_add_item(act_tree, hf_openflow_v4_action_output_max_len, tvb, offset, 2, ENC_BIG_ENDIAN);
1958
20
        offset+=2;
1959
1960
        /* uint8_t pad[6]; */
1961
20
        proto_tree_add_item(act_tree, hf_openflow_v4_action_output_pad, tvb, offset, 6, ENC_NA);
1962
20
        offset+=6;
1963
1964
20
        break;
1965
1966
0
    case OFPAT_COPY_TTL_OUT:
1967
        /* uint8_t pad[4]; */
1968
0
        proto_tree_add_item(act_tree, hf_openflow_v4_action_copy_ttl_out_pad, tvb, offset, 4, ENC_NA);
1969
0
        offset+=4;
1970
0
        break;
1971
1972
0
    case OFPAT_COPY_TTL_IN:
1973
        /* uint8_t pad[4]; */
1974
0
        proto_tree_add_item(act_tree, hf_openflow_v4_action_copy_ttl_in_pad, tvb, offset, 4, ENC_NA);
1975
0
        offset+=4;
1976
0
        break;
1977
1978
0
    case OFPAT_SET_MPLS_TTL:
1979
        /* uint8_t mpls_ttl; */
1980
0
        proto_tree_add_item(act_tree, hf_openflow_v4_action_set_mpls_ttl_ttl, tvb, offset, 1, ENC_BIG_ENDIAN);
1981
0
        offset+=1;
1982
1983
        /* uint8_t pad[3]; */
1984
0
        proto_tree_add_item(act_tree, hf_openflow_v4_action_set_mpls_ttl_pad, tvb, offset, 3, ENC_NA);
1985
0
        offset+=3;
1986
0
        break;
1987
1988
0
    case OFPAT_DEC_MPLS_TTL:
1989
        /* uint8_t pad[4]; */
1990
0
        proto_tree_add_item(act_tree, hf_openflow_v4_action_dec_mpls_ttl_pad, tvb, offset, 4, ENC_NA);
1991
0
        offset+=4;
1992
0
        break;
1993
1994
0
    case OFPAT_PUSH_VLAN:
1995
        /* uint16_t ethertype; */
1996
0
        proto_tree_add_item(act_tree, hf_openflow_v4_action_push_vlan_ethertype, tvb, offset, 2, ENC_BIG_ENDIAN);
1997
0
        offset+=2;
1998
1999
        /* uint8_t pad[2]; */
2000
0
        proto_tree_add_item(act_tree, hf_openflow_v4_action_push_vlan_pad, tvb, offset, 2, ENC_NA);
2001
0
        offset+=2;
2002
0
        break;
2003
2004
0
    case OFPAT_POP_VLAN:
2005
        /* uint8_t pad[4]; */
2006
0
        proto_tree_add_item(act_tree, hf_openflow_v4_action_pop_vlan_pad, tvb, offset, 4, ENC_NA);
2007
0
        offset+=4;
2008
0
        break;
2009
2010
1
    case OFPAT_PUSH_MPLS:
2011
        /* uint16_t ethertype; */
2012
1
        proto_tree_add_item(act_tree, hf_openflow_v4_action_push_mpls_ethertype, tvb, offset, 2, ENC_BIG_ENDIAN);
2013
1
        offset+=2;
2014
2015
        /* uint8_t pad[2]; */
2016
1
        proto_tree_add_item(act_tree, hf_openflow_v4_action_push_mpls_pad, tvb, offset, 2, ENC_NA);
2017
1
        offset+=2;
2018
1
        break;
2019
2020
0
    case OFPAT_POP_MPLS:
2021
        /* uint16_t ethertype; */
2022
0
        proto_tree_add_item(act_tree, hf_openflow_v4_action_pop_mpls_ethertype, tvb, offset, 2, ENC_BIG_ENDIAN);
2023
0
        offset+=2;
2024
2025
        /* uint8_t pad[2]; */
2026
0
        proto_tree_add_item(act_tree, hf_openflow_v4_action_pop_mpls_pad, tvb, offset, 2, ENC_NA);
2027
0
        offset+=2;
2028
0
        break;
2029
2030
0
    case OFPAT_SET_QUEUE:
2031
        /* uint32_t queue_id; */
2032
0
        proto_tree_add_item(act_tree, hf_openflow_v4_action_set_queue_queue_id, tvb, offset, 4, ENC_BIG_ENDIAN);
2033
0
        offset+=4;
2034
0
        break;
2035
2036
1
    case OFPAT_GROUP:
2037
        /* uint32_t group_id; */
2038
1
        proto_tree_add_item(act_tree, hf_openflow_v4_action_group_group_id, tvb, offset, 4, ENC_BIG_ENDIAN);
2039
1
        offset+=4;
2040
1
        break;
2041
2042
0
    case OFPAT_SET_NW_TTL:
2043
        /* uint8_t nw_ttl; */
2044
0
        proto_tree_add_item(act_tree, hf_openflow_v4_action_set_nw_ttl_ttl, tvb, offset, 1, ENC_BIG_ENDIAN);
2045
0
        offset+=1;
2046
2047
        /* uint8_t pad[3]; */
2048
0
        proto_tree_add_item(act_tree, hf_openflow_v4_action_set_nw_ttl_pad, tvb, offset, 3, ENC_NA);
2049
0
        offset+=3;
2050
0
        break;
2051
2052
0
    case OFPAT_DEC_NW_TTL:
2053
        /* uint8_t pad[4]; */
2054
0
        proto_tree_add_item(act_tree, hf_openflow_v4_action_dec_nw_ttl_pad, tvb, offset, 4, ENC_NA);
2055
0
        offset+=4;
2056
0
        break;
2057
2058
0
    case OFPAT_SET_FIELD:
2059
0
        offset = dissect_openflow_oxm_v4(tvb, pinfo, act_tree, offset, length);
2060
2061
        /* padded to 64 bits */
2062
0
        if (offset < act_end) {
2063
0
            proto_tree_add_item(act_tree, hf_openflow_v4_action_set_field_pad, tvb, offset, act_end - offset, ENC_NA);
2064
0
            offset = act_end;
2065
0
        }
2066
0
        break;
2067
2068
0
    case OFPAT_PUSH_PBB:
2069
        /* uint16_t ethertype; */
2070
0
        proto_tree_add_item(act_tree, hf_openflow_v4_action_push_pbb_ethertype, tvb, offset, 2, ENC_BIG_ENDIAN);
2071
0
        offset+=2;
2072
2073
        /* uint8_t pad[2]; */
2074
0
        proto_tree_add_item(act_tree, hf_openflow_v4_action_push_pbb_pad, tvb, offset, 2, ENC_NA);
2075
0
        offset+=2;
2076
0
        break;
2077
2078
0
    case OFPAT_POP_PBB:
2079
        /* uint8_t pad[4]; */
2080
0
        proto_tree_add_item(act_tree, hf_openflow_v4_action_pop_pbb_pad, tvb, offset, 4, ENC_NA);
2081
0
        offset+=4;
2082
0
        break;
2083
2084
0
    case OFPAT_EXPERIMENTER:
2085
0
        proto_tree_add_expert_format(act_tree, pinfo, &ei_openflow_v4_action_undecoded,
2086
0
                                     tvb, offset, act_length - 8, "Experimenter action body.");
2087
0
        if (act_length > 8)
2088
0
            offset += act_length - 8;
2089
0
        break;
2090
2091
6
    default:
2092
6
        proto_tree_add_expert_format(act_tree, pinfo, &ei_openflow_v4_action_undecoded,
2093
6
                                     tvb, offset, act_length - 4, "Unknown action body.");
2094
6
        if (act_length > 4)
2095
1
            offset += act_length - 4;
2096
6
        break;
2097
28
    }
2098
2099
23
    return offset;
2100
28
}
2101
2102
2103
45
#define OFPPC_PORT_DOWN     1 << 0
2104
45
#define OFPPC_NO_RECV       1 << 2
2105
45
#define OFPPC_NO_FWD        1 << 5
2106
45
#define OFPPC_NO_PACKET_IN  1 << 6
2107
2108
15
#define OFPPS_LINK_DOWN  1 << 0
2109
15
#define OFPPS_BLOCKED    1 << 1
2110
15
#define OFPPS_LIVE       1 << 2
2111
2112
75
#define OFPPF_10MB_HD   1 << 0
2113
75
#define OFPPF_10MB_FD   1 << 1
2114
75
#define OFPPF_100MB_HD  1 << 2
2115
75
#define OFPPF_100MB_FD  1 << 3
2116
75
#define OFPPF_1GB_HD    1 << 4
2117
75
#define OFPPF_1GB_FD    1 << 5
2118
75
#define OFPPF_10GB_FD   1 << 6
2119
75
#define OFPPF_40GB_FD   1 << 7
2120
75
#define OFPPF_100GB_FD  1 << 8
2121
75
#define OFPPF_1TB_FD    1 << 9
2122
75
#define OFPPF_OTHER     1 << 10
2123
2124
75
#define OFPPF_COPPER      1 << 11
2125
75
#define OFPPF_FIBER       1 << 12
2126
75
#define OFPPF_AUTONEG     1 << 13
2127
75
#define OFPPF_PAUSE       1 << 14
2128
75
#define OFPPF_PAUSE_ASYM  1 << 15
2129
2130
0
#define OFP_ETH_ALEN            6
2131
0
#define OFP_MAX_PORT_NAME_LEN  16
2132
static int
2133
dissect_openflow_port_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
2134
0
{
2135
0
    proto_item *ti;
2136
0
    proto_tree *port_tree, *conf_tree, *state_tree, *curr_tree, *adv_tree, *supp_tree, *peer_tree;
2137
2138
0
    port_tree = proto_tree_add_subtree(tree, tvb, offset, 64, ett_openflow_v4_port, NULL, "Port");
2139
2140
    /* uint32_t port_no; */
2141
0
    proto_tree_add_item(port_tree, hf_openflow_v4_port_port_no, tvb, offset, 4, ENC_BIG_ENDIAN);
2142
0
    offset+=4;
2143
2144
    /* uint8_t pad[4]; */
2145
0
    proto_tree_add_item(port_tree, hf_openflow_v4_port_pad, tvb, offset, 4, ENC_NA);
2146
0
    offset+=4;
2147
2148
    /* uint8_t hw_addr[OFP_ETH_ALEN]; */
2149
0
    proto_tree_add_item(port_tree, hf_openflow_v4_port_hw_addr, tvb, offset, OFP_ETH_ALEN, ENC_NA);
2150
0
    offset+=OFP_ETH_ALEN;
2151
2152
    /* uint8_t pad2[2]; */
2153
0
    proto_tree_add_item(port_tree, hf_openflow_v4_port_pad2, tvb, offset, 2, ENC_NA);
2154
0
    offset+=2;
2155
2156
    /* char name[OFP_MAX_PORT_NAME_LEN]; Null-terminated */
2157
0
    proto_tree_add_item(port_tree, hf_openflow_v4_port_name, tvb, offset, OFP_MAX_PORT_NAME_LEN, ENC_ASCII);
2158
0
    offset+=OFP_MAX_PORT_NAME_LEN;
2159
2160
    /* uint32_t config; */
2161
0
    ti = proto_tree_add_item(port_tree, hf_openflow_v4_port_config, tvb, offset, 4, ENC_BIG_ENDIAN);
2162
0
    conf_tree = proto_item_add_subtree(ti, ett_openflow_v4_port_config);
2163
2164
0
    proto_tree_add_item(conf_tree, hf_openflow_v4_port_config_port_down, tvb, offset, 4, ENC_BIG_ENDIAN);
2165
0
    proto_tree_add_item(conf_tree, hf_openflow_v4_port_config_no_recv, tvb, offset, 4, ENC_BIG_ENDIAN);
2166
0
    proto_tree_add_item(conf_tree, hf_openflow_v4_port_config_no_fwd, tvb, offset, 4, ENC_BIG_ENDIAN);
2167
0
    proto_tree_add_item(conf_tree, hf_openflow_v4_port_config_no_packet_in, tvb, offset, 4, ENC_BIG_ENDIAN);
2168
0
    offset+=4;
2169
2170
    /* uint32_t state; */
2171
0
    ti = proto_tree_add_item(port_tree, hf_openflow_v4_port_state, tvb, offset, 4, ENC_BIG_ENDIAN);
2172
0
    state_tree = proto_item_add_subtree(ti, ett_openflow_v4_port_state);
2173
2174
0
    proto_tree_add_item(state_tree, hf_openflow_v4_port_state_link_down, tvb, offset, 4, ENC_BIG_ENDIAN);
2175
0
    proto_tree_add_item(state_tree, hf_openflow_v4_port_state_blocked, tvb, offset, 4, ENC_BIG_ENDIAN);
2176
0
    proto_tree_add_item(state_tree, hf_openflow_v4_port_state_live, tvb, offset, 4, ENC_BIG_ENDIAN);
2177
0
    offset+=4;
2178
2179
    /* uint32_t curr; */
2180
0
    ti = proto_tree_add_item(port_tree, hf_openflow_v4_port_current, tvb, offset, 4, ENC_BIG_ENDIAN);
2181
0
    curr_tree = proto_item_add_subtree(ti, ett_openflow_v4_port_current);
2182
2183
0
    proto_tree_add_item(curr_tree, hf_openflow_v4_port_current_10mb_hd, tvb, offset, 4, ENC_BIG_ENDIAN);
2184
0
    proto_tree_add_item(curr_tree, hf_openflow_v4_port_current_10mb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2185
0
    proto_tree_add_item(curr_tree, hf_openflow_v4_port_current_100mb_hd, tvb, offset, 4, ENC_BIG_ENDIAN);
2186
0
    proto_tree_add_item(curr_tree, hf_openflow_v4_port_current_100mb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2187
0
    proto_tree_add_item(curr_tree, hf_openflow_v4_port_current_1gb_hd, tvb, offset, 4, ENC_BIG_ENDIAN);
2188
0
    proto_tree_add_item(curr_tree, hf_openflow_v4_port_current_1gb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2189
0
    proto_tree_add_item(curr_tree, hf_openflow_v4_port_current_10gb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2190
0
    proto_tree_add_item(curr_tree, hf_openflow_v4_port_current_40gb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2191
0
    proto_tree_add_item(curr_tree, hf_openflow_v4_port_current_100gb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2192
0
    proto_tree_add_item(curr_tree, hf_openflow_v4_port_current_1tb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2193
0
    proto_tree_add_item(curr_tree, hf_openflow_v4_port_current_other, tvb, offset, 4, ENC_BIG_ENDIAN);
2194
0
    proto_tree_add_item(curr_tree, hf_openflow_v4_port_current_copper, tvb, offset, 4, ENC_BIG_ENDIAN);
2195
0
    proto_tree_add_item(curr_tree, hf_openflow_v4_port_current_fiber, tvb, offset, 4, ENC_BIG_ENDIAN);
2196
0
    proto_tree_add_item(curr_tree, hf_openflow_v4_port_current_autoneg, tvb, offset, 4, ENC_BIG_ENDIAN);
2197
0
    proto_tree_add_item(curr_tree, hf_openflow_v4_port_current_pause, tvb, offset, 4, ENC_BIG_ENDIAN);
2198
0
    proto_tree_add_item(curr_tree, hf_openflow_v4_port_current_pause_asym, tvb, offset, 4, ENC_BIG_ENDIAN);
2199
0
    offset+=4;
2200
2201
    /* uint32_t advertised; */
2202
0
    ti = proto_tree_add_item(port_tree, hf_openflow_v4_port_advertised, tvb, offset, 4, ENC_BIG_ENDIAN);
2203
0
    adv_tree = proto_item_add_subtree(ti, ett_openflow_v4_port_advertised);
2204
2205
0
    proto_tree_add_item(adv_tree, hf_openflow_v4_port_advertised_10mb_hd, tvb, offset, 4, ENC_BIG_ENDIAN);
2206
0
    proto_tree_add_item(adv_tree, hf_openflow_v4_port_advertised_10mb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2207
0
    proto_tree_add_item(adv_tree, hf_openflow_v4_port_advertised_100mb_hd, tvb, offset, 4, ENC_BIG_ENDIAN);
2208
0
    proto_tree_add_item(adv_tree, hf_openflow_v4_port_advertised_100mb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2209
0
    proto_tree_add_item(adv_tree, hf_openflow_v4_port_advertised_1gb_hd, tvb, offset, 4, ENC_BIG_ENDIAN);
2210
0
    proto_tree_add_item(adv_tree, hf_openflow_v4_port_advertised_1gb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2211
0
    proto_tree_add_item(adv_tree, hf_openflow_v4_port_advertised_10gb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2212
0
    proto_tree_add_item(adv_tree, hf_openflow_v4_port_advertised_40gb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2213
0
    proto_tree_add_item(adv_tree, hf_openflow_v4_port_advertised_100gb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2214
0
    proto_tree_add_item(adv_tree, hf_openflow_v4_port_advertised_1tb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2215
0
    proto_tree_add_item(adv_tree, hf_openflow_v4_port_advertised_other, tvb, offset, 4, ENC_BIG_ENDIAN);
2216
0
    proto_tree_add_item(adv_tree, hf_openflow_v4_port_advertised_copper, tvb, offset, 4, ENC_BIG_ENDIAN);
2217
0
    proto_tree_add_item(adv_tree, hf_openflow_v4_port_advertised_fiber, tvb, offset, 4, ENC_BIG_ENDIAN);
2218
0
    proto_tree_add_item(adv_tree, hf_openflow_v4_port_advertised_autoneg, tvb, offset, 4, ENC_BIG_ENDIAN);
2219
0
    proto_tree_add_item(adv_tree, hf_openflow_v4_port_advertised_pause, tvb, offset, 4, ENC_BIG_ENDIAN);
2220
0
    proto_tree_add_item(adv_tree, hf_openflow_v4_port_advertised_pause_asym, tvb, offset, 4, ENC_BIG_ENDIAN);
2221
0
    offset+=4;
2222
2223
    /* uint32_t supported; */
2224
0
    ti = proto_tree_add_item(port_tree, hf_openflow_v4_port_supported, tvb, offset, 4, ENC_BIG_ENDIAN);
2225
0
    supp_tree = proto_item_add_subtree(ti, ett_openflow_v4_port_supported);
2226
2227
0
    proto_tree_add_item(supp_tree, hf_openflow_v4_port_supported_10mb_hd, tvb, offset, 4, ENC_BIG_ENDIAN);
2228
0
    proto_tree_add_item(supp_tree, hf_openflow_v4_port_supported_10mb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2229
0
    proto_tree_add_item(supp_tree, hf_openflow_v4_port_supported_100mb_hd, tvb, offset, 4, ENC_BIG_ENDIAN);
2230
0
    proto_tree_add_item(supp_tree, hf_openflow_v4_port_supported_100mb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2231
0
    proto_tree_add_item(supp_tree, hf_openflow_v4_port_supported_1gb_hd, tvb, offset, 4, ENC_BIG_ENDIAN);
2232
0
    proto_tree_add_item(supp_tree, hf_openflow_v4_port_supported_1gb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2233
0
    proto_tree_add_item(supp_tree, hf_openflow_v4_port_supported_10gb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2234
0
    proto_tree_add_item(supp_tree, hf_openflow_v4_port_supported_40gb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2235
0
    proto_tree_add_item(supp_tree, hf_openflow_v4_port_supported_100gb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2236
0
    proto_tree_add_item(supp_tree, hf_openflow_v4_port_supported_1tb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2237
0
    proto_tree_add_item(supp_tree, hf_openflow_v4_port_supported_other, tvb, offset, 4, ENC_BIG_ENDIAN);
2238
0
    proto_tree_add_item(supp_tree, hf_openflow_v4_port_supported_copper, tvb, offset, 4, ENC_BIG_ENDIAN);
2239
0
    proto_tree_add_item(supp_tree, hf_openflow_v4_port_supported_fiber, tvb, offset, 4, ENC_BIG_ENDIAN);
2240
0
    proto_tree_add_item(supp_tree, hf_openflow_v4_port_supported_autoneg, tvb, offset, 4, ENC_BIG_ENDIAN);
2241
0
    proto_tree_add_item(supp_tree, hf_openflow_v4_port_supported_pause, tvb, offset, 4, ENC_BIG_ENDIAN);
2242
0
    proto_tree_add_item(supp_tree, hf_openflow_v4_port_supported_pause_asym, tvb, offset, 4, ENC_BIG_ENDIAN);
2243
0
    offset+=4;
2244
2245
    /* uint32_t peer; */
2246
0
    ti = proto_tree_add_item(port_tree, hf_openflow_v4_port_peer, tvb, offset, 4, ENC_BIG_ENDIAN);
2247
0
    peer_tree = proto_item_add_subtree(ti, ett_openflow_v4_port_peer);
2248
2249
0
    proto_tree_add_item(peer_tree, hf_openflow_v4_port_peer_10mb_hd, tvb, offset, 4, ENC_BIG_ENDIAN);
2250
0
    proto_tree_add_item(peer_tree, hf_openflow_v4_port_peer_10mb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2251
0
    proto_tree_add_item(peer_tree, hf_openflow_v4_port_peer_100mb_hd, tvb, offset, 4, ENC_BIG_ENDIAN);
2252
0
    proto_tree_add_item(peer_tree, hf_openflow_v4_port_peer_100mb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2253
0
    proto_tree_add_item(peer_tree, hf_openflow_v4_port_peer_1gb_hd, tvb, offset, 4, ENC_BIG_ENDIAN);
2254
0
    proto_tree_add_item(peer_tree, hf_openflow_v4_port_peer_1gb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2255
0
    proto_tree_add_item(peer_tree, hf_openflow_v4_port_peer_10gb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2256
0
    proto_tree_add_item(peer_tree, hf_openflow_v4_port_peer_40gb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2257
0
    proto_tree_add_item(peer_tree, hf_openflow_v4_port_peer_100gb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2258
0
    proto_tree_add_item(peer_tree, hf_openflow_v4_port_peer_1tb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2259
0
    proto_tree_add_item(peer_tree, hf_openflow_v4_port_peer_other, tvb, offset, 4, ENC_BIG_ENDIAN);
2260
0
    proto_tree_add_item(peer_tree, hf_openflow_v4_port_peer_copper, tvb, offset, 4, ENC_BIG_ENDIAN);
2261
0
    proto_tree_add_item(peer_tree, hf_openflow_v4_port_peer_fiber, tvb, offset, 4, ENC_BIG_ENDIAN);
2262
0
    proto_tree_add_item(peer_tree, hf_openflow_v4_port_peer_autoneg, tvb, offset, 4, ENC_BIG_ENDIAN);
2263
0
    proto_tree_add_item(peer_tree, hf_openflow_v4_port_peer_pause, tvb, offset, 4, ENC_BIG_ENDIAN);
2264
0
    proto_tree_add_item(peer_tree, hf_openflow_v4_port_peer_pause_asym, tvb, offset, 4, ENC_BIG_ENDIAN);
2265
0
    offset+=4;
2266
2267
    /* uint32_t curr_speed; */
2268
0
    proto_tree_add_item(port_tree, hf_openflow_v4_port_curr_speed, tvb, offset, 4, ENC_BIG_ENDIAN);
2269
0
    offset+=4;
2270
2271
    /* uint32_t max_speed; */
2272
0
    proto_tree_add_item(port_tree, hf_openflow_v4_port_max_speed, tvb, offset, 4, ENC_BIG_ENDIAN);
2273
0
    offset+=4;
2274
2275
0
    return offset;
2276
0
}
2277
2278
2279
2280
30
#define OFPPR_ADD     0
2281
30
#define OFPPR_DELETE  1
2282
30
#define OFPPR_MODIFY  2
2283
static const value_string openflow_v4_port_status_reason_values[] = {
2284
    { OFPPR_ADD,    "OFPPR_ADD" },
2285
    { OFPPR_DELETE, "OFPPR_DELETE" },
2286
    { OFPPR_MODIFY, "OFPPR_MODIFY" },
2287
    { 0,            NULL }
2288
};
2289
2290
static void
2291
dissect_openflow_port_status_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
2292
0
{
2293
    /* uint8_t reason; */
2294
0
    proto_tree_add_item(tree, hf_openflow_v4_port_status_reason, tvb, offset, 1, ENC_BIG_ENDIAN);
2295
0
    offset+=1;
2296
2297
    /* uint8_t pad[7]; */
2298
0
    proto_tree_add_item(tree, hf_openflow_v4_port_status_pad, tvb, offset, 7, ENC_NA);
2299
0
    offset+=7;
2300
2301
    /* struct ofp_port desc; */
2302
0
    dissect_openflow_port_v4(tvb, pinfo, tree, offset, length);
2303
0
}
2304
2305
2306
static void
2307
dissect_openflow_packet_out_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
2308
3
{
2309
3
    proto_tree *data_tree;
2310
3
    uint16_t acts_len;
2311
3
    int32_t acts_end;
2312
3
    tvbuff_t *next_tvb;
2313
3
    bool     save_writable;
2314
3
    bool save_in_error_pkt;
2315
3
    address save_dl_src, save_dl_dst, save_net_src, save_net_dst, save_src, save_dst;
2316
2317
    /* uint32_t buffer_id; */
2318
3
    proto_tree_add_item(tree, hf_openflow_v4_packet_out_buffer_id, tvb, offset, 4, ENC_BIG_ENDIAN);
2319
3
    offset+=4;
2320
2321
    /* uint32_t in_port; */
2322
3
    proto_tree_add_item(tree, hf_openflow_v4_packet_out_in_port, tvb, offset, 4, ENC_BIG_ENDIAN);
2323
3
    offset+=4;
2324
2325
    /* uint16_t actions_len; */
2326
3
    proto_tree_add_item_ret_uint16(tree, hf_openflow_v4_packet_out_acts_len, tvb, offset, 2, ENC_BIG_ENDIAN, &acts_len);
2327
3
    offset+=2;
2328
2329
    /* uint8_t pad[6]; */
2330
3
    proto_tree_add_item(tree, hf_openflow_v4_packet_out_pad, tvb, offset, 6, ENC_NA);
2331
3
    offset+=6;
2332
2333
    /* struct ofp_action_header actions[0]; */
2334
3
    acts_end = offset + acts_len;
2335
2336
18
    while (offset < acts_end) {
2337
15
        offset = dissect_openflow_action_v4(tvb, pinfo, tree, offset, length);
2338
15
    }
2339
2340
    /* uint8_t data[0]; */
2341
3
    if (offset < length) {
2342
0
        data_tree = proto_tree_add_subtree(tree, tvb, offset, length - offset, ett_openflow_v4_packet_out_data, NULL, "Data");
2343
2344
        /* save some state */
2345
0
        save_writable = col_get_writable(pinfo->cinfo, -1);
2346
0
        save_in_error_pkt = pinfo->flags.in_error_pkt;
2347
0
        copy_address_shallow(&save_dl_src, &pinfo->dl_src);
2348
0
        copy_address_shallow(&save_dl_dst, &pinfo->dl_dst);
2349
0
        copy_address_shallow(&save_net_src, &pinfo->net_src);
2350
0
        copy_address_shallow(&save_net_dst, &pinfo->net_dst);
2351
0
        copy_address_shallow(&save_src, &pinfo->src);
2352
0
        copy_address_shallow(&save_dst, &pinfo->dst);
2353
2354
        /* dissect data */
2355
0
        col_set_writable(pinfo->cinfo, -1, false);
2356
0
        next_tvb = tvb_new_subset_length(tvb, offset, length - offset);
2357
0
        call_dissector(eth_withoutfcs_handle, next_tvb, pinfo, data_tree);
2358
2359
        /* restore saved state */
2360
0
        col_set_writable(pinfo->cinfo, -1, save_writable);
2361
0
        pinfo->flags.in_error_pkt = save_in_error_pkt;
2362
0
        copy_address_shallow(&pinfo->dl_src, &save_dl_src);
2363
0
        copy_address_shallow(&pinfo->dl_dst, &save_dl_dst);
2364
0
        copy_address_shallow(&pinfo->net_src, &save_net_src);
2365
0
        copy_address_shallow(&pinfo->net_dst, &save_net_dst);
2366
0
        copy_address_shallow(&pinfo->src, &save_src);
2367
0
        copy_address_shallow(&pinfo->dst, &save_dst);
2368
0
    }
2369
3
}
2370
2371
2372
1
#define OFPIT_GOTO_TABLE      1       /* Setup the next table in the lookup */
2373
1
#define OFPIT_WRITE_METADATA  2       /* Setup the metadata field for use later in */
2374
0
#define OFPIT_WRITE_ACTIONS   3       /* Write the action(s) onto the datapath action */
2375
0
#define OFPIT_APPLY_ACTIONS   4       /* Applies the action(s) immediately */
2376
0
#define OFPIT_CLEAR_ACTIONS   5       /* Clears all actions from the datapath */
2377
0
#define OFPIT_METER           6       /* Apply meter (rate limiter) */
2378
335
#define OFPIT_EXPERIMENTER    0xFFFF  /* Experimenter instruction */
2379
static const value_string openflow_v4_instruction_type_values[] = {
2380
    { 0x0001, "OFPIT_GOTO_TABLE" },
2381
    { 0x0002, "OFPIT_WRITE_METADATA" },
2382
    { 0x0003, "OFPIT_WRITE_ACTIONS" },
2383
    { 0x0004, "OFPIT_APPLY_ACTIONS" },
2384
    { 0x0005, "OFPIT_CLEAR_ACTIONS" },
2385
    { 0x0006, "OFPIT_METER" },
2386
    { 0xffff, "OFPIT_EXPERIMENTER = 0xFFFF" },
2387
    { 0,      NULL }
2388
};
2389
2390
2391
2392
static int
2393
dissect_openflow_instruction_header_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
2394
334
{
2395
334
    uint16_t inst_type;
2396
2397
    /* uint16_t type; */
2398
334
    inst_type = tvb_get_ntohs(tvb, offset);
2399
334
    proto_tree_add_item(tree, hf_openflow_v4_instruction_type, tvb, offset, 2, ENC_BIG_ENDIAN);
2400
334
    offset+=2;
2401
2402
    /* uint16_t length; */
2403
334
    proto_tree_add_item(tree, hf_openflow_v4_instruction_length, tvb, offset, 2, ENC_BIG_ENDIAN);
2404
334
    offset+=2;
2405
2406
334
    if (inst_type == OFPIT_EXPERIMENTER) {
2407
        /* uint32_t experimenter; */
2408
27
        proto_tree_add_item(tree, hf_openflow_v4_instruction_experimenter_experimenter, tvb, offset, 4, ENC_BIG_ENDIAN);
2409
27
        offset+=4;
2410
27
    }
2411
2412
334
    return offset;
2413
334
}
2414
2415
2416
static int
2417
dissect_openflow_instruction_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
2418
18
{
2419
18
    proto_tree *inst_tree;
2420
18
    uint16_t inst_type;
2421
18
    uint16_t inst_length;
2422
18
    int32_t acts_end;
2423
2424
18
    inst_type = tvb_get_ntohs(tvb, offset);
2425
18
    inst_length = tvb_get_ntohs(tvb, offset + 2);
2426
2427
18
    if (inst_length < 8) {
2428
11
        inst_length = 8;
2429
11
    }
2430
2431
18
    inst_tree = proto_tree_add_subtree(tree, tvb, offset, inst_length, ett_openflow_v4_instruction, NULL, "Instruction");
2432
2433
18
    offset = dissect_openflow_instruction_header_v4(tvb, pinfo, inst_tree, offset, length);
2434
2435
18
    switch (inst_type) {
2436
1
    case OFPIT_GOTO_TABLE:
2437
        /* uint8_t table_id; */
2438
1
        proto_tree_add_item(inst_tree, hf_openflow_v4_instruction_goto_table_table_id, tvb, offset, 1, ENC_BIG_ENDIAN);
2439
1
        offset+=1;
2440
2441
        /* uint8_t pad[3]; */
2442
1
        proto_tree_add_item(inst_tree, hf_openflow_v4_instruction_goto_table_pad, tvb, offset, 3, ENC_NA);
2443
1
        offset+=3;
2444
1
        break;
2445
2446
1
    case OFPIT_WRITE_METADATA:
2447
        /* uint8_t pad[4]; */
2448
1
        proto_tree_add_item(inst_tree, hf_openflow_v4_instruction_write_metadata_pad, tvb, offset, 4, ENC_NA);
2449
1
        offset+=4;
2450
2451
        /* uint64_t metadata; */
2452
1
        proto_tree_add_item(inst_tree, hf_openflow_v4_instruction_write_metadata_value, tvb, offset, 8, ENC_BIG_ENDIAN);
2453
1
        offset+=8;
2454
2455
        /* uint64_t metadata_mask; */
2456
1
        proto_tree_add_item(inst_tree, hf_openflow_v4_instruction_write_metadata_mask, tvb, offset, 8, ENC_BIG_ENDIAN);
2457
1
        offset+=8;
2458
1
        break;
2459
2460
0
    case OFPIT_WRITE_ACTIONS:
2461
0
    case OFPIT_APPLY_ACTIONS:
2462
0
    case OFPIT_CLEAR_ACTIONS:
2463
0
        proto_tree_add_item(inst_tree, hf_openflow_v4_instruction_actions_pad, tvb, offset, 4, ENC_NA);
2464
0
        offset+=4;
2465
2466
0
        acts_end = offset + inst_length - 8;
2467
0
        while (offset < acts_end) {
2468
0
            offset = dissect_openflow_action_v4(tvb, pinfo, inst_tree, offset, length);
2469
0
        }
2470
0
        break;
2471
2472
0
    case OFPIT_METER:
2473
        /* uint32_t meter_id; */
2474
0
        proto_tree_add_item(inst_tree, hf_openflow_v4_instruction_meter_meter_id, tvb, offset, 4, ENC_BIG_ENDIAN);
2475
0
        offset+=4;
2476
0
        break;
2477
2478
1
    case OFPIT_EXPERIMENTER:
2479
1
        proto_tree_add_expert_format(inst_tree, pinfo, &ei_openflow_v4_instruction_undecoded,
2480
1
                                     tvb, offset, inst_length - 8, "Experimenter instruction body.");
2481
1
        offset += inst_length - 8;
2482
1
        break;
2483
2484
14
    default:
2485
14
        proto_tree_add_expert_format(inst_tree, pinfo, &ei_openflow_v4_instruction_undecoded,
2486
14
                                     tvb, offset, inst_length - 4, "Unknown instruction body.");
2487
14
        offset += inst_length - 4;
2488
14
        break;
2489
18
    }
2490
2491
12
    return offset;
2492
18
}
2493
2494
2495
static const value_string openflow_v4_flowmod_command_values[] = {
2496
    { 0, "OFPFC_ADD" },
2497
    { 1, "OFPFC_MODIFY" },
2498
    { 2, "OFPFC_MODIFY_STRICT" },
2499
    { 3, "OFPFC_DELETE" },
2500
    { 4, "OFPFC_DELETE_STRICT" },
2501
    { 0, NULL }
2502
};
2503
2504
30
#define OFPFF_SEND_FLOW_REM  1 << 0  /* Send flow removed message when flow expires or is deleted. */
2505
30
#define OFPFF_CHECK_OVERLAP  1 << 1  /* Check for overlapping entries first. */
2506
30
#define OFPFF_RESET_COUNTS   1 << 2  /* Reset flow packet and byte counts. */
2507
30
#define OFPFF_NO_PKT_COUNTS  1 << 3  /* Don't keep track of packet count. */
2508
30
#define OFPFF_NO_BYT_COUNTS  1 << 4  /* Don't keep track of byte count. */
2509
2510
static void
2511
dissect_openflow_flowmod_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length)
2512
12
{
2513
12
    proto_item *ti;
2514
12
    proto_tree *flags_tree;
2515
2516
    /* uint64_t cookie; */
2517
12
    proto_tree_add_item(tree, hf_openflow_v4_flowmod_cookie, tvb, offset, 8, ENC_BIG_ENDIAN);
2518
12
    offset+=8;
2519
2520
    /* uint64_t cookie_mask; */
2521
12
    proto_tree_add_item(tree, hf_openflow_v4_flowmod_cookie_mask, tvb, offset, 8, ENC_BIG_ENDIAN);
2522
12
    offset+=8;
2523
2524
    /* uint8_t table_id; */
2525
12
    proto_tree_add_item(tree, hf_openflow_v4_flowmod_table_id, tvb, offset, 1, ENC_BIG_ENDIAN);
2526
12
    offset+=1;
2527
2528
    /* uint8_t command; */
2529
12
    proto_tree_add_item(tree, hf_openflow_v4_flowmod_command, tvb, offset, 1, ENC_BIG_ENDIAN);
2530
12
    offset+=1;
2531
2532
    /* uint16_t idle_timeout; */
2533
12
    proto_tree_add_item(tree, hf_openflow_v4_flowmod_idle_timeout, tvb, offset, 2, ENC_BIG_ENDIAN);
2534
12
    offset+=2;
2535
2536
    /* uint16_t hard_timeout; */
2537
12
    proto_tree_add_item(tree, hf_openflow_v4_flowmod_hard_timeout, tvb, offset, 2, ENC_BIG_ENDIAN);
2538
12
    offset+=2;
2539
2540
    /* uint16_t priority; */
2541
12
    proto_tree_add_item(tree, hf_openflow_v4_flowmod_priority, tvb, offset, 2, ENC_BIG_ENDIAN);
2542
12
    offset+=2;
2543
2544
    /* uint32_t buffer_id; */
2545
12
    proto_tree_add_item(tree, hf_openflow_v4_flowmod_buffer_id, tvb, offset, 4, ENC_BIG_ENDIAN);
2546
12
    offset+=4;
2547
2548
    /* uint32_t out_port; */
2549
12
    proto_tree_add_item(tree, hf_openflow_v4_flowmod_out_port, tvb, offset, 4, ENC_BIG_ENDIAN);
2550
12
    offset+=4;
2551
2552
    /* uint32_t out_group; */
2553
12
    proto_tree_add_item(tree, hf_openflow_v4_flowmod_out_group, tvb, offset, 4, ENC_BIG_ENDIAN);
2554
12
    offset+=4;
2555
2556
    /* uint16_t flags; */
2557
12
    ti = proto_tree_add_item(tree, hf_openflow_v4_flowmod_flags, tvb, offset, 2, ENC_BIG_ENDIAN);
2558
12
    flags_tree = proto_item_add_subtree(ti, ett_openflow_v4_flowmod_flags);
2559
2560
12
    proto_tree_add_item(flags_tree, hf_openflow_v4_flowmod_flags_send_flow_rem, tvb, offset, 2, ENC_BIG_ENDIAN);
2561
12
    proto_tree_add_item(flags_tree, hf_openflow_v4_flowmod_flags_check_overlap, tvb, offset, 2, ENC_BIG_ENDIAN);
2562
12
    proto_tree_add_item(flags_tree, hf_openflow_v4_flowmod_flags_reset_counts,  tvb, offset, 2, ENC_BIG_ENDIAN);
2563
12
    proto_tree_add_item(flags_tree, hf_openflow_v4_flowmod_flags_no_packet_counts, tvb, offset, 2, ENC_BIG_ENDIAN);
2564
12
    proto_tree_add_item(flags_tree, hf_openflow_v4_flowmod_flags_no_byte_counts, tvb, offset, 2, ENC_BIG_ENDIAN);
2565
12
    offset+=2;
2566
2567
    /* uint8_t pad[2]; */
2568
12
    proto_tree_add_item(tree, hf_openflow_v4_flowmod_pad, tvb, offset, 2, ENC_NA);
2569
12
    offset+=2;
2570
2571
    /* struct ofp_match match; */
2572
12
    offset = dissect_openflow_match_v4(tvb, pinfo, tree, offset, length);
2573
2574
    /* struct ofp_instruction instructions[0]; */
2575
30
    while (offset < length) {
2576
18
        offset = dissect_openflow_instruction_v4(tvb, pinfo, tree, offset, length);
2577
18
    }
2578
12
}
2579
2580
static int
2581
dissect_openflow_bucket_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length)
2582
15
{
2583
15
    proto_item *ti;
2584
15
    proto_tree *bucket_tree;
2585
15
    uint16_t bucket_length;
2586
15
    int32_t acts_end;
2587
2588
15
    bucket_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_openflow_v4_bucket, &ti, "Bucket");
2589
2590
    /* uint16_t len; */
2591
15
    bucket_length = tvb_get_ntohs(tvb, offset);
2592
15
    proto_item_set_len(ti, bucket_length);
2593
15
    proto_tree_add_item(bucket_tree, hf_openflow_v4_bucket_length, tvb, offset, 2, ENC_BIG_ENDIAN);
2594
15
    offset+=2;
2595
2596
15
    if (bucket_length < 16) {
2597
11
        bucket_length = 16;
2598
11
    }
2599
2600
    /* uint16_t weight; */
2601
15
    proto_tree_add_item(bucket_tree, hf_openflow_v4_bucket_weight, tvb, offset, 2, ENC_BIG_ENDIAN);
2602
15
    offset+=2;
2603
2604
    /* uint32_t watch_port; */
2605
15
    proto_tree_add_item(bucket_tree, hf_openflow_v4_bucket_watch_port, tvb, offset, 4, ENC_BIG_ENDIAN);
2606
15
    offset+=4;
2607
2608
    /* uint32_t watch_group; */
2609
15
    proto_tree_add_item(bucket_tree, hf_openflow_v4_bucket_watch_group, tvb, offset, 4, ENC_BIG_ENDIAN);
2610
15
    offset+=4;
2611
2612
    /* uint8_t pad[4]; */
2613
15
    proto_tree_add_item(bucket_tree, hf_openflow_v4_bucket_pad, tvb, offset, 4, ENC_NA);
2614
15
    offset+=4;
2615
2616
    /*struct ofp_action_header actions[0]; */
2617
15
    acts_end = offset + bucket_length - 16;
2618
28
    while (offset < acts_end) {
2619
13
        offset = dissect_openflow_action_v4(tvb, pinfo, bucket_tree, offset, length);
2620
13
    }
2621
2622
15
    return offset;
2623
15
}
2624
2625
2626
static const value_string openflow_v4_groupmod_command_values[] = {
2627
    { 0, "OFPGC_ADD" },
2628
    { 1, "OFPGC_MODIFY" },
2629
    { 2, "OFPGC_DELETE" },
2630
    { 0, NULL }
2631
};
2632
2633
15
#define OFPGT_ALL       0
2634
15
#define OFPGT_SELECT    1
2635
15
#define OFPGT_INDIRECT  2
2636
15
#define OFPGT_FF        3
2637
static const value_string openflow_v4_group_type_values[] = {
2638
    { OFPGT_ALL,      "OFPGT_ALL" },
2639
    { OFPGT_SELECT,   "OFPGT_SELECT" },
2640
    { OFPGT_INDIRECT, "OFPGT_INDIRECT" },
2641
    { OFPGT_FF,       "OFPGT_FF" },
2642
    { 0,              NULL }
2643
};
2644
2645
static void
2646
dissect_openflow_groupmod_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length)
2647
0
{
2648
    /* uint16_t command; */
2649
0
    proto_tree_add_item(tree, hf_openflow_v4_groupmod_command, tvb, offset, 2, ENC_BIG_ENDIAN);
2650
0
    offset+=2;
2651
2652
    /* uint8_t type; */
2653
0
    proto_tree_add_item(tree, hf_openflow_v4_groupmod_type, tvb, offset, 1, ENC_BIG_ENDIAN);
2654
0
    offset+=1;
2655
2656
    /* uint8_t pad; */
2657
0
    proto_tree_add_item(tree, hf_openflow_v4_groupmod_pad, tvb, offset, 1, ENC_NA);
2658
0
    offset+=1;
2659
2660
    /* uint32_t group_id; */
2661
0
    proto_tree_add_item(tree, hf_openflow_v4_groupmod_group_id, tvb, offset, 4, ENC_BIG_ENDIAN);
2662
0
    offset+=4;
2663
2664
    /* struct ofp_bucket buckets[0]; */
2665
0
    while (offset < length) {
2666
0
        offset = dissect_openflow_bucket_v4(tvb, pinfo, tree, offset, length);
2667
0
    }
2668
0
}
2669
2670
2671
static void
2672
dissect_openflow_portmod_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
2673
0
{
2674
0
    proto_item *ti;
2675
0
    proto_tree *conf_tree, *mask_tree, *adv_tree;
2676
2677
    /* uint32_t port_no; */
2678
0
    proto_tree_add_item(tree, hf_openflow_v4_portmod_port_no, tvb, offset, 4, ENC_BIG_ENDIAN);
2679
0
    offset+=4;
2680
2681
    /* uint8_t pad[4]; */
2682
0
    proto_tree_add_item(tree, hf_openflow_v4_portmod_pad, tvb, offset, 4, ENC_NA);
2683
0
    offset+=4;
2684
2685
    /* uint8_t hw_addr[OFP_ETH_ALEN]; */
2686
0
    proto_tree_add_item(tree, hf_openflow_v4_portmod_hw_addr, tvb, offset, OFP_ETH_ALEN, ENC_NA);
2687
0
    offset+=OFP_ETH_ALEN;
2688
2689
    /* uint8_t pad2[2]; */
2690
0
    proto_tree_add_item(tree, hf_openflow_v4_portmod_pad2, tvb, offset, 2, ENC_NA);
2691
0
    offset+=2;
2692
2693
    /* uint32_t config; */
2694
0
    ti = proto_tree_add_item(tree, hf_openflow_v4_portmod_config, tvb, offset, 4, ENC_BIG_ENDIAN);
2695
0
    conf_tree = proto_item_add_subtree(ti, ett_openflow_v4_portmod_config);
2696
2697
0
    proto_tree_add_item(conf_tree, hf_openflow_v4_portmod_config_port_down, tvb, offset, 4, ENC_BIG_ENDIAN);
2698
0
    proto_tree_add_item(conf_tree, hf_openflow_v4_portmod_config_no_recv, tvb, offset, 4, ENC_BIG_ENDIAN);
2699
0
    proto_tree_add_item(conf_tree, hf_openflow_v4_portmod_config_no_fwd, tvb, offset, 4, ENC_BIG_ENDIAN);
2700
0
    proto_tree_add_item(conf_tree, hf_openflow_v4_portmod_config_no_packet_in, tvb, offset, 4, ENC_BIG_ENDIAN);
2701
0
    offset+=4;
2702
2703
    /* uint32_t mask; */
2704
0
    ti = proto_tree_add_item(tree, hf_openflow_v4_portmod_mask, tvb, offset, 4, ENC_BIG_ENDIAN);
2705
0
    mask_tree = proto_item_add_subtree(ti, ett_openflow_v4_portmod_mask);
2706
2707
0
    proto_tree_add_item(mask_tree, hf_openflow_v4_portmod_mask_port_down, tvb, offset, 4, ENC_BIG_ENDIAN);
2708
0
    proto_tree_add_item(mask_tree, hf_openflow_v4_portmod_mask_no_recv, tvb, offset, 4, ENC_BIG_ENDIAN);
2709
0
    proto_tree_add_item(mask_tree, hf_openflow_v4_portmod_mask_no_fwd, tvb, offset, 4, ENC_BIG_ENDIAN);
2710
0
    proto_tree_add_item(mask_tree, hf_openflow_v4_portmod_mask_no_packet_in, tvb, offset, 4, ENC_BIG_ENDIAN);
2711
0
    offset+=4;
2712
2713
    /* uint32_t advertise; */
2714
0
    ti = proto_tree_add_item(tree, hf_openflow_v4_portmod_advertise, tvb, offset, 4, ENC_BIG_ENDIAN);
2715
0
    adv_tree = proto_item_add_subtree(ti, ett_openflow_v4_portmod_advertise);
2716
2717
0
    proto_tree_add_item(adv_tree, hf_openflow_v4_portmod_advertise_10mb_hd, tvb, offset, 4, ENC_BIG_ENDIAN);
2718
0
    proto_tree_add_item(adv_tree, hf_openflow_v4_portmod_advertise_10mb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2719
0
    proto_tree_add_item(adv_tree, hf_openflow_v4_portmod_advertise_100mb_hd, tvb, offset, 4, ENC_BIG_ENDIAN);
2720
0
    proto_tree_add_item(adv_tree, hf_openflow_v4_portmod_advertise_100mb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2721
0
    proto_tree_add_item(adv_tree, hf_openflow_v4_portmod_advertise_1gb_hd, tvb, offset, 4, ENC_BIG_ENDIAN);
2722
0
    proto_tree_add_item(adv_tree, hf_openflow_v4_portmod_advertise_1gb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2723
0
    proto_tree_add_item(adv_tree, hf_openflow_v4_portmod_advertise_10gb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2724
0
    proto_tree_add_item(adv_tree, hf_openflow_v4_portmod_advertise_40gb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2725
0
    proto_tree_add_item(adv_tree, hf_openflow_v4_portmod_advertise_100gb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2726
0
    proto_tree_add_item(adv_tree, hf_openflow_v4_portmod_advertise_1tb_fd, tvb, offset, 4, ENC_BIG_ENDIAN);
2727
0
    proto_tree_add_item(adv_tree, hf_openflow_v4_portmod_advertise_other, tvb, offset, 4, ENC_BIG_ENDIAN);
2728
0
    proto_tree_add_item(adv_tree, hf_openflow_v4_portmod_advertise_copper, tvb, offset, 4, ENC_BIG_ENDIAN);
2729
0
    proto_tree_add_item(adv_tree, hf_openflow_v4_portmod_advertise_fiber, tvb, offset, 4, ENC_BIG_ENDIAN);
2730
0
    proto_tree_add_item(adv_tree, hf_openflow_v4_portmod_advertise_autoneg, tvb, offset, 4, ENC_BIG_ENDIAN);
2731
0
    proto_tree_add_item(adv_tree, hf_openflow_v4_portmod_advertise_pause, tvb, offset, 4, ENC_BIG_ENDIAN);
2732
0
    proto_tree_add_item(adv_tree, hf_openflow_v4_portmod_advertise_pause_asym, tvb, offset, 4, ENC_BIG_ENDIAN);
2733
0
    offset+=4;
2734
2735
    /* uint8_t pad3[4]; */
2736
0
    proto_tree_add_item(tree, hf_openflow_v4_portmod_pad3, tvb, offset, 4, ENC_NA);
2737
    /*offset+=4;*/
2738
0
}
2739
2740
2741
static void
2742
dissect_openflow_tablemod_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
2743
0
{
2744
    /* uint8_t table_id; */
2745
0
    proto_tree_add_item(tree, hf_openflow_v4_tablemod_table_id, tvb, offset, 1, ENC_BIG_ENDIAN);
2746
0
    offset+=1;
2747
2748
    /* uint8_t pad[3]; */
2749
0
    proto_tree_add_item(tree, hf_openflow_v4_tablemod_pad, tvb, offset, 3, ENC_NA);
2750
0
    offset+=3;
2751
2752
    /* uint32_t config; */
2753
0
    proto_tree_add_item(tree, hf_openflow_v4_tablemod_config, tvb, offset, 4, ENC_NA);
2754
    /*offset+=4;*/
2755
0
}
2756
2757
2758
static void
2759
dissect_openflow_flow_stats_request_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length)
2760
0
{
2761
2762
    /* uint8_t table_id; */
2763
0
    proto_tree_add_item(tree, hf_openflow_v4_flow_stats_request_table_id, tvb, offset, 1, ENC_BIG_ENDIAN);
2764
0
    offset+=1;
2765
2766
    /* uint8_t pad[3]; */
2767
0
    proto_tree_add_item(tree, hf_openflow_v4_flow_stats_request_pad, tvb, offset, 3, ENC_NA);
2768
0
    offset+=3;
2769
2770
    /* uint32_t out_port; */
2771
0
    proto_tree_add_item(tree, hf_openflow_v4_flow_stats_request_out_port, tvb, offset, 4, ENC_BIG_ENDIAN);
2772
0
    offset+=4;
2773
2774
    /* uint32_t out_group; */
2775
0
    proto_tree_add_item(tree, hf_openflow_v4_flow_stats_request_out_group, tvb, offset, 4, ENC_BIG_ENDIAN);
2776
0
    offset+=4;
2777
2778
    /* uint8_t pad2[4]; */
2779
0
    proto_tree_add_item(tree, hf_openflow_v4_flow_stats_request_pad2, tvb, offset, 4, ENC_NA);
2780
0
    offset+=4;
2781
2782
    /* uint64_t cookie; */
2783
0
    proto_tree_add_item(tree, hf_openflow_v4_flow_stats_request_cookie, tvb, offset, 8, ENC_BIG_ENDIAN);
2784
0
    offset+=8;
2785
2786
    /* uint64_t cookie_mask; */
2787
0
    proto_tree_add_item(tree, hf_openflow_v4_flow_stats_request_cookie_mask, tvb, offset, 8, ENC_BIG_ENDIAN);
2788
0
    offset+=8;
2789
2790
    /* struct ofp_match match; */
2791
0
    dissect_openflow_match_v4(tvb, pinfo, tree, offset, length);
2792
0
}
2793
2794
static void
2795
dissect_openflow_aggregate_stats_request_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length)
2796
0
{
2797
    /* uint8_t table_id; */
2798
0
    proto_tree_add_item(tree, hf_openflow_v4_aggregate_stats_request_table_id, tvb, offset, 1, ENC_BIG_ENDIAN);
2799
0
    offset+=1;
2800
2801
    /* uint8_t pad[3]; */
2802
0
    proto_tree_add_item(tree, hf_openflow_v4_aggregate_stats_request_pad, tvb, offset, 3, ENC_NA);
2803
0
    offset+=3;
2804
2805
    /* uint32_t out_port; */
2806
0
    proto_tree_add_item(tree, hf_openflow_v4_aggregate_stats_request_out_port, tvb, offset, 4, ENC_BIG_ENDIAN);
2807
0
    offset+=4;
2808
2809
    /* uint32_t out_group; */
2810
0
    proto_tree_add_item(tree, hf_openflow_v4_aggregate_stats_request_out_group, tvb, offset, 4, ENC_BIG_ENDIAN);
2811
0
    offset+=4;
2812
2813
    /* uint8_t pad2[4]; */
2814
0
    proto_tree_add_item(tree, hf_openflow_v4_aggregate_stats_request_pad2, tvb, offset, 4, ENC_NA);
2815
0
    offset+=4;
2816
2817
    /* uint64_t cookie; */
2818
0
    proto_tree_add_item(tree, hf_openflow_v4_aggregate_stats_request_cookie, tvb, offset, 8, ENC_BIG_ENDIAN);
2819
0
    offset+=8;
2820
2821
    /* uint64_t cookie_mask; */
2822
0
    proto_tree_add_item(tree, hf_openflow_v4_aggregate_stats_request_cookie_mask, tvb, offset, 8, ENC_BIG_ENDIAN);
2823
0
    offset+=8;
2824
2825
    /* struct ofp_match match; */
2826
0
    dissect_openflow_match_v4(tvb, pinfo, tree, offset, length);
2827
0
}
2828
2829
2830
13
#define OFPTFPT_INSTRUCTIONS          0
2831
14
#define OFPTFPT_INSTRUCTIONS_MISS     1
2832
2
#define OFPTFPT_NEXT_TABLES           2
2833
2
#define OFPTFPT_NEXT_TABLES_MISS      3
2834
1
#define OFPTFPT_WRITE_ACTIONS         4
2835
1
#define OFPTFPT_WRITE_ACTIONS_MISS    5
2836
1
#define OFPTFPT_APPLY_ACTIONS         6
2837
1
#define OFPTFPT_APPLY_ACTIONS_MISS    7
2838
0
#define OFPTFPT_MATCH                 8
2839
0
#define OFPTFPT_WILDCARDS            10
2840
0
#define OFPTFPT_WRITE_SETFIELD       12
2841
0
#define OFPTFPT_WRITE_SETFIELD_MISS  13
2842
0
#define OFPTFPT_APPLY_SETFIELD       14
2843
0
#define OFPTFPT_APPLY_SETFIELD_MISS  15
2844
0
#define OFPTFPT_EXPERIMENTER         0xFFFE
2845
0
#define OFPTFPT_EXPERIMENTER_MISS    0xFFFF
2846
static const value_string openflow_v4_table_feature_prop_type_values[] = {
2847
    { OFPTFPT_INSTRUCTIONS,        "OFPTFPT_INSTRUCTIONS" },
2848
    { OFPTFPT_INSTRUCTIONS_MISS,   "OFPTFPT_INSTRUCTIONS_MISS" },
2849
    { OFPTFPT_NEXT_TABLES,         "OFPTFPT_NEXT_TABLES" },
2850
    { OFPTFPT_NEXT_TABLES_MISS,    "OFPTFPT_NEXT_TABLES_MISS" },
2851
    { OFPTFPT_WRITE_ACTIONS,       "OFPTFPT_WRITE_ACTIONS" },
2852
    { OFPTFPT_WRITE_ACTIONS_MISS,  "OFPTFPT_WRITE_ACTIONS_MISS" },
2853
    { OFPTFPT_APPLY_ACTIONS,       "OFPTFPT_APPLY_ACTIONS" },
2854
    { OFPTFPT_APPLY_ACTIONS_MISS,  "OFPTFPT_APPLY_ACTIONS_MISS" },
2855
    { OFPTFPT_MATCH,               "OFPTFPT_MATCH" },
2856
    { OFPTFPT_WILDCARDS,           "OFPTFPT_WILDCARDS" },
2857
    { OFPTFPT_WRITE_SETFIELD,      "OFPTFPT_WRITE_SETFIELD" },
2858
    { OFPTFPT_WRITE_SETFIELD_MISS, "OFPTFPT_WRITE_SETFIELD_MISS" },
2859
    { OFPTFPT_APPLY_SETFIELD,      "OFPTFPT_APPLY_SETFIELD" },
2860
    { OFPTFPT_APPLY_SETFIELD_MISS, "OFPTFPT_APPLY_SETFIELD_MISS" },
2861
    { OFPTFPT_EXPERIMENTER,        "OFPTFPT_EXPERIMENTER" },
2862
    { OFPTFPT_EXPERIMENTER_MISS,   "OFPTFPT_EXPERIMENTER_MISS" },
2863
    { 0,                           NULL }
2864
};
2865
2866
2867
static int
2868
dissect_openflow_table_feature_prop_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length)
2869
102
{
2870
102
    proto_item *ti;
2871
102
    proto_tree *prop_tree, *elem_tree;
2872
102
    uint16_t prop_type;
2873
102
    uint16_t prop_length;
2874
102
    uint16_t elem_begin;
2875
102
    int32_t body_end;
2876
102
    uint16_t pad_length;
2877
2878
102
    prop_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_openflow_v4_table_feature_prop, &ti, "Table feature property");
2879
2880
    /* uint16_t type; */
2881
102
    proto_tree_add_item_ret_uint16(prop_tree, hf_openflow_v4_table_feature_prop_type, tvb, offset, 2, ENC_BIG_ENDIAN, &prop_type);
2882
102
    offset+=2;
2883
2884
    /* uint16_t length; */
2885
102
    prop_length = tvb_get_ntohs(tvb, offset);
2886
102
    proto_item_set_len(ti, prop_length);
2887
102
    proto_tree_add_item(prop_tree, hf_openflow_v4_table_feature_prop_length, tvb, offset, 2, ENC_BIG_ENDIAN);
2888
102
    offset+=2;
2889
2890
102
    if (prop_length < 4)
2891
71
        return offset;
2892
2893
31
    body_end = offset + prop_length - 4;
2894
2895
    /* body */
2896
31
    switch (prop_type) {
2897
13
    case OFPTFPT_INSTRUCTIONS:
2898
14
    case OFPTFPT_INSTRUCTIONS_MISS:
2899
332
        while (offset < body_end) {
2900
318
            elem_begin = offset;
2901
318
            elem_tree = proto_tree_add_subtree(prop_tree, tvb, offset, -1,
2902
318
                        ett_openflow_v4_table_feature_prop_instruction_id, &ti, "Instruction ID");
2903
2904
318
            offset = dissect_openflow_instruction_header_v4(tvb, pinfo, elem_tree, offset, length);
2905
318
            proto_item_set_len(ti, offset - elem_begin);
2906
318
        }
2907
14
        break;
2908
2909
2
    case OFPTFPT_NEXT_TABLES:
2910
2
    case OFPTFPT_NEXT_TABLES_MISS:
2911
519
        while (offset < body_end) {
2912
517
            proto_tree_add_item(prop_tree, hf_openflow_v4_table_feature_prop_next_tables_next_table_id, tvb, offset, 1, ENC_BIG_ENDIAN);
2913
517
            offset+=1;
2914
517
        }
2915
2
        break;
2916
2917
1
    case OFPTFPT_WRITE_ACTIONS:
2918
1
    case OFPTFPT_WRITE_ACTIONS_MISS:
2919
1
    case OFPTFPT_APPLY_ACTIONS:
2920
1
    case OFPTFPT_APPLY_ACTIONS_MISS:
2921
17
        while (offset < body_end) {
2922
16
            elem_begin = offset;
2923
16
            elem_tree = proto_tree_add_subtree(prop_tree, tvb, offset, -1, ett_openflow_v4_table_feature_prop_action_id, &ti, "Action ID");
2924
2925
16
            offset = dissect_openflow_action_header_v4(tvb, pinfo, elem_tree, offset, length);
2926
16
            proto_item_set_len(ti, offset - elem_begin);
2927
16
        }
2928
1
        break;
2929
2930
0
    case OFPTFPT_MATCH:
2931
0
    case OFPTFPT_WILDCARDS:
2932
0
    case OFPTFPT_WRITE_SETFIELD:
2933
0
    case OFPTFPT_WRITE_SETFIELD_MISS:
2934
0
    case OFPTFPT_APPLY_SETFIELD:
2935
0
    case OFPTFPT_APPLY_SETFIELD_MISS:
2936
0
        while (offset < body_end) {
2937
0
            elem_begin = offset;
2938
0
            elem_tree = proto_tree_add_subtree(prop_tree, tvb, offset, -1, ett_openflow_v4_table_feature_prop_oxm_id, &ti, "OXM ID");
2939
2940
0
            offset = dissect_openflow_oxm_header_v4(tvb, pinfo, elem_tree, offset, length);
2941
0
            proto_item_set_len(ti, offset - elem_begin);
2942
0
        }
2943
0
        break;
2944
2945
0
    case OFPTFPT_EXPERIMENTER:
2946
0
    case OFPTFPT_EXPERIMENTER_MISS:
2947
        /* uint32_t experimenter; */
2948
0
        proto_tree_add_item(prop_tree, hf_openflow_v4_table_feature_prop_experimenter_experimenter, tvb, offset, 4, ENC_BIG_ENDIAN);
2949
0
        offset+=4;
2950
2951
        /* uint32_t exp_type; */
2952
0
        proto_tree_add_item(prop_tree, hf_openflow_v4_table_feature_prop_experimenter_exp_type, tvb, offset, 4, ENC_BIG_ENDIAN);
2953
0
        offset+=4;
2954
2955
        /* uint32_t experimenter_data[0]; */
2956
0
        proto_tree_add_expert_format(prop_tree, pinfo, &ei_openflow_v4_table_feature_prop_undecoded,
2957
0
                                     tvb, offset, body_end - offset, "Experimenter table property body.");
2958
0
        offset = body_end;
2959
0
        break;
2960
2961
14
    default:
2962
14
        proto_tree_add_expert_format(prop_tree, pinfo, &ei_openflow_v4_table_feature_prop_undecoded,
2963
14
                                     tvb, offset, body_end - offset, "Unknown table property body.");
2964
14
        offset = body_end;
2965
14
        break;
2966
31
    };
2967
2968
16
    pad_length = (prop_length + 7)/8*8 - prop_length;
2969
16
    if (pad_length > 0) {
2970
12
        proto_tree_add_item(prop_tree, hf_openflow_v4_table_feature_prop_pad, tvb, offset, pad_length, ENC_NA);
2971
12
        offset+=pad_length;
2972
12
    }
2973
2974
16
    return offset;
2975
31
}
2976
2977
2978
76
#define OFP_MAX_TABLE_NAME_LEN  32
2979
static int
2980
dissect_openflow_table_features_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length)
2981
38
{
2982
38
    proto_item *ti;
2983
38
    proto_tree *feat_tree;
2984
38
    uint16_t feat_length;
2985
38
    int32_t feat_end;
2986
2987
38
    feat_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_openflow_v4_table_features, &ti, "Table features");
2988
2989
    /* uint16_t length; */
2990
38
    feat_length = tvb_get_ntohs(tvb, offset);
2991
38
    feat_end = offset + feat_length;
2992
38
    proto_item_set_len(ti, feat_length);
2993
38
    proto_tree_add_item(feat_tree, hf_openflow_v4_table_features_length, tvb, offset, 2, ENC_BIG_ENDIAN);
2994
38
    offset+=2;
2995
2996
    /* uint8_t table_id; */
2997
38
    proto_tree_add_item(feat_tree, hf_openflow_v4_table_features_table_id, tvb, offset, 1, ENC_BIG_ENDIAN);
2998
38
    offset+=1;
2999
3000
    /* uint8_t pad[5]; */
3001
38
    proto_tree_add_item(feat_tree, hf_openflow_v4_table_features_pad, tvb, offset, 5, ENC_NA);
3002
38
    offset+=5;
3003
3004
    /* char name[OFP_MAX_TABLE_NAME_LEN]; */
3005
38
    proto_tree_add_item(feat_tree, hf_openflow_v4_table_features_name, tvb, offset, OFP_MAX_TABLE_NAME_LEN, ENC_ASCII);
3006
38
    offset+=OFP_MAX_TABLE_NAME_LEN;
3007
3008
    /* uint64_t metadata_match; */
3009
38
    proto_tree_add_item(feat_tree, hf_openflow_v4_table_features_metadata_match, tvb, offset, 8, ENC_BIG_ENDIAN);
3010
38
    offset+=8;
3011
3012
    /* uint64_t metadata_write; */
3013
38
    proto_tree_add_item(feat_tree, hf_openflow_v4_table_features_metadata_write, tvb, offset, 8, ENC_BIG_ENDIAN);
3014
38
    offset+=8;
3015
3016
    /* uint32_t config; */
3017
38
    proto_tree_add_item(feat_tree, hf_openflow_v4_table_features_config, tvb, offset, 4, ENC_NA);
3018
38
    offset+=4;
3019
3020
    /* uint32_t max_entries; */
3021
38
    proto_tree_add_item(feat_tree, hf_openflow_v4_table_features_max_entries, tvb, offset, 4, ENC_BIG_ENDIAN);
3022
38
    offset+=4;
3023
3024
    /* struct ofp_table_feature_prop_header properties[0]; */
3025
140
    while (offset < feat_end) {
3026
102
        offset = dissect_openflow_table_feature_prop_v4(tvb, pinfo, feat_tree, offset, length);
3027
102
    }
3028
3029
38
    return offset;
3030
38
}
3031
3032
3033
static void
3034
dissect_openflow_port_stats_request_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
3035
0
{
3036
    /* uint32_t port_no; */
3037
0
    proto_tree_add_item(tree, hf_openflow_v4_port_stats_request_port_no, tvb, offset, 4, ENC_BIG_ENDIAN);
3038
0
    offset+=4;
3039
3040
    /* uint8_t pad[4]; */
3041
0
    proto_tree_add_item(tree, hf_openflow_v4_port_stats_request_pad, tvb, offset, 4, ENC_NA);
3042
    /*offset+=4;*/
3043
0
}
3044
3045
#define OFPQ_ALL  0xffffffff
3046
static const value_string openflow_v4_queue_reserved_values[] = {
3047
    { OFPQ_ALL, "OFPQ_ALL" },
3048
    { 0,        NULL }
3049
};
3050
3051
static void
3052
dissect_openflow_queue_stats_request_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
3053
0
{
3054
    /* uint32_t port_no; */
3055
0
    proto_tree_add_item(tree, hf_openflow_v4_queue_stats_request_port_no, tvb, offset, 4, ENC_BIG_ENDIAN);
3056
0
    offset+=4;
3057
3058
    /* uint32_t queue_id; */
3059
0
    proto_tree_add_item(tree, hf_openflow_v4_queue_stats_request_queue_id, tvb, offset, 4, ENC_BIG_ENDIAN);
3060
    /*offset+=4;*/
3061
0
}
3062
3063
3064
static void
3065
dissect_openflow_group_stats_request_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
3066
0
{
3067
    /* uint32_t group_id; */
3068
0
    proto_tree_add_item(tree, hf_openflow_v4_group_stats_request_group_id, tvb, offset, 4, ENC_BIG_ENDIAN);
3069
0
    offset+=4;
3070
3071
    /* uint8_t pad[4]; */
3072
0
    proto_tree_add_item(tree, hf_openflow_v4_group_stats_request_pad, tvb, offset, 4, ENC_NA);
3073
    /*offset+=4;*/
3074
0
}
3075
3076
3077
static void
3078
dissect_openflow_meter_stats_request_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
3079
0
{
3080
    /* uint32_t meter_id; */
3081
0
    proto_tree_add_item(tree, hf_openflow_v4_meter_stats_request_meter_id, tvb, offset, 4, ENC_BIG_ENDIAN);
3082
0
    offset+=4;
3083
3084
    /* uint8_t pad[4]; */
3085
0
    proto_tree_add_item(tree, hf_openflow_v4_meter_stats_request_pad, tvb, offset, 4, ENC_NA);
3086
    /*offset+=4;*/
3087
0
}
3088
3089
3090
static void
3091
dissect_openflow_meter_config_request_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
3092
0
{
3093
    /* uint32_t meter_id; */
3094
0
    proto_tree_add_item(tree, hf_openflow_v4_meter_config_request_meter_id, tvb, offset, 4, ENC_BIG_ENDIAN);
3095
0
    offset+=4;
3096
3097
    /* uint8_t pad[4]; */
3098
0
    proto_tree_add_item(tree, hf_openflow_v4_meter_config_request_pad, tvb, offset, 4, ENC_NA);
3099
    /*offset+=4;*/
3100
0
}
3101
3102
3103
1
#define OFPMP_DESC             0
3104
0
#define OFPMP_FLOW             1
3105
0
#define OFPMP_AGGREGATE        2
3106
0
#define OFPMP_TABLE            3
3107
0
#define OFPMP_PORT_STATS       4
3108
1
#define OFPMP_QUEUE            5
3109
4
#define OFPMP_GROUP            6
3110
4
#define OFPMP_GROUP_DESC       7
3111
0
#define OFPMP_GROUP_FEATURES   8
3112
0
#define OFPMP_METER            9
3113
3
#define OFPMP_METER_CONFIG    10
3114
0
#define OFPMP_METER_FEATURES  11
3115
19
#define OFPMP_TABLE_FEATURES  12
3116
0
#define OFPMP_PORT_DESC       13
3117
1
#define OFPMP_EXPERIMENTER    0xffff
3118
static const value_string openflow_v4_multipart_type_values[] = {
3119
    { OFPMP_DESC,           "OFPMP_DESC" },
3120
    { OFPMP_FLOW,           "OFPMP_FLOW" },
3121
    { OFPMP_AGGREGATE,      "OFPMP_AGGREGATE" },
3122
    { OFPMP_TABLE,          "OFPMP_TABLE" },
3123
    { OFPMP_PORT_STATS,     "OFPMP_PORT_STATS" },
3124
    { OFPMP_QUEUE,          "OFPMP_QUEUE" },
3125
    { OFPMP_GROUP,          "OFPMP_GROUP" },
3126
    { OFPMP_GROUP_DESC,     "OFPMP_GROUP_DESC" },
3127
    { OFPMP_GROUP_FEATURES, "OFPMP_GROUP_FEATURES" },
3128
    { OFPMP_METER,          "OFPMP_METER" },
3129
    { OFPMP_METER_CONFIG,   "OFPMP_METER_CONFIG" },
3130
    { OFPMP_METER_FEATURES, "OFPMP_METER_FEATURES" },
3131
    { OFPMP_TABLE_FEATURES, "OFPMP_TABLE_FEATURES" },
3132
    { OFPMP_PORT_DESC,      "OFPMP_PORT_DESC" },
3133
    { OFPMP_EXPERIMENTER,   "OFPMP_EXPERIMENTER" },
3134
    { 0, NULL }
3135
};
3136
3137
15
#define OFPMPF_REQ_MORE  1 << 0
3138
static void
3139
dissect_openflow_multipart_request_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length)
3140
16
{
3141
16
    proto_item *ti;
3142
16
    proto_tree *flags_tree;
3143
16
    uint16_t type;
3144
3145
    /* uint16_t type; */
3146
16
    proto_tree_add_item_ret_uint16(tree, hf_openflow_v4_multipart_request_type , tvb, offset, 2, ENC_BIG_ENDIAN, &type);
3147
16
    offset+=2;
3148
3149
16
    col_append_fstr(pinfo->cinfo, COL_INFO, ", %s",
3150
16
                  val_to_str_const(type, openflow_v4_multipart_type_values, "Unknown type"));
3151
3152
    /* uint16_t flags; */
3153
16
    ti = proto_tree_add_item(tree, hf_openflow_v4_multipart_request_flags, tvb, offset, 2, ENC_BIG_ENDIAN);
3154
16
    flags_tree = proto_item_add_subtree(ti, ett_openflow_v4_multipart_request_flags);
3155
3156
16
    proto_tree_add_item(flags_tree, hf_openflow_v4_multipart_request_flags_more, tvb, offset, 2, ENC_BIG_ENDIAN);
3157
16
    offset+=2;
3158
3159
    /* uint8_t pad[4]; */
3160
16
    proto_tree_add_item(tree, hf_openflow_v4_multipart_request_pad, tvb, offset, 4, ENC_NA);
3161
16
    offset+=4;
3162
3163
    /* uint8_t body[0]; */
3164
16
    switch(type){
3165
0
    case OFPMP_DESC:
3166
        /* The request body is empty. */
3167
0
        break;
3168
0
    case OFPMP_FLOW:
3169
0
        dissect_openflow_flow_stats_request_v4(tvb, pinfo, tree, offset, length);
3170
0
        break;
3171
0
    case OFPMP_AGGREGATE:
3172
0
        dissect_openflow_aggregate_stats_request_v4(tvb, pinfo, tree, offset, length);
3173
0
        break;
3174
0
    case OFPMP_TABLE:
3175
         /* The request body is empty. */
3176
0
        break;
3177
0
    case OFPMP_PORT_STATS:
3178
0
        dissect_openflow_port_stats_request_v4(tvb, pinfo, tree, offset, length);
3179
0
        break;
3180
0
    case OFPMP_QUEUE:
3181
0
        dissect_openflow_queue_stats_request_v4(tvb, pinfo, tree, offset, length);
3182
0
        break;
3183
0
    case OFPMP_GROUP:
3184
0
        dissect_openflow_group_stats_request_v4(tvb, pinfo, tree, offset, length);
3185
0
        break;
3186
1
    case OFPMP_GROUP_DESC:
3187
        /* The request body is empty. */
3188
1
        break;
3189
0
    case OFPMP_GROUP_FEATURES:
3190
        /* The request body is empty. */
3191
0
        break;
3192
0
    case OFPMP_METER:
3193
0
        dissect_openflow_meter_stats_request_v4(tvb, pinfo, tree, offset, length);
3194
0
        break;
3195
0
    case OFPMP_METER_CONFIG:
3196
0
        dissect_openflow_meter_config_request_v4(tvb, pinfo, tree, offset, length);
3197
0
        break;
3198
0
    case OFPMP_METER_FEATURES:
3199
        /* The request body is empty. */
3200
0
        break;
3201
13
    case OFPMP_TABLE_FEATURES:
3202
43
        while (offset < length) {
3203
30
            offset = dissect_openflow_table_features_v4(tvb, pinfo, tree, offset, length);
3204
30
        }
3205
13
        break;
3206
0
    case OFPMP_PORT_DESC:
3207
        /* The request body is empty. */
3208
0
        break;
3209
1
    case OFPMP_EXPERIMENTER:
3210
        /* uint32_t experimenter; */
3211
1
        proto_tree_add_item(tree, hf_openflow_v4_multipart_request_experimenter_experimenter, tvb, offset, 4, ENC_BIG_ENDIAN);
3212
1
        offset+=4;
3213
3214
        /* uint32_t exp_type; */
3215
1
        proto_tree_add_item(tree, hf_openflow_v4_multipart_request_experimenter_exp_type, tvb, offset, 4, ENC_BIG_ENDIAN);
3216
1
        offset+=4;
3217
3218
        /* uint32_t experimenter_data[0]; */
3219
1
        if (offset < length) {
3220
1
            proto_tree_add_expert_format(tree, pinfo, &ei_openflow_v4_multipart_request_undecoded,
3221
1
                                         tvb, offset, length - offset, "Experimenter multipart request body.");
3222
1
        }
3223
1
        break;
3224
1
    default:
3225
1
        proto_tree_add_expert_format(tree, pinfo, &ei_openflow_v4_multipart_request_undecoded,
3226
1
                                     tvb, offset, length - offset, "Unknown multipart request body.");
3227
1
        break;
3228
16
    }
3229
16
}
3230
3231
3232
7
#define DESC_STR_LEN    256
3233
2
#define SERIAL_NUM_LEN  32
3234
static void
3235
dissect_openflow_switch_description_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
3236
1
{
3237
    /* char mfr_desc[DESC_STR_LEN]; */
3238
1
    proto_tree_add_item(tree, hf_openflow_v4_switch_description_mfr_desc, tvb, offset, DESC_STR_LEN, ENC_ASCII);
3239
1
    offset+=DESC_STR_LEN;
3240
3241
    /* char hw_desc[DESC_STR_LEN]; */
3242
1
    proto_tree_add_item(tree, hf_openflow_v4_switch_description_hw_desc, tvb, offset, DESC_STR_LEN, ENC_ASCII);
3243
1
    offset+=DESC_STR_LEN;
3244
3245
    /* char sw_desc[DESC_STR_LEN]; */
3246
1
    proto_tree_add_item(tree, hf_openflow_v4_switch_description_sw_desc, tvb, offset, DESC_STR_LEN, ENC_ASCII);
3247
1
    offset+=DESC_STR_LEN;
3248
3249
    /* char serial_num[SERIAL_NUM_LEN]; */
3250
1
    proto_tree_add_item(tree, hf_openflow_v4_switch_description_serial_num, tvb, offset, SERIAL_NUM_LEN, ENC_ASCII);
3251
1
    offset+=SERIAL_NUM_LEN;
3252
3253
    /* char dp_desc[DESC_STR_LEN]; */
3254
1
    proto_tree_add_item(tree, hf_openflow_v4_switch_description_dp_desc, tvb, offset, DESC_STR_LEN, ENC_ASCII);
3255
    /*offset+=DESC_STR_LEN;*/
3256
1
}
3257
3258
3259
static int
3260
dissect_openflow_flow_stats_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
3261
0
{
3262
0
    proto_item *ti;
3263
0
    proto_tree *stats_tree, *flags_tree;
3264
0
    uint16_t stats_len;
3265
0
    int32_t stats_end;
3266
3267
0
    stats_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_openflow_v4_flow_stats, &ti, "Flow stats");
3268
3269
    /* uint16_t length; */
3270
0
    stats_len = tvb_get_ntohs(tvb, offset);
3271
0
    stats_end = offset + stats_len;
3272
0
    proto_item_set_len(ti, stats_len);
3273
0
    proto_tree_add_item(stats_tree, hf_openflow_v4_flow_stats_length, tvb, offset, 2, ENC_BIG_ENDIAN);
3274
0
    offset+=2;
3275
3276
    /* uint8_t table_id; */
3277
0
    proto_tree_add_item(stats_tree, hf_openflow_v4_flow_stats_table_id, tvb, offset, 1, ENC_BIG_ENDIAN);
3278
0
    offset+=1;
3279
3280
    /* uint8_t pad; */
3281
0
    proto_tree_add_item(stats_tree, hf_openflow_v4_flow_stats_pad, tvb, offset, 1, ENC_NA);
3282
0
    offset+=1;
3283
3284
    /* uint32_t duration_sec; */
3285
0
    proto_tree_add_item(stats_tree, hf_openflow_v4_flow_stats_duration_sec, tvb, offset, 4, ENC_BIG_ENDIAN);
3286
0
    offset+=4;
3287
3288
    /* uint32_t duration_nsec; */
3289
0
    proto_tree_add_item(stats_tree, hf_openflow_v4_flow_stats_duration_nsec, tvb, offset, 4, ENC_BIG_ENDIAN);
3290
0
    offset+=4;
3291
3292
    /* uint16_t priority; */
3293
0
    proto_tree_add_item(stats_tree, hf_openflow_v4_flow_stats_priority, tvb, offset, 2, ENC_BIG_ENDIAN);
3294
0
    offset+=2;
3295
3296
    /* uint16_t idle_timeout; */
3297
0
    proto_tree_add_item(stats_tree, hf_openflow_v4_flow_stats_idle_timeout, tvb, offset, 2, ENC_BIG_ENDIAN);
3298
0
    offset+=2;
3299
3300
    /* uint16_t hard_timeout; */
3301
0
    proto_tree_add_item(stats_tree, hf_openflow_v4_flow_stats_hard_timeout, tvb, offset, 2, ENC_BIG_ENDIAN);
3302
0
    offset+=2;
3303
3304
    /* uint16_t flags; */
3305
0
    ti = proto_tree_add_item(stats_tree, hf_openflow_v4_flow_stats_flags, tvb, offset, 2, ENC_BIG_ENDIAN);
3306
0
    flags_tree = proto_item_add_subtree(ti, ett_openflow_v4_flow_stats_flags);
3307
3308
0
    proto_tree_add_item(flags_tree, hf_openflow_v4_flow_stats_flags_send_flow_rem, tvb, offset, 2, ENC_BIG_ENDIAN);
3309
0
    proto_tree_add_item(flags_tree, hf_openflow_v4_flow_stats_flags_check_overlap, tvb, offset, 2, ENC_BIG_ENDIAN);
3310
0
    proto_tree_add_item(flags_tree, hf_openflow_v4_flow_stats_flags_reset_counts,  tvb, offset, 2, ENC_BIG_ENDIAN);
3311
0
    proto_tree_add_item(flags_tree, hf_openflow_v4_flow_stats_flags_no_packet_counts, tvb, offset, 2, ENC_BIG_ENDIAN);
3312
0
    proto_tree_add_item(flags_tree, hf_openflow_v4_flow_stats_flags_no_byte_counts, tvb, offset, 2, ENC_BIG_ENDIAN);
3313
0
    offset+=2;
3314
3315
    /* uint8_t pad2[4]; */
3316
0
    proto_tree_add_item(stats_tree, hf_openflow_v4_flow_stats_pad2, tvb, offset, 4, ENC_NA);
3317
0
    offset+=4;
3318
3319
    /* uint64_t cookie; */
3320
0
    proto_tree_add_item(stats_tree, hf_openflow_v4_flow_stats_cookie, tvb, offset, 8, ENC_BIG_ENDIAN);
3321
0
    offset+=8;
3322
3323
    /* uint64_t packet_count; */
3324
0
    proto_tree_add_item(stats_tree, hf_openflow_v4_flow_stats_packet_count, tvb, offset, 8, ENC_BIG_ENDIAN);
3325
0
    offset+=8;
3326
3327
    /* uint64_t byte_count; */
3328
0
    proto_tree_add_item(stats_tree, hf_openflow_v4_flow_stats_byte_count, tvb, offset, 8, ENC_BIG_ENDIAN);
3329
0
    offset+=8;
3330
3331
    /* struct ofp_match match; */
3332
0
    offset = dissect_openflow_match_v4(tvb, pinfo, stats_tree, offset, length);
3333
3334
    /* struct ofp_instruction instructions[0]; */
3335
0
    while (offset < stats_end) {
3336
0
        offset = dissect_openflow_instruction_v4(tvb, pinfo, stats_tree, offset, length);
3337
0
    }
3338
3339
0
    return offset;
3340
0
}
3341
3342
3343
static void
3344
dissect_openflow_aggregate_stats_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
3345
0
{
3346
    /* uint64_t packet_count; */
3347
0
    proto_tree_add_item(tree, hf_openflow_v4_aggregate_stats_packet_count, tvb, offset, 8, ENC_BIG_ENDIAN);
3348
0
    offset+=8;
3349
3350
    /* uint64_t byte_count; */
3351
0
    proto_tree_add_item(tree, hf_openflow_v4_aggregate_stats_byte_count, tvb, offset, 8, ENC_BIG_ENDIAN);
3352
0
    offset+=8;
3353
3354
    /* uint32_t flow_count; */
3355
0
    proto_tree_add_item(tree, hf_openflow_v4_aggregate_stats_flow_count, tvb, offset, 4, ENC_BIG_ENDIAN);
3356
0
    offset+=4;
3357
3358
    /* uint8_t pad[4]; */
3359
0
    proto_tree_add_item(tree, hf_openflow_v4_aggregate_stats_pad, tvb, offset, 4, ENC_NA);
3360
    /*offset+=4;*/
3361
0
}
3362
3363
3364
static int
3365
dissect_openflow_table_stats_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
3366
0
{
3367
0
    proto_tree *stats_tree;
3368
3369
0
    stats_tree = proto_tree_add_subtree(tree, tvb, offset, 24, ett_openflow_v4_table_stats, NULL, "Table stats");
3370
3371
    /* uint8_t table_id; */
3372
0
    proto_tree_add_item(stats_tree, hf_openflow_v4_table_stats_table_id, tvb, offset, 1, ENC_BIG_ENDIAN);
3373
0
    offset+=1;
3374
3375
    /* uint8_t pad[3]; */
3376
0
    proto_tree_add_item(stats_tree, hf_openflow_v4_table_stats_pad, tvb, offset, 3, ENC_NA);
3377
0
    offset+=3;
3378
3379
    /* uint32_t active_count; */
3380
0
    proto_tree_add_item(stats_tree, hf_openflow_v4_table_stats_active_count, tvb, offset, 4, ENC_BIG_ENDIAN);
3381
0
    offset+=4;
3382
3383
    /* uint64_t lookup_count; */
3384
0
    proto_tree_add_item(stats_tree, hf_openflow_v4_table_stats_lookup_count, tvb, offset, 8, ENC_BIG_ENDIAN);
3385
0
    offset+=8;
3386
3387
    /* uint64_t matched_count; */
3388
0
    proto_tree_add_item(stats_tree, hf_openflow_v4_table_stats_match_count, tvb, offset, 8, ENC_BIG_ENDIAN);
3389
0
    offset+=8;
3390
3391
0
    return offset;
3392
0
}
3393
3394
3395
static int
3396
dissect_openflow_port_stats_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
3397
0
{
3398
0
    proto_tree *stats_tree;
3399
3400
0
    stats_tree = proto_tree_add_subtree(tree, tvb, offset, 112, ett_openflow_v4_port_stats, NULL, "Port stats");
3401
3402
    /* uint8_t port_no; */
3403
0
    proto_tree_add_item(stats_tree, hf_openflow_v4_port_stats_port_no, tvb, offset, 4, ENC_BIG_ENDIAN);
3404
0
    offset+=4;
3405
3406
    /* uint8_t pad[4]; */
3407
0
    proto_tree_add_item(stats_tree, hf_openflow_v4_port_stats_pad, tvb, offset, 4, ENC_NA);
3408
0
    offset+=4;
3409
3410
    /* uint64_t rx_packets; */
3411
0
    proto_tree_add_item(stats_tree, hf_openflow_v4_port_stats_rx_packets, tvb, offset, 8, ENC_BIG_ENDIAN);
3412
0
    offset+=8;
3413
3414
    /* uint64_t tx_packets; */
3415
0
    proto_tree_add_item(stats_tree, hf_openflow_v4_port_stats_tx_packets, tvb, offset, 8, ENC_BIG_ENDIAN);
3416
0
    offset+=8;
3417
3418
    /* uint64_t rx_bytes; */
3419
0
    proto_tree_add_item(stats_tree, hf_openflow_v4_port_stats_rx_bytes, tvb, offset, 8, ENC_BIG_ENDIAN);
3420
0
    offset+=8;
3421
3422
    /* uint64_t tx_bytes; */
3423
0
    proto_tree_add_item(stats_tree, hf_openflow_v4_port_stats_tx_bytes, tvb, offset, 8, ENC_BIG_ENDIAN);
3424
0
    offset+=8;
3425
3426
    /* uint64_t rx_dropped; */
3427
0
    proto_tree_add_item(stats_tree, hf_openflow_v4_port_stats_rx_dropped, tvb, offset, 8, ENC_BIG_ENDIAN);
3428
0
    offset+=8;
3429
3430
    /* uint64_t tx_dropped; */
3431
0
    proto_tree_add_item(stats_tree, hf_openflow_v4_port_stats_tx_dropped, tvb, offset, 8, ENC_BIG_ENDIAN);
3432
0
    offset+=8;
3433
3434
    /* uint64_t rx_errors; */
3435
0
    proto_tree_add_item(stats_tree, hf_openflow_v4_port_stats_rx_errors, tvb, offset, 8, ENC_BIG_ENDIAN);
3436
0
    offset+=8;
3437
3438
    /* uint64_t tx_errors; */
3439
0
    proto_tree_add_item(stats_tree, hf_openflow_v4_port_stats_tx_errors, tvb, offset, 8, ENC_BIG_ENDIAN);
3440
0
    offset+=8;
3441
3442
    /* uint64_t rx_frame_error; */
3443
0
    proto_tree_add_item(stats_tree, hf_openflow_v4_port_stats_rx_frame_error, tvb, offset, 8, ENC_BIG_ENDIAN);
3444
0
    offset+=8;
3445
3446
    /* uint64_t rx_over_error; */
3447
0
    proto_tree_add_item(stats_tree, hf_openflow_v4_port_stats_rx_over_error, tvb, offset, 8, ENC_BIG_ENDIAN);
3448
0
    offset+=8;
3449
3450
    /* uint64_t rx_crc_error; */
3451
0
    proto_tree_add_item(stats_tree, hf_openflow_v4_port_stats_rx_crc_error, tvb, offset, 8, ENC_BIG_ENDIAN);
3452
0
    offset+=8;
3453
3454
    /* uint64_t collisions; */
3455
0
    proto_tree_add_item(stats_tree, hf_openflow_v4_port_stats_collisions, tvb, offset, 8, ENC_BIG_ENDIAN);
3456
0
    offset+=8;
3457
3458
    /* uint32_t duration_sec; */
3459
0
    proto_tree_add_item(stats_tree, hf_openflow_v4_port_stats_duration_sec, tvb, offset, 4, ENC_BIG_ENDIAN);
3460
0
    offset+=4;
3461
3462
    /* uint32_t duration_nsec; */
3463
0
    proto_tree_add_item(stats_tree, hf_openflow_v4_port_stats_duration_nsec, tvb, offset, 4, ENC_BIG_ENDIAN);
3464
0
    offset+=4;
3465
3466
0
    return offset;
3467
0
}
3468
3469
3470
static int
3471
dissect_openflow_queue_stats_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
3472
2
{
3473
2
    proto_tree *stats_tree;
3474
3475
2
    stats_tree = proto_tree_add_subtree(tree, tvb, offset, 40, ett_openflow_v4_queue_stats, NULL, "Queue stats");
3476
3477
    /* uint32_t port_no; */
3478
2
    proto_tree_add_item(stats_tree, hf_openflow_v4_queue_stats_port_no, tvb, offset, 4, ENC_BIG_ENDIAN);
3479
2
    offset+=4;
3480
3481
    /* uint32_t queue_id; */
3482
2
    proto_tree_add_item(stats_tree, hf_openflow_v4_queue_stats_queue_id, tvb, offset, 4, ENC_BIG_ENDIAN);
3483
2
    offset+=4;
3484
3485
    /* uint64_t tx_bytes; */
3486
2
    proto_tree_add_item(stats_tree, hf_openflow_v4_queue_stats_tx_bytes, tvb, offset, 8, ENC_BIG_ENDIAN);
3487
2
    offset+=8;
3488
3489
    /* uint64_t tx_packets; */
3490
2
    proto_tree_add_item(stats_tree, hf_openflow_v4_queue_stats_tx_packets, tvb, offset, 8, ENC_BIG_ENDIAN);
3491
2
    offset+=8;
3492
3493
    /* uint64_t tx_errors; */
3494
2
    proto_tree_add_item(stats_tree, hf_openflow_v4_queue_stats_tx_errors, tvb, offset, 8, ENC_BIG_ENDIAN);
3495
2
    offset+=8;
3496
3497
    /* uint32_t duration_sec; */
3498
2
    proto_tree_add_item(stats_tree, hf_openflow_v4_queue_stats_duration_sec, tvb, offset, 4, ENC_BIG_ENDIAN);
3499
2
    offset+=4;
3500
3501
    /* uint32_t duration_nsec; */
3502
2
    proto_tree_add_item(stats_tree, hf_openflow_v4_queue_stats_duration_nsec, tvb, offset, 4, ENC_BIG_ENDIAN);
3503
2
    offset+=4;
3504
3505
2
    return offset;
3506
2
}
3507
3508
3509
static int
3510
dissect_openflow_bucket_counter_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
3511
51
{
3512
51
    proto_tree *counter_tree;
3513
3514
51
    counter_tree = proto_tree_add_subtree(tree, tvb, offset, 16, ett_openflow_v4_bucket_counter, NULL, "Bucket counter");
3515
3516
    /* uint64_t packet_count; */
3517
51
    proto_tree_add_item(counter_tree, hf_openflow_v4_bucket_counter_packet_count, tvb, offset, 8, ENC_BIG_ENDIAN);
3518
51
    offset+=8;
3519
3520
    /* uint64_t byte_count; */
3521
51
    proto_tree_add_item(counter_tree, hf_openflow_v4_bucket_counter_byte_count, tvb, offset, 8, ENC_BIG_ENDIAN);
3522
51
    offset+=8;
3523
3524
51
    return offset;
3525
51
}
3526
3527
3528
static int
3529
dissect_openflow_group_stats_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
3530
4
{
3531
4
    proto_item *ti;
3532
4
    proto_tree *stats_tree;
3533
4
    uint16_t stats_len;
3534
4
    int32_t stats_end;
3535
3536
4
    stats_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_openflow_v4_group_stats, &ti, "Group stats");
3537
3538
    /* uint16_t length; */
3539
4
    stats_len = tvb_get_ntohs(tvb, offset);
3540
4
    stats_end = offset + stats_len;
3541
4
    proto_item_set_len(ti, stats_len);
3542
4
    proto_tree_add_item(stats_tree, hf_openflow_v4_group_stats_length, tvb, offset, 2, ENC_BIG_ENDIAN);
3543
4
    offset+=2;
3544
3545
    /* uint8_t pad[2]; */
3546
4
    proto_tree_add_item(stats_tree, hf_openflow_v4_group_stats_pad, tvb, offset, 2, ENC_NA);
3547
4
    offset+=2;
3548
3549
    /* uint32_t group_id; */
3550
4
    proto_tree_add_item(stats_tree, hf_openflow_v4_group_stats_group_id, tvb, offset, 4, ENC_BIG_ENDIAN);
3551
4
    offset+=4;
3552
3553
    /* uint32_t ref_count; */
3554
4
    proto_tree_add_item(stats_tree, hf_openflow_v4_group_stats_ref_count, tvb, offset, 4, ENC_BIG_ENDIAN);
3555
4
    offset+=4;
3556
3557
    /* uint8_t pad2[4]; */
3558
4
    proto_tree_add_item(stats_tree, hf_openflow_v4_group_stats_pad2, tvb, offset, 4, ENC_NA);
3559
4
    offset+=4;
3560
3561
    /* uint64_t packet_count; */
3562
4
    proto_tree_add_item(stats_tree, hf_openflow_v4_group_stats_packet_count, tvb, offset, 8, ENC_BIG_ENDIAN);
3563
4
    offset+=8;
3564
3565
    /* uint64_t byte_count; */
3566
4
    proto_tree_add_item(stats_tree, hf_openflow_v4_group_stats_byte_count, tvb, offset, 8, ENC_BIG_ENDIAN);
3567
4
    offset+=8;
3568
3569
    /* uint32_t duration_sec; */
3570
4
    proto_tree_add_item(stats_tree, hf_openflow_v4_flow_stats_duration_sec, tvb, offset, 4, ENC_BIG_ENDIAN);
3571
4
    offset+=4;
3572
3573
    /* uint32_t duration_nsec; */
3574
4
    proto_tree_add_item(stats_tree, hf_openflow_v4_flow_stats_duration_nsec, tvb, offset, 4, ENC_BIG_ENDIAN);
3575
4
    offset+=4;
3576
3577
    /* struct ofp_bucket_counter bucket_stats[0]; */
3578
55
    while (offset < stats_end) {
3579
51
        offset = dissect_openflow_bucket_counter_v4(tvb, pinfo, stats_tree, offset, length);
3580
51
    }
3581
3582
4
    return offset;
3583
4
}
3584
3585
static int
3586
dissect_openflow_group_desc_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length)
3587
5
{
3588
5
    proto_item *ti;
3589
5
    proto_tree *desc_tree;
3590
3591
5
    uint16_t desc_len;
3592
5
    int32_t desc_end;
3593
3594
5
    desc_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_openflow_v4_group_desc, &ti, "Group description");
3595
3596
    /* uint16_t length; */
3597
5
    desc_len = tvb_get_ntohs(tvb, offset);
3598
5
    desc_end = offset + desc_len;
3599
5
    proto_item_set_len(ti, desc_len);
3600
5
    proto_tree_add_item(desc_tree, hf_openflow_v4_group_desc_length, tvb, offset, 2, ENC_BIG_ENDIAN);
3601
5
    offset+=2;
3602
3603
    /* uint8_t type; */
3604
5
    proto_tree_add_item(desc_tree, hf_openflow_v4_group_desc_type, tvb, offset, 1, ENC_BIG_ENDIAN);
3605
5
    offset+=1;
3606
3607
    /* uint8_t pad; */
3608
5
    proto_tree_add_item(desc_tree, hf_openflow_v4_group_desc_pad, tvb, offset, 1, ENC_NA);
3609
5
    offset+=1;
3610
3611
    /* uint32_t group_id; */
3612
5
    proto_tree_add_item(desc_tree, hf_openflow_v4_group_desc_group_id, tvb, offset, 4, ENC_BIG_ENDIAN);
3613
5
    offset+=4;
3614
3615
    /* struct ofp_bucket buckets[0]; */
3616
20
    while (offset < desc_end) {
3617
15
        offset = dissect_openflow_bucket_v4(tvb, pinfo, desc_tree, offset, length);
3618
15
    }
3619
3620
5
    return offset;
3621
5
}
3622
3623
3624
15
#define OFPGFC_SELECT_WEIGHT    1 << 0
3625
15
#define OFPGFC_SELECT_LIVENESS  1 << 1
3626
15
#define OFPGFC_CHAINING         1 << 2
3627
15
#define OFPGFC_CHAINING_CHECKS  1 << 3
3628
static void
3629
dissect_openflow_group_features_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
3630
0
{
3631
0
    proto_item *ti;
3632
0
    proto_tree *types_tree, *caps_tree, *acts_tree;
3633
3634
    /* uint32_t types; */
3635
0
    ti = proto_tree_add_item(tree, hf_openflow_v4_group_features_types, tvb, offset, 4, ENC_BIG_ENDIAN);
3636
0
    types_tree = proto_item_add_subtree(ti, ett_openflow_v4_group_features_types);
3637
3638
0
    proto_tree_add_item(types_tree, hf_openflow_v4_group_features_types_all, tvb, offset, 4, ENC_BIG_ENDIAN);
3639
0
    proto_tree_add_item(types_tree, hf_openflow_v4_group_features_types_select, tvb, offset, 4, ENC_BIG_ENDIAN);
3640
0
    proto_tree_add_item(types_tree, hf_openflow_v4_group_features_types_indirect, tvb, offset, 4, ENC_BIG_ENDIAN);
3641
0
    proto_tree_add_item(types_tree, hf_openflow_v4_group_features_types_ff, tvb, offset, 4, ENC_BIG_ENDIAN);
3642
0
    offset+=4;
3643
3644
    /* uint32_t capabilities; */
3645
0
    ti = proto_tree_add_item(tree, hf_openflow_v4_group_features_capabilities, tvb, offset, 4, ENC_BIG_ENDIAN);
3646
0
    caps_tree = proto_item_add_subtree(ti, ett_openflow_v4_group_features_capabilities);
3647
3648
0
    proto_tree_add_item(caps_tree, hf_openflow_v4_group_features_capabilities_select_weight, tvb, offset, 4, ENC_BIG_ENDIAN);
3649
0
    proto_tree_add_item(caps_tree, hf_openflow_v4_group_features_capabilities_select_liveness, tvb, offset, 4, ENC_BIG_ENDIAN);
3650
0
    proto_tree_add_item(caps_tree, hf_openflow_v4_group_features_capabilities_chaining, tvb, offset, 4, ENC_BIG_ENDIAN);
3651
0
    proto_tree_add_item(caps_tree, hf_openflow_v4_group_features_capabilities_chaining_checks, tvb, offset, 4, ENC_BIG_ENDIAN);
3652
0
    offset+=4;
3653
3654
    /* max_groups[4]; */
3655
0
    proto_tree_add_item(tree, hf_openflow_v4_group_features_max_groups_all, tvb, offset, 4, ENC_BIG_ENDIAN);
3656
0
    offset+=4;
3657
0
    proto_tree_add_item(tree, hf_openflow_v4_group_features_max_groups_select, tvb, offset, 4, ENC_BIG_ENDIAN);
3658
0
    offset+=4;
3659
0
    proto_tree_add_item(tree, hf_openflow_v4_group_features_max_groups_indirect, tvb, offset, 4, ENC_BIG_ENDIAN);
3660
0
    offset+=4;
3661
0
    proto_tree_add_item(tree, hf_openflow_v4_group_features_max_groups_ff, tvb, offset, 4, ENC_BIG_ENDIAN);
3662
0
    offset+=4;
3663
3664
    /* uint32_t actions[4]; */
3665
0
    ti = proto_tree_add_item(tree, hf_openflow_v4_group_features_actions_all, tvb, offset, 4, ENC_BIG_ENDIAN);
3666
0
    acts_tree = proto_item_add_subtree(ti, ett_openflow_v4_group_features_actions_all);
3667
3668
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_all_output, tvb, offset, 4, ENC_BIG_ENDIAN);
3669
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_all_copy_ttl_out, tvb, offset, 4, ENC_BIG_ENDIAN);
3670
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_all_copy_ttl_in, tvb, offset, 4, ENC_BIG_ENDIAN);
3671
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_all_set_mpls_ttl, tvb, offset, 4, ENC_BIG_ENDIAN);
3672
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_all_dec_mpls_ttl, tvb, offset, 4, ENC_BIG_ENDIAN);
3673
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_all_push_vlan, tvb, offset, 4, ENC_BIG_ENDIAN);
3674
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_all_pop_vlan, tvb, offset, 4, ENC_BIG_ENDIAN);
3675
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_all_push_mpls, tvb, offset, 4, ENC_BIG_ENDIAN);
3676
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_all_pop_mpls, tvb, offset, 4, ENC_BIG_ENDIAN);
3677
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_all_set_queue, tvb, offset, 4, ENC_BIG_ENDIAN);
3678
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_all_group, tvb, offset, 4, ENC_BIG_ENDIAN);
3679
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_all_set_nw_ttl, tvb, offset, 4, ENC_BIG_ENDIAN);
3680
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_all_dec_nw_ttl, tvb, offset, 4, ENC_BIG_ENDIAN);
3681
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_all_set_field, tvb, offset, 4, ENC_BIG_ENDIAN);
3682
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_all_push_pbb, tvb, offset, 4, ENC_BIG_ENDIAN);
3683
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_all_pop_pbb, tvb, offset, 4, ENC_BIG_ENDIAN);
3684
0
    offset+=4;
3685
3686
0
    ti = proto_tree_add_item(tree, hf_openflow_v4_group_features_actions_select, tvb, offset, 4, ENC_BIG_ENDIAN);
3687
0
    acts_tree = proto_item_add_subtree(ti, ett_openflow_v4_group_features_actions_select);
3688
3689
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_select_output, tvb, offset, 4, ENC_BIG_ENDIAN);
3690
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_select_copy_ttl_out, tvb, offset, 4, ENC_BIG_ENDIAN);
3691
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_select_copy_ttl_in, tvb, offset, 4, ENC_BIG_ENDIAN);
3692
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_select_set_mpls_ttl, tvb, offset, 4, ENC_BIG_ENDIAN);
3693
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_select_dec_mpls_ttl, tvb, offset, 4, ENC_BIG_ENDIAN);
3694
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_select_push_vlan, tvb, offset, 4, ENC_BIG_ENDIAN);
3695
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_select_pop_vlan, tvb, offset, 4, ENC_BIG_ENDIAN);
3696
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_select_push_mpls, tvb, offset, 4, ENC_BIG_ENDIAN);
3697
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_select_pop_mpls, tvb, offset, 4, ENC_BIG_ENDIAN);
3698
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_select_set_queue, tvb, offset, 4, ENC_BIG_ENDIAN);
3699
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_select_group, tvb, offset, 4, ENC_BIG_ENDIAN);
3700
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_select_set_nw_ttl, tvb, offset, 4, ENC_BIG_ENDIAN);
3701
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_select_dec_nw_ttl, tvb, offset, 4, ENC_BIG_ENDIAN);
3702
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_select_set_field, tvb, offset, 4, ENC_BIG_ENDIAN);
3703
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_select_push_pbb, tvb, offset, 4, ENC_BIG_ENDIAN);
3704
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_select_pop_pbb, tvb, offset, 4, ENC_BIG_ENDIAN);
3705
0
    offset+=4;
3706
3707
0
    ti = proto_tree_add_item(tree, hf_openflow_v4_group_features_actions_indirect, tvb, offset, 4, ENC_BIG_ENDIAN);
3708
0
    acts_tree = proto_item_add_subtree(ti, ett_openflow_v4_group_features_actions_indirect);
3709
3710
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_indirect_output, tvb, offset, 4, ENC_BIG_ENDIAN);
3711
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_indirect_copy_ttl_out, tvb, offset, 4, ENC_BIG_ENDIAN);
3712
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_indirect_copy_ttl_in, tvb, offset, 4, ENC_BIG_ENDIAN);
3713
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_indirect_set_mpls_ttl, tvb, offset, 4, ENC_BIG_ENDIAN);
3714
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_indirect_dec_mpls_ttl, tvb, offset, 4, ENC_BIG_ENDIAN);
3715
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_indirect_push_vlan, tvb, offset, 4, ENC_BIG_ENDIAN);
3716
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_indirect_pop_vlan, tvb, offset, 4, ENC_BIG_ENDIAN);
3717
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_indirect_push_mpls, tvb, offset, 4, ENC_BIG_ENDIAN);
3718
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_indirect_pop_mpls, tvb, offset, 4, ENC_BIG_ENDIAN);
3719
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_indirect_set_queue, tvb, offset, 4, ENC_BIG_ENDIAN);
3720
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_indirect_group, tvb, offset, 4, ENC_BIG_ENDIAN);
3721
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_indirect_set_nw_ttl, tvb, offset, 4, ENC_BIG_ENDIAN);
3722
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_indirect_dec_nw_ttl, tvb, offset, 4, ENC_BIG_ENDIAN);
3723
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_indirect_set_field, tvb, offset, 4, ENC_BIG_ENDIAN);
3724
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_indirect_push_pbb, tvb, offset, 4, ENC_BIG_ENDIAN);
3725
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_indirect_pop_pbb, tvb, offset, 4, ENC_BIG_ENDIAN);
3726
0
    offset+=4;
3727
3728
0
    ti = proto_tree_add_item(tree, hf_openflow_v4_group_features_actions_ff, tvb, offset, 4, ENC_BIG_ENDIAN);
3729
0
    acts_tree = proto_item_add_subtree(ti, ett_openflow_v4_group_features_actions_ff);
3730
3731
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_ff_output, tvb, offset, 4, ENC_BIG_ENDIAN);
3732
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_ff_copy_ttl_out, tvb, offset, 4, ENC_BIG_ENDIAN);
3733
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_ff_copy_ttl_in, tvb, offset, 4, ENC_BIG_ENDIAN);
3734
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_ff_set_mpls_ttl, tvb, offset, 4, ENC_BIG_ENDIAN);
3735
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_ff_dec_mpls_ttl, tvb, offset, 4, ENC_BIG_ENDIAN);
3736
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_ff_push_vlan, tvb, offset, 4, ENC_BIG_ENDIAN);
3737
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_ff_pop_vlan, tvb, offset, 4, ENC_BIG_ENDIAN);
3738
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_ff_push_mpls, tvb, offset, 4, ENC_BIG_ENDIAN);
3739
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_ff_pop_mpls, tvb, offset, 4, ENC_BIG_ENDIAN);
3740
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_ff_set_queue, tvb, offset, 4, ENC_BIG_ENDIAN);
3741
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_ff_group, tvb, offset, 4, ENC_BIG_ENDIAN);
3742
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_ff_set_nw_ttl, tvb, offset, 4, ENC_BIG_ENDIAN);
3743
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_ff_dec_nw_ttl, tvb, offset, 4, ENC_BIG_ENDIAN);
3744
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_ff_set_field, tvb, offset, 4, ENC_BIG_ENDIAN);
3745
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_ff_push_pbb, tvb, offset, 4, ENC_BIG_ENDIAN);
3746
0
    proto_tree_add_item(acts_tree, hf_openflow_v4_group_features_actions_ff_pop_pbb, tvb, offset, 4, ENC_BIG_ENDIAN);
3747
    /*offset+=4;*/
3748
0
}
3749
3750
3751
static int
3752
dissect_openflow_meter_band_stats_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
3753
0
{
3754
0
    proto_tree *stats_tree;
3755
3756
0
    stats_tree = proto_tree_add_subtree(tree, tvb, offset, 16, ett_openflow_v4_meter_band_stats, NULL, "Meter band stats");
3757
3758
    /* uint64_t packet_band_count; */
3759
0
    proto_tree_add_item(stats_tree, hf_openflow_v4_meter_band_stats_packet_band_count, tvb, offset, 8, ENC_BIG_ENDIAN);
3760
0
    offset+=8;
3761
3762
    /* uint64_t byte_band_count; */
3763
0
    proto_tree_add_item(stats_tree, hf_openflow_v4_meter_band_stats_byte_band_count, tvb, offset, 8, ENC_BIG_ENDIAN);
3764
0
    offset+=8;
3765
3766
0
    return offset;
3767
0
}
3768
3769
3770
static int
3771
dissect_openflow_meter_stats_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
3772
0
{
3773
0
    proto_item *ti;
3774
0
    proto_tree *stats_tree;
3775
0
    uint16_t stats_len;
3776
0
    uint16_t stats_end;
3777
3778
0
    stats_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_openflow_v4_meter_stats, &ti, "Meter stats");
3779
3780
    /* uint32_t meter_id; */
3781
0
    proto_tree_add_item(stats_tree, hf_openflow_v4_meter_stats_meter_id, tvb, offset, 4, ENC_BIG_ENDIAN);
3782
0
    offset+=4;
3783
3784
    /* uint16_t len; */
3785
0
    stats_len = tvb_get_ntohs(tvb, offset);
3786
0
    stats_end = offset - 4 + stats_len;
3787
0
    proto_item_set_len(ti, stats_len);
3788
0
    proto_tree_add_item(stats_tree, hf_openflow_v4_meter_stats_len, tvb, offset, 2, ENC_BIG_ENDIAN);
3789
0
    offset+=2;
3790
3791
    /* uint8_t pad[6]; */
3792
0
    proto_tree_add_item(stats_tree, hf_openflow_v4_meter_stats_pad, tvb, offset, 6, ENC_NA);
3793
0
    offset+=6;
3794
3795
    /* uint32_t flow_count; */
3796
0
    proto_tree_add_item(stats_tree, hf_openflow_v4_meter_stats_flow_count, tvb, offset, 4, ENC_BIG_ENDIAN);
3797
0
    offset+=4;
3798
3799
    /* uint64_t packet_in_count; */
3800
0
    proto_tree_add_item(stats_tree, hf_openflow_v4_meter_stats_packet_in_count, tvb, offset, 8, ENC_BIG_ENDIAN);
3801
0
    offset+=8;
3802
3803
    /* uint64_t byte_in_count; */
3804
0
    proto_tree_add_item(stats_tree, hf_openflow_v4_meter_stats_byte_in_count, tvb, offset, 8, ENC_BIG_ENDIAN);
3805
0
    offset+=8;
3806
3807
    /* uint32_t duration_sec; */
3808
0
    proto_tree_add_item(stats_tree, hf_openflow_v4_meter_stats_duration_sec, tvb, offset, 4, ENC_BIG_ENDIAN);
3809
0
    offset+=4;
3810
3811
    /* uint32_t duration_nsec; */
3812
0
    proto_tree_add_item(stats_tree, hf_openflow_v4_meter_stats_duration_nsec, tvb, offset, 4, ENC_BIG_ENDIAN);
3813
0
    offset+=4;
3814
3815
    /* struct ofp_meter_band_stats band_stats[0]; */
3816
0
    while (offset < stats_end) {
3817
0
        offset = dissect_openflow_meter_band_stats_v4(tvb, pinfo, stats_tree, offset, length);
3818
0
    }
3819
3820
0
    return offset;
3821
0
}
3822
3823
3824
static int
3825
dissect_openflow_meter_config_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
3826
5
{
3827
5
    proto_item *ti;
3828
5
    proto_tree *conf_tree, *flags_tree;
3829
5
    uint16_t config_len;
3830
5
    int32_t config_end;
3831
3832
5
    conf_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_openflow_v4_meter_config, &ti, "Meter config");
3833
3834
    /* uint16_t len; */
3835
5
    config_len = tvb_get_ntohs(tvb, offset);
3836
5
    config_end = offset + config_len;
3837
5
    proto_item_set_len(ti, config_len);
3838
5
    proto_tree_add_item(conf_tree, hf_openflow_v4_meter_config_len, tvb, offset, 2, ENC_BIG_ENDIAN);
3839
5
    offset+=2;
3840
3841
    /* uint16_t flags; */
3842
5
    ti = proto_tree_add_item(conf_tree, hf_openflow_v4_meter_config_flags, tvb, offset, 2, ENC_BIG_ENDIAN);
3843
5
    flags_tree = proto_item_add_subtree(ti, ett_openflow_v4_meter_config_flags);
3844
3845
5
    proto_tree_add_item(flags_tree, hf_openflow_v4_meter_config_flags_kbps, tvb, offset, 2, ENC_BIG_ENDIAN);
3846
5
    proto_tree_add_item(flags_tree, hf_openflow_v4_meter_config_flags_pktps, tvb, offset, 2, ENC_BIG_ENDIAN);
3847
5
    proto_tree_add_item(flags_tree, hf_openflow_v4_meter_config_flags_burst, tvb, offset, 2, ENC_BIG_ENDIAN);
3848
5
    proto_tree_add_item(flags_tree, hf_openflow_v4_meter_config_flags_stats, tvb, offset, 2, ENC_BIG_ENDIAN);
3849
5
    offset+=2;
3850
3851
    /* uint32_t meter_id; */
3852
5
    proto_tree_add_item(conf_tree, hf_openflow_v4_meter_config_meter_id, tvb, offset, 4, ENC_BIG_ENDIAN);
3853
5
    offset+=4;
3854
3855
    /* struct ofp_meter_band_header bands[0]; */
3856
10
    while (offset < config_end) {
3857
5
        offset = dissect_openflow_meter_band_v4(tvb, pinfo, conf_tree, offset, length);
3858
5
    }
3859
3860
5
    return offset;
3861
5
}
3862
3863
3864
45
#define OFPMF_KBPS   1 << 0
3865
45
#define OFPMF_PKTPS  1 << 1
3866
45
#define OFPMF_BURST  1 << 2
3867
45
#define OFPMF_STATS  1 << 3
3868
static void
3869
dissect_openflow_meter_features_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
3870
0
{
3871
0
    proto_item *ti;
3872
0
    proto_tree *bands_tree, *caps_tree;
3873
3874
    /* uint32_t max_meter; */
3875
0
    proto_tree_add_item(tree, hf_openflow_v4_meter_features_max_meter, tvb, offset, 4, ENC_BIG_ENDIAN);
3876
0
    offset+=4;
3877
3878
    /* uint32_t band_types; */
3879
0
    ti = proto_tree_add_item(tree, hf_openflow_v4_meter_features_band_types, tvb, offset, 4, ENC_BIG_ENDIAN);
3880
0
    bands_tree = proto_item_add_subtree(ti, ett_openflow_v4_meter_features_band_types);
3881
3882
0
    proto_tree_add_item(bands_tree, hf_openflow_v4_meter_features_band_types_drop, tvb, offset, 4, ENC_BIG_ENDIAN);
3883
0
    proto_tree_add_item(bands_tree, hf_openflow_v4_meter_features_band_types_dscp_remark, tvb, offset, 4, ENC_BIG_ENDIAN);
3884
0
    offset+=4;
3885
3886
    /* uint32_t capabilities; */
3887
0
    ti = proto_tree_add_item(tree, hf_openflow_v4_meter_features_capabilities, tvb, offset, 4, ENC_BIG_ENDIAN);
3888
0
    caps_tree = proto_item_add_subtree(ti, ett_openflow_v4_meter_features_capabilities);
3889
3890
0
    proto_tree_add_item(caps_tree, hf_openflow_v4_meter_features_capabilities_kbps, tvb, offset, 4, ENC_BIG_ENDIAN);
3891
0
    proto_tree_add_item(caps_tree, hf_openflow_v4_meter_features_capabilities_pktps, tvb, offset, 4, ENC_BIG_ENDIAN);
3892
0
    proto_tree_add_item(caps_tree, hf_openflow_v4_meter_features_capabilities_burst, tvb, offset, 4, ENC_BIG_ENDIAN);
3893
0
    proto_tree_add_item(caps_tree, hf_openflow_v4_meter_features_capabilities_stats, tvb, offset, 4, ENC_BIG_ENDIAN);
3894
0
    offset+=4;
3895
3896
    /* uint8_t max_bands; */
3897
0
    proto_tree_add_item(tree, hf_openflow_v4_meter_features_max_bands, tvb, offset, 1, ENC_BIG_ENDIAN);
3898
0
    offset+=1;
3899
3900
    /* uint8_t max_color; */
3901
0
    proto_tree_add_item(tree, hf_openflow_v4_meter_features_max_color, tvb, offset, 1, ENC_BIG_ENDIAN);
3902
0
    offset+=1;
3903
3904
    /* uint8_t pad[2]; */
3905
0
    proto_tree_add_item(tree, hf_openflow_v4_meter_features_pad, tvb, offset, 2, ENC_NA);
3906
    /*offset+=2;*/
3907
0
}
3908
3909
3910
15
#define OFPMPF_REPLY_MORE  1 << 0
3911
static void
3912
dissect_openflow_multipart_reply_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length)
3913
18
{
3914
18
    proto_item *ti;
3915
18
    proto_tree *flags_tree;
3916
18
    uint16_t type;
3917
3918
    /* uint16_t type; */
3919
18
    proto_tree_add_item_ret_uint16(tree, hf_openflow_v4_multipart_reply_type, tvb, offset, 2, ENC_BIG_ENDIAN, &type);
3920
18
    offset+=2;
3921
3922
18
    col_append_fstr(pinfo->cinfo, COL_INFO, ", %s",
3923
18
                  val_to_str_const(type, openflow_v4_multipart_type_values, "Unknown type"));
3924
3925
    /* uint16_t flags; */
3926
18
    ti = proto_tree_add_item(tree, hf_openflow_v4_multipart_reply_flags, tvb, offset, 2, ENC_BIG_ENDIAN);
3927
18
    flags_tree = proto_item_add_subtree(ti, ett_openflow_v4_multipart_reply_flags);
3928
3929
18
    proto_tree_add_item(flags_tree, hf_openflow_v4_multipart_reply_flags_more, tvb, offset, 2, ENC_BIG_ENDIAN);
3930
18
    offset+=2;
3931
3932
    /* uint8_t pad[4]; */
3933
18
    proto_tree_add_item(tree, hf_openflow_v4_multipart_reply_pad, tvb, offset, 4, ENC_NA);
3934
18
    offset+=4;
3935
3936
18
    switch(type){
3937
1
    case OFPMP_DESC:
3938
1
        dissect_openflow_switch_description_v4(tvb, pinfo, tree, offset, length);
3939
1
        break;
3940
0
    case OFPMP_FLOW:
3941
0
        while (offset < length) {
3942
0
            offset = dissect_openflow_flow_stats_v4(tvb, pinfo, tree, offset, length);
3943
0
        }
3944
0
        break;
3945
0
    case OFPMP_AGGREGATE:
3946
0
        dissect_openflow_aggregate_stats_v4(tvb, pinfo, tree, offset, length);
3947
0
        break;
3948
0
    case OFPMP_TABLE:
3949
0
        while (offset < length) {
3950
0
            offset = dissect_openflow_table_stats_v4(tvb, pinfo, tree, offset, length);
3951
0
        }
3952
0
        break;
3953
0
    case OFPMP_PORT_STATS:
3954
0
        while (offset < length) {
3955
0
            offset = dissect_openflow_port_stats_v4(tvb, pinfo, tree, offset, length);
3956
0
        }
3957
0
        break;
3958
1
    case OFPMP_QUEUE:
3959
3
        while (offset < length) {
3960
2
            offset = dissect_openflow_queue_stats_v4(tvb, pinfo, tree, offset, length);
3961
2
        }
3962
1
        break;
3963
4
    case OFPMP_GROUP:
3964
8
        while (offset < length) {
3965
4
            offset = dissect_openflow_group_stats_v4(tvb, pinfo, tree, offset, length);
3966
4
        }
3967
4
        break;
3968
3
    case OFPMP_GROUP_DESC:
3969
8
        while (offset < length) {
3970
5
            offset = dissect_openflow_group_desc_v4(tvb, pinfo, tree, offset, length);
3971
5
        }
3972
3
        break;
3973
0
    case OFPMP_GROUP_FEATURES:
3974
0
        dissect_openflow_group_features_v4(tvb, pinfo, tree, offset, length);
3975
0
        break;
3976
0
    case OFPMP_METER:
3977
0
        while (offset < length) {
3978
0
            offset = dissect_openflow_meter_stats_v4(tvb, pinfo, tree, offset, length);
3979
0
        }
3980
0
        break;
3981
3
    case OFPMP_METER_CONFIG:
3982
8
        while (offset < length) {
3983
5
            offset = dissect_openflow_meter_config_v4(tvb, pinfo, tree, offset, length);
3984
5
        }
3985
3
        break;
3986
0
    case OFPMP_METER_FEATURES:
3987
0
        dissect_openflow_meter_features_v4(tvb, pinfo, tree, offset, length);
3988
0
        break;
3989
6
    case OFPMP_TABLE_FEATURES:
3990
14
        while (offset < length) {
3991
8
            offset = dissect_openflow_table_features_v4(tvb, pinfo, tree, offset, length);
3992
8
        }
3993
6
        break;
3994
0
    case OFPMP_PORT_DESC:
3995
0
        while (offset < length) {
3996
0
            offset = dissect_openflow_port_v4(tvb, pinfo, tree, offset, length);
3997
0
        }
3998
0
        break;
3999
4000
0
    case OFPMP_EXPERIMENTER:
4001
        /* uint32_t experimenter; */
4002
0
        proto_tree_add_item(tree, hf_openflow_v4_multipart_reply_experimenter_experimenter, tvb, offset, 4, ENC_BIG_ENDIAN);
4003
0
        offset+=4;
4004
4005
        /* uint32_t exp_type; */
4006
0
        proto_tree_add_item(tree, hf_openflow_v4_multipart_reply_experimenter_exp_type, tvb, offset, 4, ENC_BIG_ENDIAN);
4007
0
        offset+=4;
4008
4009
        /* uint32_t experimenter_data[0]; */
4010
0
        proto_tree_add_expert_format(tree, pinfo, &ei_openflow_v4_multipart_reply_undecoded,
4011
0
                                     tvb, offset, length - 16, "Experimenter multipart reply body.");
4012
4013
0
        break;
4014
0
    default:
4015
0
        proto_tree_add_expert_format(tree, pinfo, &ei_openflow_v4_multipart_reply_undecoded,
4016
0
                                     tvb, offset, length - 8, "Unknown multipart reply body.");
4017
0
        break;
4018
18
    }
4019
18
}
4020
4021
4022
4023
static void
4024
dissect_openflow_queue_get_config_request_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
4025
0
{
4026
    /* uint32_t port; */
4027
0
    proto_tree_add_item(tree, hf_openflow_v4_queue_get_config_request_port, tvb, offset, 4, ENC_BIG_ENDIAN);
4028
0
    offset+=4;
4029
4030
    /* uint8_t pad[4]; */
4031
0
    proto_tree_add_item(tree, hf_openflow_v4_queue_get_config_request_pad, tvb, offset, 4, ENC_NA);
4032
    /*offset+=4;*/
4033
0
}
4034
4035
4036
4037
#define OFPQ_MIN_RATE_MAX  1000
4038
static const value_string openflow_v4_queue_prop_min_rate_reserved_values[] = {
4039
    { 0xffff, "OFPQ_MIN_RATE_UNCFG" },
4040
    { 0,        NULL }
4041
};
4042
4043
#define OFPQ_MAX_RATE_MAX  1000
4044
static const value_string openflow_v4_queue_prop_max_rate_reserved_values[] = {
4045
    { 0xffff, "OFPQ_MAX_RATE_UNCFG" },
4046
    { 0,        NULL }
4047
};
4048
4049
0
#define OFPQT_MIN_RATE      1
4050
0
#define OFPQT_MAX_RATE      2
4051
0
#define OFPQT_EXPERIMENTER  0xffff
4052
static const value_string openflow_v4_queue_prop_property_values[] = {
4053
    { OFPQT_MIN_RATE,     "OFPQT_MIN_RATE" },
4054
    { OFPQT_MAX_RATE,     "OFPQT_MAX_RATE" },
4055
    { OFPQT_EXPERIMENTER, "OFPQT_EXPERIMENTER" },
4056
    { 0,                  NULL },
4057
};
4058
4059
static int
4060
dissect_openflow_queue_prop_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
4061
0
{
4062
0
    proto_item *ti;
4063
0
    proto_tree *prop_tree;
4064
0
    uint16_t prop_type;
4065
0
    uint16_t prop_len;
4066
4067
0
    prop_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_openflow_v4_queue_prop, &ti, "Queue property");
4068
4069
    /* uint16_t property; */
4070
0
    prop_type = tvb_get_ntohs(tvb, offset);
4071
0
    proto_tree_add_item(prop_tree, hf_openflow_v4_queue_prop_property, tvb, offset, 2, ENC_BIG_ENDIAN);
4072
0
    offset+=2;
4073
4074
    /* uint16_t len; */
4075
0
    prop_len = tvb_get_ntohs(tvb, offset);
4076
0
    proto_item_set_len(ti, prop_len);
4077
0
    proto_tree_add_item(prop_tree, hf_openflow_v4_queue_prop_len, tvb, offset, 2, ENC_BIG_ENDIAN);
4078
0
    offset+=2;
4079
4080
    /* uint8_t pad[4]; */
4081
0
    proto_tree_add_item(prop_tree, hf_openflow_v4_queue_prop_pad, tvb, offset, 4, ENC_NA);
4082
0
    offset+=4;
4083
4084
0
    switch (prop_type) {
4085
0
    case OFPQT_MIN_RATE:
4086
        /* uint16_t rate; */
4087
0
        proto_tree_add_item(prop_tree, hf_openflow_v4_queue_prop_min_rate_rate, tvb, offset, 2, ENC_BIG_ENDIAN);
4088
4089
0
        offset+=2;
4090
4091
        /* uint8_t pad[6]; */
4092
0
        proto_tree_add_item(prop_tree, hf_openflow_v4_queue_prop_min_rate_pad, tvb, offset, 6, ENC_NA);
4093
0
        offset+=6;
4094
0
        break;
4095
4096
0
    case OFPQT_MAX_RATE:
4097
        /* uint16_t rate; */
4098
0
        proto_tree_add_item(prop_tree, hf_openflow_v4_queue_prop_max_rate_rate, tvb, offset, 2, ENC_BIG_ENDIAN);
4099
0
        offset+=2;
4100
4101
        /* uint8_t pad[6]; */
4102
0
        proto_tree_add_item(prop_tree, hf_openflow_v4_queue_prop_max_rate_pad, tvb, offset, 6, ENC_NA);
4103
0
        offset+=6;
4104
0
        break;
4105
4106
0
    case OFPQT_EXPERIMENTER:
4107
        /* uint32_t experimenter; */
4108
0
        proto_tree_add_item(prop_tree, hf_openflow_v4_queue_prop_experimenter_experimenter, tvb, offset, 4, ENC_BIG_ENDIAN);
4109
0
        offset+=4;
4110
4111
        /* uint8_t pad[4]; */
4112
0
        proto_tree_add_item(prop_tree, hf_openflow_v4_queue_prop_experimenter_pad, tvb, offset, 4, ENC_NA);
4113
0
        offset+=4;
4114
4115
        /* uint8_t data[0]; */
4116
0
        proto_tree_add_expert_format(prop_tree, pinfo, &ei_openflow_v4_queue_prop_undecoded,
4117
0
                                     tvb, offset, prop_len - 16, "Experimenter queue property body.");
4118
0
        if (prop_len > 16)
4119
0
            offset+=prop_len-16;
4120
0
        break;
4121
4122
0
    default:
4123
0
        proto_tree_add_expert_format(prop_tree, pinfo, &ei_openflow_v4_queue_prop_undecoded,
4124
0
                                     tvb, offset, prop_len - 8, "Unknown queue property body.");
4125
0
        if (prop_len > 8)
4126
0
            offset+=prop_len-8;
4127
0
        break;
4128
0
    }
4129
4130
0
    return offset;
4131
0
}
4132
4133
4134
#define OFPQ_ALL  0xffffffff
4135
static const value_string openflow_v4_queue_id_reserved_values[] = {
4136
    { OFPQ_ALL, "OFPQ_ALL" },
4137
    { 0,        NULL }
4138
};
4139
4140
static int
4141
dissect_openflow_packet_queue_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
4142
0
{
4143
0
    proto_item *ti;
4144
0
    proto_tree *queue_tree;
4145
0
    uint16_t queue_len;
4146
0
    uint16_t queue_end;
4147
4148
0
    queue_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_openflow_v4_packet_queue, &ti, "Queue");
4149
4150
    /* uint32_t queue_id; */
4151
0
    proto_tree_add_item(queue_tree, hf_openflow_v4_packet_queue_queue_id, tvb, offset, 4, ENC_BIG_ENDIAN);
4152
0
    offset+=4;
4153
4154
    /* uint32_t port; */
4155
0
    proto_tree_add_item(queue_tree, hf_openflow_v4_packet_queue_port, tvb, offset, 4, ENC_BIG_ENDIAN);
4156
0
    offset+=4;
4157
4158
    /* uint16_t len; */
4159
0
    queue_len = tvb_get_ntohs(tvb, offset);
4160
0
    queue_end = offset - 8 + queue_len;
4161
0
    proto_item_set_len(ti, queue_len);
4162
0
    proto_tree_add_item(queue_tree, hf_openflow_v4_packet_queue_len, tvb, offset, 2, ENC_BIG_ENDIAN);
4163
0
    offset+=2;
4164
4165
    /* uint8_t pad[6]; */
4166
0
    proto_tree_add_item(queue_tree, hf_openflow_v4_packet_queue_pad, tvb, offset, 6, ENC_NA);
4167
0
    offset+=6;
4168
4169
    /* struct ofp_queue_prop_header properties[0]; */
4170
0
    while (offset < queue_end) {
4171
0
        offset = dissect_openflow_queue_prop_v4(tvb, pinfo, queue_tree, offset, length);
4172
0
    }
4173
4174
0
    return offset;
4175
0
}
4176
4177
static void
4178
dissect_openflow_queue_get_config_reply_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length)
4179
0
{
4180
    /* uint32_t port; */
4181
0
    proto_tree_add_item(tree, hf_openflow_v4_queue_get_config_reply_port, tvb, offset, 4, ENC_BIG_ENDIAN);
4182
0
    offset+=4;
4183
4184
    /* uint8_t pad[4]; */
4185
0
    proto_tree_add_item(tree, hf_openflow_v4_queue_get_config_reply_pad, tvb, offset, 4, ENC_NA);
4186
0
    offset+=4;
4187
4188
    /* struct ofp_packet_queue queues[0]; */
4189
0
    while (offset < length) {
4190
0
        offset = dissect_openflow_packet_queue_v4(tvb, pinfo, tree, offset, length);
4191
0
    }
4192
0
}
4193
4194
static const value_string openflow_v4_controller_role_values[] = {
4195
    { 0, "OFPCR_ROLE_NOCHANGE" },
4196
    { 1, "OFPCR_ROLE_EQUAL" },
4197
    { 2, "OFPCR_ROLE_MASTER" },
4198
    { 3, "OFPCR_ROLE_SLAVE" },
4199
    { 0, NULL }
4200
};
4201
4202
static void
4203
dissect_openflow_role_request_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
4204
0
{
4205
    /* uint32_t role; */
4206
0
    proto_tree_add_item(tree, hf_openflow_v4_role_request_role, tvb, offset, 4, ENC_BIG_ENDIAN);
4207
0
    offset+=4;
4208
4209
    /* uint8_t pad[4]; */
4210
0
    proto_tree_add_item(tree, hf_openflow_v4_role_request_pad, tvb, offset, 4, ENC_NA);
4211
0
    offset+=4;
4212
4213
    /* uint64_t generation_id; */
4214
0
    proto_tree_add_item(tree, hf_openflow_v4_role_request_generation_id, tvb, offset, 8, ENC_BIG_ENDIAN);
4215
    /*offset+=8;*/
4216
0
}
4217
4218
4219
static void
4220
dissect_openflow_role_reply_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
4221
0
{
4222
    /* uint32_t role; */
4223
0
    proto_tree_add_item(tree, hf_openflow_v4_role_reply_role, tvb, offset, 4, ENC_BIG_ENDIAN);
4224
0
    offset+=4;
4225
4226
    /* uint8_t pad[4]; */
4227
0
    proto_tree_add_item(tree, hf_openflow_v4_role_reply_pad, tvb, offset, 4, ENC_NA);
4228
0
    offset+=4;
4229
4230
    /* uint64_t generation_id; */
4231
0
    proto_tree_add_item(tree, hf_openflow_v4_role_reply_generation_id, tvb, offset, 8, ENC_BIG_ENDIAN);
4232
    /*offset+=8;*/
4233
0
}
4234
4235
4236
static void
4237
dissect_openflow_async_config_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
4238
0
{
4239
0
    proto_item *ti;
4240
0
    proto_tree *pimm_tree, *psmm_tree, *frmm_tree;
4241
0
    proto_tree *pims_tree, *psms_tree, *frms_tree;
4242
4243
    /* uint32_t packet_in_mask[2]; */
4244
0
    ti = proto_tree_add_item(tree, hf_openflow_v4_async_config_packet_in_mask_master, tvb, offset, 4, ENC_BIG_ENDIAN);
4245
0
    pimm_tree = proto_item_add_subtree(ti, ett_openflow_v4_async_config_packet_in_mask_master);
4246
4247
0
    proto_tree_add_item(pimm_tree, hf_openflow_v4_async_config_packet_in_mask_master_no_match, tvb, offset, 4, ENC_BIG_ENDIAN);
4248
0
    proto_tree_add_item(pimm_tree, hf_openflow_v4_async_config_packet_in_mask_master_action, tvb, offset, 4, ENC_BIG_ENDIAN);
4249
0
    proto_tree_add_item(pimm_tree, hf_openflow_v4_async_config_packet_in_mask_master_invalid_ttl, tvb, offset, 4, ENC_BIG_ENDIAN);
4250
0
    offset+=4;
4251
4252
0
    ti = proto_tree_add_item(tree, hf_openflow_v4_async_config_packet_in_mask_slave, tvb, offset, 4, ENC_BIG_ENDIAN);
4253
0
    pims_tree = proto_item_add_subtree(ti, ett_openflow_v4_async_config_packet_in_mask_slave);
4254
4255
0
    proto_tree_add_item(pims_tree, hf_openflow_v4_async_config_packet_in_mask_slave_no_match, tvb, offset, 4, ENC_BIG_ENDIAN);
4256
0
    proto_tree_add_item(pims_tree, hf_openflow_v4_async_config_packet_in_mask_slave_action, tvb, offset, 4, ENC_BIG_ENDIAN);
4257
0
    proto_tree_add_item(pims_tree, hf_openflow_v4_async_config_packet_in_mask_slave_invalid_ttl, tvb, offset, 4, ENC_BIG_ENDIAN);
4258
0
    offset+=4;
4259
4260
    /* uint32_t port_status_mask[2]; */
4261
0
    ti = proto_tree_add_item(tree, hf_openflow_v4_async_config_port_status_mask_master, tvb, offset, 4, ENC_BIG_ENDIAN);
4262
0
    psmm_tree = proto_item_add_subtree(ti, ett_openflow_v4_async_config_port_status_mask_master);
4263
4264
0
    proto_tree_add_item(psmm_tree, hf_openflow_v4_async_config_port_status_mask_master_add, tvb, offset, 4, ENC_BIG_ENDIAN);
4265
0
    proto_tree_add_item(psmm_tree, hf_openflow_v4_async_config_port_status_mask_master_delete, tvb, offset, 4, ENC_BIG_ENDIAN);
4266
0
    proto_tree_add_item(psmm_tree, hf_openflow_v4_async_config_port_status_mask_master_modify, tvb, offset, 4, ENC_BIG_ENDIAN);
4267
0
    offset+=4;
4268
4269
0
    ti = proto_tree_add_item(tree, hf_openflow_v4_async_config_port_status_mask_slave, tvb, offset, 4, ENC_BIG_ENDIAN);
4270
0
    psms_tree = proto_item_add_subtree(ti, ett_openflow_v4_async_config_port_status_mask_slave);
4271
4272
0
    proto_tree_add_item(psms_tree, hf_openflow_v4_async_config_port_status_mask_slave_add, tvb, offset, 4, ENC_BIG_ENDIAN);
4273
0
    proto_tree_add_item(psms_tree, hf_openflow_v4_async_config_port_status_mask_slave_delete, tvb, offset, 4, ENC_BIG_ENDIAN);
4274
0
    proto_tree_add_item(psms_tree, hf_openflow_v4_async_config_port_status_mask_slave_modify, tvb, offset, 4, ENC_BIG_ENDIAN);
4275
0
    offset+=4;
4276
4277
    /* uint32_t flow_removed_mask[2]; */
4278
0
    ti = proto_tree_add_item(tree, hf_openflow_v4_async_config_flow_removed_mask_master, tvb, offset, 4, ENC_BIG_ENDIAN);
4279
0
    frmm_tree = proto_item_add_subtree(ti, ett_openflow_v4_async_config_flow_removed_mask_master);
4280
4281
0
    proto_tree_add_item(frmm_tree, hf_openflow_v4_async_config_flow_removed_mask_master_idle_timeout, tvb, offset, 4, ENC_BIG_ENDIAN);
4282
0
    proto_tree_add_item(frmm_tree, hf_openflow_v4_async_config_flow_removed_mask_master_hard_timeout, tvb, offset, 4, ENC_BIG_ENDIAN);
4283
0
    proto_tree_add_item(frmm_tree, hf_openflow_v4_async_config_flow_removed_mask_master_delete, tvb, offset, 4, ENC_BIG_ENDIAN);
4284
0
    proto_tree_add_item(frmm_tree, hf_openflow_v4_async_config_flow_removed_mask_master_group_delete, tvb, offset, 4, ENC_BIG_ENDIAN);
4285
0
    offset+=4;
4286
4287
0
    ti = proto_tree_add_item(tree, hf_openflow_v4_async_config_flow_removed_mask_slave, tvb, offset, 4, ENC_BIG_ENDIAN);
4288
0
    frms_tree = proto_item_add_subtree(ti, ett_openflow_v4_async_config_flow_removed_mask_slave);
4289
4290
0
    proto_tree_add_item(frms_tree, hf_openflow_v4_async_config_flow_removed_mask_slave_idle_timeout, tvb, offset, 4, ENC_BIG_ENDIAN);
4291
0
    proto_tree_add_item(frms_tree, hf_openflow_v4_async_config_flow_removed_mask_slave_hard_timeout, tvb, offset, 4, ENC_BIG_ENDIAN);
4292
0
    proto_tree_add_item(frms_tree, hf_openflow_v4_async_config_flow_removed_mask_slave_delete, tvb, offset, 4, ENC_BIG_ENDIAN);
4293
0
    proto_tree_add_item(frms_tree, hf_openflow_v4_async_config_flow_removed_mask_slave_group_delete, tvb, offset, 4, ENC_BIG_ENDIAN);
4294
    /*offset+=4;*/
4295
0
}
4296
4297
4298
4299
static const value_string openflow_v4_metermod_command_values[] = {
4300
    { 0, "OFPMC_ADD" },
4301
    { 1, "OFPMC_MODIFY" },
4302
    { 2, "OFPMC_DELETE" },
4303
    { 0, NULL }
4304
};
4305
4306
static void
4307
dissect_openflow_metermod_v4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t length _U_)
4308
0
{
4309
0
    proto_item *ti;
4310
0
    proto_tree *flags_tree;
4311
4312
    /* uint16_t command; */
4313
0
    proto_tree_add_item(tree, hf_openflow_v4_metermod_command, tvb, offset, 2, ENC_BIG_ENDIAN);
4314
0
    offset+=2;
4315
4316
    /* uint16_t flags; */
4317
0
    ti = proto_tree_add_item(tree, hf_openflow_v4_metermod_flags, tvb, offset, 2, ENC_BIG_ENDIAN);
4318
0
    flags_tree = proto_item_add_subtree(ti, ett_openflow_v4_metermod_flags);
4319
4320
0
    proto_tree_add_item(flags_tree, hf_openflow_v4_metermod_flags_kbps, tvb, offset, 2, ENC_BIG_ENDIAN);
4321
0
    proto_tree_add_item(flags_tree, hf_openflow_v4_metermod_flags_pktps, tvb, offset, 2, ENC_BIG_ENDIAN);
4322
0
    proto_tree_add_item(flags_tree, hf_openflow_v4_metermod_flags_burst, tvb, offset, 2, ENC_BIG_ENDIAN);
4323
0
    proto_tree_add_item(flags_tree, hf_openflow_v4_metermod_flags_stats, tvb, offset, 2, ENC_BIG_ENDIAN);
4324
0
    offset+=2;
4325
4326
    /* uint32_t meter_id; */
4327
0
    proto_tree_add_item(tree, hf_openflow_v4_metermod_meter_id, tvb, offset, 4, ENC_BIG_ENDIAN);
4328
0
    offset+=4;
4329
4330
    /* struct ofp_meter_band_header bands[0]; */
4331
0
    while (offset < length) {
4332
0
        offset = dissect_openflow_meter_band_v4(tvb, pinfo, tree, offset, length);
4333
0
    }
4334
0
}
4335
4336
4337
static int
4338
// NOLINTNEXTLINE(misc-no-recursion)
4339
dissect_openflow_message_v4(tvbuff_t *tvb, packet_info *pinfo, proto_tree *openflow_tree, int offset)
4340
54
{
4341
4342
54
    uint8_t type;
4343
54
    uint16_t length;
4344
54
    int32_t msg_end;
4345
4346
54
    type = tvb_get_uint8(tvb, offset + 1);
4347
54
    length = tvb_get_ntohs(tvb, offset + 2);
4348
54
    msg_end = offset + length;
4349
4350
54
    offset = dissect_openflow_header_v4(tvb, pinfo, openflow_tree, offset, length);
4351
4352
54
    switch(type){
4353
1
    case OFPT_HELLO:
4354
1
        dissect_openflow_hello_v4(tvb, pinfo, openflow_tree, offset, length);
4355
1
        break;
4356
2
    case OFPT_ERROR:
4357
2
        dissect_openflow_error_v4(tvb, pinfo, openflow_tree, offset, length);
4358
2
        break;
4359
0
    case OFPT_ECHO_REQUEST:
4360
0
    case OFPT_ECHO_REPLY:
4361
0
        dissect_openflow_echo_v4(tvb, pinfo, openflow_tree, offset, length);
4362
0
        break;
4363
1
    case OFPT_EXPERIMENTER:
4364
1
        dissect_openflow_experimenter_v4(tvb, pinfo, openflow_tree, offset, length);
4365
1
        break;
4366
0
    case OFPT_FEATURES_REQUEST:
4367
        /* message has no body */
4368
0
        break;
4369
0
    case OFPT_FEATURES_REPLY:
4370
0
        dissect_openflow_switch_features_v4(tvb, pinfo, openflow_tree, offset, length);
4371
0
        break;
4372
0
    case OFPT_GET_CONFIG_REQUEST:
4373
        /* message has no body */
4374
0
        break;
4375
0
    case OFPT_GET_CONFIG_REPLY:
4376
0
    case OFPT_SET_CONFIG:
4377
0
        dissect_openflow_switch_config_v4(tvb, pinfo, openflow_tree, offset, length);
4378
0
        break;
4379
0
    case OFPT_PACKET_IN:
4380
0
        dissect_openflow_packet_in_v4(tvb, pinfo, openflow_tree, offset, length);
4381
0
        break;
4382
0
    case OFPT_FLOW_REMOVED:
4383
0
        dissect_openflow_flow_removed_v4(tvb, pinfo, openflow_tree, offset, length);
4384
0
        break;
4385
0
    case OFPT_PORT_STATUS:
4386
0
        dissect_openflow_port_status_v4(tvb, pinfo, openflow_tree, offset, length);
4387
0
        break;
4388
3
    case OFPT_PACKET_OUT:
4389
3
        dissect_openflow_packet_out_v4(tvb, pinfo, openflow_tree, offset, length);
4390
3
        break;
4391
12
    case OFPT_FLOW_MOD:
4392
12
        dissect_openflow_flowmod_v4(tvb, pinfo, openflow_tree, offset, length);
4393
12
        break;
4394
0
    case OFPT_GROUP_MOD:
4395
0
        dissect_openflow_groupmod_v4(tvb, pinfo, openflow_tree, offset, length);
4396
0
        break;
4397
0
    case OFPT_PORT_MOD:
4398
0
        dissect_openflow_portmod_v4(tvb, pinfo, openflow_tree, offset, length);
4399
0
        break;
4400
0
    case OFPT_TABLE_MOD:
4401
0
        dissect_openflow_tablemod_v4(tvb, pinfo, openflow_tree, offset, length);
4402
0
        break;
4403
16
    case OFPT_MULTIPART_REQUEST:
4404
16
        dissect_openflow_multipart_request_v4(tvb, pinfo, openflow_tree, offset, length);
4405
16
        break;
4406
18
    case OFPT_MULTIPART_REPLY:
4407
18
        dissect_openflow_multipart_reply_v4(tvb, pinfo, openflow_tree, offset, length);
4408
18
        break;
4409
0
    case OFPT_BARRIER_REQUEST:
4410
0
    case OFPT_BARRIER_REPLY:
4411
        /* message has no body */
4412
0
        break;
4413
0
    case OFPT_QUEUE_GET_CONFIG_REQUEST:
4414
0
        dissect_openflow_queue_get_config_request_v4(tvb, pinfo, openflow_tree, offset, length);
4415
0
        break;
4416
0
    case OFPT_QUEUE_GET_CONFIG_REPLY:
4417
0
        dissect_openflow_queue_get_config_reply_v4(tvb, pinfo, openflow_tree, offset, length);
4418
0
        break;
4419
0
    case OFPT_ROLE_REQUEST:
4420
0
        dissect_openflow_role_request_v4(tvb, pinfo, openflow_tree, offset, length);
4421
0
        break;
4422
0
    case OFPT_ROLE_REPLY:
4423
0
        dissect_openflow_role_reply_v4(tvb, pinfo, openflow_tree, offset, length);
4424
0
        break;
4425
0
    case OFPT_GET_ASYNC_REQUEST:
4426
        /* message has no body */
4427
0
        break;
4428
0
    case OFPT_GET_ASYNC_REPLY:
4429
0
    case OFPT_SET_ASYNC:
4430
0
        dissect_openflow_async_config_v4(tvb, pinfo, openflow_tree, offset, length);
4431
0
        break;
4432
0
    case OFPT_METER_MOD:
4433
0
        dissect_openflow_metermod_v4(tvb, pinfo, openflow_tree, offset, length);
4434
0
        break;
4435
4436
1
     default:
4437
1
         if (length > 8) {
4438
1
            proto_tree_add_expert_format(openflow_tree, pinfo, &ei_openflow_v4_message_undecoded,
4439
1
                                     tvb, offset, length - 8, "Unknown message body.");
4440
1
        }
4441
1
        break;
4442
54
    }
4443
4444
3
    return msg_end;
4445
54
}
4446
4447
static int
4448
dissect_openflow_v4(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
4449
53
{
4450
53
    proto_item *ti;
4451
53
    proto_tree *openflow_tree;
4452
53
    unsigned offset = 0;
4453
53
    uint8_t type;
4454
4455
53
    type   = tvb_get_uint8(tvb, 1);
4456
4457
53
    col_append_fstr(pinfo->cinfo, COL_INFO, "Type: %s",
4458
53
                  val_to_str_ext_const(type, &openflow_v4_type_values_ext, "Unknown message type"));
4459
4460
    /* Create display subtree for the protocol */
4461
53
    ti = proto_tree_add_item(tree, proto_openflow_v4, tvb, 0, -1, ENC_NA);
4462
53
    openflow_tree = proto_item_add_subtree(ti, ett_openflow_v4);
4463
4464
53
    dissect_openflow_message_v4(tvb, pinfo, openflow_tree, offset);
4465
4466
53
    return tvb_reported_length(tvb);
4467
53
}
4468
4469
/*
4470
 * Register the protocol with Wireshark.
4471
 */
4472
void
4473
proto_register_openflow_v4(void)
4474
15
{
4475
4476
15
    static hf_register_info hf[] = {
4477
15
        { &hf_openflow_v4_version,
4478
15
            { "Version", "openflow_v4.version",
4479
15
               FT_UINT8, BASE_HEX, VALS(openflow_v4_version_values), 0x0,
4480
15
               NULL, HFILL }
4481
15
        },
4482
15
        { &hf_openflow_v4_type,
4483
15
            { "Type", "openflow_v4.type",
4484
15
               FT_UINT8, BASE_DEC | BASE_EXT_STRING, &openflow_v4_type_values_ext, 0x0,
4485
15
               NULL, HFILL }
4486
15
        },
4487
15
        { &hf_openflow_v4_xid,
4488
15
            { "Transaction ID", "openflow_v4.xid",
4489
15
               FT_UINT32, BASE_DEC, NULL, 0x0,
4490
15
               NULL, HFILL }
4491
15
        },
4492
15
        { &hf_openflow_v4_length,
4493
15
            { "Length", "openflow_v4.length",
4494
15
               FT_UINT16, BASE_DEC, NULL, 0x0,
4495
15
               NULL, HFILL }
4496
15
        },
4497
15
        { &hf_openflow_v4_oxm_class,
4498
15
            { "Class", "openflow_v4.oxm.class",
4499
15
               FT_UINT16, BASE_HEX, VALS(openflow_v4_oxm_class_values), 0x0,
4500
15
               NULL, HFILL }
4501
15
        },
4502
15
        { &hf_openflow_v4_oxm_field,
4503
15
            { "Field", "openflow_v4.oxm.field",
4504
15
               FT_UINT8, BASE_DEC, NULL, 0x0,
4505
15
               NULL, HFILL }
4506
15
        },
4507
15
        { &hf_openflow_v4_oxm_field_basic,
4508
15
            { "Field", "openflow_v4.oxm.field",
4509
15
               FT_UINT8, BASE_DEC | BASE_EXT_STRING, &openflow_v4_oxm_basic_field_values_ext, 0x0,
4510
15
               NULL, HFILL }
4511
15
        },
4512
15
        { &hf_openflow_v4_oxm_hm,
4513
15
            { "Has mask", "openflow_v4.oxm.hm",
4514
15
               FT_BOOLEAN, BASE_NONE, NULL, 0x0,
4515
15
               NULL, HFILL }
4516
15
        },
4517
15
        { &hf_openflow_v4_oxm_length,
4518
15
            { "Length", "openflow_v4.oxm.length",
4519
15
               FT_UINT8, BASE_DEC, NULL, 0x0,
4520
15
               NULL, HFILL }
4521
15
        },
4522
15
        { &hf_openflow_v4_oxm_experimenter_experimenter,
4523
15
            { "Experimenter", "openflow_v4.oxm_experimenter.experimenter",
4524
15
               FT_UINT32, BASE_HEX, NULL, 0x0,
4525
15
               NULL, HFILL }
4526
15
        },
4527
15
        { &hf_openflow_v4_oxm_experimenter_value,
4528
15
            { "Experimenter Value", "openflow_v4.oxm_experimenter.value",
4529
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
4530
15
               NULL, HFILL }
4531
15
        },
4532
15
        { &hf_openflow_v4_oxm_value,
4533
15
            { "Value", "openflow_v4.oxm.value",
4534
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
4535
15
               NULL, HFILL }
4536
15
        },
4537
15
        { &hf_openflow_v4_oxm_value_etheraddr,
4538
15
            { "Value", "openflow_v4.oxm.value_etheraddr",
4539
15
               FT_ETHER, BASE_NONE, NULL, 0x0,
4540
15
               NULL, HFILL }
4541
15
        },
4542
15
        { &hf_openflow_v4_oxm_value_ethertype,
4543
15
            { "Value", "openflow_v4.oxm.value_ethertype",
4544
15
               FT_UINT16, BASE_HEX, VALS(etype_vals), 0x0,
4545
15
               NULL, HFILL }
4546
15
        },
4547
15
        { &hf_openflow_v4_oxm_value_vlan_present,
4548
15
            { "OFPVID_PRESENT", "openflow_v4.oxm.value_vlan_present",
4549
15
               FT_BOOLEAN, 16, NULL, OFPVID_PRESENT,
4550
15
               NULL, HFILL }
4551
15
        },
4552
15
        { &hf_openflow_v4_oxm_value_vlan_vid,
4553
15
            { "Value", "openflow_v4.oxm.value_vlan_vid",
4554
15
               FT_UINT16, BASE_DEC, NULL, 0x0fff,
4555
15
               NULL, HFILL }
4556
15
        },
4557
15
        { &hf_openflow_v4_oxm_value_ipv4addr,
4558
15
            { "Value", "openflow_v4.oxm.value_ipv4addr",
4559
15
               FT_IPv4, BASE_NONE, NULL, 0x0,
4560
15
               NULL, HFILL }
4561
15
        },
4562
15
        { &hf_openflow_v4_oxm_value_ipv6addr,
4563
15
            { "Value", "openflow_v4.oxm.value_ipv6addr",
4564
15
               FT_IPv6, BASE_NONE, NULL, 0x0,
4565
15
               NULL, HFILL }
4566
15
        },
4567
15
        { &hf_openflow_v4_oxm_value_ipproto,
4568
15
            { "Value", "openflow_v4.oxm.value_ipproto",
4569
15
               FT_UINT8, BASE_DEC|BASE_EXT_STRING, &ipproto_val_ext, 0x0,
4570
15
               NULL, HFILL }
4571
15
        },
4572
15
        { &hf_openflow_v4_oxm_value_uint16,
4573
15
            { "Value", "openflow_v4.oxm.value_uint16",
4574
15
               FT_UINT16, BASE_DEC, NULL, 0x0,
4575
15
               NULL, HFILL }
4576
15
        },
4577
15
        { &hf_openflow_v4_oxm_value_uint24,
4578
15
            { "Value", "openflow_v4.oxm.value_uint24",
4579
15
               FT_UINT24, BASE_DEC, NULL, 0x0,
4580
15
               NULL, HFILL }
4581
15
        },
4582
15
        { &hf_openflow_v4_oxm_value_uint32,
4583
15
            { "Value", "openflow_v4.oxm.value_uint32",
4584
15
               FT_UINT32, BASE_DEC, NULL, 0x0,
4585
15
               NULL, HFILL }
4586
15
        },
4587
15
        { &hf_openflow_v4_oxm_mask,
4588
15
            { "Mask", "openflow_v4.oxm.mask",
4589
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
4590
15
               NULL, HFILL }
4591
15
        },
4592
15
        { &hf_openflow_v4_oxm_mask_etheraddr,
4593
15
            { "Mask", "openflow_v4.oxm.ether_mask",
4594
15
               FT_ETHER, BASE_NONE, NULL, 0x0,
4595
15
               NULL, HFILL }
4596
15
        },
4597
15
        { &hf_openflow_v4_oxm_mask_ipv4addr,
4598
15
            { "Mask", "openflow_v4.oxm.ipv4_mask",
4599
15
               FT_IPv4, BASE_NONE, NULL, 0x0,
4600
15
               NULL, HFILL }
4601
15
        },
4602
15
        { &hf_openflow_v4_oxm_mask_ipv6addr,
4603
15
            { "Mask", "openflow_v4.oxm.ipv6_mask",
4604
15
               FT_IPv6, BASE_NONE, NULL, 0x0,
4605
15
               NULL, HFILL }
4606
15
        },
4607
15
        { &hf_openflow_v4_oxm_mask_vlan,
4608
15
            { "Mask", "openflow_v4.oxm.vlan_mask",
4609
15
               FT_UINT16, BASE_HEX, NULL, 0x0,
4610
15
               NULL, HFILL }
4611
15
        },
4612
15
        { &hf_openflow_v4_match_type,
4613
15
            { "Type", "openflow_v4.match.type",
4614
15
               FT_UINT16, BASE_DEC, VALS(openflow_v4_match_type_values), 0x0,
4615
15
               NULL, HFILL }
4616
15
        },
4617
15
        { &hf_openflow_v4_match_length,
4618
15
            { "Length", "openflow_v4.match.length",
4619
15
               FT_UINT16, BASE_DEC, NULL, 0x0,
4620
15
               NULL, HFILL }
4621
15
        },
4622
15
        { &hf_openflow_v4_match_pad,
4623
15
            { "Pad", "openflow_v4.match.pad",
4624
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
4625
15
               NULL, HFILL }
4626
15
        },
4627
15
        { &hf_openflow_v4_action_type,
4628
15
            { "Type", "openflow_v4.action.type",
4629
15
               FT_UINT16, BASE_DEC, VALS(openflow_v4_action_type_values), 0x0,
4630
15
               NULL, HFILL }
4631
15
        },
4632
15
        { &hf_openflow_v4_action_length,
4633
15
            { "Length", "openflow_v4.action.length",
4634
15
               FT_UINT16, BASE_DEC, NULL, 0x0,
4635
15
               NULL, HFILL }
4636
15
        },
4637
15
        { &hf_openflow_v4_action_experimenter_experimenter,
4638
15
            { "Experimenter", "openflow_v4.action_experimenter.experimenter",
4639
15
               FT_UINT32, BASE_HEX, NULL, 0x0,
4640
15
               NULL, HFILL }
4641
15
        },
4642
15
        { &hf_openflow_v4_action_output_port,
4643
15
            { "Port", "openflow_v4.action.output.port",
4644
15
               FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_port_reserved_values), 0x0,
4645
15
               NULL, HFILL }
4646
15
        },
4647
15
        { &hf_openflow_v4_action_output_max_len,
4648
15
            { "Max length", "openflow_v4.action.output.max_len",
4649
15
               FT_UINT16, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_controller_max_len_reserved_values), 0x0,
4650
15
               NULL, HFILL }
4651
15
        },
4652
15
        { &hf_openflow_v4_action_output_pad,
4653
15
            { "Pad", "openflow_v4.action.output.pad",
4654
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
4655
15
               NULL, HFILL }
4656
15
        },
4657
15
        { &hf_openflow_v4_action_copy_ttl_out_pad,
4658
15
            { "Pad", "openflow_v4.action.copy_ttl_out.pad",
4659
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
4660
15
               NULL, HFILL }
4661
15
        },
4662
15
        { &hf_openflow_v4_action_copy_ttl_in_pad,
4663
15
            { "Pad", "openflow_v4.action.copy_ttl_in.pad",
4664
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
4665
15
               NULL, HFILL }
4666
15
        },
4667
15
        { &hf_openflow_v4_action_set_mpls_ttl_ttl,
4668
15
            { "TTL", "openflow_v4.action.set_mpls_ttl.ttl",
4669
15
               FT_UINT8, BASE_DEC, NULL, 0x0,
4670
15
               NULL, HFILL }
4671
15
        },
4672
15
        { &hf_openflow_v4_action_set_mpls_ttl_pad,
4673
15
            { "Pad", "openflow_v4.action.set_mpls_ttl.pad",
4674
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
4675
15
               NULL, HFILL }
4676
15
        },
4677
15
        { &hf_openflow_v4_action_dec_mpls_ttl_pad,
4678
15
            { "Pad", "openflow_v4.action.dec_mpls_ttl.pad",
4679
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
4680
15
               NULL, HFILL }
4681
15
        },
4682
15
        { &hf_openflow_v4_action_push_vlan_ethertype,
4683
15
            { "Ethertype", "openflow_v4.action.push_vlan.ethertype",
4684
15
               FT_UINT16, BASE_HEX, VALS(etype_vals), 0x0,
4685
15
               NULL, HFILL }
4686
15
        },
4687
15
        { &hf_openflow_v4_action_push_vlan_pad,
4688
15
            { "Pad", "openflow_v4.action.push_vlan.pad",
4689
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
4690
15
               NULL, HFILL }
4691
15
        },
4692
15
        { &hf_openflow_v4_action_pop_vlan_pad,
4693
15
            { "Pad", "openflow_v4.action.pop_vlan.pad",
4694
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
4695
15
               NULL, HFILL }
4696
15
        },
4697
15
        { &hf_openflow_v4_action_push_mpls_ethertype,
4698
15
            { "Ethertype", "openflow_v4.action.push_mpls.ethertype",
4699
15
               FT_UINT16, BASE_HEX, VALS(etype_vals), 0x0,
4700
15
               NULL, HFILL }
4701
15
        },
4702
15
        { &hf_openflow_v4_action_push_mpls_pad,
4703
15
            { "Pad", "openflow_v4.action.push_mpls.pad",
4704
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
4705
15
               NULL, HFILL }
4706
15
        },
4707
15
        { &hf_openflow_v4_action_pop_mpls_ethertype,
4708
15
            { "Ethertype", "openflow_v4.action.pop_mpls.ethertype",
4709
15
               FT_UINT16, BASE_HEX, VALS(etype_vals), 0x0,
4710
15
               NULL, HFILL }
4711
15
        },
4712
15
        { &hf_openflow_v4_action_pop_mpls_pad,
4713
15
            { "Pad", "openflow_v4.action.pop_mpls.pad",
4714
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
4715
15
               NULL, HFILL }
4716
15
        },
4717
15
        { &hf_openflow_v4_action_set_queue_queue_id,
4718
15
            { "Queue ID", "openflow_v4.action.set_queue.queue_id",
4719
15
               FT_UINT32, BASE_DEC, NULL, 0x0,
4720
15
               NULL, HFILL }
4721
15
        },
4722
15
        { &hf_openflow_v4_action_group_group_id,
4723
15
            { "Group ID", "openflow_v4.action.group.group_id",
4724
15
               FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_port_reserved_values), 0x0,
4725
15
               NULL, HFILL }
4726
15
        },
4727
15
        { &hf_openflow_v4_action_set_nw_ttl_ttl,
4728
15
            { "TTL", "openflow_v4.action.set_nw_ttl.ttl",
4729
15
               FT_UINT8, BASE_DEC, NULL, 0x0,
4730
15
               NULL, HFILL }
4731
15
        },
4732
15
        { &hf_openflow_v4_action_set_nw_ttl_pad,
4733
15
            { "Pad", "openflow_v4.action.set_nw_ttl.pad",
4734
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
4735
15
               NULL, HFILL }
4736
15
        },
4737
15
        { &hf_openflow_v4_action_dec_nw_ttl_pad,
4738
15
            { "Pad", "openflow_v4.action.dec_nw_ttl.pad",
4739
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
4740
15
               NULL, HFILL }
4741
15
        },
4742
15
        { &hf_openflow_v4_action_set_field_pad,
4743
15
            { "Pad", "openflow_v4.action.set_field.pad",
4744
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
4745
15
               NULL, HFILL }
4746
15
        },
4747
15
        { &hf_openflow_v4_action_push_pbb_ethertype,
4748
15
            { "Ethertype", "openflow_v4.action.push_pbb.ethertype",
4749
15
               FT_UINT16, BASE_HEX, VALS(etype_vals), 0x0,
4750
15
               NULL, HFILL }
4751
15
        },
4752
15
        { &hf_openflow_v4_action_push_pbb_pad,
4753
15
            { "Pad", "openflow_v4.action.push_pbb.pad",
4754
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
4755
15
               NULL, HFILL }
4756
15
        },
4757
15
        { &hf_openflow_v4_action_pop_pbb_pad,
4758
15
            { "Pad", "openflow_v4.action.pop_pbb.pad",
4759
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
4760
15
               NULL, HFILL }
4761
15
        },
4762
15
        { &hf_openflow_v4_instruction_type,
4763
15
            { "Type", "openflow_v4.instruction.type",
4764
15
               FT_UINT16, BASE_DEC, VALS(openflow_v4_instruction_type_values), 0x0,
4765
15
               NULL, HFILL }
4766
15
        },
4767
15
        { &hf_openflow_v4_instruction_length,
4768
15
            { "Length", "openflow_v4.instruction.length",
4769
15
               FT_UINT16, BASE_DEC, NULL, 0x0,
4770
15
               NULL, HFILL }
4771
15
        },
4772
15
        { &hf_openflow_v4_instruction_experimenter_experimenter,
4773
15
            { "Experimenter", "openflow_v4.instruction_experimenter.experimenter",
4774
15
               FT_UINT32, BASE_HEX, NULL, 0x0,
4775
15
               NULL, HFILL }
4776
15
        },
4777
15
        { &hf_openflow_v4_instruction_goto_table_table_id,
4778
15
            { "Table ID", "openflow_v4.instruction.goto_table.table_id",
4779
15
               FT_UINT8, BASE_DEC, NULL, 0x0,
4780
15
               NULL, HFILL }
4781
15
        },
4782
15
        { &hf_openflow_v4_instruction_goto_table_pad,
4783
15
            { "Pad", "openflow_v4.instruction.goto_table.pad",
4784
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
4785
15
               NULL, HFILL }
4786
15
        },
4787
15
        { &hf_openflow_v4_instruction_write_metadata_pad,
4788
15
            { "Pad", "openflow_v4.instruction.write_metadata.pad",
4789
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
4790
15
               NULL, HFILL }
4791
15
        },
4792
15
        { &hf_openflow_v4_instruction_write_metadata_value,
4793
15
            { "Value", "openflow_v4.instruction.write_metadata.value",
4794
15
               FT_UINT64, BASE_HEX, NULL, 0x0,
4795
15
               NULL, HFILL }
4796
15
        },
4797
15
        { &hf_openflow_v4_instruction_write_metadata_mask,
4798
15
            { "Mask", "openflow_v4.instruction.write_metadata.mask",
4799
15
               FT_UINT64, BASE_HEX, NULL, 0x0,
4800
15
               NULL, HFILL }
4801
15
        },
4802
15
        { &hf_openflow_v4_instruction_actions_pad,
4803
15
            { "Pad", "openflow_v4.instruction.actions.pad",
4804
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
4805
15
               NULL, HFILL }
4806
15
        },
4807
15
        { &hf_openflow_v4_instruction_meter_meter_id,
4808
15
            { "Meter ID", "openflow_v4.instruction.meter.meter_id",
4809
15
               FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_meter_id_reserved_values), 0x0,
4810
15
               NULL, HFILL }
4811
15
        },
4812
15
        { &hf_openflow_v4_port_port_no,
4813
15
            { "Port no", "openflow_v4.port.port_no",
4814
15
               FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_port_reserved_values), 0x0,
4815
15
               NULL, HFILL }
4816
15
        },
4817
15
        { &hf_openflow_v4_port_pad,
4818
15
            { "Pad", "openflow_v4.port.pad",
4819
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
4820
15
               NULL, HFILL }
4821
15
        },
4822
15
        { &hf_openflow_v4_port_hw_addr,
4823
15
            { "Hw addr", "openflow_v4.port.hw_addr",
4824
15
               FT_ETHER, BASE_NONE, NULL, 0x0,
4825
15
               NULL, HFILL }
4826
15
        },
4827
15
        { &hf_openflow_v4_port_pad2,
4828
15
            { "Pad", "openflow_v4.port.pad2",
4829
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
4830
15
               NULL, HFILL }
4831
15
        },
4832
15
        { &hf_openflow_v4_port_name,
4833
15
            { "Name", "openflow_v4.port.name",
4834
15
               FT_STRING, BASE_NONE, NULL, 0x0,
4835
15
               NULL, HFILL }
4836
15
        },
4837
15
        { &hf_openflow_v4_port_config,
4838
15
            { "Config", "openflow_v4.port.config",
4839
15
               FT_UINT32, BASE_HEX, NULL, 0x0,
4840
15
               NULL, HFILL }
4841
15
        },
4842
15
        { &hf_openflow_v4_port_config_port_down,
4843
15
            { "OFPPC_PORT_DOWN", "openflow_v4.port.config.port_down",
4844
15
               FT_BOOLEAN, 32, NULL, OFPPC_PORT_DOWN,
4845
15
               NULL, HFILL }
4846
15
        },
4847
15
        { &hf_openflow_v4_port_config_no_recv,
4848
15
            { "OFPPC_NO_RECV", "openflow_v4.port.config.no_recv",
4849
15
               FT_BOOLEAN, 32, NULL, OFPPC_NO_RECV,
4850
15
               NULL, HFILL }
4851
15
        },
4852
15
        { &hf_openflow_v4_port_config_no_fwd,
4853
15
            { "OFPPC_NO_FWD", "openflow_v4.port.config.no_fwd",
4854
15
               FT_BOOLEAN, 32, NULL, OFPPC_NO_FWD,
4855
15
               NULL, HFILL }
4856
15
        },
4857
15
        { &hf_openflow_v4_port_config_no_packet_in,
4858
15
            { "OFPPC_NO_PACKET_IN", "openflow_v4.port.config.no_packet_in",
4859
15
               FT_BOOLEAN, 32, NULL, OFPPC_NO_PACKET_IN,
4860
15
               NULL, HFILL }
4861
15
        },
4862
15
        { &hf_openflow_v4_port_state,
4863
15
            { "State", "openflow_v4.port.sate",
4864
15
               FT_UINT32, BASE_HEX, NULL, 0x0,
4865
15
               NULL, HFILL }
4866
15
        },
4867
15
        { &hf_openflow_v4_port_state_link_down,
4868
15
            { "OFPPS_LINK_DOWN", "openflow_v4.port.state.link_down",
4869
15
               FT_BOOLEAN, 32, NULL, OFPPS_LINK_DOWN,
4870
15
               NULL, HFILL }
4871
15
        },
4872
15
        { &hf_openflow_v4_port_state_blocked,
4873
15
            { "OFPPS_BLOCKED", "openflow_v4.port.state.blocked",
4874
15
               FT_BOOLEAN, 32, NULL, OFPPS_BLOCKED,
4875
15
               NULL, HFILL }
4876
15
        },
4877
15
        { &hf_openflow_v4_port_state_live,
4878
15
            { "OFPPS_LIVE", "openflow_v4.port.state.live",
4879
15
               FT_BOOLEAN, 32, NULL, OFPPS_LIVE,
4880
15
               NULL, HFILL }
4881
15
        },
4882
15
        { &hf_openflow_v4_port_current,
4883
15
            { "Current", "openflow_v4.port.current",
4884
15
               FT_UINT32, BASE_HEX, NULL, 0x0,
4885
15
               NULL, HFILL }
4886
15
        },
4887
15
        { &hf_openflow_v4_port_current_10mb_hd,
4888
15
            { "OFPPF_10MB_HD", "openflow_v4.port.current.10mb_hd",
4889
15
               FT_BOOLEAN, 32, NULL, OFPPF_10MB_HD,
4890
15
               NULL, HFILL }
4891
15
        },
4892
15
        { &hf_openflow_v4_port_current_10mb_fd,
4893
15
            { "OFPPF_10MB_FD", "openflow_v4.port.current.10mb_fd",
4894
15
               FT_BOOLEAN, 32, NULL, OFPPF_10MB_FD,
4895
15
               NULL, HFILL }
4896
15
        },
4897
15
        { &hf_openflow_v4_port_current_100mb_hd,
4898
15
            { "OFPPF_100MB_HD", "openflow_v4.port.current.100mb_hd",
4899
15
               FT_BOOLEAN, 32, NULL, OFPPF_100MB_HD,
4900
15
               NULL, HFILL }
4901
15
        },
4902
15
        { &hf_openflow_v4_port_current_100mb_fd,
4903
15
            { "OFPPF_100MB_FD", "openflow_v4.port.current.100mb_fd",
4904
15
               FT_BOOLEAN, 32, NULL, OFPPF_100MB_FD,
4905
15
               NULL, HFILL }
4906
15
        },
4907
15
        { &hf_openflow_v4_port_current_1gb_hd,
4908
15
            { "OFPPF_1GB_HD", "openflow_v4.port.current.1gb_hd",
4909
15
               FT_BOOLEAN, 32, NULL, OFPPF_1GB_HD,
4910
15
               NULL, HFILL }
4911
15
        },
4912
15
        { &hf_openflow_v4_port_current_1gb_fd,
4913
15
            { "OFPPF_1GB_FD", "openflow_v4.port.current.1gb_fd",
4914
15
               FT_BOOLEAN, 32, NULL, OFPPF_1GB_FD,
4915
15
               NULL, HFILL }
4916
15
        },
4917
15
        { &hf_openflow_v4_port_current_10gb_fd,
4918
15
            { "OFPPF_10_GB_FD", "openflow_v4.port.current.10gb_fd",
4919
15
               FT_BOOLEAN, 32, NULL, OFPPF_10GB_FD,
4920
15
               NULL, HFILL }
4921
15
        },
4922
15
        { &hf_openflow_v4_port_current_40gb_fd,
4923
15
            { "OFPPF_40GB_FD", "openflow_v4.port.current.40gb_fd",
4924
15
               FT_BOOLEAN, 32, NULL, OFPPF_40GB_FD,
4925
15
               NULL, HFILL }
4926
15
        },
4927
15
        { &hf_openflow_v4_port_current_100gb_fd,
4928
15
            { "OFPPF_100_GB_FD", "openflow_v4.port.current.100_gb_fd",
4929
15
               FT_BOOLEAN, 32, NULL, OFPPF_100GB_FD,
4930
15
               NULL, HFILL }
4931
15
        },
4932
15
        { &hf_openflow_v4_port_current_1tb_fd,
4933
15
            { "OFPPF_1TB_FD", "openflow_v4.port.current.1tb_fd",
4934
15
               FT_BOOLEAN, 32, NULL, OFPPF_1TB_FD,
4935
15
               NULL, HFILL }
4936
15
        },
4937
15
        { &hf_openflow_v4_port_current_other,
4938
15
            { "OFPPF_OTHER", "openflow_v4.port.current.other",
4939
15
               FT_BOOLEAN, 32, NULL, OFPPF_OTHER,
4940
15
               NULL, HFILL }
4941
15
        },
4942
15
        { &hf_openflow_v4_port_current_copper,
4943
15
            { "OFPPF_COPPER", "openflow_v4.port.current.copper",
4944
15
               FT_BOOLEAN, 32, NULL, OFPPF_COPPER,
4945
15
               NULL, HFILL }
4946
15
        },
4947
15
        { &hf_openflow_v4_port_current_fiber,
4948
15
            { "OFPPF_FIBER", "openflow_v4.port.current.fiber",
4949
15
               FT_BOOLEAN, 32, NULL, OFPPF_FIBER,
4950
15
               NULL, HFILL }
4951
15
        },
4952
15
        { &hf_openflow_v4_port_current_autoneg,
4953
15
            { "OFPPF_AUTONEG", "openflow_v4.port.current.autoneg",
4954
15
               FT_BOOLEAN, 32, NULL, OFPPF_AUTONEG,
4955
15
               NULL, HFILL }
4956
15
        },
4957
15
        { &hf_openflow_v4_port_current_pause,
4958
15
            { "OFPPF_PAUSE", "openflow_v4.port.current.pause",
4959
15
               FT_BOOLEAN, 32, NULL, OFPPF_PAUSE,
4960
15
               NULL, HFILL }
4961
15
        },
4962
15
        { &hf_openflow_v4_port_current_pause_asym,
4963
15
            { "OFPPF_PAUSE_ASYM", "openflow_v4.port.current.pause_asym",
4964
15
               FT_BOOLEAN, 32, NULL, OFPPF_PAUSE_ASYM,
4965
15
               NULL, HFILL }
4966
15
        },
4967
15
        { &hf_openflow_v4_port_advertised,
4968
15
            { "Advertised", "openflow_v4.port.advertised",
4969
15
               FT_UINT32, BASE_HEX, NULL, 0x0,
4970
15
               NULL, HFILL }
4971
15
        },
4972
15
        { &hf_openflow_v4_port_advertised_10mb_hd,
4973
15
            { "OFPPF_10MB_HD", "openflow_v4.port.advertised.10mb_hd",
4974
15
               FT_BOOLEAN, 32, NULL, OFPPF_10MB_HD,
4975
15
               NULL, HFILL }
4976
15
        },
4977
15
        { &hf_openflow_v4_port_advertised_10mb_fd,
4978
15
            { "OFPPF_10MB_FD", "openflow_v4.port.advertised.10mb_fd",
4979
15
               FT_BOOLEAN, 32, NULL, OFPPF_10MB_FD,
4980
15
               NULL, HFILL }
4981
15
        },
4982
15
        { &hf_openflow_v4_port_advertised_100mb_hd,
4983
15
            { "OFPPF_100MB_HD", "openflow_v4.port.advertised.100mb_hd",
4984
15
               FT_BOOLEAN, 32, NULL, OFPPF_100MB_HD,
4985
15
               NULL, HFILL }
4986
15
        },
4987
15
        { &hf_openflow_v4_port_advertised_100mb_fd,
4988
15
            { "OFPPF_100MB_FD", "openflow_v4.port.advertised.100mb_fd",
4989
15
               FT_BOOLEAN, 32, NULL, OFPPF_100MB_FD,
4990
15
               NULL, HFILL }
4991
15
        },
4992
15
        { &hf_openflow_v4_port_advertised_1gb_hd,
4993
15
            { "OFPPF_1GB_HD", "openflow_v4.port.advertised.1gb_hd",
4994
15
               FT_BOOLEAN, 32, NULL, OFPPF_1GB_HD,
4995
15
               NULL, HFILL }
4996
15
        },
4997
15
        { &hf_openflow_v4_port_advertised_1gb_fd,
4998
15
            { "OFPPF_1GB_FD", "openflow_v4.port.advertised.1gb_fd",
4999
15
               FT_BOOLEAN, 32, NULL, OFPPF_1GB_FD,
5000
15
               NULL, HFILL }
5001
15
        },
5002
15
        { &hf_openflow_v4_port_advertised_10gb_fd,
5003
15
            { "OFPPF_10_GB_FD", "openflow_v4.port.advertised.10gb_fd",
5004
15
               FT_BOOLEAN, 32, NULL, OFPPF_10GB_FD,
5005
15
               NULL, HFILL }
5006
15
        },
5007
15
        { &hf_openflow_v4_port_advertised_40gb_fd,
5008
15
            { "OFPPF_40GB_FD", "openflow_v4.port.advertised.40gb_fd",
5009
15
               FT_BOOLEAN, 32, NULL, OFPPF_40GB_FD,
5010
15
               NULL, HFILL }
5011
15
        },
5012
15
        { &hf_openflow_v4_port_advertised_100gb_fd,
5013
15
            { "OFPPF_100GB_FD", "openflow_v4.port.advertised.100gb_fd",
5014
15
               FT_BOOLEAN, 32, NULL, OFPPF_100GB_FD,
5015
15
               NULL, HFILL }
5016
15
        },
5017
15
        { &hf_openflow_v4_port_advertised_1tb_fd,
5018
15
            { "OFPPF_1TB_FD", "openflow_v4.port.advertised.1tb_fd",
5019
15
               FT_BOOLEAN, 32, NULL, OFPPF_1TB_FD,
5020
15
               NULL, HFILL }
5021
15
        },
5022
15
        { &hf_openflow_v4_port_advertised_other,
5023
15
            { "OFPPF_OTHER", "openflow_v4.port.advertised.other",
5024
15
               FT_BOOLEAN, 32, NULL, OFPPF_OTHER,
5025
15
               NULL, HFILL }
5026
15
        },
5027
15
        { &hf_openflow_v4_port_advertised_copper,
5028
15
            { "OFPPF_COPPER", "openflow_v4.port.advertised.copper",
5029
15
               FT_BOOLEAN, 32, NULL, OFPPF_COPPER,
5030
15
               NULL, HFILL }
5031
15
        },
5032
15
        { &hf_openflow_v4_port_advertised_fiber,
5033
15
            { "OFPPF_FIBER", "openflow_v4.port.advertised.fiber",
5034
15
               FT_BOOLEAN, 32, NULL, OFPPF_FIBER,
5035
15
               NULL, HFILL }
5036
15
        },
5037
15
        { &hf_openflow_v4_port_advertised_autoneg,
5038
15
            { "OFPPF_AUTONEG", "openflow_v4.port.advertised.autoneg",
5039
15
               FT_BOOLEAN, 32, NULL, OFPPF_AUTONEG,
5040
15
               NULL, HFILL }
5041
15
        },
5042
15
        { &hf_openflow_v4_port_advertised_pause,
5043
15
            { "OFPPF_PAUSE", "openflow_v4.port.advertised.pause",
5044
15
               FT_BOOLEAN, 32, NULL, OFPPF_PAUSE,
5045
15
               NULL, HFILL }
5046
15
        },
5047
15
        { &hf_openflow_v4_port_advertised_pause_asym,
5048
15
            { "OFPPF_PAUSE_ASYM", "openflow_v4.port.advertised.pause_asym",
5049
15
               FT_BOOLEAN, 32, NULL, OFPPF_PAUSE_ASYM,
5050
15
               NULL, HFILL }
5051
15
        },
5052
15
        { &hf_openflow_v4_port_supported,
5053
15
            { "Supported", "openflow_v4.port.supported",
5054
15
               FT_UINT32, BASE_HEX, NULL, 0x0,
5055
15
               NULL, HFILL }
5056
15
        },
5057
15
        { &hf_openflow_v4_port_supported_10mb_hd,
5058
15
            { "OFPPF_10MB_HD", "openflow_v4.port.supported.10mb_hd",
5059
15
               FT_BOOLEAN, 32, NULL, OFPPF_10MB_HD,
5060
15
               NULL, HFILL }
5061
15
        },
5062
15
        { &hf_openflow_v4_port_supported_10mb_fd,
5063
15
            { "OFPPF_10MB_FD", "openflow_v4.port.supported.10mb_fd",
5064
15
               FT_BOOLEAN, 32, NULL, OFPPF_10MB_FD,
5065
15
               NULL, HFILL }
5066
15
        },
5067
15
        { &hf_openflow_v4_port_supported_100mb_hd,
5068
15
            { "OFPPF_100MB_HD", "openflow_v4.port.supported.100mb_hd",
5069
15
               FT_BOOLEAN, 32, NULL, OFPPF_100MB_HD,
5070
15
               NULL, HFILL }
5071
15
        },
5072
15
        { &hf_openflow_v4_port_supported_100mb_fd,
5073
15
            { "OFPPF_100MB_FD", "openflow_v4.port.supported.100mb_fd",
5074
15
               FT_BOOLEAN, 32, NULL, OFPPF_100MB_FD,
5075
15
               NULL, HFILL }
5076
15
        },
5077
15
        { &hf_openflow_v4_port_supported_1gb_hd,
5078
15
            { "OFPPF_1GB_HD", "openflow_v4.port.supported.1gb_hd",
5079
15
               FT_BOOLEAN, 32, NULL, OFPPF_1GB_HD,
5080
15
               NULL, HFILL }
5081
15
        },
5082
15
        { &hf_openflow_v4_port_supported_1gb_fd,
5083
15
            { "OFPPF_1GB_FD", "openflow_v4.port.supported.1gb_fd",
5084
15
               FT_BOOLEAN, 32, NULL, OFPPF_1GB_FD,
5085
15
               NULL, HFILL }
5086
15
        },
5087
15
        { &hf_openflow_v4_port_supported_10gb_fd,
5088
15
            { "OFPPF_10_GB_FD", "openflow_v4.port.supported.10gb_fd",
5089
15
               FT_BOOLEAN, 32, NULL, OFPPF_10GB_FD,
5090
15
               NULL, HFILL }
5091
15
        },
5092
15
        { &hf_openflow_v4_port_supported_40gb_fd,
5093
15
            { "OFPPF_40GB_FD", "openflow_v4.port.supported.40gb_fd",
5094
15
               FT_BOOLEAN, 32, NULL, OFPPF_40GB_FD,
5095
15
               NULL, HFILL }
5096
15
        },
5097
15
        { &hf_openflow_v4_port_supported_100gb_fd,
5098
15
            { "OFPPF_100GB_FD", "openflow_v4.port.supported.100gb_fd",
5099
15
               FT_BOOLEAN, 32, NULL, OFPPF_100GB_FD,
5100
15
               NULL, HFILL }
5101
15
        },
5102
15
        { &hf_openflow_v4_port_supported_1tb_fd,
5103
15
            { "OFPPF_1TB_FD", "openflow_v4.port.supported.1tb_fd",
5104
15
               FT_BOOLEAN, 32, NULL, OFPPF_1TB_FD,
5105
15
               NULL, HFILL }
5106
15
        },
5107
15
        { &hf_openflow_v4_port_supported_other,
5108
15
            { "OFPPF_OTHER", "openflow_v4.port.supported.other",
5109
15
               FT_BOOLEAN, 32, NULL, OFPPF_OTHER,
5110
15
               NULL, HFILL }
5111
15
        },
5112
15
        { &hf_openflow_v4_port_supported_copper,
5113
15
            { "OFPPF_COPPER", "openflow_v4.port.supported.copper",
5114
15
               FT_BOOLEAN, 32, NULL, OFPPF_COPPER,
5115
15
               NULL, HFILL }
5116
15
        },
5117
15
        { &hf_openflow_v4_port_supported_fiber,
5118
15
            { "OFPPF_FIBER", "openflow_v4.port.supported.fiber",
5119
15
               FT_BOOLEAN, 32, NULL, OFPPF_FIBER,
5120
15
               NULL, HFILL }
5121
15
        },
5122
15
        { &hf_openflow_v4_port_supported_autoneg,
5123
15
            { "OFPPF_AUTONEG", "openflow_v4.port.supported.autoneg",
5124
15
               FT_BOOLEAN, 32, NULL, OFPPF_AUTONEG,
5125
15
               NULL, HFILL }
5126
15
        },
5127
15
        { &hf_openflow_v4_port_supported_pause,
5128
15
            { "OFPPF_PAUSE", "openflow_v4.port.supported.pause",
5129
15
               FT_BOOLEAN, 32, NULL, OFPPF_PAUSE,
5130
15
               NULL, HFILL }
5131
15
        },
5132
15
        { &hf_openflow_v4_port_supported_pause_asym,
5133
15
            { "OFPPF_PAUSE_ASYM", "openflow_v4.port.supported.pause_asym",
5134
15
               FT_BOOLEAN, 32, NULL, OFPPF_PAUSE_ASYM,
5135
15
               NULL, HFILL }
5136
15
        },
5137
15
        { &hf_openflow_v4_port_peer,
5138
15
            { "Peer", "openflow_v4.port.peer",
5139
15
               FT_UINT32, BASE_HEX, NULL, 0x0,
5140
15
               NULL, HFILL }
5141
15
        },
5142
15
        { &hf_openflow_v4_port_peer_10mb_hd,
5143
15
            { "OFPPF_10MB_HD", "openflow_v4.port.peer.10mb_hd",
5144
15
               FT_BOOLEAN, 32, NULL, OFPPF_10MB_HD,
5145
15
               NULL, HFILL }
5146
15
        },
5147
15
        { &hf_openflow_v4_port_peer_10mb_fd,
5148
15
            { "OFPPF_10MB_FD", "openflow_v4.port.peer.10mb_fd",
5149
15
               FT_BOOLEAN, 32, NULL, OFPPF_10MB_FD,
5150
15
               NULL, HFILL }
5151
15
        },
5152
15
        { &hf_openflow_v4_port_peer_100mb_hd,
5153
15
            { "OFPPF_100MB_HD", "openflow_v4.port.peer.100mb_hd",
5154
15
               FT_BOOLEAN, 32, NULL, OFPPF_100MB_HD,
5155
15
               NULL, HFILL }
5156
15
        },
5157
15
        { &hf_openflow_v4_port_peer_100mb_fd,
5158
15
            { "OFPPF_100MB_FD", "openflow_v4.port.peer.100mb_fd",
5159
15
               FT_BOOLEAN, 32, NULL, OFPPF_100MB_FD,
5160
15
               NULL, HFILL }
5161
15
        },
5162
15
        { &hf_openflow_v4_port_peer_1gb_hd,
5163
15
            { "OFPPF_1GB_HD", "openflow_v4.port.peer.1gb_hd",
5164
15
               FT_BOOLEAN, 32, NULL, OFPPF_1GB_HD,
5165
15
               NULL, HFILL }
5166
15
        },
5167
15
        { &hf_openflow_v4_port_peer_1gb_fd,
5168
15
            { "OFPPF_1GB_FD", "openflow_v4.port.peer.1gb_fd",
5169
15
               FT_BOOLEAN, 32, NULL, OFPPF_1GB_FD,
5170
15
               NULL, HFILL }
5171
15
        },
5172
15
        { &hf_openflow_v4_port_peer_10gb_fd,
5173
15
            { "OFPPF_10_GB_FD", "openflow_v4.port.peer.10gb_fd",
5174
15
               FT_BOOLEAN, 32, NULL, OFPPF_10GB_FD,
5175
15
               NULL, HFILL }
5176
15
        },
5177
15
        { &hf_openflow_v4_port_peer_40gb_fd,
5178
15
            { "OFPPF_40GB_FD", "openflow_v4.port.peer.40gb_fd",
5179
15
               FT_BOOLEAN, 32, NULL, OFPPF_40GB_FD,
5180
15
               NULL, HFILL }
5181
15
        },
5182
15
        { &hf_openflow_v4_port_peer_100gb_fd,
5183
15
            { "OFPPF_100GB_FD", "openflow_v4.port.peer.100gb_fd",
5184
15
               FT_BOOLEAN, 32, NULL, OFPPF_100GB_FD,
5185
15
               NULL, HFILL }
5186
15
        },
5187
15
        { &hf_openflow_v4_port_peer_1tb_fd,
5188
15
            { "OFPPF_1TB_FD", "openflow_v4.port.peer.1tb_fd",
5189
15
               FT_BOOLEAN, 32, NULL, OFPPF_1TB_FD,
5190
15
               NULL, HFILL }
5191
15
        },
5192
15
        { &hf_openflow_v4_port_peer_other,
5193
15
            { "OFPPF_OTHER", "openflow_v4.port.peer.other",
5194
15
               FT_BOOLEAN, 32, NULL, OFPPF_OTHER,
5195
15
               NULL, HFILL }
5196
15
        },
5197
15
        { &hf_openflow_v4_port_peer_copper,
5198
15
            { "OFPPF_COPPER", "openflow_v4.port.peer.copper",
5199
15
               FT_BOOLEAN, 32, NULL, OFPPF_COPPER,
5200
15
               NULL, HFILL }
5201
15
        },
5202
15
        { &hf_openflow_v4_port_peer_fiber,
5203
15
            { "OFPPF_FIBER", "openflow_v4.port.peer.fiber",
5204
15
               FT_BOOLEAN, 32, NULL, OFPPF_FIBER,
5205
15
               NULL, HFILL }
5206
15
        },
5207
15
        { &hf_openflow_v4_port_peer_autoneg,
5208
15
            { "OFPPF_AUTONEG", "openflow_v4.port.peer.autoneg",
5209
15
               FT_BOOLEAN, 32, NULL, OFPPF_AUTONEG,
5210
15
               NULL, HFILL }
5211
15
        },
5212
15
        { &hf_openflow_v4_port_peer_pause,
5213
15
            { "OFPPF_PAUSE", "openflow_v4.port.peer.pause",
5214
15
               FT_BOOLEAN, 32, NULL, OFPPF_PAUSE,
5215
15
               NULL, HFILL }
5216
15
        },
5217
15
        { &hf_openflow_v4_port_peer_pause_asym,
5218
15
            { "OFPPF_PAUSE_ASYM", "openflow_v4.port.peer.pause_asym",
5219
15
               FT_BOOLEAN, 32, NULL, OFPPF_PAUSE_ASYM,
5220
15
               NULL, HFILL }
5221
15
        },
5222
15
        { &hf_openflow_v4_port_curr_speed,
5223
15
            { "Curr speed", "openflow_v4.port.curr_speed",
5224
15
               FT_UINT32, BASE_DEC, NULL, 0x0,
5225
15
               NULL, HFILL }
5226
15
        },
5227
15
        { &hf_openflow_v4_port_max_speed,
5228
15
            { "Max speed", "openflow_v4.port.max_speed",
5229
15
               FT_UINT32, BASE_DEC, NULL, 0x0,
5230
15
               NULL, HFILL }
5231
15
        },
5232
15
        { &hf_openflow_v4_meter_band_type,
5233
15
            { "Type", "openflow_v4.meter_band.type",
5234
15
               FT_UINT16, BASE_DEC, VALS(openflow_v4_meter_band_type_values), 0x0,
5235
15
               NULL, HFILL }
5236
15
        },
5237
15
        { &hf_openflow_v4_meter_band_len,
5238
15
            { "Length", "openflow_v4.meter_band.length",
5239
15
               FT_UINT16, BASE_DEC, NULL, 0x0,
5240
15
               NULL, HFILL }
5241
15
        },
5242
15
        { &hf_openflow_v4_meter_band_rate,
5243
15
            { "Rate", "openflow_v4.meter_band.rate",
5244
15
               FT_UINT32, BASE_DEC, NULL, 0x0,
5245
15
               NULL, HFILL }
5246
15
        },
5247
15
        { &hf_openflow_v4_meter_band_burst_size,
5248
15
            { "Burst size", "openflow_v4.meter_band.burst_size",
5249
15
               FT_UINT32, BASE_DEC, NULL, 0x0,
5250
15
               NULL, HFILL }
5251
15
        },
5252
15
        { &hf_openflow_v4_meter_band_drop_pad,
5253
15
            { "Pad", "openflow_v4.meter_band.drop.pad",
5254
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
5255
15
               NULL, HFILL }
5256
15
        },
5257
15
        { &hf_openflow_v4_meter_band_dscp_remark_prec_level,
5258
15
            { "Precedence level", "openflow_v4.meter_band.dscp_remark.prec_level",
5259
15
               FT_UINT8, BASE_DEC, NULL, 0x0,
5260
15
               NULL, HFILL }
5261
15
        },
5262
15
        { &hf_openflow_v4_meter_band_dscp_remark_pad,
5263
15
            { "Pad", "openflow_v4.meter_band.dscp_remark.pad",
5264
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
5265
15
               NULL, HFILL }
5266
15
        },
5267
15
        { &hf_openflow_v4_meter_band_experimenter_experimenter,
5268
15
            { "Experimenter", "openflow_v4.meter_band.experimenter.experimenter",
5269
15
               FT_UINT32, BASE_DEC, NULL, 0x0,
5270
15
               NULL, HFILL }
5271
15
        },
5272
15
        { &hf_openflow_v4_hello_element_type,
5273
15
            { "Type", "openflow_v4.hello_element.type",
5274
15
               FT_UINT16, BASE_DEC, VALS(openflow_v4_hello_element_type_values), 0x0,
5275
15
               NULL, HFILL }
5276
15
        },
5277
15
        { &hf_openflow_v4_hello_element_length,
5278
15
            { "Length", "openflow_v4.hello_element.length",
5279
15
               FT_UINT16, BASE_DEC, NULL, 0x0,
5280
15
               NULL, HFILL }
5281
15
        },
5282
15
        { &hf_openflow_v4_hello_element_version_bitmap,
5283
15
            { "Bitmap", "openflow_v4.hello_element.version.bitmap",
5284
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
5285
15
               NULL, HFILL }
5286
15
        },
5287
15
        { &hf_openflow_v4_hello_element_pad,
5288
15
            { "Pad", "openflow_v4.hello_element.pad",
5289
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
5290
15
               NULL, HFILL }
5291
15
        },
5292
15
        { &hf_openflow_v4_error_type,
5293
15
            { "Type", "openflow_v4.error.type",
5294
15
               FT_UINT16, BASE_DEC, VALS(openflow_v4_error_type_values), 0x0,
5295
15
               NULL, HFILL }
5296
15
        },
5297
15
        { &hf_openflow_v4_error_hello_failed_code,
5298
15
            { "Code", "openflow_v4.error.code",
5299
15
               FT_UINT16, BASE_DEC, VALS(openflow_v4_error_hello_failed_code_values), 0x0,
5300
15
               NULL, HFILL }
5301
15
        },
5302
15
        { &hf_openflow_v4_error_bad_request_code,
5303
15
            { "Code", "openflow_v4.error.code",
5304
15
               FT_UINT16, BASE_DEC, VALS(openflow_v4_error_bad_request_code_values), 0x0,
5305
15
               NULL, HFILL }
5306
15
        },
5307
15
        { &hf_openflow_v4_error_bad_action_code,
5308
15
            { "Code", "openflow_v4.error.code",
5309
15
               FT_UINT16, BASE_DEC, VALS(openflow_v4_error_bad_action_code_values), 0x0,
5310
15
               NULL, HFILL }
5311
15
        },
5312
15
        { &hf_openflow_v4_error_bad_instruction_code,
5313
15
            { "Code", "openflow_v4.error.code",
5314
15
               FT_UINT16, BASE_DEC, VALS(openflow_v4_error_bad_instruction_code_values), 0x0,
5315
15
               NULL, HFILL }
5316
15
        },
5317
15
        { &hf_openflow_v4_error_bad_match_code,
5318
15
            { "Code", "openflow_v4.error.code",
5319
15
               FT_UINT16, BASE_DEC, VALS(openflow_v4_error_bad_match_code_values), 0x0,
5320
15
               NULL, HFILL }
5321
15
        },
5322
15
        { &hf_openflow_v4_error_flow_mod_failed_code,
5323
15
            { "Code", "openflow_v4.error.code",
5324
15
               FT_UINT16, BASE_DEC, VALS(openflow_v4_error_flow_mod_failed_code_values), 0x0,
5325
15
               NULL, HFILL }
5326
15
        },
5327
15
        { &hf_openflow_v4_error_group_mod_failed_code,
5328
15
            { "Code", "openflow_v4.error.code",
5329
15
               FT_UINT16, BASE_DEC, VALS(openflow_v4_error_group_mod_failed_code_values), 0x0,
5330
15
               NULL, HFILL }
5331
15
        },
5332
15
        { &hf_openflow_v4_error_port_mod_failed_code,
5333
15
            { "Code", "openflow_v4.error.code",
5334
15
               FT_UINT16, BASE_DEC, VALS(openflow_v4_error_port_mod_failed_code_values), 0x0,
5335
15
               NULL, HFILL }
5336
15
        },
5337
15
        { &hf_openflow_v4_error_table_mod_failed_code,
5338
15
            { "Code", "openflow_v4.error.code",
5339
15
               FT_UINT16, BASE_DEC, VALS(openflow_v4_error_table_mod_failed_code_values), 0x0,
5340
15
               NULL, HFILL }
5341
15
        },
5342
15
        { &hf_openflow_v4_error_queue_op_failed_code,
5343
15
            { "Code", "openflow_v4.error.code",
5344
15
               FT_UINT16, BASE_DEC, VALS(openflow_v4_error_queue_op_failed_code_values), 0x0,
5345
15
               NULL, HFILL }
5346
15
        },
5347
15
        { &hf_openflow_v4_error_switch_config_failed_code,
5348
15
            { "Code", "openflow_v4.error.code",
5349
15
               FT_UINT16, BASE_DEC, VALS(openflow_v4_error_switch_config_failed_code_values), 0x0,
5350
15
               NULL, HFILL }
5351
15
        },
5352
15
        { &hf_openflow_v4_error_role_request_failed_code,
5353
15
            { "Code", "openflow_v4.error.code",
5354
15
               FT_UINT16, BASE_DEC, VALS(openflow_v4_error_role_request_failed_code_values), 0x0,
5355
15
               NULL, HFILL }
5356
15
        },
5357
15
        { &hf_openflow_v4_error_meter_mod_failed_code,
5358
15
            { "Code", "openflow_v4.error.code",
5359
15
               FT_UINT16, BASE_DEC, VALS(openflow_v4_error_meter_mod_failed_code_values), 0x0,
5360
15
               NULL, HFILL }
5361
15
        },
5362
15
        { &hf_openflow_v4_error_table_features_failed_code,
5363
15
            { "Code", "openflow_v4.error.code",
5364
15
               FT_UINT16, BASE_DEC, VALS(openflow_v4_error_table_features_failed_code_values), 0x0,
5365
15
               NULL, HFILL }
5366
15
        },
5367
15
        { &hf_openflow_v4_error_code,
5368
15
            { "Code", "openflow_v4.error.code",
5369
15
               FT_UINT16, BASE_DEC, NULL, 0x0,
5370
15
               NULL, HFILL }
5371
15
        },
5372
15
        { &hf_openflow_v4_error_data_text,
5373
15
            { "Data", "openflow_v4.error.data",
5374
15
               FT_STRING, BASE_NONE, NULL, 0x0,
5375
15
               NULL, HFILL }
5376
15
        },
5377
15
        { &hf_openflow_v4_echo_data,
5378
15
            { "Data", "openflow_v4.echo.data",
5379
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
5380
15
               NULL, HFILL }
5381
15
        },
5382
15
        { &hf_openflow_v4_error_data_body,
5383
15
            { "Body", "openflow_v4.error.data.body",
5384
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
5385
15
               NULL, HFILL }
5386
15
        },
5387
15
        { &hf_openflow_v4_error_experimenter,
5388
15
            { "Experimenter", "openflow_v4.error.experimenter",
5389
15
               FT_UINT32, BASE_HEX, NULL, 0x0,
5390
15
               NULL, HFILL }
5391
15
        },
5392
15
        { &hf_openflow_v4_experimenter_experimenter,
5393
15
            { "Experimenter", "openflow_v4.experimenter.experimenter",
5394
15
               FT_UINT32, BASE_HEX, NULL, 0x0,
5395
15
               NULL, HFILL }
5396
15
        },
5397
15
        { &hf_openflow_v4_experimenter_exp_type,
5398
15
            { "Experimenter type", "openflow_v4.experimenter.exp_type",
5399
15
               FT_UINT32, BASE_DEC, NULL, 0x0,
5400
15
               NULL, HFILL }
5401
15
        },
5402
15
        { &hf_openflow_v4_switch_features_datapath_id,
5403
15
            { "datapath_id", "openflow_v4.switch_features.datapath_id",
5404
15
               FT_UINT64, BASE_HEX, NULL, 0x0,
5405
15
               NULL, HFILL }
5406
15
        },
5407
15
        { &hf_openflow_v4_switch_features_n_buffers,
5408
15
            { "n_buffers", "openflow_v4.switch_features.n_buffers",
5409
15
               FT_UINT32, BASE_DEC, NULL, 0x0,
5410
15
               NULL, HFILL }
5411
15
        },
5412
15
        { &hf_openflow_v4_switch_features_n_tables,
5413
15
            { "n_tables", "openflow_v4.switch_features.n_tables",
5414
15
               FT_UINT8, BASE_DEC, NULL, 0x0,
5415
15
               NULL, HFILL }
5416
15
        },
5417
15
        { &hf_openflow_v4_switch_features_auxiliary_id,
5418
15
            { "auxiliary_id", "openflow_v4.switch_features.auxiliary_id",
5419
15
               FT_UINT8, BASE_DEC, NULL, 0x0,
5420
15
               NULL, HFILL }
5421
15
        },
5422
15
        { &hf_openflow_v4_switch_features_pad,
5423
15
            { "Pad", "openflow_v4.switch_features.pad",
5424
15
               FT_UINT16, BASE_DEC, NULL, 0x0,
5425
15
               NULL, HFILL }
5426
15
        },
5427
15
        { &hf_openflow_v4_switch_features_capabilities,
5428
15
            { "capabilities", "openflow_v4.switch_features.capabilities",
5429
15
               FT_UINT32, BASE_HEX, NULL, 0x0,
5430
15
               NULL, HFILL }
5431
15
        },
5432
15
        { &hf_openflow_v4_switch_features_capabilities_flow_stats,
5433
15
            { "OFPC_FLOW_STATS", "openflow_v4.switch_features.capabilities.flow_stats",
5434
15
               FT_BOOLEAN, 32, NULL, OFPC_FLOW_STATS,
5435
15
               NULL, HFILL }
5436
15
        },
5437
15
        { &hf_openflow_v4_switch_features_capabilities_table_stats,
5438
15
            { "OFPC_TABLE_STATS", "openflow_v4.switch_features.capabilities.table_stats",
5439
15
               FT_BOOLEAN, 32, NULL, OFPC_TABLE_STATS,
5440
15
               NULL, HFILL }
5441
15
        },
5442
15
        { &hf_openflow_v4_switch_features_capabilities_port_stats,
5443
15
            { "OFPC_PORT_STATS", "openflow_v4.switch_features.capabilities.port_stats",
5444
15
               FT_BOOLEAN, 32, NULL,  OFPC_PORT_STATS,
5445
15
               NULL, HFILL }
5446
15
        },
5447
15
        { &hf_openflow_v4_switch_features_capabilities_group_stats,
5448
15
            { "OFPC_GROUP_STATS", "openflow_v4.switch_features.capabilities.group_stats",
5449
15
               FT_BOOLEAN, 32, NULL, OFPC_GROUP_STATS,
5450
15
               NULL, HFILL }
5451
15
        },
5452
15
        { &hf_openflow_v4_switch_features_capabilities_ip_reasm,
5453
15
            { "OFPC_IP_REASM", "openflow_v4.switch_features.capabilities.ip_reasm",
5454
15
               FT_BOOLEAN, 32, NULL, OFPC_IP_REASM,
5455
15
               NULL, HFILL }
5456
15
        },
5457
15
        { &hf_openflow_v4_switch_features_capabilities_queue_stats,
5458
15
            { "OFPC_QUEUE_STATS", "openflow_v4.switch_features.capabilities.queue_stats",
5459
15
               FT_BOOLEAN, 32, NULL, OFPC_QUEUE_STATS,
5460
15
               NULL, HFILL }
5461
15
        },
5462
15
        { &hf_openflow_v4_switch_features_capabilities_port_blocked,
5463
15
            { "OFPC_PORT_BLOCKED", "openflow_v4.switch_features.capabilities.port_blocked",
5464
15
               FT_BOOLEAN, 32, NULL, OFPC_PORT_BLOCKED,
5465
15
               NULL, HFILL }
5466
15
        },
5467
15
        { &hf_openflow_v4_switch_features_reserved,
5468
15
            { "Reserved", "openflow_v4.switch_features_reserved",
5469
15
               FT_UINT32, BASE_HEX, NULL, 0x0,
5470
15
               NULL, HFILL }
5471
15
        },
5472
15
        { &hf_openflow_v4_switch_config_flags,
5473
15
            { "Flags", "openflow_v4.switch_config.flags",
5474
15
               FT_UINT16, BASE_HEX, NULL, 0x0,
5475
15
               NULL, HFILL }
5476
15
        },
5477
15
        { &hf_openflow_v4_switch_config_flags_fragments,
5478
15
            { "IP Fragments", "openflow_v4.switch_config.flags.fragments",
5479
15
               FT_UINT16, BASE_DEC, VALS(openflow_v4_switch_config_fragments_values), 0x0,
5480
15
               NULL, HFILL }
5481
15
        },
5482
15
        { &hf_openflow_v4_switch_config_miss_send_len,
5483
15
            { "Miss send length", "openflow_v4.switch_config.miss_send_len",
5484
15
               FT_UINT16, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_controller_max_len_reserved_values), 0x0,
5485
15
               NULL, HFILL }
5486
15
        },
5487
15
        { &hf_openflow_v4_packet_in_buffer_id,
5488
15
            { "Buffer ID", "openflow_v4.packet_in.buffer_id",
5489
15
               FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_buffer_reserved_values), 0x0,
5490
15
               NULL, HFILL }
5491
15
            },
5492
15
        { &hf_openflow_v4_packet_in_total_len,
5493
15
            { "Total length", "openflow_v4.packet_in.total_len",
5494
15
               FT_UINT16, BASE_DEC, NULL, 0x0,
5495
15
               NULL, HFILL }
5496
15
        },
5497
15
        { &hf_openflow_v4_packet_in_reason,
5498
15
            { "Reason", "openflow_v4.packet_in.reason",
5499
15
               FT_UINT8, BASE_DEC, VALS(openflow_v4_packet_in_reason_values), 0x0,
5500
15
               NULL, HFILL }
5501
15
        },
5502
15
        { &hf_openflow_v4_packet_in_table_id,
5503
15
            { "Table ID", "openflow_v4.packet_in.table_id",
5504
15
               FT_UINT8, BASE_DEC, NULL, 0x0,
5505
15
               NULL, HFILL }
5506
15
        },
5507
15
        { &hf_openflow_v4_packet_in_cookie,
5508
15
            { "Cookie", "openflow_v4.packet_in.cookie",
5509
15
               FT_UINT64, BASE_HEX, NULL, 0x0,
5510
15
               NULL, HFILL }
5511
15
        },
5512
15
        { &hf_openflow_v4_packet_in_pad,
5513
15
            { "Pad", "openflow_v4.packet_in.pad",
5514
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
5515
15
               NULL, HFILL }
5516
15
        },
5517
15
        { &hf_openflow_v4_flow_removed_cookie,
5518
15
            { "Cookie", "openflow_v4.flow_removed.cookie",
5519
15
               FT_UINT64, BASE_HEX, NULL, 0x0,
5520
15
               NULL, HFILL }
5521
15
        },
5522
15
        { &hf_openflow_v4_flow_removed_priority,
5523
15
            { "Priority", "openflow_v4.flow_removed.priority",
5524
15
               FT_UINT16, BASE_DEC, NULL, 0x0,
5525
15
               NULL, HFILL }
5526
15
        },
5527
15
        { &hf_openflow_v4_flow_removed_reason,
5528
15
            { "Reason", "openflow_v4.flow_removed.reason",
5529
15
               FT_UINT8, BASE_DEC, VALS(openflow_v4_flow_removed_reason_values), 0x0,
5530
15
               NULL, HFILL }
5531
15
        },
5532
15
        { &hf_openflow_v4_flow_removed_table_id,
5533
15
            { "Table ID", "openflow_v4.flow_removed.table_id",
5534
15
               FT_UINT8, BASE_DEC, NULL, 0x0,
5535
15
               NULL, HFILL }
5536
15
        },
5537
15
        { &hf_openflow_v4_flow_removed_duration_sec,
5538
15
            { "Duration sec", "openflow_v4.flow_removed.duration_sec",
5539
15
               FT_UINT32, BASE_DEC, NULL, 0x0,
5540
15
               NULL, HFILL }
5541
15
        },
5542
15
        { &hf_openflow_v4_flow_removed_duration_nsec,
5543
15
            { "Duration nsec", "openflow_v4.flow_removed.duration_nsec",
5544
15
               FT_UINT32, BASE_DEC, NULL, 0x0,
5545
15
               NULL, HFILL }
5546
15
        },
5547
15
        { &hf_openflow_v4_flow_removed_idle_timeout,
5548
15
            { "Idle timeout", "openflow_v4.flow_removed.idle_timeout",
5549
15
               FT_UINT16, BASE_DEC, NULL, 0x0,
5550
15
               NULL, HFILL }
5551
15
        },
5552
15
        { &hf_openflow_v4_flow_removed_hard_timeout,
5553
15
            { "Hard timeout", "openflow_v4.flow_removed.hard_timeout",
5554
15
               FT_UINT16, BASE_DEC, NULL, 0x0,
5555
15
               NULL, HFILL }
5556
15
        },
5557
15
        { &hf_openflow_v4_flow_removed_packet_count,
5558
15
            { "Packet count", "openflow_v4.flow_removed.packet_count",
5559
15
               FT_UINT64, BASE_DEC, NULL, 0x0,
5560
15
               NULL, HFILL }
5561
15
        },
5562
15
        { &hf_openflow_v4_flow_removed_byte_count,
5563
15
            { "Byte count", "openflow_v4.flow_removed.byte_count",
5564
15
               FT_UINT64, BASE_DEC, NULL, 0x0,
5565
15
               NULL, HFILL }
5566
15
        },
5567
15
        { &hf_openflow_v4_port_status_reason,
5568
15
            { "Reason", "openflow_v4.port_status.reason",
5569
15
               FT_UINT8, BASE_DEC, VALS(openflow_v4_port_status_reason_values), 0x0,
5570
15
               NULL, HFILL }
5571
15
        },
5572
15
        { &hf_openflow_v4_port_status_pad,
5573
15
            { "Pad", "openflow_v4.port_status.pad",
5574
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
5575
15
               NULL, HFILL }
5576
15
        },
5577
15
        { &hf_openflow_v4_packet_out_buffer_id,
5578
15
            { "Buffer ID", "openflow_v4.packet_out.buffer_id",
5579
15
               FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_buffer_reserved_values), 0x0,
5580
15
               NULL, HFILL }
5581
15
            },
5582
15
        { &hf_openflow_v4_packet_out_in_port,
5583
15
            { "In port", "openflow_v4.packet_out.in_port",
5584
15
               FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_port_reserved_values), 0x0,
5585
15
               NULL, HFILL }
5586
15
        },
5587
15
        { &hf_openflow_v4_packet_out_acts_len,
5588
15
            { "Actions length", "openflow_v4.packet_out.acts_len",
5589
15
               FT_UINT16, BASE_DEC, NULL, 0x0,
5590
15
               NULL, HFILL }
5591
15
        },
5592
15
        { &hf_openflow_v4_packet_out_pad,
5593
15
            { "Pad", "openflow_v4.packet_out.pad",
5594
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
5595
15
               NULL, HFILL }
5596
15
        },
5597
15
        { &hf_openflow_v4_flowmod_cookie,
5598
15
            { "Cookie", "openflow_v4.flowmod.cookie",
5599
15
               FT_UINT64, BASE_HEX, NULL, 0x0,
5600
15
               NULL, HFILL }
5601
15
        },
5602
15
        { &hf_openflow_v4_flowmod_cookie_mask,
5603
15
            { "Cookie mask", "openflow_v4.flowmod.cookie_mask",
5604
15
               FT_UINT64, BASE_HEX, NULL, 0x0,
5605
15
               NULL, HFILL }
5606
15
        },
5607
15
        { &hf_openflow_v4_flowmod_table_id,
5608
15
            { "Table ID", "openflow_v4.flowmod.table_id",
5609
15
               FT_UINT8, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_table_reserved_values), 0x0,
5610
15
               NULL, HFILL }
5611
15
        },
5612
15
        { &hf_openflow_v4_flowmod_command,
5613
15
            { "Command", "openflow_v4.flowmod.command",
5614
15
               FT_UINT8, BASE_DEC, VALS(openflow_v4_flowmod_command_values), 0x0,
5615
15
               NULL, HFILL }
5616
15
        },
5617
15
        { &hf_openflow_v4_flowmod_idle_timeout,
5618
15
            { "Idle timeout", "openflow_v4.flowmod.idle_timeout",
5619
15
               FT_UINT16, BASE_DEC, NULL, 0x0,
5620
15
               NULL, HFILL }
5621
15
        },
5622
15
        { &hf_openflow_v4_flowmod_hard_timeout,
5623
15
            { "Hard timeout", "openflow_v4.flowmod.hard_timeout",
5624
15
               FT_UINT16, BASE_DEC, NULL, 0x0,
5625
15
               NULL, HFILL }
5626
15
        },
5627
15
        { &hf_openflow_v4_flowmod_priority,
5628
15
            { "Priority", "openflow_v4.flowmod.priority",
5629
15
               FT_UINT16, BASE_DEC, NULL, 0x0,
5630
15
               NULL, HFILL }
5631
15
        },
5632
15
        { &hf_openflow_v4_flowmod_buffer_id,
5633
15
            { "Buffer ID", "openflow_v4.flowmod.buffer_id",
5634
15
               FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_buffer_reserved_values), 0x0,
5635
15
               NULL, HFILL }
5636
15
        },
5637
15
        { &hf_openflow_v4_flowmod_out_port,
5638
15
            { "Out port", "openflow_v4.flowmod.out_port",
5639
15
               FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_port_reserved_values), 0x0,
5640
15
               NULL, HFILL }
5641
15
        },
5642
15
        { &hf_openflow_v4_flowmod_out_group,
5643
15
            { "Out group", "openflow_v4.flowmod.out_group",
5644
15
               FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_group_reserved_values), 0x0,
5645
15
               NULL, HFILL }
5646
15
        },
5647
15
        { &hf_openflow_v4_flowmod_flags,
5648
15
            { "Flags", "openflow_v4.flowmod.flags",
5649
15
               FT_UINT16, BASE_HEX, NULL, 0x0,
5650
15
               NULL, HFILL }
5651
15
        },
5652
15
        { &hf_openflow_v4_flowmod_flags_send_flow_rem,
5653
15
            { "Send flow removed", "openflow_v4.flowmod.flags.send_flow_rem",
5654
15
               FT_BOOLEAN, 16, NULL, OFPFF_SEND_FLOW_REM,
5655
15
               NULL, HFILL }
5656
15
        },
5657
15
        { &hf_openflow_v4_flowmod_flags_check_overlap,
5658
15
            { "Check overlap", "openflow_v4.flowmod.flags.check_overlap",
5659
15
               FT_BOOLEAN, 16, NULL, OFPFF_CHECK_OVERLAP,
5660
15
               NULL, HFILL }
5661
15
        },
5662
15
        { &hf_openflow_v4_flowmod_flags_reset_counts,
5663
15
            { "Reset counts", "openflow_v4.flowmod.flags.reset_counts",
5664
15
               FT_BOOLEAN, 16, NULL, OFPFF_RESET_COUNTS,
5665
15
               NULL, HFILL }
5666
15
        },
5667
15
        { &hf_openflow_v4_flowmod_flags_no_packet_counts,
5668
15
            { "Don't count packets", "openflow_v4.flowmod.flags.no_packet_counts",
5669
15
               FT_BOOLEAN, 16, NULL, OFPFF_NO_PKT_COUNTS,
5670
15
               NULL, HFILL }
5671
15
        },
5672
15
        { &hf_openflow_v4_flowmod_flags_no_byte_counts,
5673
15
            { "Don't count bytes", "openflow_v4.flowmod.flags.no_byte_counts",
5674
15
               FT_BOOLEAN, 16, NULL, OFPFF_NO_BYT_COUNTS,
5675
15
               NULL, HFILL }
5676
15
        },
5677
15
        { &hf_openflow_v4_flowmod_pad,
5678
15
            { "Pad", "openflow_v4.flowmod.pad",
5679
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
5680
15
               NULL, HFILL }
5681
15
        },
5682
15
        { &hf_openflow_v4_bucket_length,
5683
15
            { "Length", "openflow_v4.bucket.length",
5684
15
               FT_UINT16, BASE_DEC, NULL, 0x0,
5685
15
               NULL, HFILL }
5686
15
        },
5687
15
        { &hf_openflow_v4_bucket_weight,
5688
15
            { "Weight", "openflow_v4.bucket.weight",
5689
15
               FT_UINT16, BASE_DEC, NULL, 0x0,
5690
15
               NULL, HFILL }
5691
15
        },
5692
15
        { &hf_openflow_v4_bucket_watch_port,
5693
15
            { "Watch port", "openflow_v4.bucket.watch_port",
5694
15
               FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_port_reserved_values), 0x0,
5695
15
               NULL, HFILL }
5696
15
        },
5697
15
        { &hf_openflow_v4_bucket_watch_group,
5698
15
            { "Watch group", "openflow_v4.bucket.watch_group",
5699
15
               FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_group_reserved_values), 0x0,
5700
15
               NULL, HFILL }
5701
15
        },
5702
15
        { &hf_openflow_v4_bucket_pad,
5703
15
            { "Pad", "openflow_v4.bucket.pad",
5704
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
5705
15
               NULL, HFILL }
5706
15
        },
5707
15
        { &hf_openflow_v4_groupmod_command,
5708
15
            { "Command", "openflow_v4.groupmod.command",
5709
15
               FT_UINT16, BASE_DEC, VALS(openflow_v4_groupmod_command_values), 0x0,
5710
15
               NULL, HFILL }
5711
15
        },
5712
15
        { &hf_openflow_v4_groupmod_type,
5713
15
            { "Type", "openflow_v4.groupmod.type",
5714
15
               FT_UINT8, BASE_DEC, VALS(openflow_v4_group_type_values), 0x0,
5715
15
               NULL, HFILL }
5716
15
        },
5717
15
        { &hf_openflow_v4_groupmod_pad,
5718
15
            { "Pad", "openflow_v4.groupmod.pad",
5719
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
5720
15
               NULL, HFILL }
5721
15
        },
5722
15
        { &hf_openflow_v4_groupmod_group_id,
5723
15
            { "Group ID", "openflow_v4.groupmod.group_id",
5724
15
               FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_group_reserved_values), 0x0,
5725
15
               NULL, HFILL }
5726
15
        },
5727
15
        { &hf_openflow_v4_portmod_port_no,
5728
15
            { "Port no", "openflow_v4.portmod.port_no",
5729
15
               FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_port_reserved_values), 0x0,
5730
15
               NULL, HFILL }
5731
15
        },
5732
15
        { &hf_openflow_v4_portmod_pad,
5733
15
            { "Pad", "openflow_v4.portmod.pad",
5734
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
5735
15
               NULL, HFILL }
5736
15
        },
5737
15
        { &hf_openflow_v4_portmod_hw_addr,
5738
15
            { "Hw addr", "openflow_v4.portmod.hw_addr",
5739
15
               FT_ETHER, BASE_NONE, NULL, 0x0,
5740
15
               NULL, HFILL }
5741
15
        },
5742
15
        { &hf_openflow_v4_portmod_pad2,
5743
15
            { "Pad", "openflow_v4.portmod.pad2",
5744
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
5745
15
               NULL, HFILL }
5746
15
        },
5747
15
        { &hf_openflow_v4_portmod_config,
5748
15
            { "Config", "openflow_v4.portmod.config",
5749
15
               FT_UINT32, BASE_HEX, NULL, 0x0,
5750
15
               NULL, HFILL }
5751
15
        },
5752
15
        { &hf_openflow_v4_portmod_config_port_down,
5753
15
            { "OFPPC_PORT_DOWN", "openflow_v4.portmod.config.port_down",
5754
15
               FT_BOOLEAN, 32, NULL, OFPPC_PORT_DOWN,
5755
15
               NULL, HFILL }
5756
15
        },
5757
15
        { &hf_openflow_v4_portmod_config_no_recv,
5758
15
            { "OFPPC_NO_RECV", "openflow_v4.portmod.config.no_recv",
5759
15
               FT_BOOLEAN, 32, NULL, OFPPC_NO_RECV,
5760
15
               NULL, HFILL }
5761
15
        },
5762
15
        { &hf_openflow_v4_portmod_config_no_fwd,
5763
15
            { "OFPPC_NO_FWD", "openflow_v4.portmod.config.no_fwd",
5764
15
               FT_BOOLEAN, 32, NULL, OFPPC_NO_FWD,
5765
15
               NULL, HFILL }
5766
15
        },
5767
15
        { &hf_openflow_v4_portmod_config_no_packet_in,
5768
15
            { "OFPPC_NO_PACKET_IN", "openflow_v4.portmod.config.no_packet_in",
5769
15
               FT_BOOLEAN, 32, NULL, OFPPC_NO_PACKET_IN,
5770
15
               NULL, HFILL }
5771
15
        },
5772
15
        { &hf_openflow_v4_portmod_mask,
5773
15
            { "Mask", "openflow_v4.portmod.mask",
5774
15
               FT_UINT32, BASE_HEX, NULL, 0x0,
5775
15
               NULL, HFILL }
5776
15
        },
5777
15
        { &hf_openflow_v4_portmod_mask_port_down,
5778
15
            { "OFPPC_PORT_DOWN", "openflow_v4.portmod.mask.port_down",
5779
15
               FT_BOOLEAN, 32, NULL, OFPPC_PORT_DOWN,
5780
15
               NULL, HFILL }
5781
15
        },
5782
15
        { &hf_openflow_v4_portmod_mask_no_recv,
5783
15
            { "OFPPC_NO_RECV", "openflow_v4.portmod.mask.no_recv",
5784
15
               FT_BOOLEAN, 32, NULL, OFPPC_NO_RECV,
5785
15
               NULL, HFILL }
5786
15
        },
5787
15
        { &hf_openflow_v4_portmod_mask_no_fwd,
5788
15
            { "OFPPC_NO_FWD", "openflow_v4.portmod.mask.no_fwd",
5789
15
               FT_BOOLEAN, 32, NULL, OFPPC_NO_FWD,
5790
15
               NULL, HFILL }
5791
15
        },
5792
15
        { &hf_openflow_v4_portmod_mask_no_packet_in,
5793
15
            { "OFPPC_NO_PACKET_IN", "openflow_v4.portmod.mask.no_packet_in",
5794
15
               FT_BOOLEAN, 32, NULL, OFPPC_NO_PACKET_IN,
5795
15
               NULL, HFILL }
5796
15
        },
5797
15
        { &hf_openflow_v4_portmod_advertise,
5798
15
            { "Advertise", "openflow_v4.portmod.advertise",
5799
15
               FT_UINT32, BASE_HEX, NULL, 0x0,
5800
15
               NULL, HFILL }
5801
15
        },
5802
15
        { &hf_openflow_v4_portmod_advertise_10mb_hd,
5803
15
            { "OFPPF_10MB_HD", "openflow_v4.portmod.advertise.10mb_hd",
5804
15
               FT_BOOLEAN, 32, NULL, OFPPF_10MB_HD,
5805
15
               NULL, HFILL }
5806
15
        },
5807
15
        { &hf_openflow_v4_portmod_advertise_10mb_fd,
5808
15
            { "OFPPF_10MB_FD", "openflow_v4.portmod.advertise.10mb_fd",
5809
15
               FT_BOOLEAN, 32, NULL, OFPPF_10MB_FD,
5810
15
               NULL, HFILL }
5811
15
        },
5812
15
        { &hf_openflow_v4_portmod_advertise_100mb_hd,
5813
15
            { "OFPPF_100MB_HD", "openflow_v4.portmod.advertise.100mb_hd",
5814
15
               FT_BOOLEAN, 32, NULL, OFPPF_100MB_HD,
5815
15
               NULL, HFILL }
5816
15
        },
5817
15
        { &hf_openflow_v4_portmod_advertise_100mb_fd,
5818
15
            { "OFPPF_100MB_FD", "openflow_v4.portmod.advertise.100mb_fd",
5819
15
               FT_BOOLEAN, 32, NULL, OFPPF_100MB_FD,
5820
15
               NULL, HFILL }
5821
15
        },
5822
15
        { &hf_openflow_v4_portmod_advertise_1gb_hd,
5823
15
            { "OFPPF_1GB_HD", "openflow_v4.portmod.advertise.1gb_hd",
5824
15
               FT_BOOLEAN, 32, NULL, OFPPF_1GB_HD,
5825
15
               NULL, HFILL }
5826
15
        },
5827
15
        { &hf_openflow_v4_portmod_advertise_1gb_fd,
5828
15
            { "OFPPF_1GB_FD", "openflow_v4.portmod.advertise.1gb_fd",
5829
15
               FT_BOOLEAN, 32, NULL, OFPPF_1GB_FD,
5830
15
               NULL, HFILL }
5831
15
        },
5832
15
        { &hf_openflow_v4_portmod_advertise_10gb_fd,
5833
15
            { "OFPPF_10_GB_FD", "openflow_v4.portmod.advertise.10gb_fd",
5834
15
               FT_BOOLEAN, 32, NULL, OFPPF_10GB_FD,
5835
15
               NULL, HFILL }
5836
15
        },
5837
15
        { &hf_openflow_v4_portmod_advertise_40gb_fd,
5838
15
            { "OFPPF_40GB_FD", "openflow_v4.portmod.advertise.40gb_fd",
5839
15
               FT_BOOLEAN, 32, NULL, OFPPF_40GB_FD,
5840
15
               NULL, HFILL }
5841
15
        },
5842
15
        { &hf_openflow_v4_portmod_advertise_100gb_fd,
5843
15
            { "OFPPF_100_GB_FD", "openflow_v4.portmod.advertise.100_gb_fd",
5844
15
               FT_BOOLEAN, 32, NULL, OFPPF_100GB_FD,
5845
15
               NULL, HFILL }
5846
15
        },
5847
15
        { &hf_openflow_v4_portmod_advertise_1tb_fd,
5848
15
            { "OFPPF_1TB_FD", "openflow_v4.portmod.advertise.1tb_fd",
5849
15
               FT_BOOLEAN, 32, NULL, OFPPF_1TB_FD,
5850
15
               NULL, HFILL }
5851
15
        },
5852
15
        { &hf_openflow_v4_portmod_advertise_other,
5853
15
            { "OFPPF_OTHER", "openflow_v4.portmod.advertise.other",
5854
15
               FT_BOOLEAN, 32, NULL, OFPPF_OTHER,
5855
15
               NULL, HFILL }
5856
15
        },
5857
15
        { &hf_openflow_v4_portmod_advertise_copper,
5858
15
            { "OFPPF_COPPER", "openflow_v4.portmod.advertise.copper",
5859
15
               FT_BOOLEAN, 32, NULL, OFPPF_COPPER,
5860
15
               NULL, HFILL }
5861
15
        },
5862
15
        { &hf_openflow_v4_portmod_advertise_fiber,
5863
15
            { "OFPPF_FIBER", "openflow_v4.portmod.advertise.fiber",
5864
15
               FT_BOOLEAN, 32, NULL, OFPPF_FIBER,
5865
15
               NULL, HFILL }
5866
15
        },
5867
15
        { &hf_openflow_v4_portmod_advertise_autoneg,
5868
15
            { "OFPPF_AUTONEG", "openflow_v4.portmod.advertise.autoneg",
5869
15
               FT_BOOLEAN, 32, NULL, OFPPF_AUTONEG,
5870
15
               NULL, HFILL }
5871
15
        },
5872
15
        { &hf_openflow_v4_portmod_advertise_pause,
5873
15
            { "OFPPF_PAUSE", "openflow_v4.portmod.advertise.pause",
5874
15
               FT_BOOLEAN, 32, NULL, OFPPF_PAUSE,
5875
15
               NULL, HFILL }
5876
15
        },
5877
15
        { &hf_openflow_v4_portmod_advertise_pause_asym,
5878
15
            { "OFPPF_PAUSE_ASYM", "openflow_v4.portmod.advertise.pause_asym",
5879
15
               FT_BOOLEAN, 32, NULL, OFPPF_PAUSE_ASYM,
5880
15
               NULL, HFILL }
5881
15
        },
5882
15
        { &hf_openflow_v4_portmod_pad3,
5883
15
            { "Pad", "openflow_v4.portmod.pad3",
5884
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
5885
15
               NULL, HFILL }
5886
15
        },
5887
15
        { &hf_openflow_v4_tablemod_table_id,
5888
15
            { "Table ID", "openflow_v4.tablemod.table_id",
5889
15
               FT_UINT8, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_table_reserved_values), 0x0,
5890
15
               NULL, HFILL }
5891
15
        },
5892
15
        { &hf_openflow_v4_tablemod_pad,
5893
15
            { "Pad", "openflow_v4.tablemod.pad",
5894
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
5895
15
               NULL, HFILL }
5896
15
        },
5897
15
        { &hf_openflow_v4_tablemod_config,
5898
15
            { "Config", "openflow_v4.tablemod.config",
5899
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
5900
15
               NULL, HFILL }
5901
15
        },
5902
15
        { &hf_openflow_v4_flow_stats_request_table_id,
5903
15
            { "Table ID", "openflow_v4.flow_stats_request.table_id",
5904
15
               FT_UINT8, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_table_reserved_values), 0x0,
5905
15
               NULL, HFILL }
5906
15
        },
5907
15
        { &hf_openflow_v4_flow_stats_request_pad,
5908
15
            { "Pad", "openflow_v4.flow_stats_request.pad",
5909
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
5910
15
               NULL, HFILL }
5911
15
        },
5912
15
        { &hf_openflow_v4_flow_stats_request_out_port,
5913
15
            { "Out port", "openflow_v4.flow_stats_request.out_port",
5914
15
               FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_port_reserved_values), 0x0,
5915
15
               NULL, HFILL }
5916
15
        },
5917
15
        { &hf_openflow_v4_flow_stats_request_out_group,
5918
15
            { "Out group", "openflow_v4.flow_stats_request.out_group",
5919
15
               FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_group_reserved_values), 0x0,
5920
15
               NULL, HFILL }
5921
15
        },
5922
15
        { &hf_openflow_v4_flow_stats_request_pad2,
5923
15
            { "Pad", "openflow_v4.flow_stats_request.pad2",
5924
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
5925
15
               NULL, HFILL }
5926
15
        },
5927
15
        { &hf_openflow_v4_flow_stats_request_cookie,
5928
15
            { "Cookie", "openflow_v4.flow_stats_request.cookie",
5929
15
               FT_UINT64, BASE_HEX, NULL, 0x0,
5930
15
               NULL, HFILL }
5931
15
        },
5932
15
        { &hf_openflow_v4_flow_stats_request_cookie_mask,
5933
15
            { "Cookie mask", "openflow_v4.flow_stats_request.cookie_mask",
5934
15
               FT_UINT64, BASE_HEX, NULL, 0x0,
5935
15
               NULL, HFILL }
5936
15
        },
5937
15
        { &hf_openflow_v4_aggregate_stats_request_table_id,
5938
15
            { "Table ID", "openflow_v4.aggregate_stats_request.table_id",
5939
15
               FT_UINT8, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_table_reserved_values), 0x0,
5940
15
               NULL, HFILL }
5941
15
        },
5942
15
        { &hf_openflow_v4_aggregate_stats_request_pad,
5943
15
            { "Pad", "openflow_v4.aggregate_stats_request.pad",
5944
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
5945
15
               NULL, HFILL }
5946
15
        },
5947
15
        { &hf_openflow_v4_aggregate_stats_request_out_port,
5948
15
            { "Out port", "openflow_v4.aggregate_stats_request.out_port",
5949
15
               FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_port_reserved_values), 0x0,
5950
15
               NULL, HFILL }
5951
15
        },
5952
15
        { &hf_openflow_v4_aggregate_stats_request_out_group,
5953
15
            { "Out group", "openflow_v4.aggregate_stats_request.out_group",
5954
15
               FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_group_reserved_values), 0x0,
5955
15
               NULL, HFILL }
5956
15
        },
5957
15
        { &hf_openflow_v4_aggregate_stats_request_pad2,
5958
15
            { "Pad", "openflow_v4.aggregate_stats_request.pad2",
5959
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
5960
15
               NULL, HFILL }
5961
15
        },
5962
15
        { &hf_openflow_v4_aggregate_stats_request_cookie,
5963
15
            { "Cookie", "openflow_v4.aggregate_stats_request.cookie",
5964
15
               FT_UINT64, BASE_HEX, NULL, 0x0,
5965
15
               NULL, HFILL }
5966
15
        },
5967
15
        { &hf_openflow_v4_aggregate_stats_request_cookie_mask,
5968
15
            { "Cookie mask", "openflow_v4.aggregate_stats_request.cookie_mask",
5969
15
               FT_UINT64, BASE_HEX, NULL, 0x0,
5970
15
               NULL, HFILL }
5971
15
        },
5972
15
        { &hf_openflow_v4_table_feature_prop_type,
5973
15
            { "Type", "openflow_v4.table_feature_prop.type",
5974
15
               FT_UINT16, BASE_DEC, VALS(openflow_v4_table_feature_prop_type_values), 0x0,
5975
15
               NULL, HFILL }
5976
15
        },
5977
15
        { &hf_openflow_v4_table_feature_prop_length,
5978
15
            { "Length", "openflow_v4.table_feature_prop.length",
5979
15
               FT_UINT16, BASE_DEC, NULL, 0x0,
5980
15
               NULL, HFILL }
5981
15
        },
5982
15
        { &hf_openflow_v4_table_feature_prop_next_tables_next_table_id,
5983
15
            { "Next table ID", "openflow_v4.table_feature_prop.next_tables.next_table_id",
5984
15
               FT_UINT8, BASE_DEC, NULL, 0x0,
5985
15
               NULL, HFILL }
5986
15
        },
5987
15
        { &hf_openflow_v4_table_feature_prop_experimenter_experimenter,
5988
15
            { "Experimenter", "openflow_v4.table_feature_prop.experimenter.experimenter",
5989
15
               FT_UINT32, BASE_HEX, NULL, 0x0,
5990
15
               NULL, HFILL }
5991
15
        },
5992
15
        { &hf_openflow_v4_table_feature_prop_experimenter_exp_type,
5993
15
            { "Experimenter type", "openflow_v4.table_feature_prop.experimenter.exp_type",
5994
15
               FT_UINT32, BASE_DEC, NULL, 0x0,
5995
15
               NULL, HFILL }
5996
15
        },
5997
15
        { &hf_openflow_v4_table_feature_prop_pad,
5998
15
            { "Pad", "openflow_v4.table_feature_prop.pad",
5999
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
6000
15
               NULL, HFILL }
6001
15
        },
6002
15
        { &hf_openflow_v4_table_features_length,
6003
15
            { "Length", "openflow_v4.table_features.length",
6004
15
               FT_UINT16, BASE_DEC, NULL, 0x0,
6005
15
               NULL, HFILL }
6006
15
        },
6007
15
        { &hf_openflow_v4_table_features_table_id,
6008
15
            { "Table ID", "openflow_v4.table_features.table_id",
6009
15
               FT_UINT8, BASE_DEC, NULL, 0x0,
6010
15
               NULL, HFILL }
6011
15
        },
6012
15
        { &hf_openflow_v4_table_features_pad,
6013
15
            { "Pad", "openflow_v4.table_features.pad",
6014
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
6015
15
               NULL, HFILL }
6016
15
        },
6017
15
        { &hf_openflow_v4_table_features_name,
6018
15
            { "Name", "openflow_v4.table_features.name",
6019
15
               FT_STRING, BASE_NONE, NULL, 0x0,
6020
15
               NULL, HFILL }
6021
15
        },
6022
15
        { &hf_openflow_v4_table_features_metadata_match,
6023
15
            { "Metadata match", "openflow_v4.table_features.metadata_match",
6024
15
               FT_UINT64, BASE_HEX, NULL, 0x0,
6025
15
               NULL, HFILL }
6026
15
        },
6027
15
        { &hf_openflow_v4_table_features_metadata_write,
6028
15
            { "Metadata write", "openflow_v4.table_features.metadata_write",
6029
15
               FT_UINT64, BASE_HEX, NULL, 0x0,
6030
15
               NULL, HFILL }
6031
15
        },
6032
15
        { &hf_openflow_v4_table_features_config,
6033
15
            { "Config", "openflow_v4.table_features.config",
6034
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
6035
15
               NULL, HFILL }
6036
15
        },
6037
15
        { &hf_openflow_v4_table_features_max_entries,
6038
15
            { "Max entries", "openflow_v4.table_features.max_entries",
6039
15
               FT_UINT32, BASE_DEC, NULL, 0x0,
6040
15
               NULL, HFILL }
6041
15
        },
6042
15
        { &hf_openflow_v4_port_stats_request_port_no,
6043
15
            { "Port number", "openflow_v4.port_stats_request.port_no",
6044
15
               FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_port_reserved_values), 0x0,
6045
15
               NULL, HFILL }
6046
15
        },
6047
15
        { &hf_openflow_v4_port_stats_request_pad,
6048
15
            { "Pad", "openflow_v4.port_stats_request.pad",
6049
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
6050
15
               NULL, HFILL }
6051
15
        },
6052
15
        { &hf_openflow_v4_queue_stats_request_port_no,
6053
15
            { "Port number", "openflow_v4.queue_stats_request.port_no",
6054
15
               FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_port_reserved_values), 0x0,
6055
15
               NULL, HFILL }
6056
15
        },
6057
15
        { &hf_openflow_v4_queue_stats_request_queue_id,
6058
15
            { "Queue ID", "openflow_v4.queue_stats_request.queue_id",
6059
15
               FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_queue_reserved_values), 0x0,
6060
15
               NULL, HFILL }
6061
15
        },
6062
15
        { &hf_openflow_v4_group_stats_request_group_id,
6063
15
            { "Group ID", "openflow_v4.group_stats_request.group_id",
6064
15
               FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_group_reserved_values), 0x0,
6065
15
               NULL, HFILL }
6066
15
        },
6067
15
        { &hf_openflow_v4_group_stats_request_pad,
6068
15
            { "Pad", "openflow_v4.group_stats_request.pad",
6069
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
6070
15
               NULL, HFILL }
6071
15
        },
6072
15
        { &hf_openflow_v4_meter_stats_request_meter_id,
6073
15
            { "Meter ID", "openflow_v4.meter_stats_request.meter_id",
6074
15
               FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_meter_id_reserved_values), 0x0,
6075
15
               NULL, HFILL }
6076
15
        },
6077
15
        { &hf_openflow_v4_meter_stats_request_pad,
6078
15
            { "Pad", "openflow_v4.meter_stats_request.pad",
6079
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
6080
15
               NULL, HFILL }
6081
15
        },
6082
15
        { &hf_openflow_v4_meter_config_request_meter_id,
6083
15
            { "Meter ID", "openflow_v4.meter_config_request.meter_id",
6084
15
               FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_meter_id_reserved_values), 0x0,
6085
15
               NULL, HFILL }
6086
15
        },
6087
15
        { &hf_openflow_v4_meter_config_request_pad,
6088
15
            { "Pad", "openflow_v4.meter_config_request.pad",
6089
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
6090
15
               NULL, HFILL }
6091
15
        },
6092
15
        { &hf_openflow_v4_multipart_request_type ,
6093
15
            { "Type", "openflow_v4.multipart_request.type",
6094
15
               FT_UINT16, BASE_DEC, VALS(openflow_v4_multipart_type_values), 0x0,
6095
15
               NULL, HFILL }
6096
15
        },
6097
15
        { &hf_openflow_v4_multipart_request_flags,
6098
15
            { "Flags", "openflow_v4.multipart_request.flags",
6099
15
               FT_UINT16, BASE_HEX, NULL, 0x0,
6100
15
               NULL, HFILL }
6101
15
        },
6102
15
        { &hf_openflow_v4_multipart_request_flags_more,
6103
15
            { "OFPMPF_REQ_MORE", "openflow_v4.multipart_request.flags.more",
6104
15
               FT_UINT16, BASE_HEX, NULL, OFPMPF_REQ_MORE,
6105
15
               NULL, HFILL }
6106
15
        },
6107
15
        { &hf_openflow_v4_multipart_request_pad,
6108
15
            { "Pad", "openflow_v4.multipart_request.pad",
6109
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
6110
15
               NULL, HFILL }
6111
15
        },
6112
15
        { &hf_openflow_v4_multipart_request_experimenter_experimenter,
6113
15
            { "Experimenter", "openflow_v4.multipart_request.experimenter.experimenter",
6114
15
               FT_UINT32, BASE_HEX, NULL, 0x0,
6115
15
               NULL, HFILL }
6116
15
        },
6117
15
        { &hf_openflow_v4_multipart_request_experimenter_exp_type,
6118
15
            { "Experimenter type", "openflow_v4.multipart_request.experimenter.exp_type",
6119
15
               FT_UINT32, BASE_DEC, NULL, 0x0,
6120
15
               NULL, HFILL }
6121
15
        },
6122
15
        { &hf_openflow_v4_switch_description_mfr_desc,
6123
15
            { "Manufacturer desc.", "openflow_v4.switch_description.mfr_desc",
6124
15
               FT_STRING, BASE_NONE, NULL, 0x0,
6125
15
               NULL, HFILL }
6126
15
        },
6127
15
        { &hf_openflow_v4_switch_description_hw_desc,
6128
15
            { "Hardware desc.", "openflow_v4.switch_description.hw_desc",
6129
15
               FT_STRING, BASE_NONE, NULL, 0x0,
6130
15
               NULL, HFILL }
6131
15
        },
6132
15
        { &hf_openflow_v4_switch_description_sw_desc,
6133
15
            { "Software desc.", "openflow_v4.switch_description.sw_desc",
6134
15
               FT_STRING, BASE_NONE, NULL, 0x0,
6135
15
               NULL, HFILL }
6136
15
        },
6137
15
        { &hf_openflow_v4_switch_description_serial_num,
6138
15
            { "Serial no.", "openflow_v4.switch_description.serial_num",
6139
15
               FT_STRING, BASE_NONE, NULL, 0x0,
6140
15
               NULL, HFILL }
6141
15
        },
6142
15
        { &hf_openflow_v4_switch_description_dp_desc,
6143
15
            { "Datapath desc.", "openflow_v4.switch_description.dp_desc",
6144
15
               FT_STRING, BASE_NONE, NULL, 0x0,
6145
15
               NULL, HFILL }
6146
15
        },
6147
15
        { &hf_openflow_v4_flow_stats_length,
6148
15
            { "Length", "openflow_v4.flow_stats.length",
6149
15
               FT_UINT16, BASE_DEC, NULL, 0x0,
6150
15
               NULL, HFILL }
6151
15
        },
6152
15
        { &hf_openflow_v4_flow_stats_table_id,
6153
15
            { "Table ID", "openflow_v4.flow_stats.table_id",
6154
15
               FT_UINT8, BASE_DEC, NULL, 0x0,
6155
15
               NULL, HFILL }
6156
15
        },
6157
15
        { &hf_openflow_v4_flow_stats_pad,
6158
15
            { "Pad", "openflow_v4.flow_stats.pad",
6159
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
6160
15
               NULL, HFILL }
6161
15
        },
6162
15
        { &hf_openflow_v4_flow_stats_duration_sec,
6163
15
            { "Duration sec", "openflow_v4.flow_stats.duration_sec",
6164
15
               FT_UINT32, BASE_DEC, NULL, 0x0,
6165
15
               NULL, HFILL }
6166
15
        },
6167
15
        { &hf_openflow_v4_flow_stats_duration_nsec,
6168
15
            { "Duration nsec", "openflow_v4.flow_stats.duration_nsec",
6169
15
               FT_UINT32, BASE_DEC, NULL, 0x0,
6170
15
               NULL, HFILL }
6171
15
        },
6172
15
        { &hf_openflow_v4_flow_stats_priority,
6173
15
            { "Priority", "openflow_v4.flow_stats.priority",
6174
15
               FT_UINT16, BASE_DEC, NULL, 0x0,
6175
15
               NULL, HFILL }
6176
15
        },
6177
15
        { &hf_openflow_v4_flow_stats_idle_timeout,
6178
15
            { "Idle timeout", "openflow_v4.flow_stats.idle_timeout",
6179
15
               FT_UINT16, BASE_DEC, NULL, 0x0,
6180
15
               NULL, HFILL }
6181
15
        },
6182
15
        { &hf_openflow_v4_flow_stats_hard_timeout,
6183
15
            { "Hard timeout", "openflow_v4.flow_stats.hard_timeout",
6184
15
               FT_UINT16, BASE_DEC, NULL, 0x0,
6185
15
               NULL, HFILL }
6186
15
        },
6187
15
        { &hf_openflow_v4_flow_stats_flags,
6188
15
            { "Flags", "openflow_v4.flow_stats.flags",
6189
15
               FT_UINT16, BASE_HEX, NULL, 0x0,
6190
15
               NULL, HFILL }
6191
15
        },
6192
15
        { &hf_openflow_v4_flow_stats_flags_send_flow_rem,
6193
15
            { "Send flow removed", "openflow_v4.flow_stats.flags.send_flow_rem",
6194
15
               FT_BOOLEAN, 16, NULL, OFPFF_SEND_FLOW_REM,
6195
15
               NULL, HFILL }
6196
15
        },
6197
15
        { &hf_openflow_v4_flow_stats_flags_check_overlap,
6198
15
            { "Check overlap", "openflow_v4.flow_stats.flags.check_overlap",
6199
15
               FT_BOOLEAN, 16, NULL, OFPFF_CHECK_OVERLAP,
6200
15
               NULL, HFILL }
6201
15
        },
6202
15
        { &hf_openflow_v4_flow_stats_flags_reset_counts,
6203
15
            { "Reset counts", "openflow_v4.flow_stats.flags.reset_counts",
6204
15
               FT_BOOLEAN, 16, NULL, OFPFF_RESET_COUNTS,
6205
15
               NULL, HFILL }
6206
15
        },
6207
15
        { &hf_openflow_v4_flow_stats_flags_no_packet_counts,
6208
15
            { "Don't count packets", "openflow_v4.flow_stats.flags.no_packet_counts",
6209
15
               FT_BOOLEAN, 16, NULL, OFPFF_NO_PKT_COUNTS,
6210
15
               NULL, HFILL }
6211
15
        },
6212
15
        { &hf_openflow_v4_flow_stats_flags_no_byte_counts,
6213
15
            { "Don't count bytes", "openflow_v4.flow_stats.flags.no_byte_counts",
6214
15
               FT_BOOLEAN, 16, NULL, OFPFF_NO_BYT_COUNTS,
6215
15
               NULL, HFILL }
6216
15
        },
6217
15
        { &hf_openflow_v4_flow_stats_pad2,
6218
15
            { "Pad", "openflow_v4.flow_stats.pad2",
6219
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
6220
15
               NULL, HFILL }
6221
15
        },
6222
15
        { &hf_openflow_v4_flow_stats_cookie,
6223
15
            { "Cookie", "openflow_v4.flow_stats.cookie",
6224
15
               FT_UINT64, BASE_HEX, NULL, 0x0,
6225
15
               NULL, HFILL }
6226
15
        },
6227
15
        { &hf_openflow_v4_flow_stats_packet_count,
6228
15
            { "Packet count", "openflow_v4.flow_stats.packet_count",
6229
15
               FT_UINT64, BASE_DEC, NULL, 0x0,
6230
15
               NULL, HFILL }
6231
15
        },
6232
15
        { &hf_openflow_v4_flow_stats_byte_count,
6233
15
            { "Byte count", "openflow_v4.flow_stats.byte_count",
6234
15
               FT_UINT64, BASE_DEC, NULL, 0x0,
6235
15
               NULL, HFILL }
6236
15
        },
6237
15
        { &hf_openflow_v4_aggregate_stats_packet_count,
6238
15
            { "Packet count", "openflow_v4.aggregate_stats.packet_count",
6239
15
               FT_UINT64, BASE_DEC, NULL, 0x0,
6240
15
               NULL, HFILL }
6241
15
        },
6242
15
        { &hf_openflow_v4_aggregate_stats_byte_count,
6243
15
            { "Byte count", "openflow_v4.aggregate_stats.byte_count",
6244
15
               FT_UINT64, BASE_DEC, NULL, 0x0,
6245
15
               NULL, HFILL }
6246
15
        },
6247
15
        { &hf_openflow_v4_aggregate_stats_flow_count,
6248
15
            { "Flow count", "openflow_v4.aggregate_stats.flow_count",
6249
15
               FT_UINT64, BASE_DEC, NULL, 0x0,
6250
15
               NULL, HFILL }
6251
15
        },
6252
15
        { &hf_openflow_v4_aggregate_stats_pad,
6253
15
            { "Pad", "openflow_v4.aggregate_stats.pad",
6254
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
6255
15
               NULL, HFILL }
6256
15
        },
6257
15
        { &hf_openflow_v4_table_stats_table_id,
6258
15
            { "Table ID", "openflow_v4.table_stats.table_id",
6259
15
               FT_UINT8, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_table_reserved_values), 0x0,
6260
15
               NULL, HFILL }
6261
15
        },
6262
15
        { &hf_openflow_v4_table_stats_pad,
6263
15
            { "Pad", "openflow_v4.table_stats.pad",
6264
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
6265
15
               NULL, HFILL }
6266
15
        },
6267
15
        { &hf_openflow_v4_table_stats_active_count,
6268
15
            { "Active count", "openflow_v4.table_stats.active_count",
6269
15
               FT_UINT32, BASE_DEC, NULL, 0x0,
6270
15
               NULL, HFILL }
6271
15
        },
6272
15
        { &hf_openflow_v4_table_stats_lookup_count,
6273
15
            { "Lookup count", "openflow_v4.table_stats.lookup_count",
6274
15
               FT_UINT64, BASE_DEC, NULL, 0x0,
6275
15
               NULL, HFILL }
6276
15
        },
6277
15
        { &hf_openflow_v4_table_stats_match_count,
6278
15
            { "Match count", "openflow_v4.table_stats.match_count",
6279
15
               FT_UINT64, BASE_DEC, NULL, 0x0,
6280
15
               NULL, HFILL }
6281
15
        },
6282
15
        { &hf_openflow_v4_port_stats_port_no,
6283
15
            { "Port number", "openflow_v4.port_stats.port_no",
6284
15
               FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_port_reserved_values), 0x0,
6285
15
               NULL, HFILL }
6286
15
        },
6287
15
        { &hf_openflow_v4_port_stats_pad,
6288
15
            { "Pad", "openflow_v4.port_stats.pad",
6289
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
6290
15
               NULL, HFILL }
6291
15
        },
6292
15
        { &hf_openflow_v4_port_stats_rx_packets,
6293
15
            { "Rx packets", "openflow_v4.port_stats.rx_packets",
6294
15
               FT_UINT64, BASE_DEC, NULL, 0x0,
6295
15
               NULL, HFILL }
6296
15
        },
6297
15
        { &hf_openflow_v4_port_stats_tx_packets,
6298
15
            { "Tx packets", "openflow_v4.port_stats.tx_packets",
6299
15
               FT_UINT64, BASE_DEC, NULL, 0x0,
6300
15
               NULL, HFILL }
6301
15
        },
6302
15
        { &hf_openflow_v4_port_stats_rx_bytes,
6303
15
            { "Rx bytes", "openflow_v4.port_stats.rx_bytes",
6304
15
               FT_UINT64, BASE_DEC, NULL, 0x0,
6305
15
               NULL, HFILL }
6306
15
        },
6307
15
        { &hf_openflow_v4_port_stats_tx_bytes,
6308
15
            { "Tx bytes", "openflow_v4.port_stats.tx_bytes",
6309
15
               FT_UINT64, BASE_DEC, NULL, 0x0,
6310
15
               NULL, HFILL }
6311
15
        },
6312
15
        { &hf_openflow_v4_port_stats_rx_dropped,
6313
15
            { "Rx dropped", "openflow_v4.port_stats.rx_dropped",
6314
15
               FT_UINT64, BASE_DEC, NULL, 0x0,
6315
15
               NULL, HFILL }
6316
15
        },
6317
15
        { &hf_openflow_v4_port_stats_tx_dropped,
6318
15
            { "Tx dropped", "openflow_v4.port_stats.tx_dropped",
6319
15
               FT_UINT64, BASE_DEC, NULL, 0x0,
6320
15
               NULL, HFILL }
6321
15
        },
6322
15
        { &hf_openflow_v4_port_stats_rx_errors,
6323
15
            { "Rx errors", "openflow_v4.port_stats.rx_errors",
6324
15
               FT_UINT64, BASE_DEC, NULL, 0x0,
6325
15
               NULL, HFILL }
6326
15
        },
6327
15
        { &hf_openflow_v4_port_stats_tx_errors,
6328
15
            { "Tx errors", "openflow_v4.port_stats.tx_errors",
6329
15
               FT_UINT64, BASE_DEC, NULL, 0x0,
6330
15
               NULL, HFILL }
6331
15
        },
6332
15
        { &hf_openflow_v4_port_stats_rx_frame_error,
6333
15
            { "Rx frame errors", "openflow_v4.port_stats.rx_frame_error",
6334
15
               FT_UINT64, BASE_DEC, NULL, 0x0,
6335
15
               NULL, HFILL }
6336
15
        },
6337
15
        { &hf_openflow_v4_port_stats_rx_over_error,
6338
15
            { "Rx overrun errors", "openflow_v4.port_stats.rx_over_error",
6339
15
               FT_UINT64, BASE_DEC, NULL, 0x0,
6340
15
               NULL, HFILL }
6341
15
        },
6342
15
        { &hf_openflow_v4_port_stats_rx_crc_error,
6343
15
            { "Rx CRC errors", "openflow_v4.port_stats.rx_crc_error",
6344
15
               FT_UINT64, BASE_DEC, NULL, 0x0,
6345
15
               NULL, HFILL }
6346
15
        },
6347
15
        { &hf_openflow_v4_port_stats_collisions,
6348
15
            { "Collisions", "openflow_v4.port_stats.collisions",
6349
15
               FT_UINT64, BASE_DEC, NULL, 0x0,
6350
15
               NULL, HFILL }
6351
15
        },
6352
15
        { &hf_openflow_v4_port_stats_duration_sec,
6353
15
            { "Duration sec", "openflow_v4.port_stats.duration_sec",
6354
15
               FT_UINT32, BASE_DEC, NULL, 0x0,
6355
15
               NULL, HFILL }
6356
15
        },
6357
15
        { &hf_openflow_v4_port_stats_duration_nsec,
6358
15
            { "Duration nsec", "openflow_v4.port_stats.duration_nsec",
6359
15
               FT_UINT32, BASE_DEC, NULL, 0x0,
6360
15
               NULL, HFILL }
6361
15
        },
6362
15
        { &hf_openflow_v4_queue_stats_port_no,
6363
15
            { "Port number", "openflow_v4.queue_stats.port_no",
6364
15
               FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_port_reserved_values), 0x0,
6365
15
               NULL, HFILL }
6366
15
        },
6367
15
        { &hf_openflow_v4_queue_stats_queue_id,
6368
15
            { "Queue ID", "openflow_v4.queue_stats.queue_id",
6369
15
               FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_queue_reserved_values), 0x0,
6370
15
               NULL, HFILL }
6371
15
        },
6372
15
        { &hf_openflow_v4_queue_stats_tx_bytes,
6373
15
            { "Tx bytes", "openflow_v4.queue_stats.tx_bytes",
6374
15
               FT_UINT64, BASE_DEC, NULL, 0x0,
6375
15
               NULL, HFILL }
6376
15
        },
6377
15
        { &hf_openflow_v4_queue_stats_tx_packets,
6378
15
            { "Tx packets", "openflow_v4.quee_stats.tx_packets",
6379
15
               FT_UINT64, BASE_DEC, NULL, 0x0,
6380
15
               NULL, HFILL }
6381
15
        },
6382
15
        { &hf_openflow_v4_queue_stats_tx_errors,
6383
15
            { "Tx errors", "openflow_v4.port_stats.tx_errors",
6384
15
               FT_UINT64, BASE_DEC, NULL, 0x0,
6385
15
               NULL, HFILL }
6386
15
        },
6387
15
        { &hf_openflow_v4_queue_stats_duration_sec,
6388
15
            { "Duration sec", "openflow_v4.queue_stats.duration_sec",
6389
15
               FT_UINT32, BASE_DEC, NULL, 0x0,
6390
15
               NULL, HFILL }
6391
15
        },
6392
15
        { &hf_openflow_v4_queue_stats_duration_nsec,
6393
15
            { "Duration nsec", "openflow_v4.queue_stats.duration_nsec",
6394
15
               FT_UINT32, BASE_DEC, NULL, 0x0,
6395
15
               NULL, HFILL }
6396
15
        },
6397
15
        { &hf_openflow_v4_bucket_counter_packet_count,
6398
15
            { "Packet count", "openflow_v4.bucket_counter.packet_count",
6399
15
               FT_UINT64, BASE_DEC, NULL, 0x0,
6400
15
               NULL, HFILL }
6401
15
        },
6402
15
        { &hf_openflow_v4_bucket_counter_byte_count,
6403
15
            { "Byte count", "openflow_v4.bucket_counter.byte_count",
6404
15
               FT_UINT64, BASE_DEC, NULL, 0x0,
6405
15
               NULL, HFILL }
6406
15
        },
6407
15
        { &hf_openflow_v4_group_stats_length,
6408
15
            { "Length", "openflow_v4.group_stats.length",
6409
15
               FT_UINT16, BASE_DEC, NULL, 0x0,
6410
15
               NULL, HFILL }
6411
15
        },
6412
15
        { &hf_openflow_v4_group_stats_pad,
6413
15
            { "Pad", "openflow_v4.group_stats.pad",
6414
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
6415
15
               NULL, HFILL }
6416
15
        },
6417
15
        { &hf_openflow_v4_group_stats_group_id,
6418
15
            { "Group ID", "openflow_v4.group_stats.group_id",
6419
15
               FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_group_reserved_values), 0x0,
6420
15
               NULL, HFILL }
6421
15
        },
6422
15
        { &hf_openflow_v4_group_stats_ref_count,
6423
15
            { "Ref. count", "openflow_v4.group_stats.ref_count",
6424
15
               FT_UINT32, BASE_DEC, NULL, 0x0,
6425
15
               NULL, HFILL }
6426
15
        },
6427
15
        { &hf_openflow_v4_group_stats_pad2,
6428
15
            { "Pad", "openflow_v4.group_stats.pad2",
6429
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
6430
15
               NULL, HFILL }
6431
15
        },
6432
15
        { &hf_openflow_v4_group_stats_packet_count,
6433
15
            { "Packet count", "openflow_v4.group_stats.packet_count",
6434
15
               FT_UINT64, BASE_DEC, NULL, 0x0,
6435
15
               NULL, HFILL }
6436
15
        },
6437
15
        { &hf_openflow_v4_group_stats_byte_count,
6438
15
            { "Byte count", "openflow_v4.group_stats.byte_count",
6439
15
               FT_UINT64, BASE_DEC, NULL, 0x0,
6440
15
               NULL, HFILL }
6441
15
        },
6442
15
        { &hf_openflow_v4_group_desc_length,
6443
15
            { "Length", "openflow_v4.group_desc.length",
6444
15
               FT_UINT16, BASE_DEC, NULL, 0x0,
6445
15
               NULL, HFILL }
6446
15
        },
6447
15
        { &hf_openflow_v4_group_desc_type,
6448
15
            { "Type", "openflow_v4.group_desc.type",
6449
15
               FT_UINT8, BASE_DEC, VALS(openflow_v4_group_type_values), 0x0,
6450
15
               NULL, HFILL }
6451
15
        },
6452
15
        { &hf_openflow_v4_group_desc_pad,
6453
15
            { "Pad", "openflow_v4.group_desc.pad2",
6454
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
6455
15
               NULL, HFILL }
6456
15
        },
6457
15
        { &hf_openflow_v4_group_desc_group_id,
6458
15
            { "Group ID", "openflow_v4.group_desc.group_id",
6459
15
               FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_group_reserved_values), 0x0,
6460
15
               NULL, HFILL }
6461
15
        },
6462
15
        { &hf_openflow_v4_group_features_types,
6463
15
            { "Types", "openflow_v4.group_features.types",
6464
15
               FT_UINT32, BASE_HEX, NULL, 0x0,
6465
15
               NULL, HFILL }
6466
15
        },
6467
15
        { &hf_openflow_v4_group_features_types_all,
6468
15
            { "OFPGT_ALL", "openflow_v4.group_features.types.all",
6469
15
               FT_BOOLEAN, 32, NULL, 1 << OFPGT_ALL,
6470
15
               NULL, HFILL }
6471
15
        },
6472
15
        { &hf_openflow_v4_group_features_types_select,
6473
15
            { "OFPGT_SELECT", "openflow_v4.group_features.types.select",
6474
15
               FT_BOOLEAN, 32, NULL, 1 << OFPGT_SELECT,
6475
15
               NULL, HFILL }
6476
15
        },
6477
15
        { &hf_openflow_v4_group_features_types_indirect,
6478
15
            { "OFPGT_INDIRECT", "openflow_v4.group_features.types.indirect",
6479
15
               FT_BOOLEAN, 32, NULL, 1 << OFPGT_INDIRECT,
6480
15
               NULL, HFILL }
6481
15
        },
6482
15
        { &hf_openflow_v4_group_features_types_ff,
6483
15
            { "OFPGT_FF", "openflow_v4.group_features.types.ff",
6484
15
               FT_BOOLEAN, 32, NULL, 1 << OFPGT_FF,
6485
15
               NULL, HFILL }
6486
15
        },
6487
15
        { &hf_openflow_v4_group_features_capabilities,
6488
15
            { "Capabilities", "openflow_v4.group_features.capabilities",
6489
15
               FT_UINT32, BASE_HEX, NULL, 0x0,
6490
15
               NULL, HFILL }
6491
15
        },
6492
15
        { &hf_openflow_v4_group_features_capabilities_select_weight,
6493
15
            { "OFPGFC_SELECT_WEIGHT", "openflow_v4.group_features.capabilities.select_weight",
6494
15
               FT_BOOLEAN, 32, NULL, OFPGFC_SELECT_WEIGHT,
6495
15
               NULL, HFILL }
6496
15
        },
6497
15
        { &hf_openflow_v4_group_features_capabilities_select_liveness,
6498
15
            { "OFPGFC_SELECT_LIVENESS", "openflow_v4.group_features.capabilities.select_liveness",
6499
15
               FT_BOOLEAN, 32, NULL, OFPGFC_SELECT_LIVENESS,
6500
15
               NULL, HFILL }
6501
15
        },
6502
15
        { &hf_openflow_v4_group_features_capabilities_chaining,
6503
15
            { "OFPGFC_CHAINING", "openflow_v4.group_features.capabilities.chaining",
6504
15
               FT_BOOLEAN, 32, NULL, OFPGFC_CHAINING,
6505
15
               NULL, HFILL }
6506
15
        },
6507
15
        { &hf_openflow_v4_group_features_capabilities_chaining_checks,
6508
15
            { "OFPGFC_CHAINING_CHECKS", "openflow_v4.group_features.capabilities.chaining_checks",
6509
15
               FT_BOOLEAN, 32, NULL, OFPGFC_CHAINING_CHECKS,
6510
15
               NULL, HFILL }
6511
15
        },
6512
15
        { &hf_openflow_v4_group_features_max_groups_all,
6513
15
            { "Max groups (all)", "openflow_v4.group_stats.max_groups.all",
6514
15
               FT_UINT32, BASE_DEC, NULL, 0x0,
6515
15
               NULL, HFILL }
6516
15
        },
6517
15
        { &hf_openflow_v4_group_features_max_groups_select,
6518
15
            { "Max groups (select)", "openflow_v4.group_stats.max_groups.select",
6519
15
               FT_UINT32, BASE_DEC, NULL, 0x0,
6520
15
               NULL, HFILL }
6521
15
        },
6522
15
        { &hf_openflow_v4_group_features_max_groups_indirect,
6523
15
            { "Max groups (indirect)", "openflow_v4.group_stats.max_groups.indirect",
6524
15
               FT_UINT32, BASE_DEC, NULL, 0x0,
6525
15
               NULL, HFILL }
6526
15
        },
6527
15
        { &hf_openflow_v4_group_features_max_groups_ff,
6528
15
            { "Max groups (ff)", "openflow_v4.group_stats.max_groups.ff",
6529
15
               FT_UINT32, BASE_DEC, NULL, 0x0,
6530
15
               NULL, HFILL }
6531
15
        },
6532
15
        { &hf_openflow_v4_group_features_actions_all,
6533
15
            { "Actions (all)", "openflow_v4.group_features.actions.all",
6534
15
               FT_UINT32, BASE_HEX, NULL, 0x0,
6535
15
               NULL, HFILL }
6536
15
        },
6537
15
        { &hf_openflow_v4_group_features_actions_all_output,
6538
15
            { "OFPAT_OUTPUT", "openflow_v4.group_features.actions.all.output",
6539
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_OUTPUT,
6540
15
               NULL, HFILL }
6541
15
        },
6542
15
        { &hf_openflow_v4_group_features_actions_all_copy_ttl_out,
6543
15
            { "OFPAT_COPY_TTL_OUT", "openflow_v4.group_features.actions.all.copy_ttl_out",
6544
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_COPY_TTL_OUT,
6545
15
               NULL, HFILL }
6546
15
        },
6547
15
        { &hf_openflow_v4_group_features_actions_all_copy_ttl_in,
6548
15
            { "OFPAT_COPY_TTL_IN", "openflow_v4.group_features.actions.all.copy_ttl_in",
6549
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_COPY_TTL_IN,
6550
15
               NULL, HFILL }
6551
15
        },
6552
15
        { &hf_openflow_v4_group_features_actions_all_set_mpls_ttl,
6553
15
            { "OFPAT_SET_MPLS_TTL", "openflow_v4.group_features.actions.all.set_mpls_ttl",
6554
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_SET_MPLS_TTL,
6555
15
               NULL, HFILL }
6556
15
        },
6557
15
        { &hf_openflow_v4_group_features_actions_all_dec_mpls_ttl,
6558
15
            { "OFPAT_DEC_MPLS_TTL", "openflow_v4.group_features.actions.all.dec_mpls_ttl",
6559
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_DEC_MPLS_TTL,
6560
15
               NULL, HFILL }
6561
15
        },
6562
15
        { &hf_openflow_v4_group_features_actions_all_push_vlan,
6563
15
            { "OFPAT_PUSH_VLAN", "openflow_v4.group_features.actions.all.push_vlan",
6564
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_PUSH_VLAN,
6565
15
               NULL, HFILL }
6566
15
        },
6567
15
        { &hf_openflow_v4_group_features_actions_all_pop_vlan,
6568
15
            { "OFPAT_POP_VLAN", "openflow_v4.group_features.actions.all.pop_vlan",
6569
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_POP_VLAN,
6570
15
               NULL, HFILL }
6571
15
        },
6572
15
        { &hf_openflow_v4_group_features_actions_all_push_mpls,
6573
15
            { "OFPAT_PUSH_MPLS", "openflow_v4.group_features.actions.all.push_mpls",
6574
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_PUSH_MPLS,
6575
15
               NULL, HFILL }
6576
15
        },
6577
15
        { &hf_openflow_v4_group_features_actions_all_pop_mpls,
6578
15
            { "OFPAT_POP_MPLS", "openflow_v4.group_features.actions.all.pop_mpls",
6579
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_POP_MPLS,
6580
15
               NULL, HFILL }
6581
15
        },
6582
15
        { &hf_openflow_v4_group_features_actions_all_set_queue,
6583
15
            { "OFPAT_SET_QUEUE", "openflow_v4.group_features.actions.all.set_queue",
6584
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_SET_QUEUE,
6585
15
               NULL, HFILL }
6586
15
        },
6587
15
        { &hf_openflow_v4_group_features_actions_all_group,
6588
15
            { "OFPAT_GROUP", "openflow_v4.group_features.actions.all.group",
6589
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_GROUP,
6590
15
               NULL, HFILL }
6591
15
        },
6592
15
        { &hf_openflow_v4_group_features_actions_all_set_nw_ttl,
6593
15
            { "OFPAT_SET_NW_TTL", "openflow_v4.group_features.actions.all.set_nw_ttl",
6594
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_SET_NW_TTL,
6595
15
               NULL, HFILL }
6596
15
        },
6597
15
        { &hf_openflow_v4_group_features_actions_all_dec_nw_ttl,
6598
15
            { "OFPAT_DEC_NW_TTL", "openflow_v4.group_features.actions.all.dec_nw_ttl",
6599
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_DEC_NW_TTL,
6600
15
               NULL, HFILL }
6601
15
        },
6602
15
        { &hf_openflow_v4_group_features_actions_all_set_field,
6603
15
            { "OFPAT_SET_FIELD", "openflow_v4.group_features.actions.all.set_field",
6604
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_SET_FIELD,
6605
15
               NULL, HFILL }
6606
15
        },
6607
15
        { &hf_openflow_v4_group_features_actions_all_push_pbb,
6608
15
            { "OFPAT_PUSH_PBB", "openflow_v4.group_features.actions.all.push_pbb",
6609
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_PUSH_PBB,
6610
15
               NULL, HFILL }
6611
15
        },
6612
15
        { &hf_openflow_v4_group_features_actions_all_pop_pbb,
6613
15
            { "OFPAT_POP_PBB", "openflow_v4.group_features.actions.all.pop_pbb",
6614
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_POP_PBB,
6615
15
               NULL, HFILL }
6616
15
        },
6617
15
        { &hf_openflow_v4_group_features_actions_select,
6618
15
            { "Actions (select)", "openflow_v4.group_features.actions.select",
6619
15
               FT_UINT32, BASE_HEX, NULL, 0x0,
6620
15
               NULL, HFILL }
6621
15
        },
6622
15
        { &hf_openflow_v4_group_features_actions_select_output,
6623
15
            { "OFPAT_OUTPUT", "openflow_v4.group_features.actions.select.output",
6624
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_OUTPUT,
6625
15
               NULL, HFILL }
6626
15
        },
6627
15
        { &hf_openflow_v4_group_features_actions_select_copy_ttl_out,
6628
15
            { "OFPAT_COPY_TTL_OUT", "openflow_v4.group_features.actions.select.copy_ttl_out",
6629
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_COPY_TTL_OUT,
6630
15
               NULL, HFILL }
6631
15
        },
6632
15
        { &hf_openflow_v4_group_features_actions_select_copy_ttl_in,
6633
15
            { "OFPAT_COPY_TTL_IN", "openflow_v4.group_features.actions.select.copy_ttl_in",
6634
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_COPY_TTL_IN,
6635
15
               NULL, HFILL }
6636
15
        },
6637
15
        { &hf_openflow_v4_group_features_actions_select_set_mpls_ttl,
6638
15
            { "OFPAT_SET_MPLS_TTL", "openflow_v4.group_features.actions.select.set_mpls_ttl",
6639
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_SET_MPLS_TTL,
6640
15
               NULL, HFILL }
6641
15
        },
6642
15
        { &hf_openflow_v4_group_features_actions_select_dec_mpls_ttl,
6643
15
            { "OFPAT_DEC_MPLS_TTL", "openflow_v4.group_features.actions.select.dec_mpls_ttl",
6644
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_DEC_MPLS_TTL,
6645
15
               NULL, HFILL }
6646
15
        },
6647
15
        { &hf_openflow_v4_group_features_actions_select_push_vlan,
6648
15
            { "OFPAT_PUSH_VLAN", "openflow_v4.group_features.actions.select.push_vlan",
6649
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_PUSH_VLAN,
6650
15
               NULL, HFILL }
6651
15
        },
6652
15
        { &hf_openflow_v4_group_features_actions_select_pop_vlan,
6653
15
            { "OFPAT_POP_VLAN", "openflow_v4.group_features.actions.select.pop_vlan",
6654
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_POP_VLAN,
6655
15
               NULL, HFILL }
6656
15
        },
6657
15
        { &hf_openflow_v4_group_features_actions_select_push_mpls,
6658
15
            { "OFPAT_PUSH_MPLS", "openflow_v4.group_features.actions.select.push_mpls",
6659
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_PUSH_MPLS,
6660
15
               NULL, HFILL }
6661
15
        },
6662
15
        { &hf_openflow_v4_group_features_actions_select_pop_mpls,
6663
15
            { "OFPAT_POP_MPLS", "openflow_v4.group_features.actions.select.pop_mpls",
6664
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_POP_MPLS,
6665
15
               NULL, HFILL }
6666
15
        },
6667
15
        { &hf_openflow_v4_group_features_actions_select_set_queue,
6668
15
            { "OFPAT_SET_QUEUE", "openflow_v4.group_features.actions.select.set_queue",
6669
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_SET_QUEUE,
6670
15
               NULL, HFILL }
6671
15
        },
6672
15
        { &hf_openflow_v4_group_features_actions_select_group,
6673
15
            { "OFPAT_GROUP", "openflow_v4.group_features.actions.select.group",
6674
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_GROUP,
6675
15
               NULL, HFILL }
6676
15
        },
6677
15
        { &hf_openflow_v4_group_features_actions_select_set_nw_ttl,
6678
15
            { "OFPAT_SET_NW_TTL", "openflow_v4.group_features.actions.select.set_nw_ttl",
6679
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_SET_NW_TTL,
6680
15
               NULL, HFILL }
6681
15
        },
6682
15
        { &hf_openflow_v4_group_features_actions_select_dec_nw_ttl,
6683
15
            { "OFPAT_DEC_NW_TTL", "openflow_v4.group_features.actions.select.dec_nw_ttl",
6684
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_DEC_NW_TTL,
6685
15
               NULL, HFILL }
6686
15
        },
6687
15
        { &hf_openflow_v4_group_features_actions_select_set_field,
6688
15
            { "OFPAT_SET_FIELD", "openflow_v4.group_features.actions.select.set_field",
6689
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_SET_FIELD,
6690
15
               NULL, HFILL }
6691
15
        },
6692
15
        { &hf_openflow_v4_group_features_actions_select_push_pbb,
6693
15
            { "OFPAT_PUSH_PBB", "openflow_v4.group_features.actions.select.push_pbb",
6694
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_PUSH_PBB,
6695
15
               NULL, HFILL }
6696
15
        },
6697
15
        { &hf_openflow_v4_group_features_actions_select_pop_pbb,
6698
15
            { "OFPAT_POP_PBB", "openflow_v4.group_features.actions.select.pop_pbb",
6699
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_POP_PBB,
6700
15
               NULL, HFILL }
6701
15
        },
6702
15
        { &hf_openflow_v4_group_features_actions_indirect,
6703
15
            { "Actions (indirect)", "openflow_v4.group_features.actions.indirect",
6704
15
               FT_UINT32, BASE_HEX, NULL, 0x0,
6705
15
               NULL, HFILL }
6706
15
        },
6707
15
        { &hf_openflow_v4_group_features_actions_indirect_output,
6708
15
            { "OFPAT_OUTPUT", "openflow_v4.group_features.actions.indirect.output",
6709
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_OUTPUT,
6710
15
               NULL, HFILL }
6711
15
        },
6712
15
        { &hf_openflow_v4_group_features_actions_indirect_copy_ttl_out,
6713
15
            { "OFPAT_COPY_TTL_OUT", "openflow_v4.group_features.actions.indirect.copy_ttl_out",
6714
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_COPY_TTL_OUT,
6715
15
               NULL, HFILL }
6716
15
        },
6717
15
        { &hf_openflow_v4_group_features_actions_indirect_copy_ttl_in,
6718
15
            { "OFPAT_COPY_TTL_IN", "openflow_v4.group_features.actions.indirect.copy_ttl_in",
6719
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_COPY_TTL_IN,
6720
15
               NULL, HFILL }
6721
15
        },
6722
15
        { &hf_openflow_v4_group_features_actions_indirect_set_mpls_ttl,
6723
15
            { "OFPAT_SET_MPLS_TTL", "openflow_v4.group_features.actions.indirect.set_mpls_ttl",
6724
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_SET_MPLS_TTL,
6725
15
               NULL, HFILL }
6726
15
        },
6727
15
        { &hf_openflow_v4_group_features_actions_indirect_dec_mpls_ttl,
6728
15
            { "OFPAT_DEC_MPLS_TTL", "openflow_v4.group_features.actions.indirect.dec_mpls_ttl",
6729
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_DEC_MPLS_TTL,
6730
15
               NULL, HFILL }
6731
15
        },
6732
15
        { &hf_openflow_v4_group_features_actions_indirect_push_vlan,
6733
15
            { "OFPAT_PUSH_VLAN", "openflow_v4.group_features.actions.indirect.push_vlan",
6734
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_PUSH_VLAN,
6735
15
               NULL, HFILL }
6736
15
        },
6737
15
        { &hf_openflow_v4_group_features_actions_indirect_pop_vlan,
6738
15
            { "OFPAT_POP_VLAN", "openflow_v4.group_features.actions.indirect.pop_vlan",
6739
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_POP_VLAN,
6740
15
               NULL, HFILL }
6741
15
        },
6742
15
        { &hf_openflow_v4_group_features_actions_indirect_push_mpls,
6743
15
            { "OFPAT_PUSH_MPLS", "openflow_v4.group_features.actions.indirect.push_mpls",
6744
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_PUSH_MPLS,
6745
15
               NULL, HFILL }
6746
15
        },
6747
15
        { &hf_openflow_v4_group_features_actions_indirect_pop_mpls,
6748
15
            { "OFPAT_POP_MPLS", "openflow_v4.group_features.actions.indirect.pop_mpls",
6749
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_POP_MPLS,
6750
15
               NULL, HFILL }
6751
15
        },
6752
15
        { &hf_openflow_v4_group_features_actions_indirect_set_queue,
6753
15
            { "OFPAT_SET_QUEUE", "openflow_v4.group_features.actions.indirect.set_queue",
6754
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_SET_QUEUE,
6755
15
               NULL, HFILL }
6756
15
        },
6757
15
        { &hf_openflow_v4_group_features_actions_indirect_group,
6758
15
            { "OFPAT_GROUP", "openflow_v4.group_features.actions.indirect.group",
6759
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_GROUP,
6760
15
               NULL, HFILL }
6761
15
        },
6762
15
        { &hf_openflow_v4_group_features_actions_indirect_set_nw_ttl,
6763
15
            { "OFPAT_SET_NW_TTL", "openflow_v4.group_features.actions.indirect.set_nw_ttl",
6764
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_SET_NW_TTL,
6765
15
               NULL, HFILL }
6766
15
        },
6767
15
        { &hf_openflow_v4_group_features_actions_indirect_dec_nw_ttl,
6768
15
            { "OFPAT_DEC_NW_TTL", "openflow_v4.group_features.actions.indirect.dec_nw_ttl",
6769
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_DEC_NW_TTL,
6770
15
               NULL, HFILL }
6771
15
        },
6772
15
        { &hf_openflow_v4_group_features_actions_indirect_set_field,
6773
15
            { "OFPAT_SET_FIELD", "openflow_v4.group_features.actions.indirect.set_field",
6774
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_SET_FIELD,
6775
15
               NULL, HFILL }
6776
15
        },
6777
15
        { &hf_openflow_v4_group_features_actions_indirect_push_pbb,
6778
15
            { "OFPAT_PUSH_PBB", "openflow_v4.group_features.actions.indirect.push_pbb",
6779
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_PUSH_PBB,
6780
15
               NULL, HFILL }
6781
15
        },
6782
15
        { &hf_openflow_v4_group_features_actions_indirect_pop_pbb,
6783
15
            { "OFPAT_POP_PBB", "openflow_v4.group_features.actions.indirect.pop_pbb",
6784
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_POP_PBB,
6785
15
               NULL, HFILL }
6786
15
        },
6787
15
        { &hf_openflow_v4_group_features_actions_ff,
6788
15
            { "Actions (ff)", "openflow_v4.group_features.actions.ff",
6789
15
               FT_UINT32, BASE_HEX, NULL, 0x0,
6790
15
               NULL, HFILL }
6791
15
        },
6792
15
        { &hf_openflow_v4_group_features_actions_ff_output,
6793
15
            { "OFPAT_OUTPUT", "openflow_v4.group_features.actions.ff.output",
6794
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_OUTPUT,
6795
15
               NULL, HFILL }
6796
15
        },
6797
15
        { &hf_openflow_v4_group_features_actions_ff_copy_ttl_out,
6798
15
            { "OFPAT_COPY_TTL_OUT", "openflow_v4.group_features.actions.ff.copy_ttl_out",
6799
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_COPY_TTL_OUT,
6800
15
               NULL, HFILL }
6801
15
        },
6802
15
        { &hf_openflow_v4_group_features_actions_ff_copy_ttl_in,
6803
15
            { "OFPAT_COPY_TTL_IN", "openflow_v4.group_features.actions.ff.copy_ttl_in",
6804
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_COPY_TTL_IN,
6805
15
               NULL, HFILL }
6806
15
        },
6807
15
        { &hf_openflow_v4_group_features_actions_ff_set_mpls_ttl,
6808
15
            { "OFPAT_SET_MPLS_TTL", "openflow_v4.group_features.actions.ff.set_mpls_ttl",
6809
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_SET_MPLS_TTL,
6810
15
               NULL, HFILL }
6811
15
        },
6812
15
        { &hf_openflow_v4_group_features_actions_ff_dec_mpls_ttl,
6813
15
            { "OFPAT_DEC_MPLS_TTL", "openflow_v4.group_features.actions.ff.dec_mpls_ttl",
6814
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_DEC_MPLS_TTL,
6815
15
               NULL, HFILL }
6816
15
        },
6817
15
        { &hf_openflow_v4_group_features_actions_ff_push_vlan,
6818
15
            { "OFPAT_PUSH_VLAN", "openflow_v4.group_features.actions.ff.push_vlan",
6819
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_PUSH_VLAN,
6820
15
               NULL, HFILL }
6821
15
        },
6822
15
        { &hf_openflow_v4_group_features_actions_ff_pop_vlan,
6823
15
            { "OFPAT_POP_VLAN", "openflow_v4.group_features.actions.ff.pop_vlan",
6824
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_POP_VLAN,
6825
15
               NULL, HFILL }
6826
15
        },
6827
15
        { &hf_openflow_v4_group_features_actions_ff_push_mpls,
6828
15
            { "OFPAT_PUSH_MPLS", "openflow_v4.group_features.actions.ff.push_mpls",
6829
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_PUSH_MPLS,
6830
15
               NULL, HFILL }
6831
15
        },
6832
15
        { &hf_openflow_v4_group_features_actions_ff_pop_mpls,
6833
15
            { "OFPAT_POP_MPLS", "openflow_v4.group_features.actions.ff.pop_mpls",
6834
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_POP_MPLS,
6835
15
               NULL, HFILL }
6836
15
        },
6837
15
        { &hf_openflow_v4_group_features_actions_ff_set_queue,
6838
15
            { "OFPAT_SET_QUEUE", "openflow_v4.group_features.actions.ff.set_queue",
6839
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_SET_QUEUE,
6840
15
               NULL, HFILL }
6841
15
        },
6842
15
        { &hf_openflow_v4_group_features_actions_ff_group,
6843
15
            { "OFPAT_GROUP", "openflow_v4.group_features.actions.ff.group",
6844
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_GROUP,
6845
15
               NULL, HFILL }
6846
15
        },
6847
15
        { &hf_openflow_v4_group_features_actions_ff_set_nw_ttl,
6848
15
            { "OFPAT_SET_NW_TTL", "openflow_v4.group_features.actions.ff.set_nw_ttl",
6849
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_SET_NW_TTL,
6850
15
               NULL, HFILL }
6851
15
        },
6852
15
        { &hf_openflow_v4_group_features_actions_ff_dec_nw_ttl,
6853
15
            { "OFPAT_DEC_NW_TTL", "openflow_v4.group_features.actions.ff.dec_nw_ttl",
6854
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_DEC_NW_TTL,
6855
15
               NULL, HFILL }
6856
15
        },
6857
15
        { &hf_openflow_v4_group_features_actions_ff_set_field,
6858
15
            { "OFPAT_SET_FIELD", "openflow_v4.group_features.actions.ff.set_field",
6859
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_SET_FIELD,
6860
15
               NULL, HFILL }
6861
15
        },
6862
15
        { &hf_openflow_v4_group_features_actions_ff_push_pbb,
6863
15
            { "OFPAT_PUSH_PBB", "openflow_v4.group_features.actions.ff.push_pbb",
6864
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_PUSH_PBB,
6865
15
               NULL, HFILL }
6866
15
        },
6867
15
        { &hf_openflow_v4_group_features_actions_ff_pop_pbb,
6868
15
            { "OFPAT_POP_PBB", "openflow_v4.group_features.actions.ff.pop_pbb",
6869
15
               FT_BOOLEAN, 32, NULL, 1 << OFPAT_POP_PBB,
6870
15
               NULL, HFILL }
6871
15
        },
6872
15
        { &hf_openflow_v4_meter_band_stats_packet_band_count,
6873
15
            { "Packet count", "openflow_v4.meter_band_stats.packet_band_count",
6874
15
               FT_UINT64, BASE_DEC, NULL, 0x0,
6875
15
               NULL, HFILL }
6876
15
        },
6877
15
        { &hf_openflow_v4_meter_band_stats_byte_band_count,
6878
15
            { "Byte count", "openflow_v4.meter_band_stats.byte_band_count",
6879
15
               FT_UINT64, BASE_DEC, NULL, 0x0,
6880
15
               NULL, HFILL }
6881
15
        },
6882
15
        { &hf_openflow_v4_meter_stats_meter_id,
6883
15
            { "Meter ID", "openflow_v4.meter_stats.meter_id",
6884
15
               FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_meter_id_reserved_values), 0x0,
6885
15
               NULL, HFILL }
6886
15
        },
6887
15
        { &hf_openflow_v4_meter_stats_len,
6888
15
            { "Length", "openflow_v4.meter_stats.length",
6889
15
               FT_UINT16, BASE_DEC, NULL, 0x0,
6890
15
               NULL, HFILL }
6891
15
        },
6892
15
        { &hf_openflow_v4_meter_stats_pad,
6893
15
            { "Pad", "openflow_v4.meter_stats.pad",
6894
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
6895
15
               NULL, HFILL }
6896
15
        },
6897
15
        { &hf_openflow_v4_meter_stats_flow_count,
6898
15
            { "Flow count", "openflow_v4.meter_stats.flow_count",
6899
15
               FT_UINT32, BASE_DEC, NULL, 0x0,
6900
15
               NULL, HFILL }
6901
15
        },
6902
15
        { &hf_openflow_v4_meter_stats_packet_in_count,
6903
15
            { "Packet in count", "openflow_v4.meter_stats.packet_in_count",
6904
15
               FT_UINT64, BASE_DEC, NULL, 0x0,
6905
15
               NULL, HFILL }
6906
15
        },
6907
15
        { &hf_openflow_v4_meter_stats_byte_in_count,
6908
15
            { "Byte in count", "openflow_v4.meter_stats.byte_in_count",
6909
15
               FT_UINT64, BASE_DEC, NULL, 0x0,
6910
15
               NULL, HFILL }
6911
15
        },
6912
15
        { &hf_openflow_v4_meter_stats_duration_sec,
6913
15
            { "Duration sec", "openflow_v4.meter_stats.duration_sec",
6914
15
               FT_UINT32, BASE_DEC, NULL, 0x0,
6915
15
               NULL, HFILL }
6916
15
        },
6917
15
        { &hf_openflow_v4_meter_stats_duration_nsec,
6918
15
            { "Duration nsec", "openflow_v4.meter_stats.duration_nsec",
6919
15
               FT_UINT32, BASE_DEC, NULL, 0x0,
6920
15
               NULL, HFILL }
6921
15
        },
6922
15
        { &hf_openflow_v4_meter_config_len,
6923
15
            { "Length", "openflow_v4.meter_config.len",
6924
15
               FT_UINT16, BASE_DEC, NULL, 0x0,
6925
15
               NULL, HFILL }
6926
15
        },
6927
15
        { &hf_openflow_v4_meter_config_flags,
6928
15
            { "Flags", "openflow_v4.meter_config.flags",
6929
15
               FT_UINT32, BASE_HEX, NULL, 0x0,
6930
15
               NULL, HFILL }
6931
15
        },
6932
15
        { &hf_openflow_v4_meter_config_flags_kbps,
6933
15
            { "OFPMF_KBPS", "openflow_v4.meter_config.flags.kbps",
6934
15
               FT_BOOLEAN, 32, NULL, OFPMF_KBPS,
6935
15
               NULL, HFILL }
6936
15
        },
6937
15
        { &hf_openflow_v4_meter_config_flags_pktps,
6938
15
            { "OFPMF_PKTPS", "openflow_v4.meter_config.flags.ptkps",
6939
15
               FT_BOOLEAN, 32, NULL, OFPMF_PKTPS,
6940
15
               NULL, HFILL }
6941
15
        },
6942
15
        { &hf_openflow_v4_meter_config_flags_burst,
6943
15
            { "OFPMF_BURST", "openflow_v4.meter_config.flags.burst",
6944
15
               FT_BOOLEAN, 32, NULL, OFPMF_BURST,
6945
15
               NULL, HFILL }
6946
15
        },
6947
15
        { &hf_openflow_v4_meter_config_flags_stats,
6948
15
            { "OFPMF_STATS", "openflow_v4.meter_config.flags.stats",
6949
15
               FT_BOOLEAN, 32, NULL, OFPMF_STATS,
6950
15
               NULL, HFILL }
6951
15
        },
6952
15
        { &hf_openflow_v4_meter_config_meter_id,
6953
15
            { "Meter ID", "openflow_v4.meter_config.meter_id",
6954
15
               FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_meter_id_reserved_values), 0x0,
6955
15
               NULL, HFILL }
6956
15
        },
6957
15
        { &hf_openflow_v4_meter_features_max_meter,
6958
15
            { "Max meters", "openflow_v4.meter_features.max_meter",
6959
15
               FT_UINT32, BASE_DEC, NULL, 0x0,
6960
15
               NULL, HFILL }
6961
15
        },
6962
15
        { &hf_openflow_v4_meter_features_band_types,
6963
15
            { "Band types", "openflow_v4.features.band_types",
6964
15
               FT_UINT32, BASE_HEX, NULL, 0x0,
6965
15
               NULL, HFILL }
6966
15
        },
6967
15
        { &hf_openflow_v4_meter_features_band_types_drop,
6968
15
            { "OFPMBT_DROP", "openflow_v4.meter_features.band_types.drop",
6969
15
               FT_BOOLEAN, 32, NULL, 1 << OFPMBT_DROP,
6970
15
               NULL, HFILL }
6971
15
        },
6972
15
        { &hf_openflow_v4_meter_features_band_types_dscp_remark,
6973
15
            { "OFPMBT_DSCP_REMARK", "openflow_v4.meter_features.band_types.dscp_remark",
6974
15
               FT_BOOLEAN, 32, NULL, 1 << OFPMBT_DSCP_REMARK,
6975
15
               NULL, HFILL }
6976
15
        },
6977
15
        { &hf_openflow_v4_meter_features_capabilities,
6978
15
            { "Capabilities", "openflow_v4.meter_features.capabilities",
6979
15
               FT_UINT32, BASE_HEX, NULL, 0x0,
6980
15
               NULL, HFILL }
6981
15
        },
6982
15
        { &hf_openflow_v4_meter_features_capabilities_kbps,
6983
15
            { "OFPMF_KBPS", "openflow_v4.meter_features.capabilities.kbps",
6984
15
               FT_BOOLEAN, 32, NULL, OFPMF_KBPS,
6985
15
               NULL, HFILL }
6986
15
        },
6987
15
        { &hf_openflow_v4_meter_features_capabilities_pktps,
6988
15
            { "OFPMF_PKTPS", "openflow_v4.meter_features.capabilities.ptkps",
6989
15
               FT_BOOLEAN, 32, NULL, OFPMF_PKTPS,
6990
15
               NULL, HFILL }
6991
15
        },
6992
15
        { &hf_openflow_v4_meter_features_capabilities_burst,
6993
15
            { "OFPMF_BURST", "openflow_v4.meter_features.capabilities.burst",
6994
15
               FT_BOOLEAN, 32, NULL, OFPMF_BURST,
6995
15
               NULL, HFILL }
6996
15
        },
6997
15
        { &hf_openflow_v4_meter_features_capabilities_stats,
6998
15
            { "OFPMF_STATS", "openflow_v4.meter_features.capabilities.stats",
6999
15
               FT_BOOLEAN, 32, NULL, OFPMF_STATS,
7000
15
               NULL, HFILL }
7001
15
        },
7002
15
        { &hf_openflow_v4_meter_features_max_bands,
7003
15
            { "Max bands", "openflow_v4.meter_features.max_bands",
7004
15
               FT_UINT8, BASE_DEC, NULL, 0x0,
7005
15
               NULL, HFILL }
7006
15
        },
7007
15
        { &hf_openflow_v4_meter_features_max_color,
7008
15
            { "Max colors", "openflow_v4.meter_features.max_color",
7009
15
               FT_UINT8, BASE_DEC, NULL, 0x0,
7010
15
               NULL, HFILL }
7011
15
        },
7012
15
        { &hf_openflow_v4_meter_features_pad,
7013
15
            { "Pad", "openflow_v4.meter_features.pad",
7014
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
7015
15
               NULL, HFILL }
7016
15
        },
7017
15
        { &hf_openflow_v4_multipart_reply_type ,
7018
15
            { "Type", "openflow_v4.multipart_reply.type",
7019
15
               FT_UINT16, BASE_DEC, VALS(openflow_v4_multipart_type_values), 0x0,
7020
15
               NULL, HFILL }
7021
15
        },
7022
15
        { &hf_openflow_v4_multipart_reply_flags,
7023
15
            { "Flags", "openflow_v4.multipart_reply.flags",
7024
15
               FT_UINT16, BASE_HEX, NULL, 0x0,
7025
15
               NULL, HFILL }
7026
15
        },
7027
15
        { &hf_openflow_v4_multipart_reply_flags_more,
7028
15
            { "OFPMPF_REPLY_MORE", "openflow_v4.multipart_reply.flags.more",
7029
15
               FT_UINT16, BASE_HEX, NULL, OFPMPF_REPLY_MORE,
7030
15
               NULL, HFILL }
7031
15
        },
7032
15
        { &hf_openflow_v4_multipart_reply_pad,
7033
15
            { "Pad", "openflow_v4.multipart_reply.pad",
7034
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
7035
15
               NULL, HFILL }
7036
15
        },
7037
15
        { &hf_openflow_v4_multipart_reply_experimenter_experimenter,
7038
15
            { "Experimenter", "openflow_v4.multipart_reply.experimenter.experimenter",
7039
15
               FT_UINT32, BASE_HEX, NULL, 0x0,
7040
15
               NULL, HFILL }
7041
15
        },
7042
15
        { &hf_openflow_v4_multipart_reply_experimenter_exp_type,
7043
15
            { "Experimenter type", "openflow_v4.multipart_reply.experimenter.exp_type",
7044
15
               FT_UINT32, BASE_DEC, NULL, 0x0,
7045
15
               NULL, HFILL }
7046
15
        },
7047
15
        { &hf_openflow_v4_queue_get_config_request_port,
7048
15
            { "Port", "openflow_v4.queue_get_config_request.port",
7049
15
               FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_port_reserved_values), 0x0,
7050
15
               NULL, HFILL }
7051
15
        },
7052
15
        { &hf_openflow_v4_queue_get_config_request_pad,
7053
15
            { "Pad", "openflow_v4.queue_get_config_request.pad",
7054
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
7055
15
               NULL, HFILL }
7056
15
        },
7057
15
        { &hf_openflow_v4_queue_prop_property,
7058
15
            { "Property", "openflow_v4.queue_prop.property",
7059
15
               FT_UINT16, BASE_DEC, VALS(openflow_v4_queue_prop_property_values), 0x0,
7060
15
               NULL, HFILL }
7061
15
        },
7062
15
        { &hf_openflow_v4_queue_prop_len,
7063
15
            { "Length", "openflow_v4.queue_prop.len",
7064
15
               FT_UINT16, BASE_DEC, NULL, 0x0,
7065
15
               NULL, HFILL }
7066
15
        },
7067
15
        { &hf_openflow_v4_queue_prop_pad,
7068
15
            { "Pad", "openflow_v4.queue_prop.pad",
7069
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
7070
15
               NULL, HFILL }
7071
15
        },
7072
15
        { &hf_openflow_v4_queue_prop_min_rate_rate,
7073
15
            { "Rate", "openflow_v4.queue_prop.min_rate.rate",
7074
15
               FT_UINT16, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_queue_prop_min_rate_reserved_values), 0x0,
7075
15
               NULL, HFILL }
7076
15
        },
7077
15
        { &hf_openflow_v4_queue_prop_min_rate_pad,
7078
15
            { "Pad", "openflow_v4.queue_prop.min_rate.pad",
7079
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
7080
15
               NULL, HFILL }
7081
15
        },
7082
15
        { &hf_openflow_v4_queue_prop_max_rate_rate,
7083
15
            { "Rate", "openflow_v4.queue_prop.max_rate.rate",
7084
15
               FT_UINT16, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_queue_prop_max_rate_reserved_values), 0x0,
7085
15
               NULL, HFILL }
7086
15
        },
7087
15
        { &hf_openflow_v4_queue_prop_max_rate_pad,
7088
15
            { "Pad", "openflow_v4.queue_prop.max_rate.pad",
7089
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
7090
15
               NULL, HFILL }
7091
15
        },
7092
15
        { &hf_openflow_v4_queue_prop_experimenter_experimenter,
7093
15
            { "Experimenter", "openflow_v4.queue_prop.experimenter.experimenter",
7094
15
               FT_UINT32, BASE_DEC, NULL, 0x0,
7095
15
               NULL, HFILL }
7096
15
        },
7097
15
        { &hf_openflow_v4_queue_prop_experimenter_pad,
7098
15
            { "Pad", "openflow_v4.queue_prop.experimenter.pad",
7099
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
7100
15
               NULL, HFILL }
7101
15
        },
7102
15
        { &hf_openflow_v4_packet_queue_queue_id,
7103
15
            { "Queue ID", "openflow_v4.packet_queue.queue_id",
7104
15
               FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_queue_id_reserved_values), 0x0,
7105
15
               NULL, HFILL }
7106
15
        },
7107
15
        { &hf_openflow_v4_packet_queue_port,
7108
15
            { "Port", "openflow_v4.packet_queue.port",
7109
15
               FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_port_reserved_values), 0x0,
7110
15
               NULL, HFILL }
7111
15
        },
7112
15
        { &hf_openflow_v4_packet_queue_len,
7113
15
            { "Length", "openflow_v4.packet_queue.len",
7114
15
               FT_UINT16, BASE_DEC, NULL, 0x0,
7115
15
               NULL, HFILL }
7116
15
        },
7117
15
        { &hf_openflow_v4_packet_queue_pad,
7118
15
            { "Pad", "openflow_v4.packet_queue.pad",
7119
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
7120
15
               NULL, HFILL }
7121
15
        },
7122
15
        { &hf_openflow_v4_queue_get_config_reply_port,
7123
15
            { "Port", "openflow_v4.queue_get_config_reply.port",
7124
15
               FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_port_reserved_values), 0x0,
7125
15
               NULL, HFILL }
7126
15
        },
7127
15
        { &hf_openflow_v4_queue_get_config_reply_pad,
7128
15
            { "Pad", "openflow_v4.queue_get_config_reply.pad",
7129
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
7130
15
               NULL, HFILL }
7131
15
        },
7132
15
        { &hf_openflow_v4_role_request_role,
7133
15
            { "Role", "openflow_v4.role_request.role",
7134
15
               FT_UINT32, BASE_HEX, VALS(openflow_v4_controller_role_values), 0x0,
7135
15
               NULL, HFILL }
7136
15
        },
7137
15
        { &hf_openflow_v4_role_request_pad,
7138
15
            { "Pad", "openflow_v4.role_request.pad",
7139
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
7140
15
               NULL, HFILL }
7141
15
        },
7142
15
        { &hf_openflow_v4_role_request_generation_id,
7143
15
            { "Generation ID", "openflow_v4.role_request.generation_id",
7144
15
               FT_UINT64, BASE_HEX, NULL, 0x0,
7145
15
               NULL, HFILL }
7146
15
        },
7147
15
        { &hf_openflow_v4_role_reply_role,
7148
15
            { "Role", "openflow_v4.role_reply.role",
7149
15
               FT_UINT32, BASE_HEX, VALS(openflow_v4_controller_role_values), 0x0,
7150
15
               NULL, HFILL }
7151
15
        },
7152
15
        { &hf_openflow_v4_role_reply_pad,
7153
15
            { "Pad", "openflow_v4.role_reply.pad",
7154
15
               FT_BYTES, BASE_NONE, NULL, 0x0,
7155
15
               NULL, HFILL }
7156
15
        },
7157
15
        { &hf_openflow_v4_role_reply_generation_id,
7158
15
            { "Generation ID", "openflow_v4.role_reply.generation_id",
7159
15
               FT_UINT64, BASE_HEX, NULL, 0x0,
7160
15
               NULL, HFILL }
7161
15
        },
7162
15
        { &hf_openflow_v4_async_config_packet_in_mask_master,
7163
15
            { "Packet_in mask (master)", "openflow_v4.async_config.packet_in_mask.master",
7164
15
               FT_UINT32, BASE_HEX, NULL, 0x0,
7165
15
               NULL, HFILL }
7166
15
        },
7167
15
        { &hf_openflow_v4_async_config_packet_in_mask_master_no_match,
7168
15
            { "OFPR_NO_MATCH", "openflow_v4.async_config.packet_in_mask.master.no_match",
7169
15
               FT_BOOLEAN, 32, NULL, 1 << OFPR_NO_MATCH,
7170
15
               NULL, HFILL }
7171
15
        },
7172
15
        { &hf_openflow_v4_async_config_packet_in_mask_master_action,
7173
15
            { "OFPR_ACTION", "openflow_v4.async_config.packet_in_mask.master.action",
7174
15
               FT_BOOLEAN, 32, NULL, 1 << OFPR_ACTION,
7175
15
               NULL, HFILL }
7176
15
        },
7177
15
        { &hf_openflow_v4_async_config_packet_in_mask_master_invalid_ttl,
7178
15
            { "OFPR_INVALID_TTL", "openflow_v4.async_config.packet_in_mask.master.invalid_ttl",
7179
15
               FT_BOOLEAN, 32, NULL, 1 << OFPR_INVALID_TTL,
7180
15
               NULL, HFILL }
7181
15
        },
7182
15
        { &hf_openflow_v4_async_config_packet_in_mask_slave,
7183
15
            { "Packet_in mask (slave)", "openflow_v4.async_config.packet_in_mask.slave",
7184
15
               FT_UINT32, BASE_HEX, NULL, 0x0,
7185
15
               NULL, HFILL }
7186
15
        },
7187
15
        { &hf_openflow_v4_async_config_packet_in_mask_slave_no_match,
7188
15
            { "OFPR_NO_MATCH", "openflow_v4.async_config.packet_in_mask.slave.no_match",
7189
15
               FT_BOOLEAN, 32, NULL, 1 << OFPR_NO_MATCH,
7190
15
               NULL, HFILL }
7191
15
        },
7192
15
        { &hf_openflow_v4_async_config_packet_in_mask_slave_action,
7193
15
            { "OFPR_ACTION", "openflow_v4.async_config.packet_in_mask.slave.action",
7194
15
               FT_BOOLEAN, 32, NULL, 1 << OFPR_ACTION,
7195
15
               NULL, HFILL }
7196
15
        },
7197
15
        { &hf_openflow_v4_async_config_packet_in_mask_slave_invalid_ttl,
7198
15
            { "OFPR_INVALID_TTL", "openflow_v4.async_config.packet_in_mask.slave.invalid_ttl",
7199
15
               FT_BOOLEAN, 32, NULL, 1 << OFPR_INVALID_TTL,
7200
15
               NULL, HFILL }
7201
15
        },
7202
15
        { &hf_openflow_v4_async_config_port_status_mask_master,
7203
15
            { "Port status mask (master)", "openflow_v4.async_config.port_status_mask.master",
7204
15
               FT_UINT32, BASE_HEX, NULL, 0x0,
7205
15
               NULL, HFILL }
7206
15
        },
7207
15
        { &hf_openflow_v4_async_config_port_status_mask_master_add,
7208
15
            { "OFPPR_ADD", "openflow_v4.async_config.port_status_mask.master.add",
7209
15
               FT_BOOLEAN, 32, NULL, 1 << OFPPR_ADD,
7210
15
               NULL, HFILL }
7211
15
        },
7212
15
        { &hf_openflow_v4_async_config_port_status_mask_master_delete,
7213
15
            { "OFPPR_DELETE", "openflow_v4.async_config.port_status_mask.master.delete",
7214
15
               FT_BOOLEAN, 32, NULL, 1 << OFPPR_DELETE,
7215
15
               NULL, HFILL }
7216
15
        },
7217
15
        { &hf_openflow_v4_async_config_port_status_mask_master_modify,
7218
15
            { "OFPPR_MODIFY", "openflow_v4.async_config.port_status_mask.master.modify",
7219
15
               FT_BOOLEAN, 32, NULL, 1 << OFPPR_MODIFY,
7220
15
               NULL, HFILL }
7221
15
        },
7222
15
        { &hf_openflow_v4_async_config_port_status_mask_slave,
7223
15
            { "Port status mask (slave)", "openflow_v4.async_config.port_status_mask.slave",
7224
15
               FT_UINT32, BASE_HEX, NULL, 0x0,
7225
15
               NULL, HFILL }
7226
15
        },
7227
15
        { &hf_openflow_v4_async_config_port_status_mask_slave_add,
7228
15
            { "OFPPR_ADD", "openflow_v4.async_config.port_status_mask.slave.add",
7229
15
               FT_BOOLEAN, 32, NULL, 1 << OFPPR_ADD,
7230
15
               NULL, HFILL }
7231
15
        },
7232
15
        { &hf_openflow_v4_async_config_port_status_mask_slave_delete,
7233
15
            { "OFPPR_DELETE", "openflow_v4.async_config.port_status_mask.slave.delete",
7234
15
               FT_BOOLEAN, 32, NULL, 1 << OFPPR_DELETE,
7235
15
               NULL, HFILL }
7236
15
        },
7237
15
        { &hf_openflow_v4_async_config_port_status_mask_slave_modify,
7238
15
            { "OFPPR_MODIFY", "openflow_v4.async_config.port_status_mask.slave.modify",
7239
15
               FT_BOOLEAN, 32, NULL, 1 << OFPPR_MODIFY,
7240
15
               NULL, HFILL }
7241
15
        },
7242
15
        { &hf_openflow_v4_async_config_flow_removed_mask_master,
7243
15
            { "Flow removed mask (master)", "openflow_v4.async_config.flow_removed_mask.master",
7244
15
               FT_UINT32, BASE_HEX, NULL, 0x0,
7245
15
               NULL, HFILL }
7246
15
        },
7247
15
        { &hf_openflow_v4_async_config_flow_removed_mask_master_idle_timeout,
7248
15
            { "OFPRR_IDLE_TIMEOUT", "openflow_v4.async_config.flow_removed_mask.master.idle_timeout",
7249
15
               FT_BOOLEAN, 32, NULL, 1 << OFPRR_IDLE_TIMEOUT,
7250
15
               NULL, HFILL }
7251
15
        },
7252
15
        { &hf_openflow_v4_async_config_flow_removed_mask_master_hard_timeout,
7253
15
            { "OFPRR_HARD_TIMEOUT", "openflow_v4.async_config.flow_removed_mask.master.hard_timeout",
7254
15
               FT_BOOLEAN, 32, NULL, 1 << OFPRR_HARD_TIMEOUT,
7255
15
               NULL, HFILL }
7256
15
        },
7257
15
        { &hf_openflow_v4_async_config_flow_removed_mask_master_delete,
7258
15
            { "OFPRR_DELETE", "openflow_v4.async_config.flow_removed_mask.master.delete",
7259
15
               FT_BOOLEAN, 32, NULL, 1 << OFPRR_DELETE,
7260
15
               NULL, HFILL }
7261
15
        },
7262
15
        { &hf_openflow_v4_async_config_flow_removed_mask_master_group_delete,
7263
15
            { "OFPRR_GROUP_DELETE", "openflow_v4.async_config.flow_removed_mask.master.group_delete",
7264
15
               FT_BOOLEAN, 32, NULL, 1 << OFPRR_GROUP_DELETE,
7265
15
               NULL, HFILL }
7266
15
        },
7267
15
        { &hf_openflow_v4_async_config_flow_removed_mask_slave,
7268
15
            { "Flow removed mask (slave)", "openflow_v4.async_config.flow_removed_mask.slave",
7269
15
               FT_UINT32, BASE_HEX, NULL, 0x0,
7270
15
               NULL, HFILL }
7271
15
        },
7272
15
        { &hf_openflow_v4_async_config_flow_removed_mask_slave_idle_timeout,
7273
15
            { "OFPRR_IDLE_TIMEOUT", "openflow_v4.async_config.flow_removed_mask.slave.idle_timeout",
7274
15
               FT_BOOLEAN, 32, NULL, 1 << OFPRR_IDLE_TIMEOUT,
7275
15
               NULL, HFILL }
7276
15
        },
7277
15
        { &hf_openflow_v4_async_config_flow_removed_mask_slave_hard_timeout,
7278
15
            { "OFPRR_HARD_TIMEOUT", "openflow_v4.async_config.flow_removed_mask.slave.hard_timeout",
7279
15
               FT_BOOLEAN, 32, NULL, 1 << OFPRR_HARD_TIMEOUT,
7280
15
               NULL, HFILL }
7281
15
        },
7282
15
        { &hf_openflow_v4_async_config_flow_removed_mask_slave_delete,
7283
15
            { "OFPRR_DELETE", "openflow_v4.async_config.flow_removed_mask.slave.delete",
7284
15
               FT_BOOLEAN, 32, NULL, 1 << OFPRR_DELETE,
7285
15
               NULL, HFILL }
7286
15
        },
7287
15
        { &hf_openflow_v4_async_config_flow_removed_mask_slave_group_delete,
7288
15
            { "OFPRR_GROUP_DELETE", "openflow_v4.async_config.flow_removed_mask.slave.group_delete",
7289
15
               FT_BOOLEAN, 32, NULL, 1 << OFPRR_GROUP_DELETE,
7290
15
               NULL, HFILL }
7291
15
        },
7292
15
        { &hf_openflow_v4_metermod_command,
7293
15
            { "Command", "openflow_v4.metermod.command",
7294
15
               FT_UINT16, BASE_DEC, VALS(openflow_v4_metermod_command_values), 0x0,
7295
15
               NULL, HFILL }
7296
15
        },
7297
15
        { &hf_openflow_v4_metermod_flags,
7298
15
            { "Flags", "openflow_v4.metermod.flags",
7299
15
               FT_UINT32, BASE_HEX, NULL, 0x0,
7300
15
               NULL, HFILL }
7301
15
        },
7302
15
        { &hf_openflow_v4_metermod_flags_kbps,
7303
15
            { "OFPMF_KBPS", "openflow_v4.metermod.flags.kbps",
7304
15
               FT_BOOLEAN, 32, NULL, OFPMF_KBPS,
7305
15
               NULL, HFILL }
7306
15
        },
7307
15
        { &hf_openflow_v4_metermod_flags_pktps,
7308
15
            { "OFPMF_PKTPS", "openflow_v4.metermod.flags.ptkps",
7309
15
               FT_BOOLEAN, 32, NULL, OFPMF_PKTPS,
7310
15
               NULL, HFILL }
7311
15
        },
7312
15
        { &hf_openflow_v4_metermod_flags_burst,
7313
15
            { "OFPMF_BURST", "openflow_v4.metermod.flags.burst",
7314
15
               FT_BOOLEAN, 32, NULL, OFPMF_BURST,
7315
15
               NULL, HFILL }
7316
15
        },
7317
15
        { &hf_openflow_v4_metermod_flags_stats,
7318
15
            { "OFPMF_STATS", "openflow_v4.metermod.flags.stats",
7319
15
               FT_BOOLEAN, 32, NULL, OFPMF_STATS,
7320
15
               NULL, HFILL }
7321
15
        },
7322
15
        { &hf_openflow_v4_metermod_meter_id,
7323
15
            { "Meter ID", "openflow_v4.metermod.meter_id",
7324
15
               FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(openflow_v4_meter_id_reserved_values), 0x0,
7325
15
               NULL, HFILL }
7326
15
        }
7327
15
    };
7328
7329
15
    static int *ett[] = {
7330
15
        &ett_openflow_v4,
7331
15
        &ett_openflow_v4_flowmod_flags,
7332
15
        &ett_openflow_v4_bucket,
7333
15
        &ett_openflow_v4_oxm,
7334
15
        &ett_openflow_v4_match,
7335
15
        &ett_openflow_v4_action,
7336
15
        &ett_openflow_v4_instruction,
7337
15
        &ett_openflow_v4_port,
7338
15
        &ett_openflow_v4_port_config,
7339
15
        &ett_openflow_v4_port_state,
7340
15
        &ett_openflow_v4_port_current,
7341
15
        &ett_openflow_v4_port_advertised,
7342
15
        &ett_openflow_v4_port_supported,
7343
15
        &ett_openflow_v4_port_peer,
7344
15
        &ett_openflow_v4_meter_band,
7345
15
        &ett_openflow_v4_hello_element,
7346
15
        &ett_openflow_v4_error_data,
7347
15
        &ett_openflow_v4_switch_features_capabilities,
7348
15
        &ett_openflow_v4_switch_config_flags,
7349
15
        &ett_openflow_v4_packet_in_data,
7350
15
        &ett_openflow_v4_packet_out_data,
7351
15
        &ett_openflow_v4_portmod_config,
7352
15
        &ett_openflow_v4_portmod_mask,
7353
15
        &ett_openflow_v4_portmod_advertise,
7354
15
        &ett_openflow_v4_table_features,
7355
15
        &ett_openflow_v4_table_feature_prop,
7356
15
        &ett_openflow_v4_table_feature_prop_instruction_id,
7357
15
        &ett_openflow_v4_table_feature_prop_action_id,
7358
15
        &ett_openflow_v4_table_feature_prop_oxm_id,
7359
15
        &ett_openflow_v4_multipart_request_flags,
7360
15
        &ett_openflow_v4_flow_stats,
7361
15
        &ett_openflow_v4_flow_stats_flags,
7362
15
        &ett_openflow_v4_table_stats,
7363
15
        &ett_openflow_v4_port_stats,
7364
15
        &ett_openflow_v4_queue_stats,
7365
15
        &ett_openflow_v4_bucket_counter,
7366
15
        &ett_openflow_v4_group_stats,
7367
15
        &ett_openflow_v4_group_desc,
7368
15
        &ett_openflow_v4_group_features_types,
7369
15
        &ett_openflow_v4_group_features_capabilities,
7370
15
        &ett_openflow_v4_group_features_actions_all,
7371
15
        &ett_openflow_v4_group_features_actions_select,
7372
15
        &ett_openflow_v4_group_features_actions_indirect,
7373
15
        &ett_openflow_v4_group_features_actions_ff,
7374
15
        &ett_openflow_v4_meter_band_stats,
7375
15
        &ett_openflow_v4_meter_stats,
7376
15
        &ett_openflow_v4_meter_config,
7377
15
        &ett_openflow_v4_meter_config_flags,
7378
15
        &ett_openflow_v4_meter_features_band_types,
7379
15
        &ett_openflow_v4_meter_features_capabilities,
7380
15
        &ett_openflow_v4_multipart_reply_flags,
7381
15
        &ett_openflow_v4_queue_prop,
7382
15
        &ett_openflow_v4_packet_queue,
7383
15
        &ett_openflow_v4_async_config_packet_in_mask_master,
7384
15
        &ett_openflow_v4_async_config_packet_in_mask_slave,
7385
15
        &ett_openflow_v4_async_config_port_status_mask_master,
7386
15
        &ett_openflow_v4_async_config_port_status_mask_slave,
7387
15
        &ett_openflow_v4_async_config_flow_removed_mask_master,
7388
15
        &ett_openflow_v4_async_config_flow_removed_mask_slave,
7389
15
        &ett_openflow_v4_metermod_flags
7390
15
    };
7391
7392
15
    static ei_register_info ei[] = {
7393
15
        { &ei_openflow_v4_oxm_undecoded,
7394
15
            { "openflow_v4.oxm.undecoded", PI_UNDECODED, PI_NOTE,
7395
15
              "Unknown OMX body.", EXPFILL }
7396
15
        },
7397
15
        { &ei_openflow_v4_match_undecoded,
7398
15
            { "openflow_v4.match.undecoded", PI_UNDECODED, PI_NOTE,
7399
15
              "Unknown match body.", EXPFILL }
7400
15
        },
7401
15
        { &ei_openflow_v4_action_undecoded,
7402
15
            { "openflow_v4.action.undecoded", PI_UNDECODED, PI_NOTE,
7403
15
              "Unknown action body.", EXPFILL }
7404
15
        },
7405
15
        { &ei_openflow_v4_instruction_undecoded,
7406
15
            { "openflow_v4.instruction.undecoded", PI_UNDECODED, PI_NOTE,
7407
15
              "Unknown instruction body.", EXPFILL }
7408
15
        },
7409
15
        { &ei_openflow_v4_meter_band_undecoded,
7410
15
            { "openflow_v4.meter_band.undecoded", PI_UNDECODED, PI_NOTE,
7411
15
              "Unknown meter band body.", EXPFILL }
7412
15
        },
7413
15
        { &ei_openflow_v4_hello_element_undecoded,
7414
15
            { "openflow_v4.hello_element.undecoded", PI_UNDECODED, PI_NOTE,
7415
15
              "Unknown hello element body.", EXPFILL }
7416
15
        },
7417
15
        { &ei_openflow_v4_error_undecoded,
7418
15
            { "openflow_v4.error.undecoded", PI_UNDECODED, PI_NOTE,
7419
15
              "Unknown error data.", EXPFILL }
7420
15
        },
7421
15
        { &ei_openflow_v4_experimenter_undecoded,
7422
15
            { "openflow_v4.experimenter.undecoded", PI_UNDECODED, PI_NOTE,
7423
15
              "Unknown experimenter body.", EXPFILL }
7424
15
        },
7425
15
        { &ei_openflow_v4_table_feature_prop_undecoded,
7426
15
            { "openflow_v4.table_feature_prop.undecoded", PI_UNDECODED, PI_NOTE,
7427
15
              "Unknown table feature property body.", EXPFILL }
7428
15
        },
7429
15
        { &ei_openflow_v4_multipart_request_undecoded,
7430
15
            { "openflow_v4.multipart_request.undecoded", PI_UNDECODED, PI_NOTE,
7431
15
              "Unknown multipart request body.", EXPFILL }
7432
15
        },
7433
15
        { &ei_openflow_v4_multipart_reply_undecoded,
7434
15
            { "openflow_v4.multipart_reply.undecoded", PI_UNDECODED, PI_NOTE,
7435
15
              "Unknown multipart reply body.", EXPFILL }
7436
15
        },
7437
15
        { &ei_openflow_v4_queue_prop_undecoded,
7438
15
            { "openflow_v4.queue_prop.undecoded", PI_UNDECODED, PI_NOTE,
7439
15
              "Unknown queue property body.", EXPFILL }
7440
15
        },
7441
15
        {&ei_openflow_v4_message_undecoded,
7442
15
            { "openflow_v4.message.undecoded", PI_UNDECODED, PI_NOTE,
7443
15
              "Unknown message body.", EXPFILL }
7444
15
        }
7445
15
    };
7446
7447
15
    expert_module_t *expert_openflow_v4;
7448
7449
    /* Register the protocol name and description */
7450
15
    proto_openflow_v4 = proto_register_protocol("OpenFlow 1.3", "openflow_v4", "openflow_v4");
7451
7452
15
    register_dissector("openflow_v4", dissect_openflow_v4, proto_openflow_v4);
7453
7454
    /* Required function calls to register the header fields and subtrees */
7455
15
    proto_register_field_array(proto_openflow_v4, hf, array_length(hf));
7456
15
    proto_register_subtree_array(ett, array_length(ett));
7457
15
    expert_openflow_v4 = expert_register_protocol(proto_openflow_v4);
7458
15
    expert_register_field_array(expert_openflow_v4, ei, array_length(ei));
7459
15
}
7460
7461
void
7462
proto_reg_handoff_openflow_v4(void)
7463
15
{
7464
15
    eth_withoutfcs_handle = find_dissector_add_dependency("eth_withoutfcs", proto_openflow_v4);
7465
15
}
7466
7467
/*
7468
 * Editor modelines  -  https://www.wireshark.org/tools/modelines.html
7469
 *
7470
 * Local variables:
7471
 * c-basic-offset: 4
7472
 * tab-width: 8
7473
 * indent-tabs-mode: nil
7474
 * End:
7475
 *
7476
 * vi: set shiftwidth=4 tabstop=8 expandtab:
7477
 * :indentSize=4:tabSize=8:noTabs=true:
7478
 */