diff options
author | FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> | 2012-01-30 14:36:53 +0900 |
---|---|---|
committer | FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> | 2012-01-31 04:02:17 +0900 |
commit | 774088c3064604482e0d080f1bee2557ea705836 (patch) | |
tree | b9b0c24e45146c17fb3b146448eec4d59d0986f0 | |
parent | 104436157a7e161d6090054da892519170777192 (diff) |
move _pack_into and _str_attr to ofproto_parser.py
This moves _pack_into and _str_attr helper functions to
ofproto_parser.py from ofproto_parser_v1_0.py in order to enable OF
1.2 version parser to use them.
They are renamed to msg_pack_into and msg_str_attr respectively.
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
-rw-r--r-- | ryu/ofproto/ofproto_parser.py | 22 | ||||
-rw-r--r-- | ryu/ofproto/ofproto_v1_0_parser.py | 78 |
2 files changed, 49 insertions, 51 deletions
diff --git a/ryu/ofproto/ofproto_parser.py b/ryu/ofproto/ofproto_parser.py index 96c732bc..359b6c35 100644 --- a/ryu/ofproto/ofproto_parser.py +++ b/ryu/ofproto/ofproto_parser.py @@ -117,3 +117,25 @@ class MsgBase(object): self._serialize_body() self._serialize_header() + +def msg_pack_into(fmt, buf, offset, *args): + if len(buf) < offset: + buf += bytearray().zfill(offset - len(buf)) + + if len(buf) == offset: + buf += struct.pack(fmt, *args) + return + + needed_len = offset + struct.calcsize(fmt) + if len(buf) < needed_len: + buf += bytearray().zfill(needed_len - len(buf)) + + struct.pack_into(fmt, buf, offset, *args) + +def msg_str_attr(msg, buf, attr_list): + for attr in attr_list: + val = getattr(msg, attr, None) + if val is not None: + buf += ' %s %s' % (attr, val) + + return buf diff --git a/ryu/ofproto/ofproto_v1_0_parser.py b/ryu/ofproto/ofproto_v1_0_parser.py index 4d1e891b..6536e498 100644 --- a/ryu/ofproto/ofproto_v1_0_parser.py +++ b/ryu/ofproto/ofproto_v1_0_parser.py @@ -16,7 +16,7 @@ import collections import struct -from ofproto_parser import MsgBase +from ofproto_parser import MsgBase, msg_pack_into, msg_str_attr from ryu.lib import mac from . import ofproto_parser from . import ofproto_v1_0 @@ -71,30 +71,6 @@ def _set_msg_reply(msg_reply): return _set_cls_msg_reply -def _pack_into(fmt, buf, offset, *args): - if len(buf) < offset: - buf += bytearray().zfill(offset - len(buf)) - - if len(buf) == offset: - buf += struct.pack(fmt, *args) - return - - needed_len = offset + struct.calcsize(fmt) - if len(buf) < needed_len: - buf += bytearray().zfill(needed_len - len(buf)) - - struct.pack_into(fmt, buf, offset, *args) - - -def _str_attr(msg, buf, attr_list): - for attr in attr_list: - val = getattr(msg, attr, None) - if val is not None: - buf += ' %s %s' % (attr, val) - - return buf - - # # common structures # @@ -128,7 +104,7 @@ class OFPMatch(collections.namedtuple('OFPMatchBase', ( return super(cls, OFPMatch).__new__(cls, *tmp) def serialize(self, buf, offset): - _pack_into(ofproto_v1_0.OFP_MATCH_PACK_STR, buf, offset, *self) + msg_pack_into(ofproto_v1_0.OFP_MATCH_PACK_STR, buf, offset, *self) @classmethod def parse(cls, buf, offset): @@ -143,8 +119,8 @@ class OFPActionHeader(object): self.len = len_ def serlize(self, buf, offset): - _pack_into(ofproto_v1_0.OFP_ACTION_HEADER_PACK_STR, - buf, offset, self.type, self.len) + msg_pack_into(ofproto_v1_0.OFP_ACTION_HEADER_PACK_STR, + buf, offset, self.type, self.len) class OFPAction(OFPActionHeader): @@ -189,8 +165,8 @@ class OFPActionOutput(OFPAction): return cls(port, max_len) def serialize(self, buf, offset): - _pack_into(ofproto_v1_0.OFP_ACTION_OUTPUT_PACK_STR, - buf, offset, self.type, self.len, self.port, self.max_len) + msg_pack_into(ofproto_v1_0.OFP_ACTION_OUTPUT_PACK_STR, + buf, offset, self.type, self.len, self.port, self.max_len) @OFPAction.register_action_type(ofproto_v1_0.OFPAT_SET_VLAN_VID, @@ -600,8 +576,8 @@ class OFPErrorMsg(MsgBase): def _serialize_body(self): assert self.data is not None - _pack_into(ofproto_v1_0.OFP_ERROR_MSG_PACK_STR, self.buf, - ofproto_v1_0.OFP_HEADER_SIZE, self.type, self.code) + msg_pack_into(ofproto_v1_0.OFP_ERROR_MSG_PACK_STR, self.buf, + ofproto_v1_0.OFP_HEADER_SIZE, self.type, self.code) self.buf += self.data @@ -663,8 +639,8 @@ class OFPVendor(MsgBase): def _serialize_body(self): assert self.data is not None - _pack_into(ofproto_v1_0.OFP_VENDOR_HEADER_PACK_STR, - self.buf, ofproto_v1_0.OFP_HEADER_SIZE, self.vendor) + msg_pack_into(ofproto_v1_0.OFP_VENDOR_HEADER_PACK_STR, + self.buf, ofproto_v1_0.OFP_HEADER_SIZE, self.vendor) self.buf += self.data @@ -737,8 +713,8 @@ class OFPPacketIn(MsgBase): def __str__(self): buf = super(OFPPacketIn, self).__str__() - return _str_attr(self, buf, - ('buffer_id', 'total_len', 'in_port', 'reason')) + return msg_str_attr(self, buf, + ('buffer_id', 'total_len', 'in_port', 'reason')) @classmethod def parser(cls, datapath, version, msg_type, msg_len, xid, buf): @@ -785,10 +761,10 @@ class OFPFlowRemoved(MsgBase): def __str__(self): buf = super(OFPFlowRemoved, self).__str__() - return _str_attr(self, buf, - ('match', 'cookie', 'priority', 'reason', - 'duration_sec', 'duration_nsec', - 'idle_timeout', 'packet_count', 'idle_count')) + return msg_str_attr(self, buf, + ('match', 'cookie', 'priority', 'reason', + 'duration_sec', 'duration_nsec', + 'idle_timeout', 'packet_count', 'idle_count')) @classmethod def parser(cls, datapath, version, msg_type, msg_len, xid, buf): @@ -992,9 +968,9 @@ class OFPSetConfig(MsgBase): def _serialize_body(self): assert self.flags is not None assert self.miss_send_len is not None - _pack_into(ofproto_v1_0.OFP_SWITCH_CONFIG_PACK_STR, - self.buf, ofproto_v1_0.OFP_HEADER_SIZE, - self.flags, self.miss_send_len) + msg_pack_into(ofproto_v1_0.OFP_SWITCH_CONFIG_PACK_STR, + self.buf, ofproto_v1_0.OFP_HEADER_SIZE, + self.flags, self.miss_send_len) @_set_msg_type(ofproto_v1_0.OFPT_PACKET_OUT) @@ -1025,9 +1001,9 @@ class OFPPacketOut(MsgBase): assert self.buffer_id == -1 self.buf += self.data - _pack_into(ofproto_v1_0.OFP_PACKET_OUT_PACK_STR, - self.buf, ofproto_v1_0.OFP_HEADER_SIZE, - self.buffer_id, self.in_port, self.actions_len) + msg_pack_into(ofproto_v1_0.OFP_PACKET_OUT_PACK_STR, + self.buf, ofproto_v1_0.OFP_HEADER_SIZE, + self.buffer_id, self.in_port, self.actions_len) @_set_msg_type(ofproto_v1_0.OFPT_FLOW_MOD) @@ -1053,11 +1029,11 @@ class OFPFlowMod(MsgBase): self.match.serialize(self.buf, offset) offset += ofproto_v1_0.OFP_MATCH_SIZE - _pack_into(ofproto_v1_0.OFP_FLOW_MOD_PACK_STR0, self.buf, offset, - self.cookie, self.command, - self.idle_timeout, self.hard_timeout, - self.priority, self.buffer_id, self.out_port, - self.flags) + msg_pack_into(ofproto_v1_0.OFP_FLOW_MOD_PACK_STR0, self.buf, offset, + self.cookie, self.command, + self.idle_timeout, self.hard_timeout, + self.priority, self.buffer_id, self.out_port, + self.flags) offset = ofproto_v1_0.OFP_FLOW_MOD_SIZE if self.actions is not None: |