Move msg_pack_into from ofproto to lib
A motivation of this change is a better modularity. I.e. Make packet lib independent from ofproto. Signed-off-by: YAMAMOTO Takashi <yamamoto@valinux.co.jp> Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
This commit is contained in:
parent
bbecb6ca56
commit
72a06f6f60
32
ryu/lib/pack_utils.py
Normal file
32
ryu/lib/pack_utils.py
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
# Copyright (C) 2011, 2012 Nippon Telegraph and Telephone Corporation.
|
||||||
|
# Copyright (C) 2011 Isaku Yamahata <yamahata at valinux co jp>
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
# implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
|
||||||
|
import struct
|
||||||
|
|
||||||
|
|
||||||
|
def msg_pack_into(fmt, buf, offset, *args):
|
||||||
|
if len(buf) < offset:
|
||||||
|
buf += bytearray(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(needed_len - len(buf))
|
||||||
|
|
||||||
|
struct.pack_into(fmt, buf, offset, *args)
|
@ -29,13 +29,13 @@ import copy
|
|||||||
import netaddr
|
import netaddr
|
||||||
import numbers
|
import numbers
|
||||||
|
|
||||||
from ryu.ofproto.ofproto_parser import msg_pack_into
|
|
||||||
from ryu.lib.stringify import StringifyMixin
|
from ryu.lib.stringify import StringifyMixin
|
||||||
from ryu.lib.packet import afi as addr_family
|
from ryu.lib.packet import afi as addr_family
|
||||||
from ryu.lib.packet import safi as subaddr_family
|
from ryu.lib.packet import safi as subaddr_family
|
||||||
from ryu.lib.packet import packet_base
|
from ryu.lib.packet import packet_base
|
||||||
from ryu.lib.packet import stream_parser
|
from ryu.lib.packet import stream_parser
|
||||||
from ryu.lib import addrconv
|
from ryu.lib import addrconv
|
||||||
|
from ryu.lib.pack_utils import msg_pack_into
|
||||||
|
|
||||||
BGP_MSG_OPEN = 1
|
BGP_MSG_OPEN = 1
|
||||||
BGP_MSG_UPDATE = 2
|
BGP_MSG_UPDATE = 2
|
||||||
|
@ -20,7 +20,7 @@ from ryu import utils
|
|||||||
from ryu.lib import type_desc
|
from ryu.lib import type_desc
|
||||||
from ryu.ofproto import nicira_ext
|
from ryu.ofproto import nicira_ext
|
||||||
from ryu.ofproto import ofproto_common
|
from ryu.ofproto import ofproto_common
|
||||||
from ryu.ofproto.ofproto_parser import msg_pack_into
|
from ryu.lib.pack_utils import msg_pack_into
|
||||||
from ryu.ofproto.ofproto_parser import StringifyMixin
|
from ryu.ofproto.ofproto_parser import StringifyMixin
|
||||||
|
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ import itertools
|
|||||||
|
|
||||||
from ryu import exception
|
from ryu import exception
|
||||||
from ryu.lib import mac
|
from ryu.lib import mac
|
||||||
from . import ofproto_parser
|
from ryu.lib.pack_utils import msg_pack_into
|
||||||
from . import ofproto_v1_0
|
from . import ofproto_v1_0
|
||||||
from . import inet
|
from . import inet
|
||||||
|
|
||||||
@ -440,7 +440,7 @@ class MFField(object):
|
|||||||
return cls(header, value, mask)
|
return cls(header, value, mask)
|
||||||
|
|
||||||
def _put(self, buf, offset, value):
|
def _put(self, buf, offset, value):
|
||||||
ofproto_parser.msg_pack_into(self.pack_str, buf, offset, value)
|
msg_pack_into(self.pack_str, buf, offset, value)
|
||||||
return self.n_bytes
|
return self.n_bytes
|
||||||
|
|
||||||
def putw(self, buf, offset, value, mask):
|
def putw(self, buf, offset, value, mask):
|
||||||
@ -459,8 +459,7 @@ class MFField(object):
|
|||||||
return self.putw(buf, offset, value, mask)
|
return self.putw(buf, offset, value, mask)
|
||||||
|
|
||||||
def _putv6(self, buf, offset, value):
|
def _putv6(self, buf, offset, value):
|
||||||
ofproto_parser.msg_pack_into(self.pack_str, buf, offset,
|
msg_pack_into(self.pack_str, buf, offset, *value)
|
||||||
*value)
|
|
||||||
return self.n_bytes
|
return self.n_bytes
|
||||||
|
|
||||||
def putv6(self, buf, offset, value, mask):
|
def putv6(self, buf, offset, value, mask):
|
||||||
@ -1092,7 +1091,7 @@ def serialize_nxm_match(rule, buf, offset):
|
|||||||
|
|
||||||
# Pad
|
# Pad
|
||||||
pad_len = round_up(offset) - offset
|
pad_len = round_up(offset) - offset
|
||||||
ofproto_parser.msg_pack_into("%dx" % pad_len, buf, offset)
|
msg_pack_into("%dx" % pad_len, buf, offset)
|
||||||
|
|
||||||
# The returned length, the match_len, does not include the pad
|
# The returned length, the match_len, does not include the pad
|
||||||
return offset - old_offset
|
return offset - old_offset
|
||||||
@ -1146,6 +1145,6 @@ class NXMatch(object):
|
|||||||
self.hasmask(), self.length()))
|
self.hasmask(), self.length()))
|
||||||
|
|
||||||
def put_header(self, buf, offset):
|
def put_header(self, buf, offset):
|
||||||
ofproto_parser.msg_pack_into(ofproto_v1_0.NXM_HEADER_PACK_STRING,
|
msg_pack_into(ofproto_v1_0.NXM_HEADER_PACK_STRING,
|
||||||
buf, offset, self.header)
|
buf, offset, self.header)
|
||||||
return struct.calcsize(ofproto_v1_0.NXM_HEADER_PACK_STRING)
|
return struct.calcsize(ofproto_v1_0.NXM_HEADER_PACK_STRING)
|
||||||
|
@ -212,21 +212,6 @@ class MsgInMsgBase(MsgBase):
|
|||||||
**additional_args)
|
**additional_args)
|
||||||
|
|
||||||
|
|
||||||
def msg_pack_into(fmt, buf, offset, *args):
|
|
||||||
if len(buf) < offset:
|
|
||||||
buf += bytearray(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(needed_len - len(buf))
|
|
||||||
|
|
||||||
struct.pack_into(fmt, buf, offset, *args)
|
|
||||||
|
|
||||||
|
|
||||||
def namedtuple(typename, fields, **kwargs):
|
def namedtuple(typename, fields, **kwargs):
|
||||||
class _namedtuple(StringifyMixin,
|
class _namedtuple(StringifyMixin,
|
||||||
collections.namedtuple(typename, fields, **kwargs)):
|
collections.namedtuple(typename, fields, **kwargs)):
|
||||||
|
@ -21,9 +21,10 @@ Decoder/Encoder implementations of OpenFlow 1.0.
|
|||||||
import struct
|
import struct
|
||||||
import binascii
|
import binascii
|
||||||
|
|
||||||
from ofproto_parser import StringifyMixin, MsgBase, msg_pack_into, msg_str_attr
|
from ofproto_parser import StringifyMixin, MsgBase, msg_str_attr
|
||||||
from ryu.lib import addrconv
|
from ryu.lib import addrconv
|
||||||
from ryu.lib import mac
|
from ryu.lib import mac
|
||||||
|
from ryu.lib.pack_utils import msg_pack_into
|
||||||
from . import ofproto_common
|
from . import ofproto_common
|
||||||
from . import ofproto_parser
|
from . import ofproto_parser
|
||||||
from . import ofproto_v1_0 as ofproto
|
from . import ofproto_v1_0 as ofproto
|
||||||
|
@ -23,8 +23,9 @@ import itertools
|
|||||||
|
|
||||||
from ryu.lib import addrconv
|
from ryu.lib import addrconv
|
||||||
from ryu.lib import mac
|
from ryu.lib import mac
|
||||||
|
from ryu.lib.pack_utils import msg_pack_into
|
||||||
from ryu import utils
|
from ryu import utils
|
||||||
from ofproto_parser import StringifyMixin, MsgBase, msg_pack_into, msg_str_attr
|
from ofproto_parser import StringifyMixin, MsgBase, msg_str_attr
|
||||||
from . import ether
|
from . import ether
|
||||||
from . import ofproto_parser
|
from . import ofproto_parser
|
||||||
from . import ofproto_v1_2 as ofproto
|
from . import ofproto_v1_2 as ofproto
|
||||||
@ -1082,7 +1083,7 @@ class OFPInstructionActions(OFPInstruction):
|
|||||||
|
|
||||||
self.len = action_offset - offset
|
self.len = action_offset - offset
|
||||||
pad_len = utils.round_up(self.len, 8) - self.len
|
pad_len = utils.round_up(self.len, 8) - self.len
|
||||||
ofproto_parser.msg_pack_into("%dx" % pad_len, buf, action_offset)
|
msg_pack_into("%dx" % pad_len, buf, action_offset)
|
||||||
self.len += pad_len
|
self.len += pad_len
|
||||||
|
|
||||||
msg_pack_into(ofproto.OFP_INSTRUCTION_ACTIONS_PACK_STR,
|
msg_pack_into(ofproto.OFP_INSTRUCTION_ACTIONS_PACK_STR,
|
||||||
@ -1508,7 +1509,7 @@ class OFPActionSetField(OFPAction):
|
|||||||
self.len = utils.round_up(4 + len_, 8)
|
self.len = utils.round_up(4 + len_, 8)
|
||||||
msg_pack_into('!HH', buf, offset, self.type, self.len)
|
msg_pack_into('!HH', buf, offset, self.type, self.len)
|
||||||
pad_len = self.len - (4 + len_)
|
pad_len = self.len - (4 + len_)
|
||||||
ofproto_parser.msg_pack_into("%dx" % pad_len, buf, offset + 4 + len_)
|
msg_pack_into("%dx" % pad_len, buf, offset + 4 + len_)
|
||||||
|
|
||||||
# XXX old api compat
|
# XXX old api compat
|
||||||
def serialize_old(self, buf, offset):
|
def serialize_old(self, buf, offset):
|
||||||
@ -1519,7 +1520,7 @@ class OFPActionSetField(OFPAction):
|
|||||||
msg_pack_into('!HH', buf, offset, self.type, self.len)
|
msg_pack_into('!HH', buf, offset, self.type, self.len)
|
||||||
self.field.serialize(buf, offset + 4)
|
self.field.serialize(buf, offset + 4)
|
||||||
offset += len_
|
offset += len_
|
||||||
ofproto_parser.msg_pack_into("%dx" % pad_len, buf, offset)
|
msg_pack_into("%dx" % pad_len, buf, offset)
|
||||||
|
|
||||||
# XXX old api compat
|
# XXX old api compat
|
||||||
def _composed_with_old_api(self):
|
def _composed_with_old_api(self):
|
||||||
@ -3561,7 +3562,7 @@ class OFPMatch(StringifyMixin):
|
|||||||
self.length = length
|
self.length = length
|
||||||
|
|
||||||
pad_len = utils.round_up(length, 8) - length
|
pad_len = utils.round_up(length, 8) - length
|
||||||
ofproto_parser.msg_pack_into("%dx" % pad_len, buf, field_offset)
|
msg_pack_into("%dx" % pad_len, buf, field_offset)
|
||||||
|
|
||||||
return length + pad_len
|
return length + pad_len
|
||||||
|
|
||||||
@ -3766,7 +3767,7 @@ class OFPMatch(StringifyMixin):
|
|||||||
msg_pack_into('!HH', buf, offset, ofproto.OFPMT_OXM, length)
|
msg_pack_into('!HH', buf, offset, ofproto.OFPMT_OXM, length)
|
||||||
|
|
||||||
pad_len = utils.round_up(length, 8) - length
|
pad_len = utils.round_up(length, 8) - length
|
||||||
ofproto_parser.msg_pack_into("%dx" % pad_len, buf, field_offset)
|
msg_pack_into("%dx" % pad_len, buf, field_offset)
|
||||||
|
|
||||||
return length + pad_len
|
return length + pad_len
|
||||||
|
|
||||||
@ -4073,11 +4074,11 @@ class OFPMatchField(StringifyMixin):
|
|||||||
self.put(buf, offset, self.value)
|
self.put(buf, offset, self.value)
|
||||||
|
|
||||||
def _put_header(self, buf, offset):
|
def _put_header(self, buf, offset):
|
||||||
ofproto_parser.msg_pack_into('!I', buf, offset, self.header)
|
msg_pack_into('!I', buf, offset, self.header)
|
||||||
self.length = 4
|
self.length = 4
|
||||||
|
|
||||||
def _put(self, buf, offset, value):
|
def _put(self, buf, offset, value):
|
||||||
ofproto_parser.msg_pack_into(self.pack_str, buf, offset, value)
|
msg_pack_into(self.pack_str, buf, offset, value)
|
||||||
self.length += self.n_bytes
|
self.length += self.n_bytes
|
||||||
|
|
||||||
def put_w(self, buf, offset, value, mask):
|
def put_w(self, buf, offset, value, mask):
|
||||||
@ -4090,8 +4091,7 @@ class OFPMatchField(StringifyMixin):
|
|||||||
self._put(buf, offset + self.length, value)
|
self._put(buf, offset + self.length, value)
|
||||||
|
|
||||||
def _putv6(self, buf, offset, value):
|
def _putv6(self, buf, offset, value):
|
||||||
ofproto_parser.msg_pack_into(self.pack_str, buf, offset,
|
msg_pack_into(self.pack_str, buf, offset, *value)
|
||||||
*value)
|
|
||||||
self.length += self.n_bytes
|
self.length += self.n_bytes
|
||||||
|
|
||||||
def putv6(self, buf, offset, value, mask=None):
|
def putv6(self, buf, offset, value, mask=None):
|
||||||
|
@ -45,8 +45,9 @@ import itertools
|
|||||||
|
|
||||||
from ryu.lib import addrconv
|
from ryu.lib import addrconv
|
||||||
from ryu.lib import mac
|
from ryu.lib import mac
|
||||||
|
from ryu.lib.pack_utils import msg_pack_into
|
||||||
from ryu import utils
|
from ryu import utils
|
||||||
from ofproto_parser import StringifyMixin, MsgBase, msg_pack_into, msg_str_attr
|
from ofproto_parser import StringifyMixin, MsgBase, msg_str_attr
|
||||||
from . import ether
|
from . import ether
|
||||||
from . import nicira_ext
|
from . import nicira_ext
|
||||||
from . import ofproto_parser
|
from . import ofproto_parser
|
||||||
@ -998,7 +999,7 @@ class OFPMatch(StringifyMixin):
|
|||||||
self.length = length
|
self.length = length
|
||||||
|
|
||||||
pad_len = utils.round_up(length, 8) - length
|
pad_len = utils.round_up(length, 8) - length
|
||||||
ofproto_parser.msg_pack_into("%dx" % pad_len, buf, field_offset)
|
msg_pack_into("%dx" % pad_len, buf, field_offset)
|
||||||
|
|
||||||
return length + pad_len
|
return length + pad_len
|
||||||
|
|
||||||
@ -1231,7 +1232,7 @@ class OFPMatch(StringifyMixin):
|
|||||||
msg_pack_into('!HH', buf, offset, ofproto.OFPMT_OXM, length)
|
msg_pack_into('!HH', buf, offset, ofproto.OFPMT_OXM, length)
|
||||||
|
|
||||||
pad_len = utils.round_up(length, 8) - length
|
pad_len = utils.round_up(length, 8) - length
|
||||||
ofproto_parser.msg_pack_into("%dx" % pad_len, buf, field_offset)
|
msg_pack_into("%dx" % pad_len, buf, field_offset)
|
||||||
|
|
||||||
return length + pad_len
|
return length + pad_len
|
||||||
|
|
||||||
@ -1570,11 +1571,11 @@ class OFPMatchField(StringifyMixin):
|
|||||||
self.put(buf, offset, self.value)
|
self.put(buf, offset, self.value)
|
||||||
|
|
||||||
def _put_header(self, buf, offset):
|
def _put_header(self, buf, offset):
|
||||||
ofproto_parser.msg_pack_into('!I', buf, offset, self.header)
|
msg_pack_into('!I', buf, offset, self.header)
|
||||||
self.length = 4
|
self.length = 4
|
||||||
|
|
||||||
def _put(self, buf, offset, value):
|
def _put(self, buf, offset, value):
|
||||||
ofproto_parser.msg_pack_into(self.pack_str, buf, offset, value)
|
msg_pack_into(self.pack_str, buf, offset, value)
|
||||||
self.length += self.n_bytes
|
self.length += self.n_bytes
|
||||||
|
|
||||||
def put_w(self, buf, offset, value, mask):
|
def put_w(self, buf, offset, value, mask):
|
||||||
@ -1587,8 +1588,7 @@ class OFPMatchField(StringifyMixin):
|
|||||||
self._put(buf, offset + self.length, value)
|
self._put(buf, offset + self.length, value)
|
||||||
|
|
||||||
def _putv6(self, buf, offset, value):
|
def _putv6(self, buf, offset, value):
|
||||||
ofproto_parser.msg_pack_into(self.pack_str, buf, offset,
|
msg_pack_into(self.pack_str, buf, offset, *value)
|
||||||
*value)
|
|
||||||
self.length += self.n_bytes
|
self.length += self.n_bytes
|
||||||
|
|
||||||
def putv6(self, buf, offset, value, mask=None):
|
def putv6(self, buf, offset, value, mask=None):
|
||||||
@ -2038,10 +2038,10 @@ class MTPbbIsid(OFPMatchField):
|
|||||||
return cls(header, value, mask)
|
return cls(header, value, mask)
|
||||||
|
|
||||||
def _put(self, buf, offset, value):
|
def _put(self, buf, offset, value):
|
||||||
ofproto_parser.msg_pack_into(self.pack_str, buf, offset,
|
msg_pack_into(self.pack_str, buf, offset,
|
||||||
(value >> 16) & 0xff,
|
(value >> 16) & 0xff,
|
||||||
(value >> 8) & 0xff,
|
(value >> 8) & 0xff,
|
||||||
(value >> 0) & 0xff)
|
(value >> 0) & 0xff)
|
||||||
self.length += self.n_bytes
|
self.length += self.n_bytes
|
||||||
|
|
||||||
|
|
||||||
@ -2637,7 +2637,7 @@ class OFPInstructionActions(OFPInstruction):
|
|||||||
|
|
||||||
self.len = action_offset - offset
|
self.len = action_offset - offset
|
||||||
pad_len = utils.round_up(self.len, 8) - self.len
|
pad_len = utils.round_up(self.len, 8) - self.len
|
||||||
ofproto_parser.msg_pack_into("%dx" % pad_len, buf, action_offset)
|
msg_pack_into("%dx" % pad_len, buf, action_offset)
|
||||||
self.len += pad_len
|
self.len += pad_len
|
||||||
|
|
||||||
msg_pack_into(ofproto.OFP_INSTRUCTION_ACTIONS_PACK_STR,
|
msg_pack_into(ofproto.OFP_INSTRUCTION_ACTIONS_PACK_STR,
|
||||||
@ -3092,7 +3092,7 @@ class OFPActionSetField(OFPAction):
|
|||||||
self.len = utils.round_up(4 + len_, 8)
|
self.len = utils.round_up(4 + len_, 8)
|
||||||
msg_pack_into('!HH', buf, offset, self.type, self.len)
|
msg_pack_into('!HH', buf, offset, self.type, self.len)
|
||||||
pad_len = self.len - (4 + len_)
|
pad_len = self.len - (4 + len_)
|
||||||
ofproto_parser.msg_pack_into("%dx" % pad_len, buf, offset + 4 + len_)
|
msg_pack_into("%dx" % pad_len, buf, offset + 4 + len_)
|
||||||
|
|
||||||
# XXX old api compat
|
# XXX old api compat
|
||||||
def serialize_old(self, buf, offset):
|
def serialize_old(self, buf, offset):
|
||||||
@ -3103,7 +3103,7 @@ class OFPActionSetField(OFPAction):
|
|||||||
msg_pack_into('!HH', buf, offset, self.type, self.len)
|
msg_pack_into('!HH', buf, offset, self.type, self.len)
|
||||||
self.field.serialize(buf, offset + 4)
|
self.field.serialize(buf, offset + 4)
|
||||||
offset += len_
|
offset += len_
|
||||||
ofproto_parser.msg_pack_into("%dx" % pad_len, buf, offset)
|
msg_pack_into("%dx" % pad_len, buf, offset)
|
||||||
|
|
||||||
# XXX old api compat
|
# XXX old api compat
|
||||||
def _composed_with_old_api(self):
|
def _composed_with_old_api(self):
|
||||||
@ -5295,8 +5295,7 @@ class OFPTableFeaturePropExperimenter(OFPTableFeatureProp):
|
|||||||
|
|
||||||
# data
|
# data
|
||||||
if len(self.data):
|
if len(self.data):
|
||||||
ofproto_parser.msg_pack_into('!%dI' % len(self.data),
|
msg_pack_into('!%dI' % len(self.data), buf, len(buf), *self.data)
|
||||||
buf, len(buf), *self.data)
|
|
||||||
|
|
||||||
return buf
|
return buf
|
||||||
|
|
||||||
|
@ -23,9 +23,9 @@ import itertools
|
|||||||
|
|
||||||
from ryu.lib import addrconv
|
from ryu.lib import addrconv
|
||||||
from ryu.lib import mac
|
from ryu.lib import mac
|
||||||
|
from ryu.lib.pack_utils import msg_pack_into
|
||||||
from ryu import utils
|
from ryu import utils
|
||||||
from ofproto_parser import (StringifyMixin, MsgBase, MsgInMsgBase,
|
from ofproto_parser import StringifyMixin, MsgBase, MsgInMsgBase, msg_str_attr
|
||||||
msg_pack_into, msg_str_attr)
|
|
||||||
from . import ether
|
from . import ether
|
||||||
from . import ofproto_parser
|
from . import ofproto_parser
|
||||||
from . import ofproto_common
|
from . import ofproto_common
|
||||||
@ -769,7 +769,7 @@ class OFPMatch(StringifyMixin):
|
|||||||
self.length = length
|
self.length = length
|
||||||
|
|
||||||
pad_len = utils.round_up(length, 8) - length
|
pad_len = utils.round_up(length, 8) - length
|
||||||
ofproto_parser.msg_pack_into("%dx" % pad_len, buf, field_offset)
|
msg_pack_into("%dx" % pad_len, buf, field_offset)
|
||||||
|
|
||||||
return length + pad_len
|
return length + pad_len
|
||||||
|
|
||||||
@ -880,7 +880,7 @@ class OFPPropCommonExperimenter4ByteData(StringifyMixin):
|
|||||||
|
|
||||||
# Pad
|
# Pad
|
||||||
pad_len = utils.round_up(self.length, 8) - self.length
|
pad_len = utils.round_up(self.length, 8) - self.length
|
||||||
ofproto_parser.msg_pack_into("%dx" % pad_len, buf, len(buf))
|
msg_pack_into("%dx" % pad_len, buf, len(buf))
|
||||||
|
|
||||||
return buf
|
return buf
|
||||||
|
|
||||||
@ -1124,11 +1124,11 @@ class OFPMatchField(StringifyMixin):
|
|||||||
self.put(buf, offset, self.value)
|
self.put(buf, offset, self.value)
|
||||||
|
|
||||||
def _put_header(self, buf, offset):
|
def _put_header(self, buf, offset):
|
||||||
ofproto_parser.msg_pack_into('!I', buf, offset, self.header)
|
msg_pack_into('!I', buf, offset, self.header)
|
||||||
self.length = 4
|
self.length = 4
|
||||||
|
|
||||||
def _put(self, buf, offset, value):
|
def _put(self, buf, offset, value):
|
||||||
ofproto_parser.msg_pack_into(self.pack_str, buf, offset, value)
|
msg_pack_into(self.pack_str, buf, offset, value)
|
||||||
self.length += self.n_bytes
|
self.length += self.n_bytes
|
||||||
|
|
||||||
def put_w(self, buf, offset, value, mask):
|
def put_w(self, buf, offset, value, mask):
|
||||||
@ -1141,8 +1141,7 @@ class OFPMatchField(StringifyMixin):
|
|||||||
self._put(buf, offset + self.length, value)
|
self._put(buf, offset + self.length, value)
|
||||||
|
|
||||||
def _putv6(self, buf, offset, value):
|
def _putv6(self, buf, offset, value):
|
||||||
ofproto_parser.msg_pack_into(self.pack_str, buf, offset,
|
msg_pack_into(self.pack_str, buf, offset, *value)
|
||||||
*value)
|
|
||||||
self.length += self.n_bytes
|
self.length += self.n_bytes
|
||||||
|
|
||||||
def putv6(self, buf, offset, value, mask=None):
|
def putv6(self, buf, offset, value, mask=None):
|
||||||
@ -1596,10 +1595,10 @@ class MTPbbIsid(OFPMatchField):
|
|||||||
return cls(header, value, mask)
|
return cls(header, value, mask)
|
||||||
|
|
||||||
def _put(self, buf, offset, value):
|
def _put(self, buf, offset, value):
|
||||||
ofproto_parser.msg_pack_into(self.pack_str, buf, offset,
|
msg_pack_into(self.pack_str, buf, offset,
|
||||||
(value >> 16) & 0xff,
|
(value >> 16) & 0xff,
|
||||||
(value >> 8) & 0xff,
|
(value >> 8) & 0xff,
|
||||||
(value >> 0) & 0xff)
|
(value >> 0) & 0xff)
|
||||||
self.length += self.n_bytes
|
self.length += self.n_bytes
|
||||||
|
|
||||||
|
|
||||||
@ -2249,7 +2248,7 @@ class OFPTableFeatureProp(OFPPropBase):
|
|||||||
|
|
||||||
# Pad
|
# Pad
|
||||||
pad_len = utils.round_up(self.length, 8) - self.length
|
pad_len = utils.round_up(self.length, 8) - self.length
|
||||||
ofproto_parser.msg_pack_into("%dx" % pad_len, buf, len(buf))
|
msg_pack_into("%dx" % pad_len, buf, len(buf))
|
||||||
|
|
||||||
return buf
|
return buf
|
||||||
|
|
||||||
@ -4943,7 +4942,7 @@ class OFPInstructionActions(OFPInstruction):
|
|||||||
|
|
||||||
self.len = action_offset - offset
|
self.len = action_offset - offset
|
||||||
pad_len = utils.round_up(self.len, 8) - self.len
|
pad_len = utils.round_up(self.len, 8) - self.len
|
||||||
ofproto_parser.msg_pack_into("%dx" % pad_len, buf, action_offset)
|
msg_pack_into("%dx" % pad_len, buf, action_offset)
|
||||||
self.len += pad_len
|
self.len += pad_len
|
||||||
|
|
||||||
msg_pack_into(ofproto.OFP_INSTRUCTION_ACTIONS_PACK_STR,
|
msg_pack_into(ofproto.OFP_INSTRUCTION_ACTIONS_PACK_STR,
|
||||||
@ -5379,7 +5378,7 @@ class OFPActionSetField(OFPAction):
|
|||||||
self.len = utils.round_up(4 + len_, 8)
|
self.len = utils.round_up(4 + len_, 8)
|
||||||
msg_pack_into('!HH', buf, offset, self.type, self.len)
|
msg_pack_into('!HH', buf, offset, self.type, self.len)
|
||||||
pad_len = self.len - (4 + len_)
|
pad_len = self.len - (4 + len_)
|
||||||
ofproto_parser.msg_pack_into("%dx" % pad_len, buf, offset + 4 + len_)
|
msg_pack_into("%dx" % pad_len, buf, offset + 4 + len_)
|
||||||
|
|
||||||
def to_jsondict(self):
|
def to_jsondict(self):
|
||||||
return {
|
return {
|
||||||
@ -6068,8 +6067,7 @@ class OFPBundleAddMsg(MsgInMsgBase):
|
|||||||
if len(self.properties) > 0:
|
if len(self.properties) > 0:
|
||||||
message_len = len(tail_buf)
|
message_len = len(tail_buf)
|
||||||
pad_len = utils.round_up(message_len, 8) - message_len
|
pad_len = utils.round_up(message_len, 8) - message_len
|
||||||
ofproto_parser.msg_pack_into("%dx" % pad_len, tail_buf,
|
msg_pack_into("%dx" % pad_len, tail_buf, message_len)
|
||||||
message_len)
|
|
||||||
|
|
||||||
# Properties
|
# Properties
|
||||||
for p in self.properties:
|
for p in self.properties:
|
||||||
|
@ -23,9 +23,9 @@ import itertools
|
|||||||
|
|
||||||
from ryu.lib import addrconv
|
from ryu.lib import addrconv
|
||||||
from ryu.lib import mac
|
from ryu.lib import mac
|
||||||
|
from ryu.lib.pack_utils import msg_pack_into
|
||||||
from ryu import utils
|
from ryu import utils
|
||||||
from ofproto_parser import (StringifyMixin, MsgBase, MsgInMsgBase,
|
from ofproto_parser import StringifyMixin, MsgBase, MsgInMsgBase, msg_str_attr
|
||||||
msg_pack_into, msg_str_attr)
|
|
||||||
from . import ether
|
from . import ether
|
||||||
from . import ofproto_parser
|
from . import ofproto_parser
|
||||||
from . import ofproto_common
|
from . import ofproto_common
|
||||||
@ -769,7 +769,7 @@ class OFPMatch(StringifyMixin):
|
|||||||
self.length = length
|
self.length = length
|
||||||
|
|
||||||
pad_len = utils.round_up(length, 8) - length
|
pad_len = utils.round_up(length, 8) - length
|
||||||
ofproto_parser.msg_pack_into("%dx" % pad_len, buf, field_offset)
|
msg_pack_into("%dx" % pad_len, buf, field_offset)
|
||||||
|
|
||||||
return length + pad_len
|
return length + pad_len
|
||||||
|
|
||||||
@ -880,7 +880,7 @@ class OFPPropCommonExperimenter4ByteData(StringifyMixin):
|
|||||||
|
|
||||||
# Pad
|
# Pad
|
||||||
pad_len = utils.round_up(self.length, 8) - self.length
|
pad_len = utils.round_up(self.length, 8) - self.length
|
||||||
ofproto_parser.msg_pack_into("%dx" % pad_len, buf, len(buf))
|
msg_pack_into("%dx" % pad_len, buf, len(buf))
|
||||||
|
|
||||||
return buf
|
return buf
|
||||||
|
|
||||||
@ -1124,11 +1124,11 @@ class OFPMatchField(StringifyMixin):
|
|||||||
self.put(buf, offset, self.value)
|
self.put(buf, offset, self.value)
|
||||||
|
|
||||||
def _put_header(self, buf, offset):
|
def _put_header(self, buf, offset):
|
||||||
ofproto_parser.msg_pack_into('!I', buf, offset, self.header)
|
msg_pack_into('!I', buf, offset, self.header)
|
||||||
self.length = 4
|
self.length = 4
|
||||||
|
|
||||||
def _put(self, buf, offset, value):
|
def _put(self, buf, offset, value):
|
||||||
ofproto_parser.msg_pack_into(self.pack_str, buf, offset, value)
|
msg_pack_into(self.pack_str, buf, offset, value)
|
||||||
self.length += self.n_bytes
|
self.length += self.n_bytes
|
||||||
|
|
||||||
def put_w(self, buf, offset, value, mask):
|
def put_w(self, buf, offset, value, mask):
|
||||||
@ -1141,8 +1141,7 @@ class OFPMatchField(StringifyMixin):
|
|||||||
self._put(buf, offset + self.length, value)
|
self._put(buf, offset + self.length, value)
|
||||||
|
|
||||||
def _putv6(self, buf, offset, value):
|
def _putv6(self, buf, offset, value):
|
||||||
ofproto_parser.msg_pack_into(self.pack_str, buf, offset,
|
msg_pack_into(self.pack_str, buf, offset, *value)
|
||||||
*value)
|
|
||||||
self.length += self.n_bytes
|
self.length += self.n_bytes
|
||||||
|
|
||||||
def putv6(self, buf, offset, value, mask=None):
|
def putv6(self, buf, offset, value, mask=None):
|
||||||
@ -1596,10 +1595,10 @@ class MTPbbIsid(OFPMatchField):
|
|||||||
return cls(header, value, mask)
|
return cls(header, value, mask)
|
||||||
|
|
||||||
def _put(self, buf, offset, value):
|
def _put(self, buf, offset, value):
|
||||||
ofproto_parser.msg_pack_into(self.pack_str, buf, offset,
|
msg_pack_into(self.pack_str, buf, offset,
|
||||||
(value >> 16) & 0xff,
|
(value >> 16) & 0xff,
|
||||||
(value >> 8) & 0xff,
|
(value >> 8) & 0xff,
|
||||||
(value >> 0) & 0xff)
|
(value >> 0) & 0xff)
|
||||||
self.length += self.n_bytes
|
self.length += self.n_bytes
|
||||||
|
|
||||||
|
|
||||||
@ -2249,7 +2248,7 @@ class OFPTableFeatureProp(OFPPropBase):
|
|||||||
|
|
||||||
# Pad
|
# Pad
|
||||||
pad_len = utils.round_up(self.length, 8) - self.length
|
pad_len = utils.round_up(self.length, 8) - self.length
|
||||||
ofproto_parser.msg_pack_into("%dx" % pad_len, buf, len(buf))
|
msg_pack_into("%dx" % pad_len, buf, len(buf))
|
||||||
|
|
||||||
return buf
|
return buf
|
||||||
|
|
||||||
@ -4943,7 +4942,7 @@ class OFPInstructionActions(OFPInstruction):
|
|||||||
|
|
||||||
self.len = action_offset - offset
|
self.len = action_offset - offset
|
||||||
pad_len = utils.round_up(self.len, 8) - self.len
|
pad_len = utils.round_up(self.len, 8) - self.len
|
||||||
ofproto_parser.msg_pack_into("%dx" % pad_len, buf, action_offset)
|
msg_pack_into("%dx" % pad_len, buf, action_offset)
|
||||||
self.len += pad_len
|
self.len += pad_len
|
||||||
|
|
||||||
msg_pack_into(ofproto.OFP_INSTRUCTION_ACTIONS_PACK_STR,
|
msg_pack_into(ofproto.OFP_INSTRUCTION_ACTIONS_PACK_STR,
|
||||||
@ -5348,7 +5347,7 @@ class OFPActionSetField(OFPAction):
|
|||||||
self.len = utils.round_up(4 + len_, 8)
|
self.len = utils.round_up(4 + len_, 8)
|
||||||
msg_pack_into('!HH', buf, offset, self.type, self.len)
|
msg_pack_into('!HH', buf, offset, self.type, self.len)
|
||||||
pad_len = self.len - (4 + len_)
|
pad_len = self.len - (4 + len_)
|
||||||
ofproto_parser.msg_pack_into("%dx" % pad_len, buf, offset + 4 + len_)
|
msg_pack_into("%dx" % pad_len, buf, offset + 4 + len_)
|
||||||
|
|
||||||
def to_jsondict(self):
|
def to_jsondict(self):
|
||||||
return {
|
return {
|
||||||
@ -6067,8 +6066,7 @@ class OFPBundleAddMsg(MsgInMsgBase):
|
|||||||
if len(self.properties) > 0:
|
if len(self.properties) > 0:
|
||||||
message_len = len(tail_buf)
|
message_len = len(tail_buf)
|
||||||
pad_len = utils.round_up(message_len, 8) - message_len
|
pad_len = utils.round_up(message_len, 8) - message_len
|
||||||
ofproto_parser.msg_pack_into("%dx" % pad_len, tail_buf,
|
msg_pack_into("%dx" % pad_len, tail_buf, message_len)
|
||||||
message_len)
|
|
||||||
|
|
||||||
# Properties
|
# Properties
|
||||||
for p in self.properties:
|
for p in self.properties:
|
||||||
|
@ -63,7 +63,7 @@
|
|||||||
import itertools
|
import itertools
|
||||||
import struct
|
import struct
|
||||||
import ofproto_common
|
import ofproto_common
|
||||||
from ofproto_parser import msg_pack_into
|
from ryu.lib.pack_utils import msg_pack_into
|
||||||
from ryu.lib import type_desc
|
from ryu.lib import type_desc
|
||||||
|
|
||||||
|
|
||||||
|
58
ryu/tests/unit/lib/test_pack_utils.py
Normal file
58
ryu/tests/unit/lib/test_pack_utils.py
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
# Copyright (C) 2012 Nippon Telegraph and Telephone Corporation.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
# implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
|
||||||
|
import unittest
|
||||||
|
import struct
|
||||||
|
|
||||||
|
from nose.tools import ok_, eq_
|
||||||
|
|
||||||
|
from ryu.lib import pack_utils
|
||||||
|
|
||||||
|
|
||||||
|
class TestMsgPackInto(unittest.TestCase):
|
||||||
|
""" Test case for msg_pack_into
|
||||||
|
"""
|
||||||
|
|
||||||
|
def _test_msg_pack_into(self, offset_type='e'):
|
||||||
|
fmt = '!HH'
|
||||||
|
len_ = struct.calcsize(fmt)
|
||||||
|
buf = bytearray(len_)
|
||||||
|
offset = len_
|
||||||
|
arg1 = 1
|
||||||
|
arg2 = 2
|
||||||
|
|
||||||
|
if offset_type == 'l':
|
||||||
|
offset += 1
|
||||||
|
elif offset_type == 'g':
|
||||||
|
offset -= 1
|
||||||
|
|
||||||
|
pack_utils.msg_pack_into(fmt, buf, offset, arg1, arg2)
|
||||||
|
|
||||||
|
check_offset = len(buf) - len_
|
||||||
|
res = struct.unpack_from(fmt, buffer(buf), check_offset)
|
||||||
|
|
||||||
|
eq_(arg1, res[0])
|
||||||
|
eq_(arg2, res[1])
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
def test_msg_pack_into(self):
|
||||||
|
ok_(self._test_msg_pack_into())
|
||||||
|
|
||||||
|
def test_msg_pack_into_less(self):
|
||||||
|
ok_(self._test_msg_pack_into('l'))
|
||||||
|
|
||||||
|
def test_msg_pack_into_greater(self):
|
||||||
|
ok_(self._test_msg_pack_into('g'))
|
@ -223,43 +223,6 @@ class TestMsgBase(unittest.TestCase):
|
|||||||
ok_(self._test_serialize())
|
ok_(self._test_serialize())
|
||||||
|
|
||||||
|
|
||||||
class TestMsgPackInto(unittest.TestCase):
|
|
||||||
""" Test case for ofproto_parser.msg_pack_into
|
|
||||||
"""
|
|
||||||
|
|
||||||
def _test_msg_pack_into(self, offset_type='e'):
|
|
||||||
fmt = '!HH'
|
|
||||||
len_ = struct.calcsize(fmt)
|
|
||||||
buf = bytearray(len_)
|
|
||||||
offset = len_
|
|
||||||
arg1 = 1
|
|
||||||
arg2 = 2
|
|
||||||
|
|
||||||
if offset_type == 'l':
|
|
||||||
offset += 1
|
|
||||||
elif offset_type == 'g':
|
|
||||||
offset -= 1
|
|
||||||
|
|
||||||
ofproto_parser.msg_pack_into(fmt, buf, offset, arg1, arg2)
|
|
||||||
|
|
||||||
check_offset = len(buf) - len_
|
|
||||||
res = struct.unpack_from(fmt, buffer(buf), check_offset)
|
|
||||||
|
|
||||||
eq_(arg1, res[0])
|
|
||||||
eq_(arg2, res[1])
|
|
||||||
|
|
||||||
return True
|
|
||||||
|
|
||||||
def test_msg_pack_into(self):
|
|
||||||
ok_(self._test_msg_pack_into())
|
|
||||||
|
|
||||||
def test_msg_pack_into_less(self):
|
|
||||||
ok_(self._test_msg_pack_into('l'))
|
|
||||||
|
|
||||||
def test_msg_pack_into_greater(self):
|
|
||||||
ok_(self._test_msg_pack_into('g'))
|
|
||||||
|
|
||||||
|
|
||||||
class TestMsgStrAttr(unittest.TestCase):
|
class TestMsgStrAttr(unittest.TestCase):
|
||||||
""" Test case for ofproto_parser.msg_str_attr
|
""" Test case for ofproto_parser.msg_str_attr
|
||||||
"""
|
"""
|
||||||
|
@ -29,6 +29,7 @@ from ryu.ofproto import ether
|
|||||||
from ryu.ofproto.ofproto_parser import MsgBase
|
from ryu.ofproto.ofproto_parser import MsgBase
|
||||||
from ryu import utils
|
from ryu import utils
|
||||||
from ryu.lib import addrconv
|
from ryu.lib import addrconv
|
||||||
|
from ryu.lib import pack_utils
|
||||||
|
|
||||||
LOG = logging.getLogger('test_ofproto_v12')
|
LOG = logging.getLogger('test_ofproto_v12')
|
||||||
|
|
||||||
@ -6673,12 +6674,11 @@ class TestOFPMatch(unittest.TestCase):
|
|||||||
|
|
||||||
def test_parse_unknown_field(self):
|
def test_parse_unknown_field(self):
|
||||||
buf = bytearray()
|
buf = bytearray()
|
||||||
ofproto_parser.msg_pack_into('!HH', buf, 0, ofproto.OFPMT_OXM,
|
pack_utils.msg_pack_into('!HH', buf, 0, ofproto.OFPMT_OXM, 4 + 6)
|
||||||
4 + 6)
|
|
||||||
header = ofproto.oxm_tlv_header(36, 2)
|
header = ofproto.oxm_tlv_header(36, 2)
|
||||||
ofproto_parser.msg_pack_into('!IH', buf, 4, header, 1)
|
pack_utils.msg_pack_into('!IH', buf, 4, header, 1)
|
||||||
header = ofproto.OXM_OF_ETH_TYPE
|
header = ofproto.OXM_OF_ETH_TYPE
|
||||||
ofproto_v1_2_parser.msg_pack_into('!IH', buf, 10, header, 1)
|
pack_utils.msg_pack_into('!IH', buf, 10, header, 1)
|
||||||
|
|
||||||
match = OFPMatch()
|
match = OFPMatch()
|
||||||
res = match.parser(str(buf), 0)
|
res = match.parser(str(buf), 0)
|
||||||
|
Loading…
Reference in New Issue
Block a user