At Thu, 7 Jul 2016 15:51:10 +0900, Takashi YAMAMOTO wrote: > > [1 <multipart/alternative (7bit)>] > [1.1 <text/plain; UTF-8 (7bit)>] > this change broke dragonflow. > https://bugs.launchpad.net/dragonflow/+bug/1599367 > > i thought we aimed to align with on-wire fields rather than ovs-ofctl etc. > was the policy changed?
Sorry I haven't noticed earlier, but we need to revert this IMO. This ofs_nbits API has been there for a while, these numbers are on wire (as yamamoto said), and OFPActionCopyField has a similar API. > On Mon, Jun 6, 2016 at 9:48 AM, Shinpei Muraoka <[email protected]> > wrote: > > > This patch, update the methods that are to be specified in the NXM or OXM. > > Update the value specified in the bit format to the start and end formats. > > Update the following NXAction. > > > > - NXActionRegLoad > > - NXActionOutputReg > > - NXActionMultipath > > - NXActionBundle > > - NXActionBundleLoad > > - NXActionCT > > > > Signed-off-by: Shinpei Muraoka <[email protected]> > > --- > > ryu/ofproto/nx_actions.py | 76 > > ++++++++++++++-------- > > .../json/of13/ovs-ofctl-of13-action_ct.packet.json | 3 +- > > .../of13/ovs-ofctl-of13-action_ct_exec.packet.json | 3 +- > > .../of13/ovs-ofctl-of13-action_ct_nat.packet.json | 3 +- > > .../ovs-ofctl-of13-action_ct_nat_v6.packet.json | 3 +- > > ...s-ofctl-of13-match_load_nx_register.packet.json | 4 +- > > ryu/tests/unit/ofproto/test_parser_v10.py | 59 ++++++++++++----- > > 7 files changed, 101 insertions(+), 50 deletions(-) > > > > diff --git a/ryu/ofproto/nx_actions.py b/ryu/ofproto/nx_actions.py > > index a442868..14bc479 100644 > > --- a/ryu/ofproto/nx_actions.py > > +++ b/ryu/ofproto/nx_actions.py > > @@ -228,11 +228,11 @@ def generate(ofp_name, ofpp_name): > > ] > > } > > > > - def __init__(self, ofs, nbits, dst, value, > > + def __init__(self, start, end, dst, value, > > type_=None, len_=None, experimenter=None, > > subtype=None): > > super(NXActionRegLoad, self).__init__() > > - self.ofs = ofs > > - self.nbits = nbits > > + self.start = start > > + self.end = end > > self.dst = dst > > self.value = value > > > > @@ -240,11 +240,11 @@ def generate(ofp_name, ofpp_name): > > def parser(cls, buf): > > (ofs_nbits, dst, value,) = struct.unpack_from( > > cls._fmt_str, buf, 0) > > - ofs = ofs_nbits >> 6 > > - nbits = (ofs_nbits & ((1 << 6) - 1)) + 1 > > + start = ofs_nbits >> 6 > > + end = (ofs_nbits & 0x3f) + start > > # Right-shift instead of using oxm_parse_header for > > simplicity... > > dst_name = ofp.oxm_to_user_header(dst >> 9) > > - return cls(ofs, nbits, dst_name, value) > > + return cls(start, end, dst_name, value) > > > > def serialize_body(self): > > hdr_data = bytearray() > > @@ -252,7 +252,7 @@ def generate(ofp_name, ofpp_name): > > ofp.oxm_serialize_header(n, hdr_data, 0) > > (dst_num,) = struct.unpack_from('!I', > > six.binary_type(hdr_data), 0) > > > > - ofs_nbits = (self.ofs << 6) + self.nbits - 1 > > + ofs_nbits = (self.start << 6) + (self.end - self.start) > > data = bytearray() > > msg_pack_into(self._fmt_str, data, 0, > > ofs_nbits, dst_num, self.value) > > @@ -432,12 +432,14 @@ def generate(ofp_name, ofpp_name): > > _fmt_str = '!HIH6x' > > > > def __init__(self, > > - ofs_nbits, > > + start, > > + end, > > src, > > max_len, > > type_=None, len_=None, experimenter=None, > > subtype=None): > > super(NXActionOutputReg, self).__init__() > > - self.ofs_nbits = ofs_nbits > > + self.start = start > > + self.end = end > > self.src = src > > self.max_len = max_len > > > > @@ -447,12 +449,16 @@ def generate(ofp_name, ofpp_name): > > src, > > max_len) = struct.unpack_from( > > cls._fmt_str, buf, 0) > > - return cls(ofs_nbits, > > + start = ofs_nbits >> 6 > > + end = (ofs_nbits & 0x3f) + start > > + return cls(start, > > + end, > > src, > > max_len) > > > > def serialize_body(self): > > data = bytearray() > > + ofs_nbits = (self.start << 6) + (self.end - self.start) > > msg_pack_into(self._fmt_str, data, 0, > > ofs_nbits, > > self.src, > > @@ -660,7 +666,8 @@ def generate(ofp_name, ofpp_name): > > algorithm, > > max_link, > > arg, > > - ofs_nbits, > > + start, > > + end, > > dst, > > type_=None, len_=None, experimenter=None, > > subtype=None): > > super(NXActionMultipath, self).__init__() > > @@ -669,7 +676,8 @@ def generate(ofp_name, ofpp_name): > > self.algorithm = algorithm > > self.max_link = max_link > > self.arg = arg > > - self.ofs_nbits = ofs_nbits > > + self.start = start > > + self.end = end > > self.dst = dst > > > > @classmethod > > @@ -682,15 +690,19 @@ def generate(ofp_name, ofpp_name): > > ofs_nbits, > > dst) = struct.unpack_from( > > cls._fmt_str, buf, 0) > > + start = ofs_nbits >> 6 > > + end = (ofs_nbits & 0x3f) + start > > return cls(fields, > > basis, > > algorithm, > > max_link, > > arg, > > - ofs_nbits, > > + start, > > + end, > > dst) > > > > def serialize_body(self): > > + ofs_nbits = (self.start << 6) + (self.end - self.start) > > data = bytearray() > > msg_pack_into(self._fmt_str, data, 0, > > self.fields, > > @@ -698,7 +710,7 @@ def generate(ofp_name, ofpp_name): > > self.algorithm, > > self.max_link, > > self.arg, > > - self.ofs_nbits, > > + ofs_nbits, > > self.dst) > > return data > > > > @@ -708,7 +720,7 @@ def generate(ofp_name, ofpp_name): > > _fmt_str = '!HHHIHHI4x' > > > > def __init__(self, algorithm, fields, basis, slave_type, n_slaves, > > - ofs_nbits, dst, slaves): > > + start, end, dst, slaves): > > super(_NXActionBundleBase, self).__init__() > > self.len = utils.round_up( > > nicira_ext.NX_ACTION_BUNDLE_0_SIZE + len(slaves) * 2, 8) > > @@ -718,7 +730,8 @@ def generate(ofp_name, ofpp_name): > > self.basis = basis > > self.slave_type = slave_type > > self.n_slaves = n_slaves > > - self.ofs_nbits = ofs_nbits > > + self.start = start > > + self.end = end > > self.dst = dst > > > > assert isinstance(slaves, (list, tuple)) > > @@ -732,6 +745,8 @@ def generate(ofp_name, ofpp_name): > > (algorithm, fields, basis, > > slave_type, n_slaves, ofs_nbits, dst) = > > struct.unpack_from( > > cls._fmt_str, buf, 0) > > + start = ofs_nbits >> 6 > > + end = (ofs_nbits & 0x3f) + start > > slave_offset = (nicira_ext.NX_ACTION_BUNDLE_0_SIZE - > > nicira_ext.NX_ACTION_HEADER_0_SIZE) > > > > @@ -742,9 +757,10 @@ def generate(ofp_name, ofpp_name): > > slave_offset += 2 > > > > return cls(algorithm, fields, basis, slave_type, > > - n_slaves, ofs_nbits, dst, slaves) > > + n_slaves, start, end, dst, slaves) > > > > def serialize_body(self): > > + ofs_nbits = (self.start << 6) + (self.end - self.start) > > data = bytearray() > > slave_offset = (nicira_ext.NX_ACTION_BUNDLE_0_SIZE - > > nicira_ext.NX_ACTION_HEADER_0_SIZE) > > @@ -761,7 +777,7 @@ def generate(ofp_name, ofpp_name): > > msg_pack_into(self._fmt_str, data, 0, > > self.algorithm, self.fields, self.basis, > > self.slave_type, self.n_slaves, > > - self.ofs_nbits, self.dst) > > + ofs_nbits, self.dst) > > > > return data > > > > @@ -769,25 +785,25 @@ def generate(ofp_name, ofpp_name): > > _subtype = nicira_ext.NXAST_BUNDLE > > > > def __init__(self, algorithm, fields, basis, slave_type, n_slaves, > > - ofs_nbits, dst, slaves): > > + start, end, dst, slaves): > > # NXAST_BUNDLE actions should have 'ofs_nbits' and 'dst' > > zeroed. > > super(NXActionBundle, self).__init__( > > algorithm, fields, basis, slave_type, n_slaves, > > - ofs_nbits=0, dst=0, slaves=slaves) > > + start=0, end=0, dst=0, slaves=slaves) > > > > class NXActionBundleLoad(_NXActionBundleBase): > > _subtype = nicira_ext.NXAST_BUNDLE_LOAD > > > > def __init__(self, algorithm, fields, basis, slave_type, n_slaves, > > - ofs_nbits, dst, slaves): > > + start, end, dst, slaves): > > super(NXActionBundleLoad, self).__init__( > > algorithm, fields, basis, slave_type, n_slaves, > > - ofs_nbits, dst, slaves) > > + start, end, dst, slaves) > > > > class NXActionCT(NXAction): > > _subtype = nicira_ext.NXAST_CT > > > > - # flags, zone_src, zone_ofs_nbits (zone_imm), recirc_table, > > + # flags, zone_src, zone_ofs_nbits, recirc_table, > > # pad, alg > > _fmt_str = '!HIHB3xH' > > # Followed by actions > > @@ -795,7 +811,8 @@ def generate(ofp_name, ofpp_name): > > def __init__(self, > > flags, > > zone_src, > > - zone_ofs_nbits, # is zone_imm if zone_src == 0 > > + zone_start, > > + zone_end, > > recirc_table, > > alg, > > actions, > > @@ -803,7 +820,8 @@ def generate(ofp_name, ofpp_name): > > super(NXActionCT, self).__init__() > > self.flags = flags > > self.zone_src = zone_src > > - self.zone_ofs_nbits = zone_ofs_nbits > > + self.zone_start = zone_start > > + self.zone_end = zone_end > > self.recirc_table = recirc_table > > self.alg = alg > > self.actions = actions > > @@ -816,6 +834,8 @@ def generate(ofp_name, ofpp_name): > > recirc_table, > > alg,) = struct.unpack_from( > > cls._fmt_str, buf, 0) > > + zone_start = zone_ofs_nbits >> 6 > > + zone_end = (zone_ofs_nbits & 0x3f) + zone_start > > rest = buf[struct.calcsize(cls._fmt_str):] > > # actions > > actions = [] > > @@ -824,15 +844,17 @@ def generate(ofp_name, ofpp_name): > > actions.append(action) > > rest = rest[action.len:] > > > > - return cls(flags, zone_src, zone_ofs_nbits, recirc_table, > > + return cls(flags, zone_src, zone_start, zone_end, > > recirc_table, > > alg, actions) > > > > def serialize_body(self): > > + zone_ofs_nbits = ((self.zone_start << 6) + > > + (self.zone_end - self.zone_start)) > > data = bytearray() > > msg_pack_into(self._fmt_str, data, 0, > > self.flags, > > self.zone_src, > > - self.zone_ofs_nbits, > > + zone_ofs_nbits, > > self.recirc_table, > > self.alg) > > for a in self.actions: > > diff --git > > a/ryu/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_ct.packet.json > > b/ryu/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_ct.packet.json > > index 258da23..473b54f 100644 > > --- a/ryu/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_ct.packet.json > > +++ b/ryu/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_ct.packet.json > > @@ -21,7 +21,8 @@ > > "recirc_table": 4, > > "subtype": 35, > > "type": 65535, > > - "zone_ofs_nbits": 0, > > + "zone_start": 0, > > + "zone_end": 0, > > "zone_src": 0 > > } > > } > > diff --git > > a/ryu/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_ct_exec.packet.json > > b/ryu/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_ct_exec.packet.json > > index 8327644..7cecad7 100644 > > --- > > a/ryu/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_ct_exec.packet.json > > +++ > > b/ryu/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_ct_exec.packet.json > > @@ -35,7 +35,8 @@ > > "recirc_table": 255, > > "subtype": 35, > > "type": 65535, > > - "zone_ofs_nbits": 0, > > + "zone_start": 0, > > + "zone_end": 0, > > "zone_src": 0 > > } > > } > > diff --git > > a/ryu/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_ct_nat.packet.json > > b/ryu/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_ct_nat.packet.json > > index 85aae12..b63c226 100644 > > --- > > a/ryu/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_ct_nat.packet.json > > +++ > > b/ryu/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_ct_nat.packet.json > > @@ -37,7 +37,8 @@ > > "recirc_table": 255, > > "subtype": 35, > > "type": 65535, > > - "zone_ofs_nbits": 0, > > + "zone_start": 0, > > + "zone_end": 0, > > "zone_src": 0 > > } > > } > > diff --git > > a/ryu/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_ct_nat_v6.packet.json > > b/ryu/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_ct_nat_v6.packet.json > > index 31f9437..e50d561 100644 > > --- > > a/ryu/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_ct_nat_v6.packet.json > > +++ > > b/ryu/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_ct_nat_v6.packet.json > > @@ -37,7 +37,8 @@ > > "recirc_table": 255, > > "subtype": 35, > > "type": 65535, > > - "zone_ofs_nbits": 0, > > + "zone_start": 0, > > + "zone_end": 0, > > "zone_src": 0 > > } > > } > > diff --git > > a/ryu/tests/unit/ofproto/json/of13/ovs-ofctl-of13-match_load_nx_register.packet.json > > b/ryu/tests/unit/ofproto/json/of13/ovs-ofctl-of13-match_load_nx_register.packet.json > > index adf14ca..e57d11a 100644 > > --- > > a/ryu/tests/unit/ofproto/json/of13/ovs-ofctl-of13-match_load_nx_register.packet.json > > +++ > > b/ryu/tests/unit/ofproto/json/of13/ovs-ofctl-of13-match_load_nx_register.packet.json > > @@ -16,8 +16,8 @@ > > "dst": "reg0", > > "experimenter": 8992, > > "len": 24, > > - "nbits": 28, > > - "ofs": 4, > > + "end": 31, > > + "start": 4, > > "subtype": 7, > > "type": 65535, > > "value": 233495534 > > diff --git a/ryu/tests/unit/ofproto/test_parser_v10.py > > b/ryu/tests/unit/ofproto/test_parser_v10.py > > index c4dd474..5143e11 100644 > > --- a/ryu/tests/unit/ofproto/test_parser_v10.py > > +++ b/ryu/tests/unit/ofproto/test_parser_v10.py > > @@ -1421,6 +1421,8 @@ class TestNXActionRegLoad(unittest.TestCase): > > dst = {'buf': b'\x9f\x9f\x88\x26', 'val': 2678032422} > > value = {'buf': b'\x33\x51\xcd\x43\x25\x28\x18\x99', > > 'val': 3697962457317775513} > > + start = 246 > > + end = 270 > > > > buf = type_['buf'] \ > > + len_['buf'] \ > > @@ -1430,7 +1432,8 @@ class TestNXActionRegLoad(unittest.TestCase): > > + dst['buf'] \ > > + value['buf'] > > > > - c = NXActionRegLoad(ofs_nbits['val'], > > + c = NXActionRegLoad(start, > > + end, > > dst['val'], > > value['val']) > > > > @@ -1445,13 +1448,15 @@ class TestNXActionRegLoad(unittest.TestCase): > > eq_(self.len_['val'], self.c.len) > > eq_(self.vendor['val'], self.c.vendor) > > eq_(self.subtype['val'], self.c.subtype) > > - eq_(self.ofs_nbits['val'], self.c.ofs_nbits) > > + eq_(self.start, self.c.start) > > + eq_(self.end, self.c.end) > > eq_(self.dst['val'], self.c.dst) > > eq_(self.value['val'], self.c.value) > > > > def test_parser(self): > > res = self.c.parser(self.buf, 0) > > - eq_(self.ofs_nbits['val'], res.ofs_nbits) > > + eq_(self.start, self.c.start) > > + eq_(self.end, self.c.end) > > eq_(self.dst['val'], res.dst) > > eq_(self.value['val'], res.value) > > > > @@ -1547,6 +1552,8 @@ class TestNXActionMultipath(unittest.TestCase): > > zfill1 = b'\x00' * 2 > > ofs_nbits = {'buf': b'\xa9\x9a', 'val': 43418} > > dst = {'buf': b'\xb9\x2f\x16\x64', 'val': 3106870884} > > + start = 678 > > + end = 704 > > > > buf = type_['buf'] \ > > + len_['buf'] \ > > @@ -1567,7 +1574,8 @@ class TestNXActionMultipath(unittest.TestCase): > > algorithm['val'], > > max_link['val'], > > arg['val'], > > - ofs_nbits['val'], > > + start, > > + end, > > dst['val']) > > > > def setUp(self): > > @@ -1582,7 +1590,8 @@ class TestNXActionMultipath(unittest.TestCase): > > eq_(self.algorithm['val'], self.c.algorithm) > > eq_(self.max_link['val'], self.c.max_link) > > eq_(self.arg['val'], self.c.arg) > > - eq_(self.ofs_nbits['val'], self.c.ofs_nbits) > > + eq_(self.start, self.c.start) > > + eq_(self.end, self.c.end) > > eq_(self.dst['val'], self.c.dst) > > > > def test_parser(self): > > @@ -1593,7 +1602,8 @@ class TestNXActionMultipath(unittest.TestCase): > > eq_(self.algorithm['val'], res.algorithm) > > eq_(self.max_link['val'], res.max_link) > > eq_(self.arg['val'], res.arg) > > - eq_(self.ofs_nbits['val'], res.ofs_nbits) > > + eq_(self.start, res.start) > > + eq_(self.end, res.end) > > eq_(self.dst['val'], res.dst) > > > > def test_serialize(self): > > @@ -1634,12 +1644,14 @@ class TestNXActionBundle(unittest.TestCase): > > basis = {'buf': b'\xfd\x6f', 'val': 64879} > > slave_type = {'buf': b'\x7c\x51\x0f\xe0', 'val': 2085687264} > > n_slaves = {'buf': b'\x00\x02', 'val': 2} > > - ofs_nbits = {'buf': b'\xec\xf7', 'val': 60663} > > - dst = {'buf': b'\x50\x7c\x75\xfe', 'val': 1350333950} > > + ofs_nbits = {'buf': b'\x00\x00', 'val': 0} > > + dst = {'buf': b'\x00\x00\x00\x00', 'val': 0} > > zfill = b'\x00' * 4 > > > > slaves_buf = (b'\x00\x01', b'\x00\x02') > > slaves_val = (1, 2) > > + start = 0 > > + end = 0 > > > > _len = len_['val'] + len(slaves_val) * 2 > > _len += (_len % 8) > > @@ -1664,7 +1676,8 @@ class TestNXActionBundle(unittest.TestCase): > > basis['val'], > > slave_type['val'], > > n_slaves['val'], > > - ofs_nbits['val'], > > + start, > > + end, > > dst['val'], > > slaves_val) > > > > @@ -1684,7 +1697,8 @@ class TestNXActionBundle(unittest.TestCase): > > eq_(self.basis['val'], self.c.basis) > > eq_(self.slave_type['val'], self.c.slave_type) > > eq_(self.n_slaves['val'], self.c.n_slaves) > > - eq_(self.ofs_nbits['val'], self.c.ofs_nbits) > > + eq_(self.start, self.c.start) > > + eq_(self.end, self.c.end) > > eq_(self.dst['val'], self.c.dst) > > > > # slaves > > @@ -1704,7 +1718,8 @@ class TestNXActionBundle(unittest.TestCase): > > eq_(self.basis['val'], res.basis) > > eq_(self.slave_type['val'], res.slave_type) > > eq_(self.n_slaves['val'], res.n_slaves) > > - eq_(self.ofs_nbits['val'], res.ofs_nbits) > > + eq_(self.start, res.start) > > + eq_(self.end, res.end) > > eq_(self.dst['val'], res.dst) > > > > # slaves > > @@ -1756,6 +1771,8 @@ class TestNXActionBundleLoad(unittest.TestCase): > > ofs_nbits = {'buf': b'\xd2\x9d', 'val': 53917} > > dst = {'buf': b'\x37\xfe\xb3\x60', 'val': 939438944} > > zfill = b'\x00' * 4 > > + start = 842 > > + end = 871 > > > > slaves_buf = (b'\x00\x01', b'\x00\x02') > > slaves_val = (1, 2) > > @@ -1783,7 +1800,8 @@ class TestNXActionBundleLoad(unittest.TestCase): > > basis['val'], > > slave_type['val'], > > n_slaves['val'], > > - ofs_nbits['val'], > > + start, > > + end, > > dst['val'], > > slaves_val) > > > > @@ -1803,7 +1821,8 @@ class TestNXActionBundleLoad(unittest.TestCase): > > eq_(self.basis['val'], self.c.basis) > > eq_(self.slave_type['val'], self.c.slave_type) > > eq_(self.n_slaves['val'], self.c.n_slaves) > > - eq_(self.ofs_nbits['val'], self.c.ofs_nbits) > > + eq_(self.start, self.c.start) > > + eq_(self.end, self.c.end) > > eq_(self.dst['val'], self.c.dst) > > > > # slaves > > @@ -1823,7 +1842,8 @@ class TestNXActionBundleLoad(unittest.TestCase): > > eq_(self.basis['val'], res.basis) > > eq_(self.slave_type['val'], res.slave_type) > > eq_(self.n_slaves['val'], res.n_slaves) > > - eq_(self.ofs_nbits['val'], res.ofs_nbits) > > + eq_(self.start, res.start) > > + eq_(self.end, res.end) > > eq_(self.dst['val'], res.dst) > > > > # slaves > > @@ -1870,6 +1890,8 @@ class TestNXActionOutputReg(unittest.TestCase): > > src = {'buf': b'\x5e\x3a\x04\x26', 'val': 1580860454} > > max_len = {'buf': b'\x00\x08', 'val': ofproto.OFP_ACTION_OUTPUT_SIZE} > > zfill = b'\x00' * 6 > > + start = 1017 > > + end = 1073 > > > > buf = type_['buf'] \ > > + len_['buf'] \ > > @@ -1880,7 +1902,8 @@ class TestNXActionOutputReg(unittest.TestCase): > > + max_len['buf'] \ > > + zfill > > > > - c = NXActionOutputReg(ofs_nbits['val'], > > + c = NXActionOutputReg(start, > > + end, > > src['val'], > > max_len['val']) > > > > @@ -1895,7 +1918,8 @@ class TestNXActionOutputReg(unittest.TestCase): > > eq_(self.len_['val'], self.c.len) > > eq_(self.vendor['val'], self.c.vendor) > > eq_(self.subtype['val'], self.c.subtype) > > - eq_(self.ofs_nbits['val'], self.c.ofs_nbits) > > + eq_(self.start, self.c.start) > > + eq_(self.end, self.c.end) > > eq_(self.src['val'], self.c.src) > > eq_(self.max_len['val'], self.c.max_len) > > > > @@ -1906,7 +1930,8 @@ class TestNXActionOutputReg(unittest.TestCase): > > eq_(self.len_['val'], res.len) > > eq_(self.vendor['val'], res.vendor) > > eq_(self.subtype['val'], res.subtype) > > - eq_(self.ofs_nbits['val'], res.ofs_nbits) > > + eq_(self.start, self.c.start) > > + eq_(self.end, self.c.end) > > eq_(self.src['val'], res.src) > > eq_(self.max_len['val'], res.max_len) > > > > -- > > 1.9.1 > > > > > > > > ------------------------------------------------------------------------------ > > What NetFlow Analyzer can do for you? Monitors network bandwidth and > > traffic > > patterns at an interface-level. Reveals which users, apps, and protocols > > are > > consuming the most bandwidth. Provides multi-vendor support for NetFlow, > > J-Flow, sFlow and other flows. Make informed decisions using capacity > > planning reports. https://ad.doubleclick.net/ddm/clk/305295220;132659582;e > > _______________________________________________ > > Ryu-devel mailing list > > [email protected] > > https://lists.sourceforge.net/lists/listinfo/ryu-devel > > > [1.2 <text/html; UTF-8 (base64)>] > [2 <text/plain; us-ascii (7bit)>] > ------------------------------------------------------------------------------ > Attend Shape: An AT&T Tech Expo July 15-16. Meet us at AT&T Park in San > Francisco, CA to explore cutting-edge tech and listen to tech luminaries > present their vision of the future. This family event has something for > everyone, including kids. Get more information and register today. > http://sdm.link/attshape > [3 <text/plain; us-ascii (7bit)>] > _______________________________________________ > Ryu-devel mailing list > [email protected] > https://lists.sourceforge.net/lists/listinfo/ryu-devel ------------------------------------------------------------------------------ Attend Shape: An AT&T Tech Expo July 15-16. Meet us at AT&T Park in San Francisco, CA to explore cutting-edge tech and listen to tech luminaries present their vision of the future. This family event has something for everyone, including kids. Get more information and register today. http://sdm.link/attshape _______________________________________________ Ryu-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/ryu-devel
