Skip to content
This repository was archived by the owner on Apr 22, 2024. It is now read-only.

Commit af7918e

Browse files
committed
Merge branch 'master' into binarydata
2 parents 229c241 + d0071fd commit af7918e

3 files changed

Lines changed: 34 additions & 22 deletions

File tree

CHANGELOG.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ Removed
2121

2222
Fixed
2323
=====
24+
- [v0x01] Fixed method to unpack error messages.
2425

2526
Security
2627
========

pyof/v0x01/asynchronous/error_msg.py

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
from pyof.foundation.basic_types import BinaryData, UBInt16
88
from pyof.foundation.exceptions import PackException
99
# Do not import new_message_from_header directly to avoid cyclic import.
10-
from pyof.v0x01 import common
1110
from pyof.v0x01.common.header import Header, Type
1211

1312
__all__ = ('ErrorMsg', 'ErrorType', 'BadActionCode', 'BadRequestCode',
@@ -37,6 +36,20 @@ class ErrorType(IntEnum):
3736
#: Problem in modifying Queue entry
3837
OFPET_QUEUE_OP_FAILED = 5
3938

39+
def get_class(self):
40+
"""Method used to return a Code class based on current ErrorType value.
41+
42+
Returns:
43+
error_code_class (IntEnum): class referenced by current error type.
44+
"""
45+
classes = {'OFPET_HELLO_FAILED': HelloFailedCode,
46+
'OFPET_BAD_REQUEST': BadRequestCode,
47+
'OFPET_BAD_ACTION': BadActionCode,
48+
'OFPET_FLOW_MOD_FAILED': FlowModFailedCode,
49+
'OFPET_PORT_MOD_FAILED': PortModFailedCode,
50+
'OFPET_QUEUE_OP_FAILED': QueueOpFailedCode}
51+
return classes[self.name]
52+
4053

4154
class HelloFailedCode(IntEnum):
4255
"""Error_msg 'code' values for OFPET_HELLO_FAILED.
@@ -206,20 +219,5 @@ def pack(self, value=None):
206219
def unpack(self, buff, offset=0):
207220
"""Unpack binary data into python object."""
208221
super().unpack(buff, offset)
209-
self.data = self._unpack_data()
210-
211-
def _unpack_data(self):
212-
if self.data == b'':
213-
return BinaryData()
214-
# header unpacking
215-
header = Header()
216-
header_size = header.get_size()
217-
header_data = self.data.value[:header_size]
218-
header.unpack(header_data)
219-
220-
# message unpacking
221-
msg = common.utils.new_message_from_header(header)
222-
msg_data = self.data.value[header_size:]
223-
msg.unpack(msg_data)
224-
225-
return msg
222+
CodeClass = ErrorType(self.error_type).get_class()
223+
self.code = CodeClass(self.code)
Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
"""Testing Error Message."""
2-
from pyof.foundation.basic_types import BinaryData
32
from pyof.v0x01.asynchronous.error_msg import (
4-
BadRequestCode, ErrorMsg, ErrorType)
3+
BadRequestCode, ErrorMsg, ErrorType, FlowModFailedCode)
54
from tests.test_struct import TestStruct
65

76

@@ -12,9 +11,23 @@ class TestErrorMessage(TestStruct):
1211
def setUpClass(cls):
1312
"""Setup TestStruct."""
1413
super().setUpClass()
15-
super().set_raw_dump_file('v0x01', 'ofpt_error_message')
14+
super().set_raw_dump_file('v0x01', 'ofpt_error_msg')
1615
super().set_raw_dump_object(ErrorMsg, xid=12,
1716
error_type=ErrorType.OFPET_BAD_REQUEST,
1817
code=BadRequestCode.OFPBRC_BAD_STAT,
19-
data=BinaryData(b'object_test'))
18+
data=b'')
2019
super().set_minimum_size(12)
20+
21+
def test_unpack_error_msg(self):
22+
"""Test Unpack a sample ErrorMsg."""
23+
expected = b'\x01\x01\x00\x1b\x00\x00\x00\x18\x00\x03\x00\x02FLOW'
24+
25+
error_msg = ErrorMsg(xid=24,
26+
error_type=ErrorType.OFPET_FLOW_MOD_FAILED,
27+
code=FlowModFailedCode.OFPFMFC_EPERM,
28+
data=b'FLOW')
29+
30+
actual = ErrorMsg(xid=24)
31+
actual.unpack(expected[8:])
32+
33+
self.assertEqual(actual, error_msg)

0 commit comments

Comments
 (0)