1 # Copyright (C) 2012 Nippon Telegraph and Telephone Corporation.
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
7 # http://www.apache.org/licenses/LICENSE-2.0
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
16 # vim: tabstop=4 shiftwidth=4 softtabstop=4
20 from nose.tools import eq_
21 from ryu.ofproto.ofproto_v1_2 import *
24 LOG = logging.getLogger('test_ofproto_v12')
27 class TestOfprot12(unittest.TestCase):
28 """ Test case for ofproto_v1_2
31 def test_struct_ofp_header(self):
32 eq_(OFP_HEADER_PACK_STR, '!BBHI')
33 eq_(OFP_HEADER_SIZE, 8)
35 def test_enum_ofp_type(self):
38 eq_(OFPT_ECHO_REQUEST, 2)
39 eq_(OFPT_ECHO_REPLY, 3)
40 eq_(OFPT_EXPERIMENTER, 4)
41 eq_(OFPT_FEATURES_REQUEST, 5)
42 eq_(OFPT_FEATURES_REPLY, 6)
43 eq_(OFPT_GET_CONFIG_REQUEST, 7)
44 eq_(OFPT_GET_CONFIG_REPLY, 8)
45 eq_(OFPT_SET_CONFIG, 9)
46 eq_(OFPT_PACKET_IN, 10)
47 eq_(OFPT_FLOW_REMOVED, 11)
48 eq_(OFPT_PORT_STATUS, 12)
49 eq_(OFPT_PACKET_OUT, 13)
50 eq_(OFPT_FLOW_MOD, 14)
51 eq_(OFPT_GROUP_MOD, 15)
52 eq_(OFPT_PORT_MOD, 16)
53 eq_(OFPT_TABLE_MOD, 17)
54 eq_(OFPT_STATS_REQUEST, 18)
55 eq_(OFPT_STATS_REPLY, 19)
56 eq_(OFPT_BARRIER_REQUEST, 20)
57 eq_(OFPT_BARRIER_REPLY, 21)
58 eq_(OFPT_QUEUE_GET_CONFIG_REQUEST, 22)
59 eq_(OFPT_QUEUE_GET_CONFIG_REPLY, 23)
60 eq_(OFPT_ROLE_REQUEST, 24)
61 eq_(OFPT_ROLE_REPLY, 25)
63 def test_struct_ofp_port(self):
64 eq_(OFP_PORT_PACK_STR, '!I4x6s2x16sIIIIIIII')
65 eq_(OFP_PORT_SIZE, 64)
67 def test_enum_ofp_port_config(self):
68 eq_(OFPPC_PORT_DOWN, 1 << 0)
69 eq_(OFPPC_NO_RECV, 1 << 2)
70 eq_(OFPPC_NO_FWD, 1 << 5)
71 eq_(OFPPC_NO_PACKET_IN, 1 << 6)
73 def test_enum_ofp_port_state(self):
74 eq_(OFPPS_LINK_DOWN, 1 << 0)
75 eq_(OFPPS_BLOCKED, 1 << 1)
76 eq_(OFPPS_LIVE, 1 << 2)
78 def test_enum_ofp_port_no(self):
79 eq_(OFPP_MAX, 0xffffff00)
80 eq_(OFPP_IN_PORT, 0xfffffff8)
81 eq_(OFPP_TABLE, 0xfffffff9)
82 eq_(OFPP_NORMAL, 0xfffffffa)
83 eq_(OFPP_FLOOD, 0xfffffffb)
84 eq_(OFPP_ALL, 0xfffffffc)
85 eq_(OFPP_CONTROLLER, 0xfffffffd)
86 eq_(OFPP_LOCAL, 0xfffffffe)
87 eq_(OFPP_ANY, 0xffffffff)
88 eq_(OFPQ_ALL, 0xffffffff)
90 def test_enum_ofp_port_features(self):
91 eq_(OFPPF_10MB_HD, 1 << 0)
92 eq_(OFPPF_10MB_FD, 1 << 1)
93 eq_(OFPPF_100MB_HD, 1 << 2)
94 eq_(OFPPF_100MB_FD, 1 << 3)
95 eq_(OFPPF_1GB_HD, 1 << 4)
96 eq_(OFPPF_1GB_FD, 1 << 5)
97 eq_(OFPPF_10GB_FD, 1 << 6)
98 eq_(OFPPF_40GB_FD, 1 << 7)
99 eq_(OFPPF_100GB_FD, 1 << 8)
100 eq_(OFPPF_1TB_FD, 1 << 9)
101 eq_(OFPPF_OTHER, 1 << 10)
102 eq_(OFPPF_COPPER, 1 << 11)
103 eq_(OFPPF_FIBER, 1 << 12)
104 eq_(OFPPF_AUTONEG, 1 << 13)
105 eq_(OFPPF_PAUSE, 1 << 14)
106 eq_(OFPPF_PAUSE_ASYM, 1 << 15)
108 def test_struct_ofp_packet_queue(self):
109 eq_(OFP_PACKET_QUEUE_PACK_STR, '!IIH6x')
110 eq_(OFP_PACKET_QUEUE_SIZE, 16)
112 def test_enum_ofp_queue_properties(self):
113 eq_(OFPQT_MIN_RATE, 1)
114 eq_(OFPQT_MAX_RATE, 2)
115 eq_(OFPQT_EXPERIMENTER, 0xffff)
117 def test_struct_ofp_queue_prop_header(self):
118 eq_(OFP_QUEUE_PROP_HEADER_PACK_STR, '!HH4x')
119 eq_(OFP_QUEUE_PROP_HEADER_SIZE, 8)
121 def test_struct_ofp_queue_prop_min_rate(self):
122 eq_(OFP_QUEUE_PROP_MIN_RATE_PACK_STR, '!H6x')
123 eq_(OFP_QUEUE_PROP_MIN_RATE_SIZE, 16)
125 def test_struct_ofp_queue_prop_max_rate(self):
126 eq_(OFP_QUEUE_PROP_MAX_RATE_PACK_STR, '!H6x')
127 eq_(OFP_QUEUE_PROP_MAX_RATE_SIZE, 16)
129 def test_struct_ofp_queue_prop_experimenter(self):
130 eq_(OFP_QUEUE_PROP_EXPERIMENTER_PACK_STR, '!I4x')
131 eq_(OFP_QUEUE_PROP_EXPERIMENTER_SIZE, 16)
133 def test_struct_ofp_match(self):
134 eq_(OFP_MATCH_PACK_STR, '!HHBBBB')
135 eq_(OFP_MATCH_SIZE, 8)
137 def test_enum_ofp_match_type(self):
138 eq_(OFPMT_STANDARD, 0)
141 def test_enum_ofp_oxm_class(self):
142 eq_(OFPXMC_NXM_0, 0x0000)
143 eq_(OFPXMC_NXM_1, 0x0001)
144 eq_(OFPXMC_OPENFLOW_BASIC, 0x8000)
145 eq_(OFPXMC_EXPERIMENTER, 0xFFFF)
147 def test_enmu_oxm_ofb_match_fields(self):
148 eq_(OFPXMT_OFB_IN_PORT, 0)
149 eq_(OFPXMT_OFB_IN_PHY_PORT, 1)
150 eq_(OFPXMT_OFB_METADATA, 2)
151 eq_(OFPXMT_OFB_ETH_DST, 3)
152 eq_(OFPXMT_OFB_ETH_SRC, 4)
153 eq_(OFPXMT_OFB_ETH_TYPE, 5)
154 eq_(OFPXMT_OFB_VLAN_VID, 6)
155 eq_(OFPXMT_OFB_VLAN_PCP, 7)
156 eq_(OFPXMT_OFB_IP_DSCP, 8)
157 eq_(OFPXMT_OFB_IP_ECN, 9)
158 eq_(OFPXMT_OFB_IP_PROTO, 10)
159 eq_(OFPXMT_OFB_IPV4_SRC, 11)
160 eq_(OFPXMT_OFB_IPV4_DST, 12)
161 eq_(OFPXMT_OFB_TCP_SRC, 13)
162 eq_(OFPXMT_OFB_TCP_DST, 14)
163 eq_(OFPXMT_OFB_UDP_SRC, 15)
164 eq_(OFPXMT_OFB_UDP_DST, 16)
165 eq_(OFPXMT_OFB_SCTP_SRC, 17)
166 eq_(OFPXMT_OFB_SCTP_DST, 18)
167 eq_(OFPXMT_OFB_ICMPV4_TYPE, 19)
168 eq_(OFPXMT_OFB_ICMPV4_CODE, 20)
169 eq_(OFPXMT_OFB_ARP_OP, 21)
170 eq_(OFPXMT_OFB_ARP_SPA, 22)
171 eq_(OFPXMT_OFB_ARP_TPA, 23)
172 eq_(OFPXMT_OFB_ARP_SHA, 24)
173 eq_(OFPXMT_OFB_ARP_THA, 25)
174 eq_(OFPXMT_OFB_IPV6_SRC, 26)
175 eq_(OFPXMT_OFB_IPV6_DST, 27)
176 eq_(OFPXMT_OFB_IPV6_FLABEL, 28)
177 eq_(OFPXMT_OFB_ICMPV6_TYPE, 29)
178 eq_(OFPXMT_OFB_ICMPV6_CODE, 30)
179 eq_(OFPXMT_OFB_IPV6_ND_TARGET, 31)
180 eq_(OFPXMT_OFB_IPV6_ND_SLL, 32)
181 eq_(OFPXMT_OFB_IPV6_ND_TLL, 33)
182 eq_(OFPXMT_OFB_MPLS_LABEL, 34)
183 eq_(OFPXMT_OFB_MPLS_TC, 35)
185 def test_enum_ofp_vlan_id(self):
186 eq_(OFPVID_PRESENT, 0x1000)
187 eq_(OFPVID_NONE, 0x0000)
189 def test_struct_ofp_oxm_experimenter_header(self):
190 eq_(OFP_OXM_EXPERIMENTER_HEADER_PACK_STR, '!II')
191 eq_(OFP_OXM_EXPERIMENTER_HEADER_SIZE, 8)
193 def test_enum_ofp_instruction_type(self):
194 eq_(OFPIT_GOTO_TABLE, 1)
195 eq_(OFPIT_WRITE_METADATA, 2)
196 eq_(OFPIT_WRITE_ACTIONS, 3)
197 eq_(OFPIT_APPLY_ACTIONS, 4)
198 eq_(OFPIT_CLEAR_ACTIONS, 5)
199 eq_(OFPIT_EXPERIMENTER, 0xFFFF)
201 def test_struct_ofp_instruction_goto_table(self):
202 eq_(OFP_INSTRUCTION_GOTO_TABLE_PACK_STR, '!HHB3x')
203 eq_(OFP_INSTRUCTION_GOTO_TABLE_SIZE, 8)
205 def test_struct_ofp_instruction_write_metadata(self):
206 eq_(OFP_INSTRUCTION_WRITE_METADATA_PACK_STR, '!HH4xQQ')
207 eq_(OFP_INSTRUCTION_WRITE_METADATA_SIZE, 24)
209 def test_struct_ofp_instaruction_actions(self):
210 eq_(OFP_INSTRUCTION_ACTIONS_PACK_STR, '!HH4x')
211 eq_(OFP_INSTRUCTION_ACTIONS_SIZE, 8)
213 def test_enum_ofp_action_type(self):
215 eq_(OFPAT_COPY_TTL_OUT, 11)
216 eq_(OFPAT_COPY_TTL_IN, 12)
217 eq_(OFPAT_SET_MPLS_TTL, 15)
218 eq_(OFPAT_DEC_MPLS_TTL, 16)
219 eq_(OFPAT_PUSH_VLAN, 17)
220 eq_(OFPAT_POP_VLAN, 18)
221 eq_(OFPAT_PUSH_MPLS, 19)
222 eq_(OFPAT_POP_MPLS, 20)
223 eq_(OFPAT_SET_QUEUE, 21)
225 eq_(OFPAT_SET_NW_TTL, 23)
226 eq_(OFPAT_DEC_NW_TTL, 24)
227 eq_(OFPAT_SET_FIELD, 25)
228 eq_(OFPAT_EXPERIMENTER, 0xffff)
230 def test_struct_ofp_action_header(self):
231 eq_(OFP_ACTION_HEADER_PACK_STR, '!HH4x')
232 eq_(OFP_ACTION_HEADER_SIZE, 8)
234 def test_struct_ofp_action_output(self):
235 eq_(OFP_ACTION_OUTPUT_PACK_STR, '!HHIH6x')
236 eq_(OFP_ACTION_OUTPUT_SIZE, 16)
238 def test_enum_ofp_controller_max_len(self):
239 eq_(OFPCML_MAX, 0xffe5)
240 eq_(OFPCML_NO_BUFFER, 0xffff)
242 def test_struct_ofp_action_group(self):
243 eq_(OFP_ACTION_GROUP_PACK_STR, '!HHI')
244 eq_(OFP_ACTION_GROUP_SIZE, 8)
246 def test_struct_ofp_action_set_queue(self):
247 eq_(OFP_ACTION_SET_QUEUE_PACK_STR, '!HHI')
248 eq_(OFP_ACTION_SET_QUEUE_SIZE, 8)
250 def test_struct_ofp_aciton_mpls_ttl(self):
251 eq_(OFP_ACTION_MPLS_TTL_PACK_STR, '!HHB3x')
252 eq_(OFP_ACTION_MPLS_TTL_SIZE, 8)
254 def test_struct_ofp_action_nw_ttl(self):
255 eq_(OFP_ACTION_NW_TTL_PACK_STR, '!HHB3x')
256 eq_(OFP_ACTION_NW_TTL_SIZE, 8)
258 def test_struct_ofp_action_push(self):
259 eq_(OFP_ACTION_PUSH_PACK_STR, '!HHH2x')
260 eq_(OFP_ACTION_PUSH_SIZE, 8)
262 def test_struct_ofp_action_pop_mpls(self):
263 eq_(OFP_ACTION_POP_MPLS_PACK_STR, '!HHH2x')
264 eq_(OFP_ACTION_POP_MPLS_SIZE, 8)
266 def test_struct_ofp_action_set_field(self):
267 eq_(OFP_ACTION_SET_FIELD_PACK_STR, '!HH4B')
268 eq_(OFP_ACTION_SET_FIELD_SIZE, 8)
270 def test_struct_ofp_action_experimenter_header(self):
271 eq_(OFP_ACTION_EXPERIMENTER_HEADER_PACK_STR, '!HHI')
272 eq_(OFP_ACTION_EXPERIMENTER_HEADER_SIZE, 8)
274 def test_struct_ofp_switch_feature(self):
275 eq_(OFP_SWITCH_FEATURES_PACK_STR, '!QIB3xII')
276 eq_(OFP_SWITCH_FEATURES_SIZE, 32)
278 def test_enum_ofp_capabilities(self):
279 eq_(OFPC_FLOW_STATS, 1 << 0)
280 eq_(OFPC_TABLE_STATS, 1 << 1)
281 eq_(OFPC_PORT_STATS, 1 << 2)
282 eq_(OFPC_GROUP_STATS, 1 << 3)
283 eq_(OFPC_IP_REASM, 1 << 5)
284 eq_(OFPC_QUEUE_STATS, 1 << 6)
285 eq_(OFPC_PORT_BLOCKED, 1 << 8)
287 def test_struct_ofp_switch_config(self):
288 eq_(OFP_SWITCH_CONFIG_PACK_STR, '!HH')
289 eq_(OFP_SWITCH_CONFIG_SIZE, 12)
291 def test_enum_ofp_config_flags(self):
292 eq_(OFPC_FRAG_NORMAL, 0)
293 eq_(OFPC_FRAG_DROP, 1 << 0)
294 eq_(OFPC_FRAG_REASM, 1 << 1)
295 eq_(OFPC_FRAG_MASK, 3)
296 eq_(OFPC_INVALID_TTL_TO_CONTROLLER, 1 << 2)
298 def test_enum_ofp_table(self):
302 def test_struct_ofp_table_mod(self):
303 eq_(OFP_TABLE_MOD_PACK_STR, '!B3xI')
304 eq_(OFP_TABLE_MOD_SIZE, 16)
306 def test_enum_ofp_table_config(self):
307 eq_(OFPTC_TABLE_MISS_CONTROLLER, 0)
308 eq_(OFPTC_TABLE_MISS_CONTINUE, 1 << 0)
309 eq_(OFPTC_TABLE_MISS_DROP, 1 << 1)
310 eq_(OFPTC_TABLE_MISS_MASK, 3)
312 def test_struct_ofp_flow_mod(self):
313 eq_(OFP_FLOW_MOD_PACK_STR, '!QQBBHHHIIIH2xHHBBBB')
314 eq_(OFP_FLOW_MOD_SIZE, 56)
316 def test_enum_ofp_flow_mod_command(self):
319 eq_(OFPFC_MODIFY_STRICT, 2)
321 eq_(OFPFC_DELETE_STRICT, 4)
323 def test_enum_ofp_flow_mod_flags(self):
324 eq_(OFPFF_SEND_FLOW_REM, 1 << 0)
325 eq_(OFPFF_CHECK_OVERLAP, 1 << 1)
326 eq_(OFPFF_RESET_COUNTS, 1 << 2)
328 def test_struct_ofp_group_mod(self):
329 eq_(OFP_GROUP_MOD_PACK_STR, '!HBxI')
330 eq_(OFP_GROUP_MOD_SIZE, 16)
333 def test_enum_ofp_group(self):
334 eq_(OFPG_MAX, 0xffffff00)
335 eq_(OFPG_ALL, 0xfffffffc)
336 eq_(OFPG_ANY, 0xffffffff)
338 def test_enum_ofp_group_mod_command(self):
343 def test_enum_ofp_group_type(self):
346 eq_(OFPGT_INDIRECT, 2)
349 def test_struct_ofp_bucket(self):
350 eq_(OFP_BUCKET_PACK_STR, '!HHII4x')
351 eq_(OFP_BUCKET_SIZE, 16)
353 def test_struct_ofp_port_mod(self):
354 eq_(OFP_PORT_MOD_PACK_STR, '!I4x6s2xIII4x')
355 eq_(OFP_PORT_MOD_SIZE, 40)
357 def test_sturct_ofp_stats_request(self):
358 eq_(OFP_STATS_REQUEST_PACK_STR, '!HH4x')
359 eq_(OFP_STATS_REQUEST_SIZE, 16)
361 # OFPSF_REQ_* flags (none yet defined).
362 # The only value defined for flags in a reply is whether more
363 # replies will follow this one - this has the value 0x0001.
364 def test_enum_ofp_stats_reply_flags(self):
365 eq_(OFPSF_REPLY_MORE, 0x0001)
367 def test_struct_ofp_stats_reply(self):
368 eq_(OFP_STATS_REPLY_PACK_STR, '!HH4x')
369 eq_(OFP_STATS_REPLY_SIZE, 16)
371 def test_enum_ofp_stats_types(self):
374 eq_(OFPST_AGGREGATE, 2)
379 eq_(OFPST_GROUP_DESC, 7)
380 eq_(OFPST_GROUP_FEATURES, 8)
381 eq_(OFPST_EXPERIMENTER, 0xffff)
383 def test_struct_ofp_desc_stats(self):
384 eq_(OFP_DESC_STATS_PACK_STR, '!256s256s256s32s256s')
385 eq_(OFP_DESC_STATS_SIZE, 1056)
387 def test_struct_ofp_flow_stats_request(self):
388 eq_(OFP_FLOW_STATS_REQUEST_PACK_STR, '!B3xII4xQQ')
389 eq_(OFP_FLOW_STATS_REQUEST_SIZE, 40)
391 def test_struct_ofp_flow_stats(self):
392 eq_(OFP_FLOW_STATS_PACK_STR, '!HBxIIHHH6xQQQ')
393 eq_(OFP_FLOW_STATS_SIZE, 56)
395 def test_struct_ofp_aggregate_stats_request(self):
396 eq_(OFP_AGGREGATE_STATS_REQUEST_PACK_STR, '!B3xII4xQQ')
397 eq_(OFP_AGGREGATE_STATS_REQUEST_SIZE, 40)
399 def test_struct_ofp_aggregate_stats_reply(self):
400 eq_(OFP_AGGREGATE_STATS_REPLY_PACK_STR, '!QQI4x')
401 eq_(OFP_AGGREGATE_STATS_REPLY_SIZE, 24)
403 def test_sturct_ofp_table_stats(self):
404 eq_(OFP_TABLE_STATS_PACK_STR, '!B7x32sQQIIQQQQIIIIQQ')
405 eq_(OFP_TABLE_STATS_SIZE, 128)
407 def test_struct_ofp_port_stats_request(self):
408 eq_(OFP_PORT_STATS_REQUEST_PACK_STR, '!I4x')
409 eq_(OFP_PORT_STATS_REQUEST_SIZE, 8)
411 def test_struct_ofp_port_stats(self):
412 eq_(OFP_PORT_STATS_PACK_STR, '!I4xQQQQQQQQQQQQ')
413 eq_(OFP_PORT_STATS_SIZE, 104)
415 def test_struct_ofp_queue_stats_request(self):
416 eq_(OFP_QUEUE_STATS_REQUEST_PACK_STR, '!II')
417 eq_(OFP_QUEUE_STATS_REQUEST_SIZE, 8)
419 def test_struct_ofp_queue_stats(self):
420 eq_(OFP_QUEUE_STATS_PACK_STR, '!IIQQQ')
421 eq_(OFP_QUEUE_STATS_SIZE, 32)
423 def test_struct_ofp_group_stats_request(self):
424 eq_(OFP_GROUP_STATS_REQUEST_PACK_STR, '!I4x')
425 eq_(OFP_GROUP_STATS_REQUEST_SIZE, 8)
427 def test_struct_ofp_group_stats(self):
428 eq_(OFP_GROUP_STATS_PACK_STR, '!H2xII4xQQ')
429 eq_(OFP_GROUP_STATS_SIZE, 32)
431 def test_struct_ofp_bucket_counter(self):
432 eq_(OFP_BUCKET_COUNTER_PACK_STR, '!QQ')
433 eq_(OFP_BUCKET_COUNTER_SIZE, 16)
435 def test_struct_ofp_group_desc_stats(self):
436 eq_(OFP_GROUP_DESC_STATS_PACK_STR, '!HBxI')
437 eq_(OFP_GROUP_DESC_STATS_SIZE, 8)
439 def test_struct_ofp_group_features_stats(self):
440 eq_(OFP_GROUP_FEATURES_STATS_PACK_STR, '!II4I4I')
441 eq_(OFP_GROUP_FEATURES_STATS_SIZE, 40)
443 def test_enmu_ofp_group_capabilities(self):
444 eq_(OFPGFC_SELECT_WEIGHT, 1 << 0)
445 eq_(OFPGFC_SELECT_LIVENESS, 1 << 1)
446 eq_(OFPGFC_CHAINING, 1 << 2)
447 eq_(OFPGFC_CHAINING_CHECKS, 1 << 3)
449 def test_struct_ofp_experimenter_stats_header(self):
450 eq_(OFP_EXPERIMENTER_STATS_HEADER_PACK_STR, '!II')
451 eq_(OFP_EXPERIMENTER_STATS_HEADER_SIZE, 8)
453 def test_struct_opf_queue_get_config_request(self):
454 eq_(OFP_QUEUE_GET_CONFIG_REQUEST_PACK_STR, '!I4x')
455 eq_(OFP_QUEUE_GET_CONFIG_REQUEST_SIZE, 16)
457 def test_struct_ofp_queue_get_config_reply(self):
458 eq_(OFP_QUEUE_GET_CONFIG_REPLY_PACK_STR, '!I4x')
459 eq_(OFP_QUEUE_GET_CONFIG_REPLY_SIZE, 16)
461 def test_struct_ofp_packet_out(self):
462 eq_(OFP_PACKET_OUT_PACK_STR, '!IIH6x')
463 eq_(OFP_PACKET_OUT_SIZE, 24)
465 def test_struct_ofp_role_request(self):
466 eq_(OFP_ROLE_REQUEST_PACK_STR, '!I4xQ')
467 eq_(OFP_ROLE_REQUEST_SIZE, 24)
469 def test_enum_ofp_controller_role(self):
470 eq_(OFPCR_ROLE_NOCHANGE, 0)
471 eq_(OFPCR_ROLE_EQUAL, 1)
472 eq_(OFPCR_ROLE_MASTER, 2)
473 eq_(OFPCR_ROLE_SLAVE, 3)
475 def test_struct_ofp_packet_in(self):
476 eq_(OFP_PACKET_IN_PACK_STR, '!IHBB')
477 eq_(OFP_PACKET_IN_SIZE, 24)
479 def test_enum_ofp_packet_in_reason(self):
480 eq_(OFPR_NO_MATCH, 0)
482 eq_(OFPR_INVALID_TTL, 2)
484 def test_struct_ofp_flow_removed(self):
485 eq_(OFP_FLOW_REMOVED_PACK_STR, '!QHBBIIHHQQHHBBBB')
486 eq_(OFP_FLOW_REMOVED_PACK_STR0, '!QHBBIIHHQQ')
487 eq_(OFP_FLOW_REMOVED_SIZE, 56)
489 def test_enum_ofp_flow_removed_reason(self):
490 eq_(OFPRR_IDLE_TIMEOUT, 0)
491 eq_(OFPRR_HARD_TIMEOUT, 1)
493 eq_(OFPRR_GROUP_DELETE, 3)
495 def test_struct_ofp_port_status(self):
496 eq_(OFP_PORT_STATUS_PACK_STR, '!B7xI4x6s2x16sIIIIIIII')
497 eq_(OFP_PORT_STATUS_DESC_OFFSET, 16)
498 eq_(OFP_PORT_STATUS_SIZE, 80)
500 def test_enum_ofp_port_reason(self):
505 def test_struct_ofp_error_msg(self):
506 eq_(OFP_ERROR_MSG_PACK_STR, '!HH')
507 eq_(OFP_ERROR_MSG_SIZE, 12)
509 def test_enum_ofp_error_type(self):
510 eq_(OFPET_HELLO_FAILED, 0)
511 eq_(OFPET_BAD_REQUEST, 1)
512 eq_(OFPET_BAD_ACTION, 2)
513 eq_(OFPET_BAD_INSTRUCTION, 3)
514 eq_(OFPET_BAD_MATCH, 4)
515 eq_(OFPET_FLOW_MOD_FAILED, 5)
516 eq_(OFPET_GROUP_MOD_FAILED, 6)
517 eq_(OFPET_PORT_MOD_FAILED, 7)
518 eq_(OFPET_TABLE_MOD_FAILED, 8)
519 eq_(OFPET_QUEUE_OP_FAILED, 9)
520 eq_(OFPET_SWITCH_CONFIG_FAILED, 10)
521 eq_(OFPET_ROLE_REQUEST_FAILED, 11)
522 eq_(OFPET_EXPERIMENTER, 0xffff)
524 def test_enum_ofp_hello_failed_code(self):
525 eq_(OFPHFC_INCOMPATIBLE, 0)
528 def test_enum_ofp_bad_request_code(self):
529 eq_(OFPBRC_BAD_VERSION, 0)
530 eq_(OFPBRC_BAD_TYPE, 1)
531 eq_(OFPBRC_BAD_STAT, 2)
532 eq_(OFPBRC_BAD_EXPERIMENTER, 3)
533 eq_(OFPBRC_BAD_EXP_TYPE, 4)
535 eq_(OFPBRC_BAD_LEN, 6)
536 eq_(OFPBRC_BUFFER_EMPTY, 7)
537 eq_(OFPBRC_BUFFER_UNKNOWN, 8)
538 eq_(OFPBRC_BAD_TABLE_ID, 9)
539 eq_(OFPBRC_IS_SLAVE, 10)
540 eq_(OFPBRC_BAD_PORT, 11)
541 eq_(OFPBRC_BAD_PACKET, 12)
543 def test_enum_ofp_bad_action_code(self):
544 eq_(OFPBAC_BAD_TYPE, 0)
545 eq_(OFPBAC_BAD_LEN, 1)
546 eq_(OFPBAC_BAD_EXPERIMENTER, 2)
547 eq_(OFPBAC_BAD_EXP_TYPE, 3)
548 eq_(OFPBAC_BAD_OUT_PORT, 4)
549 eq_(OFPBAC_BAD_ARGUMENT, 5)
551 eq_(OFPBAC_TOO_MANY, 7)
552 eq_(OFPBAC_BAD_QUEUE, 8)
553 eq_(OFPBAC_BAD_OUT_GROUP, 9)
554 eq_(OFPBAC_MATCH_INCONSISTENT, 10)
555 eq_(OFPBAC_UNSUPPORTED_ORDER, 11)
556 eq_(OFPBAC_BAD_TAG, 12)
557 eq_(OFPBAC_BAD_SET_TYPE, 13)
558 eq_(OFPBAC_BAD_SET_LEN, 14)
559 eq_(OFPBAC_BAD_SET_ARGUMENT, 15)
561 def test_enum_ofp_bad_instruction_code(self):
562 eq_(OFPBIC_UNKNOWN_INST, 0)
563 eq_(OFPBIC_UNSUP_INST, 1)
564 eq_(OFPBIC_BAD_TABLE_ID, 2)
565 eq_(OFPBIC_UNSUP_METADATA, 3)
566 eq_(OFPBIC_UNSUP_METADATA_MASK, 4)
567 eq_(OFPBIC_BAD_EXPERIMENTER, 5)
568 eq_(OFPBIC_BAD_EXP_TYPE, 6)
569 eq_(OFPBIC_BAD_LEN, 7)
572 def test_enum_ofp_bad_match_code(self):
573 eq_(OFPBMC_BAD_TYPE, 0)
574 eq_(OFPBMC_BAD_LEN, 1)
575 eq_(OFPBMC_BAD_TAG, 2)
576 eq_(OFPBMC_BAD_DL_ADDR_MASK, 3)
577 eq_(OFPBMC_BAD_NW_ADDR_MASK, 4)
578 eq_(OFPBMC_BAD_WILDCARDS, 5)
579 eq_(OFPBMC_BAD_FIELD, 6)
580 eq_(OFPBMC_BAD_VALUE, 7)
581 eq_(OFPBMC_BAD_MASK, 8)
582 eq_(OFPBMC_BAD_PREREQ, 9)
583 eq_(OFPBMC_DUP_FIELD, 10)
584 eq_(OFPBMC_EPERM, 11)
586 def test_enum_ofp_flow_mod_failed_code(self):
587 eq_(OFPFMFC_UNKNOWN, 0)
588 eq_(OFPFMFC_TABLE_FULL, 1)
589 eq_(OFPFMFC_BAD_TABLE_ID, 2)
590 eq_(OFPFMFC_OVERLAP, 3)
591 eq_(OFPFMFC_EPERM, 4)
592 eq_(OFPFMFC_BAD_TIMEOUT, 5)
593 eq_(OFPFMFC_BAD_COMMAND, 6)
594 eq_(OFPFMFC_BAD_FLAGS, 7)
596 def test_enum_ofp_group_mod_failed_code(self):
597 eq_(OFPGMFC_GROUP_EXISTS, 0)
598 eq_(OFPGMFC_INVALID_GROUP, 1)
599 eq_(OFPGMFC_WEIGHT_UNSUPPORTED, 2)
600 eq_(OFPGMFC_OUT_OF_GROUPS, 3)
601 eq_(OFPGMFC_OUT_OF_BUCKETS, 4)
602 eq_(OFPGMFC_CHAINING_UNSUPPORTED, 5)
603 eq_(OFPGMFC_WATCH_UNSUPPORTED, 6)
605 eq_(OFPGMFC_UNKNOWN_GROUP, 8)
606 eq_(OFPGMFC_CHAINED_GROUP, 9)
607 eq_(OFPGMFC_BAD_TYPE, 10)
608 eq_(OFPGMFC_BAD_COMMAND, 11)
609 eq_(OFPGMFC_BAD_BUCKET, 12)
610 eq_(OFPGMFC_BAD_WATCH, 13)
611 eq_(OFPGMFC_EPERM, 14)
613 def test_enum_ofp_port_mod_failed_code(self):
614 eq_(OFPPMFC_BAD_PORT, 0)
615 eq_(OFPPMFC_BAD_HW_ADDR, 1)
616 eq_(OFPPMFC_BAD_CONFIG, 2)
617 eq_(OFPPMFC_BAD_ADVERTISE, 3)
618 eq_(OFPPMFC_EPERM, 4)
620 def test_enum_ofp_table_mod_failed_code(self):
621 eq_(OFPTMFC_BAD_TABLE, 0)
622 eq_(OFPTMFC_BAD_CONFIG, 1)
623 eq_(OFPTMFC_EPERM, 2)
625 def test_enum_ofp_queue_op_failed_code(self):
626 eq_(OFPQOFC_BAD_PORT, 0)
627 eq_(OFPQOFC_BAD_QUEUE, 1)
628 eq_(OFPQOFC_EPERM, 2)
630 def test_enum_ofp_switch_config_failed_code(self):
631 eq_(OFPSCFC_BAD_FLAGS, 0)
632 eq_(OFPSCFC_BAD_LEN, 1)
633 eq_(OFPSCFC_EPERM, 2)
635 def test_enum_ofp_role_request_failed_code(self):
636 eq_(OFPRRFC_STALE, 0)
637 eq_(OFPRRFC_UNSUP, 1)
638 eq_(OFPRRFC_BAD_ROLE, 2)
640 def test_struct_ofp_error_experimenter_msg(self):
641 eq_(OFP_ERROR_EXPERIMENTER_MSG_PACK_STR, '!HHI')
642 eq_(OFP_ERROR_EXPERIMENTER_MSG_SIZE, 16)
644 def test_struct_ofp_experimenter_header(self):
645 eq_(OFP_EXPERIMENTER_HEADER_PACK_STR, '!II')
646 eq_(OFP_EXPERIMENTER_HEADER_SIZE, 16)
648 # OXM is interpreted as a 32-bit word in network byte order.
649 # - oxm_class 17-bit to 32-bit (OFPXMC_*).
650 # - oxm_field 10-bit to 16-bit (OFPXMT_OFB_*).
651 # - oxm_hasmask 9-bit (Set if OXM include a bitmask).
652 # - oxm_length 1-bit to 8-bit (Lenght of OXM payload).
653 def _test_OXM(self, value, class_, field, hasmask, length):
654 virfy = (class_ << 16) | (field << 9) | (hasmask << 8) | length
658 def _test_OXM_basic(self, value, field, hasmask, length):
659 self._test_OXM(value, OFPXMC_OPENFLOW_BASIC, field, hasmask, length)
661 def test_OXM_basic(self):
662 self._test_OXM_basic(OXM_OF_IN_PORT, OFPXMT_OFB_IN_PORT, 0, 4)
663 self._test_OXM_basic(OXM_OF_IN_PHY_PORT, OFPXMT_OFB_IN_PHY_PORT, 0, 4)
664 self._test_OXM_basic(OXM_OF_METADATA, OFPXMT_OFB_METADATA, 0, 8)
665 self._test_OXM_basic(OXM_OF_METADATA_W, OFPXMT_OFB_METADATA, 1, 16)
666 self._test_OXM_basic(OXM_OF_ETH_DST, OFPXMT_OFB_ETH_DST, 0, 6)
667 self._test_OXM_basic(OXM_OF_ETH_DST_W, OFPXMT_OFB_ETH_DST, 1, 12)
668 self._test_OXM_basic(OXM_OF_ETH_SRC, OFPXMT_OFB_ETH_SRC, 0, 6)
669 self._test_OXM_basic(OXM_OF_ETH_SRC_W, OFPXMT_OFB_ETH_SRC, 1, 12)
670 self._test_OXM_basic(OXM_OF_ETH_TYPE, OFPXMT_OFB_ETH_TYPE, 0, 2)
671 self._test_OXM_basic(OXM_OF_VLAN_VID, OFPXMT_OFB_VLAN_VID, 0, 2)
672 self._test_OXM_basic(OXM_OF_VLAN_VID_W, OFPXMT_OFB_VLAN_VID, 1, 4)
673 self._test_OXM_basic(OXM_OF_VLAN_PCP, OFPXMT_OFB_VLAN_PCP, 0, 1)
674 self._test_OXM_basic(OXM_OF_IP_DSCP, OFPXMT_OFB_IP_DSCP, 0, 1)
675 self._test_OXM_basic(OXM_OF_IP_ECN, OFPXMT_OFB_IP_ECN, 0, 1)
676 self._test_OXM_basic(OXM_OF_IP_PROTO, OFPXMT_OFB_IP_PROTO, 0, 1)
677 self._test_OXM_basic(OXM_OF_IPV4_SRC, OFPXMT_OFB_IPV4_SRC, 0, 4)
678 self._test_OXM_basic(OXM_OF_IPV4_SRC_W, OFPXMT_OFB_IPV4_SRC, 1, 8)
679 self._test_OXM_basic(OXM_OF_IPV4_DST, OFPXMT_OFB_IPV4_DST, 0, 4)
680 self._test_OXM_basic(OXM_OF_IPV4_DST_W, OFPXMT_OFB_IPV4_DST, 1, 8)
681 self._test_OXM_basic(OXM_OF_TCP_SRC, OFPXMT_OFB_TCP_SRC, 0, 2)
682 self._test_OXM_basic(OXM_OF_TCP_DST, OFPXMT_OFB_TCP_DST, 0, 2)
683 self._test_OXM_basic(OXM_OF_UDP_SRC, OFPXMT_OFB_UDP_SRC, 0, 2)
684 self._test_OXM_basic(OXM_OF_UDP_DST, OFPXMT_OFB_UDP_DST, 0, 2)
685 self._test_OXM_basic(OXM_OF_SCTP_SRC, OFPXMT_OFB_SCTP_SRC, 0, 2)
686 self._test_OXM_basic(OXM_OF_SCTP_DST, OFPXMT_OFB_SCTP_DST, 0, 2)
687 self._test_OXM_basic(OXM_OF_ICMPV4_TYPE, OFPXMT_OFB_ICMPV4_TYPE, 0, 1)
688 self._test_OXM_basic(OXM_OF_ICMPV4_CODE, OFPXMT_OFB_ICMPV4_CODE, 0, 1)
689 self._test_OXM_basic(OXM_OF_ARP_OP, OFPXMT_OFB_ARP_OP, 0, 2)
690 self._test_OXM_basic(OXM_OF_ARP_SPA, OFPXMT_OFB_ARP_SPA, 0, 4)
691 self._test_OXM_basic(OXM_OF_ARP_SPA_W, OFPXMT_OFB_ARP_SPA, 1, 8)
692 self._test_OXM_basic(OXM_OF_ARP_TPA, OFPXMT_OFB_ARP_TPA, 0, 4)
693 self._test_OXM_basic(OXM_OF_ARP_TPA_W, OFPXMT_OFB_ARP_TPA, 1, 8)
694 self._test_OXM_basic(OXM_OF_ARP_SHA, OFPXMT_OFB_ARP_SHA, 0, 6)
695 self._test_OXM_basic(OXM_OF_ARP_SHA_W, OFPXMT_OFB_ARP_SHA, 1, 12)
696 self._test_OXM_basic(OXM_OF_ARP_THA, OFPXMT_OFB_ARP_THA, 0, 6)
697 self._test_OXM_basic(OXM_OF_ARP_THA_W, OFPXMT_OFB_ARP_THA, 1, 12)
698 self._test_OXM_basic(OXM_OF_IPV6_SRC, OFPXMT_OFB_IPV6_SRC, 0, 16)
699 self._test_OXM_basic(OXM_OF_IPV6_SRC_W, OFPXMT_OFB_IPV6_SRC, 1, 32)
700 self._test_OXM_basic(OXM_OF_IPV6_DST, OFPXMT_OFB_IPV6_DST, 0, 16)
701 self._test_OXM_basic(OXM_OF_IPV6_DST_W, OFPXMT_OFB_IPV6_DST, 1, 32)
702 self._test_OXM_basic(OXM_OF_IPV6_FLABEL, OFPXMT_OFB_IPV6_FLABEL, 0, 4)
703 self._test_OXM_basic(OXM_OF_IPV6_FLABEL_W,
704 OFPXMT_OFB_IPV6_FLABEL, 1, 8)
705 self._test_OXM_basic(OXM_OF_ICMPV6_TYPE, OFPXMT_OFB_ICMPV6_TYPE, 0, 1)
706 self._test_OXM_basic(OXM_OF_ICMPV6_CODE, OFPXMT_OFB_ICMPV6_CODE, 0, 1)
707 self._test_OXM_basic(OXM_OF_IPV6_ND_TARGET,
708 OFPXMT_OFB_IPV6_ND_TARGET, 0, 16)
709 self._test_OXM_basic(OXM_OF_IPV6_ND_SLL, OFPXMT_OFB_IPV6_ND_SLL, 0, 6)
710 self._test_OXM_basic(OXM_OF_IPV6_ND_TLL, OFPXMT_OFB_IPV6_ND_TLL, 0, 6)
711 self._test_OXM_basic(OXM_OF_MPLS_LABEL, OFPXMT_OFB_MPLS_LABEL, 0, 4)
712 self._test_OXM_basic(OXM_OF_MPLS_TC, OFPXMT_OFB_MPLS_TC, 0, 1)
714 def test_define_constants(self):
715 eq_(OFP_VERSION, 0x03)
716 eq_(OFP_TCP_PORT, 6633)
717 eq_(MAX_XID, 0xffffffff)