diff options
Diffstat (limited to 'tests/unit/packet')
31 files changed, 0 insertions, 15281 deletions
diff --git a/tests/unit/packet/__init__.py b/tests/unit/packet/__init__.py deleted file mode 100644 index e69de29b..00000000 --- a/tests/unit/packet/__init__.py +++ /dev/null diff --git a/tests/unit/packet/test_arp.py b/tests/unit/packet/test_arp.py deleted file mode 100644 index 40e28131..00000000 --- a/tests/unit/packet/test_arp.py +++ /dev/null @@ -1,183 +0,0 @@ -# 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. - -# vim: tabstop=4 shiftwidth=4 softtabstop=4 - -import unittest -import logging -import struct -from struct import * -from nose.tools import * -from ryu.ofproto import ether -from ryu.lib.packet.ethernet import ethernet -from ryu.lib.packet.packet import Packet -from ryu.lib.packet.arp import arp -from ryu.lib.packet.vlan import vlan -from ryu.lib import addrconv - - -LOG = logging.getLogger('test_arp') - - -class Test_arp(unittest.TestCase): - """ Test case for arp - """ - - hwtype = 1 - proto = 0x0800 - hlen = 6 - plen = 4 - opcode = 1 - src_mac = '00:07:0d:af:f4:54' - src_ip = '24.166.172.1' - dst_mac = '00:00:00:00:00:00' - dst_ip = '24.166.173.159' - - fmt = arp._PACK_STR - buf = pack(fmt, hwtype, proto, hlen, plen, opcode, - addrconv.mac.text_to_bin(src_mac), - addrconv.ipv4.text_to_bin(src_ip), - addrconv.mac.text_to_bin(dst_mac), - addrconv.ipv4.text_to_bin(dst_ip)) - - a = arp(hwtype, proto, hlen, plen, opcode, src_mac, src_ip, dst_mac, - dst_ip) - - def setUp(self): - pass - - def tearDown(self): - pass - - def find_protocol(self, pkt, name): - for p in pkt.protocols: - if p.protocol_name == name: - return p - - def test_init(self): - eq_(self.hwtype, self.a.hwtype) - eq_(self.proto, self.a.proto) - eq_(self.hlen, self.a.hlen) - eq_(self.plen, self.a.plen) - eq_(self.opcode, self.a.opcode) - eq_(self.src_mac, self.a.src_mac) - eq_(self.src_ip, self.a.src_ip) - eq_(self.dst_mac, self.a.dst_mac) - eq_(self.dst_ip, self.a.dst_ip) - - def test_parser(self): - _res = self.a.parser(self.buf) - if type(_res) is tuple: - res = _res[0] - else: - res = _res - - eq_(res.hwtype, self.hwtype) - eq_(res.proto, self.proto) - eq_(res.hlen, self.hlen) - eq_(res.plen, self.plen) - eq_(res.opcode, self.opcode) - eq_(res.src_mac, self.src_mac) - eq_(res.src_ip, self.src_ip) - eq_(res.dst_mac, self.dst_mac) - eq_(res.dst_ip, self.dst_ip) - - def test_serialize(self): - data = bytearray() - prev = None - buf = self.a.serialize(data, prev) - - fmt = arp._PACK_STR - res = struct.unpack(fmt, buf) - - eq_(res[0], self.hwtype) - eq_(res[1], self.proto) - eq_(res[2], self.hlen) - eq_(res[3], self.plen) - eq_(res[4], self.opcode) - eq_(res[5], addrconv.mac.text_to_bin(self.src_mac)) - eq_(res[6], addrconv.ipv4.text_to_bin(self.src_ip)) - eq_(res[7], addrconv.mac.text_to_bin(self.dst_mac)) - eq_(res[8], addrconv.ipv4.text_to_bin(self.dst_ip)) - - def _build_arp(self, vlan_enabled): - if vlan_enabled is True: - ethertype = ether.ETH_TYPE_8021Q - v = vlan(1, 1, 3, ether.ETH_TYPE_ARP) - else: - ethertype = ether.ETH_TYPE_ARP - e = ethernet(self.dst_mac, self.src_mac, ethertype) - p = Packet() - - p.add_protocol(e) - if vlan_enabled is True: - p.add_protocol(v) - p.add_protocol(self.a) - p.serialize() - return p - - def test_build_arp_vlan(self): - p = self._build_arp(True) - - e = self.find_protocol(p, "ethernet") - ok_(e) - eq_(e.ethertype, ether.ETH_TYPE_8021Q) - - v = self.find_protocol(p, "vlan") - ok_(v) - eq_(v.ethertype, ether.ETH_TYPE_ARP) - - a = self.find_protocol(p, "arp") - ok_(a) - - eq_(a.hwtype, self.hwtype) - eq_(a.proto, self.proto) - eq_(a.hlen, self.hlen) - eq_(a.plen, self.plen) - eq_(a.opcode, self.opcode) - eq_(a.src_mac, self.src_mac) - eq_(a.src_ip, self.src_ip) - eq_(a.dst_mac, self.dst_mac) - eq_(a.dst_ip, self.dst_ip) - - def test_build_arp_novlan(self): - p = self._build_arp(False) - - e = self.find_protocol(p, "ethernet") - ok_(e) - eq_(e.ethertype, ether.ETH_TYPE_ARP) - - a = self.find_protocol(p, "arp") - ok_(a) - - eq_(a.hwtype, self.hwtype) - eq_(a.proto, self.proto) - eq_(a.hlen, self.hlen) - eq_(a.plen, self.plen) - eq_(a.opcode, self.opcode) - eq_(a.src_mac, self.src_mac) - eq_(a.src_ip, self.src_ip) - eq_(a.dst_mac, self.dst_mac) - eq_(a.dst_ip, self.dst_ip) - - @raises(Exception) - def test_malformed_arp(self): - m_short_buf = self.buf[1:arp._MIN_LEN] - arp.parser(m_short_buf) - - def test_json(self): - jsondict = self.a.to_jsondict() - a = arp.from_jsondict(jsondict['arp']) - eq_(str(self.a), str(a)) diff --git a/tests/unit/packet/test_bfd.py b/tests/unit/packet/test_bfd.py deleted file mode 100644 index d33949cc..00000000 --- a/tests/unit/packet/test_bfd.py +++ /dev/null @@ -1,320 +0,0 @@ -# Copyright (C) 2014 Xinguard, Inc. -# -# 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 logging -import struct -import inspect -from nose.tools import ok_, eq_, nottest - -from ryu.ofproto import ether -from ryu.ofproto import inet -from ryu.lib.packet import packet -from ryu.lib.packet import ethernet -from ryu.lib.packet import ipv4 -from ryu.lib.packet import udp -from ryu.lib.packet import bfd -from ryu.lib import addrconv - -LOG = logging.getLogger(__name__) - - -class TestBFD(unittest.TestCase): - def setUp(self): - # BFD packet without authentication. - self.data = b'\xb0\xa8\x6e\x18\xb8\x08\x64\x87' \ - + b'\x88\xe9\xcb\xc8\x08\x00\x45\xc0' \ - + b'\x00\x34\x68\x49\x00\x00\xff\x11' \ - + b'\xf4\x73\xac\x1c\x03\x01\xac\x1c' \ - + b'\x03\x02\xc0\x00\x0e\xc8\x00\x20' \ - + b'\xd9\x02\x21\xc0\x03\x18\x00\x00' \ - + b'\x00\x06\x00\x00\x00\x07\x00\x00' \ - + b'\xea\x60\x00\x00\xea\x60\x00\x00' \ - + b'\x00\x00' - - # BFD packet using simple password authentication. - self.data_auth_simple = b'\x08\x00\x27\xd1\x95\x7c\x08\x00' \ - + b'\x27\xed\x54\x41\x08\x00\x45\xc0' \ - + b'\x00\x3d\x0c\x90\x00\x00\xff\x11' \ - + b'\xbb\x0b\xc0\xa8\x39\x02\xc0\xa8' \ - + b'\x39\x01\xc0\x00\x0e\xc8\x00\x29' \ - + b'\x46\x35\x20\x44\x03\x21\x00\x00' \ - + b'\x00\x01\x00\x00\x00\x00\x00\x0f' \ - + b'\x42\x40\x00\x0f\x42\x40\x00\x00' \ - + b'\x00\x00\x01\x09\x02\x73\x65\x63' \ - + b'\x72\x65\x74' - - # BFD packet using md5 authentication. - self.data_auth_md5 = b'\x08\x00\x27\xd1\x95\x7c\x08\x00' \ - + b'\x27\xed\x54\x41\x08\x00\x45\xc0' \ - + b'\x00\x4c\x0c\x44\x00\x00\xff\x11' \ - + b'\xbb\x48\xc0\xa8\x39\x02\xc0\xa8' \ - + b'\x39\x01\xc0\x00\x0e\xc8\x00\x38' \ - + b'\x51\xbc\x20\x44\x03\x30\x00\x00' \ - + b'\x00\x01\x00\x00\x00\x00\x00\x0f' \ - + b'\x42\x40\x00\x0f\x42\x40\x00\x00' \ - + b'\x00\x00\x02\x18\x02\x00\x00\x00' \ - + b'\x41\xdb\x66\xa8\xf9\x25\x5a\x8b' \ - + b'\xcb\x7e\x4b\xec\x25\xa6\x2c\x23' \ - + b'\xda\x0f' - - # BFD packet using SHA1 authentication. - self.data_auth_sha1 = b'\x08\x00\x27\xd1\x95\x7c\x08\x00' \ - + b'\x27\xed\x54\x41\x08\x00\x45\xc0' \ - + b'\x00\x50\x0b\x90\x00\x00\xff\x11' \ - + b'\xbb\xf8\xc0\xa8\x39\x02\xc0\xa8' \ - + b'\x39\x01\xc0\x00\x0e\xc8\x00\x3c' \ - + b'\xb9\x92\x20\x44\x03\x34\x00\x00' \ - + b'\x00\x01\x00\x00\x00\x00\x00\x0f' \ - + b'\x42\x40\x00\x0f\x42\x40\x00\x00' \ - + b'\x00\x00\x04\x1c\x02\x00\x00\x00' \ - + b'\x41\xb1\x46\x20\x10\x81\x03\xd7' \ - + b'\xf4\xde\x87\x61\x4c\x24\x61\x1f' \ - + b'\x3c\xc1\x6a\x00\x69\x23' - - # BFD Key chain {auth_key_id: auth_key/password} - self.auth_keys = {2: b"secret"} - - def tearDown(self): - pass - - def test_parse(self): - buf = self.data - pkt = packet.Packet(buf) - i = iter(pkt) - - eq_(type(next(i)), ethernet.ethernet) - eq_(type(next(i)), ipv4.ipv4) - eq_(type(next(i)), udp.udp) - eq_(type(bfd.bfd.parser(next(i))[0]), bfd.bfd) - - def test_parse_with_auth_simple(self): - buf = self.data_auth_simple - pkt = packet.Packet(buf) - i = iter(pkt) - - eq_(type(next(i)), ethernet.ethernet) - eq_(type(next(i)), ipv4.ipv4) - eq_(type(next(i)), udp.udp) - - bfd_obj = bfd.bfd.parser(next(i))[0] - eq_(type(bfd_obj), bfd.bfd) - eq_(type(bfd_obj.auth_cls), bfd.SimplePassword) - ok_(bfd_obj.authenticate(self.auth_keys)) - - def test_parse_with_auth_md5(self): - buf = self.data_auth_md5 - pkt = packet.Packet(buf) - i = iter(pkt) - - eq_(type(next(i)), ethernet.ethernet) - eq_(type(next(i)), ipv4.ipv4) - eq_(type(next(i)), udp.udp) - - bfd_obj = bfd.bfd.parser(next(i))[0] - eq_(type(bfd_obj), bfd.bfd) - eq_(type(bfd_obj.auth_cls), bfd.KeyedMD5) - ok_(bfd_obj.authenticate(self.auth_keys)) - - def test_parse_with_auth_sha1(self): - buf = self.data_auth_sha1 - pkt = packet.Packet(buf) - i = iter(pkt) - - eq_(type(next(i)), ethernet.ethernet) - eq_(type(next(i)), ipv4.ipv4) - eq_(type(next(i)), udp.udp) - - bfd_obj = bfd.bfd.parser(next(i))[0] - eq_(type(bfd_obj), bfd.bfd) - eq_(type(bfd_obj.auth_cls), bfd.KeyedSHA1) - ok_(bfd_obj.authenticate(self.auth_keys)) - - def test_serialize(self): - pkt = packet.Packet() - - eth_pkt = ethernet.ethernet('b0:a8:6e:18:b8:08', '64:87:88:e9:cb:c8') - pkt.add_protocol(eth_pkt) - - ip_pkt = ipv4.ipv4(src='172.28.3.1', dst='172.28.3.2', tos=192, - identification=26697, proto=inet.IPPROTO_UDP) - pkt.add_protocol(ip_pkt) - - udp_pkt = udp.udp(49152, 3784) - pkt.add_protocol(udp_pkt) - - bfd_pkt = bfd.bfd(ver=1, diag=bfd.BFD_DIAG_CTRL_DETECT_TIME_EXPIRED, - state=bfd.BFD_STATE_UP, detect_mult=3, my_discr=6, - your_discr=7, desired_min_tx_interval=60000, - required_min_rx_interval=60000, - required_min_echo_rx_interval=0) - pkt.add_protocol(bfd_pkt) - - eq_(len(pkt.protocols), 4) - - pkt.serialize() - eq_(pkt.data, self.data) - - def test_serialize_with_auth_simple(self): - pkt = packet.Packet() - - eth_pkt = ethernet.ethernet('08:00:27:d1:95:7c', '08:00:27:ed:54:41') - pkt.add_protocol(eth_pkt) - - ip_pkt = ipv4.ipv4(src='192.168.57.2', dst='192.168.57.1', tos=192, - identification=3216, proto=inet.IPPROTO_UDP) - pkt.add_protocol(ip_pkt) - - udp_pkt = udp.udp(49152, 3784) - pkt.add_protocol(udp_pkt) - - auth_cls = bfd.SimplePassword(auth_key_id=2, - password=self.auth_keys[2]) - - bfd_pkt = bfd.bfd(ver=1, diag=bfd.BFD_DIAG_NO_DIAG, - flags=bfd.BFD_FLAG_AUTH_PRESENT, - state=bfd.BFD_STATE_DOWN, detect_mult=3, my_discr=1, - your_discr=0, desired_min_tx_interval=1000000, - required_min_rx_interval=1000000, - required_min_echo_rx_interval=0, - auth_cls=auth_cls) - - pkt.add_protocol(bfd_pkt) - - eq_(len(pkt.protocols), 4) - - pkt.serialize() - eq_(pkt.data, self.data_auth_simple) - - def test_serialize_with_auth_md5(self): - pkt = packet.Packet() - - eth_pkt = ethernet.ethernet('08:00:27:d1:95:7c', '08:00:27:ed:54:41') - pkt.add_protocol(eth_pkt) - - ip_pkt = ipv4.ipv4(src='192.168.57.2', dst='192.168.57.1', tos=192, - identification=3140, proto=inet.IPPROTO_UDP) - pkt.add_protocol(ip_pkt) - - udp_pkt = udp.udp(49152, 3784) - pkt.add_protocol(udp_pkt) - - auth_cls = bfd.KeyedMD5(auth_key_id=2, seq=16859, - auth_key=self.auth_keys[2]) - - bfd_pkt = bfd.bfd(ver=1, diag=bfd.BFD_DIAG_NO_DIAG, - flags=bfd.BFD_FLAG_AUTH_PRESENT, - state=bfd.BFD_STATE_DOWN, detect_mult=3, my_discr=1, - your_discr=0, desired_min_tx_interval=1000000, - required_min_rx_interval=1000000, - required_min_echo_rx_interval=0, - auth_cls=auth_cls) - - pkt.add_protocol(bfd_pkt) - - eq_(len(pkt.protocols), 4) - - pkt.serialize() - eq_(pkt.data, self.data_auth_md5) - - def test_serialize_with_auth_sha1(self): - pkt = packet.Packet() - - eth_pkt = ethernet.ethernet('08:00:27:d1:95:7c', '08:00:27:ed:54:41') - pkt.add_protocol(eth_pkt) - - ip_pkt = ipv4.ipv4(src='192.168.57.2', dst='192.168.57.1', tos=192, - identification=2960, proto=inet.IPPROTO_UDP) - pkt.add_protocol(ip_pkt) - - udp_pkt = udp.udp(49152, 3784) - pkt.add_protocol(udp_pkt) - - auth_cls = bfd.KeyedSHA1(auth_key_id=2, seq=16817, - auth_key=self.auth_keys[2]) - - bfd_pkt = bfd.bfd(ver=1, diag=bfd.BFD_DIAG_NO_DIAG, - flags=bfd.BFD_FLAG_AUTH_PRESENT, - state=bfd.BFD_STATE_DOWN, detect_mult=3, my_discr=1, - your_discr=0, desired_min_tx_interval=1000000, - required_min_rx_interval=1000000, - required_min_echo_rx_interval=0, - auth_cls=auth_cls) - - pkt.add_protocol(bfd_pkt) - - eq_(len(pkt.protocols), 4) - - pkt.serialize() - eq_(pkt.data, self.data_auth_sha1) - - def test_json(self): - bfd1 = bfd.bfd(ver=1, diag=bfd.BFD_DIAG_CTRL_DETECT_TIME_EXPIRED, - state=bfd.BFD_STATE_UP, detect_mult=3, my_discr=6, - your_discr=7, desired_min_tx_interval=60000, - required_min_rx_interval=60000, - required_min_echo_rx_interval=0) - - jsondict = bfd1.to_jsondict() - bfd2 = bfd.bfd.from_jsondict(jsondict['bfd']) - eq_(str(bfd1), str(bfd2)) - - def test_json_with_auth_simple(self): - auth_cls = bfd.SimplePassword(auth_key_id=2, - password=self.auth_keys[2]) - - bfd1 = bfd.bfd(ver=1, diag=bfd.BFD_DIAG_NO_DIAG, - flags=bfd.BFD_FLAG_AUTH_PRESENT, - state=bfd.BFD_STATE_DOWN, detect_mult=3, my_discr=1, - your_discr=0, desired_min_tx_interval=1000000, - required_min_rx_interval=1000000, - required_min_echo_rx_interval=0, - auth_cls=auth_cls) - - jsondict = bfd1.to_jsondict() - bfd2 = bfd.bfd.from_jsondict(jsondict['bfd']) - eq_(str(bfd1), str(bfd2)) - - def test_json_with_auth_md5(self): - auth_cls = bfd.KeyedMD5(auth_key_id=2, seq=16859, - auth_key=self.auth_keys[2]) - - bfd1 = bfd.bfd(ver=1, diag=bfd.BFD_DIAG_NO_DIAG, - flags=bfd.BFD_FLAG_AUTH_PRESENT, - state=bfd.BFD_STATE_DOWN, detect_mult=3, my_discr=1, - your_discr=0, desired_min_tx_interval=1000000, - required_min_rx_interval=1000000, - required_min_echo_rx_interval=0, - auth_cls=auth_cls) - - jsondict = bfd1.to_jsondict() - bfd2 = bfd.bfd.from_jsondict(jsondict['bfd']) - eq_(str(bfd1), str(bfd2)) - - def test_json_with_auth_sha1(self): - auth_cls = bfd.KeyedSHA1(auth_key_id=2, seq=16859, - auth_key=self.auth_keys[2]) - - bfd1 = bfd.bfd(ver=1, diag=bfd.BFD_DIAG_NO_DIAG, - flags=bfd.BFD_FLAG_AUTH_PRESENT, - state=bfd.BFD_STATE_DOWN, detect_mult=3, my_discr=1, - your_discr=0, desired_min_tx_interval=1000000, - required_min_rx_interval=1000000, - required_min_echo_rx_interval=0, - auth_cls=auth_cls) - - jsondict = bfd1.to_jsondict() - bfd2 = bfd.bfd.from_jsondict(jsondict['bfd']) - eq_(str(bfd1), str(bfd2)) diff --git a/tests/unit/packet/test_bgp.py b/tests/unit/packet/test_bgp.py deleted file mode 100644 index 2211fc4c..00000000 --- a/tests/unit/packet/test_bgp.py +++ /dev/null @@ -1,813 +0,0 @@ -# Copyright (C) 2013,2014 Nippon Telegraph and Telephone Corporation. -# Copyright (C) 2013,2014 YAMAMOTO Takashi <yamamoto 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. - -from __future__ import print_function - -import logging -import os -import sys - -import unittest -from nose.tools import eq_ -from nose.tools import ok_ - -from ryu.utils import binary_str -from ryu.lib import pcaplib -from ryu.lib.packet import packet -from ryu.lib.packet import bgp -from ryu.lib.packet import afi -from ryu.lib.packet import safi - - -LOG = logging.getLogger(__name__) - -BGP4_PACKET_DATA_DIR = os.path.join( - os.path.dirname(sys.modules[__name__].__file__), '../../packet_data/bgp4/') - -PMSI_TYPE_NO_TUNNEL_INFORMATION_PRESENT = ( - bgp.BGPPathAttributePmsiTunnel.TYPE_NO_TUNNEL_INFORMATION_PRESENT -) -PMSI_TYPE_INGRESS_REPLICATION = ( - bgp.BGPPathAttributePmsiTunnel.TYPE_INGRESS_REPLICATION -) - -RULES_BASE = [ - # port='>=8000' - bgp.FlowSpecPort( - operator=(bgp.FlowSpecPort.GT | bgp.FlowSpecPort.EQ), - value=8000), - # port='&<=9000' - bgp.FlowSpecPort( - operator=(bgp.FlowSpecPort.AND | bgp.FlowSpecPort.LT | - bgp.FlowSpecPort.EQ), - value=9000), - # port='==80' - bgp.FlowSpecPort(operator=bgp.FlowSpecPort.EQ, value=80), - # dst_port=8080 - bgp.FlowSpecDestPort(operator=bgp.FlowSpecDestPort.EQ, value=8080), - # dst_port='>9000' - bgp.FlowSpecDestPort(operator=bgp.FlowSpecDestPort.GT, value=9000), - # dst_port='&<9050' - bgp.FlowSpecDestPort( - operator=(bgp.FlowSpecDestPort.AND | bgp.FlowSpecDestPort.LT), - value=9050), - # dst_port='<=1000' - bgp.FlowSpecDestPort( - operator=(bgp.FlowSpecDestPort.LT | bgp.FlowSpecDestPort.EQ), - value=1000), - # src_port='<=9090' - bgp.FlowSpecSrcPort( - operator=(bgp.FlowSpecSrcPort.LT | bgp.FlowSpecSrcPort.EQ), - value=9090), - # src_port='& >=9080' - bgp.FlowSpecSrcPort( - operator=(bgp.FlowSpecSrcPort.AND | bgp.FlowSpecSrcPort.GT | - bgp.FlowSpecSrcPort.EQ), - value=9080), - # src_port='<10100' - bgp.FlowSpecSrcPort( - operator=bgp.FlowSpecSrcPort.LT, value=10100), - # src_port='>10000' - bgp.FlowSpecSrcPort( - operator=(bgp.FlowSpecSrcPort.AND | bgp.FlowSpecSrcPort.GT), - value=10000), - # icmp_type=0 - bgp.FlowSpecIcmpType(operator=bgp.FlowSpecIcmpType.EQ, value=0), - # icmp_code=6 - bgp.FlowSpecIcmpCode(operator=bgp.FlowSpecIcmpCode.EQ, value=6), - # tcp_flags='ACK+FIN' - bgp.FlowSpecTCPFlags( - operator=0, # Partial match - value=(bgp.FlowSpecTCPFlags.SYN | bgp.FlowSpecTCPFlags.ACK)), - # tcp_flags='&!=URGENT' - bgp.FlowSpecTCPFlags( - operator=(bgp.FlowSpecTCPFlags.AND | bgp.FlowSpecTCPFlags.NOT), - value=bgp.FlowSpecTCPFlags.URGENT), - # packet_len=1000 - bgp.FlowSpecPacketLen( - operator=bgp.FlowSpecPacketLen.EQ, value=1000), - # packet_len=1100 - bgp.FlowSpecPacketLen( - operator=(bgp.FlowSpecTCPFlags.AND | bgp.FlowSpecPacketLen.EQ), - value=1100), - # dscp=22 - bgp.FlowSpecDSCP(operator=bgp.FlowSpecDSCP.EQ, value=22), - # dscp=24 - bgp.FlowSpecDSCP(operator=bgp.FlowSpecDSCP.EQ, value=24), -] - -RULES_L2VPN_BASE = [ - # ether_type=0x0800 - bgp.FlowSpecEtherType(operator=bgp.FlowSpecEtherType.EQ, value=0x0800), - # source_mac='12:34:56:78:90:AB' - bgp.FlowSpecSourceMac(addr='12:34:56:78:90:AB', length=6), - # dest_mac='DE:EF:C0:FF:EE:DD' - bgp.FlowSpecDestinationMac(addr='BE:EF:C0:FF:EE:DD', length=6), - # llc_dsap=0x42 - bgp.FlowSpecLLCDSAP(operator=bgp.FlowSpecLLCDSAP.EQ, value=0x42), - # llc_ssap=0x42 - bgp.FlowSpecLLCSSAP(operator=bgp.FlowSpecLLCSSAP.EQ, value=0x42), - # llc_control=100 - bgp.FlowSpecLLCControl(operator=bgp.FlowSpecLLCControl.EQ, value=100), - # snap=0x12345 - bgp.FlowSpecSNAP(operator=bgp.FlowSpecSNAP.EQ, value=0x12345), - # vlan_id='>4000' - bgp.FlowSpecVLANID(operator=bgp.FlowSpecVLANID.GT, value=4000), - # vlan_cos='>=3' - bgp.FlowSpecVLANCoS( - operator=(bgp.FlowSpecVLANCoS.GT | bgp.FlowSpecVLANCoS.EQ), value=3), - # inner_vlan_id='<3000' - bgp.FlowSpecInnerVLANID(operator=bgp.FlowSpecInnerVLANID.LT, value=3000), - # inner_vlan_cos='<=5' - bgp.FlowSpecInnerVLANCoS( - operator=(bgp.FlowSpecInnerVLANCoS.LT | bgp.FlowSpecInnerVLANCoS.EQ), - value=5), -] - - -class Test_bgp(unittest.TestCase): - """ Test case for ryu.lib.packet.bgp - """ - - def setUp(self): - pass - - def tearDown(self): - pass - - def test_open1(self): - msg = bgp.BGPOpen(my_as=30000, bgp_identifier='192.0.2.1') - binmsg = msg.serialize() - msg2, _, rest = bgp.BGPMessage.parser(binmsg) - eq_(str(msg), str(msg2)) - eq_(len(msg), 29) - eq_(rest, b'') - - def test_open2(self): - opt_param = [bgp.BGPOptParamCapabilityUnknown(cap_code=200, - cap_value=b'hoge'), - bgp.BGPOptParamCapabilityGracefulRestart(flags=0, - time=120, - tuples=[]), - bgp.BGPOptParamCapabilityRouteRefresh(), - bgp.BGPOptParamCapabilityCiscoRouteRefresh(), - bgp.BGPOptParamCapabilityMultiprotocol( - afi=afi.IP, safi=safi.MPLS_VPN), - bgp.BGPOptParamCapabilityCarryingLabelInfo(), - bgp.BGPOptParamCapabilityFourOctetAsNumber( - as_number=1234567), - bgp.BGPOptParamUnknown(type_=99, value=b'fuga')] - msg = bgp.BGPOpen(my_as=30000, bgp_identifier='192.0.2.2', - opt_param=opt_param) - binmsg = msg.serialize() - msg2, _, rest = bgp.BGPMessage.parser(binmsg) - eq_(str(msg), str(msg2)) - ok_(len(msg) > 29) - eq_(rest, b'') - - def test_update1(self): - msg = bgp.BGPUpdate() - binmsg = msg.serialize() - msg2, _, rest = bgp.BGPMessage.parser(binmsg) - eq_(str(msg), str(msg2)) - eq_(len(msg), 23) - eq_(rest, b'') - - def test_update2(self): - withdrawn_routes = [bgp.BGPWithdrawnRoute(length=0, - addr='192.0.2.13'), - bgp.BGPWithdrawnRoute(length=1, - addr='192.0.2.13'), - bgp.BGPWithdrawnRoute(length=3, - addr='192.0.2.13'), - bgp.BGPWithdrawnRoute(length=7, - addr='192.0.2.13'), - bgp.BGPWithdrawnRoute(length=32, - addr='192.0.2.13')] - mp_nlri = [ - bgp.LabelledVPNIPAddrPrefix(24, '192.0.9.0', - route_dist='100:100', - labels=[1, 2, 3]), - bgp.LabelledVPNIPAddrPrefix(26, '192.0.10.192', - route_dist='10.0.0.1:10000', - labels=[5, 6, 7, 8]), - ] - mp_nlri2 = [ - bgp.LabelledIPAddrPrefix(24, '192.168.0.0', labels=[1, 2, 3]) - ] - mp_nlri_v6 = [ - bgp.LabelledVPNIP6AddrPrefix(64, '2001:db8:1111::', - route_dist='200:200', - labels=[1, 2, 3]), - bgp.LabelledVPNIP6AddrPrefix(64, '2001:db8:2222::', - route_dist='10.0.0.1:10000', - labels=[5, 6, 7, 8]), - ] - mp_nlri2_v6 = [ - bgp.LabelledIP6AddrPrefix(64, '2001:db8:3333::', labels=[1, 2, 3]) - ] - communities = [ - bgp.BGP_COMMUNITY_NO_EXPORT, - bgp.BGP_COMMUNITY_NO_ADVERTISE, - ] - ecommunities = [ - bgp.BGPTwoOctetAsSpecificExtendedCommunity( - subtype=1, as_number=65500, local_administrator=3908876543), - bgp.BGPFourOctetAsSpecificExtendedCommunity( - subtype=2, as_number=10000000, local_administrator=59876), - bgp.BGPIPv4AddressSpecificExtendedCommunity( - subtype=3, ipv4_address='192.0.2.1', - local_administrator=65432), - bgp.BGPOpaqueExtendedCommunity(subtype=13, opaque=b'abcdef'), - bgp.BGPEncapsulationExtendedCommunity( - subtype=0x0c, tunnel_type=10), - bgp.BGPEvpnMacMobilityExtendedCommunity( - subtype=0, flags=0xff, sequence_number=0x11223344), - bgp.BGPEvpnEsiLabelExtendedCommunity( - subtype=1, flags=0xff, label=b'\xFF\xFF\xFF'), - bgp.BGPEvpnEsiLabelExtendedCommunity( - subtype=1, flags=0xff, mpls_label=0xfffff), - bgp.BGPEvpnEsiLabelExtendedCommunity( - subtype=1, flags=0xff, vni=0xffffff), - bgp.BGPEvpnEsImportRTExtendedCommunity( - subtype=2, es_import="aa:bb:cc:dd:ee:ff"), - bgp.BGPUnknownExtendedCommunity(type_=99, value=b'abcdefg'), - ] - path_attributes = [ - bgp.BGPPathAttributeOrigin(value=1), - bgp.BGPPathAttributeAsPath(value=[[1000], {1001, 1002}, - [1003, 1004]]), - bgp.BGPPathAttributeNextHop(value='192.0.2.199'), - bgp.BGPPathAttributeMultiExitDisc(value=2000000000), - bgp.BGPPathAttributeLocalPref(value=1000000000), - bgp.BGPPathAttributeAtomicAggregate(), - bgp.BGPPathAttributeAggregator(as_number=40000, - addr='192.0.2.99'), - bgp.BGPPathAttributeCommunities(communities=communities), - bgp.BGPPathAttributeOriginatorId(value='10.1.1.1'), - bgp.BGPPathAttributeClusterList(value=['1.1.1.1', '2.2.2.2']), - bgp.BGPPathAttributeExtendedCommunities(communities=ecommunities), - bgp.BGPPathAttributePmsiTunnel( - pmsi_flags=1, - tunnel_type=PMSI_TYPE_NO_TUNNEL_INFORMATION_PRESENT, - label=b'\xFF\xFF\xFF'), - bgp.BGPPathAttributePmsiTunnel( - pmsi_flags=1, - tunnel_type=PMSI_TYPE_NO_TUNNEL_INFORMATION_PRESENT, - tunnel_id=None), - bgp.BGPPathAttributePmsiTunnel( - pmsi_flags=1, - tunnel_type=PMSI_TYPE_INGRESS_REPLICATION, - mpls_label=0xfffff, - tunnel_id=bgp.PmsiTunnelIdIngressReplication( - tunnel_endpoint_ip="1.1.1.1")), - bgp.BGPPathAttributePmsiTunnel( - pmsi_flags=1, - tunnel_type=PMSI_TYPE_INGRESS_REPLICATION, - vni=0xffffff, - tunnel_id=bgp.PmsiTunnelIdIngressReplication( - tunnel_endpoint_ip="aa:bb:cc::dd:ee:ff")), - bgp.BGPPathAttributePmsiTunnel( - pmsi_flags=1, - tunnel_type=2, - label=b'\xFF\xFF\xFF', - tunnel_id=bgp.PmsiTunnelIdUnknown(value=b'test')), - bgp.BGPPathAttributeAs4Path(value=[[1000000], {1000001, 1002}, - [1003, 1000004]]), - bgp.BGPPathAttributeAs4Aggregator(as_number=100040000, - addr='192.0.2.99'), - bgp.BGPPathAttributeMpReachNLRI(afi=afi.IP, safi=safi.MPLS_VPN, - next_hop='1.1.1.1', - nlri=mp_nlri), - bgp.BGPPathAttributeMpReachNLRI(afi=afi.IP, safi=safi.MPLS_LABEL, - next_hop='1.1.1.1', - nlri=mp_nlri2), - bgp.BGPPathAttributeMpReachNLRI(afi=afi.IP6, safi=safi.MPLS_VPN, - next_hop=['2001:db8::1'], - nlri=mp_nlri_v6), - bgp.BGPPathAttributeMpReachNLRI(afi=afi.IP6, safi=safi.MPLS_LABEL, - next_hop=['2001:db8::1', - 'fe80::1'], - nlri=mp_nlri2_v6), - bgp.BGPPathAttributeMpUnreachNLRI(afi=afi.IP, safi=safi.MPLS_VPN, - withdrawn_routes=mp_nlri), - bgp.BGPPathAttributeUnknown(flags=0, type_=100, value=300 * b'bar') - ] - nlri = [ - bgp.BGPNLRI(length=24, addr='203.0.113.1'), - bgp.BGPNLRI(length=16, addr='203.0.113.0') - ] - msg = bgp.BGPUpdate(withdrawn_routes=withdrawn_routes, - path_attributes=path_attributes, - nlri=nlri) - binmsg = msg.serialize() - msg2, _, rest = bgp.BGPMessage.parser(binmsg) - eq_(str(msg), str(msg2)) - ok_(len(msg) > 23) - eq_(rest, b'') - - def test_keepalive(self): - msg = bgp.BGPKeepAlive() - binmsg = msg.serialize() - msg2, _, rest = bgp.BGPMessage.parser(binmsg) - eq_(str(msg), str(msg2)) - eq_(len(msg), 19) - eq_(rest, b'') - - def test_notification(self): - data = b'hoge' - msg = bgp.BGPNotification(error_code=1, error_subcode=2, data=data) - binmsg = msg.serialize() - msg2, _, rest = bgp.BGPMessage.parser(binmsg) - eq_(str(msg), str(msg2)) - eq_(len(msg), 21 + len(data)) - eq_(rest, b'') - - def test_route_refresh(self): - msg = bgp.BGPRouteRefresh(afi=afi.IP, safi=safi.MPLS_VPN) - binmsg = msg.serialize() - msg2, _, rest = bgp.BGPMessage.parser(binmsg) - eq_(str(msg), str(msg2)) - eq_(len(msg), 23) - eq_(rest, b'') - - def test_stream_parser(self): - msgs = [ - bgp.BGPNotification(error_code=1, error_subcode=2, data=b'foo'), - bgp.BGPNotification(error_code=3, error_subcode=4, data=b'bar'), - bgp.BGPNotification(error_code=5, error_subcode=6, data=b'baz'), - ] - binmsgs = b''.join([bytes(msg.serialize()) for msg in msgs]) - sp = bgp.StreamParser() - results = [] - for b in binmsgs: - for m in sp.parse(b): - results.append(m) - eq_(str(results), str(msgs)) - - def test_parser(self): - files = [ - 'bgp4-open', - 'bgp4-update', - 'bgp4-update_ipv6', - 'bgp4-update_vpnv6', - 'bgp4-keepalive', - 'evpn_esi_arbitrary', - 'evpn_esi_lacp', - 'evpn_esi_l2_bridge', - 'evpn_esi_mac_base', - 'evpn_esi_router_id', - 'evpn_esi_as_based', - 'evpn_nlri_eth_a-d', - 'evpn_nlri_mac_ip_ad', - 'evpn_nlri_inc_multi_eth_tag', - 'evpn_nlri_eth_seg', - 'evpn_nlri_ip_prefix', - 'flowspec_nlri_ipv4', - 'flowspec_nlri_vpn4', - 'flowspec_nlri_ipv6', - 'flowspec_nlri_vpn6', - 'flowspec_nlri_l2vpn', - 'flowspec_action_traffic_rate', - 'flowspec_action_traffic_action', - 'flowspec_action_redirect', - 'flowspec_action_traffic_marking', - ] - - for f in files: - LOG.debug('*** testing %s ...', f) - for _, buf in pcaplib.Reader( - open(BGP4_PACKET_DATA_DIR + f + '.pcap', 'rb')): - # Checks if BGP message can be parsed as expected. - pkt = packet.Packet(buf) - ok_(isinstance(pkt.protocols[-1], bgp.BGPMessage), - 'Failed to parse BGP message: %s' % pkt) - - # Checks if BGP message can be serialized as expected. - pkt.serialize() - eq_(buf, pkt.data, - "b'%s' != b'%s'" % (binary_str(buf), binary_str(pkt.data))) - - def test_vlan_action_parser(self): - action = bgp.BGPFlowSpecVlanActionCommunity( - actions_1=(bgp.BGPFlowSpecVlanActionCommunity.POP | - bgp.BGPFlowSpecVlanActionCommunity.SWAP), - vlan_1=3000, - cos_1=3, - actions_2=bgp.BGPFlowSpecVlanActionCommunity.PUSH, - vlan_2=4000, - cos_2=2, - ) - binmsg = action.serialize() - msg, rest = bgp.BGPFlowSpecVlanActionCommunity.parse(binmsg) - eq_(str(action), str(msg)) - eq_(rest, b'') - - def test_tpid_action_parser(self): - action = bgp.BGPFlowSpecTPIDActionCommunity( - actions=(bgp.BGPFlowSpecTPIDActionCommunity.TI | - bgp.BGPFlowSpecTPIDActionCommunity.TO), - tpid_1=5, - tpid_2=6, - ) - binmsg = action.serialize() - msg, rest = bgp.BGPFlowSpecTPIDActionCommunity.parse(binmsg) - eq_(str(action), str(msg)) - eq_(rest, b'') - - def test_json1(self): - opt_param = [bgp.BGPOptParamCapabilityUnknown(cap_code=200, - cap_value=b'hoge'), - bgp.BGPOptParamCapabilityRouteRefresh(), - bgp.BGPOptParamCapabilityMultiprotocol( - afi=afi.IP, safi=safi.MPLS_VPN), - bgp.BGPOptParamCapabilityFourOctetAsNumber( - as_number=1234567), - bgp.BGPOptParamUnknown(type_=99, value=b'fuga')] - msg1 = bgp.BGPOpen(my_as=30000, bgp_identifier='192.0.2.2', - opt_param=opt_param) - jsondict = msg1.to_jsondict() - msg2 = bgp.BGPOpen.from_jsondict(jsondict['BGPOpen']) - eq_(str(msg1), str(msg2)) - - def test_json2(self): - withdrawn_routes = [bgp.BGPWithdrawnRoute(length=0, - addr='192.0.2.13'), - bgp.BGPWithdrawnRoute(length=1, - addr='192.0.2.13'), - bgp.BGPWithdrawnRoute(length=3, - addr='192.0.2.13'), - bgp.BGPWithdrawnRoute(length=7, - addr='192.0.2.13'), - bgp.BGPWithdrawnRoute(length=32, - addr='192.0.2.13')] - mp_nlri = [ - bgp.LabelledVPNIPAddrPrefix(24, '192.0.9.0', - route_dist='100:100', - labels=[1, 2, 3]), - bgp.LabelledVPNIPAddrPrefix(26, '192.0.10.192', - route_dist='10.0.0.1:10000', - labels=[5, 6, 7, 8]), - ] - mp_nlri2 = [ - bgp.LabelledIPAddrPrefix(24, '192.168.0.0', labels=[1, 2, 3]) - ] - mp_nlri_v6 = [ - bgp.LabelledVPNIP6AddrPrefix(64, '2001:db8:1111::', - route_dist='200:200', - labels=[1, 2, 3]), - bgp.LabelledVPNIP6AddrPrefix(64, '2001:db8:2222::', - route_dist='10.0.0.1:10000', - labels=[5, 6, 7, 8]), - ] - mp_nlri2_v6 = [ - bgp.LabelledIP6AddrPrefix(64, '2001:db8:3333::', labels=[1, 2, 3]) - ] - communities = [ - bgp.BGP_COMMUNITY_NO_EXPORT, - bgp.BGP_COMMUNITY_NO_ADVERTISE, - ] - ecommunities = [ - bgp.BGPTwoOctetAsSpecificExtendedCommunity( - subtype=1, as_number=65500, local_administrator=3908876543), - bgp.BGPFourOctetAsSpecificExtendedCommunity( - subtype=2, as_number=10000000, local_administrator=59876), - bgp.BGPIPv4AddressSpecificExtendedCommunity( - subtype=3, ipv4_address='192.0.2.1', - local_administrator=65432), - bgp.BGPOpaqueExtendedCommunity(subtype=13, opaque=b'abcdef'), - bgp.BGPEncapsulationExtendedCommunity( - subtype=0x0c, tunnel_type=10), - bgp.BGPEvpnMacMobilityExtendedCommunity( - subtype=0, flags=0xff, sequence_number=0x11223344), - bgp.BGPEvpnEsiLabelExtendedCommunity( - subtype=1, flags=0xff, label=b'\xFF\xFF\xFF'), - bgp.BGPEvpnEsiLabelExtendedCommunity( - subtype=1, flags=0xff, mpls_label=0xfffff), - bgp.BGPEvpnEsiLabelExtendedCommunity( - subtype=1, flags=0xff, vni=0xffffff), - bgp.BGPEvpnEsImportRTExtendedCommunity( - subtype=2, es_import="aa:bb:cc:dd:ee:ff"), - bgp.BGPUnknownExtendedCommunity(type_=99, value=b'abcdefg'), - ] - path_attributes = [ - bgp.BGPPathAttributeOrigin(value=1), - bgp.BGPPathAttributeAsPath(value=[[1000], {1001, 1002}, - [1003, 1004]]), - bgp.BGPPathAttributeNextHop(value='192.0.2.199'), - bgp.BGPPathAttributeMultiExitDisc(value=2000000000), - bgp.BGPPathAttributeLocalPref(value=1000000000), - bgp.BGPPathAttributeAtomicAggregate(), - bgp.BGPPathAttributeAggregator(as_number=40000, - addr='192.0.2.99'), - bgp.BGPPathAttributeCommunities(communities=communities), - bgp.BGPPathAttributeExtendedCommunities(communities=ecommunities), - bgp.BGPPathAttributePmsiTunnel( - pmsi_flags=1, - tunnel_type=PMSI_TYPE_NO_TUNNEL_INFORMATION_PRESENT, - label=b'\xFF\xFF\xFF'), - bgp.BGPPathAttributePmsiTunnel( - pmsi_flags=1, - tunnel_type=PMSI_TYPE_NO_TUNNEL_INFORMATION_PRESENT, - tunnel_id=None), - bgp.BGPPathAttributePmsiTunnel( - pmsi_flags=1, - tunnel_type=PMSI_TYPE_INGRESS_REPLICATION, - mpls_label=0xfffff, - tunnel_id=bgp.PmsiTunnelIdIngressReplication( - tunnel_endpoint_ip="1.1.1.1")), - bgp.BGPPathAttributePmsiTunnel( - pmsi_flags=1, - tunnel_type=PMSI_TYPE_INGRESS_REPLICATION, - vni=0xffffff, - tunnel_id=bgp.PmsiTunnelIdIngressReplication( - tunnel_endpoint_ip="aa:bb:cc::dd:ee:ff")), - bgp.BGPPathAttributePmsiTunnel( - pmsi_flags=1, - tunnel_type=2, - label=b'\xFF\xFF\xFF', - tunnel_id=bgp.PmsiTunnelIdUnknown(value=b'test')), - bgp.BGPPathAttributeAs4Path(value=[[1000000], {1000001, 1002}, - [1003, 1000004]]), - bgp.BGPPathAttributeAs4Aggregator(as_number=100040000, - addr='192.0.2.99'), - bgp.BGPPathAttributeMpReachNLRI(afi=afi.IP, safi=safi.MPLS_VPN, - next_hop='1.1.1.1', - nlri=mp_nlri), - bgp.BGPPathAttributeMpReachNLRI(afi=afi.IP, safi=safi.MPLS_LABEL, - next_hop='1.1.1.1', - nlri=mp_nlri2), - bgp.BGPPathAttributeMpReachNLRI(afi=afi.IP6, safi=safi.MPLS_VPN, - next_hop=['2001:db8::1'], - nlri=mp_nlri_v6), - bgp.BGPPathAttributeMpReachNLRI(afi=afi.IP6, safi=safi.MPLS_LABEL, - next_hop=['2001:db8::1', - 'fe80::1'], - nlri=mp_nlri2_v6), - bgp.BGPPathAttributeMpUnreachNLRI(afi=afi.IP, safi=safi.MPLS_VPN, - withdrawn_routes=mp_nlri), - bgp.BGPPathAttributeUnknown(flags=0, type_=100, value=300 * b'bar') - ] - nlri = [ - bgp.BGPNLRI(length=24, addr='203.0.113.1'), - bgp.BGPNLRI(length=16, addr='203.0.113.0') - ] - msg1 = bgp.BGPUpdate(withdrawn_routes=withdrawn_routes, - path_attributes=path_attributes, - nlri=nlri) - jsondict = msg1.to_jsondict() - msg2 = bgp.BGPUpdate.from_jsondict(jsondict['BGPUpdate']) - eq_(str(msg1), str(msg2)) - - def test_flowspec_user_interface_ipv4(self): - rules = RULES_BASE + [ - # dst_prefix='10.0.0.0/24 - bgp.FlowSpecDestPrefix(addr='10.0.0.0', length=24), - # src_prefix='20.0.0.1/24' - bgp.FlowSpecSrcPrefix(addr='20.0.0.0', length=24), - # ip_proto='6' - bgp.FlowSpecIPProtocol( - operator=bgp.FlowSpecIPProtocol.EQ, value=6), - # fragment='LF' - bgp.FlowSpecFragment( - operator=0, # Partial match - value=bgp.FlowSpecFragment.LF), - # fragment='==FF' - bgp.FlowSpecFragment( - operator=bgp.FlowSpecFragment.MATCH, - value=bgp.FlowSpecFragment.FF), - # fragment='&==ISF' - bgp.FlowSpecFragment( - operator=(bgp.FlowSpecFragment.AND | - bgp.FlowSpecFragment.MATCH), - value=bgp.FlowSpecFragment.ISF), - # fragment='!=DF' - bgp.FlowSpecFragment( - operator=bgp.FlowSpecFragment.NOT, - value=bgp.FlowSpecFragment.DF) - ] - - msg = bgp.FlowSpecIPv4NLRI.from_user( - dst_prefix='10.0.0.0/24', - src_prefix='20.0.0.0/24', - ip_proto='6', - port='>=8000 & <=9000 | ==80', - dst_port='8080 >9000&<9050 | <=1000', - src_port='<=9090 & >=9080 <10100 & >10000', - icmp_type=0, - icmp_code=6, - tcp_flags='SYN+ACK & !=URGENT', - packet_len='1000 & 1100', - dscp='22 24', - fragment='LF ==FF&==ISF | !=DF') - msg2 = bgp.FlowSpecIPv4NLRI(rules=rules) - binmsg = msg.serialize() - binmsg2 = msg2.serialize() - eq_(str(msg), str(msg2)) - eq_(binary_str(binmsg), binary_str(binmsg2)) - msg3, rest = bgp.FlowSpecIPv4NLRI.parser(binmsg) - eq_(str(msg), str(msg3)) - eq_(rest, b'') - - def test_flowspec_user_interface_vpv4(self): - rules = RULES_BASE + [ - # dst_prefix='10.0.0.0/24 - bgp.FlowSpecDestPrefix(addr='10.0.0.0', length=24), - # src_prefix='20.0.0.1/24' - bgp.FlowSpecSrcPrefix(addr='20.0.0.0', length=24), - # ip_proto='6' - bgp.FlowSpecIPProtocol( - operator=bgp.FlowSpecIPProtocol.EQ, value=6), - # fragment='LF' - bgp.FlowSpecFragment( - operator=0, # Partial match - value=bgp.FlowSpecFragment.LF), - # fragment='==FF' - bgp.FlowSpecFragment( - operator=bgp.FlowSpecFragment.MATCH, - value=bgp.FlowSpecFragment.FF), - # fragment='&==ISF' - bgp.FlowSpecFragment( - operator=(bgp.FlowSpecFragment.AND | - bgp.FlowSpecFragment.MATCH), - value=bgp.FlowSpecFragment.ISF), - # fragment='!=DF' - bgp.FlowSpecFragment( - operator=bgp.FlowSpecFragment.NOT, - value=bgp.FlowSpecFragment.DF) - ] - msg = bgp.FlowSpecVPNv4NLRI.from_user( - route_dist='65001:250', - dst_prefix='10.0.0.0/24', - src_prefix='20.0.0.0/24', - ip_proto='6', - port='>=8000 & <=9000 | ==80', - dst_port='8080 >9000&<9050 | <=1000', - src_port='<=9090 & >=9080 <10100 & >10000', - icmp_type=0, - icmp_code=6, - tcp_flags='SYN+ACK & !=URGENT', - packet_len='1000 & 1100', - dscp='22 24', - fragment='LF ==FF&==ISF | !=DF') - msg2 = bgp.FlowSpecVPNv4NLRI(route_dist='65001:250', rules=rules) - binmsg = msg.serialize() - binmsg2 = msg2.serialize() - eq_(str(msg), str(msg2)) - eq_(binary_str(binmsg), binary_str(binmsg2)) - msg3, rest = bgp.FlowSpecVPNv4NLRI.parser(binmsg) - eq_(str(msg), str(msg3)) - eq_(rest, b'') - - def test_flowspec_user_interface_ipv6(self): - rules = RULES_BASE + [ - # dst_prefix='2001:2/128/32' - bgp.FlowSpecIPv6DestPrefix( - addr='2001::2', offset=32, length=128), - # src_prefix='3002::3/128' - bgp.FlowSpecIPv6SrcPrefix( - addr='3002::3', length=128), - # ip_proto='6' - bgp.FlowSpecNextHeader( - operator=bgp.FlowSpecNextHeader.EQ, value=6), - # fragment='LF' - bgp.FlowSpecIPv6Fragment( - operator=0, # Partial match - value=bgp.FlowSpecFragment.LF), - # fragment='==FF' - bgp.FlowSpecIPv6Fragment( - operator=bgp.FlowSpecFragment.MATCH, - value=bgp.FlowSpecFragment.FF), - # fragment='&==ISF' - bgp.FlowSpecIPv6Fragment( - operator=(bgp.FlowSpecFragment.AND | - bgp.FlowSpecFragment.MATCH), - value=bgp.FlowSpecFragment.ISF), - # fragment='!=LF' - bgp.FlowSpecIPv6Fragment( - operator=bgp.FlowSpecFragment.NOT, - value=bgp.FlowSpecFragment.LF), - # flowlabel='100' - bgp.FlowSpecIPv6FlowLabel( - operator=bgp.FlowSpecIPv6FlowLabel.EQ, - value=100), - ] - msg = bgp.FlowSpecIPv6NLRI.from_user( - dst_prefix='2001::2/128/32', - src_prefix='3002::3/128', - next_header='6', - port='>=8000 & <=9000 | ==80', - dst_port='8080 >9000&<9050 | <=1000', - src_port='<=9090 & >=9080 <10100 & >10000', - icmp_type=0, - icmp_code=6, - tcp_flags='SYN+ACK & !=URGENT', - packet_len='1000 & 1100', - dscp='22 24', - fragment='LF ==FF&==ISF | !=LF', - flow_label=100, - ) - msg2 = bgp.FlowSpecIPv6NLRI(rules=rules) - binmsg = msg.serialize() - binmsg2 = msg2.serialize() - eq_(str(msg), str(msg2)) - eq_(binary_str(binmsg), binary_str(binmsg2)) - msg3, rest = bgp.FlowSpecIPv6NLRI.parser(binmsg) - eq_(str(msg), str(msg3)) - eq_(rest, b'') - - def test_flowspec_user_interface_vpnv6(self): - rules = RULES_BASE + [ - # dst_prefix='2001:2/128/32' - bgp.FlowSpecIPv6DestPrefix( - addr='2001::2', offset=32, length=128), - # src_prefix='3002::3/128' - bgp.FlowSpecIPv6SrcPrefix( - addr='3002::3', length=128), - # ip_proto='6' - bgp.FlowSpecNextHeader( - operator=bgp.FlowSpecNextHeader.EQ, value=6), - # fragment='LF' - bgp.FlowSpecIPv6Fragment( - operator=0, # Partial match - value=bgp.FlowSpecFragment.LF), - # fragment='==FF' - bgp.FlowSpecIPv6Fragment( - operator=bgp.FlowSpecFragment.MATCH, - value=bgp.FlowSpecFragment.FF), - # fragment='&==ISF' - bgp.FlowSpecIPv6Fragment( - operator=(bgp.FlowSpecFragment.AND | - bgp.FlowSpecFragment.MATCH), - value=bgp.FlowSpecFragment.ISF), - # fragment='!=LF' - bgp.FlowSpecIPv6Fragment( - operator=bgp.FlowSpecFragment.NOT, - value=bgp.FlowSpecFragment.LF), - # flowlabel='100' - bgp.FlowSpecIPv6FlowLabel( - operator=bgp.FlowSpecIPv6FlowLabel.EQ, - value=100), - ] - msg = bgp.FlowSpecVPNv6NLRI.from_user( - route_dist='65001:250', - dst_prefix='2001::2/128/32', - src_prefix='3002::3/128', - next_header='6', - port='>=8000 & <=9000 | ==80', - dst_port='8080 >9000&<9050 | <=1000', - src_port='<=9090 & >=9080 <10100 & >10000', - icmp_type=0, - icmp_code=6, - tcp_flags='SYN+ACK & !=URGENT', - packet_len='1000 & 1100', - dscp='22 24', - fragment='LF ==FF&==ISF | !=LF', - flow_label=100, - ) - msg2 = bgp.FlowSpecVPNv6NLRI(route_dist='65001:250', rules=rules) - binmsg = msg.serialize() - binmsg2 = msg2.serialize() - eq_(str(msg), str(msg2)) - eq_(binary_str(binmsg), binary_str(binmsg2)) - msg3, rest = bgp.FlowSpecVPNv6NLRI.parser(binmsg) - eq_(str(msg), str(msg3)) - eq_(rest, b'') - - def test_flowspec_user_interface_l2vpn(self): - rules = RULES_L2VPN_BASE - msg = bgp.FlowSpecL2VPNNLRI.from_user( - route_dist='65001:250', - ether_type=0x0800, - src_mac='12:34:56:78:90:AB', - dst_mac='BE:EF:C0:FF:EE:DD', - llc_dsap=0x42, - llc_ssap=0x42, - llc_control=100, - snap=0x12345, - vlan_id='>4000', - vlan_cos='>=3', - inner_vlan_id='<3000', - inner_vlan_cos='<=5', - ) - msg2 = bgp.FlowSpecL2VPNNLRI(route_dist='65001:250', rules=rules) - binmsg = msg.serialize() - binmsg2 = msg2.serialize() - eq_(str(msg), str(msg2)) - eq_(binary_str(binmsg), binary_str(binmsg2)) - msg3, rest = bgp.FlowSpecL2VPNNLRI.parser(binmsg) - eq_(str(msg), str(msg3)) - eq_(rest, b'') diff --git a/tests/unit/packet/test_bmp.py b/tests/unit/packet/test_bmp.py deleted file mode 100644 index f93b8014..00000000 --- a/tests/unit/packet/test_bmp.py +++ /dev/null @@ -1,136 +0,0 @@ -# Copyright (C) 2014 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 -from nose.tools import eq_ -from nose.tools import ok_ -from time import time - -from ryu.lib.packet import bmp -from ryu.lib.packet import bgp -from ryu.lib.packet import afi -from ryu.lib.packet import safi - - -class Test_bmp(unittest.TestCase): - """ Test case for ryu.lib.packet.bmp - """ - - def setUp(self): - pass - - def tearDown(self): - pass - - def _time(self): - # time() can give sub-microsecond precision, which results - # in an assertion failure - return round(time(), 6) - - def test_route_monitoring(self): - update = bgp.BGPUpdate() - msg = bmp.BMPRouteMonitoring(bgp_update=update, - peer_type=bmp.BMP_PEER_TYPE_GLOBAL, - is_post_policy=True, - peer_distinguisher=0, - peer_address='192.0.2.1', - peer_as=30000, - peer_bgp_id='192.0.2.1', - timestamp=self._time()) - binmsg = msg.serialize() - msg2, rest = bmp.BMPMessage.parser(binmsg) - eq_(msg.to_jsondict(), msg2.to_jsondict()) - eq_(rest, b'') - - def test_statistics_report(self): - stats = [{'type': bmp.BMP_STAT_TYPE_REJECTED, 'value': 100}, - {'type': bmp.BMP_STAT_TYPE_DUPLICATE_PREFIX, 'value': 200}, - {'type': bmp.BMP_STAT_TYPE_DUPLICATE_WITHDRAW, 'value': 300}, - {'type': bmp.BMP_STAT_TYPE_ADJ_RIB_IN, 'value': 100000}, - {'type': bmp.BMP_STAT_TYPE_LOC_RIB, 'value': 500000}] - msg = bmp.BMPStatisticsReport(stats=stats, - peer_type=bmp.BMP_PEER_TYPE_GLOBAL, - is_post_policy=True, - peer_distinguisher=0, - peer_address='192.0.2.1', - peer_as=30000, - peer_bgp_id='192.0.2.1', - timestamp=self._time()) - binmsg = msg.serialize() - msg2, rest = bmp.BMPMessage.parser(binmsg) - eq_(msg.to_jsondict(), msg2.to_jsondict()) - eq_(rest, b'') - - def test_peer_down_notification(self): - reason = bmp.BMP_PEER_DOWN_REASON_LOCAL_BGP_NOTIFICATION - data = b'hoge' - data = bgp.BGPNotification(error_code=1, error_subcode=2, data=data) - msg = bmp.BMPPeerDownNotification(reason=reason, data=data, - peer_type=bmp.BMP_PEER_TYPE_GLOBAL, - is_post_policy=True, - peer_distinguisher=0, - peer_address='192.0.2.1', - peer_as=30000, - peer_bgp_id='192.0.2.1', - timestamp=self._time()) - binmsg = msg.serialize() - msg2, rest = bmp.BMPMessage.parser(binmsg) - eq_(msg.to_jsondict(), msg2.to_jsondict()) - eq_(rest, b'') - - def test_peer_up_notification(self): - opt_param = [bgp.BGPOptParamCapabilityUnknown(cap_code=200, - cap_value=b'hoge'), - bgp.BGPOptParamCapabilityRouteRefresh(), - bgp.BGPOptParamCapabilityMultiprotocol( - afi=afi.IP, safi=safi.MPLS_VPN)] - open_message = bgp.BGPOpen(my_as=40000, bgp_identifier='192.0.2.2', - opt_param=opt_param) - msg = bmp.BMPPeerUpNotification(local_address='192.0.2.2', - local_port=179, - remote_port=11089, - sent_open_message=open_message, - received_open_message=open_message, - peer_type=bmp.BMP_PEER_TYPE_GLOBAL, - is_post_policy=True, - peer_distinguisher=0, - peer_address='192.0.2.1', - peer_as=30000, - peer_bgp_id='192.0.2.1', - timestamp=self._time()) - binmsg = msg.serialize() - msg2, rest = bmp.BMPMessage.parser(binmsg) - eq_(msg.to_jsondict(), msg2.to_jsondict()) - eq_(rest, b'') - - def test_initiation(self): - initiation_info = [{'type': bmp.BMP_INIT_TYPE_STRING, - 'value': u'This is Ryu BGP BMP message'}] - msg = bmp.BMPInitiation(info=initiation_info) - binmsg = msg.serialize() - msg2, rest = bmp.BMPMessage.parser(binmsg) - eq_(msg.to_jsondict(lambda v: v), msg2.to_jsondict(lambda v: v)) - eq_(rest, b'') - - def test_termination(self): - termination_info = [{'type': bmp.BMP_TERM_TYPE_STRING, - 'value': u'Session administatively closed'}, - {'type': bmp.BMP_TERM_TYPE_REASON, - 'value': bmp.BMP_TERM_REASON_ADMIN}] - msg = bmp.BMPTermination(info=termination_info) - binmsg = msg.serialize() - msg2, rest = bmp.BMPMessage.parser(binmsg) - eq_(msg.to_jsondict(lambda v: v), msg2.to_jsondict(lambda v: v)) - eq_(rest, b'') diff --git a/tests/unit/packet/test_bpdu.py b/tests/unit/packet/test_bpdu.py deleted file mode 100644 index 1ef8cf58..00000000 --- a/tests/unit/packet/test_bpdu.py +++ /dev/null @@ -1,469 +0,0 @@ -# Copyright (C) 2013 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. - -# vim: tabstop=4 shiftwidth=4 softtabstop=4 - -import unittest -import logging -import struct - -from nose.tools import eq_ -from ryu.lib.packet import bpdu - - -LOG = logging.getLogger(__name__) - - -class Test_ConfigurationBPDUs(unittest.TestCase): - """ Test case for ConfigurationBPDUs - """ - - def setUp(self): - self.protocol_id = bpdu.PROTOCOL_IDENTIFIER - self.version_id = bpdu.ConfigurationBPDUs.VERSION_ID - self.bpdu_type = bpdu.ConfigurationBPDUs.BPDU_TYPE - self.flags = 0b00000001 - self.root_priority = 4096 - self.root_system_id_extension = 1 - self.root_mac_address = '12:34:56:78:9a:bc' - self.root_path_cost = 2 - self.bridge_priority = 8192 - self.bridge_system_id_extension = 3 - self.bridge_mac_address = 'aa:aa:aa:aa:aa:aa' - self.port_priority = 16 - self.port_number = 4 - self.message_age = 5 - self.max_age = 6 - self.hello_time = 7 - self.forward_delay = 8 - - self.msg = bpdu.ConfigurationBPDUs( - flags=self.flags, - root_priority=self.root_priority, - root_system_id_extension=self.root_system_id_extension, - root_mac_address=self.root_mac_address, - root_path_cost=self.root_path_cost, - bridge_priority=self.bridge_priority, - bridge_system_id_extension=self.bridge_system_id_extension, - bridge_mac_address=self.bridge_mac_address, - port_priority=self.port_priority, - port_number=self.port_number, - message_age=self.message_age, - max_age=self.max_age, - hello_time=self.hello_time, - forward_delay=self.forward_delay) - - self.fmt = (bpdu.bpdu._PACK_STR - + bpdu.ConfigurationBPDUs._PACK_STR[1:]) - self.buf = struct.pack(self.fmt, - self.protocol_id, self.version_id, - self.bpdu_type, self.flags, - bpdu.ConfigurationBPDUs.encode_bridge_id( - self.root_priority, - self.root_system_id_extension, - self.root_mac_address), - self.root_path_cost, - bpdu.ConfigurationBPDUs.encode_bridge_id( - self.bridge_priority, - self.bridge_system_id_extension, - self.bridge_mac_address), - bpdu.ConfigurationBPDUs.encode_port_id( - self.port_priority, - self.port_number), - bpdu.ConfigurationBPDUs._encode_timer( - self.message_age), - bpdu.ConfigurationBPDUs._encode_timer( - self.max_age), - bpdu.ConfigurationBPDUs._encode_timer( - self.hello_time), - bpdu.ConfigurationBPDUs._encode_timer( - self.forward_delay)) - - def test_init(self): - eq_(self.protocol_id, self.msg._protocol_id) - eq_(self.version_id, self.msg._version_id) - eq_(self.bpdu_type, self.msg._bpdu_type) - eq_(self.flags, self.msg.flags) - eq_(self.root_priority, self.msg.root_priority) - eq_(self.root_system_id_extension, - self.msg.root_system_id_extension) - eq_(self.root_mac_address, self.msg.root_mac_address) - eq_(self.root_path_cost, self.msg.root_path_cost) - eq_(self.bridge_priority, self.msg.bridge_priority) - eq_(self.bridge_system_id_extension, - self.msg.bridge_system_id_extension) - eq_(self.bridge_mac_address, self.msg.bridge_mac_address) - eq_(self.port_priority, self.msg.port_priority) - eq_(self.port_number, self.msg.port_number) - eq_(self.message_age, self.msg.message_age) - eq_(self.max_age, self.msg.max_age) - eq_(self.hello_time, self.msg.hello_time) - eq_(self.forward_delay, self.msg.forward_delay) - - def test_parser(self): - r1, r2, _ = bpdu.bpdu.parser(self.buf) - - eq_(type(r1), type(self.msg)) - eq_(r1._protocol_id, self.protocol_id) - eq_(r1._version_id, self.version_id) - eq_(r1._bpdu_type, self.bpdu_type) - eq_(r1.flags, self.flags) - eq_(r1.root_priority, self.root_priority) - eq_(r1.root_system_id_extension, self.root_system_id_extension) - eq_(r1.root_mac_address, self.root_mac_address) - eq_(r1.root_path_cost, self.root_path_cost) - eq_(r1.bridge_priority, self.bridge_priority) - eq_(r1.bridge_system_id_extension, self.bridge_system_id_extension) - eq_(r1.bridge_mac_address, self.bridge_mac_address) - eq_(r1.port_priority, self.port_priority) - eq_(r1.port_number, self.port_number) - eq_(r1.message_age, self.message_age) - eq_(r1.max_age, self.max_age) - eq_(r1.hello_time, self.hello_time) - eq_(r1.forward_delay, self.forward_delay) - eq_(r2, None) - - def test_serialize(self): - data = bytearray() - prev = None - buf = self.msg.serialize(data, prev) - res = struct.unpack(self.fmt, buf) - - eq_(res[0], self.protocol_id) - eq_(res[1], self.version_id) - eq_(res[2], self.bpdu_type) - eq_(res[3], self.flags) - eq_(bpdu.ConfigurationBPDUs._decode_bridge_id(res[4]), - (self.root_priority, - self.root_system_id_extension, - self.root_mac_address)) - eq_(res[5], self.root_path_cost) - eq_(bpdu.ConfigurationBPDUs._decode_bridge_id(res[6]), - (self.bridge_priority, - self.bridge_system_id_extension, - self.bridge_mac_address)) - eq_(bpdu.ConfigurationBPDUs._decode_port_id(res[7]), - (self.port_priority, - self.port_number)) - eq_(bpdu.ConfigurationBPDUs._decode_timer(res[8]), self.message_age) - eq_(bpdu.ConfigurationBPDUs._decode_timer(res[9]), self.max_age) - eq_(bpdu.ConfigurationBPDUs._decode_timer(res[10]), self.hello_time) - eq_(bpdu.ConfigurationBPDUs._decode_timer(res[11]), self.forward_delay) - - def test_json(self): - jsondict = self.msg.to_jsondict() - msg = bpdu.ConfigurationBPDUs.from_jsondict( - jsondict['ConfigurationBPDUs']) - eq_(str(self.msg), str(msg)) - - -class Test_TopologyChangeNotificationBPDUs(unittest.TestCase): - """ Test case for TopologyChangeNotificationBPDUs - """ - - def setUp(self): - self.protocol_id = bpdu.PROTOCOL_IDENTIFIER - self.version_id = bpdu.TopologyChangeNotificationBPDUs.VERSION_ID - self.bpdu_type = bpdu.TopologyChangeNotificationBPDUs.BPDU_TYPE - - self.msg = bpdu.TopologyChangeNotificationBPDUs() - - self.fmt = bpdu.bpdu._PACK_STR - self.buf = struct.pack(self.fmt, - self.protocol_id, - self.version_id, - self.bpdu_type) - - def test_init(self): - eq_(self.protocol_id, self.msg._protocol_id) - eq_(self.version_id, self.msg._version_id) - eq_(self.bpdu_type, self.msg._bpdu_type) - - def test_parser(self): - r1, r2, _ = bpdu.bpdu.parser(self.buf) - - eq_(type(r1), type(self.msg)) - eq_(r1._protocol_id, self.protocol_id) - eq_(r1._version_id, self.version_id) - eq_(r1._bpdu_type, self.bpdu_type) - eq_(r2, None) - - def test_serialize(self): - data = bytearray() - prev = None - buf = self.msg.serialize(data, prev) - res = struct.unpack(self.fmt, buf) - - eq_(res[0], self.protocol_id) - eq_(res[1], self.version_id) - eq_(res[2], self.bpdu_type) - - def test_json(self): - jsondict = self.msg.to_jsondict() - msg = bpdu.TopologyChangeNotificationBPDUs.from_jsondict( - jsondict['TopologyChangeNotificationBPDUs']) - eq_(str(self.msg), str(msg)) - - -class Test_RstBPDUs(unittest.TestCase): - """ Test case for RstBPDUs - """ - - def setUp(self): - self.protocol_id = bpdu.PROTOCOL_IDENTIFIER - self.version_id = bpdu.RstBPDUs.VERSION_ID - self.bpdu_type = bpdu.RstBPDUs.BPDU_TYPE - self.flags = 0b01111110 - self.root_priority = 4096 - self.root_system_id_extension = 1 - self.root_mac_address = '12:34:56:78:9a:bc' - self.root_path_cost = 2 - self.bridge_priority = 8192 - self.bridge_system_id_extension = 3 - self.bridge_mac_address = 'aa:aa:aa:aa:aa:aa' - self.port_priority = 16 - self.port_number = 4 - self.message_age = 5 - self.max_age = 6 - self.hello_time = 7 - self.forward_delay = 8 - self.version_1_length = bpdu.VERSION_1_LENGTH - - self.msg = bpdu.RstBPDUs( - flags=self.flags, - root_priority=self.root_priority, - root_system_id_extension=self.root_system_id_extension, - root_mac_address=self.root_mac_address, - root_path_cost=self.root_path_cost, - bridge_priority=self.bridge_priority, - bridge_system_id_extension=self.bridge_system_id_extension, - bridge_mac_address=self.bridge_mac_address, - port_priority=self.port_priority, - port_number=self.port_number, - message_age=self.message_age, - max_age=self.max_age, - hello_time=self.hello_time, - forward_delay=self.forward_delay) - - self.fmt = (bpdu.bpdu._PACK_STR - + bpdu.ConfigurationBPDUs._PACK_STR[1:] - + bpdu.RstBPDUs._PACK_STR[1:]) - self.buf = struct.pack(self.fmt, - self.protocol_id, self.version_id, - self.bpdu_type, self.flags, - bpdu.RstBPDUs.encode_bridge_id( - self.root_priority, - self.root_system_id_extension, - self.root_mac_address), - self.root_path_cost, - bpdu.RstBPDUs.encode_bridge_id( - self.bridge_priority, - self.bridge_system_id_extension, - self.bridge_mac_address), - bpdu.RstBPDUs.encode_port_id( - self.port_priority, - self.port_number), - bpdu.RstBPDUs._encode_timer(self.message_age), - bpdu.RstBPDUs._encode_timer(self.max_age), - bpdu.RstBPDUs._encode_timer(self.hello_time), - bpdu.RstBPDUs._encode_timer(self.forward_delay), - self.version_1_length) - - def test_init(self): - eq_(self.protocol_id, self.msg._protocol_id) - eq_(self.version_id, self.msg._version_id) - eq_(self.bpdu_type, self.msg._bpdu_type) - eq_(self.flags, self.msg.flags) - eq_(self.root_priority, self.msg.root_priority) - eq_(self.root_system_id_extension, - self.msg.root_system_id_extension) - eq_(self.root_mac_address, self.msg.root_mac_address) - eq_(self.root_path_cost, self.msg.root_path_cost) - eq_(self.bridge_priority, self.msg.bridge_priority) - eq_(self.bridge_system_id_extension, - self.msg.bridge_system_id_extension) - eq_(self.bridge_mac_address, self.msg.bridge_mac_address) - eq_(self.port_priority, self.msg.port_priority) - eq_(self.port_number, self.msg.port_number) - eq_(self.message_age, self.msg.message_age) - eq_(self.max_age, self.msg.max_age) - eq_(self.hello_time, self.msg.hello_time) - eq_(self.forward_delay, self.msg.forward_delay) - eq_(self.version_1_length, self.msg._version_1_length) - - def test_parser(self): - r1, r2, _ = bpdu.bpdu.parser(self.buf) - - eq_(type(r1), type(self.msg)) - eq_(r1._protocol_id, self.protocol_id) - eq_(r1._version_id, self.version_id) - eq_(r1._bpdu_type, self.bpdu_type) - eq_(r1.flags, self.flags) - eq_(r1.root_priority, self.root_priority) - eq_(r1.root_system_id_extension, self.root_system_id_extension) - eq_(r1.root_mac_address, self.root_mac_address) - eq_(r1.root_path_cost, self.root_path_cost) - eq_(r1.bridge_priority, self.bridge_priority) - eq_(r1.bridge_system_id_extension, self.bridge_system_id_extension) - eq_(r1.bridge_mac_address, self.bridge_mac_address) - eq_(r1.port_priority, self.port_priority) - eq_(r1.port_number, self.port_number) - eq_(r1.message_age, self.message_age) - eq_(r1.max_age, self.max_age) - eq_(r1.hello_time, self.hello_time) - eq_(r1.forward_delay, self.forward_delay) - eq_(r1._version_1_length, self.version_1_length) - eq_(r2, None) - - def test_serialize(self): - data = bytearray() - prev = None - buf = self.msg.serialize(data, prev) - res = struct.unpack(self.fmt, buf) - - eq_(res[0], self.protocol_id) - eq_(res[1], self.version_id) - eq_(res[2], self.bpdu_type) - eq_(res[3], self.flags) - eq_(bpdu.RstBPDUs._decode_bridge_id(res[4]), - (self.root_priority, - self.root_system_id_extension, - self.root_mac_address)) - eq_(res[5], self.root_path_cost) - eq_(bpdu.RstBPDUs._decode_bridge_id(res[6]), - (self.bridge_priority, - self.bridge_system_id_extension, - self.bridge_mac_address)) - eq_(bpdu.RstBPDUs._decode_port_id(res[7]), - (self.port_priority, - self.port_number)) - eq_(bpdu.RstBPDUs._decode_timer(res[8]), self.message_age) - eq_(bpdu.RstBPDUs._decode_timer(res[9]), self.max_age) - eq_(bpdu.RstBPDUs._decode_timer(res[10]), self.hello_time) - eq_(bpdu.RstBPDUs._decode_timer(res[11]), self.forward_delay) - eq_(res[12], self.version_1_length) - - def test_json(self): - jsondict = self.msg.to_jsondict() - msg = bpdu.RstBPDUs.from_jsondict(jsondict['RstBPDUs']) - eq_(str(self.msg), str(msg)) - - -class Test_UnknownVersion(unittest.TestCase): - """ Test case for unknown BPDU version - """ - - def setUp(self): - self.protocol_id = bpdu.PROTOCOL_IDENTIFIER - self.version_id = 111 # Unknown version - self.bpdu_type = bpdu.RstBPDUs.BPDU_TYPE - self.flags = 0b01111110 - self.root_priority = 4096 - self.root_system_id_extension = 1 - self.root_mac_address = '12:34:56:78:9a:bc' - self.root_path_cost = 2 - self.bridge_priority = 8192 - self.bridge_system_id_extension = 3 - self.bridge_mac_address = 'aa:aa:aa:aa:aa:aa' - self.port_priority = 16 - self.port_number = 4 - self.message_age = 5 - self.max_age = 6 - self.hello_time = 7 - self.forward_delay = 8 - self.version_1_length = bpdu.VERSION_1_LENGTH - - self.fmt = (bpdu.bpdu._PACK_STR - + bpdu.ConfigurationBPDUs._PACK_STR[1:] - + bpdu.RstBPDUs._PACK_STR[1:]) - self.buf = struct.pack(self.fmt, - self.protocol_id, self.version_id, - self.bpdu_type, self.flags, - bpdu.RstBPDUs.encode_bridge_id( - self.root_priority, - self.root_system_id_extension, - self.root_mac_address), - self.root_path_cost, - bpdu.RstBPDUs.encode_bridge_id( - self.bridge_priority, - self.bridge_system_id_extension, - self.bridge_mac_address), - bpdu.RstBPDUs.encode_port_id( - self.port_priority, - self.port_number), - bpdu.RstBPDUs._encode_timer(self.message_age), - bpdu.RstBPDUs._encode_timer(self.max_age), - bpdu.RstBPDUs._encode_timer(self.hello_time), - bpdu.RstBPDUs._encode_timer(self.forward_delay), - self.version_1_length) - - def test_parser(self): - r1, r2, _ = bpdu.bpdu.parser(self.buf) - eq_(r1, self.buf) - eq_(r2, None) - - -class Test_UnknownType(unittest.TestCase): - """ Test case for unknown BPDU type - """ - - def setUp(self): - self.protocol_id = bpdu.PROTOCOL_IDENTIFIER - self.version_id = bpdu.RstBPDUs.VERSION_ID - self.bpdu_type = 222 # Unknown type - self.flags = 0b01111110 - self.root_priority = 4096 - self.root_system_id_extension = 1 - self.root_mac_address = '12:34:56:78:9a:bc' - self.root_path_cost = 2 - self.bridge_priority = 8192 - self.bridge_system_id_extension = 3 - self.bridge_mac_address = 'aa:aa:aa:aa:aa:aa' - self.port_priority = 16 - self.port_number = 4 - self.message_age = 5 - self.max_age = 6 - self.hello_time = 7 - self.forward_delay = 8 - self.version_1_length = bpdu.VERSION_1_LENGTH - - self.fmt = (bpdu.bpdu._PACK_STR - + bpdu.ConfigurationBPDUs._PACK_STR[1:] - + bpdu.RstBPDUs._PACK_STR[1:]) - self.buf = struct.pack(self.fmt, - self.protocol_id, self.version_id, - self.bpdu_type, self.flags, - bpdu.RstBPDUs.encode_bridge_id( - self.root_priority, - self.root_system_id_extension, - self.root_mac_address), - self.root_path_cost, - bpdu.RstBPDUs.encode_bridge_id( - self.bridge_priority, - self.bridge_system_id_extension, - self.bridge_mac_address), - bpdu.RstBPDUs.encode_port_id( - self.port_priority, - self.port_number), - bpdu.RstBPDUs._encode_timer(self.message_age), - bpdu.RstBPDUs._encode_timer(self.max_age), - bpdu.RstBPDUs._encode_timer(self.hello_time), - bpdu.RstBPDUs._encode_timer(self.forward_delay), - self.version_1_length) - - def test_parser(self): - r1, r2, _ = bpdu.bpdu.parser(self.buf) - eq_(r1, self.buf) - eq_(r2, None) diff --git a/tests/unit/packet/test_cfm.py b/tests/unit/packet/test_cfm.py deleted file mode 100644 index fb0749d7..00000000 --- a/tests/unit/packet/test_cfm.py +++ /dev/null @@ -1,1761 +0,0 @@ -# Copyright (C) 2013 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 logging -import inspect -import six -import struct - -from nose.tools import * -from ryu.lib import addrconv -from ryu.lib.packet import cfm - -LOG = logging.getLogger(__name__) - - -class Test_cfm(unittest.TestCase): - - def setUp(self): - self.message = cfm.cc_message() - self.ins = cfm.cfm(self.message) - data = bytearray() - prev = None - self.buf = self.ins.serialize(data, prev) - - def setUp_cc_message(self): - self.cc_message_md_lv = 1 - self.cc_message_version = 1 - self.cc_message_rdi = 1 - self.cc_message_interval = 1 - self.cc_message_seq_num = 123 - self.cc_message_mep_id = 4 - self.cc_message_md_name_format = 4 - self.cc_message_md_name_length = 0 - self.cc_message_md_name = b"hoge" - self.cc_message_short_ma_name_format = 2 - self.cc_message_short_ma_name_length = 0 - self.cc_message_short_ma_name = b"pakeratta" - self.cc_message_md_name_txfcf = 11 - self.cc_message_md_name_rxfcb = 22 - self.cc_message_md_name_txfcb = 33 - self.cc_message_tlvs = [ - cfm.sender_id_tlv(), - cfm.port_status_tlv(), - cfm.data_tlv(), - cfm.interface_status_tlv(), - cfm.reply_ingress_tlv(), - cfm.reply_egress_tlv(), - cfm.ltm_egress_identifier_tlv(), - cfm.ltr_egress_identifier_tlv(), - cfm.organization_specific_tlv(), - ] - self.message = cfm.cc_message( - self.cc_message_md_lv, - self.cc_message_version, - self.cc_message_rdi, - self.cc_message_interval, - self.cc_message_seq_num, - self.cc_message_mep_id, - self.cc_message_md_name_format, - self.cc_message_md_name_length, - self.cc_message_md_name, - self.cc_message_short_ma_name_format, - self.cc_message_short_ma_name_length, - self.cc_message_short_ma_name, - self.cc_message_tlvs - ) - self.ins = cfm.cfm(self.message) - data = bytearray() - prev = None - self.buf = self.ins.serialize(data, prev) - - def setUp_loopback_message(self): - self.loopback_message_md_lv = 1 - self.loopback_message_version = 1 - self.loopback_message_transaction_id = 12345 - self.loopback_message_tlvs = [ - cfm.sender_id_tlv(), - cfm.port_status_tlv(), - cfm.data_tlv(), - cfm.interface_status_tlv(), - cfm.reply_ingress_tlv(), - cfm.reply_egress_tlv(), - cfm.ltm_egress_identifier_tlv(), - cfm.ltr_egress_identifier_tlv(), - cfm.organization_specific_tlv(), - ] - self.message = cfm.loopback_message( - self.loopback_message_md_lv, - self.loopback_message_version, - self.loopback_message_transaction_id, - self.loopback_message_tlvs) - self.ins = cfm.cfm(self.message) - data = bytearray() - prev = None - self.buf = self.ins.serialize(data, prev) - - def setUp_loopback_reply(self): - self.loopback_reply_md_lv = 1 - self.loopback_reply_version = 1 - self.loopback_reply_transaction_id = 12345 - self.loopback_reply_tlvs = [ - cfm.sender_id_tlv(), - cfm.port_status_tlv(), - cfm.data_tlv(), - cfm.interface_status_tlv(), - cfm.reply_ingress_tlv(), - cfm.reply_egress_tlv(), - cfm.ltm_egress_identifier_tlv(), - cfm.ltr_egress_identifier_tlv(), - cfm.organization_specific_tlv(), - ] - self.message = cfm.loopback_reply( - self.loopback_reply_md_lv, - self.loopback_reply_version, - self.loopback_reply_transaction_id, - self.loopback_reply_tlvs) - self.ins = cfm.cfm(self.message) - data = bytearray() - prev = None - self.buf = self.ins.serialize(data, prev) - - def setUp_link_trace_message(self): - self.link_trace_message_md_lv = 1 - self.link_trace_message_version = 1 - self.link_trace_message_use_fdb_only = 1 - self.link_trace_message_transaction_id = 12345 - self.link_trace_message_ttl = 123 - self.link_trace_message_ltm_orig_addr = '11:22:33:44:55:66' - self.link_trace_message_ltm_targ_addr = '77:88:99:aa:cc:dd' - self.link_trace_message_tlvs = [ - cfm.sender_id_tlv(), - cfm.port_status_tlv(), - cfm.data_tlv(), - cfm.interface_status_tlv(), - cfm.reply_ingress_tlv(), - cfm.reply_egress_tlv(), - cfm.ltm_egress_identifier_tlv(), - cfm.ltr_egress_identifier_tlv(), - cfm.organization_specific_tlv(), - ] - self.message = cfm.link_trace_message( - self.link_trace_message_md_lv, - self.link_trace_message_version, - self.link_trace_message_use_fdb_only, - self.link_trace_message_transaction_id, - self.link_trace_message_ttl, - self.link_trace_message_ltm_orig_addr, - self.link_trace_message_ltm_targ_addr, - self.link_trace_message_tlvs) - self.ins = cfm.cfm(self.message) - data = bytearray() - prev = None - self.buf = self.ins.serialize(data, prev) - - def setUp_link_trace_reply(self): - self.link_trace_reply_md_lv = 1 - self.link_trace_reply_version = 1 - self.link_trace_reply_use_fdb_only = 1 - self.link_trace_reply_fwd_yes = 0 - self.link_trace_reply_terminal_mep = 1 - self.link_trace_reply_transaction_id = 5432 - self.link_trace_reply_ttl = 123 - self.link_trace_reply_relay_action = 3 - self.link_trace_reply_tlvs = [ - cfm.sender_id_tlv(), - cfm.port_status_tlv(), - cfm.data_tlv(), - cfm.interface_status_tlv(), - cfm.reply_ingress_tlv(), - cfm.reply_egress_tlv(), - cfm.ltm_egress_identifier_tlv(), - cfm.ltr_egress_identifier_tlv(), - cfm.organization_specific_tlv(), - ] - self.message = cfm.link_trace_reply( - self.link_trace_reply_md_lv, - self.link_trace_reply_version, - self.link_trace_reply_use_fdb_only, - self.link_trace_reply_fwd_yes, - self.link_trace_reply_terminal_mep, - self.link_trace_reply_transaction_id, - self.link_trace_reply_ttl, - self.link_trace_reply_relay_action, - self.link_trace_reply_tlvs) - self.ins = cfm.cfm(self.message) - data = bytearray() - prev = None - self.buf = self.ins.serialize(data, prev) - - def tearDown(self): - pass - - def test_init(self): - eq_(str(self.message), str(self.ins.op)) - - def test_init_cc_message(self): - self.setUp_cc_message() - self.test_init() - - def test_init_loopback_message(self): - self.setUp_loopback_message() - self.test_init() - - def test_init_loopback_reply(self): - self.setUp_loopback_reply() - self.test_init() - - def test_init_link_trace_message(self): - self.setUp_link_trace_message() - self.test_init() - - def test_init_link_trace_reply(self): - self.setUp_link_trace_reply() - self.test_init() - - def test_parser(self): - _res = self.ins.parser(six.binary_type(self.buf)) - - if type(_res) is tuple: - res = _res[0] - else: - res = _res - eq_(str(self.message), str(res.op)) - - def test_parser_with_cc_message(self): - self.setUp_cc_message() - self.test_parser() - - def test_parser_with_loopback_message(self): - self.setUp_loopback_message() - self.test_parser() - - def test_parser_with_loopback_reply(self): - self.setUp_loopback_reply() - self.test_parser() - - def test_parser_with_link_trace_message(self): - self.setUp_link_trace_message() - self.test_parser() - - def test_parser_with_link_trace_reply(self): - self.setUp_link_trace_reply() - self.test_parser() - - def test_serialize(self): - pass - - def test_serialize_with_cc_message(self): - self.setUp_cc_message() - self.test_serialize() - data = bytearray() - prev = None - buf = self.ins.serialize(data, prev) - cc_message = cfm.cc_message.parser(six.binary_type(buf)) - eq_(repr(self.message), repr(cc_message)) - - def test_serialize_with_loopback_message(self): - self.setUp_loopback_message() - self.test_serialize() - data = bytearray() - prev = None - buf = self.ins.serialize(data, prev) - loopback_message = cfm.loopback_message.parser(six.binary_type(buf)) - eq_(repr(self.message), repr(loopback_message)) - - def test_serialize_with_loopback_reply(self): - self.setUp_loopback_reply() - self.test_serialize() - data = bytearray() - prev = None - buf = self.ins.serialize(data, prev) - loopback_reply = cfm.loopback_reply.parser(six.binary_type(buf)) - eq_(repr(self.message), repr(loopback_reply)) - - def test_serialize_with_link_trace_message(self): - self.setUp_link_trace_message() - self.test_serialize() - data = bytearray() - prev = None - buf = self.ins.serialize(data, prev) - link_trace_message = cfm.link_trace_message.parser(six.binary_type(buf)) - eq_(repr(self.message), repr(link_trace_message)) - - def test_serialize_with_link_trace_reply(self): - self.setUp_link_trace_reply() - self.test_serialize() - data = bytearray() - prev = None - buf = self.ins.serialize(data, prev) - link_trace_reply = cfm.link_trace_reply.parser(six.binary_type(buf)) - eq_(repr(self.message), repr(link_trace_reply)) - - def test_to_string(self): - cfm_values = {'op': self.message} - _cfm_str = ','.join(['%s=%s' % (k, cfm_values[k]) - for k, v in inspect.getmembers(self.ins) - if k in cfm_values]) - cfm_str = '%s(%s)' % (cfm.cfm.__name__, _cfm_str) - eq_(str(self.ins), cfm_str) - eq_(repr(self.ins), cfm_str) - - def test_to_string_cc_message(self): - self.setUp_cc_message() - self.test_to_string() - - def test_to_string_loopback_message(self): - self.setUp_loopback_message() - self.test_to_string() - - def test_to_string_loopback_reply(self): - self.setUp_loopback_reply() - self.test_to_string() - - def test_to_string_link_trace_message(self): - self.setUp_link_trace_message() - self.test_to_string() - - def test_to_string_link_trace_reply(self): - self.setUp_link_trace_reply() - self.test_to_string() - - def test_len(self): - pass - - def test_len_cc_message(self): - self.setUp_cc_message() - eq_(len(self.ins), 0 + len(self.message)) - - def test_len_loopback_message(self): - self.setUp_loopback_message() - eq_(len(self.ins), 0 + len(self.message)) - - def test_len_loopback_reply(self): - self.setUp_loopback_reply() - eq_(len(self.ins), 0 + len(self.message)) - - def test_len_link_trace_message(self): - self.setUp_link_trace_message() - eq_(len(self.ins), 0 + len(self.message)) - - def test_len_link_trace_reply(self): - self.setUp_link_trace_reply() - eq_(len(self.ins), 0 + len(self.message)) - - def test_default_args(self): - pass - - def test_json(self): - jsondict = self.ins.to_jsondict() - ins = cfm.cfm.from_jsondict(jsondict['cfm']) - eq_(str(self.ins), str(ins)) - - def test_json_with_cc_message(self): - self.setUp_cc_message() - self.test_json() - - def test_json_with_loopback_message(self): - self.setUp_loopback_message() - self.test_json() - - def test_json_with_loopback_reply(self): - self.setUp_loopback_reply() - self.test_json() - - def test_json_with_link_trace_message(self): - self.setUp_link_trace_message() - self.test_json() - - def test_json_with_link_trace_reply(self): - self.setUp_link_trace_reply() - self.test_json() - - -class Test_cc_message(unittest.TestCase): - - def setUp(self): - self.md_lv = 1 - self.version = 1 - self.opcode = cfm.CFM_CC_MESSAGE - self.rdi = 1 - self.interval = 5 - self.first_tlv_offset = cfm.cc_message._TLV_OFFSET - self.seq_num = 2 - self.mep_id = 2 - self.md_name_format = cfm.cc_message._MD_FMT_CHARACTER_STRING - self.md_name_length = 3 - self.md_name = b"foo" - self.short_ma_name_format = 2 - self.short_ma_name_length = 8 - self.short_ma_name = b"hogehoge" - self.tlvs = [ - ] - self.end_tlv = 0 - self.ins = cfm.cc_message( - self.md_lv, - self.version, - self.rdi, - self.interval, - self.seq_num, - self.mep_id, - self.md_name_format, - self.md_name_length, - self.md_name, - self.short_ma_name_format, - self.short_ma_name_length, - self.short_ma_name, - self.tlvs - ) - - self.form = '!4BIH2B3s2B8s33x12x4xB' - self.buf = struct.pack( - self.form, - (self.md_lv << 5) | self.version, - self.opcode, - (self.rdi << 7) | self.interval, - self.first_tlv_offset, - self.seq_num, - self.mep_id, - self.md_name_format, - self.md_name_length, - self.md_name, - self.short_ma_name_format, - self.short_ma_name_length, - self.short_ma_name, - self.end_tlv - ) - - def tearDown(self): - pass - - def test_init(self): - eq_(self.md_lv, self.ins.md_lv) - eq_(self.version, self.ins.version) - eq_(self.rdi, self.ins.rdi) - eq_(self.interval, self.ins.interval) - eq_(self.seq_num, self.ins.seq_num) - eq_(self.mep_id, self.ins.mep_id) - eq_(self.md_name_format, self.ins.md_name_format) - eq_(self.md_name_length, self.ins.md_name_length) - eq_(self.md_name, self.ins.md_name) - eq_(self.short_ma_name_format, self.ins.short_ma_name_format) - eq_(self.short_ma_name_length, self.ins.short_ma_name_length) - eq_(self.short_ma_name, self.ins.short_ma_name) - eq_(self.tlvs, self.ins.tlvs) - - def test_parser(self): - _res = cfm.cc_message.parser(self.buf) - if type(_res) is tuple: - res = _res[0] - else: - res = _res - eq_(self.md_lv, res.md_lv) - eq_(self.version, res.version) - eq_(self.rdi, res.rdi) - eq_(self.interval, res.interval) - eq_(self.seq_num, res.seq_num) - eq_(self.mep_id, res.mep_id) - eq_(self.md_name_format, res.md_name_format) - eq_(self.md_name_length, res.md_name_length) - eq_(self.md_name, res.md_name) - eq_(self.short_ma_name_format, res.short_ma_name_format) - eq_(self.short_ma_name_length, res.short_ma_name_length) - eq_(self.short_ma_name, res.short_ma_name) - eq_(self.tlvs, res.tlvs) - - def test_parser_with_no_maintenance_domain_name_present(self): - form = '!4BIH3B8s37x12x4xB' - buf = struct.pack( - form, - (self.md_lv << 5) | self.version, - self.opcode, - (self.rdi << 7) | self.interval, - self.first_tlv_offset, - self.seq_num, - self.mep_id, - cfm.cc_message._MD_FMT_NO_MD_NAME_PRESENT, - self.short_ma_name_format, - self.short_ma_name_length, - self.short_ma_name, - self.end_tlv - ) - _res = cfm.cc_message.parser(buf) - if type(_res) is tuple: - res = _res[0] - else: - res = _res - eq_(self.md_lv, res.md_lv) - eq_(self.version, res.version) - eq_(self.rdi, res.rdi) - eq_(self.interval, res.interval) - eq_(self.seq_num, res.seq_num) - eq_(self.mep_id, res.mep_id) - eq_(cfm.cc_message._MD_FMT_NO_MD_NAME_PRESENT, res.md_name_format) - eq_(self.short_ma_name_format, res.short_ma_name_format) - eq_(self.short_ma_name_length, res.short_ma_name_length) - eq_(self.short_ma_name, res.short_ma_name) - eq_(self.tlvs, res.tlvs) - - def test_serialize(self): - buf = self.ins.serialize() - res = struct.unpack_from(self.form, six.binary_type(buf)) - eq_(self.md_lv, res[0] >> 5) - eq_(self.version, res[0] & 0x1f) - eq_(self.opcode, res[1]) - eq_(self.rdi, res[2] >> 7) - eq_(self.interval, res[2] & 0x07) - eq_(self.first_tlv_offset, res[3]) - eq_(self.seq_num, res[4]) - eq_(self.mep_id, res[5]) - eq_(self.md_name_format, res[6]) - eq_(self.md_name_length, res[7]) - eq_(self.md_name, res[8]) - eq_(self.short_ma_name_format, res[9]) - eq_(self.short_ma_name_length, res[10]) - eq_(self.short_ma_name, res[11]) - eq_(self.end_tlv, res[12]) - - def test_serialize_with_md_name_length_zero(self): - ins = cfm.cc_message( - self.md_lv, - self.version, - self.rdi, - self.interval, - self.seq_num, - self.mep_id, - self.md_name_format, - 0, - self.md_name, - self.short_ma_name_format, - 0, - self.short_ma_name, - self.tlvs - ) - buf = ins.serialize() - res = struct.unpack_from(self.form, six.binary_type(buf)) - eq_(self.md_lv, res[0] >> 5) - eq_(self.version, res[0] & 0x1f) - eq_(self.opcode, res[1]) - eq_(self.rdi, res[2] >> 7) - eq_(self.interval, res[2] & 0x07) - eq_(self.first_tlv_offset, res[3]) - eq_(self.seq_num, res[4]) - eq_(self.mep_id, res[5]) - eq_(self.md_name_format, res[6]) - eq_(self.md_name_length, res[7]) - eq_(self.md_name, res[8]) - eq_(self.short_ma_name_format, res[9]) - eq_(self.short_ma_name_length, res[10]) - eq_(self.short_ma_name, res[11]) - eq_(self.end_tlv, res[12]) - - def test_serialize_with_no_maintenance_domain_name_present(self): - form = '!4BIH3B8s37x12x4xB' - ins = cfm.cc_message( - self.md_lv, - self.version, - self.rdi, - self.interval, - self.seq_num, - self.mep_id, - cfm.cc_message._MD_FMT_NO_MD_NAME_PRESENT, - 0, - self.md_name, - self.short_ma_name_format, - 0, - self.short_ma_name, - self.tlvs - ) - buf = ins.serialize() - res = struct.unpack_from(form, six.binary_type(buf)) - eq_(self.md_lv, res[0] >> 5) - eq_(self.version, res[0] & 0x1f) - eq_(self.opcode, res[1]) - eq_(self.rdi, res[2] >> 7) - eq_(self.interval, res[2] & 0x07) - eq_(self.first_tlv_offset, res[3]) - eq_(self.seq_num, res[4]) - eq_(self.mep_id, res[5]) - eq_(cfm.cc_message._MD_FMT_NO_MD_NAME_PRESENT, res[6]) - eq_(self.short_ma_name_format, res[7]) - eq_(self.short_ma_name_length, res[8]) - eq_(self.short_ma_name, res[9]) - eq_(self.end_tlv, res[10]) - - def test_len(self): - # 75 octet (If tlv does not exist) - eq_(75, len(self.ins)) - - def test_default_args(self): - ins = cfm.cc_message() - buf = ins.serialize() - res = struct.unpack_from(cfm.cc_message._PACK_STR, six.binary_type(buf)) - eq_(res[0] >> 5, 0) - eq_(res[0] & 0x1f, 0) - eq_(res[1], 1) - eq_(res[2] >> 7, 0) - eq_(res[2] & 0x07, 4) - eq_(res[3], 70) - eq_(res[4], 0) - eq_(res[5], 1) - eq_(res[6], 4) - - -class Test_loopback_message(unittest.TestCase): - - def setUp(self): - self.md_lv = 1 - self.version = 1 - self.opcode = cfm.CFM_LOOPBACK_MESSAGE - self.flags = 0 - self.first_tlv_offset = cfm.loopback_message._TLV_OFFSET - self.transaction_id = 12345 - self.tlvs = [ - ] - - self.end_tlv = 0 - self.ins = cfm.loopback_message( - self.md_lv, - self.version, - self.transaction_id, - self.tlvs, - ) - self.form = '!4BIB' - self.buf = struct.pack( - self.form, - (self.md_lv << 5) | self.version, - self.opcode, - self.flags, - self.first_tlv_offset, - self.transaction_id, - self.end_tlv - ) - - def tearDown(self): - pass - - def test_init(self): - eq_(self.md_lv, self.ins.md_lv) - eq_(self.version, self.ins.version) - eq_(self.transaction_id, self.ins.transaction_id) - eq_(self.tlvs, self.ins.tlvs) - - def test_parser(self): - _res = cfm.loopback_message.parser(self.buf) - if type(_res) is tuple: - res = _res[0] - else: - res = _res - eq_(self.md_lv, res.md_lv) - eq_(self.version, res.version) - eq_(self.transaction_id, res.transaction_id) - eq_(self.tlvs, res.tlvs) - - def test_serialize(self): - buf = self.ins.serialize() - res = struct.unpack_from(self.form, six.binary_type(buf)) - eq_(self.md_lv, res[0] >> 5) - eq_(self.version, res[0] & 0x1f) - eq_(self.opcode, res[1]) - eq_(self.flags, res[2]) - eq_(self.first_tlv_offset, res[3]) - eq_(self.transaction_id, res[4]) - eq_(self.end_tlv, res[5]) - - def test_len(self): - # 9 octet (If tlv does not exist) - eq_(9, len(self.ins)) - - def test_default_args(self): - ins = cfm.loopback_message() - buf = ins.serialize() - res = struct.unpack_from(cfm.loopback_message._PACK_STR, - six.binary_type(buf)) - eq_(res[0] >> 5, 0) - eq_(res[0] & 0x1f, 0) - eq_(res[1], 3) - eq_(res[2], 0) - eq_(res[3], 4) - eq_(res[4], 0) - - -class Test_loopback_reply(unittest.TestCase): - - def setUp(self): - self.md_lv = 1 - self.version = 1 - self.opcode = cfm.CFM_LOOPBACK_REPLY - self.flags = 0 - self.first_tlv_offset = cfm.loopback_reply._TLV_OFFSET - self.transaction_id = 12345 - self.tlvs = [ - ] - self.end_tlv = 0 - self.ins = cfm.loopback_reply( - self.md_lv, - self.version, - self.transaction_id, - self.tlvs, - ) - self.form = '!4BIB' - self.buf = struct.pack( - self.form, - (self.md_lv << 5) | self.version, - self.opcode, - self.flags, - self.first_tlv_offset, - self.transaction_id, - self.end_tlv - ) - - def tearDown(self): - pass - - def test_init(self): - eq_(self.md_lv, self.ins.md_lv) - eq_(self.version, self.ins.version) - eq_(self.transaction_id, self.ins.transaction_id) - eq_(self.tlvs, self.ins.tlvs) - - def test_parser(self): - _res = cfm.loopback_reply.parser(self.buf) - if type(_res) is tuple: - res = _res[0] - else: - res = _res - eq_(self.md_lv, res.md_lv) - eq_(self.version, res.version) - eq_(self.transaction_id, res.transaction_id) - eq_(self.tlvs, res.tlvs) - - def test_serialize(self): - buf = self.ins.serialize() - res = struct.unpack_from(self.form, six.binary_type(buf)) - eq_(self.md_lv, res[0] >> 5) - eq_(self.version, res[0] & 0x1f) - eq_(self.opcode, res[1]) - eq_(self.flags, res[2]) - eq_(self.first_tlv_offset, res[3]) - eq_(self.transaction_id, res[4]) - eq_(self.end_tlv, res[5]) - - def test_len(self): - # 9 octet (If tlv does not exist) - eq_(9, len(self.ins)) - - def test_default_args(self): - ins = cfm.loopback_reply() - buf = ins.serialize() - res = struct.unpack_from(cfm.loopback_reply._PACK_STR, six.binary_type(buf)) - eq_(res[0] >> 5, 0) - eq_(res[0] & 0x1f, 0) - eq_(res[1], 2) - eq_(res[2], 0) - eq_(res[3], 4) - eq_(res[4], 0) - - -class Test_link_trace_message(unittest.TestCase): - - def setUp(self): - self.md_lv = 1 - self.version = 1 - self.opcode = cfm.CFM_LINK_TRACE_MESSAGE - self.use_fdb_only = 1 - self.first_tlv_offset = cfm.link_trace_message._TLV_OFFSET - self.transaction_id = 12345 - self.ttl = 55 - self.ltm_orig_addr = "00:11:22:44:55:66" - self.ltm_targ_addr = "ab:cd:ef:23:12:65" - self.tlvs = [ - ] - - self.end_tlv = 0 - self.ins = cfm.link_trace_message( - self.md_lv, - self.version, - self.use_fdb_only, - self.transaction_id, - self.ttl, - self.ltm_orig_addr, - self.ltm_targ_addr, - self.tlvs - ) - self.form = '!4BIB6s6sB' - self.buf = struct.pack( - self.form, - (self.md_lv << 5) | self.version, - self.opcode, - self.use_fdb_only << 7, - self.first_tlv_offset, - self.transaction_id, - self.ttl, - addrconv.mac.text_to_bin(self.ltm_orig_addr), - addrconv.mac.text_to_bin(self.ltm_targ_addr), - self.end_tlv - ) - - def tearDown(self): - pass - - def test_init(self): - eq_(self.md_lv, self.ins.md_lv) - eq_(self.version, self.ins.version) - eq_(self.use_fdb_only, self.ins.use_fdb_only) - eq_(self.transaction_id, self.ins.transaction_id) - eq_(self.ttl, self.ins.ttl) - eq_(self.ltm_orig_addr, self.ins.ltm_orig_addr) - eq_(self.ltm_targ_addr, self.ins.ltm_targ_addr) - eq_(self.tlvs, self.ins.tlvs) - - def test_parser(self): - _res = cfm.link_trace_message.parser(self.buf) - if type(_res) is tuple: - res = _res[0] - else: - res = _res - eq_(self.md_lv, res.md_lv) - eq_(self.version, res.version) - eq_(self.use_fdb_only, res.use_fdb_only) - eq_(self.transaction_id, res.transaction_id) - eq_(self.ttl, res.ttl) - eq_(self.ltm_orig_addr, res.ltm_orig_addr) - eq_(self.ltm_targ_addr, res.ltm_targ_addr) - eq_(self.tlvs, res.tlvs) - - def test_serialize(self): - buf = self.ins.serialize() - res = struct.unpack_from(self.form, six.binary_type(buf)) - eq_(self.md_lv, res[0] >> 5) - eq_(self.version, res[0] & 0x1f) - eq_(self.opcode, res[1]) - eq_(self.use_fdb_only, res[2] >> 7) - eq_(self.first_tlv_offset, res[3]) - eq_(self.transaction_id, res[4]) - eq_(self.ttl, res[5]) - eq_(addrconv.mac.text_to_bin(self.ltm_orig_addr), res[6]) - eq_(addrconv.mac.text_to_bin(self.ltm_targ_addr), res[7]) - eq_(self.end_tlv, res[8]) - - def test_len(self): - # 22 octet (If tlv does not exist) - eq_(22, len(self.ins)) - - def test_default_args(self): - ins = cfm.link_trace_message() - buf = ins.serialize() - res = struct.unpack_from(cfm.link_trace_message._PACK_STR, six.binary_type(buf)) - eq_(res[0] >> 5, 0) - eq_(res[0] & 0x1f, 0) - eq_(res[1], 5) - eq_(res[2] >> 7, 1) - eq_(res[3], 17) - eq_(res[4], 0) - eq_(res[5], 64) - eq_(res[6], addrconv.mac.text_to_bin('00:00:00:00:00:00')) - eq_(res[7], addrconv.mac.text_to_bin('00:00:00:00:00:00')) - - -class Test_link_trace_reply(unittest.TestCase): - - def setUp(self): - self.md_lv = 1 - self.version = 1 - self.opcode = cfm.CFM_LINK_TRACE_REPLY - self.use_fdb_only = 1 - self.fwd_yes = 0 - self.terminal_mep = 1 - self.first_tlv_offset = cfm.link_trace_reply._TLV_OFFSET - self.transaction_id = 12345 - self.ttl = 55 - self.relay_action = 2 - self.ltm_orig_addr = "00:11:22:aa:bb:cc" - self.ltm_targ_addr = "53:45:24:64:ac:ff" - self.tlvs = [ - ] - self.end_tlv = 0 - self.ins = cfm.link_trace_reply( - self.md_lv, - self.version, - self.use_fdb_only, - self.fwd_yes, - self.terminal_mep, - self.transaction_id, - self.ttl, - self.relay_action, - self.tlvs, - ) - self.form = '!4BIBBB' - self.buf = struct.pack( - self.form, - (self.md_lv << 5) | self.version, - self.opcode, - (self.use_fdb_only << 7) | (self.fwd_yes << 6) | - (self.terminal_mep << 5), - self.first_tlv_offset, - self.transaction_id, - self.ttl, - self.relay_action, - self.end_tlv - ) - - def tearDown(self): - pass - - def test_init(self): - eq_(self.md_lv, self.ins.md_lv) - eq_(self.version, self.ins.version) - eq_(self.use_fdb_only, self.ins.use_fdb_only) - eq_(self.fwd_yes, self.ins.fwd_yes) - eq_(self.terminal_mep, self.ins.terminal_mep) - eq_(self.transaction_id, self.ins.transaction_id) - eq_(self.ttl, self.ins.ttl) - eq_(self.relay_action, self.ins.relay_action) - eq_(self.tlvs, self.ins.tlvs) - - def test_parser(self): - _res = cfm.link_trace_reply.parser(self.buf) - if type(_res) is tuple: - res = _res[0] - else: - res = _res - eq_(self.md_lv, res.md_lv) - eq_(self.version, res.version) - eq_(self.use_fdb_only, self.ins.use_fdb_only) - eq_(self.fwd_yes, self.ins.fwd_yes) - eq_(self.terminal_mep, self.ins.terminal_mep) - eq_(self.transaction_id, res.transaction_id) - eq_(self.ttl, res.ttl) - eq_(self.relay_action, res.relay_action) - eq_(self.tlvs, res.tlvs) - - def test_serialize(self): - buf = self.ins.serialize() - res = struct.unpack_from(self.form, six.binary_type(buf)) - eq_(self.md_lv, res[0] >> 5) - eq_(self.version, res[0] & 0x1f) - eq_(self.opcode, res[1]) - eq_(self.use_fdb_only, res[2] >> 7 & 0x01) - eq_(self.fwd_yes, res[2] >> 6 & 0x01) - eq_(self.terminal_mep, res[2] >> 5 & 0x01) - eq_(self.first_tlv_offset, res[3]) - eq_(self.transaction_id, res[4]) - eq_(self.ttl, res[5]) - eq_(self.relay_action, res[6]) - eq_(self.end_tlv, res[7]) - - def test_len(self): - # 11 octet (If tlv does not exist) - eq_(11, len(self.ins)) - - def test_default_args(self): - ins = cfm.link_trace_reply() - buf = ins.serialize() - res = struct.unpack_from(cfm.link_trace_reply._PACK_STR, six.binary_type(buf)) - eq_(res[0] >> 5, 0) - eq_(res[0] & 0x1f, 0) - eq_(res[1], 4) - eq_(res[2] >> 7, 1) - eq_(res[2] >> 6 & 0x01, 0) - eq_(res[2] >> 5 & 0x01, 1) - eq_(res[3], 6) - eq_(res[4], 0) - eq_(res[5], 64) - eq_(res[6], 1) - - -class Test_sender_id_tlv(unittest.TestCase): - - def setUp(self): - self._type = cfm.CFM_SENDER_ID_TLV - self.length = 10 - self.chassis_id_length = 1 - self.chassis_id_subtype = 3 - self.chassis_id = b"\x0a" - self.ma_domain_length = 2 - self.ma_domain = b"\x04\x05" - self.ma_length = 3 - self.ma = b"\x01\x02\x03" - self.ins = cfm.sender_id_tlv( - self.length, - self.chassis_id_length, - self.chassis_id_subtype, - self.chassis_id, - self.ma_domain_length, - self.ma_domain, - self.ma_length, - self.ma, - ) - self.form = '!BHBB1sB2sB3s' - self.buf = struct.pack( - self.form, - self._type, - self.length, - self.chassis_id_length, - self.chassis_id_subtype, - self.chassis_id, - self.ma_domain_length, - self.ma_domain, - self.ma_length, - self.ma - ) - - def tearDown(self): - pass - - def test_init(self): - eq_(self.length, self.ins.length) - eq_(self.chassis_id_length, self.ins.chassis_id_length) - eq_(self.chassis_id_subtype, self.ins.chassis_id_subtype) - eq_(self.chassis_id, self.ins.chassis_id) - eq_(self.ma_domain_length, self.ins.ma_domain_length) - eq_(self.ma_domain, self.ins.ma_domain) - eq_(self.ma_length, self.ins.ma_length) - eq_(self.ma, self.ins.ma) - - def test_parser(self): - _res = cfm.sender_id_tlv.parser(self.buf) - if type(_res) is tuple: - res = _res[0] - else: - res = _res - eq_(self.length, res.length) - eq_(self.chassis_id_length, res.chassis_id_length) - eq_(self.chassis_id_subtype, res.chassis_id_subtype) - eq_(self.chassis_id, res.chassis_id) - eq_(self.ma_domain_length, res.ma_domain_length) - eq_(self.ma_domain, res.ma_domain) - eq_(self.ma_length, res.ma_length) - eq_(self.ma, res.ma) - - def test_serialize(self): - buf = self.ins.serialize() - res = struct.unpack_from(self.form, six.binary_type(buf)) - eq_(self._type, res[0]) - eq_(self.length, res[1]) - eq_(self.chassis_id_length, res[2]) - eq_(self.chassis_id_subtype, res[3]) - eq_(self.chassis_id, res[4]) - eq_(self.ma_domain_length, res[5]) - eq_(self.ma_domain, res[6]) - eq_(self.ma_length, res[7]) - eq_(self.ma, res[8]) - - def test_serialize_semi_normal_ptn1(self): - ins = cfm.sender_id_tlv( - chassis_id_subtype=self.chassis_id_subtype, - chassis_id=self.chassis_id, - ma_domain=self.ma_domain, - ) - buf = ins.serialize() - form = '!BHBB1sB2sB' - res = struct.unpack_from(form, six.binary_type(buf)) - eq_(self._type, res[0]) - eq_(7, res[1]) - eq_(self.chassis_id_length, res[2]) - eq_(self.chassis_id_subtype, res[3]) - eq_(self.chassis_id, res[4]) - eq_(self.ma_domain_length, res[5]) - eq_(self.ma_domain, res[6]) - eq_(0, res[7]) - - def test_serialize_semi_normal_ptn2(self): - ins = cfm.sender_id_tlv( - ma_domain=self.ma_domain, - ma=self.ma, - ) - buf = ins.serialize() - form = '!BHBB2sB3s' - res = struct.unpack_from(form, six.binary_type(buf)) - eq_(self._type, res[0]) - eq_(8, res[1]) - eq_(0, res[2]) - eq_(self.ma_domain_length, res[3]) - eq_(self.ma_domain, res[4]) - eq_(self.ma_length, res[5]) - eq_(self.ma, res[6]) - - def test_serialize_semi_normal_ptn3(self): - ins = cfm.sender_id_tlv( - chassis_id_subtype=self.chassis_id_subtype, - chassis_id=self.chassis_id, - ) - buf = ins.serialize() - form = '!BHBB1sB' - res = struct.unpack_from(form, six.binary_type(buf)) - eq_(self._type, res[0]) - eq_(4, res[1]) - eq_(self.chassis_id_length, res[2]) - eq_(self.chassis_id_subtype, res[3]) - eq_(self.chassis_id, res[4]) - eq_(0, res[5]) - - def test_serialize_semi_normal_ptn4(self): - ins = cfm.sender_id_tlv( - ma_domain=self.ma_domain, - ) - buf = ins.serialize() - form = '!BHBB2sB' - res = struct.unpack_from(form, six.binary_type(buf)) - eq_(self._type, res[0]) - eq_(5, res[1]) - eq_(0, res[2]) - eq_(self.ma_domain_length, res[3]) - eq_(self.ma_domain, res[4]) - eq_(0, res[5]) - - def test_serialize_with_length_zero(self): - ins = cfm.sender_id_tlv( - 0, - 0, - self.chassis_id_subtype, - self.chassis_id, - 0, - self.ma_domain, - 0, - self.ma, - ) - buf = ins.serialize() - res = struct.unpack_from(self.form, six.binary_type(buf)) - eq_(self._type, res[0]) - eq_(self.length, res[1]) - eq_(self.chassis_id_length, res[2]) - eq_(self.chassis_id_subtype, res[3]) - eq_(self.chassis_id, res[4]) - eq_(self.ma_domain_length, res[5]) - eq_(self.ma_domain, res[6]) - eq_(self.ma_length, res[7]) - eq_(self.ma, res[8]) - - def test_len(self): - # tlv_length = type_len + length_len + value_len - eq_(1 + 2 + 10, len(self.ins)) - - def test_default_args(self): - ins = cfm.sender_id_tlv() - buf = ins.serialize() - res = struct.unpack_from(cfm.sender_id_tlv._PACK_STR, six.binary_type(buf)) - eq_(res[0], cfm.CFM_SENDER_ID_TLV) - eq_(res[1], 1) - eq_(res[2], 0) - - -class Test_port_status_tlv(unittest.TestCase): - - def setUp(self): - self._type = cfm.CFM_PORT_STATUS_TLV - self.length = 1 - self.port_status = 1 - self.ins = cfm.port_status_tlv( - self.length, - self.port_status - ) - self.form = '!BHB' - self.buf = struct.pack( - self.form, - self._type, - self.length, - self.port_status - ) - - def tearDown(self): - pass - - def test_init(self): - eq_(self.length, self.ins.length) - eq_(self.port_status, self.ins.port_status) - - def test_parser(self): - _res = cfm.port_status_tlv.parser(self.buf) - if type(_res) is tuple: - res = _res[0] - else: - res = _res - eq_(self.length, res.length) - eq_(self.port_status, res.port_status) - - def test_serialize(self): - buf = self.ins.serialize() - res = struct.unpack_from(self.form, six.binary_type(buf)) - eq_(self._type, res[0]) - eq_(self.length, res[1]) - eq_(self.port_status, res[2]) - - def test_len(self): - # tlv_length = type_len + length_len + value_len - eq_(1 + 2 + 1, len(self.ins)) - - def test_default_args(self): - ins = cfm.port_status_tlv() - buf = ins.serialize() - res = struct.unpack_from(cfm.port_status_tlv._PACK_STR, six.binary_type(buf)) - eq_(res[0], cfm.CFM_PORT_STATUS_TLV) - eq_(res[1], 1) - eq_(res[2], 2) - - -class Test_data_tlv(unittest.TestCase): - - def setUp(self): - self._type = cfm.CFM_DATA_TLV - self.length = 3 - self.data_value = b"\x01\x02\x03" - self.ins = cfm.data_tlv( - self.length, - self.data_value - ) - self.form = '!BH3s' - self.buf = struct.pack( - self.form, - self._type, - self.length, - self.data_value, - ) - - def tearDown(self): - pass - - def test_init(self): - eq_(self.length, self.ins.length) - eq_(self.data_value, self.ins.data_value) - - def test_parser(self): - _res = cfm.data_tlv.parser(self.buf) - if type(_res) is tuple: - res = _res[0] - else: - res = _res - eq_(self.length, res.length) - eq_(self.data_value, res.data_value) - - def test_serialize(self): - buf = self.ins.serialize() - res = struct.unpack_from(self.form, six.binary_type(buf)) - eq_(self._type, res[0]) - eq_(self.length, res[1]) - eq_(self.data_value, res[2]) - - def test_serialize_with_length_zero(self): - ins = cfm.data_tlv( - 0, - self.data_value - ) - buf = ins.serialize() - res = struct.unpack_from(self.form, six.binary_type(buf)) - eq_(self._type, res[0]) - eq_(self.length, res[1]) - eq_(self.data_value, res[2]) - - def test_len(self): - # tlv_length = type_len + length_len + value_len - eq_(1 + 2 + 3, len(self.ins)) - - def test_default_args(self): - ins = cfm.data_tlv() - buf = ins.serialize() - res = struct.unpack_from(cfm.data_tlv._PACK_STR, six.binary_type(buf)) - eq_(res[0], cfm.CFM_DATA_TLV) - eq_(res[1], 0) - - -class Test_interface_status_tlv(unittest.TestCase): - - def setUp(self): - self._type = cfm.CFM_INTERFACE_STATUS_TLV - self.length = 1 - self.interface_status = 4 - self.ins = cfm.interface_status_tlv( - self.length, - self.interface_status - ) - self.form = '!BHB' - self.buf = struct.pack( - self.form, - self._type, - self.length, - self.interface_status - ) - - def tearDown(self): - pass - - def test_init(self): - eq_(self.length, self.ins.length) - eq_(self.interface_status, self.ins.interface_status) - - def test_parser(self): - _res = cfm.interface_status_tlv.parser(self.buf) - if type(_res) is tuple: - res = _res[0] - else: - res = _res - eq_(self.length, res.length) - eq_(self.interface_status, res.interface_status) - - def test_serialize(self): - buf = self.ins.serialize() - res = struct.unpack_from(self.form, six.binary_type(buf)) - eq_(self._type, res[0]) - eq_(self.length, res[1]) - eq_(self.interface_status, res[2]) - - def test_len(self): - # tlv_length = type_len + length_len + value_len - eq_(1 + 2 + 1, len(self.ins)) - - def test_default_args(self): - ins = cfm.interface_status_tlv() - buf = ins.serialize() - res = struct.unpack_from(cfm.interface_status_tlv._PACK_STR, six.binary_type(buf)) - eq_(res[0], cfm.CFM_INTERFACE_STATUS_TLV) - eq_(res[1], 1) - eq_(res[2], 1) - - -class Test_ltm_egress_identifier_tlv(unittest.TestCase): - - def setUp(self): - self._type = cfm.CFM_LTM_EGRESS_IDENTIFIER_TLV - self.length = 8 - self.egress_id_ui = 7 - self.egress_id_mac = "11:22:33:44:55:66" - self.ins = cfm.ltm_egress_identifier_tlv( - self.length, - self.egress_id_ui, - self.egress_id_mac - ) - self.form = '!BHH6s' - self.buf = struct.pack( - self.form, - self._type, - self.length, - self.egress_id_ui, - addrconv.mac.text_to_bin(self.egress_id_mac) - ) - - def tearDown(self): - pass - - def test_init(self): - eq_(self.length, self.ins.length) - eq_(self.egress_id_ui, self.ins.egress_id_ui) - eq_(self.egress_id_mac, self.ins.egress_id_mac) - - def test_parser(self): - _res = cfm.ltm_egress_identifier_tlv.parser(self.buf) - if type(_res) is tuple: - res = _res[0] - else: - res = _res - eq_(self.length, res.length) - eq_(self.egress_id_ui, res.egress_id_ui) - eq_(self.egress_id_mac, res.egress_id_mac) - - def test_serialize(self): - buf = self.ins.serialize() - res = struct.unpack_from(self.form, six.binary_type(buf)) - eq_(self._type, res[0]) - eq_(self.length, res[1]) - eq_(self.egress_id_ui, res[2]) - eq_(addrconv.mac.text_to_bin(self.egress_id_mac), res[3]) - - def test_serialize_with_length_zero(self): - ins = cfm.ltm_egress_identifier_tlv( - 0, - self.egress_id_ui, - self.egress_id_mac - ) - buf = ins.serialize() - res = struct.unpack_from(self.form, six.binary_type(buf)) - eq_(self._type, res[0]) - eq_(self.length, res[1]) - eq_(self.egress_id_ui, res[2]) - eq_(addrconv.mac.text_to_bin(self.egress_id_mac), res[3]) - - def test_len(self): - # tlv_length = type_len + length_len + value_len - eq_(1 + 2 + 8, len(self.ins)) - - def test_default_args(self): - ins = cfm.ltm_egress_identifier_tlv() - buf = ins.serialize() - res = struct.unpack_from( - cfm.ltm_egress_identifier_tlv._PACK_STR, six.binary_type(buf)) - eq_(res[0], cfm.CFM_LTM_EGRESS_IDENTIFIER_TLV) - eq_(res[1], 8) - eq_(res[2], 0) - eq_(res[3], addrconv.mac.text_to_bin('00:00:00:00:00:00')) - - -class Test_ltr_egress_identifier_tlv(unittest.TestCase): - - def setUp(self): - self._type = cfm.CFM_LTR_EGRESS_IDENTIFIER_TLV - self.length = 16 - self.last_egress_id_ui = 7 - self.last_egress_id_mac = "11:22:33:44:55:66" - self.next_egress_id_ui = 5 - self.next_egress_id_mac = "33:11:33:aa:bb:cc" - self.ins = cfm.ltr_egress_identifier_tlv(self.length, - self.last_egress_id_ui, - self.last_egress_id_mac, - self.next_egress_id_ui, - self.next_egress_id_mac - ) - self.form = '!BHH6sH6s' - self.buf = struct.pack( - self.form, - self._type, - self.length, - self.last_egress_id_ui, - addrconv.mac.text_to_bin(self.last_egress_id_mac), - self.next_egress_id_ui, - addrconv.mac.text_to_bin(self.next_egress_id_mac)) - - def tearDown(self): - pass - - def test_init(self): - eq_(self.length, self.ins.length) - eq_(self.last_egress_id_ui, self.ins.last_egress_id_ui) - eq_(self.last_egress_id_mac, self.ins.last_egress_id_mac) - eq_(self.next_egress_id_ui, self.ins.next_egress_id_ui) - eq_(self.next_egress_id_mac, self.ins.next_egress_id_mac) - - def test_parser(self): - _res = cfm.ltr_egress_identifier_tlv.parser(self.buf) - if type(_res) is tuple: - res = _res[0] - else: - res = _res - eq_(self.length, res.length) - eq_(self.last_egress_id_ui, res.last_egress_id_ui) - eq_(self.last_egress_id_mac, res.last_egress_id_mac) - eq_(self.next_egress_id_ui, res.next_egress_id_ui) - eq_(self.next_egress_id_mac, res.next_egress_id_mac) - - def test_serialize(self): - buf = self.ins.serialize() - res = struct.unpack_from(self.form, six.binary_type(buf)) - eq_(self._type, res[0]) - eq_(self.length, res[1]) - eq_(self.last_egress_id_ui, res[2]) - eq_(addrconv.mac.text_to_bin(self.last_egress_id_mac), res[3]) - eq_(self.next_egress_id_ui, res[4]) - eq_(addrconv.mac.text_to_bin(self.next_egress_id_mac), res[5]) - - def test_serialize_with_length_zero(self): - ins = cfm.ltr_egress_identifier_tlv(0, - self.last_egress_id_ui, - self.last_egress_id_mac, - self.next_egress_id_ui, - self.next_egress_id_mac - ) - buf = ins.serialize() - res = struct.unpack_from(self.form, six.binary_type(buf)) - eq_(self._type, res[0]) - eq_(self.length, res[1]) - eq_(self.last_egress_id_ui, res[2]) - eq_(addrconv.mac.text_to_bin(self.last_egress_id_mac), res[3]) - eq_(self.next_egress_id_ui, res[4]) - eq_(addrconv.mac.text_to_bin(self.next_egress_id_mac), res[5]) - - def test_len(self): - # tlv_length = type_len + length_len + value_len - eq_(1 + 2 + 16, len(self.ins)) - - def test_default_args(self): - ins = cfm.ltr_egress_identifier_tlv() - buf = ins.serialize() - res = struct.unpack_from(cfm.ltr_egress_identifier_tlv._PACK_STR, - six.binary_type(buf)) - eq_(res[0], cfm.CFM_LTR_EGRESS_IDENTIFIER_TLV) - eq_(res[1], 16) - eq_(res[2], 0) - eq_(res[3], addrconv.mac.text_to_bin('00:00:00:00:00:00')) - eq_(res[4], 0) - eq_(res[5], addrconv.mac.text_to_bin('00:00:00:00:00:00')) - - -class Test_organization_specific_tlv(unittest.TestCase): - - def setUp(self): - self._type = cfm.CFM_ORGANIZATION_SPECIFIC_TLV - self.length = 10 - self.oui = b"\xff\x12\x34" - self.subtype = 3 - self.value = b"\x01\x02\x0f\x0e\x0d\x0c" - self.ins = cfm.organization_specific_tlv(self.length, - self.oui, - self.subtype, - self.value - ) - self.form = '!BH3sB6s' - self.buf = struct.pack(self.form, - self._type, - self.length, - self.oui, - self.subtype, - self.value - ) - - def tearDown(self): - pass - - def test_init(self): - eq_(self.length, self.ins.length) - eq_(self.oui, self.ins.oui) - eq_(self.subtype, self.ins.subtype) - eq_(self.value, self.ins.value) - - def test_parser(self): - _res = cfm.organization_specific_tlv.parser(self.buf) - if type(_res) is tuple: - res = _res[0] - else: - res = _res - eq_(self.length, res.length) - eq_(self.oui, res.oui) - eq_(self.subtype, res.subtype) - eq_(self.value, res.value) - - def test_serialize(self): - buf = self.ins.serialize() - res = struct.unpack_from(self.form, six.binary_type(buf)) - eq_(self._type, res[0]) - eq_(self.length, res[1]) - eq_(self.oui, res[2]) - eq_(self.subtype, res[3]) - eq_(self.value, res[4]) - - def test_serialize_with_zero(self): - ins = cfm.organization_specific_tlv(0, - self.oui, - self.subtype, - self.value - ) - buf = ins.serialize() - res = struct.unpack_from(self.form, six.binary_type(buf)) - eq_(self._type, res[0]) - eq_(self.length, res[1]) - eq_(self.oui, res[2]) - eq_(self.subtype, res[3]) - eq_(self.value, res[4]) - - def test_len(self): - # tlv_length = type_len + length_len + value_len - eq_(1 + 2 + 10, len(self.ins)) - - def test_default_args(self): - ins = cfm.organization_specific_tlv() - buf = ins.serialize() - res = struct.unpack_from(cfm.organization_specific_tlv._PACK_STR, - six.binary_type(buf)) - eq_(res[0], cfm.CFM_ORGANIZATION_SPECIFIC_TLV) - eq_(res[1], 4) - eq_(res[2], b"\x00\x00\x00") - eq_(res[3], 0) - - -class Test_reply_ingress_tlv(unittest.TestCase): - - def setUp(self): - self._type = cfm.CFM_REPLY_INGRESS_TLV - self.length = 12 - self.action = 2 - self.mac_address = 'aa:bb:cc:56:34:12' - self.port_id_length = 3 - self.port_id_subtype = 2 - self.port_id = b"\x01\x04\x09" - self.ins = cfm.reply_ingress_tlv(self.length, self.action, - self.mac_address, - self.port_id_length, - self.port_id_subtype, - self.port_id - ) - self.form = '!BHB6sBB3s' - self.buf = struct.pack(self.form, - self._type, - self.length, - self.action, - addrconv.mac.text_to_bin(self.mac_address), - self.port_id_length, - self.port_id_subtype, - self.port_id - ) - - def tearDown(self): - pass - - def test_init(self): - eq_(self.length, self.ins.length) - eq_(self.action, self.ins.action) - eq_(self.mac_address, self.ins.mac_address) - eq_(self.port_id_length, self.ins.port_id_length) - eq_(self.port_id_subtype, self.ins.port_id_subtype) - eq_(self.port_id, self.ins.port_id) - - def test_parser(self): - _res = cfm.reply_ingress_tlv.parser(self.buf) - if type(_res) is tuple: - res = _res[0] - else: - res = _res - eq_(self.length, res.length) - eq_(self.action, res.action) - eq_(self.mac_address, res.mac_address) - eq_(self.port_id_length, res.port_id_length) - eq_(self.port_id_subtype, res.port_id_subtype) - eq_(self.port_id, res.port_id) - - def test_serialize(self): - buf = self.ins.serialize() - res = struct.unpack_from(self.form, six.binary_type(buf)) - eq_(self._type, res[0]) - eq_(self.length, res[1]) - eq_(self.action, res[2]) - eq_(addrconv.mac.text_to_bin(self.mac_address), res[3]) - eq_(self.port_id_length, res[4]) - eq_(self.port_id_subtype, res[5]) - eq_(self.port_id, res[6]) - - def test_serialize_with_zero(self): - ins = cfm.reply_ingress_tlv(0, - self.action, - self.mac_address, - 0, - self.port_id_subtype, - self.port_id - ) - buf = ins.serialize() - res = struct.unpack_from(self.form, six.binary_type(buf)) - eq_(self._type, res[0]) - eq_(self.length, res[1]) - eq_(self.action, res[2]) - eq_(addrconv.mac.text_to_bin(self.mac_address), res[3]) - eq_(self.port_id_length, res[4]) - eq_(self.port_id_subtype, res[5]) - eq_(self.port_id, res[6]) - - def test_len(self): - # tlv_length = type_len + length_len + value_len - eq_(1 + 2 + 12, len(self.ins)) - - def test_default_args(self): - ins = cfm.reply_ingress_tlv() - buf = ins.serialize() - res = struct.unpack_from(cfm.reply_ingress_tlv._PACK_STR, six.binary_type(buf)) - eq_(res[0], cfm.CFM_REPLY_INGRESS_TLV) - eq_(res[1], 7) - eq_(res[2], 1) - eq_(res[3], addrconv.mac.text_to_bin('00:00:00:00:00:00')) - - -class Test_reply_egress_tlv(unittest.TestCase): - - def setUp(self): - self._type = cfm.CFM_REPLY_EGRESS_TLV - self.length = 12 - self.action = 2 - self.mac_address = 'aa:bb:cc:56:34:12' - self.port_id_length = 3 - self.port_id_subtype = 2 - self.port_id = b"\x01\x04\x09" - self.ins = cfm.reply_egress_tlv(self.length, - self.action, - self.mac_address, - self.port_id_length, - self.port_id_subtype, - self.port_id - ) - self.form = '!BHB6sBB3s' - self.buf = struct.pack(self.form, - self._type, - self.length, - self.action, - addrconv.mac.text_to_bin(self.mac_address), - self.port_id_length, - self.port_id_subtype, - self.port_id - ) - - def tearDown(self): - pass - - def test_init(self): - eq_(self.length, self.ins.length) - eq_(self.action, self.ins.action) - eq_(self.mac_address, self.ins.mac_address) - eq_(self.port_id_length, self.ins.port_id_length) - eq_(self.port_id_subtype, self.ins.port_id_subtype) - eq_(self.port_id, self.ins.port_id) - - def test_parser(self): - _res = cfm.reply_ingress_tlv.parser(self.buf) - if type(_res) is tuple: - res = _res[0] - else: - res = _res - eq_(self.length, res.length) - eq_(self.action, res.action) - eq_(self.mac_address, res.mac_address) - eq_(self.port_id_length, res.port_id_length) - eq_(self.port_id_subtype, res.port_id_subtype) - eq_(self.port_id, res.port_id) - - def test_serialize(self): - buf = self.ins.serialize() - res = struct.unpack_from(self.form, six.binary_type(buf)) - eq_(self._type, res[0]) - eq_(self.length, res[1]) - eq_(self.action, res[2]) - eq_(addrconv.mac.text_to_bin(self.mac_address), res[3]) - eq_(self.port_id_length, res[4]) - eq_(self.port_id_subtype, res[5]) - eq_(self.port_id, res[6]) - - def test_serialize_with_zero(self): - ins = cfm.reply_egress_tlv(0, - self.action, - self.mac_address, - 0, - self.port_id_subtype, - self.port_id - ) - buf = ins.serialize() - res = struct.unpack_from(self.form, six.binary_type(buf)) - eq_(self._type, res[0]) - eq_(self.length, res[1]) - eq_(self.action, res[2]) - eq_(addrconv.mac.text_to_bin(self.mac_address), res[3]) - eq_(self.port_id_length, res[4]) - eq_(self.port_id_subtype, res[5]) - eq_(self.port_id, res[6]) - - def test_len(self): - # tlv_length = type_len + length_len + value_len - eq_(1 + 2 + 12, len(self.ins)) - - def test_default_args(self): - ins = cfm.reply_egress_tlv() - buf = ins.serialize() - res = struct.unpack_from(cfm.reply_egress_tlv._PACK_STR, - six.binary_type(buf)) - eq_(res[0], cfm.CFM_REPLY_EGRESS_TLV) - eq_(res[1], 7) - eq_(res[2], 1) - eq_(res[3], addrconv.mac.text_to_bin('00:00:00:00:00:00')) diff --git a/tests/unit/packet/test_dhcp.py b/tests/unit/packet/test_dhcp.py deleted file mode 100644 index cc96804b..00000000 --- a/tests/unit/packet/test_dhcp.py +++ /dev/null @@ -1,218 +0,0 @@ -# Copyright (C) 2013 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 inspect -import logging -import struct -import unittest - -import six -from nose.tools import eq_ -from nose.tools import ok_ - -from ryu.lib import addrconv -from ryu.lib.packet import dhcp - - -LOG = logging.getLogger(__name__) - - -class Test_dhcp_offer(unittest.TestCase): - - op = dhcp.DHCP_BOOT_REPLY - chaddr = 'aa:aa:aa:aa:aa:aa' - htype = 1 - hlen = 6 - hops = 0 - xid = 1 - secs = 0 - flags = 1 - ciaddr = '192.168.10.10' - yiaddr = '192.168.20.20' - siaddr = '192.168.30.30' - giaddr = '192.168.40.40' - sname = 'abc' - boot_file = '' - - option_list = [ - dhcp.option(dhcp.DHCP_MESSAGE_TYPE_OPT, b'\x02', 1), - dhcp.option(dhcp.DHCP_SUBNET_MASK_OPT, b'\xff\xff\xff\x00', 4), - dhcp.option(dhcp.DHCP_GATEWAY_ADDR_OPT, b'\xc0\xa8\x0a\x09', 4), - dhcp.option(dhcp.DHCP_DNS_SERVER_ADDR_OPT, b'\xc0\xa8\x0a\x09', 4), - dhcp.option(dhcp.DHCP_IP_ADDR_LEASE_TIME_OPT, b'\x00\x03\xf4\x80', 4), - dhcp.option(dhcp.DHCP_RENEWAL_TIME_OPT, b'\x00\x01\xfa\x40', 4), - dhcp.option(dhcp.DHCP_REBINDING_TIME_OPT, b'\x00\x03\x75\xf0', 4), - dhcp.option(dhcp.DHCP_SERVER_IDENTIFIER_OPT, b'\xc0\xa8\x0a\x09', 4)] - magic_cookie = '99.130.83.99' - options = dhcp.options(option_list=option_list, options_len=50, - magic_cookie=magic_cookie) - - dh = dhcp.dhcp(op, chaddr, options, htype=htype, hlen=hlen, - hops=hops, xid=xid, secs=secs, flags=flags, - ciaddr=ciaddr, yiaddr=yiaddr, siaddr=siaddr, - giaddr=giaddr, sname=sname, boot_file=boot_file) - - buf = ( - b"\x02\x01\x06\x00\x00\x00\x00\x01\x00\x00\x00\x01\xc0\xa8\x0a\x0a" - b"\xc0\xa8\x14\x14\xc0\xa8\x1e\x1e\xc0\xa8\x28\x28\xaa\xaa\xaa\xaa" - b"\xaa\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x62\x63\x00" - b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x82\x53\x63" - b"\x35\x01\x02\x01\x04\xff\xff\xff\x00\x03\x04\xc0\xa8\x0a\x09\x06" - b"\x04\xc0\xa8\x0a\x09\x33\x04\x00\x03\xf4\x80\x3a\x04\x00\x01\xfa" - b"\x40\x3b\x04\x00\x03\x75\xf0\x36\x04\xc0\xa8\x0a\x09\xff") - - def setUp(self): - pass - - def tearDown(self): - pass - - def test_init(self): - eq_(self.op, self.dh.op) - eq_(self.htype, self.dh.htype) - eq_(self.hlen, self.dh.hlen) - eq_(self.hops, self.dh.hops) - eq_(self.xid, self.dh.xid) - eq_(self.secs, self.dh.secs) - eq_(self.flags, self.dh.flags) - eq_(self.ciaddr, self.dh.ciaddr) - eq_(self.yiaddr, self.dh.yiaddr) - eq_(self.siaddr, self.dh.siaddr) - eq_(self.giaddr, self.dh.giaddr) - eq_(self.chaddr, self.dh.chaddr) - eq_(self.sname, self.dh.sname) - eq_(self.boot_file, self.dh.boot_file) - eq_(str(self.options), str(self.dh.options)) - - def test_parser(self): - res, _, rest = dhcp.dhcp.parser(self.buf) - - eq_(self.op, res.op) - eq_(self.htype, res.htype) - eq_(self.hlen, res.hlen) - eq_(self.hops, res.hops) - eq_(self.xid, res.xid) - eq_(self.secs, res.secs) - eq_(self.flags, res.flags) - eq_(self.ciaddr, res.ciaddr) - eq_(self.yiaddr, res.yiaddr) - eq_(self.siaddr, res.siaddr) - eq_(self.giaddr, res.giaddr) - eq_(self.chaddr, res.chaddr) - # sname is 64 byte length. rest of data is filled by '\x00'. - eq_(self.sname.ljust(64, '\x00'), res.sname) - # boof_file is 128 byte length. rest of data is filled by '\x00'. - eq_(self.boot_file.ljust(128, '\x00'), res.boot_file) - eq_(str(self.options), str(res.options)) - eq_(b'', rest) - - def test_parser_corrupted(self): - corrupt_buf = self.buf[:-4] - pkt, _, rest = dhcp.dhcp.parser(corrupt_buf) - - ok_(isinstance(pkt, dhcp.dhcp)) - ok_(isinstance(pkt.options, dhcp.options)) - for opt in pkt.options.option_list[:-1]: - ok_(isinstance(opt, dhcp.option)) - ok_(isinstance(pkt.options.option_list[-1], six.binary_type)) - - buf = pkt.serialize() - eq_(str(buf), str(corrupt_buf)) - eq_(b'', rest) - - def test_serialize(self): - buf = self.dh.serialize() - - res = struct.unpack_from(dhcp.dhcp._DHCP_PACK_STR, - six.binary_type(buf)) - - eq_(self.op, res[0]) - eq_(self.htype, res[1]) - eq_(self.hlen, res[2]) - eq_(self.hops, res[3]) - eq_(self.xid, res[4]) - eq_(self.secs, res[5]) - eq_(self.flags, res[6]) - eq_(self.ciaddr, addrconv.ipv4.bin_to_text(res[7])) - eq_(self.yiaddr, addrconv.ipv4.bin_to_text(res[8])) - eq_(self.siaddr, addrconv.ipv4.bin_to_text(res[9])) - eq_(self.giaddr, addrconv.ipv4.bin_to_text(res[10])) - eq_(self.chaddr, addrconv.mac.bin_to_text(res[11][:6])) - # sname is 64 byte length. rest of data is filled by '\x00'. - eq_(self.sname.ljust(64, '\x00'), res[12].decode('ascii')) - # boof_file is 128 byte length. rest of data is filled by '\x00'. - eq_(self.boot_file.ljust(128, '\x00'), res[13].decode('ascii')) - options = dhcp.options.parser( - buf[struct.calcsize(dhcp.dhcp._DHCP_PACK_STR):]) - eq_(str(self.options), str(options)) - - def test_to_string(self): - option_values = ['tag', 'length', 'value'] - opt_str_list = [] - for option in self.option_list: - _opt_str = ','.join(['%s=%s' % (k, repr(getattr(option, k))) - for k, v in inspect.getmembers(option) - if k in option_values]) - opt_str = '%s(%s)' % (dhcp.option.__name__, _opt_str) - opt_str_list.append(opt_str) - option_str = '[%s]' % ', '.join(opt_str_list) - - opts_vals = {'magic_cookie': repr(self.magic_cookie), - 'option_list': option_str, - 'options_len': repr(self.options.options_len)} - _options_str = ','.join(['%s=%s' % (k, opts_vals[k]) - for k, v in inspect.getmembers(self.options) - if k in opts_vals]) - options_str = '%s(%s)' % (dhcp.options.__name__, _options_str) - - dhcp_values = {'op': repr(self.op), - 'htype': repr(self.htype), - 'hlen': repr(self.hlen), - 'hops': repr(self.hops), - 'xid': repr(self.xid), - 'secs': repr(self.secs), - 'flags': repr(self.flags), - 'ciaddr': repr(self.ciaddr), - 'yiaddr': repr(self.yiaddr), - 'siaddr': repr(self.siaddr), - 'giaddr': repr(self.giaddr), - 'chaddr': repr(self.chaddr), - 'sname': repr(self.sname), - 'boot_file': repr(self.boot_file), - 'options': options_str} - _dh_str = ','.join(['%s=%s' % (k, dhcp_values[k]) - for k, v in inspect.getmembers(self.dh) - if k in dhcp_values]) - dh_str = '%s(%s)' % (dhcp.dhcp.__name__, _dh_str) - - eq_(str(self.dh), dh_str) - eq_(repr(self.dh), dh_str) - - def test_json(self): - jsondict = self.dh.to_jsondict() - dh = dhcp.dhcp.from_jsondict(jsondict['dhcp']) - eq_(str(self.dh), str(dh)) diff --git a/tests/unit/packet/test_ethernet.py b/tests/unit/packet/test_ethernet.py deleted file mode 100644 index 6fd767bd..00000000 --- a/tests/unit/packet/test_ethernet.py +++ /dev/null @@ -1,103 +0,0 @@ -# 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. - -# vim: tabstop=4 shiftwidth=4 softtabstop=4 - -import unittest -import logging -import six -import struct -import netaddr -from struct import * -from nose.tools import * -from ryu.ofproto import ether, inet -from ryu.lib.packet.ethernet import ethernet -from ryu.lib.packet.packet import Packet -from ryu.lib.packet.arp import arp -from ryu.lib import addrconv - - -LOG = logging.getLogger('test_ethernet') - - -class Test_ethernet(unittest.TestCase): - """ Test case for ethernet - """ - - dst = 'aa:aa:aa:aa:aa:aa' - src = 'bb:bb:bb:bb:bb:bb' - ethertype = ether.ETH_TYPE_ARP - - buf = pack(ethernet._PACK_STR, - addrconv.mac.text_to_bin(dst), - addrconv.mac.text_to_bin(src), ethertype) - - e = ethernet(dst, src, ethertype) - - def setUp(self): - pass - - def tearDown(self): - pass - - def find_protocol(self, pkt, name): - for p in pkt.protocols: - if p.protocol_name == name: - return p - - def test_init(self): - eq_(self.dst, self.e.dst) - eq_(self.src, self.e.src) - eq_(self.ethertype, self.e.ethertype) - - def test_parser(self): - res, ptype, _ = self.e.parser(self.buf) - LOG.debug((res, ptype)) - - eq_(res.dst, self.dst) - eq_(res.src, self.src) - eq_(res.ethertype, self.ethertype) - eq_(ptype, arp) - - def test_serialize(self): - data = bytearray() - prev = None - buf = self.e.serialize(data, prev) - - fmt = ethernet._PACK_STR - res = struct.unpack(fmt, buf) - - eq_(res[0], addrconv.mac.text_to_bin(self.dst)) - eq_(res[1], addrconv.mac.text_to_bin(self.src)) - eq_(res[2], self.ethertype) - - @raises(Exception) - def test_malformed_ethernet(self): - m_short_buf = self.buf[1:ethernet._MIN_LEN] - ethernet.parser(m_short_buf) - - def test_default_args(self): - e = ethernet() - buf = e.serialize(bytearray(), None) - res = struct.unpack(e._PACK_STR, six.binary_type(buf)) - - eq_(res[0], addrconv.mac.text_to_bin('ff:ff:ff:ff:ff:ff')) - eq_(res[1], addrconv.mac.text_to_bin('00:00:00:00:00:00')) - eq_(res[2], ether.ETH_TYPE_IP) - - def test_json(self): - jsondict = self.e.to_jsondict() - e = ethernet.from_jsondict(jsondict['ethernet']) - eq_(str(self.e), str(e)) diff --git a/tests/unit/packet/test_geneve.py b/tests/unit/packet/test_geneve.py deleted file mode 100644 index 919d05f8..00000000 --- a/tests/unit/packet/test_geneve.py +++ /dev/null @@ -1,62 +0,0 @@ -# Copyright (C) 2016 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. - -from __future__ import print_function - -import logging -import os -import sys - -import unittest -from nose.tools import eq_ -from nose.tools import ok_ - -from ryu.lib import pcaplib -from ryu.lib.packet import geneve -from ryu.lib.packet import packet -from ryu.utils import binary_str - - -LOG = logging.getLogger(__name__) - -GENEVE_DATA_DIR = os.path.join( - os.path.dirname(sys.modules[__name__].__file__), - '../../packet_data/pcap/') - - -class Test_geneve(unittest.TestCase): - """ - Test case for ryu.lib.packet.geneve. - """ - - def test_parser(self): - files = [ - 'geneve_unknown', - ] - - for f in files: - # print('*** testing %s ...' % f) - for _, buf in pcaplib.Reader( - open(GENEVE_DATA_DIR + f + '.pcap', 'rb')): - # Checks if message can be parsed as expected. - pkt = packet.Packet(buf) - geneve_pkt = pkt.get_protocol(geneve.geneve) - ok_(isinstance(geneve_pkt, geneve.geneve), - 'Failed to parse Geneve message: %s' % pkt) - - # Checks if message can be serialized as expected. - pkt.serialize() - eq_(buf, pkt.data, - "b'%s' != b'%s'" % (binary_str(buf), binary_str(pkt.data))) diff --git a/tests/unit/packet/test_gre.py b/tests/unit/packet/test_gre.py deleted file mode 100644 index c955ec70..00000000 --- a/tests/unit/packet/test_gre.py +++ /dev/null @@ -1,115 +0,0 @@ -# Copyright (C) 2016 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. - -from __future__ import print_function - -import logging -import os -import sys - -import unittest -from nose.tools import eq_ -from nose.tools import ok_ - -from ryu.lib import pcaplib -from ryu.lib.packet import gre -from ryu.lib.packet import packet -from ryu.utils import binary_str -from ryu.lib.packet.ether_types import ETH_TYPE_IP, ETH_TYPE_TEB - -LOG = logging.getLogger(__name__) - -GENEVE_DATA_DIR = os.path.join( - os.path.dirname(sys.modules[__name__].__file__), - '../../packet_data/pcap/') - - -class Test_gre(unittest.TestCase): - """ - Test case gre for ryu.lib.packet.gre. - """ - - version = 0 - gre_proto = ETH_TYPE_IP - nvgre_proto = ETH_TYPE_TEB - checksum = 0x440d - seq_number = 10 - key = 256100 - vsid = 1000 - flow_id = 100 - - gre = gre.gre(version=version, protocol=gre_proto, checksum=checksum, - key=key, seq_number=seq_number) - - def test_key_setter(self): - self.gre.key = self.key - eq_(self.gre._key, self.key) - eq_(self.gre._vsid, self.vsid) - eq_(self.gre._flow_id, self.flow_id) - - def test_key_setter_none(self): - self.gre.key = None - eq_(self.gre._key, None) - eq_(self.gre._vsid, None) - eq_(self.gre._flow_id, None) - - self.gre.key = self.key - - def test_vsid_setter(self): - self.gre.vsid = self.vsid - eq_(self.gre._key, self.key) - eq_(self.gre._vsid, self.vsid) - eq_(self.gre._flow_id, self.flow_id) - - def test_flowid_setter(self): - self.gre.flow_id = self.flow_id - eq_(self.gre._key, self.key) - eq_(self.gre._vsid, self.vsid) - eq_(self.gre._flow_id, self.flow_id) - - def test_nvgre_init(self): - nvgre = gre.nvgre(version=self.version, vsid=self.vsid, - flow_id=self.flow_id) - - eq_(nvgre.version, self.version) - eq_(nvgre.protocol, self.nvgre_proto) - eq_(nvgre.checksum, None) - eq_(nvgre.seq_number, None) - eq_(nvgre._key, self.key) - eq_(nvgre._vsid, self.vsid) - eq_(nvgre._flow_id, self.flow_id) - - def test_parser(self): - files = [ - 'gre_full_options', - 'gre_no_option', - 'gre_nvgre_option', - ] - - for f in files: - # print('*** testing %s ...' % f) - for _, buf in pcaplib.Reader( - open(GENEVE_DATA_DIR + f + '.pcap', 'rb')): - # Checks if message can be parsed as expected. - pkt = packet.Packet(buf) - gre_pkt = pkt.get_protocol(gre.gre) - ok_(isinstance(gre_pkt, gre.gre), - 'Failed to parse Gre message: %s' % pkt) - - # Checks if message can be serialized as expected. - pkt.serialize() - - eq_(buf, pkt.data, - "b'%s' != b'%s'" % (binary_str(buf), binary_str(pkt.data))) diff --git a/tests/unit/packet/test_icmp.py b/tests/unit/packet/test_icmp.py deleted file mode 100644 index f9438893..00000000 --- a/tests/unit/packet/test_icmp.py +++ /dev/null @@ -1,380 +0,0 @@ -# Copyright (C) 2013 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 inspect -import logging -import six -import struct -import unittest - -from nose.tools import eq_ -from ryu.lib.packet import icmp -from ryu.lib.packet import packet_utils - - -LOG = logging.getLogger(__name__) - - -class Test_icmp(unittest.TestCase): - - echo_id = None - echo_seq = None - echo_data = None - - unreach_mtu = None - unreach_data = None - unreach_data_len = None - - te_data = None - te_data_len = None - - def setUp(self): - self.type_ = icmp.ICMP_ECHO_REQUEST - self.code = 0 - self.csum = 0 - self.data = None - - self.ic = icmp.icmp(self.type_, self.code, self.csum, self.data) - - self.buf = bytearray(struct.pack( - icmp.icmp._PACK_STR, self.type_, self.code, self.csum)) - self.csum_calc = packet_utils.checksum(self.buf) - struct.pack_into('!H', self.buf, 2, self.csum_calc) - - def setUp_with_echo(self): - self.echo_id = 13379 - self.echo_seq = 1 - self.echo_data = b'\x30\x0e\x09\x00\x00\x00\x00\x00' \ - + b'\x10\x11\x12\x13\x14\x15\x16\x17' \ - + b'\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f' \ - + b'\x20\x21\x22\x23\x24\x25\x26\x27' \ - + b'\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f' \ - + b'\x30\x31\x32\x33\x34\x35\x36\x37' - self.data = icmp.echo( - id_=self.echo_id, seq=self.echo_seq, data=self.echo_data) - - self.type_ = icmp.ICMP_ECHO_REQUEST - self.code = 0 - self.ic = icmp.icmp(self.type_, self.code, self.csum, self.data) - - self.buf = bytearray(struct.pack( - icmp.icmp._PACK_STR, self.type_, self.code, self.csum)) - self.buf += self.data.serialize() - self.csum_calc = packet_utils.checksum(self.buf) - struct.pack_into('!H', self.buf, 2, self.csum_calc) - - def setUp_with_dest_unreach(self): - self.unreach_mtu = 10 - self.unreach_data = b'abc' - self.unreach_data_len = len(self.unreach_data) - self.data = icmp.dest_unreach( - data_len=self.unreach_data_len, mtu=self.unreach_mtu, - data=self.unreach_data) - - self.type_ = icmp.ICMP_DEST_UNREACH - self.code = icmp.ICMP_HOST_UNREACH_CODE - self.ic = icmp.icmp(self.type_, self.code, self.csum, self.data) - - self.buf = bytearray(struct.pack( - icmp.icmp._PACK_STR, self.type_, self.code, self.csum)) - self.buf += self.data.serialize() - self.csum_calc = packet_utils.checksum(self.buf) - struct.pack_into('!H', self.buf, 2, self.csum_calc) - - def setUp_with_TimeExceeded(self): - self.te_data = b'abc' - self.te_data_len = len(self.te_data) - self.data = icmp.TimeExceeded( - data_len=self.te_data_len, data=self.te_data) - - self.type_ = icmp.ICMP_TIME_EXCEEDED - self.code = 0 - self.ic = icmp.icmp(self.type_, self.code, self.csum, self.data) - - self.buf = bytearray(struct.pack( - icmp.icmp._PACK_STR, self.type_, self.code, self.csum)) - self.buf += self.data.serialize() - self.csum_calc = packet_utils.checksum(self.buf) - struct.pack_into('!H', self.buf, 2, self.csum_calc) - - def test_init(self): - eq_(self.type_, self.ic.type) - eq_(self.code, self.ic.code) - eq_(self.csum, self.ic.csum) - eq_(str(self.data), str(self.ic.data)) - - def test_init_with_echo(self): - self.setUp_with_echo() - self.test_init() - - def test_init_with_dest_unreach(self): - self.setUp_with_dest_unreach() - self.test_init() - - def test_init_with_TimeExceeded(self): - self.setUp_with_TimeExceeded() - self.test_init() - - def test_parser(self): - _res = icmp.icmp.parser(six.binary_type(self.buf)) - if type(_res) is tuple: - res = _res[0] - else: - res = _res - - eq_(self.type_, res.type) - eq_(self.code, res.code) - eq_(self.csum_calc, res.csum) - eq_(str(self.data), str(res.data)) - - def test_parser_with_echo(self): - self.setUp_with_echo() - self.test_parser() - - def test_parser_with_dest_unreach(self): - self.setUp_with_dest_unreach() - self.test_parser() - - def test_parser_with_TimeExceeded(self): - self.setUp_with_TimeExceeded() - self.test_parser() - - def test_serialize(self): - data = bytearray() - prev = None - buf = self.ic.serialize(data, prev) - - res = struct.unpack_from(icmp.icmp._PACK_STR, six.binary_type(buf)) - - eq_(self.type_, res[0]) - eq_(self.code, res[1]) - eq_(self.csum_calc, res[2]) - - def test_serialize_with_echo(self): - self.setUp_with_echo() - self.test_serialize() - - data = bytearray() - prev = None - buf = self.ic.serialize(data, prev) - echo = icmp.echo.parser(six.binary_type(buf), icmp.icmp._MIN_LEN) - eq_(repr(self.data), repr(echo)) - - def test_serialize_with_dest_unreach(self): - self.setUp_with_dest_unreach() - self.test_serialize() - - data = bytearray() - prev = None - buf = self.ic.serialize(data, prev) - unreach = icmp.dest_unreach.parser(six.binary_type(buf), icmp.icmp._MIN_LEN) - eq_(repr(self.data), repr(unreach)) - - def test_serialize_with_TimeExceeded(self): - self.setUp_with_TimeExceeded() - self.test_serialize() - - data = bytearray() - prev = None - buf = self.ic.serialize(data, prev) - te = icmp.TimeExceeded.parser(six.binary_type(buf), icmp.icmp._MIN_LEN) - eq_(repr(self.data), repr(te)) - - def test_to_string(self): - icmp_values = {'type': repr(self.type_), - 'code': repr(self.code), - 'csum': repr(self.csum), - 'data': repr(self.data)} - _ic_str = ','.join(['%s=%s' % (k, icmp_values[k]) - for k, v in inspect.getmembers(self.ic) - if k in icmp_values]) - ic_str = '%s(%s)' % (icmp.icmp.__name__, _ic_str) - - eq_(str(self.ic), ic_str) - eq_(repr(self.ic), ic_str) - - def test_to_string_with_echo(self): - self.setUp_with_echo() - self.test_to_string() - - def test_to_string_with_dest_unreach(self): - self.setUp_with_dest_unreach() - self.test_to_string() - - def test_to_string_with_TimeExceeded(self): - self.setUp_with_TimeExceeded() - self.test_to_string() - - def test_default_args(self): - ic = icmp.icmp() - buf = ic.serialize(bytearray(), None) - res = struct.unpack(icmp.icmp._PACK_STR, six.binary_type(buf[:4])) - - eq_(res[0], 8) - eq_(res[1], 0) - eq_(buf[4:], b'\x00\x00\x00\x00') - - # with data - ic = icmp.icmp(type_=icmp.ICMP_DEST_UNREACH, data=icmp.dest_unreach()) - buf = ic.serialize(bytearray(), None) - res = struct.unpack(icmp.icmp._PACK_STR, six.binary_type(buf[:4])) - - eq_(res[0], 3) - eq_(res[1], 0) - eq_(buf[4:], b'\x00\x00\x00\x00') - - def test_json(self): - jsondict = self.ic.to_jsondict() - ic = icmp.icmp.from_jsondict(jsondict['icmp']) - eq_(str(self.ic), str(ic)) - - def test_json_with_echo(self): - self.setUp_with_echo() - self.test_json() - - def test_json_with_dest_unreach(self): - self.setUp_with_dest_unreach() - self.test_json() - - def test_json_with_TimeExceeded(self): - self.setUp_with_TimeExceeded() - self.test_json() - - -class Test_echo(unittest.TestCase): - - def setUp(self): - self.id_ = 13379 - self.seq = 1 - self.data = b'\x30\x0e\x09\x00\x00\x00\x00\x00' \ - + b'\x10\x11\x12\x13\x14\x15\x16\x17' \ - + b'\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f' \ - + b'\x20\x21\x22\x23\x24\x25\x26\x27' \ - + b'\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f' \ - + b'\x30\x31\x32\x33\x34\x35\x36\x37' - self.echo = icmp.echo( - self.id_, self.seq, self.data) - self.buf = struct.pack('!HH', self.id_, self.seq) - self.buf += self.data - - def test_init(self): - eq_(self.id_, self.echo.id) - eq_(self.seq, self.echo.seq) - eq_(self.data, self.echo.data) - - def test_parser(self): - _res = icmp.echo.parser(self.buf, 0) - if type(_res) is tuple: - res = _res[0] - else: - res = _res - eq_(self.id_, res.id) - eq_(self.seq, res.seq) - eq_(self.data, res.data) - - def test_serialize(self): - buf = self.echo.serialize() - res = struct.unpack_from('!HH', six.binary_type(buf)) - eq_(self.id_, res[0]) - eq_(self.seq, res[1]) - eq_(self.data, buf[struct.calcsize('!HH'):]) - - def test_default_args(self): - ec = icmp.echo() - buf = ec.serialize() - res = struct.unpack(icmp.echo._PACK_STR, six.binary_type(buf)) - - eq_(res[0], 0) - eq_(res[1], 0) - - -class Test_dest_unreach(unittest.TestCase): - - def setUp(self): - self.mtu = 10 - self.data = b'abc' - self.data_len = len(self.data) - self.dest_unreach = icmp.dest_unreach( - data_len=self.data_len, mtu=self.mtu, data=self.data) - self.buf = struct.pack('!xBH', self.data_len, self.mtu) - self.buf += self.data - - def test_init(self): - eq_(self.data_len, self.dest_unreach.data_len) - eq_(self.mtu, self.dest_unreach.mtu) - eq_(self.data, self.dest_unreach.data) - - def test_parser(self): - _res = icmp.dest_unreach.parser(self.buf, 0) - if type(_res) is tuple: - res = _res[0] - else: - res = _res - eq_(self.data_len, res.data_len) - eq_(self.mtu, res.mtu) - eq_(self.data, res.data) - - def test_serialize(self): - buf = self.dest_unreach.serialize() - res = struct.unpack_from('!xBH', six.binary_type(buf)) - eq_(self.data_len, res[0]) - eq_(self.mtu, res[1]) - eq_(self.data, buf[struct.calcsize('!xBH'):]) - - def test_default_args(self): - du = icmp.dest_unreach() - buf = du.serialize() - res = struct.unpack(icmp.dest_unreach._PACK_STR, six.binary_type(buf)) - - eq_(res[0], 0) - eq_(res[1], 0) - - -class Test_TimeExceeded(unittest.TestCase): - - def setUp(self): - self.data = b'abc' - self.data_len = len(self.data) - self.te = icmp.TimeExceeded( - data_len=self.data_len, data=self.data) - self.buf = struct.pack('!xBxx', self.data_len) - self.buf += self.data - - def test_init(self): - eq_(self.data_len, self.te.data_len) - eq_(self.data, self.te.data) - - def test_parser(self): - _res = icmp.TimeExceeded.parser(self.buf, 0) - if type(_res) is tuple: - res = _res[0] - else: - res = _res - eq_(self.data_len, res.data_len) - eq_(self.data, res.data) - - def test_serialize(self): - buf = self.te.serialize() - res = struct.unpack_from('!xBxx', six.binary_type(buf)) - eq_(self.data_len, res[0]) - eq_(self.data, buf[struct.calcsize('!xBxx'):]) - - def test_default_args(self): - te = icmp.TimeExceeded() - buf = te.serialize() - res = struct.unpack(icmp.TimeExceeded._PACK_STR, six.binary_type(buf)) - - eq_(res[0], 0) diff --git a/tests/unit/packet/test_icmpv6.py b/tests/unit/packet/test_icmpv6.py deleted file mode 100644 index c6438171..00000000 --- a/tests/unit/packet/test_icmpv6.py +++ /dev/null @@ -1,2039 +0,0 @@ -# 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. - -# vim: tabstop=4 shiftwidth=4 softtabstop=4 - -import unittest -import logging -import six -import struct -import inspect - -from nose.tools import ok_, eq_, nottest, raises -from ryu.ofproto import ether, inet -from ryu.lib.packet.ethernet import ethernet -from ryu.lib.packet.packet import Packet -from ryu.lib.packet import icmpv6 -from ryu.lib.packet.ipv6 import ipv6 -from ryu.lib.packet import packet_utils -from ryu.lib import addrconv - - -LOG = logging.getLogger(__name__) - - -def icmpv6_csum(prev, buf): - ph = struct.pack('!16s16sI3xB', - addrconv.ipv6.text_to_bin(prev.src), - addrconv.ipv6.text_to_bin(prev.dst), - prev.payload_length, prev.nxt) - h = bytearray(buf) - struct.pack_into('!H', h, 2, 0) - - return packet_utils.checksum(ph + h) - - -class Test_icmpv6_header(unittest.TestCase): - type_ = 255 - code = 0 - csum = 207 - buf = b'\xff\x00\x00\xcf' - icmp = icmpv6.icmpv6(type_, code, 0) - - def setUp(self): - pass - - def tearDown(self): - pass - - def test_init(self): - eq_(self.type_, self.icmp.type_) - eq_(self.code, self.icmp.code) - eq_(0, self.icmp.csum) - - def test_parser(self): - msg, n, _ = self.icmp.parser(self.buf) - - eq_(msg.type_, self.type_) - eq_(msg.code, self.code) - eq_(msg.csum, self.csum) - eq_(msg.data, None) - eq_(n, None) - - def test_serialize(self): - src_ipv6 = 'fe80::200:ff:fe00:ef' - dst_ipv6 = 'fe80::200:ff:fe00:1' - prev = ipv6(6, 0, 0, 4, 58, 255, src_ipv6, dst_ipv6) - - buf = self.icmp.serialize(bytearray(), prev) - (type_, code, csum) = struct.unpack(self.icmp._PACK_STR, six.binary_type(buf)) - - eq_(type_, self.type_) - eq_(code, self.code) - eq_(csum, self.csum) - - @raises(Exception) - def test_malformed_icmpv6(self): - m_short_buf = self.buf[1:self.icmp._MIN_LEN] - self.icmp.parser(m_short_buf) - - def test_default_args(self): - prev = ipv6(nxt=inet.IPPROTO_ICMPV6) - ic = icmpv6.icmpv6() - prev.serialize(ic, None) - buf = ic.serialize(bytearray(), prev) - res = struct.unpack(icmpv6.icmpv6._PACK_STR, six.binary_type(buf)) - - eq_(res[0], 0) - eq_(res[1], 0) - eq_(res[2], icmpv6_csum(prev, buf)) - - def test_json(self): - jsondict = self.icmp.to_jsondict() - icmp = icmpv6.icmpv6.from_jsondict(jsondict['icmpv6']) - eq_(str(self.icmp), str(icmp)) - - -class Test_icmpv6_echo_request(unittest.TestCase): - type_ = 128 - code = 0 - csum = 0xa572 - id_ = 0x7620 - seq = 0 - data = b'\x01\xc9\xe7\x36\xd3\x39\x06\x00' - buf = b'\x80\x00\xa5\x72\x76\x20\x00\x00' - - def setUp(self): - pass - - def tearDown(self): - pass - - def test_init(self): - echo = icmpv6.echo(0, 0) - eq_(echo.id, 0) - eq_(echo.seq, 0) - eq_(echo.data, None) - - def _test_parser(self, data=None): - buf = self.buf + (data or b'') - msg, n, _ = icmpv6.icmpv6.parser(buf) - - eq_(msg.type_, self.type_) - eq_(msg.code, self.code) - eq_(msg.csum, self.csum) - eq_(msg.data.id, self.id_) - eq_(msg.data.seq, self.seq) - eq_(msg.data.data, data) - eq_(n, None) - - def test_parser_without_data(self): - self._test_parser() - - def test_parser_with_data(self): - self._test_parser(self.data) - - def _test_serialize(self, echo_data=None): - buf = self.buf + (echo_data or b'') - src_ipv6 = '3ffe:507:0:1:200:86ff:fe05:80da' - dst_ipv6 = '3ffe:501:0:1001::2' - prev = ipv6(6, 0, 0, len(buf), 64, 255, src_ipv6, dst_ipv6) - echo_csum = icmpv6_csum(prev, buf) - - echo = icmpv6.echo(self.id_, self.seq, echo_data) - icmp = icmpv6.icmpv6(self.type_, self.code, 0, echo) - buf = six.binary_type(icmp.serialize(bytearray(), prev)) - - (type_, code, csum) = struct.unpack_from(icmp._PACK_STR, buf, 0) - (id_, seq) = struct.unpack_from(echo._PACK_STR, buf, icmp._MIN_LEN) - data = buf[(icmp._MIN_LEN + echo._MIN_LEN):] - data = data if len(data) != 0 else None - - eq_(type_, self.type_) - eq_(code, self.code) - eq_(csum, echo_csum) - eq_(id_, self.id_) - eq_(seq, self.seq) - eq_(data, echo_data) - - def test_serialize_without_data(self): - self._test_serialize() - - def test_serialize_with_data(self): - self._test_serialize(self.data) - - def test_to_string(self): - ec = icmpv6.echo(self.id_, self.seq, self.data) - ic = icmpv6.icmpv6(self.type_, self.code, self.csum, ec) - - echo_values = {'id': self.id_, - 'seq': self.seq, - 'data': self.data} - _echo_str = ','.join(['%s=%s' % (k, repr(echo_values[k])) - for k, v in inspect.getmembers(ec) - if k in echo_values]) - echo_str = '%s(%s)' % (icmpv6.echo.__name__, _echo_str) - - icmp_values = {'type_': repr(self.type_), - 'code': repr(self.code), - 'csum': repr(self.csum), - 'data': echo_str} - _ic_str = ','.join(['%s=%s' % (k, icmp_values[k]) - for k, v in inspect.getmembers(ic) - if k in icmp_values]) - ic_str = '%s(%s)' % (icmpv6.icmpv6.__name__, _ic_str) - - eq_(str(ic), ic_str) - eq_(repr(ic), ic_str) - - def test_default_args(self): - prev = ipv6(nxt=inet.IPPROTO_ICMPV6) - ic = icmpv6.icmpv6( - type_=icmpv6.ICMPV6_ECHO_REQUEST, data=icmpv6.echo()) - prev.serialize(ic, None) - buf = ic.serialize(bytearray(), prev) - res = struct.unpack(icmpv6.icmpv6._PACK_STR, six.binary_type(buf[:4])) - - eq_(res[0], icmpv6.ICMPV6_ECHO_REQUEST) - eq_(res[1], 0) - eq_(res[2], icmpv6_csum(prev, buf)) - - res = struct.unpack(icmpv6.echo._PACK_STR, six.binary_type(buf[4:])) - - eq_(res[0], 0) - eq_(res[1], 0) - - def test_json(self): - ec = icmpv6.echo(self.id_, self.seq, self.data) - ic1 = icmpv6.icmpv6(self.type_, self.code, self.csum, ec) - jsondict = ic1.to_jsondict() - ic2 = icmpv6.icmpv6.from_jsondict(jsondict['icmpv6']) - eq_(str(ic1), str(ic2)) - - -class Test_icmpv6_echo_reply(Test_icmpv6_echo_request): - def setUp(self): - self.type_ = 129 - self.csum = 0xa472 - self.buf = b'\x81\x00\xa4\x72\x76\x20\x00\x00' - - def test_default_args(self): - prev = ipv6(nxt=inet.IPPROTO_ICMPV6) - ic = icmpv6.icmpv6( - type_=icmpv6.ICMPV6_ECHO_REPLY, data=icmpv6.echo()) - prev.serialize(ic, None) - buf = ic.serialize(bytearray(), prev) - res = struct.unpack(icmpv6.icmpv6._PACK_STR, six.binary_type(buf[:4])) - - eq_(res[0], icmpv6.ICMPV6_ECHO_REPLY) - eq_(res[1], 0) - eq_(res[2], icmpv6_csum(prev, buf)) - - res = struct.unpack(icmpv6.echo._PACK_STR, six.binary_type(buf[4:])) - - eq_(res[0], 0) - eq_(res[1], 0) - - -class Test_icmpv6_neighbor_solicit(unittest.TestCase): - type_ = 135 - code = 0 - csum = 0x952d - res = 0 - dst = '3ffe:507:0:1:200:86ff:fe05:80da' - nd_type = 1 - nd_length = 1 - nd_hw_src = '00:60:97:07:69:ea' - data = b'\x01\x01\x00\x60\x97\x07\x69\xea' - buf = b'\x87\x00\x95\x2d\x00\x00\x00\x00' \ - + b'\x3f\xfe\x05\x07\x00\x00\x00\x01' \ - + b'\x02\x00\x86\xff\xfe\x05\x80\xda' - src_ipv6 = '3ffe:507:0:1:200:86ff:fe05:80da' - dst_ipv6 = '3ffe:501:0:1001::2' - - def setUp(self): - pass - - def tearDown(self): - pass - - def test_init(self): - nd = icmpv6.nd_neighbor(self.res, self.dst) - eq_(nd.res, self.res) - eq_(nd.dst, self.dst) - eq_(nd.option, None) - - def _test_parser(self, data=None): - buf = self.buf + (data or b'') - msg, n, _ = icmpv6.icmpv6.parser(buf) - - eq_(msg.type_, self.type_) - eq_(msg.code, self.code) - eq_(msg.csum, self.csum) - eq_(msg.data.res, self.res) - eq_(addrconv.ipv6.text_to_bin(msg.data.dst), - addrconv.ipv6.text_to_bin(self.dst)) - eq_(n, None) - if data: - nd = msg.data.option - eq_(nd.length, self.nd_length) - eq_(nd.hw_src, self.nd_hw_src) - eq_(nd.data, None) - - def test_parser_without_data(self): - self._test_parser() - - def test_parser_with_data(self): - self._test_parser(self.data) - - def test_serialize_without_data(self): - nd = icmpv6.nd_neighbor(self.res, self.dst) - prev = ipv6(6, 0, 0, 24, 64, 255, self.src_ipv6, self.dst_ipv6) - nd_csum = icmpv6_csum(prev, self.buf) - - icmp = icmpv6.icmpv6(self.type_, self.code, 0, nd) - buf = six.binary_type(icmp.serialize(bytearray(), prev)) - - (type_, code, csum) = struct.unpack_from(icmp._PACK_STR, buf, 0) - (res, dst) = struct.unpack_from(nd._PACK_STR, buf, icmp._MIN_LEN) - data = buf[(icmp._MIN_LEN + nd._MIN_LEN):] - - eq_(type_, self.type_) - eq_(code, self.code) - eq_(csum, nd_csum) - eq_(res >> 29, self.res) - eq_(dst, addrconv.ipv6.text_to_bin(self.dst)) - eq_(data, b'') - - def test_serialize_with_data(self): - nd_opt = icmpv6.nd_option_sla(self.nd_length, self.nd_hw_src) - nd = icmpv6.nd_neighbor(self.res, self.dst, nd_opt) - prev = ipv6(6, 0, 0, 32, 64, 255, self.src_ipv6, self.dst_ipv6) - nd_csum = icmpv6_csum(prev, self.buf + self.data) - - icmp = icmpv6.icmpv6(self.type_, self.code, 0, nd) - buf = six.binary_type(icmp.serialize(bytearray(), prev)) - - (type_, code, csum) = struct.unpack_from(icmp._PACK_STR, buf, 0) - (res, dst) = struct.unpack_from(nd._PACK_STR, buf, icmp._MIN_LEN) - (nd_type, nd_length, nd_hw_src) = struct.unpack_from( - nd_opt._PACK_STR, buf, icmp._MIN_LEN + nd._MIN_LEN) - data = buf[(icmp._MIN_LEN + nd._MIN_LEN + 8):] - - eq_(type_, self.type_) - eq_(code, self.code) - eq_(csum, nd_csum) - eq_(res >> 29, self.res) - eq_(dst, addrconv.ipv6.text_to_bin(self.dst)) - eq_(nd_type, self.nd_type) - eq_(nd_length, self.nd_length) - eq_(nd_hw_src, addrconv.mac.text_to_bin(self.nd_hw_src)) - - def test_to_string(self): - nd_opt = icmpv6.nd_option_sla(self.nd_length, self.nd_hw_src) - nd = icmpv6.nd_neighbor(self.res, self.dst, nd_opt) - ic = icmpv6.icmpv6(self.type_, self.code, self.csum, nd) - - nd_opt_values = {'length': self.nd_length, - 'hw_src': self.nd_hw_src, - 'data': None} - _nd_opt_str = ','.join(['%s=%s' % (k, repr(nd_opt_values[k])) - for k, v in inspect.getmembers(nd_opt) - if k in nd_opt_values]) - nd_opt_str = '%s(%s)' % (icmpv6.nd_option_sla.__name__, _nd_opt_str) - - nd_values = {'res': repr(nd.res), - 'dst': repr(self.dst), - 'option': nd_opt_str} - _nd_str = ','.join(['%s=%s' % (k, nd_values[k]) - for k, v in inspect.getmembers(nd) - if k in nd_values]) - nd_str = '%s(%s)' % (icmpv6.nd_neighbor.__name__, _nd_str) - - icmp_values = {'type_': repr(self.type_), - 'code': repr(self.code), - 'csum': repr(self.csum), - 'data': nd_str} - _ic_str = ','.join(['%s=%s' % (k, icmp_values[k]) - for k, v in inspect.getmembers(ic) - if k in icmp_values]) - ic_str = '%s(%s)' % (icmpv6.icmpv6.__name__, _ic_str) - - eq_(str(ic), ic_str) - eq_(repr(ic), ic_str) - - def test_default_args(self): - prev = ipv6(nxt=inet.IPPROTO_ICMPV6) - ic = icmpv6.icmpv6( - type_=icmpv6.ND_NEIGHBOR_SOLICIT, data=icmpv6.nd_neighbor()) - prev.serialize(ic, None) - buf = ic.serialize(bytearray(), prev) - res = struct.unpack(icmpv6.icmpv6._PACK_STR, six.binary_type(buf[:4])) - - eq_(res[0], icmpv6.ND_NEIGHBOR_SOLICIT) - eq_(res[1], 0) - eq_(res[2], icmpv6_csum(prev, buf)) - - res = struct.unpack(icmpv6.nd_neighbor._PACK_STR, six.binary_type(buf[4:])) - - eq_(res[0], 0) - eq_(res[1], addrconv.ipv6.text_to_bin('::')) - - # with nd_option_sla - prev = ipv6(nxt=inet.IPPROTO_ICMPV6) - ic = icmpv6.icmpv6( - type_=icmpv6.ND_NEIGHBOR_SOLICIT, - data=icmpv6.nd_neighbor( - option=icmpv6.nd_option_sla())) - prev.serialize(ic, None) - buf = ic.serialize(bytearray(), prev) - res = struct.unpack(icmpv6.icmpv6._PACK_STR, six.binary_type(buf[:4])) - - eq_(res[0], icmpv6.ND_NEIGHBOR_SOLICIT) - eq_(res[1], 0) - eq_(res[2], icmpv6_csum(prev, buf)) - - res = struct.unpack(icmpv6.nd_neighbor._PACK_STR, - six.binary_type(buf[4:24])) - - eq_(res[0], 0) - eq_(res[1], addrconv.ipv6.text_to_bin('::')) - - res = struct.unpack(icmpv6.nd_option_sla._PACK_STR, - six.binary_type(buf[24:])) - - eq_(res[0], icmpv6.ND_OPTION_SLA) - eq_(res[1], len(icmpv6.nd_option_sla()) // 8) - eq_(res[2], addrconv.mac.text_to_bin('00:00:00:00:00:00')) - - def test_json(self): - nd_opt = icmpv6.nd_option_sla(self.nd_length, self.nd_hw_src) - nd = icmpv6.nd_neighbor(self.res, self.dst, nd_opt) - ic1 = icmpv6.icmpv6(self.type_, self.code, self.csum, nd) - jsondict = ic1.to_jsondict() - ic2 = icmpv6.icmpv6.from_jsondict(jsondict['icmpv6']) - eq_(str(ic1), str(ic2)) - - -class Test_icmpv6_neighbor_advert(Test_icmpv6_neighbor_solicit): - def setUp(self): - self.type_ = 136 - self.csum = 0xb8ba - self.res = 7 - self.dst = '3ffe:507:0:1:260:97ff:fe07:69ea' - self.nd_type = 2 - self.nd_length = 1 - self.nd_data = None - self.nd_hw_src = '00:60:97:07:69:ea' - self.data = b'\x02\x01\x00\x60\x97\x07\x69\xea' - self.buf = b'\x88\x00\xb8\xba\xe0\x00\x00\x00' \ - + b'\x3f\xfe\x05\x07\x00\x00\x00\x01' \ - + b'\x02\x60\x97\xff\xfe\x07\x69\xea' - - def test_serialize_with_data(self): - nd_opt = icmpv6.nd_option_tla(self.nd_length, self.nd_hw_src) - nd = icmpv6.nd_neighbor(self.res, self.dst, nd_opt) - prev = ipv6(6, 0, 0, 32, 64, 255, self.src_ipv6, self.dst_ipv6) - nd_csum = icmpv6_csum(prev, self.buf + self.data) - - icmp = icmpv6.icmpv6(self.type_, self.code, 0, nd) - buf = six.binary_type(icmp.serialize(bytearray(), prev)) - - (type_, code, csum) = struct.unpack_from(icmp._PACK_STR, buf, 0) - (res, dst) = struct.unpack_from(nd._PACK_STR, buf, icmp._MIN_LEN) - (nd_type, nd_length, nd_hw_src) = struct.unpack_from( - nd_opt._PACK_STR, buf, icmp._MIN_LEN + nd._MIN_LEN) - data = buf[(icmp._MIN_LEN + nd._MIN_LEN + 8):] - - eq_(type_, self.type_) - eq_(code, self.code) - eq_(csum, nd_csum) - eq_(res >> 29, self.res) - eq_(dst, addrconv.ipv6.text_to_bin(self.dst)) - eq_(nd_type, self.nd_type) - eq_(nd_length, self.nd_length) - eq_(nd_hw_src, addrconv.mac.text_to_bin(self.nd_hw_src)) - - def test_to_string(self): - nd_opt = icmpv6.nd_option_tla(self.nd_length, self.nd_hw_src) - nd = icmpv6.nd_neighbor(self.res, self.dst, nd_opt) - ic = icmpv6.icmpv6(self.type_, self.code, self.csum, nd) - - nd_opt_values = {'length': self.nd_length, - 'hw_src': self.nd_hw_src, - 'data': None} - _nd_opt_str = ','.join(['%s=%s' % (k, repr(nd_opt_values[k])) - for k, v in inspect.getmembers(nd_opt) - if k in nd_opt_values]) - nd_opt_str = '%s(%s)' % (icmpv6.nd_option_tla.__name__, _nd_opt_str) - - nd_values = {'res': repr(nd.res), - 'dst': repr(self.dst), - 'option': nd_opt_str} - _nd_str = ','.join(['%s=%s' % (k, nd_values[k]) - for k, v in inspect.getmembers(nd) - if k in nd_values]) - nd_str = '%s(%s)' % (icmpv6.nd_neighbor.__name__, _nd_str) - - icmp_values = {'type_': repr(self.type_), - 'code': repr(self.code), - 'csum': repr(self.csum), - 'data': nd_str} - _ic_str = ','.join(['%s=%s' % (k, icmp_values[k]) - for k, v in inspect.getmembers(ic) - if k in icmp_values]) - ic_str = '%s(%s)' % (icmpv6.icmpv6.__name__, _ic_str) - - eq_(str(ic), ic_str) - eq_(repr(ic), ic_str) - - def test_default_args(self): - prev = ipv6(nxt=inet.IPPROTO_ICMPV6) - ic = icmpv6.icmpv6( - type_=icmpv6.ND_NEIGHBOR_ADVERT, data=icmpv6.nd_neighbor()) - prev.serialize(ic, None) - buf = ic.serialize(bytearray(), prev) - res = struct.unpack(icmpv6.icmpv6._PACK_STR, six.binary_type(buf[:4])) - - eq_(res[0], icmpv6.ND_NEIGHBOR_ADVERT) - eq_(res[1], 0) - eq_(res[2], icmpv6_csum(prev, buf)) - - res = struct.unpack(icmpv6.nd_neighbor._PACK_STR, six.binary_type(buf[4:])) - - eq_(res[0], 0) - eq_(res[1], addrconv.ipv6.text_to_bin('::')) - - # with nd_option_tla - prev = ipv6(nxt=inet.IPPROTO_ICMPV6) - ic = icmpv6.icmpv6( - type_=icmpv6.ND_NEIGHBOR_ADVERT, - data=icmpv6.nd_neighbor( - option=icmpv6.nd_option_tla())) - prev.serialize(ic, None) - buf = ic.serialize(bytearray(), prev) - res = struct.unpack(icmpv6.icmpv6._PACK_STR, six.binary_type(buf[:4])) - - eq_(res[0], icmpv6.ND_NEIGHBOR_ADVERT) - eq_(res[1], 0) - eq_(res[2], icmpv6_csum(prev, buf)) - - res = struct.unpack(icmpv6.nd_neighbor._PACK_STR, - six.binary_type(buf[4:24])) - - eq_(res[0], 0) - eq_(res[1], addrconv.ipv6.text_to_bin('::')) - - res = struct.unpack(icmpv6.nd_option_tla._PACK_STR, - six.binary_type(buf[24:])) - - eq_(res[0], icmpv6.ND_OPTION_TLA) - eq_(res[1], len(icmpv6.nd_option_tla()) // 8) - eq_(res[2], addrconv.mac.text_to_bin('00:00:00:00:00:00')) - - -class Test_icmpv6_router_solicit(unittest.TestCase): - type_ = 133 - code = 0 - csum = 0x97d9 - res = 0 - nd_type = 1 - nd_length = 1 - nd_hw_src = '12:2d:a5:6d:bc:0f' - data = b'\x00\x00\x00\x00\x01\x01\x12\x2d\xa5\x6d\xbc\x0f' - buf = b'\x85\x00\x97\xd9' - src_ipv6 = '3ffe:507:0:1:200:86ff:fe05:80da' - dst_ipv6 = '3ffe:501:0:1001::2' - - def setUp(self): - pass - - def tearDown(self): - pass - - def test_init(self): - rs = icmpv6.nd_router_solicit(self.res) - eq_(rs.res, self.res) - eq_(rs.option, None) - - def _test_parser(self, data=None): - buf = self.buf + (data or b'') - msg, n, _ = icmpv6.icmpv6.parser(buf) - - eq_(msg.type_, self.type_) - eq_(msg.code, self.code) - eq_(msg.csum, self.csum) - if data is not None: - eq_(msg.data.res, self.res) - eq_(n, None) - if data: - rs = msg.data.option - eq_(rs.length, self.nd_length) - eq_(rs.hw_src, self.nd_hw_src) - eq_(rs.data, None) - - def test_parser_without_data(self): - self._test_parser() - - def test_parser_with_data(self): - self._test_parser(self.data) - - def test_serialize_without_data(self): - rs = icmpv6.nd_router_solicit(self.res) - prev = ipv6(6, 0, 0, 8, 64, 255, self.src_ipv6, self.dst_ipv6) - rs_csum = icmpv6_csum(prev, self.buf) - - icmp = icmpv6.icmpv6(self.type_, self.code, 0, rs) - buf = six.binary_type(icmp.serialize(bytearray(), prev)) - - (type_, code, csum) = struct.unpack_from(icmp._PACK_STR, buf, 0) - res = struct.unpack_from(rs._PACK_STR, buf, icmp._MIN_LEN) - data = buf[(icmp._MIN_LEN + rs._MIN_LEN):] - - eq_(type_, self.type_) - eq_(code, self.code) - eq_(csum, rs_csum) - eq_(res[0], self.res) - eq_(data, b'') - - def test_serialize_with_data(self): - nd_opt = icmpv6.nd_option_sla(self.nd_length, self.nd_hw_src) - rs = icmpv6.nd_router_solicit(self.res, nd_opt) - prev = ipv6(6, 0, 0, 16, 64, 255, self.src_ipv6, self.dst_ipv6) - rs_csum = icmpv6_csum(prev, self.buf + self.data) - - icmp = icmpv6.icmpv6(self.type_, self.code, 0, rs) - buf = six.binary_type(icmp.serialize(bytearray(), prev)) - - (type_, code, csum) = struct.unpack_from(icmp._PACK_STR, buf, 0) - res = struct.unpack_from(rs._PACK_STR, buf, icmp._MIN_LEN) - (nd_type, nd_length, nd_hw_src) = struct.unpack_from( - nd_opt._PACK_STR, buf, icmp._MIN_LEN + rs._MIN_LEN) - data = buf[(icmp._MIN_LEN + rs._MIN_LEN + 8):] - - eq_(type_, self.type_) - eq_(code, self.code) - eq_(csum, rs_csum) - eq_(res[0], self.res) - eq_(nd_type, self.nd_type) - eq_(nd_length, self.nd_length) - eq_(nd_hw_src, addrconv.mac.text_to_bin(self.nd_hw_src)) - - def test_to_string(self): - nd_opt = icmpv6.nd_option_sla(self.nd_length, self.nd_hw_src) - rs = icmpv6.nd_router_solicit(self.res, nd_opt) - ic = icmpv6.icmpv6(self.type_, self.code, self.csum, rs) - - nd_opt_values = {'length': self.nd_length, - 'hw_src': self.nd_hw_src, - 'data': None} - _nd_opt_str = ','.join(['%s=%s' % (k, repr(nd_opt_values[k])) - for k, v in inspect.getmembers(nd_opt) - if k in nd_opt_values]) - nd_opt_str = '%s(%s)' % (icmpv6.nd_option_sla.__name__, _nd_opt_str) - - rs_values = {'res': repr(rs.res), - 'option': nd_opt_str} - _rs_str = ','.join(['%s=%s' % (k, rs_values[k]) - for k, v in inspect.getmembers(rs) - if k in rs_values]) - rs_str = '%s(%s)' % (icmpv6.nd_router_solicit.__name__, _rs_str) - - icmp_values = {'type_': repr(self.type_), - 'code': repr(self.code), - 'csum': repr(self.csum), - 'data': rs_str} - _ic_str = ','.join(['%s=%s' % (k, icmp_values[k]) - for k, v in inspect.getmembers(ic) - if k in icmp_values]) - ic_str = '%s(%s)' % (icmpv6.icmpv6.__name__, _ic_str) - - eq_(str(ic), ic_str) - eq_(repr(ic), ic_str) - - def test_default_args(self): - prev = ipv6(nxt=inet.IPPROTO_ICMPV6) - ic = icmpv6.icmpv6( - type_=icmpv6.ND_ROUTER_SOLICIT, data=icmpv6.nd_router_solicit()) - prev.serialize(ic, None) - buf = ic.serialize(bytearray(), prev) - res = struct.unpack(icmpv6.icmpv6._PACK_STR, six.binary_type(buf[:4])) - - eq_(res[0], icmpv6.ND_ROUTER_SOLICIT) - eq_(res[1], 0) - eq_(res[2], icmpv6_csum(prev, buf)) - - res = struct.unpack(icmpv6.nd_router_solicit._PACK_STR, - six.binary_type(buf[4:])) - - eq_(res[0], 0) - - # with nd_option_sla - prev = ipv6(nxt=inet.IPPROTO_ICMPV6) - ic = icmpv6.icmpv6( - type_=icmpv6.ND_ROUTER_SOLICIT, - data=icmpv6.nd_router_solicit( - option=icmpv6.nd_option_sla())) - prev.serialize(ic, None) - buf = ic.serialize(bytearray(), prev) - res = struct.unpack(icmpv6.icmpv6._PACK_STR, six.binary_type(buf[:4])) - - eq_(res[0], icmpv6.ND_ROUTER_SOLICIT) - eq_(res[1], 0) - eq_(res[2], icmpv6_csum(prev, buf)) - - res = struct.unpack(icmpv6.nd_router_solicit._PACK_STR, - six.binary_type(buf[4:8])) - - eq_(res[0], 0) - - res = struct.unpack(icmpv6.nd_option_sla._PACK_STR, - six.binary_type(buf[8:])) - - eq_(res[0], icmpv6.ND_OPTION_SLA) - eq_(res[1], len(icmpv6.nd_option_sla()) // 8) - eq_(res[2], addrconv.mac.text_to_bin('00:00:00:00:00:00')) - - def test_json(self): - nd_opt = icmpv6.nd_option_sla(self.nd_length, self.nd_hw_src) - rs = icmpv6.nd_router_solicit(self.res, nd_opt) - ic1 = icmpv6.icmpv6(self.type_, self.code, self.csum, rs) - jsondict = ic1.to_jsondict() - ic2 = icmpv6.icmpv6.from_jsondict(jsondict['icmpv6']) - eq_(str(ic1), str(ic2)) - - -class Test_icmpv6_router_advert(unittest.TestCase): - - def setUp(self): - pass - - def tearDown(self): - pass - - def test_default_args(self): - prev = ipv6(nxt=inet.IPPROTO_ICMPV6) - ic = icmpv6.icmpv6( - type_=icmpv6.ND_ROUTER_ADVERT, data=icmpv6.nd_router_advert()) - prev.serialize(ic, None) - buf = ic.serialize(bytearray(), prev) - res = struct.unpack(icmpv6.icmpv6._PACK_STR, six.binary_type(buf[:4])) - - eq_(res[0], icmpv6.ND_ROUTER_ADVERT) - eq_(res[1], 0) - eq_(res[2], icmpv6_csum(prev, buf)) - - res = struct.unpack(icmpv6.nd_router_advert._PACK_STR, - six.binary_type(buf[4:])) - - eq_(res[0], 0) - eq_(res[1], 0) - eq_(res[2], 0) - eq_(res[3], 0) - eq_(res[4], 0) - - # with nd_option_sla - prev = ipv6(nxt=inet.IPPROTO_ICMPV6) - ic = icmpv6.icmpv6( - type_=icmpv6.ND_ROUTER_ADVERT, - data=icmpv6.nd_router_advert( - options=[icmpv6.nd_option_sla()])) - prev.serialize(ic, None) - buf = ic.serialize(bytearray(), prev) - res = struct.unpack(icmpv6.icmpv6._PACK_STR, six.binary_type(buf[:4])) - - eq_(res[0], icmpv6.ND_ROUTER_ADVERT) - eq_(res[1], 0) - eq_(res[2], icmpv6_csum(prev, buf)) - - res = struct.unpack(icmpv6.nd_router_advert._PACK_STR, - six.binary_type(buf[4:16])) - - eq_(res[0], 0) - eq_(res[1], 0) - eq_(res[2], 0) - eq_(res[3], 0) - eq_(res[4], 0) - - res = struct.unpack(icmpv6.nd_option_sla._PACK_STR, - six.binary_type(buf[16:])) - - eq_(res[0], icmpv6.ND_OPTION_SLA) - eq_(res[1], len(icmpv6.nd_option_sla()) // 8) - eq_(res[2], addrconv.mac.text_to_bin('00:00:00:00:00:00')) - - # with nd_option_pi - prev = ipv6(nxt=inet.IPPROTO_ICMPV6) - ic = icmpv6.icmpv6( - type_=icmpv6.ND_ROUTER_ADVERT, - data=icmpv6.nd_router_advert( - options=[icmpv6.nd_option_pi()])) - prev.serialize(ic, None) - buf = ic.serialize(bytearray(), prev) - res = struct.unpack(icmpv6.icmpv6._PACK_STR, six.binary_type(buf[:4])) - - eq_(res[0], icmpv6.ND_ROUTER_ADVERT) - eq_(res[1], 0) - eq_(res[2], icmpv6_csum(prev, buf)) - - res = struct.unpack(icmpv6.nd_router_advert._PACK_STR, - six.binary_type(buf[4:16])) - - eq_(res[0], 0) - eq_(res[1], 0) - eq_(res[2], 0) - eq_(res[3], 0) - eq_(res[4], 0) - - res = struct.unpack(icmpv6.nd_option_pi._PACK_STR, - six.binary_type(buf[16:])) - - eq_(res[0], icmpv6.ND_OPTION_PI) - eq_(res[1], 4) - eq_(res[2], 0) - eq_(res[3], 0) - eq_(res[4], 0) - eq_(res[5], 0) - eq_(res[6], 0) - eq_(res[7], addrconv.ipv6.text_to_bin('::')) - - # with nd_option_sla and nd_option_pi - prev = ipv6(nxt=inet.IPPROTO_ICMPV6) - ic = icmpv6.icmpv6( - type_=icmpv6.ND_ROUTER_ADVERT, - data=icmpv6.nd_router_advert( - options=[icmpv6.nd_option_sla(), icmpv6.nd_option_pi()])) - prev.serialize(ic, None) - buf = ic.serialize(bytearray(), prev) - res = struct.unpack(icmpv6.icmpv6._PACK_STR, six.binary_type(buf[:4])) - - eq_(res[0], icmpv6.ND_ROUTER_ADVERT) - eq_(res[1], 0) - eq_(res[2], icmpv6_csum(prev, buf)) - - res = struct.unpack(icmpv6.nd_router_advert._PACK_STR, - six.binary_type(buf[4:16])) - - eq_(res[0], 0) - eq_(res[1], 0) - eq_(res[2], 0) - eq_(res[3], 0) - eq_(res[4], 0) - - res = struct.unpack(icmpv6.nd_option_sla._PACK_STR, - six.binary_type(buf[16:24])) - - eq_(res[0], icmpv6.ND_OPTION_SLA) - eq_(res[1], len(icmpv6.nd_option_sla()) // 8) - eq_(res[2], addrconv.mac.text_to_bin('00:00:00:00:00:00')) - - res = struct.unpack(icmpv6.nd_option_pi._PACK_STR, - six.binary_type(buf[24:])) - - eq_(res[0], icmpv6.ND_OPTION_PI) - eq_(res[1], len(icmpv6.nd_option_pi()) // 8) - eq_(res[2], 0) - eq_(res[3], 0) - eq_(res[4], 0) - eq_(res[5], 0) - eq_(res[6], 0) - eq_(res[7], addrconv.ipv6.text_to_bin('::')) - - def test_json(self): - ic1 = icmpv6.icmpv6( - type_=icmpv6.ND_ROUTER_ADVERT, - data=icmpv6.nd_router_advert( - options=[icmpv6.nd_option_sla(), icmpv6.nd_option_pi()])) - jsondict = ic1.to_jsondict() - ic2 = icmpv6.icmpv6.from_jsondict(jsondict['icmpv6']) - eq_(str(ic1), str(ic2)) - - -class Test_icmpv6_nd_option_la(unittest.TestCase): - - def setUp(self): - pass - - def tearDown(self): - pass - - def test_default_args(self): - la = icmpv6.nd_option_sla() - buf = la.serialize() - res = struct.unpack(icmpv6.nd_option_sla._PACK_STR, six.binary_type(buf)) - - eq_(res[0], icmpv6.ND_OPTION_SLA) - eq_(res[1], len(icmpv6.nd_option_sla()) // 8) - eq_(res[2], addrconv.mac.text_to_bin('00:00:00:00:00:00')) - - # with nd_neighbor - prev = ipv6(nxt=inet.IPPROTO_ICMPV6) - ic = icmpv6.icmpv6( - type_=icmpv6.ND_NEIGHBOR_ADVERT, - data=icmpv6.nd_neighbor( - option=icmpv6.nd_option_tla())) - prev.serialize(ic, None) - buf = ic.serialize(bytearray(), prev) - res = struct.unpack(icmpv6.icmpv6._PACK_STR, six.binary_type(buf[:4])) - - eq_(res[0], icmpv6.ND_NEIGHBOR_ADVERT) - eq_(res[1], 0) - eq_(res[2], icmpv6_csum(prev, buf)) - - res = struct.unpack(icmpv6.nd_neighbor._PACK_STR, - six.binary_type(buf[4:24])) - - eq_(res[0], 0) - eq_(res[1], addrconv.ipv6.text_to_bin('::')) - - res = struct.unpack(icmpv6.nd_option_tla._PACK_STR, - six.binary_type(buf[24:])) - - eq_(res[0], icmpv6.ND_OPTION_TLA) - eq_(res[1], len(icmpv6.nd_option_tla()) // 8) - eq_(res[2], addrconv.mac.text_to_bin('00:00:00:00:00:00')) - - # with nd_router_solicit - prev = ipv6(nxt=inet.IPPROTO_ICMPV6) - ic = icmpv6.icmpv6( - type_=icmpv6.ND_ROUTER_SOLICIT, - data=icmpv6.nd_router_solicit( - option=icmpv6.nd_option_sla())) - prev.serialize(ic, None) - buf = ic.serialize(bytearray(), prev) - res = struct.unpack(icmpv6.icmpv6._PACK_STR, six.binary_type(buf[:4])) - - eq_(res[0], icmpv6.ND_ROUTER_SOLICIT) - eq_(res[1], 0) - eq_(res[2], icmpv6_csum(prev, buf)) - - res = struct.unpack(icmpv6.nd_router_solicit._PACK_STR, - six.binary_type(buf[4:8])) - - eq_(res[0], 0) - - res = struct.unpack(icmpv6.nd_option_sla._PACK_STR, - six.binary_type(buf[8:])) - - eq_(res[0], icmpv6.ND_OPTION_SLA) - eq_(res[1], len(icmpv6.nd_option_sla()) // 8) - eq_(res[2], addrconv.mac.text_to_bin('00:00:00:00:00:00')) - - -class Test_icmpv6_nd_option_pi(unittest.TestCase): - - def setUp(self): - pass - - def tearDown(self): - pass - - def test_default_args(self): - pi = icmpv6.nd_option_pi() - buf = pi.serialize() - res = struct.unpack(icmpv6.nd_option_pi._PACK_STR, six.binary_type(buf)) - - eq_(res[0], icmpv6.ND_OPTION_PI) - eq_(res[1], len(icmpv6.nd_option_pi()) // 8) - eq_(res[2], 0) - eq_(res[3], 0) - eq_(res[4], 0) - eq_(res[5], 0) - eq_(res[6], 0) - eq_(res[7], addrconv.ipv6.text_to_bin('::')) - - # with nd_router_advert - prev = ipv6(nxt=inet.IPPROTO_ICMPV6) - ic = icmpv6.icmpv6( - type_=icmpv6.ND_ROUTER_ADVERT, - data=icmpv6.nd_router_advert( - options=[icmpv6.nd_option_pi()])) - prev.serialize(ic, None) - buf = ic.serialize(bytearray(), prev) - res = struct.unpack(icmpv6.icmpv6._PACK_STR, six.binary_type(buf[:4])) - - eq_(res[0], icmpv6.ND_ROUTER_ADVERT) - eq_(res[1], 0) - eq_(res[2], icmpv6_csum(prev, buf)) - - res = struct.unpack(icmpv6.nd_router_advert._PACK_STR, - six.binary_type(buf[4:16])) - - eq_(res[0], 0) - eq_(res[1], 0) - eq_(res[2], 0) - eq_(res[3], 0) - eq_(res[4], 0) - - res = struct.unpack(icmpv6.nd_option_pi._PACK_STR, - six.binary_type(buf[16:])) - - eq_(res[0], icmpv6.ND_OPTION_PI) - eq_(res[1], 4) - eq_(res[2], 0) - eq_(res[3], 0) - eq_(res[4], 0) - eq_(res[5], 0) - eq_(res[6], 0) - eq_(res[7], addrconv.ipv6.text_to_bin('::')) - - -class Test_icmpv6_membership_query(unittest.TestCase): - type_ = 130 - code = 0 - csum = 0xb5a4 - maxresp = 10000 - address = 'ff08::1' - buf = b'\x82\x00\xb5\xa4\x27\x10\x00\x00' \ - + b'\xff\x08\x00\x00\x00\x00\x00\x00' \ - + b'\x00\x00\x00\x00\x00\x00\x00\x01' - - def setUp(self): - pass - - def tearDown(self): - pass - - def test_init(self): - mld = icmpv6.mld(self.maxresp, self.address) - eq_(mld.maxresp, self.maxresp) - eq_(mld.address, self.address) - - def test_parser(self): - msg, n, _ = icmpv6.icmpv6.parser(self.buf) - - eq_(msg.type_, self.type_) - eq_(msg.code, self.code) - eq_(msg.csum, self.csum) - eq_(msg.data.maxresp, self.maxresp) - eq_(msg.data.address, self.address) - eq_(n, None) - - def test_serialize(self): - src_ipv6 = '3ffe:507:0:1:200:86ff:fe05:80da' - dst_ipv6 = '3ffe:501:0:1001::2' - prev = ipv6(6, 0, 0, len(self.buf), 64, 255, src_ipv6, dst_ipv6) - mld_csum = icmpv6_csum(prev, self.buf) - - mld = icmpv6.mld(self.maxresp, self.address) - icmp = icmpv6.icmpv6(self.type_, self.code, 0, mld) - buf = six.binary_type(icmp.serialize(bytearray(), prev)) - - (type_, code, csum) = struct.unpack_from(icmp._PACK_STR, buf, 0) - (maxresp, address) = struct.unpack_from( - mld._PACK_STR, buf, icmp._MIN_LEN) - - eq_(type_, self.type_) - eq_(code, self.code) - eq_(csum, mld_csum) - eq_(maxresp, self.maxresp) - eq_(address, addrconv.ipv6.text_to_bin(self.address)) - - def test_to_string(self): - ml = icmpv6.mld(self.maxresp, self.address) - ic = icmpv6.icmpv6(self.type_, self.code, self.csum, ml) - - mld_values = {'maxresp': self.maxresp, - 'address': self.address} - _mld_str = ','.join(['%s=%s' % (k, repr(mld_values[k])) - for k, v in inspect.getmembers(ml) - if k in mld_values]) - mld_str = '%s(%s)' % (icmpv6.mld.__name__, _mld_str) - - icmp_values = {'type_': repr(self.type_), - 'code': repr(self.code), - 'csum': repr(self.csum), - 'data': mld_str} - _ic_str = ','.join(['%s=%s' % (k, icmp_values[k]) - for k, v in inspect.getmembers(ic) - if k in icmp_values]) - ic_str = '%s(%s)' % (icmpv6.icmpv6.__name__, _ic_str) - - eq_(str(ic), ic_str) - eq_(repr(ic), ic_str) - - def test_default_args(self): - prev = ipv6(nxt=inet.IPPROTO_ICMPV6) - ic = icmpv6.icmpv6( - type_=icmpv6.MLD_LISTENER_QUERY, data=icmpv6.mld()) - prev.serialize(ic, None) - buf = ic.serialize(bytearray(), prev) - res = struct.unpack(icmpv6.icmpv6._PACK_STR, six.binary_type(buf[:4])) - - eq_(res[0], icmpv6.MLD_LISTENER_QUERY) - eq_(res[1], 0) - eq_(res[2], icmpv6_csum(prev, buf)) - - res = struct.unpack(icmpv6.mld._PACK_STR, six.binary_type(buf[4:])) - - eq_(res[0], 0) - eq_(res[1], addrconv.ipv6.text_to_bin('::')) - - def test_json(self): - ic1 = icmpv6.icmpv6( - type_=icmpv6.MLD_LISTENER_QUERY, - data=icmpv6.mld()) - jsondict = ic1.to_jsondict() - ic2 = icmpv6.icmpv6.from_jsondict(jsondict['icmpv6']) - eq_(str(ic1), str(ic2)) - - -class Test_icmpv6_membership_report(Test_icmpv6_membership_query): - type_ = 131 - code = 0 - csum = 0xb4a4 - maxresp = 10000 - address = 'ff08::1' - buf = b'\x83\x00\xb4\xa4\x27\x10\x00\x00' \ - + b'\xff\x08\x00\x00\x00\x00\x00\x00' \ - + b'\x00\x00\x00\x00\x00\x00\x00\x01' - - def test_json(self): - ic1 = icmpv6.icmpv6( - type_=icmpv6.MLD_LISTENER_REPOR, - data=icmpv6.mld()) - jsondict = ic1.to_jsondict() - ic2 = icmpv6.icmpv6.from_jsondict(jsondict['icmpv6']) - eq_(str(ic1), str(ic2)) - - -class Test_icmpv6_membership_done(Test_icmpv6_membership_query): - type_ = 132 - code = 0 - csum = 0xb3a4 - maxresp = 10000 - address = 'ff08::1' - buf = b'\x84\x00\xb3\xa4\x27\x10\x00\x00' \ - + b'\xff\x08\x00\x00\x00\x00\x00\x00' \ - + b'\x00\x00\x00\x00\x00\x00\x00\x01' - - def test_json(self): - ic1 = icmpv6.icmpv6( - type_=icmpv6.MLD_LISTENER_DONE, - data=icmpv6.mld()) - jsondict = ic1.to_jsondict() - ic2 = icmpv6.icmpv6.from_jsondict(jsondict['icmpv6']) - eq_(str(ic1), str(ic2)) - - -class Test_mldv2_query(unittest.TestCase): - type_ = 130 - code = 0 - csum = 0xb5a4 - maxresp = 10000 - address = 'ff08::1' - s_flg = 0 - qrv = 2 - s_qrv = s_flg << 3 | qrv - qqic = 10 - num = 0 - srcs = [] - - mld = icmpv6.mldv2_query( - maxresp, address, s_flg, qrv, qqic, num, srcs) - - buf = b'\x82\x00\xb5\xa4\x27\x10\x00\x00' \ - + b'\xff\x08\x00\x00\x00\x00\x00\x00' \ - + b'\x00\x00\x00\x00\x00\x00\x00\x01' \ - + b'\x02\x0a\x00\x00' - - def setUp(self): - pass - - def setUp_with_srcs(self): - self.num = 2 - self.srcs = ['ff80::1', 'ff80::2'] - self.mld = icmpv6.mldv2_query( - self.maxresp, self.address, self.s_flg, self.qrv, self.qqic, - self.num, self.srcs) - self.buf = b'\x82\x00\xb5\xa4\x27\x10\x00\x00' \ - + b'\xff\x08\x00\x00\x00\x00\x00\x00' \ - + b'\x00\x00\x00\x00\x00\x00\x00\x01' \ - + b'\x02\x0a\x00\x02' \ - + b'\xff\x80\x00\x00\x00\x00\x00\x00' \ - + b'\x00\x00\x00\x00\x00\x00\x00\x01' \ - + b'\xff\x80\x00\x00\x00\x00\x00\x00' \ - + b'\x00\x00\x00\x00\x00\x00\x00\x02' - - def tearDown(self): - pass - - def find_protocol(self, pkt, name): - for p in pkt.protocols: - if p.protocol_name == name: - return p - - def test_init(self): - eq_(self.mld.maxresp, self.maxresp) - eq_(self.mld.address, self.address) - eq_(self.mld.s_flg, self.s_flg) - eq_(self.mld.qrv, self.qrv) - eq_(self.mld.qqic, self.qqic) - eq_(self.mld.num, self.num) - eq_(self.mld.srcs, self.srcs) - - def test_init_with_srcs(self): - self.setUp_with_srcs() - self.test_init() - - def test_parser(self): - msg, n, _ = icmpv6.icmpv6.parser(self.buf) - - eq_(msg.type_, self.type_) - eq_(msg.code, self.code) - eq_(msg.csum, self.csum) - eq_(msg.data.maxresp, self.maxresp) - eq_(msg.data.address, self.address) - eq_(msg.data.s_flg, self.s_flg) - eq_(msg.data.qrv, self.qrv) - eq_(msg.data.qqic, self.qqic) - eq_(msg.data.num, self.num) - eq_(msg.data.srcs, self.srcs) - eq_(n, None) - - def test_parser_with_srcs(self): - self.setUp_with_srcs() - self.test_parser() - - def test_serialize(self): - src_ipv6 = '3ffe:507:0:1:200:86ff:fe05:80da' - dst_ipv6 = '3ffe:501:0:1001::2' - prev = ipv6(6, 0, 0, len(self.buf), 64, 255, src_ipv6, dst_ipv6) - mld_csum = icmpv6_csum(prev, self.buf) - - icmp = icmpv6.icmpv6(self.type_, self.code, 0, self.mld) - buf = icmp.serialize(bytearray(), prev) - - (type_, code, csum) = struct.unpack_from(icmp._PACK_STR, - six.binary_type(buf)) - (maxresp, address, s_qrv, qqic, num) = struct.unpack_from( - self.mld._PACK_STR, six.binary_type(buf), icmp._MIN_LEN) - - eq_(type_, self.type_) - eq_(code, self.code) - eq_(csum, mld_csum) - eq_(maxresp, self.maxresp) - eq_(address, addrconv.ipv6.text_to_bin(self.address)) - s_flg = (s_qrv >> 3) & 0b1 - qrv = s_qrv & 0b111 - eq_(s_flg, self.s_flg) - eq_(qrv, self.qrv) - eq_(qqic, self.qqic) - eq_(num, self.num) - - def test_serialize_with_srcs(self): - self.setUp_with_srcs() - src_ipv6 = '3ffe:507:0:1:200:86ff:fe05:80da' - dst_ipv6 = '3ffe:501:0:1001::2' - prev = ipv6(6, 0, 0, len(self.buf), 64, 255, src_ipv6, dst_ipv6) - mld_csum = icmpv6_csum(prev, self.buf) - - icmp = icmpv6.icmpv6(self.type_, self.code, 0, self.mld) - buf = icmp.serialize(bytearray(), prev) - - (type_, code, csum) = struct.unpack_from(icmp._PACK_STR, - six.binary_type(buf)) - (maxresp, address, s_qrv, qqic, num) = struct.unpack_from( - self.mld._PACK_STR, six.binary_type(buf), icmp._MIN_LEN) - (addr1, addr2) = struct.unpack_from( - '!16s16s', six.binary_type(buf), icmp._MIN_LEN + self.mld._MIN_LEN) - - eq_(type_, self.type_) - eq_(code, self.code) - eq_(csum, mld_csum) - eq_(maxresp, self.maxresp) - eq_(address, addrconv.ipv6.text_to_bin(self.address)) - s_flg = (s_qrv >> 3) & 0b1 - qrv = s_qrv & 0b111 - eq_(s_flg, self.s_flg) - eq_(qrv, self.qrv) - eq_(qqic, self.qqic) - eq_(num, self.num) - eq_(addr1, addrconv.ipv6.text_to_bin(self.srcs[0])) - eq_(addr2, addrconv.ipv6.text_to_bin(self.srcs[1])) - - def _build_mldv2_query(self): - e = ethernet(ethertype=ether.ETH_TYPE_IPV6) - i = ipv6(nxt=inet.IPPROTO_ICMPV6) - ic = icmpv6.icmpv6(type_=icmpv6.MLD_LISTENER_QUERY, - data=self.mld) - p = e / i / ic - return p - - def test_build_mldv2_query(self): - p = self._build_mldv2_query() - - e = self.find_protocol(p, "ethernet") - ok_(e) - eq_(e.ethertype, ether.ETH_TYPE_IPV6) - - i = self.find_protocol(p, "ipv6") - ok_(i) - eq_(i.nxt, inet.IPPROTO_ICMPV6) - - ic = self.find_protocol(p, "icmpv6") - ok_(ic) - eq_(ic.type_, icmpv6.MLD_LISTENER_QUERY) - - eq_(ic.data.maxresp, self.maxresp) - eq_(ic.data.address, self.address) - eq_(ic.data.s_flg, self.s_flg) - eq_(ic.data.qrv, self.qrv) - eq_(ic.data.num, self.num) - eq_(ic.data.srcs, self.srcs) - - def test_build_mldv2_query_with_srcs(self): - self.setUp_with_srcs() - self.test_build_mldv2_query() - - def test_to_string(self): - ic = icmpv6.icmpv6(self.type_, self.code, self.csum, self.mld) - - mld_values = {'maxresp': self.maxresp, - 'address': self.address, - 's_flg': self.s_flg, - 'qrv': self.qrv, - 'qqic': self.qqic, - 'num': self.num, - 'srcs': self.srcs} - _mld_str = ','.join(['%s=%s' % (k, repr(mld_values[k])) - for k, v in inspect.getmembers(self.mld) - if k in mld_values]) - mld_str = '%s(%s)' % (icmpv6.mldv2_query.__name__, _mld_str) - - icmp_values = {'type_': repr(self.type_), - 'code': repr(self.code), - 'csum': repr(self.csum), - 'data': mld_str} - _ic_str = ','.join(['%s=%s' % (k, icmp_values[k]) - for k, v in inspect.getmembers(ic) - if k in icmp_values]) - ic_str = '%s(%s)' % (icmpv6.icmpv6.__name__, _ic_str) - - eq_(str(ic), ic_str) - eq_(repr(ic), ic_str) - - def test_to_string_with_srcs(self): - self.setUp_with_srcs() - self.test_to_string() - - @raises(Exception) - def test_num_larger_than_srcs(self): - self.srcs = ['ff80::1', 'ff80::2', 'ff80::3'] - self.num = len(self.srcs) + 1 - self.buf = pack(icmpv6.mldv2_query._PACK_STR, self.maxresp, - addrconv.ipv6.text_to_bin(self.address), - self.s_qrv, self.qqic, self.num) - for src in self.srcs: - self.buf += pack('16s', addrconv.ipv6.text_to_bin(src)) - self.mld = icmpv6.mldv2_query( - self.maxresp, self.address, self.s_flg, self.qrv, self.qqic, - self.num, self.srcs) - self.test_parser() - - @raises(Exception) - def test_num_smaller_than_srcs(self): - self.srcs = ['ff80::1', 'ff80::2', 'ff80::3'] - self.num = len(self.srcs) - 1 - self.buf = pack(icmpv6.mldv2_query._PACK_STR, self.maxresp, - addrconv.ipv6.text_to_bin(self.address), - self.s_qrv, self.qqic, self.num) - for src in self.srcs: - self.buf += pack('16s', addrconv.ipv6.text_to_bin(src)) - self.mld = icmpv6.mldv2_query( - self.maxresp, self.address, self.s_flg, self.qrv, self.qqic, - self.num, self.srcs) - self.test_parser() - - def test_default_args(self): - prev = ipv6(nxt=inet.IPPROTO_ICMPV6) - ic = icmpv6.icmpv6( - type_=icmpv6.MLD_LISTENER_QUERY, data=icmpv6.mldv2_query()) - prev.serialize(ic, None) - buf = ic.serialize(bytearray(), prev) - res = struct.unpack(icmpv6.icmpv6._PACK_STR, six.binary_type(buf[:4])) - - eq_(res[0], icmpv6.MLD_LISTENER_QUERY) - eq_(res[1], 0) - eq_(res[2], icmpv6_csum(prev, buf)) - - res = struct.unpack(icmpv6.mldv2_query._PACK_STR, six.binary_type(buf[4:])) - - eq_(res[0], 0) - eq_(res[1], addrconv.ipv6.text_to_bin('::')) - eq_(res[2], 2) - eq_(res[3], 0) - eq_(res[4], 0) - - # srcs without num - srcs = ['ff80::1', 'ff80::2', 'ff80::3'] - que = icmpv6.mldv2_query(srcs=srcs) - buf = que.serialize() - res = struct.unpack_from( - icmpv6.mldv2_query._PACK_STR, six.binary_type(buf)) - - eq_(res[0], 0) - eq_(res[1], addrconv.ipv6.text_to_bin('::')) - eq_(res[2], 2) - eq_(res[3], 0) - eq_(res[4], len(srcs)) - - (src1, src2, src3) = struct.unpack_from( - '16s16s16s', six.binary_type(buf), icmpv6.mldv2_query._MIN_LEN) - - eq_(src1, addrconv.ipv6.text_to_bin(srcs[0])) - eq_(src2, addrconv.ipv6.text_to_bin(srcs[1])) - eq_(src3, addrconv.ipv6.text_to_bin(srcs[2])) - - def test_json(self): - jsondict = self.mld.to_jsondict() - mld = icmpv6.mldv2_query.from_jsondict(jsondict['mldv2_query']) - eq_(str(self.mld), str(mld)) - - def test_json_with_srcs(self): - self.setUp_with_srcs() - self.test_json() - - -class Test_mldv2_report(unittest.TestCase): - type_ = 143 - code = 0 - csum = 0xb5a4 - record_num = 0 - records = [] - - mld = icmpv6.mldv2_report(record_num, records) - - buf = b'\x8f\x00\xb5\xa4\x00\x00\x00\x00' - - def setUp(self): - pass - - def setUp_with_records(self): - self.record1 = icmpv6.mldv2_report_group( - icmpv6.MODE_IS_INCLUDE, 0, 0, 'ff00::1') - self.record2 = icmpv6.mldv2_report_group( - icmpv6.MODE_IS_INCLUDE, 0, 2, 'ff00::2', - ['fe80::1', 'fe80::2']) - self.record3 = icmpv6.mldv2_report_group( - icmpv6.MODE_IS_INCLUDE, 1, 0, 'ff00::3', [], b'abc\x00') - self.record4 = icmpv6.mldv2_report_group( - icmpv6.MODE_IS_INCLUDE, 2, 2, 'ff00::4', - ['fe80::1', 'fe80::2'], b'abcde\x00\x00\x00') - self.records = [self.record1, self.record2, self.record3, - self.record4] - self.record_num = len(self.records) - self.mld = icmpv6.mldv2_report(self.record_num, self.records) - self.buf = b'\x8f\x00\xb5\xa4\x00\x00\x00\x04' \ - + b'\x01\x00\x00\x00' \ - + b'\xff\x00\x00\x00\x00\x00\x00\x00' \ - + b'\x00\x00\x00\x00\x00\x00\x00\x01' \ - + b'\x01\x00\x00\x02' \ - + b'\xff\x00\x00\x00\x00\x00\x00\x00' \ - + b'\x00\x00\x00\x00\x00\x00\x00\x02' \ - + b'\xfe\x80\x00\x00\x00\x00\x00\x00' \ - + b'\x00\x00\x00\x00\x00\x00\x00\x01' \ - + b'\xfe\x80\x00\x00\x00\x00\x00\x00' \ - + b'\x00\x00\x00\x00\x00\x00\x00\x02' \ - + b'\x01\x01\x00\x00' \ - + b'\xff\x00\x00\x00\x00\x00\x00\x00' \ - + b'\x00\x00\x00\x00\x00\x00\x00\x03' \ - + b'\x61\x62\x63\x00' \ - + b'\x01\x02\x00\x02' \ - + b'\xff\x00\x00\x00\x00\x00\x00\x00' \ - + b'\x00\x00\x00\x00\x00\x00\x00\x04' \ - + b'\xfe\x80\x00\x00\x00\x00\x00\x00' \ - + b'\x00\x00\x00\x00\x00\x00\x00\x01' \ - + b'\xfe\x80\x00\x00\x00\x00\x00\x00' \ - + b'\x00\x00\x00\x00\x00\x00\x00\x02' \ - + b'\x61\x62\x63\x64\x65\x00\x00\x00' - - def tearDown(self): - pass - - def find_protocol(self, pkt, name): - for p in pkt.protocols: - if p.protocol_name == name: - return p - - def test_init(self): - eq_(self.mld.record_num, self.record_num) - eq_(self.mld.records, self.records) - - def test_init_with_records(self): - self.setUp_with_records() - self.test_init() - - def test_parser(self): - msg, n, _ = icmpv6.icmpv6.parser(self.buf) - - eq_(msg.type_, self.type_) - eq_(msg.code, self.code) - eq_(msg.csum, self.csum) - eq_(msg.data.record_num, self.record_num) - eq_(repr(msg.data.records), repr(self.records)) - - def test_parser_with_records(self): - self.setUp_with_records() - self.test_parser() - - def test_serialize(self): - src_ipv6 = '3ffe:507:0:1:200:86ff:fe05:80da' - dst_ipv6 = '3ffe:501:0:1001::2' - prev = ipv6(6, 0, 0, len(self.buf), 64, 255, src_ipv6, dst_ipv6) - mld_csum = icmpv6_csum(prev, self.buf) - - icmp = icmpv6.icmpv6(self.type_, self.code, 0, self.mld) - buf = icmp.serialize(bytearray(), prev) - - (type_, code, csum) = struct.unpack_from(icmp._PACK_STR, - six.binary_type(buf)) - (record_num, ) = struct.unpack_from( - self.mld._PACK_STR, six.binary_type(buf), icmp._MIN_LEN) - - eq_(type_, self.type_) - eq_(code, self.code) - eq_(csum, mld_csum) - eq_(record_num, self.record_num) - - def test_serialize_with_records(self): - self.setUp_with_records() - src_ipv6 = '3ffe:507:0:1:200:86ff:fe05:80da' - dst_ipv6 = '3ffe:501:0:1001::2' - prev = ipv6(6, 0, 0, len(self.buf), 64, 255, src_ipv6, dst_ipv6) - mld_csum = icmpv6_csum(prev, self.buf) - - icmp = icmpv6.icmpv6(self.type_, self.code, 0, self.mld) - buf = six.binary_type(icmp.serialize(bytearray(), prev)) - - (type_, code, csum) = struct.unpack_from(icmp._PACK_STR, - six.binary_type(buf)) - (record_num, ) = struct.unpack_from( - self.mld._PACK_STR, six.binary_type(buf), icmp._MIN_LEN) - offset = icmp._MIN_LEN + self.mld._MIN_LEN - rec1 = icmpv6.mldv2_report_group.parser(buf[offset:]) - offset += len(rec1) - rec2 = icmpv6.mldv2_report_group.parser(buf[offset:]) - offset += len(rec2) - rec3 = icmpv6.mldv2_report_group.parser(buf[offset:]) - offset += len(rec3) - rec4 = icmpv6.mldv2_report_group.parser(buf[offset:]) - - eq_(type_, self.type_) - eq_(code, self.code) - eq_(csum, mld_csum) - eq_(record_num, self.record_num) - eq_(repr(rec1), repr(self.record1)) - eq_(repr(rec2), repr(self.record2)) - eq_(repr(rec3), repr(self.record3)) - eq_(repr(rec4), repr(self.record4)) - - def _build_mldv2_report(self): - e = ethernet(ethertype=ether.ETH_TYPE_IPV6) - i = ipv6(nxt=inet.IPPROTO_ICMPV6) - ic = icmpv6.icmpv6(type_=icmpv6.MLDV2_LISTENER_REPORT, - data=self.mld) - p = e / i / ic - return p - - def test_build_mldv2_report(self): - p = self._build_mldv2_report() - - e = self.find_protocol(p, "ethernet") - ok_(e) - eq_(e.ethertype, ether.ETH_TYPE_IPV6) - - i = self.find_protocol(p, "ipv6") - ok_(i) - eq_(i.nxt, inet.IPPROTO_ICMPV6) - - ic = self.find_protocol(p, "icmpv6") - ok_(ic) - eq_(ic.type_, icmpv6.MLDV2_LISTENER_REPORT) - - eq_(ic.data.record_num, self.record_num) - eq_(ic.data.records, self.records) - - def test_build_mldv2_report_with_records(self): - self.setUp_with_records() - self.test_build_mldv2_report() - - def test_to_string(self): - ic = icmpv6.icmpv6(self.type_, self.code, self.csum, self.mld) - - mld_values = {'record_num': self.record_num, - 'records': self.records} - _mld_str = ','.join(['%s=%s' % (k, repr(mld_values[k])) - for k, v in inspect.getmembers(self.mld) - if k in mld_values]) - mld_str = '%s(%s)' % (icmpv6.mldv2_report.__name__, _mld_str) - - icmp_values = {'type_': repr(self.type_), - 'code': repr(self.code), - 'csum': repr(self.csum), - 'data': mld_str} - _ic_str = ','.join(['%s=%s' % (k, icmp_values[k]) - for k, v in inspect.getmembers(ic) - if k in icmp_values]) - ic_str = '%s(%s)' % (icmpv6.icmpv6.__name__, _ic_str) - - eq_(str(ic), ic_str) - eq_(repr(ic), ic_str) - - def test_to_string_with_records(self): - self.setUp_with_records() - self.test_to_string() - - @raises(Exception) - def test_record_num_larger_than_records(self): - self.record1 = icmpv6.mldv2_report_group( - icmpv6.MODE_IS_INCLUDE, 0, 0, 'ff00::1') - self.record2 = icmpv6.mldv2_report_group( - icmpv6.MODE_IS_INCLUDE, 0, 2, 'ff00::2', - ['fe80::1', 'fe80::2']) - self.record3 = icmpv6.mldv2_report_group( - icmpv6.MODE_IS_INCLUDE, 1, 0, 'ff00::3', [], b'abc\x00') - self.record4 = icmpv6.mldv2_report_group( - icmpv6.MODE_IS_INCLUDE, 2, 2, 'ff00::4', - ['fe80::1', 'fe80::2'], b'abcde\x00\x00\x00') - self.records = [self.record1, self.record2, self.record3, - self.record4] - self.record_num = len(self.records) + 1 - self.buf = struct.pack( - icmpv6.mldv2_report._PACK_STR, self.record_num) - self.buf += self.record1.serialize() - self.buf += self.record2.serialize() - self.buf += self.record3.serialize() - self.buf += self.record4.serialize() - self.mld = icmpv6.mldv2_report(self.record_num, self.records) - self.test_parser() - - @raises(Exception) - def test_record_num_smaller_than_records(self): - self.record1 = icmpv6.mldv2_report_group( - icmpv6.MODE_IS_INCLUDE, 0, 0, 'ff00::1') - self.record2 = icmpv6.mldv2_report_group( - icmpv6.MODE_IS_INCLUDE, 0, 2, 'ff00::2', - ['fe80::1', 'fe80::2']) - self.record3 = icmpv6.mldv2_report_group( - icmpv6.MODE_IS_INCLUDE, 1, 0, 'ff00::3', [], b'abc\x00') - self.record4 = icmpv6.mldv2_report_group( - icmpv6.MODE_IS_INCLUDE, 2, 2, 'ff00::4', - ['fe80::1', 'fe80::2'], b'abcde\x00\x00\x00') - self.records = [self.record1, self.record2, self.record3, - self.record4] - self.record_num = len(self.records) - 1 - self.buf = struct.pack( - icmpv6.mldv2_report._PACK_STR, self.record_num) - self.buf += self.record1.serialize() - self.buf += self.record2.serialize() - self.buf += self.record3.serialize() - self.buf += self.record4.serialize() - self.mld = icmpv6.mldv2_report(self.record_num, self.records) - self.test_parser() - - def test_default_args(self): - prev = ipv6(nxt=inet.IPPROTO_ICMPV6) - ic = icmpv6.icmpv6( - type_=icmpv6.MLDV2_LISTENER_REPORT, data=icmpv6.mldv2_report()) - prev.serialize(ic, None) - buf = ic.serialize(bytearray(), prev) - res = struct.unpack(icmpv6.icmpv6._PACK_STR, six.binary_type(buf[:4])) - - eq_(res[0], icmpv6.MLDV2_LISTENER_REPORT) - eq_(res[1], 0) - eq_(res[2], icmpv6_csum(prev, buf)) - - res = struct.unpack(icmpv6.mldv2_report._PACK_STR, six.binary_type(buf[4:])) - - eq_(res[0], 0) - - # records without record_num - record1 = icmpv6.mldv2_report_group( - icmpv6.MODE_IS_INCLUDE, 0, 0, 'ff00::1') - record2 = icmpv6.mldv2_report_group( - icmpv6.MODE_IS_INCLUDE, 0, 2, 'ff00::2', - ['fe80::1', 'fe80::2']) - records = [record1, record2] - rep = icmpv6.mldv2_report(records=records) - buf = rep.serialize() - res = struct.unpack_from( - icmpv6.mldv2_report._PACK_STR, six.binary_type(buf)) - - eq_(res[0], len(records)) - - res = struct.unpack_from( - icmpv6.mldv2_report_group._PACK_STR, six.binary_type(buf), - icmpv6.mldv2_report._MIN_LEN) - - eq_(res[0], icmpv6.MODE_IS_INCLUDE) - eq_(res[1], 0) - eq_(res[2], 0) - eq_(res[3], addrconv.ipv6.text_to_bin('ff00::1')) - - res = struct.unpack_from( - icmpv6.mldv2_report_group._PACK_STR, six.binary_type(buf), - icmpv6.mldv2_report._MIN_LEN + - icmpv6.mldv2_report_group._MIN_LEN) - - eq_(res[0], icmpv6.MODE_IS_INCLUDE) - eq_(res[1], 0) - eq_(res[2], 2) - eq_(res[3], addrconv.ipv6.text_to_bin('ff00::2')) - - res = struct.unpack_from( - '16s16s', six.binary_type(buf), - icmpv6.mldv2_report._MIN_LEN + - icmpv6.mldv2_report_group._MIN_LEN + - icmpv6.mldv2_report_group._MIN_LEN) - - eq_(res[0], addrconv.ipv6.text_to_bin('fe80::1')) - eq_(res[1], addrconv.ipv6.text_to_bin('fe80::2')) - - def test_json(self): - jsondict = self.mld.to_jsondict() - mld = icmpv6.mldv2_report.from_jsondict(jsondict['mldv2_report']) - eq_(str(self.mld), str(mld)) - - def test_json_with_records(self): - self.setUp_with_records() - self.test_json() - - -class Test_mldv2_report_group(unittest.TestCase): - type_ = icmpv6.MODE_IS_INCLUDE - aux_len = 0 - num = 0 - address = 'ff00::1' - srcs = [] - aux = None - mld = icmpv6.mldv2_report_group( - type_, aux_len, num, address, srcs, aux) - buf = b'\x01\x00\x00\x00' \ - + b'\xff\x00\x00\x00\x00\x00\x00\x00' \ - + b'\x00\x00\x00\x00\x00\x00\x00\x01' - - def setUp(self): - pass - - def setUp_with_srcs(self): - self.srcs = ['fe80::1', 'fe80::2', 'fe80::3'] - self.num = len(self.srcs) - self.mld = icmpv6.mldv2_report_group( - self.type_, self.aux_len, self.num, self.address, self.srcs, - self.aux) - self.buf = b'\x01\x00\x00\x03' \ - + b'\xff\x00\x00\x00\x00\x00\x00\x00' \ - + b'\x00\x00\x00\x00\x00\x00\x00\x01' \ - + b'\xfe\x80\x00\x00\x00\x00\x00\x00' \ - + b'\x00\x00\x00\x00\x00\x00\x00\x01' \ - + b'\xfe\x80\x00\x00\x00\x00\x00\x00' \ - + b'\x00\x00\x00\x00\x00\x00\x00\x02' \ - + b'\xfe\x80\x00\x00\x00\x00\x00\x00' \ - + b'\x00\x00\x00\x00\x00\x00\x00\x03' - - def setUp_with_aux(self): - self.aux = b'\x01\x02\x03\x04\x05\x06\x07\x08' - self.aux_len = len(self.aux) // 4 - self.mld = icmpv6.mldv2_report_group( - self.type_, self.aux_len, self.num, self.address, self.srcs, - self.aux) - self.buf = b'\x01\x02\x00\x00' \ - + b'\xff\x00\x00\x00\x00\x00\x00\x00' \ - + b'\x00\x00\x00\x00\x00\x00\x00\x01' \ - + b'\x01\x02\x03\x04\x05\x06\x07\x08' - - def setUp_with_srcs_and_aux(self): - self.srcs = ['fe80::1', 'fe80::2', 'fe80::3'] - self.num = len(self.srcs) - self.aux = b'\x01\x02\x03\x04\x05\x06\x07\x08' - self.aux_len = len(self.aux) // 4 - self.mld = icmpv6.mldv2_report_group( - self.type_, self.aux_len, self.num, self.address, self.srcs, - self.aux) - self.buf = b'\x01\x02\x00\x03' \ - + b'\xff\x00\x00\x00\x00\x00\x00\x00' \ - + b'\x00\x00\x00\x00\x00\x00\x00\x01' \ - + b'\xfe\x80\x00\x00\x00\x00\x00\x00' \ - + b'\x00\x00\x00\x00\x00\x00\x00\x01' \ - + b'\xfe\x80\x00\x00\x00\x00\x00\x00' \ - + b'\x00\x00\x00\x00\x00\x00\x00\x02' \ - + b'\xfe\x80\x00\x00\x00\x00\x00\x00' \ - + b'\x00\x00\x00\x00\x00\x00\x00\x03' \ - + b'\x01\x02\x03\x04\x05\x06\x07\x08' - - def tearDown(self): - pass - - def test_init(self): - eq_(self.mld.type_, self.type_) - eq_(self.mld.aux_len, self.aux_len) - eq_(self.mld.num, self.num) - eq_(self.mld.address, self.address) - eq_(self.mld.srcs, self.srcs) - eq_(self.mld.aux, self.aux) - - def test_init_with_srcs(self): - self.setUp_with_srcs() - self.test_init() - - def test_init_with_aux(self): - self.setUp_with_aux() - self.test_init() - - def test_init_with_srcs_and_aux(self): - self.setUp_with_srcs_and_aux() - self.test_init() - - def test_parser(self): - _res = icmpv6.mldv2_report_group.parser(self.buf) - if type(_res) is tuple: - res = _res[0] - else: - res = _res - - eq_(res.type_, self.type_) - eq_(res.aux_len, self.aux_len) - eq_(res.num, self.num) - eq_(res.address, self.address) - eq_(res.srcs, self.srcs) - eq_(res.aux, self.aux) - - def test_parser_with_srcs(self): - self.setUp_with_srcs() - self.test_parser() - - def test_parser_with_aux(self): - self.setUp_with_aux() - self.test_parser() - - def test_parser_with_srcs_and_aux(self): - self.setUp_with_srcs_and_aux() - self.test_parser() - - def test_serialize(self): - buf = self.mld.serialize() - res = struct.unpack_from( - icmpv6.mldv2_report_group._PACK_STR, six.binary_type(buf)) - - eq_(res[0], self.type_) - eq_(res[1], self.aux_len) - eq_(res[2], self.num) - eq_(res[3], addrconv.ipv6.text_to_bin(self.address)) - - def test_serialize_with_srcs(self): - self.setUp_with_srcs() - buf = self.mld.serialize() - res = struct.unpack_from( - icmpv6.mldv2_report_group._PACK_STR, six.binary_type(buf)) - (src1, src2, src3) = struct.unpack_from( - '16s16s16s', six.binary_type(buf), icmpv6.mldv2_report_group._MIN_LEN) - eq_(res[0], self.type_) - eq_(res[1], self.aux_len) - eq_(res[2], self.num) - eq_(res[3], addrconv.ipv6.text_to_bin(self.address)) - eq_(src1, addrconv.ipv6.text_to_bin(self.srcs[0])) - eq_(src2, addrconv.ipv6.text_to_bin(self.srcs[1])) - eq_(src3, addrconv.ipv6.text_to_bin(self.srcs[2])) - - def test_serialize_with_aux(self): - self.setUp_with_aux() - buf = self.mld.serialize() - res = struct.unpack_from( - icmpv6.mldv2_report_group._PACK_STR, six.binary_type(buf)) - (aux, ) = struct.unpack_from( - '%ds' % (self.aux_len * 4), six.binary_type(buf), - icmpv6.mldv2_report_group._MIN_LEN) - eq_(res[0], self.type_) - eq_(res[1], self.aux_len) - eq_(res[2], self.num) - eq_(res[3], addrconv.ipv6.text_to_bin(self.address)) - eq_(aux, self.aux) - - def test_serialize_with_srcs_and_aux(self): - self.setUp_with_srcs_and_aux() - buf = self.mld.serialize() - res = struct.unpack_from( - icmpv6.mldv2_report_group._PACK_STR, six.binary_type(buf)) - (src1, src2, src3) = struct.unpack_from( - '16s16s16s', six.binary_type(buf), icmpv6.mldv2_report_group._MIN_LEN) - (aux, ) = struct.unpack_from( - '%ds' % (self.aux_len * 4), six.binary_type(buf), - icmpv6.mldv2_report_group._MIN_LEN + 16 * 3) - eq_(res[0], self.type_) - eq_(res[1], self.aux_len) - eq_(res[2], self.num) - eq_(res[3], addrconv.ipv6.text_to_bin(self.address)) - eq_(src1, addrconv.ipv6.text_to_bin(self.srcs[0])) - eq_(src2, addrconv.ipv6.text_to_bin(self.srcs[1])) - eq_(src3, addrconv.ipv6.text_to_bin(self.srcs[2])) - eq_(aux, self.aux) - - def test_to_string(self): - igmp_values = {'type_': repr(self.type_), - 'aux_len': repr(self.aux_len), - 'num': repr(self.num), - 'address': repr(self.address), - 'srcs': repr(self.srcs), - 'aux': repr(self.aux)} - _g_str = ','.join(['%s=%s' % (k, igmp_values[k]) - for k, v in inspect.getmembers(self.mld) - if k in igmp_values]) - g_str = '%s(%s)' % (icmpv6.mldv2_report_group.__name__, _g_str) - - eq_(str(self.mld), g_str) - eq_(repr(self.mld), g_str) - - def test_to_string_with_srcs(self): - self.setUp_with_srcs() - self.test_to_string() - - def test_to_string_with_aux(self): - self.setUp_with_aux() - self.test_to_string() - - def test_to_string_with_srcs_and_aux(self): - self.setUp_with_srcs_and_aux() - self.test_to_string() - - def test_len(self): - eq_(len(self.mld), 20) - - def test_len_with_srcs(self): - self.setUp_with_srcs() - eq_(len(self.mld), 68) - - def test_len_with_aux(self): - self.setUp_with_aux() - eq_(len(self.mld), 28) - - def test_len_with_srcs_and_aux(self): - self.setUp_with_srcs_and_aux() - eq_(len(self.mld), 76) - - @raises - def test_num_larger_than_srcs(self): - self.srcs = ['fe80::1', 'fe80::2', 'fe80::3'] - self.num = len(self.srcs) + 1 - self.buf = struct.pack( - icmpv6.mldv2_report_group._PACK_STR, self.type_, self.aux_len, - self.num, addrconv.ipv6.text_to_bin(self.address)) - for src in self.srcs: - self.buf += pack('16s', addrconv.ipv6.text_to_bin(src)) - self.mld = icmpv6.mldv2_report_group( - self.type_, self.aux_len, self.num, self.address, - self.srcs, self.aux) - self.test_parser() - - @raises - def test_num_smaller_than_srcs(self): - self.srcs = ['fe80::1', 'fe80::2', 'fe80::3'] - self.num = len(self.srcs) - 1 - self.buf = struct.pack( - icmpv6.mldv2_report_group._PACK_STR, self.type_, self.aux_len, - self.num, addrconv.ipv6.text_to_bin(self.address)) - for src in self.srcs: - self.buf += pack('16s', addrconv.ipv6.text_to_bin(src)) - self.mld = icmpv6.mldv2_report_group( - self.type_, self.aux_len, self.num, self.address, - self.srcs, self.aux) - self.test_parser() - - @raises - def test_aux_len_larger_than_aux(self): - self.aux = b'\x01\x02\x03\x04\x05\x06\x07\x08' - self.aux_len = len(self.aux) // 4 + 1 - self.buf = struct.pack( - icmpv6.mldv2_report_group._PACK_STR, self.type_, self.aux_len, - self.num, addrconv.ipv6.text_to_bin(self.address)) - self.buf += self.aux - self.mld = icmpv6.mldv2_report_group( - self.type_, self.aux_len, self.num, self.address, - self.srcs, self.aux) - self.test_parser() - - @raises - def test_aux_len_smaller_than_aux(self): - self.aux = b'\x01\x02\x03\x04\x05\x06\x07\x08' - self.aux_len = len(self.aux) // 4 - 1 - self.buf = struct.pack( - icmpv6.mldv2_report_group._PACK_STR, self.type_, self.aux_len, - self.num, addrconv.ipv6.text_to_bin(self.address)) - self.buf += self.aux - self.mld = icmpv6.mldv2_report_group( - self.type_, self.aux_len, self.num, self.address, - self.srcs, self.aux) - self.test_parser() - - def test_default_args(self): - rep = icmpv6.mldv2_report_group() - buf = rep.serialize() - res = struct.unpack_from( - icmpv6.mldv2_report_group._PACK_STR, six.binary_type(buf)) - - eq_(res[0], 0) - eq_(res[1], 0) - eq_(res[2], 0) - eq_(res[3], addrconv.ipv6.text_to_bin('::')) - - # srcs without num - srcs = ['fe80::1', 'fe80::2', 'fe80::3'] - rep = icmpv6.mldv2_report_group(srcs=srcs) - buf = rep.serialize() - LOG.info(repr(buf)) - res = struct.unpack_from( - icmpv6.mldv2_report_group._PACK_STR, six.binary_type(buf)) - - eq_(res[0], 0) - eq_(res[1], 0) - eq_(res[2], len(srcs)) - eq_(res[3], addrconv.ipv6.text_to_bin('::')) - - (src1, src2, src3) = struct.unpack_from( - '16s16s16s', six.binary_type(buf), icmpv6.mldv2_report_group._MIN_LEN) - - eq_(src1, addrconv.ipv6.text_to_bin(srcs[0])) - eq_(src2, addrconv.ipv6.text_to_bin(srcs[1])) - eq_(src3, addrconv.ipv6.text_to_bin(srcs[2])) - - # aux without aux_len - rep = icmpv6.mldv2_report_group(aux=b'\x01\x02\x03') - buf = rep.serialize() - res = struct.unpack_from( - icmpv6.mldv2_report_group._PACK_STR, six.binary_type(buf)) - - eq_(res[0], 0) - eq_(res[1], 1) - eq_(res[2], 0) - eq_(res[3], addrconv.ipv6.text_to_bin('::')) - eq_(buf[icmpv6.mldv2_report_group._MIN_LEN:], b'\x01\x02\x03\x00') - - def test_json(self): - jsondict = self.mld.to_jsondict() - mld = icmpv6.mldv2_report_group.from_jsondict( - jsondict['mldv2_report_group']) - eq_(str(self.mld), str(mld)) - - def test_json_with_srcs(self): - self.setUp_with_srcs() - self.test_json() - - def test_json_with_aux(self): - self.setUp_with_aux() - self.test_json() - - def test_json_with_srcs_and_aux(self): - self.setUp_with_srcs_and_aux() - self.test_json() diff --git a/tests/unit/packet/test_igmp.py b/tests/unit/packet/test_igmp.py deleted file mode 100644 index 9813450d..00000000 --- a/tests/unit/packet/test_igmp.py +++ /dev/null @@ -1,997 +0,0 @@ -# Copyright (C) 2013 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. - -# vim: tabstop=4 shiftwidth=4 softtabstop=4 - -import unittest -import inspect -import logging -import six - -from struct import pack, unpack_from, pack_into -from nose.tools import ok_, eq_, raises -from ryu.ofproto import ether -from ryu.ofproto import inet -from ryu.lib.packet.ethernet import ethernet -from ryu.lib.packet.ipv4 import ipv4 -from ryu.lib.packet.packet import Packet -from ryu.lib.packet.packet_utils import checksum -from ryu.lib import addrconv -from ryu.lib.packet.igmp import igmp -from ryu.lib.packet.igmp import igmpv3_query -from ryu.lib.packet.igmp import igmpv3_report -from ryu.lib.packet.igmp import igmpv3_report_group -from ryu.lib.packet.igmp import IGMP_TYPE_QUERY -from ryu.lib.packet.igmp import IGMP_TYPE_REPORT_V3 -from ryu.lib.packet.igmp import MODE_IS_INCLUDE - -LOG = logging.getLogger(__name__) - - -class Test_igmp(unittest.TestCase): - """ Test case for Internet Group Management Protocol - """ - def setUp(self): - self.msgtype = IGMP_TYPE_QUERY - self.maxresp = 100 - self.csum = 0 - self.address = '225.0.0.1' - - self.buf = pack(igmp._PACK_STR, self.msgtype, self.maxresp, - self.csum, - addrconv.ipv4.text_to_bin(self.address)) - - self.g = igmp(self.msgtype, self.maxresp, self.csum, - self.address) - - def tearDown(self): - pass - - def find_protocol(self, pkt, name): - for p in pkt.protocols: - if p.protocol_name == name: - return p - - def test_init(self): - eq_(self.msgtype, self.g.msgtype) - eq_(self.maxresp, self.g.maxresp) - eq_(self.csum, self.g.csum) - eq_(self.address, self.g.address) - - def test_parser(self): - _res = self.g.parser(self.buf) - if type(_res) is tuple: - res = _res[0] - else: - res = _res - - eq_(res.msgtype, self.msgtype) - eq_(res.maxresp, self.maxresp) - eq_(res.csum, self.csum) - eq_(res.address, self.address) - - def test_serialize(self): - data = bytearray() - prev = None - buf = self.g.serialize(data, prev) - - res = unpack_from(igmp._PACK_STR, six.binary_type(buf)) - - eq_(res[0], self.msgtype) - eq_(res[1], self.maxresp) - eq_(res[2], checksum(self.buf)) - eq_(res[3], addrconv.ipv4.text_to_bin(self.address)) - - def _build_igmp(self): - dl_dst = '11:22:33:44:55:66' - dl_src = 'aa:bb:cc:dd:ee:ff' - dl_type = ether.ETH_TYPE_IP - e = ethernet(dl_dst, dl_src, dl_type) - - total_length = 20 + igmp._MIN_LEN - nw_proto = inet.IPPROTO_IGMP - nw_dst = '11.22.33.44' - nw_src = '55.66.77.88' - i = ipv4(total_length=total_length, src=nw_src, dst=nw_dst, - proto=nw_proto) - - p = Packet() - - p.add_protocol(e) - p.add_protocol(i) - p.add_protocol(self.g) - p.serialize() - return p - - def test_build_igmp(self): - p = self._build_igmp() - - e = self.find_protocol(p, "ethernet") - ok_(e) - eq_(e.ethertype, ether.ETH_TYPE_IP) - - i = self.find_protocol(p, "ipv4") - ok_(i) - eq_(i.proto, inet.IPPROTO_IGMP) - - g = self.find_protocol(p, "igmp") - ok_(g) - - eq_(g.msgtype, self.msgtype) - eq_(g.maxresp, self.maxresp) - eq_(g.csum, checksum(self.buf)) - eq_(g.address, self.address) - - def test_to_string(self): - igmp_values = {'msgtype': repr(self.msgtype), - 'maxresp': repr(self.maxresp), - 'csum': repr(self.csum), - 'address': repr(self.address)} - _g_str = ','.join(['%s=%s' % (k, igmp_values[k]) - for k, v in inspect.getmembers(self.g) - if k in igmp_values]) - g_str = '%s(%s)' % (igmp.__name__, _g_str) - - eq_(str(self.g), g_str) - eq_(repr(self.g), g_str) - - @raises(Exception) - def test_malformed_igmp(self): - m_short_buf = self.buf[1:igmp._MIN_LEN] - igmp.parser(m_short_buf) - - def test_default_args(self): - ig = igmp() - buf = ig.serialize(bytearray(), None) - res = unpack_from(igmp._PACK_STR, six.binary_type(buf)) - - eq_(res[0], 0x11) - eq_(res[1], 0) - eq_(res[3], addrconv.ipv4.text_to_bin('0.0.0.0')) - - def test_json(self): - jsondict = self.g.to_jsondict() - g = igmp.from_jsondict(jsondict['igmp']) - eq_(str(self.g), str(g)) - - -class Test_igmpv3_query(unittest.TestCase): - """ Test case for Internet Group Management Protocol v3 - Membership Query Message""" - def setUp(self): - self.msgtype = IGMP_TYPE_QUERY - self.maxresp = 100 - self.csum = 0 - self.address = '225.0.0.1' - self.s_flg = 0 - self.qrv = 2 - self.qqic = 10 - self.num = 0 - self.srcs = [] - - self.s_qrv = self.s_flg << 3 | self.qrv - - self.buf = pack(igmpv3_query._PACK_STR, self.msgtype, - self.maxresp, self.csum, - addrconv.ipv4.text_to_bin(self.address), - self.s_qrv, self.qqic, self.num) - - self.g = igmpv3_query( - self.msgtype, self.maxresp, self.csum, self.address, - self.s_flg, self.qrv, self.qqic, self.num, self.srcs) - - def setUp_with_srcs(self): - self.srcs = ['192.168.1.1', '192.168.1.2', '192.168.1.3'] - self.num = len(self.srcs) - self.buf = pack(igmpv3_query._PACK_STR, self.msgtype, - self.maxresp, self.csum, - addrconv.ipv4.text_to_bin(self.address), - self.s_qrv, self.qqic, self.num) - for src in self.srcs: - self.buf += pack('4s', addrconv.ipv4.text_to_bin(src)) - self.g = igmpv3_query( - self.msgtype, self.maxresp, self.csum, self.address, - self.s_flg, self.qrv, self.qqic, self.num, self.srcs) - - def tearDown(self): - pass - - def find_protocol(self, pkt, name): - for p in pkt.protocols: - if p.protocol_name == name: - return p - - def test_init(self): - eq_(self.msgtype, self.g.msgtype) - eq_(self.maxresp, self.g.maxresp) - eq_(self.csum, self.g.csum) - eq_(self.address, self.g.address) - eq_(self.s_flg, self.g.s_flg) - eq_(self.qrv, self.g.qrv) - eq_(self.qqic, self.g.qqic) - eq_(self.num, self.g.num) - eq_(self.srcs, self.g.srcs) - - def test_init_with_srcs(self): - self.setUp_with_srcs() - self.test_init() - - def test_parser(self): - _res = self.g.parser(self.buf) - if type(_res) is tuple: - res = _res[0] - else: - res = _res - - eq_(res.msgtype, self.msgtype) - eq_(res.maxresp, self.maxresp) - eq_(res.csum, self.csum) - eq_(res.address, self.address) - eq_(res.s_flg, self.s_flg) - eq_(res.qrv, self.qrv) - eq_(res.qqic, self.qqic) - eq_(res.num, self.num) - eq_(res.srcs, self.srcs) - - def test_parser_with_srcs(self): - self.setUp_with_srcs() - self.test_parser() - - def test_serialize(self): - data = bytearray() - prev = None - buf = self.g.serialize(data, prev) - - res = unpack_from(igmpv3_query._PACK_STR, six.binary_type(buf)) - - eq_(res[0], self.msgtype) - eq_(res[1], self.maxresp) - eq_(res[2], checksum(self.buf)) - eq_(res[3], addrconv.ipv4.text_to_bin(self.address)) - eq_(res[4], self.s_qrv) - eq_(res[5], self.qqic) - eq_(res[6], self.num) - - def test_serialize_with_srcs(self): - self.setUp_with_srcs() - data = bytearray() - prev = None - buf = self.g.serialize(data, prev) - - res = unpack_from(igmpv3_query._PACK_STR, six.binary_type(buf)) - (src1, src2, src3) = unpack_from('4s4s4s', six.binary_type(buf), - igmpv3_query._MIN_LEN) - - eq_(res[0], self.msgtype) - eq_(res[1], self.maxresp) - eq_(res[2], checksum(self.buf)) - eq_(res[3], addrconv.ipv4.text_to_bin(self.address)) - eq_(res[4], self.s_qrv) - eq_(res[5], self.qqic) - eq_(res[6], self.num) - eq_(src1, addrconv.ipv4.text_to_bin(self.srcs[0])) - eq_(src2, addrconv.ipv4.text_to_bin(self.srcs[1])) - eq_(src3, addrconv.ipv4.text_to_bin(self.srcs[2])) - - def _build_igmp(self): - dl_dst = '11:22:33:44:55:66' - dl_src = 'aa:bb:cc:dd:ee:ff' - dl_type = ether.ETH_TYPE_IP - e = ethernet(dl_dst, dl_src, dl_type) - - total_length = len(ipv4()) + len(self.g) - nw_proto = inet.IPPROTO_IGMP - nw_dst = '11.22.33.44' - nw_src = '55.66.77.88' - i = ipv4(total_length=total_length, src=nw_src, dst=nw_dst, - proto=nw_proto, ttl=1) - - p = Packet() - - p.add_protocol(e) - p.add_protocol(i) - p.add_protocol(self.g) - p.serialize() - return p - - def test_build_igmp(self): - p = self._build_igmp() - - e = self.find_protocol(p, "ethernet") - ok_(e) - eq_(e.ethertype, ether.ETH_TYPE_IP) - - i = self.find_protocol(p, "ipv4") - ok_(i) - eq_(i.proto, inet.IPPROTO_IGMP) - - g = self.find_protocol(p, "igmpv3_query") - ok_(g) - - eq_(g.msgtype, self.msgtype) - eq_(g.maxresp, self.maxresp) - eq_(g.csum, checksum(self.buf)) - eq_(g.address, self.address) - eq_(g.s_flg, self.s_flg) - eq_(g.qrv, self.qrv) - eq_(g.qqic, self.qqic) - eq_(g.num, self.num) - eq_(g.srcs, self.srcs) - - def test_build_igmp_with_srcs(self): - self.setUp_with_srcs() - self.test_build_igmp() - - def test_to_string(self): - igmp_values = {'msgtype': repr(self.msgtype), - 'maxresp': repr(self.maxresp), - 'csum': repr(self.csum), - 'address': repr(self.address), - 's_flg': repr(self.s_flg), - 'qrv': repr(self.qrv), - 'qqic': repr(self.qqic), - 'num': repr(self.num), - 'srcs': repr(self.srcs)} - _g_str = ','.join(['%s=%s' % (k, igmp_values[k]) - for k, v in inspect.getmembers(self.g) - if k in igmp_values]) - g_str = '%s(%s)' % (igmpv3_query.__name__, _g_str) - - eq_(str(self.g), g_str) - eq_(repr(self.g), g_str) - - def test_to_string_with_srcs(self): - self.setUp_with_srcs() - self.test_to_string() - - @raises(Exception) - def test_num_larger_than_srcs(self): - self.srcs = ['192.168.1.1', '192.168.1.2', '192.168.1.3'] - self.num = len(self.srcs) + 1 - self.buf = pack(igmpv3_query._PACK_STR, self.msgtype, - self.maxresp, self.csum, - addrconv.ipv4.text_to_bin(self.address), - self.s_qrv, self.qqic, self.num) - for src in self.srcs: - self.buf += pack('4s', addrconv.ipv4.text_to_bin(src)) - self.g = igmpv3_query( - self.msgtype, self.maxresp, self.csum, self.address, - self.s_flg, self.qrv, self.qqic, self.num, self.srcs) - self.test_parser() - - @raises(Exception) - def test_num_smaller_than_srcs(self): - self.srcs = ['192.168.1.1', '192.168.1.2', '192.168.1.3'] - self.num = len(self.srcs) - 1 - self.buf = pack(igmpv3_query._PACK_STR, self.msgtype, - self.maxresp, self.csum, - addrconv.ipv4.text_to_bin(self.address), - self.s_qrv, self.qqic, self.num) - for src in self.srcs: - self.buf += pack('4s', addrconv.ipv4.text_to_bin(src)) - self.g = igmpv3_query( - self.msgtype, self.maxresp, self.csum, self.address, - self.s_flg, self.qrv, self.qqic, self.num, self.srcs) - self.test_parser() - - def test_default_args(self): - prev = ipv4(proto=inet.IPPROTO_IGMP) - g = igmpv3_query() - prev.serialize(g, None) - buf = g.serialize(bytearray(), prev) - res = unpack_from(igmpv3_query._PACK_STR, six.binary_type(buf)) - buf = bytearray(buf) - pack_into('!H', buf, 2, 0) - - eq_(res[0], IGMP_TYPE_QUERY) - eq_(res[1], 100) - eq_(res[2], checksum(buf)) - eq_(res[3], addrconv.ipv4.text_to_bin('0.0.0.0')) - eq_(res[4], 2) - eq_(res[5], 0) - eq_(res[6], 0) - - # srcs without num - prev = ipv4(proto=inet.IPPROTO_IGMP) - srcs = ['192.168.1.1', '192.168.1.2', '192.168.1.3'] - g = igmpv3_query(srcs=srcs) - prev.serialize(g, None) - buf = g.serialize(bytearray(), prev) - res = unpack_from(igmpv3_query._PACK_STR, six.binary_type(buf)) - buf = bytearray(buf) - pack_into('!H', buf, 2, 0) - - eq_(res[0], IGMP_TYPE_QUERY) - eq_(res[1], 100) - eq_(res[2], checksum(buf)) - eq_(res[3], addrconv.ipv4.text_to_bin('0.0.0.0')) - eq_(res[4], 2) - eq_(res[5], 0) - eq_(res[6], len(srcs)) - - res = unpack_from('4s4s4s', six.binary_type(buf), igmpv3_query._MIN_LEN) - - eq_(res[0], addrconv.ipv4.text_to_bin(srcs[0])) - eq_(res[1], addrconv.ipv4.text_to_bin(srcs[1])) - eq_(res[2], addrconv.ipv4.text_to_bin(srcs[2])) - - def test_json(self): - jsondict = self.g.to_jsondict() - g = igmpv3_query.from_jsondict(jsondict['igmpv3_query']) - eq_(str(self.g), str(g)) - - def test_json_with_srcs(self): - self.setUp_with_srcs() - self.test_json() - - -class Test_igmpv3_report(unittest.TestCase): - """ Test case for Internet Group Management Protocol v3 - Membership Report Message""" - def setUp(self): - self.msgtype = IGMP_TYPE_REPORT_V3 - self.csum = 0 - self.record_num = 0 - self.records = [] - - self.buf = pack(igmpv3_report._PACK_STR, self.msgtype, - self.csum, self.record_num) - - self.g = igmpv3_report( - self.msgtype, self.csum, self.record_num, self.records) - - def setUp_with_records(self): - self.record1 = igmpv3_report_group( - MODE_IS_INCLUDE, 0, 0, '225.0.0.1') - self.record2 = igmpv3_report_group( - MODE_IS_INCLUDE, 0, 2, '225.0.0.2', - ['172.16.10.10', '172.16.10.27']) - self.record3 = igmpv3_report_group( - MODE_IS_INCLUDE, 1, 0, '225.0.0.3', [], b'abc\x00') - self.record4 = igmpv3_report_group( - MODE_IS_INCLUDE, 2, 2, '225.0.0.4', - ['172.16.10.10', '172.16.10.27'], b'abcde\x00\x00\x00') - self.records = [self.record1, self.record2, self.record3, - self.record4] - self.record_num = len(self.records) - self.buf = pack(igmpv3_report._PACK_STR, self.msgtype, - self.csum, self.record_num) - self.buf += self.record1.serialize() - self.buf += self.record2.serialize() - self.buf += self.record3.serialize() - self.buf += self.record4.serialize() - self.g = igmpv3_report( - self.msgtype, self.csum, self.record_num, self.records) - - def tearDown(self): - pass - - def find_protocol(self, pkt, name): - for p in pkt.protocols: - if p.protocol_name == name: - return p - - def test_init(self): - eq_(self.msgtype, self.g.msgtype) - eq_(self.csum, self.g.csum) - eq_(self.record_num, self.g.record_num) - eq_(self.records, self.g.records) - - def test_init_with_records(self): - self.setUp_with_records() - self.test_init() - - def test_parser(self): - _res = self.g.parser(six.binary_type(self.buf)) - if type(_res) is tuple: - res = _res[0] - else: - res = _res - - eq_(res.msgtype, self.msgtype) - eq_(res.csum, self.csum) - eq_(res.record_num, self.record_num) - eq_(repr(res.records), repr(self.records)) - - def test_parser_with_records(self): - self.setUp_with_records() - self.test_parser() - - def test_serialize(self): - data = bytearray() - prev = None - buf = self.g.serialize(data, prev) - - res = unpack_from(igmpv3_report._PACK_STR, six.binary_type(buf)) - - eq_(res[0], self.msgtype) - eq_(res[1], checksum(self.buf)) - eq_(res[2], self.record_num) - - def test_serialize_with_records(self): - self.setUp_with_records() - data = bytearray() - prev = None - buf = six.binary_type(self.g.serialize(data, prev)) - - res = unpack_from(igmpv3_report._PACK_STR, buf) - offset = igmpv3_report._MIN_LEN - rec1 = igmpv3_report_group.parser(buf[offset:]) - offset += len(rec1) - rec2 = igmpv3_report_group.parser(buf[offset:]) - offset += len(rec2) - rec3 = igmpv3_report_group.parser(buf[offset:]) - offset += len(rec3) - rec4 = igmpv3_report_group.parser(buf[offset:]) - - eq_(res[0], self.msgtype) - eq_(res[1], checksum(self.buf)) - eq_(res[2], self.record_num) - eq_(repr(rec1), repr(self.record1)) - eq_(repr(rec2), repr(self.record2)) - eq_(repr(rec3), repr(self.record3)) - eq_(repr(rec4), repr(self.record4)) - - def _build_igmp(self): - dl_dst = '11:22:33:44:55:66' - dl_src = 'aa:bb:cc:dd:ee:ff' - dl_type = ether.ETH_TYPE_IP - e = ethernet(dl_dst, dl_src, dl_type) - - total_length = len(ipv4()) + len(self.g) - nw_proto = inet.IPPROTO_IGMP - nw_dst = '11.22.33.44' - nw_src = '55.66.77.88' - i = ipv4(total_length=total_length, src=nw_src, dst=nw_dst, - proto=nw_proto, ttl=1) - - p = Packet() - - p.add_protocol(e) - p.add_protocol(i) - p.add_protocol(self.g) - p.serialize() - return p - - def test_build_igmp(self): - p = self._build_igmp() - - e = self.find_protocol(p, "ethernet") - ok_(e) - eq_(e.ethertype, ether.ETH_TYPE_IP) - - i = self.find_protocol(p, "ipv4") - ok_(i) - eq_(i.proto, inet.IPPROTO_IGMP) - - g = self.find_protocol(p, "igmpv3_report") - ok_(g) - - eq_(g.msgtype, self.msgtype) - eq_(g.csum, checksum(self.buf)) - eq_(g.record_num, self.record_num) - eq_(g.records, self.records) - - def test_build_igmp_with_records(self): - self.setUp_with_records() - self.test_build_igmp() - - def test_to_string(self): - igmp_values = {'msgtype': repr(self.msgtype), - 'csum': repr(self.csum), - 'record_num': repr(self.record_num), - 'records': repr(self.records)} - _g_str = ','.join(['%s=%s' % (k, igmp_values[k]) - for k, v in inspect.getmembers(self.g) - if k in igmp_values]) - g_str = '%s(%s)' % (igmpv3_report.__name__, _g_str) - - eq_(str(self.g), g_str) - eq_(repr(self.g), g_str) - - def test_to_string_with_records(self): - self.setUp_with_records() - self.test_to_string() - - @raises(Exception) - def test_record_num_larger_than_records(self): - self.record1 = igmpv3_report_group( - MODE_IS_INCLUDE, 0, 0, '225.0.0.1') - self.record2 = igmpv3_report_group( - MODE_IS_INCLUDE, 0, 2, '225.0.0.2', - ['172.16.10.10', '172.16.10.27']) - self.record3 = igmpv3_report_group( - MODE_IS_INCLUDE, 1, 0, '225.0.0.3', [], b'abc\x00') - self.record4 = igmpv3_report_group( - MODE_IS_INCLUDE, 1, 2, '225.0.0.4', - ['172.16.10.10', '172.16.10.27'], b'abc\x00') - self.records = [self.record1, self.record2, self.record3, - self.record4] - self.record_num = len(self.records) + 1 - self.buf = pack(igmpv3_report._PACK_STR, self.msgtype, - self.csum, self.record_num) - self.buf += self.record1.serialize() - self.buf += self.record2.serialize() - self.buf += self.record3.serialize() - self.buf += self.record4.serialize() - self.g = igmpv3_report( - self.msgtype, self.csum, self.record_num, self.records) - self.test_parser() - - @raises(Exception) - def test_record_num_smaller_than_records(self): - self.record1 = igmpv3_report_group( - MODE_IS_INCLUDE, 0, 0, '225.0.0.1') - self.record2 = igmpv3_report_group( - MODE_IS_INCLUDE, 0, 2, '225.0.0.2', - ['172.16.10.10', '172.16.10.27']) - self.record3 = igmpv3_report_group( - MODE_IS_INCLUDE, 1, 0, '225.0.0.3', [], b'abc\x00') - self.record4 = igmpv3_report_group( - MODE_IS_INCLUDE, 1, 2, '225.0.0.4', - ['172.16.10.10', '172.16.10.27'], b'abc\x00') - self.records = [self.record1, self.record2, self.record3, - self.record4] - self.record_num = len(self.records) - 1 - self.buf = pack(igmpv3_report._PACK_STR, self.msgtype, - self.csum, self.record_num) - self.buf += self.record1.serialize() - self.buf += self.record2.serialize() - self.buf += self.record3.serialize() - self.buf += self.record4.serialize() - self.g = igmpv3_report( - self.msgtype, self.csum, self.record_num, self.records) - self.test_parser() - - def test_default_args(self): - prev = ipv4(proto=inet.IPPROTO_IGMP) - g = igmpv3_report() - prev.serialize(g, None) - buf = g.serialize(bytearray(), prev) - res = unpack_from(igmpv3_report._PACK_STR, six.binary_type(buf)) - buf = bytearray(buf) - pack_into('!H', buf, 2, 0) - - eq_(res[0], IGMP_TYPE_REPORT_V3) - eq_(res[1], checksum(buf)) - eq_(res[2], 0) - - # records without record_num - prev = ipv4(proto=inet.IPPROTO_IGMP) - record1 = igmpv3_report_group( - MODE_IS_INCLUDE, 0, 0, '225.0.0.1') - record2 = igmpv3_report_group( - MODE_IS_INCLUDE, 0, 2, '225.0.0.2', - ['172.16.10.10', '172.16.10.27']) - record3 = igmpv3_report_group( - MODE_IS_INCLUDE, 1, 0, '225.0.0.3', [], b'abc\x00') - record4 = igmpv3_report_group( - MODE_IS_INCLUDE, 1, 2, '225.0.0.4', - ['172.16.10.10', '172.16.10.27'], b'abc\x00') - records = [record1, record2, record3, record4] - g = igmpv3_report(records=records) - prev.serialize(g, None) - buf = g.serialize(bytearray(), prev) - res = unpack_from(igmpv3_report._PACK_STR, six.binary_type(buf)) - buf = bytearray(buf) - pack_into('!H', buf, 2, 0) - - eq_(res[0], IGMP_TYPE_REPORT_V3) - eq_(res[1], checksum(buf)) - eq_(res[2], len(records)) - - def test_json(self): - jsondict = self.g.to_jsondict() - g = igmpv3_report.from_jsondict(jsondict['igmpv3_report']) - eq_(str(self.g), str(g)) - - def test_json_with_records(self): - self.setUp_with_records() - self.test_json() - - -class Test_igmpv3_report_group(unittest.TestCase): - """Test case for Group Records of - Internet Group Management Protocol v3 Membership Report Message""" - def setUp(self): - self.type_ = MODE_IS_INCLUDE - self.aux_len = 0 - self.num = 0 - self.address = '225.0.0.1' - self.srcs = [] - self.aux = None - - self.buf = pack(igmpv3_report_group._PACK_STR, self.type_, - self.aux_len, self.num, - addrconv.ipv4.text_to_bin(self.address)) - - self.g = igmpv3_report_group( - self.type_, self.aux_len, self.num, self.address, - self.srcs, self.aux) - - def setUp_with_srcs(self): - self.srcs = ['192.168.1.1', '192.168.1.2', '192.168.1.3'] - self.num = len(self.srcs) - self.buf = pack(igmpv3_report_group._PACK_STR, self.type_, - self.aux_len, self.num, - addrconv.ipv4.text_to_bin(self.address)) - for src in self.srcs: - self.buf += pack('4s', addrconv.ipv4.text_to_bin(src)) - self.g = igmpv3_report_group( - self.type_, self.aux_len, self.num, self.address, - self.srcs, self.aux) - - def setUp_with_aux(self): - self.aux = b'\x01\x02\x03\x04\x05\x00\x00\x00' - self.aux_len = len(self.aux) // 4 - self.buf = pack(igmpv3_report_group._PACK_STR, self.type_, - self.aux_len, self.num, - addrconv.ipv4.text_to_bin(self.address)) - self.buf += self.aux - self.g = igmpv3_report_group( - self.type_, self.aux_len, self.num, self.address, - self.srcs, self.aux) - - def setUp_with_srcs_and_aux(self): - self.srcs = ['192.168.1.1', '192.168.1.2', '192.168.1.3'] - self.num = len(self.srcs) - self.aux = b'\x01\x02\x03\x04\x05\x00\x00\x00' - self.aux_len = len(self.aux) // 4 - self.buf = pack(igmpv3_report_group._PACK_STR, self.type_, - self.aux_len, self.num, - addrconv.ipv4.text_to_bin(self.address)) - for src in self.srcs: - self.buf += pack('4s', addrconv.ipv4.text_to_bin(src)) - self.buf += self.aux - self.g = igmpv3_report_group( - self.type_, self.aux_len, self.num, self.address, - self.srcs, self.aux) - - def tearDown(self): - pass - - def test_init(self): - eq_(self.type_, self.g.type_) - eq_(self.aux_len, self.g.aux_len) - eq_(self.num, self.g.num) - eq_(self.address, self.g.address) - eq_(self.srcs, self.g.srcs) - eq_(self.aux, self.g.aux) - - def test_init_with_srcs(self): - self.setUp_with_srcs() - self.test_init() - - def test_init_with_aux(self): - self.setUp_with_aux() - self.test_init() - - def test_init_with_srcs_and_aux(self): - self.setUp_with_srcs_and_aux() - self.test_init() - - def test_parser(self): - _res = self.g.parser(self.buf) - if type(_res) is tuple: - res = _res[0] - else: - res = _res - - eq_(res.type_, self.type_) - eq_(res.aux_len, self.aux_len) - eq_(res.num, self.num) - eq_(res.address, self.address) - eq_(res.srcs, self.srcs) - eq_(res.aux, self.aux) - - def test_parser_with_srcs(self): - self.setUp_with_srcs() - self.test_parser() - - def test_parser_with_aux(self): - self.setUp_with_aux() - self.test_parser() - - def test_parser_with_srcs_and_aux(self): - self.setUp_with_srcs_and_aux() - self.test_parser() - - def test_serialize(self): - buf = self.g.serialize() - res = unpack_from(igmpv3_report_group._PACK_STR, six.binary_type(buf)) - - eq_(res[0], self.type_) - eq_(res[1], self.aux_len) - eq_(res[2], self.num) - eq_(res[3], addrconv.ipv4.text_to_bin(self.address)) - - def test_serialize_with_srcs(self): - self.setUp_with_srcs() - buf = self.g.serialize() - res = unpack_from(igmpv3_report_group._PACK_STR, six.binary_type(buf)) - (src1, src2, src3) = unpack_from('4s4s4s', six.binary_type(buf), - igmpv3_report_group._MIN_LEN) - eq_(res[0], self.type_) - eq_(res[1], self.aux_len) - eq_(res[2], self.num) - eq_(res[3], addrconv.ipv4.text_to_bin(self.address)) - eq_(src1, addrconv.ipv4.text_to_bin(self.srcs[0])) - eq_(src2, addrconv.ipv4.text_to_bin(self.srcs[1])) - eq_(src3, addrconv.ipv4.text_to_bin(self.srcs[2])) - - def test_serialize_with_aux(self): - self.setUp_with_aux() - buf = self.g.serialize() - res = unpack_from(igmpv3_report_group._PACK_STR, six.binary_type(buf)) - (aux, ) = unpack_from('%ds' % (self.aux_len * 4), six.binary_type(buf), - igmpv3_report_group._MIN_LEN) - eq_(res[0], self.type_) - eq_(res[1], self.aux_len) - eq_(res[2], self.num) - eq_(res[3], addrconv.ipv4.text_to_bin(self.address)) - eq_(aux, self.aux) - - def test_serialize_with_srcs_and_aux(self): - self.setUp_with_srcs_and_aux() - buf = self.g.serialize() - res = unpack_from(igmpv3_report_group._PACK_STR, six.binary_type(buf)) - (src1, src2, src3) = unpack_from('4s4s4s', six.binary_type(buf), - igmpv3_report_group._MIN_LEN) - (aux, ) = unpack_from('%ds' % (self.aux_len * 4), six.binary_type(buf), - igmpv3_report_group._MIN_LEN + 12) - eq_(res[0], self.type_) - eq_(res[1], self.aux_len) - eq_(res[2], self.num) - eq_(res[3], addrconv.ipv4.text_to_bin(self.address)) - eq_(src1, addrconv.ipv4.text_to_bin(self.srcs[0])) - eq_(src2, addrconv.ipv4.text_to_bin(self.srcs[1])) - eq_(src3, addrconv.ipv4.text_to_bin(self.srcs[2])) - eq_(aux, self.aux) - - def test_to_string(self): - igmp_values = {'type_': repr(self.type_), - 'aux_len': repr(self.aux_len), - 'num': repr(self.num), - 'address': repr(self.address), - 'srcs': repr(self.srcs), - 'aux': repr(self.aux)} - _g_str = ','.join(['%s=%s' % (k, igmp_values[k]) - for k, v in inspect.getmembers(self.g) - if k in igmp_values]) - g_str = '%s(%s)' % (igmpv3_report_group.__name__, _g_str) - - eq_(str(self.g), g_str) - eq_(repr(self.g), g_str) - - def test_to_string_with_srcs(self): - self.setUp_with_srcs() - self.test_to_string() - - def test_to_string_with_aux(self): - self.setUp_with_aux() - self.test_to_string() - - def test_to_string_with_srcs_and_aux(self): - self.setUp_with_srcs_and_aux() - self.test_to_string() - - def test_len(self): - eq_(len(self.g), 8) - - def test_len_with_srcs(self): - self.setUp_with_srcs() - eq_(len(self.g), 20) - - def test_len_with_aux(self): - self.setUp_with_aux() - eq_(len(self.g), 16) - - def test_len_with_srcs_and_aux(self): - self.setUp_with_srcs_and_aux() - eq_(len(self.g), 28) - - @raises - def test_num_larger_than_srcs(self): - self.srcs = ['192.168.1.1', '192.168.1.2', '192.168.1.3'] - self.num = len(self.srcs) + 1 - self.buf = pack(igmpv3_report_group._PACK_STR, self.type_, - self.aux_len, self.num, - addrconv.ipv4.text_to_bin(self.address)) - for src in self.srcs: - self.buf += pack('4s', addrconv.ipv4.text_to_bin(src)) - self.g = igmpv3_report_group( - self.type_, self.aux_len, self.num, self.address, - self.srcs, self.aux) - self.test_parser() - - @raises - def test_num_smaller_than_srcs(self): - self.srcs = ['192.168.1.1', '192.168.1.2', '192.168.1.3'] - self.num = len(self.srcs) - 1 - self.buf = pack(igmpv3_report_group._PACK_STR, self.type_, - self.aux_len, self.num, - addrconv.ipv4.text_to_bin(self.address)) - for src in self.srcs: - self.buf += pack('4s', addrconv.ipv4.text_to_bin(src)) - self.g = igmpv3_report_group( - self.type_, self.aux_len, self.num, self.address, - self.srcs, self.aux) - self.test_parser() - - @raises - def test_aux_len_larger_than_aux(self): - self.aux = b'\x01\x02\x03\x04\x05\x00\x00\x00' - self.aux_len = len(self.aux) // 4 + 1 - self.buf = pack(igmpv3_report_group._PACK_STR, self.type_, - self.aux_len, self.num, - addrconv.ipv4.text_to_bin(self.address)) - self.buf += self.aux - self.g = igmpv3_report_group( - self.type_, self.aux_len, self.num, self.address, - self.srcs, self.aux) - self.test_parser() - - @raises - def test_aux_len_smaller_than_aux(self): - self.aux = b'\x01\x02\x03\x04\x05\x00\x00\x00' - self.aux_len = len(self.aux) // 4 - 1 - self.buf = pack(igmpv3_report_group._PACK_STR, self.type_, - self.aux_len, self.num, - addrconv.ipv4.text_to_bin(self.address)) - self.buf += self.aux - self.g = igmpv3_report_group( - self.type_, self.aux_len, self.num, self.address, - self.srcs, self.aux) - self.test_parser() - - def test_default_args(self): - rep = igmpv3_report_group() - buf = rep.serialize() - res = unpack_from(igmpv3_report_group._PACK_STR, six.binary_type(buf)) - - eq_(res[0], 0) - eq_(res[1], 0) - eq_(res[2], 0) - eq_(res[3], addrconv.ipv4.text_to_bin('0.0.0.0')) - - # srcs without num - srcs = ['192.168.1.1', '192.168.1.2', '192.168.1.3'] - rep = igmpv3_report_group(srcs=srcs) - buf = rep.serialize() - res = unpack_from(igmpv3_report_group._PACK_STR, six.binary_type(buf)) - - eq_(res[0], 0) - eq_(res[1], 0) - eq_(res[2], len(srcs)) - eq_(res[3], addrconv.ipv4.text_to_bin('0.0.0.0')) - - res = unpack_from('4s4s4s', six.binary_type(buf), - igmpv3_report_group._MIN_LEN) - - eq_(res[0], addrconv.ipv4.text_to_bin(srcs[0])) - eq_(res[1], addrconv.ipv4.text_to_bin(srcs[1])) - eq_(res[2], addrconv.ipv4.text_to_bin(srcs[2])) - - # aux without aux_len - aux = b'abcde' - rep = igmpv3_report_group(aux=aux) - buf = rep.serialize() - res = unpack_from(igmpv3_report_group._PACK_STR, six.binary_type(buf)) - - eq_(res[0], 0) - eq_(res[1], 2) - eq_(res[2], 0) - eq_(res[3], addrconv.ipv4.text_to_bin('0.0.0.0')) - eq_(buf[igmpv3_report_group._MIN_LEN:], b'abcde\x00\x00\x00') diff --git a/tests/unit/packet/test_ipv4.py b/tests/unit/packet/test_ipv4.py deleted file mode 100644 index 69186f3f..00000000 --- a/tests/unit/packet/test_ipv4.py +++ /dev/null @@ -1,137 +0,0 @@ -# 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. - -# vim: tabstop=4 shiftwidth=4 softtabstop=4 - -import unittest -import logging -import six -import struct -from struct import * -from nose.tools import * -from ryu.ofproto import ether, inet -from ryu.lib.packet import packet_utils -from ryu.lib.packet.ethernet import ethernet -from ryu.lib.packet.packet import Packet -from ryu.lib.packet.ipv4 import ipv4 -from ryu.lib.packet.tcp import tcp -from ryu.lib import addrconv - - -LOG = logging.getLogger('test_ipv4') - - -class Test_ipv4(unittest.TestCase): - """ Test case for ipv4 - """ - - version = 4 - header_length = 5 + 10 - ver_hlen = version << 4 | header_length - tos = 0 - total_length = header_length + 64 - identification = 30774 - flags = 4 - offset = 1480 - flg_off = flags << 13 | offset - ttl = 64 - proto = inet.IPPROTO_TCP - csum = 0xadc6 - src = '131.151.32.21' - dst = '131.151.32.129' - length = header_length * 4 - option = b'\x86\x28\x00\x00\x00\x01\x01\x22' \ - + b'\x00\x01\xae\x00\x00\x00\x00\x00' \ - + b'\x00\x00\x00\x00\x00\x00\x00\x00' \ - + b'\x00\x00\x00\x00\x00\x00\x00\x00' \ - + b'\x00\x00\x00\x00\x00\x00\x00\x01' - - buf = pack(ipv4._PACK_STR, ver_hlen, tos, total_length, identification, - flg_off, ttl, proto, csum, - addrconv.ipv4.text_to_bin(src), - addrconv.ipv4.text_to_bin(dst)) \ - + option - - ip = ipv4(version, header_length, tos, total_length, identification, - flags, offset, ttl, proto, csum, src, dst, option) - - def setUp(self): - pass - - def tearDown(self): - pass - - def test_init(self): - eq_(self.version, self.ip.version) - eq_(self.header_length, self.ip.header_length) - eq_(self.tos, self.ip.tos) - eq_(self.total_length, self.ip.total_length) - eq_(self.identification, self.ip.identification) - eq_(self.flags, self.ip.flags) - eq_(self.offset, self.ip.offset) - eq_(self.ttl, self.ip.ttl) - eq_(self.proto, self.ip.proto) - eq_(self.csum, self.ip.csum) - eq_(self.src, self.ip.src) - eq_(self.dst, self.ip.dst) - eq_(self.length, len(self.ip)) - eq_(self.option, self.ip.option) - - def test_parser(self): - res, ptype, _ = self.ip.parser(self.buf) - - eq_(res.version, self.version) - eq_(res.header_length, self.header_length) - eq_(res.tos, self.tos) - eq_(res.total_length, self.total_length) - eq_(res.identification, self.identification) - eq_(res.flags, self.flags) - eq_(res.offset, self.offset) - eq_(res.ttl, self.ttl) - eq_(res.proto, self.proto) - eq_(res.csum, self.csum) - eq_(res.src, self.src) - eq_(res.dst, self.dst) - eq_(ptype, tcp) - - def test_serialize(self): - buf = self.ip.serialize(bytearray(), None) - res = struct.unpack_from(ipv4._PACK_STR, six.binary_type(buf)) - option = buf[ipv4._MIN_LEN:ipv4._MIN_LEN + len(self.option)] - - eq_(res[0], self.ver_hlen) - eq_(res[1], self.tos) - eq_(res[2], self.total_length) - eq_(res[3], self.identification) - eq_(res[4], self.flg_off) - eq_(res[5], self.ttl) - eq_(res[6], self.proto) - eq_(res[8], addrconv.ipv4.text_to_bin(self.src)) - eq_(res[9], addrconv.ipv4.text_to_bin(self.dst)) - eq_(option, self.option) - - # checksum - csum = packet_utils.checksum(buf) - eq_(csum, 0) - - @raises(Exception) - def test_malformed_ipv4(self): - m_short_buf = self.buf[1:ipv4._MIN_LEN] - ipv4.parser(m_short_buf) - - def test_json(self): - jsondict = self.ip.to_jsondict() - ip = ipv4.from_jsondict(jsondict['ipv4']) - eq_(str(self.ip), str(ip)) diff --git a/tests/unit/packet/test_ipv6.py b/tests/unit/packet/test_ipv6.py deleted file mode 100644 index 455dc8c3..00000000 --- a/tests/unit/packet/test_ipv6.py +++ /dev/null @@ -1,1128 +0,0 @@ -# Copyright (C) 2013 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 logging -import inspect -import six -import struct - -from nose.tools import * -from ryu.lib import addrconv -from ryu.lib import ip -from ryu.lib.packet import ipv6 - - -LOG = logging.getLogger(__name__) - - -class Test_ipv6(unittest.TestCase): - - def setUp(self): - self.version = 6 - self.traffic_class = 0 - self.flow_label = 0 - self.payload_length = 817 - self.nxt = 6 - self.hop_limit = 128 - self.src = '2002:4637:d5d3::4637:d5d3' - self.dst = '2001:4860:0:2001::68' - self.ext_hdrs = [] - self.ip = ipv6.ipv6( - self.version, self.traffic_class, self.flow_label, - self.payload_length, self.nxt, self.hop_limit, self.src, - self.dst, self.ext_hdrs) - - self.v_tc_flow = ( - self.version << 28 | self.traffic_class << 20 | - self.flow_label << 12) - self.buf = struct.pack( - ipv6.ipv6._PACK_STR, self.v_tc_flow, - self.payload_length, self.nxt, self.hop_limit, - addrconv.ipv6.text_to_bin(self.src), - addrconv.ipv6.text_to_bin(self.dst)) - - def setUp_with_hop_opts(self): - self.opt1_type = 5 - self.opt1_len = 2 - self.opt1_data = b'\x00\x00' - self.opt2_type = 1 - self.opt2_len = 0 - self.opt2_data = None - self.options = [ - ipv6.option(self.opt1_type, self.opt1_len, self.opt1_data), - ipv6.option(self.opt2_type, self.opt2_len, self.opt2_data), - ] - self.hop_opts_nxt = 6 - self.hop_opts_size = 0 - self.hop_opts = ipv6.hop_opts( - self.hop_opts_nxt, self.hop_opts_size, self.options) - self.ext_hdrs = [self.hop_opts] - self.payload_length += len(self.hop_opts) - self.nxt = ipv6.hop_opts.TYPE - self.ip = ipv6.ipv6( - self.version, self.traffic_class, self.flow_label, - self.payload_length, self.nxt, self.hop_limit, self.src, - self.dst, self.ext_hdrs) - self.buf = struct.pack( - ipv6.ipv6._PACK_STR, self.v_tc_flow, - self.payload_length, self.nxt, self.hop_limit, - addrconv.ipv6.text_to_bin(self.src), - addrconv.ipv6.text_to_bin(self.dst)) - self.buf += self.hop_opts.serialize() - - def setUp_with_dst_opts(self): - self.opt1_type = 5 - self.opt1_len = 2 - self.opt1_data = b'\x00\x00' - self.opt2_type = 1 - self.opt2_len = 0 - self.opt2_data = None - self.options = [ - ipv6.option(self.opt1_type, self.opt1_len, self.opt1_data), - ipv6.option(self.opt2_type, self.opt2_len, self.opt2_data), - ] - self.dst_opts_nxt = 6 - self.dst_opts_size = 0 - self.dst_opts = ipv6.dst_opts( - self.dst_opts_nxt, self.dst_opts_size, self.options) - self.ext_hdrs = [self.dst_opts] - self.payload_length += len(self.dst_opts) - self.nxt = ipv6.dst_opts.TYPE - self.ip = ipv6.ipv6( - self.version, self.traffic_class, self.flow_label, - self.payload_length, self.nxt, self.hop_limit, self.src, - self.dst, self.ext_hdrs) - self.buf = struct.pack( - ipv6.ipv6._PACK_STR, self.v_tc_flow, - self.payload_length, self.nxt, self.hop_limit, - addrconv.ipv6.text_to_bin(self.src), - addrconv.ipv6.text_to_bin(self.dst)) - self.buf += self.dst_opts.serialize() - - def setUp_with_routing_type3(self): - self.routing_nxt = 6 - self.routing_size = 6 - self.routing_type = 3 - self.routing_seg = 2 - self.routing_cmpi = 0 - self.routing_cmpe = 0 - self.routing_adrs = ["2001:db8:dead::1", "2001:db8:dead::2", - "2001:db8:dead::3"] - self.routing = ipv6.routing_type3( - self.routing_nxt, self.routing_size, - self.routing_type, self.routing_seg, - self.routing_cmpi, self.routing_cmpe, - self.routing_adrs) - self.ext_hdrs = [self.routing] - self.payload_length += len(self.routing) - self.nxt = ipv6.routing.TYPE - self.ip = ipv6.ipv6( - self.version, self.traffic_class, self.flow_label, - self.payload_length, self.nxt, self.hop_limit, self.src, - self.dst, self.ext_hdrs) - self.buf = struct.pack( - ipv6.ipv6._PACK_STR, self.v_tc_flow, - self.payload_length, self.nxt, self.hop_limit, - addrconv.ipv6.text_to_bin(self.src), - addrconv.ipv6.text_to_bin(self.dst)) - self.buf += self.routing.serialize() - - def setUp_with_fragment(self): - self.fragment_nxt = 6 - self.fragment_offset = 50 - self.fragment_more = 1 - self.fragment_id = 123 - self.fragment = ipv6.fragment( - self.fragment_nxt, self.fragment_offset, self.fragment_more, - self.fragment_id) - self.ext_hdrs = [self.fragment] - self.payload_length += len(self.fragment) - self.nxt = ipv6.fragment.TYPE - self.ip = ipv6.ipv6( - self.version, self.traffic_class, self.flow_label, - self.payload_length, self.nxt, self.hop_limit, self.src, - self.dst, self.ext_hdrs) - self.buf = struct.pack( - ipv6.ipv6._PACK_STR, self.v_tc_flow, - self.payload_length, self.nxt, self.hop_limit, - addrconv.ipv6.text_to_bin(self.src), - addrconv.ipv6.text_to_bin(self.dst)) - self.buf += self.fragment.serialize() - - def setUp_with_auth(self): - self.auth_nxt = 6 - self.auth_size = 4 - self.auth_spi = 256 - self.auth_seq = 1 - self.auth_data = b'\xa0\xe7\xf8\xab\xf9\x69\x1a\x8b\xf3\x9f\x7c\xae' - self.auth = ipv6.auth( - self.auth_nxt, self.auth_size, self.auth_spi, self.auth_seq, - self.auth_data) - self.ext_hdrs = [self.auth] - self.payload_length += len(self.auth) - self.nxt = ipv6.auth.TYPE - self.ip = ipv6.ipv6( - self.version, self.traffic_class, self.flow_label, - self.payload_length, self.nxt, self.hop_limit, self.src, - self.dst, self.ext_hdrs) - self.buf = struct.pack( - ipv6.ipv6._PACK_STR, self.v_tc_flow, - self.payload_length, self.nxt, self.hop_limit, - addrconv.ipv6.text_to_bin(self.src), - addrconv.ipv6.text_to_bin(self.dst)) - self.buf += self.auth.serialize() - - def setUp_with_multi_headers(self): - self.opt1_type = 5 - self.opt1_len = 2 - self.opt1_data = b'\x00\x00' - self.opt2_type = 1 - self.opt2_len = 0 - self.opt2_data = None - self.options = [ - ipv6.option(self.opt1_type, self.opt1_len, self.opt1_data), - ipv6.option(self.opt2_type, self.opt2_len, self.opt2_data), - ] - self.hop_opts_nxt = ipv6.auth.TYPE - self.hop_opts_size = 0 - self.hop_opts = ipv6.hop_opts( - self.hop_opts_nxt, self.hop_opts_size, self.options) - self.auth_nxt = 6 - self.auth_size = 4 - self.auth_spi = 256 - self.auth_seq = 1 - self.auth_data = b'\xa0\xe7\xf8\xab\xf9\x69\x1a\x8b\xf3\x9f\x7c\xae' - self.auth = ipv6.auth( - self.auth_nxt, self.auth_size, self.auth_spi, self.auth_seq, - self.auth_data) - self.ext_hdrs = [self.hop_opts, self.auth] - self.payload_length += len(self.hop_opts) + len(self.auth) - self.nxt = ipv6.hop_opts.TYPE - self.ip = ipv6.ipv6( - self.version, self.traffic_class, self.flow_label, - self.payload_length, self.nxt, self.hop_limit, self.src, - self.dst, self.ext_hdrs) - self.buf = struct.pack( - ipv6.ipv6._PACK_STR, self.v_tc_flow, - self.payload_length, self.nxt, self.hop_limit, - addrconv.ipv6.text_to_bin(self.src), - addrconv.ipv6.text_to_bin(self.dst)) - self.buf += self.hop_opts.serialize() - self.buf += self.auth.serialize() - - def tearDown(self): - pass - - def test_init(self): - eq_(self.version, self.ip.version) - eq_(self.traffic_class, self.ip.traffic_class) - eq_(self.flow_label, self.ip.flow_label) - eq_(self.payload_length, self.ip.payload_length) - eq_(self.nxt, self.ip.nxt) - eq_(self.hop_limit, self.ip.hop_limit) - eq_(self.src, self.ip.src) - eq_(self.dst, self.ip.dst) - eq_(str(self.ext_hdrs), str(self.ip.ext_hdrs)) - - def test_init_with_hop_opts(self): - self.setUp_with_hop_opts() - self.test_init() - - def test_init_with_dst_opts(self): - self.setUp_with_dst_opts() - self.test_init() - - def test_init_with_routing_type3(self): - self.setUp_with_routing_type3() - self.test_init() - - def test_init_with_fragment(self): - self.setUp_with_fragment() - self.test_init() - - def test_init_with_auth(self): - self.setUp_with_auth() - self.test_init() - - def test_init_with_multi_headers(self): - self.setUp_with_multi_headers() - self.test_init() - - def test_parser(self): - _res = self.ip.parser(six.binary_type(self.buf)) - if type(_res) is tuple: - res = _res[0] - else: - res = _res - - eq_(self.version, res.version) - eq_(self.traffic_class, res.traffic_class) - eq_(self.flow_label, res.flow_label) - eq_(self.payload_length, res.payload_length) - eq_(self.nxt, res.nxt) - eq_(self.hop_limit, res.hop_limit) - eq_(self.src, res.src) - eq_(self.dst, res.dst) - eq_(str(self.ext_hdrs), str(res.ext_hdrs)) - - def test_parser_with_hop_opts(self): - self.setUp_with_hop_opts() - self.test_parser() - - def test_parser_with_dst_opts(self): - self.setUp_with_dst_opts() - self.test_parser() - - def test_parser_with_routing_type3(self): - self.setUp_with_routing_type3() - self.test_parser() - - def test_parser_with_fragment(self): - self.setUp_with_fragment() - self.test_parser() - - def test_parser_with_auth(self): - self.setUp_with_auth() - self.test_parser() - - def test_parser_with_multi_headers(self): - self.setUp_with_multi_headers() - self.test_parser() - - def test_serialize(self): - data = bytearray() - prev = None - buf = self.ip.serialize(data, prev) - - res = struct.unpack_from(ipv6.ipv6._PACK_STR, six.binary_type(buf)) - - eq_(self.v_tc_flow, res[0]) - eq_(self.payload_length, res[1]) - eq_(self.nxt, res[2]) - eq_(self.hop_limit, res[3]) - eq_(self.src, addrconv.ipv6.bin_to_text(res[4])) - eq_(self.dst, addrconv.ipv6.bin_to_text(res[5])) - - def test_serialize_with_hop_opts(self): - self.setUp_with_hop_opts() - self.test_serialize() - - data = bytearray() - prev = None - buf = self.ip.serialize(data, prev) - hop_opts = ipv6.hop_opts.parser(six.binary_type(buf[ipv6.ipv6._MIN_LEN:])) - eq_(repr(self.hop_opts), repr(hop_opts)) - - def test_serialize_with_dst_opts(self): - self.setUp_with_dst_opts() - self.test_serialize() - - data = bytearray() - prev = None - buf = self.ip.serialize(data, prev) - dst_opts = ipv6.dst_opts.parser(six.binary_type(buf[ipv6.ipv6._MIN_LEN:])) - eq_(repr(self.dst_opts), repr(dst_opts)) - - def test_serialize_with_routing_type3(self): - self.setUp_with_routing_type3() - self.test_serialize() - - data = bytearray() - prev = None - buf = self.ip.serialize(data, prev) - routing = ipv6.routing.parser(six.binary_type(buf[ipv6.ipv6._MIN_LEN:])) - eq_(repr(self.routing), repr(routing)) - - def test_serialize_with_fragment(self): - self.setUp_with_fragment() - self.test_serialize() - - data = bytearray() - prev = None - buf = self.ip.serialize(data, prev) - fragment = ipv6.fragment.parser(six.binary_type(buf[ipv6.ipv6._MIN_LEN:])) - eq_(repr(self.fragment), repr(fragment)) - - def test_serialize_with_auth(self): - self.setUp_with_auth() - self.test_serialize() - - data = bytearray() - prev = None - buf = self.ip.serialize(data, prev) - auth = ipv6.auth.parser(six.binary_type(buf[ipv6.ipv6._MIN_LEN:])) - eq_(repr(self.auth), repr(auth)) - - def test_serialize_with_multi_headers(self): - self.setUp_with_multi_headers() - self.test_serialize() - - data = bytearray() - prev = None - buf = self.ip.serialize(data, prev) - offset = ipv6.ipv6._MIN_LEN - hop_opts = ipv6.hop_opts.parser(six.binary_type(buf[offset:])) - offset += len(hop_opts) - auth = ipv6.auth.parser(six.binary_type(buf[offset:])) - eq_(repr(self.hop_opts), repr(hop_opts)) - eq_(repr(self.auth), repr(auth)) - - def test_to_string(self): - ipv6_values = {'version': self.version, - 'traffic_class': self.traffic_class, - 'flow_label': self.flow_label, - 'payload_length': self.payload_length, - 'nxt': self.nxt, - 'hop_limit': self.hop_limit, - 'src': repr(self.src), - 'dst': repr(self.dst), - 'ext_hdrs': self.ext_hdrs} - _ipv6_str = ','.join(['%s=%s' % (k, ipv6_values[k]) - for k, v in inspect.getmembers(self.ip) - if k in ipv6_values]) - ipv6_str = '%s(%s)' % (ipv6.ipv6.__name__, _ipv6_str) - - eq_(str(self.ip), ipv6_str) - eq_(repr(self.ip), ipv6_str) - - def test_to_string_with_hop_opts(self): - self.setUp_with_hop_opts() - self.test_to_string() - - def test_to_string_with_dst_opts(self): - self.setUp_with_dst_opts() - self.test_to_string() - - def test_to_string_with_fragment(self): - self.setUp_with_fragment() - self.test_to_string() - - def test_to_string_with_auth(self): - self.setUp_with_auth() - self.test_to_string() - - def test_to_string_with_multi_headers(self): - self.setUp_with_multi_headers() - self.test_to_string() - - def test_len(self): - eq_(len(self.ip), 40) - - def test_len_with_hop_opts(self): - self.setUp_with_hop_opts() - eq_(len(self.ip), 40 + len(self.hop_opts)) - - def test_len_with_dst_opts(self): - self.setUp_with_dst_opts() - eq_(len(self.ip), 40 + len(self.dst_opts)) - - def test_len_with_routing_type3(self): - self.setUp_with_routing_type3() - eq_(len(self.ip), 40 + len(self.routing)) - - def test_len_with_fragment(self): - self.setUp_with_fragment() - eq_(len(self.ip), 40 + len(self.fragment)) - - def test_len_with_auth(self): - self.setUp_with_auth() - eq_(len(self.ip), 40 + len(self.auth)) - - def test_len_with_multi_headers(self): - self.setUp_with_multi_headers() - eq_(len(self.ip), 40 + len(self.hop_opts) + len(self.auth)) - - def test_default_args(self): - ip = ipv6.ipv6() - buf = ip.serialize(bytearray(), None) - res = struct.unpack(ipv6.ipv6._PACK_STR, six.binary_type(buf)) - - eq_(res[0], 6 << 28) - eq_(res[1], 0) - eq_(res[2], 6) - eq_(res[3], 255) - eq_(res[4], addrconv.ipv6.text_to_bin('10::10')) - eq_(res[5], addrconv.ipv6.text_to_bin('20::20')) - - # with extension header - ip = ipv6.ipv6( - nxt=0, ext_hdrs=[ - ipv6.hop_opts(58, 0, [ - ipv6.option(5, 2, b'\x00\x00'), - ipv6.option(1, 0, None)])]) - buf = ip.serialize(bytearray(), None) - res = struct.unpack(ipv6.ipv6._PACK_STR + '8s', six.binary_type(buf)) - - eq_(res[0], 6 << 28) - eq_(res[1], 8) - eq_(res[2], 0) - eq_(res[3], 255) - eq_(res[4], addrconv.ipv6.text_to_bin('10::10')) - eq_(res[5], addrconv.ipv6.text_to_bin('20::20')) - eq_(res[6], b'\x3a\x00\x05\x02\x00\x00\x01\x00') - - def test_json(self): - jsondict = self.ip.to_jsondict() - ip = ipv6.ipv6.from_jsondict(jsondict['ipv6']) - eq_(str(self.ip), str(ip)) - - def test_json_with_hop_opts(self): - self.setUp_with_hop_opts() - self.test_json() - - def test_json_with_dst_opts(self): - self.setUp_with_dst_opts() - self.test_json() - - def test_json_with_routing_type3(self): - self.setUp_with_routing_type3() - self.test_json() - - def test_json_with_fragment(self): - self.setUp_with_fragment() - self.test_json() - - def test_json_with_auth(self): - self.setUp_with_auth() - self.test_json() - - def test_json_with_multi_headers(self): - self.setUp_with_multi_headers() - self.test_json() - - -class Test_hop_opts(unittest.TestCase): - - def setUp(self): - self.nxt = 0 - self.size = 8 - self.data = [ - ipv6.option(5, 2, b'\x00\x00'), - ipv6.option(1, 0, None), - ipv6.option(0xc2, 4, b'\x00\x01\x00\x00'), - ipv6.option(1, 0, None), - ] - self.hop = ipv6.hop_opts(self.nxt, self.size, self.data) - self.form = '!BB' - self.buf = struct.pack(self.form, self.nxt, self.size) \ - + self.data[0].serialize() \ - + self.data[1].serialize() \ - + self.data[2].serialize() \ - + self.data[3].serialize() - - def tearDown(self): - pass - - def test_init(self): - eq_(self.nxt, self.hop.nxt) - eq_(self.size, self.hop.size) - eq_(self.data, self.hop.data) - - @raises(Exception) - def test_invalid_size(self): - ipv6.hop_opts(self.nxt, 1, self.data) - - def test_parser(self): - _res = ipv6.hop_opts.parser(self.buf) - if type(_res) is tuple: - res = _res[0] - else: - res = _res - eq_(self.nxt, res.nxt) - eq_(self.size, res.size) - eq_(str(self.data), str(res.data)) - - def test_serialize(self): - buf = self.hop.serialize() - res = struct.unpack_from(self.form, six.binary_type(buf)) - eq_(self.nxt, res[0]) - eq_(self.size, res[1]) - offset = struct.calcsize(self.form) - opt1 = ipv6.option.parser(six.binary_type(buf[offset:])) - offset += len(opt1) - opt2 = ipv6.option.parser(six.binary_type(buf[offset:])) - offset += len(opt2) - opt3 = ipv6.option.parser(six.binary_type(buf[offset:])) - offset += len(opt3) - opt4 = ipv6.option.parser(six.binary_type(buf[offset:])) - eq_(5, opt1.type_) - eq_(2, opt1.len_) - eq_(b'\x00\x00', opt1.data) - eq_(1, opt2.type_) - eq_(0, opt2.len_) - eq_(None, opt2.data) - eq_(0xc2, opt3.type_) - eq_(4, opt3.len_) - eq_(b'\x00\x01\x00\x00', opt3.data) - eq_(1, opt4.type_) - eq_(0, opt4.len_) - eq_(None, opt4.data) - - def test_len(self): - eq_(16, len(self.hop)) - - def test_default_args(self): - hdr = ipv6.hop_opts() - buf = hdr.serialize() - res = struct.unpack('!BB', six.binary_type(buf[:2])) - - eq_(res[0], 6) - eq_(res[1], 0) - opt = ipv6.option(type_=1, len_=4, data=b'\x00\x00\x00\x00') - eq_(six.binary_type(buf[2:]), opt.serialize()) - - -class Test_dst_opts(unittest.TestCase): - - def setUp(self): - self.nxt = 60 - self.size = 8 - self.data = [ - ipv6.option(5, 2, b'\x00\x00'), - ipv6.option(1, 0, None), - ipv6.option(0xc2, 4, b'\x00\x01\x00\x00'), - ipv6.option(1, 0, None), - ] - self.dst = ipv6.dst_opts(self.nxt, self.size, self.data) - self.form = '!BB' - self.buf = struct.pack(self.form, self.nxt, self.size) \ - + self.data[0].serialize() \ - + self.data[1].serialize() \ - + self.data[2].serialize() \ - + self.data[3].serialize() - - def tearDown(self): - pass - - def test_init(self): - eq_(self.nxt, self.dst.nxt) - eq_(self.size, self.dst.size) - eq_(self.data, self.dst.data) - - @raises(Exception) - def test_invalid_size(self): - ipv6.dst_opts(self.nxt, 1, self.data) - - def test_parser(self): - _res = ipv6.dst_opts.parser(self.buf) - if type(_res) is tuple: - res = _res[0] - else: - res = _res - eq_(self.nxt, res.nxt) - eq_(self.size, res.size) - eq_(str(self.data), str(res.data)) - - def test_serialize(self): - buf = self.dst.serialize() - res = struct.unpack_from(self.form, six.binary_type(buf)) - eq_(self.nxt, res[0]) - eq_(self.size, res[1]) - offset = struct.calcsize(self.form) - opt1 = ipv6.option.parser(six.binary_type(buf[offset:])) - offset += len(opt1) - opt2 = ipv6.option.parser(six.binary_type(buf[offset:])) - offset += len(opt2) - opt3 = ipv6.option.parser(six.binary_type(buf[offset:])) - offset += len(opt3) - opt4 = ipv6.option.parser(six.binary_type(buf[offset:])) - eq_(5, opt1.type_) - eq_(2, opt1.len_) - eq_(b'\x00\x00', opt1.data) - eq_(1, opt2.type_) - eq_(0, opt2.len_) - eq_(None, opt2.data) - eq_(0xc2, opt3.type_) - eq_(4, opt3.len_) - eq_(b'\x00\x01\x00\x00', opt3.data) - eq_(1, opt4.type_) - eq_(0, opt4.len_) - eq_(None, opt4.data) - - def test_len(self): - eq_(16, len(self.dst)) - - def test_default_args(self): - hdr = ipv6.dst_opts() - buf = hdr.serialize() - res = struct.unpack('!BB', six.binary_type(buf[:2])) - - eq_(res[0], 6) - eq_(res[1], 0) - opt = ipv6.option(type_=1, len_=4, data=b'\x00\x00\x00\x00') - eq_(six.binary_type(buf[2:]), opt.serialize()) - - -class Test_option(unittest.TestCase): - - def setUp(self): - self.type_ = 5 - self.data = b'\x00\x00' - self.len_ = len(self.data) - self.opt = ipv6.option(self.type_, self.len_, self.data) - self.form = '!BB%ds' % self.len_ - self.buf = struct.pack(self.form, self.type_, self.len_, self.data) - - def tearDown(self): - pass - - def test_init(self): - eq_(self.type_, self.opt.type_) - eq_(self.len_, self.opt.len_) - eq_(self.data, self.opt.data) - - def test_parser(self): - _res = ipv6.option.parser(self.buf) - if type(_res) is tuple: - res = _res[0] - else: - res = _res - eq_(self.type_, res.type_) - eq_(self.len_, res.len_) - eq_(self.data, res.data) - - def test_serialize(self): - buf = self.opt.serialize() - res = struct.unpack_from(self.form, buf) - eq_(self.type_, res[0]) - eq_(self.len_, res[1]) - eq_(self.data, res[2]) - - def test_len(self): - eq_(len(self.opt), 2 + self.len_) - - -class Test_option_pad1(Test_option): - - def setUp(self): - self.type_ = 0 - self.len_ = -1 - self.data = None - self.opt = ipv6.option(self.type_, self.len_, self.data) - self.form = '!B' - self.buf = struct.pack(self.form, self.type_) - - def test_serialize(self): - buf = self.opt.serialize() - res = struct.unpack_from(self.form, buf) - eq_(self.type_, res[0]) - - def test_default_args(self): - opt = ipv6.option() - buf = opt.serialize() - res = struct.unpack('!B', buf) - - eq_(res[0], 0) - - -class Test_option_padN(Test_option): - - def setUp(self): - self.type_ = 1 - self.len_ = 0 - self.data = None - self.opt = ipv6.option(self.type_, self.len_, self.data) - self.form = '!BB' - self.buf = struct.pack(self.form, self.type_, self.len_) - - def test_serialize(self): - buf = self.opt.serialize() - res = struct.unpack_from(self.form, buf) - eq_(self.type_, res[0]) - eq_(self.len_, res[1]) - - -class Test_routing(unittest.TestCase): - - def setUp(self): - self.nxt = 0 - self.size = 6 - self.type_ = ipv6.routing.ROUTING_TYPE_3 - self.seg = 0 - self.cmpi = 0 - self.cmpe = 0 - self.adrs = ["2001:db8:dead::1", - "2001:db8:dead::2", - "2001:db8:dead::3"] - # calculate pad - self.pad = (8 - ((len(self.adrs) - 1) * (16 - self.cmpi) + - (16 - self.cmpe) % 8)) % 8 - # create buf - self.form = '!BBBBBB2x16s16s16s' - self.buf = struct.pack(self.form, self.nxt, self.size, - self.type_, self.seg, - (self.cmpi << 4) | self.cmpe, - self.pad << 4, - addrconv.ipv6.text_to_bin(self.adrs[0]), - addrconv.ipv6.text_to_bin(self.adrs[1]), - addrconv.ipv6.text_to_bin(self.adrs[2])) - - def tearDown(self): - pass - - def test_parser(self): - _res = ipv6.routing.parser(self.buf) - if type(_res) is tuple: - res = _res[0] - else: - res = _res - eq_(self.nxt, res.nxt) - eq_(self.size, res.size) - eq_(self.type_, res.type_) - eq_(self.seg, res.seg) - eq_(self.cmpi, res.cmpi) - eq_(self.cmpe, res.cmpe) - eq_(self.pad, res._pad) - eq_(self.adrs[0], res.adrs[0]) - eq_(self.adrs[1], res.adrs[1]) - eq_(self.adrs[2], res.adrs[2]) - - def test_not_implemented_type(self): - not_implemented_buf = struct.pack( - '!BBBBBB2x', 0, 6, ipv6.routing.ROUTING_TYPE_2, 0, 0, 0) - instance = ipv6.routing.parser(not_implemented_buf) - assert None == instance - - def test_invalid_type(self): - invalid_type = 99 - invalid_buf = struct.pack('!BBBBBB2x', 0, 6, invalid_type, 0, 0, 0) - instance = ipv6.routing.parser(invalid_buf) - assert None == instance - - -class Test_routing_type3(unittest.TestCase): - - def setUp(self): - self.nxt = 0 - self.size = 6 - self.type_ = 3 - self.seg = 0 - self.cmpi = 0 - self.cmpe = 0 - self.adrs = ["2001:db8:dead::1", - "2001:db8:dead::2", - "2001:db8:dead::3"] - # calculate pad - self.pad = (8 - ((len(self.adrs) - 1) * (16 - self.cmpi) + - (16 - self.cmpe) % 8)) % 8 - - self.routing = ipv6.routing_type3( - self.nxt, self.size, self.type_, self.seg, self.cmpi, - self.cmpe, self.adrs) - self.form = '!BBBBBB2x16s16s16s' - self.buf = struct.pack(self.form, self.nxt, self.size, - self.type_, self.seg, - (self.cmpi << 4) | self.cmpe, - self.pad << 4, - addrconv.ipv6.text_to_bin(self.adrs[0]), - addrconv.ipv6.text_to_bin(self.adrs[1]), - addrconv.ipv6.text_to_bin(self.adrs[2])) - - def test_init(self): - eq_(self.nxt, self.routing.nxt) - eq_(self.size, self.routing.size) - eq_(self.type_, self.routing.type_) - eq_(self.seg, self.routing.seg) - eq_(self.cmpi, self.routing.cmpi) - eq_(self.cmpe, self.routing.cmpe) - eq_(self.pad, self.routing._pad) - eq_(self.adrs[0], self.routing.adrs[0]) - eq_(self.adrs[1], self.routing.adrs[1]) - eq_(self.adrs[2], self.routing.adrs[2]) - - def test_parser(self): - _res = ipv6.routing.parser(self.buf) - if type(_res) is tuple: - res = _res[0] - else: - res = _res - eq_(self.nxt, res.nxt) - eq_(self.size, res.size) - eq_(self.type_, res.type_) - eq_(self.seg, res.seg) - eq_(self.cmpi, res.cmpi) - eq_(self.cmpe, res.cmpe) - eq_(self.pad, res._pad) - eq_(self.adrs[0], res.adrs[0]) - eq_(self.adrs[1], res.adrs[1]) - eq_(self.adrs[2], res.adrs[2]) - - def test_serialize(self): - buf = self.routing.serialize() - res = struct.unpack_from(self.form, six.binary_type(buf)) - eq_(self.nxt, res[0]) - eq_(self.size, res[1]) - eq_(self.type_, res[2]) - eq_(self.seg, res[3]) - eq_(self.cmpi, res[4] >> 4) - eq_(self.cmpe, res[4] & 0xf) - eq_(self.pad, res[5]) - eq_(addrconv.ipv6.text_to_bin(self.adrs[0]), res[6]) - eq_(addrconv.ipv6.text_to_bin(self.adrs[1]), res[7]) - eq_(addrconv.ipv6.text_to_bin(self.adrs[2]), res[8]) - - def test_parser_with_adrs_zero(self): - nxt = 0 - size = 0 - type_ = 3 - seg = 0 - cmpi = 0 - cmpe = 0 - adrs = [] - # calculate pad - pad = (8 - ((len(adrs) - 1) * (16 - cmpi) + (16 - cmpe) % 8)) % 8 - - form = '!BBBBBB2x' - buf = struct.pack(form, nxt, size, type_, seg, - (cmpi << 4) | cmpe, pad << 4) - _res = ipv6.routing.parser(buf) - if type(_res) is tuple: - res = _res[0] - else: - res = _res - eq_(nxt, res.nxt) - eq_(size, res.size) - eq_(type_, res.type_) - eq_(seg, res.seg) - eq_(cmpi, res.cmpi) - eq_(cmpe, res.cmpe) - eq_(pad, res._pad) - - def test_serialize_with_adrs_zero(self): - nxt = 0 - size = 0 - type_ = 3 - seg = 0 - cmpi = 0 - cmpe = 0 - adrs = [] - # calculate pad - pad = (8 - ((len(adrs) - 1) * (16 - cmpi) + (16 - cmpe) % 8)) % 8 - routing = ipv6.routing_type3( - nxt, size, type_, seg, cmpi, - cmpe, pad) - buf = routing.serialize() - form = '!BBBBBB2x' - res = struct.unpack_from(form, six.binary_type(buf)) - eq_(nxt, res[0]) - eq_(size, res[1]) - eq_(type_, res[2]) - eq_(seg, res[3]) - eq_(cmpi, res[4] >> 4) - eq_(cmpe, res[4] & 0xf) - eq_(pad, res[5]) - - def test_parser_with_compression(self): - pass - nxt = 0 - size = 3 - type_ = 3 - seg = 0 - cmpi = 8 - cmpe = 12 - adrs = ["2001:0db8:dead:0123:4567:89ab:cdef:0001", - "2001:0db8:dead:0123:4567:89ab:cdef:0002", - "2001:0db8:dead:0123:4567:89ab:cdef:0003"] - # calculate pad - pad = (8 - ((len(adrs) - 1) * (16 - cmpi) + (16 - cmpe) % 8)) % 8 - form = '!BBBBBB2x%ds%ds%ds' % (16 - cmpi, 16 - cmpi, 16 - cmpe) - slice_i = slice(cmpi, 16) - slice_e = slice(cmpe, 16) - buf = struct.pack(form, nxt, size, type_, seg, - (cmpi << 4) | cmpe, pad << 4, - addrconv.ipv6.text_to_bin(adrs[0])[slice_i], - addrconv.ipv6.text_to_bin(adrs[1])[slice_i], - addrconv.ipv6.text_to_bin(adrs[2])[slice_e]) - _res = ipv6.routing.parser(buf) - if type(_res) is tuple: - res = _res[0] - else: - res = _res - eq_(nxt, res.nxt) - eq_(size, res.size) - eq_(type_, res.type_) - eq_(seg, res.seg) - eq_(cmpi, res.cmpi) - eq_(cmpe, res.cmpe) - eq_(pad, res._pad) - eq_("::4567:89ab:cdef:1", res.adrs[0]) - eq_("::4567:89ab:cdef:2", res.adrs[1]) - eq_("::205.239.0.3", res.adrs[2]) - - def test_serialize_with_compression(self): - nxt = 0 - size = 3 - type_ = 3 - seg = 0 - cmpi = 8 - cmpe = 8 - adrs = ["2001:db8:dead::1", - "2001:db8:dead::2", - "2001:db8:dead::3"] - # calculate pad - pad = (8 - ((len(adrs) - 1) * (16 - cmpi) + (16 - cmpe) % 8)) % 8 - slice_i = slice(cmpi, 16) - slice_e = slice(cmpe, 16) - routing = ipv6.routing_type3( - nxt, size, type_, seg, cmpi, cmpe, adrs) - buf = routing.serialize() - form = '!BBBBBB2x8s8s8s' - res = struct.unpack_from(form, six.binary_type(buf)) - eq_(nxt, res[0]) - eq_(size, res[1]) - eq_(type_, res[2]) - eq_(seg, res[3]) - eq_(cmpi, res[4] >> 4) - eq_(cmpe, res[4] & 0xf) - eq_(pad, res[5]) - eq_(addrconv.ipv6.text_to_bin(adrs[0])[slice_i], res[6]) - eq_(addrconv.ipv6.text_to_bin(adrs[1])[slice_i], res[7]) - eq_(addrconv.ipv6.text_to_bin(adrs[2])[slice_e], res[8]) - - def test_len(self): - eq_((6 + 1) * 8, len(self.routing)) - - def test_default_args(self): - hdr = ipv6.routing_type3() - buf = hdr.serialize() - LOG.info(repr(buf)) - res = struct.unpack_from(ipv6.routing_type3._PACK_STR, six.binary_type(buf)) - LOG.info(res) - - eq_(res[0], 6) - eq_(res[1], 0) - eq_(res[2], 3) - eq_(res[3], 0) - eq_(res[4], (0 << 4) | 0) - eq_(res[5], 0) - - -class Test_fragment(unittest.TestCase): - - def setUp(self): - self.nxt = 44 - self.offset = 50 - self.more = 1 - self.id_ = 123 - self.fragment = ipv6.fragment( - self.nxt, self.offset, self.more, self.id_) - - self.off_m = (self.offset << 3 | self.more) - self.form = '!BxHI' - self.buf = struct.pack(self.form, self.nxt, self.off_m, self.id_) - - def test_init(self): - eq_(self.nxt, self.fragment.nxt) - eq_(self.offset, self.fragment.offset) - eq_(self.more, self.fragment.more) - eq_(self.id_, self.fragment.id_) - - def test_parser(self): - _res = ipv6.fragment.parser(self.buf) - if type(_res) is tuple: - res = _res[0] - else: - res = _res - eq_(self.nxt, res.nxt) - eq_(self.offset, res.offset) - eq_(self.more, res.more) - eq_(self.id_, res.id_) - - def test_serialize(self): - buf = self.fragment.serialize() - res = struct.unpack_from(self.form, six.binary_type(buf)) - eq_(self.nxt, res[0]) - eq_(self.off_m, res[1]) - eq_(self.id_, res[2]) - - def test_len(self): - eq_(8, len(self.fragment)) - - def test_default_args(self): - hdr = ipv6.fragment() - buf = hdr.serialize() - res = struct.unpack_from(ipv6.fragment._PACK_STR, buf) - - eq_(res[0], 6) - eq_(res[1], 0) - eq_(res[2], 0) - - -class Test_auth(unittest.TestCase): - - def setUp(self): - self.nxt = 0 - self.size = 4 - self.spi = 256 - self.seq = 1 - self.data = b'\x21\xd3\xa9\x5c\x5f\xfd\x4d\x18\x46\x22\xb9\xf8' - self.auth = ipv6.auth( - self.nxt, self.size, self.spi, self.seq, self.data) - self.form = '!BB2xII12s' - self.buf = struct.pack(self.form, self.nxt, self.size, self.spi, - self.seq, self.data) - - def test_init(self): - eq_(self.nxt, self.auth.nxt) - eq_(self.size, self.auth.size) - eq_(self.spi, self.auth.spi) - eq_(self.seq, self.auth.seq) - eq_(self.data, self.auth.data) - - def test_parser(self): - _res = ipv6.auth.parser(self.buf) - if type(_res) is tuple: - res = _res[0] - else: - res = _res - eq_(self.nxt, res.nxt) - eq_(self.size, res.size) - eq_(self.spi, res.spi) - eq_(self.seq, res.seq) - eq_(self.data, res.data) - - def test_serialize(self): - buf = self.auth.serialize() - res = struct.unpack_from(self.form, six.binary_type(buf)) - eq_(self.nxt, res[0]) - eq_(self.size, res[1]) - eq_(self.spi, res[2]) - eq_(self.seq, res[3]) - eq_(self.data, res[4]) - - def test_len(self): - eq_((4 + 2) * 4, len(self.auth)) - - def test_len_re(self): - size = 5 - auth = ipv6.auth( - 0, size, 256, 1, - b'\x21\xd3\xa9\x5c\x5f\xfd\x4d\x18\x46\x22\xb9\xf8\xf8\xf8\xf8\xf8') - eq_((size + 2) * 4, len(auth)) - - def test_default_args(self): - hdr = ipv6.auth() - buf = hdr.serialize() - LOG.info(repr(buf)) - res = struct.unpack_from(ipv6.auth._PACK_STR, six.binary_type(buf)) - LOG.info(res) - - eq_(res[0], 6) - eq_(res[1], 2) - eq_(res[2], 0) - eq_(res[3], 0) - eq_(buf[ipv6.auth._MIN_LEN:], b'\x00\x00\x00\x00') diff --git a/tests/unit/packet/test_llc.py b/tests/unit/packet/test_llc.py deleted file mode 100644 index 05894ab7..00000000 --- a/tests/unit/packet/test_llc.py +++ /dev/null @@ -1,42 +0,0 @@ -# Copyright (C) 2013 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. - -# vim: tabstop=4 shiftwidth=4 softtabstop=4 - -import unittest -import logging - -from nose.tools import eq_ -from ryu.lib.packet import llc - - -LOG = logging.getLogger(__name__) - - -class Test_ControlFormatI(unittest.TestCase): - msg = llc.llc(llc.SAP_BPDU, llc.SAP_BPDU, llc.ControlFormatI()) - - def test_json(self): - jsondict = self.msg.to_jsondict() - msg = llc.llc.from_jsondict(jsondict['llc']) - eq_(str(self.msg), str(msg)) - - -class Test_ControlFormatS(Test_ControlFormatI): - msg = llc.llc(llc.SAP_BPDU, llc.SAP_BPDU, llc.ControlFormatS()) - - -class Test_ControlFormatU(Test_ControlFormatI): - msg = llc.llc(llc.SAP_BPDU, llc.SAP_BPDU, llc.ControlFormatU()) diff --git a/tests/unit/packet/test_lldp.py b/tests/unit/packet/test_lldp.py deleted file mode 100644 index d8d261c2..00000000 --- a/tests/unit/packet/test_lldp.py +++ /dev/null @@ -1,533 +0,0 @@ -# Copyright (C) 2013 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. - -# vim: tabstop=4 shiftwidth=4 softtabstop=4 - -import unittest -import logging -import six -import struct -import inspect -from nose.tools import ok_, eq_, nottest - -from ryu.ofproto import ether -from ryu.lib.packet import packet -from ryu.lib.packet import ethernet -from ryu.lib.packet import lldp -from ryu.lib import addrconv - -LOG = logging.getLogger(__name__) - - -class TestLLDPMandatoryTLV(unittest.TestCase): - def setUp(self): - # sample data is based on: - # http://wiki.wireshark.org/LinkLayerDiscoveryProtocol - # - # mandatory TLV only - self.data = b'\x01\x80\xc2\x00\x00\x0e\x00\x04' \ - + b'\x96\x1f\xa7\x26\x88\xcc\x02\x07' \ - + b'\x04\x00\x04\x96\x1f\xa7\x26\x04' \ - + b'\x04\x05\x31\x2f\x33\x06\x02\x00' \ - + b'\x78\x00\x00' - - def tearDown(self): - pass - - def test_get_tlv_type(self): - buf = b'\x02\x07\x04\x00\x04\x96\x1f\xa7\x26' - eq_(lldp.LLDPBasicTLV.get_type(buf), lldp.LLDP_TLV_CHASSIS_ID) - - def test_parse_without_ethernet(self): - buf = self.data[ethernet.ethernet._MIN_LEN:] - (lldp_pkt, cls, rest_buf) = lldp.lldp.parser(buf) - eq_(len(rest_buf), 0) - - tlvs = lldp_pkt.tlvs - eq_(tlvs[0].tlv_type, lldp.LLDP_TLV_CHASSIS_ID) - eq_(tlvs[0].len, 7) - eq_(tlvs[0].subtype, lldp.ChassisID.SUB_MAC_ADDRESS) - eq_(tlvs[0].chassis_id, b'\x00\x04\x96\x1f\xa7\x26') - eq_(tlvs[1].tlv_type, lldp.LLDP_TLV_PORT_ID) - eq_(tlvs[1].len, 4) - eq_(tlvs[1].subtype, lldp.PortID.SUB_INTERFACE_NAME) - eq_(tlvs[1].port_id, b'1/3') - eq_(tlvs[2].tlv_type, lldp.LLDP_TLV_TTL) - eq_(tlvs[2].len, 2) - eq_(tlvs[2].ttl, 120) - eq_(tlvs[3].tlv_type, lldp.LLDP_TLV_END) - - def test_parse(self): - buf = self.data - pkt = packet.Packet(buf) - i = iter(pkt) - - eq_(type(next(i)), ethernet.ethernet) - eq_(type(next(i)), lldp.lldp) - - def test_tlv(self): - tlv = lldp.ChassisID(subtype=lldp.ChassisID.SUB_MAC_ADDRESS, - chassis_id=b'\x00\x04\x96\x1f\xa7\x26') - eq_(tlv.tlv_type, lldp.LLDP_TLV_CHASSIS_ID) - eq_(tlv.len, 7) - (typelen, ) = struct.unpack('!H', b'\x02\x07') - eq_(tlv.typelen, typelen) - - def test_serialize_without_ethernet(self): - tlv_chassis_id = lldp.ChassisID(subtype=lldp.ChassisID.SUB_MAC_ADDRESS, - chassis_id=b'\x00\x04\x96\x1f\xa7\x26') - tlv_port_id = lldp.PortID(subtype=lldp.PortID.SUB_INTERFACE_NAME, - port_id=b'1/3') - tlv_ttl = lldp.TTL(ttl=120) - tlv_end = lldp.End() - tlvs = (tlv_chassis_id, tlv_port_id, tlv_ttl, tlv_end) - lldp_pkt = lldp.lldp(tlvs) - - eq_(lldp_pkt.serialize(None, None), - self.data[ethernet.ethernet._MIN_LEN:]) - - def test_serialize(self): - pkt = packet.Packet() - - dst = lldp.LLDP_MAC_NEAREST_BRIDGE - src = '00:04:96:1f:a7:26' - ethertype = ether.ETH_TYPE_LLDP - eth_pkt = ethernet.ethernet(dst, src, ethertype) - pkt.add_protocol(eth_pkt) - - tlv_chassis_id = lldp.ChassisID(subtype=lldp.ChassisID.SUB_MAC_ADDRESS, - chassis_id=addrconv.mac. - text_to_bin(src)) - tlv_port_id = lldp.PortID(subtype=lldp.PortID.SUB_INTERFACE_NAME, - port_id=b'1/3') - tlv_ttl = lldp.TTL(ttl=120) - tlv_end = lldp.End() - tlvs = (tlv_chassis_id, tlv_port_id, tlv_ttl, tlv_end) - lldp_pkt = lldp.lldp(tlvs) - pkt.add_protocol(lldp_pkt) - - eq_(len(pkt.protocols), 2) - - pkt.serialize() - - # Note: If ethernet frame is less than 60 bytes length, - # ethernet.ethernet() appends padding to the payload. - # So, we splits the serialized data to compare. - data_len = len(self.data) - pkt_data_lldp = pkt.data[:data_len] - pkt_data_pad = pkt.data[data_len:] - eq_(b'\x00' * (60 - data_len), pkt_data_pad) - - eq_(self.data, pkt_data_lldp) - - def test_to_string(self): - chassis_id = lldp.ChassisID(subtype=lldp.ChassisID.SUB_MAC_ADDRESS, - chassis_id=b'\x00\x04\x96\x1f\xa7\x26') - port_id = lldp.PortID(subtype=lldp.PortID.SUB_INTERFACE_NAME, - port_id=b'1/3') - ttl = lldp.TTL(ttl=120) - end = lldp.End() - tlvs = (chassis_id, port_id, ttl, end) - lldp_pkt = lldp.lldp(tlvs) - - chassis_id_values = {'subtype': lldp.ChassisID.SUB_MAC_ADDRESS, - 'chassis_id': b'\x00\x04\x96\x1f\xa7\x26', - 'len': chassis_id.len, - 'typelen': chassis_id.typelen} - _ch_id_str = ','.join(['%s=%s' % (k, repr(chassis_id_values[k])) - for k, v in inspect.getmembers(chassis_id) - if k in chassis_id_values]) - tlv_chassis_id_str = '%s(%s)' % (lldp.ChassisID.__name__, _ch_id_str) - - port_id_values = {'subtype': port_id.subtype, - 'port_id': port_id.port_id, - 'len': port_id.len, - 'typelen': port_id.typelen} - _port_id_str = ','.join(['%s=%s' % (k, repr(port_id_values[k])) - for k, v in inspect.getmembers(port_id) - if k in port_id_values]) - tlv_port_id_str = '%s(%s)' % (lldp.PortID.__name__, _port_id_str) - - ttl_values = {'ttl': ttl.ttl, - 'len': ttl.len, - 'typelen': ttl.typelen} - _ttl_str = ','.join(['%s=%s' % (k, repr(ttl_values[k])) - for k, v in inspect.getmembers(ttl) - if k in ttl_values]) - tlv_ttl_str = '%s(%s)' % (lldp.TTL.__name__, _ttl_str) - - end_values = {'len': end.len, - 'typelen': end.typelen} - _end_str = ','.join(['%s=%s' % (k, repr(end_values[k])) - for k, v in inspect.getmembers(end) - if k in end_values]) - tlv_end_str = '%s(%s)' % (lldp.End.__name__, _end_str) - - _tlvs_str = '(%s, %s, %s, %s)' - tlvs_str = _tlvs_str % (tlv_chassis_id_str, - tlv_port_id_str, - tlv_ttl_str, - tlv_end_str) - - _lldp_str = '%s(tlvs=%s)' - lldp_str = _lldp_str % (lldp.lldp.__name__, - tlvs_str) - - eq_(str(lldp_pkt), lldp_str) - eq_(repr(lldp_pkt), lldp_str) - - def test_json(self): - chassis_id = lldp.ChassisID(subtype=lldp.ChassisID.SUB_MAC_ADDRESS, - chassis_id=b'\x00\x04\x96\x1f\xa7\x26') - port_id = lldp.PortID(subtype=lldp.PortID.SUB_INTERFACE_NAME, - port_id=b'1/3') - ttl = lldp.TTL(ttl=120) - end = lldp.End() - tlvs = (chassis_id, port_id, ttl, end) - lldp1 = lldp.lldp(tlvs) - jsondict = lldp1.to_jsondict() - lldp2 = lldp.lldp.from_jsondict(jsondict['lldp']) - eq_(str(lldp1), str(lldp2)) - - -class TestLLDPOptionalTLV(unittest.TestCase): - def setUp(self): - # sample data is based on: - # http://wiki.wireshark.org/LinkLayerDiscoveryProtocol - # - # include optional TLV - self.data = b'\x01\x80\xc2\x00\x00\x0e\x00\x01' \ - + b'\x30\xf9\xad\xa0\x88\xcc\x02\x07' \ - + b'\x04\x00\x01\x30\xf9\xad\xa0\x04' \ - + b'\x04\x05\x31\x2f\x31\x06\x02\x00' \ - + b'\x78\x08\x17\x53\x75\x6d\x6d\x69' \ - + b'\x74\x33\x30\x30\x2d\x34\x38\x2d' \ - + b'\x50\x6f\x72\x74\x20\x31\x30\x30' \ - + b'\x31\x00\x0a\x0d\x53\x75\x6d\x6d' \ - + b'\x69\x74\x33\x30\x30\x2d\x34\x38' \ - + b'\x00\x0c\x4c\x53\x75\x6d\x6d\x69' \ - + b'\x74\x33\x30\x30\x2d\x34\x38\x20' \ - + b'\x2d\x20\x56\x65\x72\x73\x69\x6f' \ - + b'\x6e\x20\x37\x2e\x34\x65\x2e\x31' \ - + b'\x20\x28\x42\x75\x69\x6c\x64\x20' \ - + b'\x35\x29\x20\x62\x79\x20\x52\x65' \ - + b'\x6c\x65\x61\x73\x65\x5f\x4d\x61' \ - + b'\x73\x74\x65\x72\x20\x30\x35\x2f' \ - + b'\x32\x37\x2f\x30\x35\x20\x30\x34' \ - + b'\x3a\x35\x33\x3a\x31\x31\x00\x0e' \ - + b'\x05\x01\x00\x14\x00\x14\x10\x0e' \ - + b'\x07' \ - + b'\x06\x00\x01\x30\xf9\xad\xa0\x02' \ - + b'\x00\x00\x03\xe9\x00\xfe\x07\x00' \ - + b'\x12\x0f\x02\x07\x01\x00\xfe\x09' \ - + b'\x00\x12\x0f\x01\x03\x6c\x00\x00' \ - + b'\x10\xfe\x09\x00\x12\x0f\x03\x01' \ - + b'\x00\x00\x00\x00\xfe\x06\x00\x12' \ - + b'\x0f\x04\x05\xf2\xfe\x06\x00\x80' \ - + b'\xc2\x01\x01\xe8\xfe\x07\x00\x80' \ - + b'\xc2\x02\x01\x00\x00\xfe\x17\x00' \ - + b'\x80\xc2\x03\x01\xe8\x10\x76\x32' \ - + b'\x2d\x30\x34\x38\x38\x2d\x30\x33' \ - + b'\x2d\x30\x35\x30\x35\x00\xfe\x05' \ - + b'\x00\x80\xc2\x04\x00\x00\x00' - - def tearDown(self): - pass - - def test_parse(self): - buf = self.data - pkt = packet.Packet(buf) - i = iter(pkt) - - eq_(type(next(i)), ethernet.ethernet) - lldp_pkt = next(i) - eq_(type(lldp_pkt), lldp.lldp) - - tlvs = lldp_pkt.tlvs - - # Port Description - eq_(tlvs[3].tlv_type, lldp.LLDP_TLV_PORT_DESCRIPTION) - eq_(tlvs[3].port_description, b'Summit300-48-Port 1001\x00') - - # System Name - eq_(tlvs[4].tlv_type, lldp.LLDP_TLV_SYSTEM_NAME) - eq_(tlvs[4].system_name, b'Summit300-48\x00') - - # System Description - - eq_(tlvs[5].tlv_type, lldp.LLDP_TLV_SYSTEM_DESCRIPTION) - eq_(tlvs[5].system_description, - b'Summit300-48 - Version 7.4e.1 (Build 5) ' - + b'by Release_Master 05/27/05 04:53:11\x00') - - # SystemCapabilities - eq_(tlvs[6].tlv_type, lldp.LLDP_TLV_SYSTEM_CAPABILITIES) - eq_(tlvs[6].subtype, lldp.ChassisID.SUB_CHASSIS_COMPONENT) - eq_(tlvs[6].system_cap & lldp.SystemCapabilities.CAP_MAC_BRIDGE, - lldp.SystemCapabilities.CAP_MAC_BRIDGE) - eq_(tlvs[6].enabled_cap & lldp.SystemCapabilities.CAP_MAC_BRIDGE, - lldp.SystemCapabilities.CAP_MAC_BRIDGE) - eq_(tlvs[6].system_cap & lldp.SystemCapabilities.CAP_TELEPHONE, 0) - eq_(tlvs[6].enabled_cap & lldp.SystemCapabilities.CAP_TELEPHONE, 0) - - # Management Address - eq_(tlvs[7].tlv_type, lldp.LLDP_TLV_MANAGEMENT_ADDRESS) - eq_(tlvs[7].addr_len, 7) - eq_(tlvs[7].addr, b'\x00\x01\x30\xf9\xad\xa0') - eq_(tlvs[7].intf_num, 1001) - - # Organizationally Specific - eq_(tlvs[8].tlv_type, lldp.LLDP_TLV_ORGANIZATIONALLY_SPECIFIC) - eq_(tlvs[8].oui, b'\x00\x12\x0f') # IEEE 802.3 - eq_(tlvs[8].subtype, 0x02) # Power Via MDI - - # End - eq_(tlvs[16].tlv_type, lldp.LLDP_TLV_END) - - def test_parse_corrupted(self): - buf = self.data - pkt = packet.Packet(buf[:128]) - - def test_serialize(self): - pkt = packet.Packet() - - dst = lldp.LLDP_MAC_NEAREST_BRIDGE - src = '00:01:30:f9:ad:a0' - ethertype = ether.ETH_TYPE_LLDP - eth_pkt = ethernet.ethernet(dst, src, ethertype) - pkt.add_protocol(eth_pkt) - - tlv_chassis_id = lldp.ChassisID(subtype=lldp.ChassisID.SUB_MAC_ADDRESS, - chassis_id=addrconv.mac. - text_to_bin(src)) - tlv_port_id = lldp.PortID(subtype=lldp.PortID.SUB_INTERFACE_NAME, - port_id=b'1/1') - tlv_ttl = lldp.TTL(ttl=120) - tlv_port_description = lldp.PortDescription( - port_description=b'Summit300-48-Port 1001\x00') - tlv_system_name = lldp.SystemName(system_name=b'Summit300-48\x00') - tlv_system_description = lldp.SystemDescription( - system_description=b'Summit300-48 - Version 7.4e.1 (Build 5) ' - + b'by Release_Master 05/27/05 04:53:11\x00') - tlv_system_capabilities = lldp.SystemCapabilities( - subtype=lldp.ChassisID.SUB_CHASSIS_COMPONENT, - system_cap=0x14, - enabled_cap=0x14) - tlv_management_address = lldp.ManagementAddress( - addr_subtype=0x06, addr=b'\x00\x01\x30\xf9\xad\xa0', - intf_subtype=0x02, intf_num=1001, - oid=b'') - tlv_organizationally_specific = lldp.OrganizationallySpecific( - oui=b'\x00\x12\x0f', subtype=0x02, info=b'\x07\x01\x00') - tlv_end = lldp.End() - tlvs = (tlv_chassis_id, tlv_port_id, tlv_ttl, tlv_port_description, - tlv_system_name, tlv_system_description, - tlv_system_capabilities, tlv_management_address, - tlv_organizationally_specific, tlv_end) - lldp_pkt = lldp.lldp(tlvs) - pkt.add_protocol(lldp_pkt) - - eq_(len(pkt.protocols), 2) - - pkt.serialize() - - # self.data has many organizationally specific TLVs - data = six.binary_type(pkt.data[:-2]) - eq_(data, self.data[:len(data)]) - - def test_to_string(self): - chassis_id = lldp.ChassisID(subtype=lldp.ChassisID.SUB_MAC_ADDRESS, - chassis_id=b'\x00\x01\x30\xf9\xad\xa0') - port_id = lldp.PortID(subtype=lldp.PortID.SUB_INTERFACE_NAME, - port_id=b'1/1') - ttl = lldp.TTL(ttl=120) - port_desc = lldp.PortDescription( - port_description=b'Summit300-48-Port 1001\x00') - sys_name = lldp.SystemName(system_name=b'Summit300-48\x00') - sys_desc = lldp.SystemDescription( - system_description=b'Summit300-48 - Version 7.4e.1 (Build 5) ' - + b'by Release_Master 05/27/05 04:53:11\x00') - sys_cap = lldp.SystemCapabilities( - subtype=lldp.ChassisID.SUB_CHASSIS_COMPONENT, - system_cap=0x14, - enabled_cap=0x14) - man_addr = lldp.ManagementAddress( - addr_subtype=0x06, addr=b'\x00\x01\x30\xf9\xad\xa0', - intf_subtype=0x02, intf_num=1001, - oid='') - org_spec = lldp.OrganizationallySpecific( - oui=b'\x00\x12\x0f', subtype=0x02, info=b'\x07\x01\x00') - end = lldp.End() - tlvs = (chassis_id, port_id, ttl, port_desc, sys_name, - sys_desc, sys_cap, man_addr, org_spec, end) - lldp_pkt = lldp.lldp(tlvs) - - # ChassisID string - chassis_id_values = {'subtype': lldp.ChassisID.SUB_MAC_ADDRESS, - 'chassis_id': b'\x00\x01\x30\xf9\xad\xa0', - 'len': chassis_id.len, - 'typelen': chassis_id.typelen} - _ch_id_str = ','.join(['%s=%s' % (k, repr(chassis_id_values[k])) - for k, v in inspect.getmembers(chassis_id) - if k in chassis_id_values]) - tlv_chassis_id_str = '%s(%s)' % (lldp.ChassisID.__name__, _ch_id_str) - - # PortID string - port_id_values = {'subtype': port_id.subtype, - 'port_id': port_id.port_id, - 'len': port_id.len, - 'typelen': port_id.typelen} - _port_id_str = ','.join(['%s=%s' % (k, repr(port_id_values[k])) - for k, v in inspect.getmembers(port_id) - if k in port_id_values]) - tlv_port_id_str = '%s(%s)' % (lldp.PortID.__name__, _port_id_str) - - # TTL string - ttl_values = {'ttl': ttl.ttl, - 'len': ttl.len, - 'typelen': ttl.typelen} - _ttl_str = ','.join(['%s=%s' % (k, repr(ttl_values[k])) - for k, v in inspect.getmembers(ttl) - if k in ttl_values]) - tlv_ttl_str = '%s(%s)' % (lldp.TTL.__name__, _ttl_str) - - # PortDescription string - port_desc_values = {'tlv_info': port_desc.tlv_info, - 'len': port_desc.len, - 'typelen': port_desc.typelen} - _port_desc_str = ','.join(['%s=%s' % (k, repr(port_desc_values[k])) - for k, v in inspect.getmembers(port_desc) - if k in port_desc_values]) - tlv_port_desc_str = '%s(%s)' % (lldp.PortDescription.__name__, - _port_desc_str) - - # SystemName string - sys_name_values = {'tlv_info': sys_name.tlv_info, - 'len': sys_name.len, - 'typelen': sys_name.typelen} - _system_name_str = ','.join(['%s=%s' % (k, repr(sys_name_values[k])) - for k, v in inspect.getmembers(sys_name) - if k in sys_name_values]) - tlv_system_name_str = '%s(%s)' % (lldp.SystemName.__name__, - _system_name_str) - - # SystemDescription string - sys_desc_values = {'tlv_info': sys_desc.tlv_info, - 'len': sys_desc.len, - 'typelen': sys_desc.typelen} - _sys_desc_str = ','.join(['%s=%s' % (k, repr(sys_desc_values[k])) - for k, v in inspect.getmembers(sys_desc) - if k in sys_desc_values]) - tlv_sys_desc_str = '%s(%s)' % (lldp.SystemDescription.__name__, - _sys_desc_str) - - # SystemCapabilities string - sys_cap_values = {'subtype': lldp.ChassisID.SUB_CHASSIS_COMPONENT, - 'system_cap': 0x14, - 'enabled_cap': 0x14, - 'len': sys_cap.len, - 'typelen': sys_cap.typelen} - _sys_cap_str = ','.join(['%s=%s' % (k, repr(sys_cap_values[k])) - for k, v in inspect.getmembers(sys_cap) - if k in sys_cap_values]) - tlv_sys_cap_str = '%s(%s)' % (lldp.SystemCapabilities.__name__, - _sys_cap_str) - - # ManagementAddress string - man_addr_values = {'addr_subtype': 0x06, - 'addr': b'\x00\x01\x30\xf9\xad\xa0', - 'addr_len': man_addr.addr_len, - 'intf_subtype': 0x02, - 'intf_num': 1001, - 'oid': '', - 'oid_len': man_addr.oid_len, - 'len': man_addr.len, - 'typelen': man_addr.typelen} - _man_addr_str = ','.join(['%s=%s' % (k, repr(man_addr_values[k])) - for k, v in inspect.getmembers(man_addr) - if k in man_addr_values]) - tlv_man_addr_str = '%s(%s)' % (lldp.ManagementAddress.__name__, - _man_addr_str) - - # OrganizationallySpecific string - org_spec_values = {'oui': b'\x00\x12\x0f', - 'subtype': 0x02, - 'info': b'\x07\x01\x00', - 'len': org_spec.len, - 'typelen': org_spec.typelen} - _org_spec_str = ','.join(['%s=%s' % (k, repr(org_spec_values[k])) - for k, v in inspect.getmembers(org_spec) - if k in org_spec_values]) - tlv_org_spec_str = '%s(%s)' % (lldp.OrganizationallySpecific.__name__, - _org_spec_str) - - # End string - end_values = {'len': end.len, - 'typelen': end.typelen} - _end_str = ','.join(['%s=%s' % (k, repr(end_values[k])) - for k, v in inspect.getmembers(end) - if k in end_values]) - tlv_end_str = '%s(%s)' % (lldp.End.__name__, _end_str) - - # tlvs string - _tlvs_str = '(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)' - tlvs_str = _tlvs_str % (tlv_chassis_id_str, - tlv_port_id_str, - tlv_ttl_str, - tlv_port_desc_str, - tlv_system_name_str, - tlv_sys_desc_str, - tlv_sys_cap_str, - tlv_man_addr_str, - tlv_org_spec_str, - tlv_end_str) - - # lldp string - _lldp_str = '%s(tlvs=%s)' - lldp_str = _lldp_str % (lldp.lldp.__name__, - tlvs_str) - - eq_(str(lldp_pkt), lldp_str) - eq_(repr(lldp_pkt), lldp_str) - - def test_json(self): - chassis_id = lldp.ChassisID(subtype=lldp.ChassisID.SUB_MAC_ADDRESS, - chassis_id=b'\x00\x01\x30\xf9\xad\xa0') - port_id = lldp.PortID(subtype=lldp.PortID.SUB_INTERFACE_NAME, - port_id=b'1/1') - ttl = lldp.TTL(ttl=120) - port_desc = lldp.PortDescription( - port_description=b'Summit300-48-Port 1001\x00') - sys_name = lldp.SystemName(system_name=b'Summit300-48\x00') - sys_desc = lldp.SystemDescription( - system_description=b'Summit300-48 - Version 7.4e.1 (Build 5) ' - + b'by Release_Master 05/27/05 04:53:11\x00') - sys_cap = lldp.SystemCapabilities( - subtype=lldp.ChassisID.SUB_CHASSIS_COMPONENT, - system_cap=0x14, - enabled_cap=0x14) - man_addr = lldp.ManagementAddress( - addr_subtype=0x06, addr=b'\x00\x01\x30\xf9\xad\xa0', - intf_subtype=0x02, intf_num=1001, - oid='') - org_spec = lldp.OrganizationallySpecific( - oui=b'\x00\x12\x0f', subtype=0x02, info=b'\x07\x01\x00') - end = lldp.End() - tlvs = (chassis_id, port_id, ttl, port_desc, sys_name, - sys_desc, sys_cap, man_addr, org_spec, end) - lldp1 = lldp.lldp(tlvs) - jsondict = lldp1.to_jsondict() - lldp2 = lldp.lldp.from_jsondict(jsondict['lldp']) - eq_(str(lldp1), str(lldp2)) diff --git a/tests/unit/packet/test_mpls.py b/tests/unit/packet/test_mpls.py deleted file mode 100644 index e3f9bccf..00000000 --- a/tests/unit/packet/test_mpls.py +++ /dev/null @@ -1,92 +0,0 @@ -# Copyright (C) 2013 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 logging -import inspect - -from nose.tools import eq_ -from ryu.lib.packet import mpls - - -LOG = logging.getLogger(__name__) - - -class Test_mpls(unittest.TestCase): - - label = 29 - exp = 6 - bsb = 1 - ttl = 64 - mp = mpls.mpls(label, exp, bsb, ttl) - - def setUp(self): - pass - - def tearDown(self): - pass - - def test_to_string(self): - mpls_values = {'label': self.label, - 'exp': self.exp, - 'bsb': self.bsb, - 'ttl': self.ttl} - _mpls_str = ','.join(['%s=%s' % (k, repr(mpls_values[k])) - for k, v in inspect.getmembers(self.mp) - if k in mpls_values]) - mpls_str = '%s(%s)' % (mpls.mpls.__name__, _mpls_str) - - eq_(str(self.mp), mpls_str) - eq_(repr(self.mp), mpls_str) - - def test_json(self): - jsondict = self.mp.to_jsondict() - mp = mpls.mpls.from_jsondict(jsondict['mpls']) - eq_(str(self.mp), str(mp)) - - def test_label_from_bin_true(self): - mpls_label = 0xfffff - is_bos = True - buf = b'\xff\xff\xf1' - mpls_label_out, is_bos_out = mpls.label_from_bin(buf) - - eq_(mpls_label, mpls_label_out) - eq_(is_bos, is_bos_out) - - def test_label_from_bin_false(self): - mpls_label = 0xfffff - is_bos = False - buf = b'\xff\xff\xf0' - mpls_label_out, is_bos_out = mpls.label_from_bin(buf) - - eq_(mpls_label, mpls_label_out) - eq_(is_bos, is_bos_out) - - def test_label_to_bin_true(self): - mpls_label = 0xfffff - is_bos = True - label = b'\xff\xff\xf1' - label_out = mpls.label_to_bin(mpls_label, is_bos) - - eq_(label, label_out) - - def test_label_to_bin_false(self): - mpls_label = 0xfffff - is_bos = False - label = b'\xff\xff\xf0' - label_out = mpls.label_to_bin(mpls_label, is_bos) - - eq_(label, label_out) diff --git a/tests/unit/packet/test_openflow.py b/tests/unit/packet/test_openflow.py deleted file mode 100644 index b0dca25f..00000000 --- a/tests/unit/packet/test_openflow.py +++ /dev/null @@ -1,64 +0,0 @@ -# Copyright (C) 2017 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. - -from __future__ import print_function - -import logging -import os -import sys - -import unittest -from nose.tools import eq_ -from nose.tools import ok_ - -from ryu.lib import pcaplib -from ryu.lib.packet import openflow -from ryu.lib.packet import packet -from ryu.utils import binary_str - - -LOG = logging.getLogger(__name__) - -OPENFLOW_DATA_DIR = os.path.join( - os.path.dirname(sys.modules[__name__].__file__), - '../../packet_data/pcap/') - - -class Test_openflow(unittest.TestCase): - """ - Test case for ryu.lib.packet.openflow. - """ - - def test_pcap(self): - files = [ - 'openflow_flowmod', - 'openflow_flowstats_req', - 'openflow_invalid_version', - ] - - for f in files: - # print('*** testing %s ...' % f) - for _, buf in pcaplib.Reader( - open(OPENFLOW_DATA_DIR + f + '.pcap', 'rb')): - # Checks if message can be parsed as expected. - pkt = packet.Packet(buf) - openflow_pkt = pkt.get_protocol(openflow.openflow) - ok_(isinstance(openflow_pkt, openflow.openflow), - 'Failed to parse OpenFlow message: %s' % pkt) - - # Checks if message can be serialized as expected. - pkt.serialize() - eq_(buf, pkt.data, - "b'%s' != b'%s'" % (binary_str(buf), binary_str(pkt.data))) diff --git a/tests/unit/packet/test_ospf.py b/tests/unit/packet/test_ospf.py deleted file mode 100644 index df57b8de..00000000 --- a/tests/unit/packet/test_ospf.py +++ /dev/null @@ -1,120 +0,0 @@ -# Copyright (C) 2013 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 -from nose.tools import eq_ -from nose.tools import ok_ - -from ryu.lib.packet import ospf - - -class Test_ospf(unittest.TestCase): - """ Test case for ryu.lib.packet.ospf - """ - def setUp(self): - pass - - def tearDown(self): - pass - - def test_router_lsa(self): - link1 = ospf.RouterLSA.Link(id_='10.0.0.1', data='255.255.255.0', - type_=ospf.LSA_LINK_TYPE_STUB, metric=10) - msg = ospf.RouterLSA(id_='192.168.0.1', adv_router='192.168.0.2', - links=[link1]) - binmsg = msg.serialize() - msg2, cls, rest = ospf.LSA.parser(binmsg) - eq_(msg.header.checksum, msg2.header.checksum) - eq_(str(msg), str(msg2)) - eq_(rest, b'') - - def test_network_lsa(self): - msg = ospf.NetworkLSA(id_='192.168.0.1', adv_router='192.168.0.2', - mask='255.255.255.0', routers=['192.168.0.2']) - binmsg = msg.serialize() - msg2, cls, rest = ospf.LSA.parser(binmsg) - eq_(msg.header.checksum, msg2.header.checksum) - eq_(str(msg), str(msg2)) - eq_(rest, b'') - - def test_as_external_lsa(self): - extnw1 = ospf.ASExternalLSA.ExternalNetwork(mask='255.255.255.0', - metric=20, - fwd_addr='10.0.0.1') - msg = ospf.ASExternalLSA(id_='192.168.0.1', adv_router='192.168.0.2', - extnws=[extnw1]) - binmsg = msg.serialize() - msg2, cls, rest = ospf.LSA.parser(binmsg) - eq_(msg.header.checksum, msg2.header.checksum) - eq_(str(msg), str(msg2)) - eq_(rest, b'') - - def test_hello(self): - msg = ospf.OSPFHello(router_id='192.168.0.1', - neighbors=['192.168.0.2']) - binmsg = msg.serialize() - msg2, cls, rest = ospf.OSPFMessage.parser(binmsg) - eq_(msg.checksum, msg2.checksum) - eq_(str(msg), str(msg2)) - eq_(rest, b'') - - def test_dbdesc(self): - link1 = ospf.RouterLSA.Link(id_='10.0.0.1', data='255.255.255.0', - type_=ospf.LSA_LINK_TYPE_STUB, metric=10) - lsa1 = ospf.RouterLSA(id_='192.168.0.1', adv_router='192.168.0.2', - links=[link1]) - msg = ospf.OSPFDBDesc(router_id='192.168.0.1', - lsa_headers=[lsa1.header]) - binmsg = msg.serialize() - msg2, cls, rest = ospf.OSPFMessage.parser(binmsg) - eq_(msg.checksum, msg2.checksum) - eq_(str(msg), str(msg2)) - eq_(rest, b'') - - def test_lsreq(self): - req = ospf.OSPFLSReq.Request(type_=ospf.OSPF_ROUTER_LSA, - id_='192.168.0.1', - adv_router='192.168.0.2') - msg = ospf.OSPFLSReq(router_id='192.168.0.1', lsa_requests=[req]) - binmsg = msg.serialize() - msg2, cls, rest = ospf.OSPFMessage.parser(binmsg) - eq_(msg.checksum, msg2.checksum) - eq_(str(msg), str(msg2)) - eq_(rest, b'') - - def test_lsupd(self): - link1 = ospf.RouterLSA.Link(id_='10.0.0.1', data='255.255.255.0', - type_=ospf.LSA_LINK_TYPE_STUB, metric=10) - lsa1 = ospf.RouterLSA(id_='192.168.0.1', adv_router='192.168.0.2', - links=[link1]) - msg = ospf.OSPFLSUpd(router_id='192.168.0.1', lsas=[lsa1]) - binmsg = msg.serialize() - msg2, cls, rest = ospf.OSPFMessage.parser(binmsg) - eq_(msg.checksum, msg2.checksum) - eq_(str(msg), str(msg2)) - eq_(rest, b'') - - def test_lsack(self): - link1 = ospf.RouterLSA.Link(id_='10.0.0.1', data='255.255.255.0', - type_=ospf.LSA_LINK_TYPE_STUB, metric=10) - lsa1 = ospf.RouterLSA(id_='192.168.0.1', adv_router='192.168.0.2', - links=[link1]) - msg = ospf.OSPFLSAck(router_id='192.168.0.1', - lsa_headers=[lsa1.header]) - binmsg = msg.serialize() - msg2, cls, rest = ospf.OSPFMessage.parser(binmsg) - eq_(msg.checksum, msg2.checksum) - eq_(str(msg), str(msg2)) - eq_(rest, b'') diff --git a/tests/unit/packet/test_packet.py b/tests/unit/packet/test_packet.py deleted file mode 100644 index 1b4c704b..00000000 --- a/tests/unit/packet/test_packet.py +++ /dev/null @@ -1,1553 +0,0 @@ -# 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. - -# vim: tabstop=4 shiftwidth=4 softtabstop=4 - -import unittest -import logging -import struct -import inspect -from nose.tools import ok_, eq_ -import six -from ryu.ofproto import ether, inet -from ryu.lib.packet import arp -from ryu.lib.packet import bpdu -from ryu.lib.packet import ethernet -from ryu.lib.packet import icmp, icmpv6 -from ryu.lib.packet import ipv4, ipv6 -from ryu.lib.packet import llc -from ryu.lib.packet import packet, packet_utils -from ryu.lib.packet import sctp -from ryu.lib.packet import tcp, udp -from ryu.lib.packet import vlan -from ryu.lib import addrconv - - -LOG = logging.getLogger('test_packet') - - -class TestPacket(unittest.TestCase): - """ Test case for packet - """ - - dst_mac = 'aa:aa:aa:aa:aa:aa' - src_mac = 'bb:bb:bb:bb:bb:bb' - dst_mac_bin = addrconv.mac.text_to_bin(dst_mac) - src_mac_bin = addrconv.mac.text_to_bin(src_mac) - dst_ip = '192.168.128.10' - src_ip = '192.168.122.20' - dst_ip_bin = addrconv.ipv4.text_to_bin(dst_ip) - src_port = 50001 - dst_port = 50002 - src_ip_bin = addrconv.ipv4.text_to_bin(src_ip) - payload = b'\x06\x06\x47\x50\x00\x00\x00\x00' \ - + b'\xcd\xc5\x00\x00\x00\x00\x00\x00' \ - + b'\x10\x11\x12\x13\x14\x15\x16\x17' \ - + b'\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f' - - def get_protocols(self, pkt): - protocols = {} - for p in pkt: - if hasattr(p, 'protocol_name'): - protocols[p.protocol_name] = p - else: - protocols['payload'] = p - return protocols - - def setUp(self): - pass - - def tearDown(self): - pass - - def test_arp(self): - # buid packet - e = ethernet.ethernet(self.dst_mac, self.src_mac, - ether.ETH_TYPE_ARP) - a = arp.arp(1, ether.ETH_TYPE_IP, 6, 4, 2, - self.src_mac, self.src_ip, self.dst_mac, - self.dst_ip) - p = packet.Packet() - p.add_protocol(e) - p.add_protocol(a) - p.serialize() - - # ethernet !6s6sH - e_buf = self.dst_mac_bin \ - + self.src_mac_bin \ - + b'\x08\x06' - - # arp !HHBBH6sI6sI - a_buf = b'\x00\x01' \ - + b'\x08\x00' \ - + b'\x06' \ - + b'\x04' \ - + b'\x00\x02' \ - + self.src_mac_bin \ - + self.src_ip_bin \ - + self.dst_mac_bin \ - + self.dst_ip_bin - - buf = e_buf + a_buf - - # Append padding if ethernet frame is less than 60 bytes length - pad_len = 60 - len(buf) - if pad_len > 0: - buf += b'\x00' * pad_len - eq_(buf, p.data) - - # parse - pkt = packet.Packet(p.data) - protocols = self.get_protocols(pkt) - p_eth = protocols['ethernet'] - p_arp = protocols['arp'] - - # ethernet - ok_(p_eth) - eq_(self.dst_mac, p_eth.dst) - eq_(self.src_mac, p_eth.src) - eq_(ether.ETH_TYPE_ARP, p_eth.ethertype) - - # arp - ok_(p_arp) - eq_(1, p_arp.hwtype) - eq_(ether.ETH_TYPE_IP, p_arp.proto) - eq_(6, p_arp.hlen) - eq_(4, p_arp.plen) - eq_(2, p_arp.opcode) - eq_(self.src_mac, p_arp.src_mac) - eq_(self.src_ip, p_arp.src_ip) - eq_(self.dst_mac, p_arp.dst_mac) - eq_(self.dst_ip, p_arp.dst_ip) - - # to string - eth_values = {'dst': self.dst_mac, - 'src': self.src_mac, - 'ethertype': ether.ETH_TYPE_ARP} - _eth_str = ','.join(['%s=%s' % (k, repr(eth_values[k])) - for k, v in inspect.getmembers(p_eth) - if k in eth_values]) - eth_str = '%s(%s)' % (ethernet.ethernet.__name__, _eth_str) - - arp_values = {'hwtype': 1, - 'proto': ether.ETH_TYPE_IP, - 'hlen': 6, - 'plen': 4, - 'opcode': 2, - 'src_mac': self.src_mac, - 'dst_mac': self.dst_mac, - 'src_ip': self.src_ip, - 'dst_ip': self.dst_ip} - _arp_str = ','.join(['%s=%s' % (k, repr(arp_values[k])) - for k, v in inspect.getmembers(p_arp) - if k in arp_values]) - arp_str = '%s(%s)' % (arp.arp.__name__, _arp_str) - - pkt_str = '%s, %s' % (eth_str, arp_str) - - eq_(eth_str, str(p_eth)) - eq_(eth_str, repr(p_eth)) - - eq_(arp_str, str(p_arp)) - eq_(arp_str, repr(p_arp)) - - eq_(pkt_str, str(pkt)) - eq_(pkt_str, repr(pkt)) - - def test_vlan_arp(self): - # buid packet - e = ethernet.ethernet(self.dst_mac, self.src_mac, - ether.ETH_TYPE_8021Q) - v = vlan.vlan(0b111, 0b1, 3, ether.ETH_TYPE_ARP) - a = arp.arp(1, ether.ETH_TYPE_IP, 6, 4, 2, - self.src_mac, self.src_ip, self.dst_mac, - self.dst_ip) - p = packet.Packet() - p.add_protocol(e) - p.add_protocol(v) - p.add_protocol(a) - p.serialize() - - # ethernet !6s6sH - e_buf = self.dst_mac_bin \ - + self.src_mac_bin \ - + b'\x81\x00' - - # vlan !HH - v_buf = b'\xF0\x03' \ - + b'\x08\x06' - - # arp !HHBBH6sI6sI - a_buf = b'\x00\x01' \ - + b'\x08\x00' \ - + b'\x06' \ - + b'\x04' \ - + b'\x00\x02' \ - + self.src_mac_bin \ - + self.src_ip_bin \ - + self.dst_mac_bin \ - + self.dst_ip_bin - - buf = e_buf + v_buf + a_buf - - # Append padding if ethernet frame is less than 60 bytes length - pad_len = 60 - len(buf) - if pad_len > 0: - buf += b'\x00' * pad_len - eq_(buf, p.data) - - # parse - pkt = packet.Packet(p.data) - protocols = self.get_protocols(pkt) - p_eth = protocols['ethernet'] - p_vlan = protocols['vlan'] - p_arp = protocols['arp'] - - # ethernet - ok_(p_eth) - eq_(self.dst_mac, p_eth.dst) - eq_(self.src_mac, p_eth.src) - eq_(ether.ETH_TYPE_8021Q, p_eth.ethertype) - - # vlan - ok_(p_vlan) - eq_(0b111, p_vlan.pcp) - eq_(0b1, p_vlan.cfi) - eq_(3, p_vlan.vid) - eq_(ether.ETH_TYPE_ARP, p_vlan.ethertype) - - # arp - ok_(p_arp) - eq_(1, p_arp.hwtype) - eq_(ether.ETH_TYPE_IP, p_arp.proto) - eq_(6, p_arp.hlen) - eq_(4, p_arp.plen) - eq_(2, p_arp.opcode) - eq_(self.src_mac, p_arp.src_mac) - eq_(self.src_ip, p_arp.src_ip) - eq_(self.dst_mac, p_arp.dst_mac) - eq_(self.dst_ip, p_arp.dst_ip) - - # to string - eth_values = {'dst': self.dst_mac, - 'src': self.src_mac, - 'ethertype': ether.ETH_TYPE_8021Q} - _eth_str = ','.join(['%s=%s' % (k, repr(eth_values[k])) - for k, v in inspect.getmembers(p_eth) - if k in eth_values]) - eth_str = '%s(%s)' % (ethernet.ethernet.__name__, _eth_str) - - vlan_values = {'pcp': 0b111, - 'cfi': 0b1, - 'vid': 3, - 'ethertype': ether.ETH_TYPE_ARP} - _vlan_str = ','.join(['%s=%s' % (k, repr(vlan_values[k])) - for k, v in inspect.getmembers(p_vlan) - if k in vlan_values]) - vlan_str = '%s(%s)' % (vlan.vlan.__name__, _vlan_str) - - arp_values = {'hwtype': 1, - 'proto': ether.ETH_TYPE_IP, - 'hlen': 6, - 'plen': 4, - 'opcode': 2, - 'src_mac': self.src_mac, - 'dst_mac': self.dst_mac, - 'src_ip': self.src_ip, - 'dst_ip': self.dst_ip} - _arp_str = ','.join(['%s=%s' % (k, repr(arp_values[k])) - for k, v in inspect.getmembers(p_arp) - if k in arp_values]) - arp_str = '%s(%s)' % (arp.arp.__name__, _arp_str) - - pkt_str = '%s, %s, %s' % (eth_str, vlan_str, arp_str) - - eq_(eth_str, str(p_eth)) - eq_(eth_str, repr(p_eth)) - - eq_(vlan_str, str(p_vlan)) - eq_(vlan_str, repr(p_vlan)) - - eq_(arp_str, str(p_arp)) - eq_(arp_str, repr(p_arp)) - - eq_(pkt_str, str(pkt)) - eq_(pkt_str, repr(pkt)) - - def test_ipv4_udp(self): - # buid packet - e = ethernet.ethernet(self.dst_mac, self.src_mac, - ether.ETH_TYPE_IP) - ip = ipv4.ipv4(4, 5, 1, 0, 3, 1, 4, 64, inet.IPPROTO_UDP, 0, - self.src_ip, self.dst_ip) - u = udp.udp(0x190F, 0x1F90, 0, 0) - - p = packet.Packet() - p.add_protocol(e) - p.add_protocol(ip) - p.add_protocol(u) - p.add_protocol(self.payload) - p.serialize() - - # ethernet !6s6sH - e_buf = self.dst_mac_bin \ - + self.src_mac_bin \ - + b'\x08\x00' - - # ipv4 !BBHHHBBHII - ip_buf = b'\x45' \ - + b'\x01' \ - + b'\x00\x3C' \ - + b'\x00\x03' \ - + b'\x20\x04' \ - + b'\x40' \ - + b'\x11' \ - + b'\x00\x00' \ - + self.src_ip_bin \ - + self.dst_ip_bin - - # udp !HHHH - u_buf = b'\x19\x0F' \ - + b'\x1F\x90' \ - + b'\x00\x28' \ - + b'\x00\x00' - - buf = e_buf + ip_buf + u_buf + self.payload - - # parse - pkt = packet.Packet(p.data) - protocols = self.get_protocols(pkt) - p_eth = protocols['ethernet'] - p_ipv4 = protocols['ipv4'] - p_udp = protocols['udp'] - - # ethernet - ok_(p_eth) - eq_(self.dst_mac, p_eth.dst) - eq_(self.src_mac, p_eth.src) - eq_(ether.ETH_TYPE_IP, p_eth.ethertype) - - # ipv4 - ok_(p_ipv4) - eq_(4, p_ipv4.version) - eq_(5, p_ipv4.header_length) - eq_(1, p_ipv4.tos) - l = len(ip_buf) + len(u_buf) + len(self.payload) - eq_(l, p_ipv4.total_length) - eq_(3, p_ipv4.identification) - eq_(1, p_ipv4.flags) - eq_(64, p_ipv4.ttl) - eq_(inet.IPPROTO_UDP, p_ipv4.proto) - eq_(self.src_ip, p_ipv4.src) - eq_(self.dst_ip, p_ipv4.dst) - t = bytearray(ip_buf) - struct.pack_into('!H', t, 10, p_ipv4.csum) - eq_(packet_utils.checksum(t), 0) - - # udp - ok_(p_udp) - eq_(0x190f, p_udp.src_port) - eq_(0x1F90, p_udp.dst_port) - eq_(len(u_buf) + len(self.payload), p_udp.total_length) - eq_(0x77b2, p_udp.csum) - t = bytearray(u_buf) - struct.pack_into('!H', t, 6, p_udp.csum) - ph = struct.pack('!4s4sBBH', self.src_ip_bin, self.dst_ip_bin, 0, - 17, len(u_buf) + len(self.payload)) - t = ph + t + self.payload - eq_(packet_utils.checksum(t), 0) - - # payload - ok_('payload' in protocols) - eq_(self.payload, protocols['payload']) - - # to string - eth_values = {'dst': self.dst_mac, - 'src': self.src_mac, - 'ethertype': ether.ETH_TYPE_IP} - _eth_str = ','.join(['%s=%s' % (k, repr(eth_values[k])) - for k, v in inspect.getmembers(p_eth) - if k in eth_values]) - eth_str = '%s(%s)' % (ethernet.ethernet.__name__, _eth_str) - - ipv4_values = {'version': 4, - 'header_length': 5, - 'tos': 1, - 'total_length': l, - 'identification': 3, - 'flags': 1, - 'offset': p_ipv4.offset, - 'ttl': 64, - 'proto': inet.IPPROTO_UDP, - 'csum': p_ipv4.csum, - 'src': self.src_ip, - 'dst': self.dst_ip, - 'option': None} - _ipv4_str = ','.join(['%s=%s' % (k, repr(ipv4_values[k])) - for k, v in inspect.getmembers(p_ipv4) - if k in ipv4_values]) - ipv4_str = '%s(%s)' % (ipv4.ipv4.__name__, _ipv4_str) - - udp_values = {'src_port': 0x190f, - 'dst_port': 0x1F90, - 'total_length': len(u_buf) + len(self.payload), - 'csum': 0x77b2} - _udp_str = ','.join(['%s=%s' % (k, repr(udp_values[k])) - for k, v in inspect.getmembers(p_udp) - if k in udp_values]) - udp_str = '%s(%s)' % (udp.udp.__name__, _udp_str) - - pkt_str = '%s, %s, %s, %s' % (eth_str, ipv4_str, udp_str, - repr(protocols['payload'])) - - eq_(eth_str, str(p_eth)) - eq_(eth_str, repr(p_eth)) - - eq_(ipv4_str, str(p_ipv4)) - eq_(ipv4_str, repr(p_ipv4)) - - eq_(udp_str, str(p_udp)) - eq_(udp_str, repr(p_udp)) - - eq_(pkt_str, str(pkt)) - eq_(pkt_str, repr(pkt)) - - def test_ipv4_tcp(self): - # buid packet - e = ethernet.ethernet(self.dst_mac, self.src_mac, - ether.ETH_TYPE_IP) - ip = ipv4.ipv4(4, 5, 0, 0, 0, 0, 0, 64, inet.IPPROTO_TCP, 0, - self.src_ip, self.dst_ip) - t = tcp.tcp(0x190F, 0x1F90, 0x123, 1, 6, 0b101010, 2048, 0, 0x6f, - b'\x01\x02') - - p = packet.Packet() - p.add_protocol(e) - p.add_protocol(ip) - p.add_protocol(t) - p.add_protocol(self.payload) - p.serialize() - - # ethernet !6s6sH - e_buf = self.dst_mac_bin \ - + self.src_mac_bin \ - + b'\x08\x00' - - # ipv4 !BBHHHBBHII - ip_buf = b'\x45' \ - + b'\x00' \ - + b'\x00\x4C' \ - + b'\x00\x00' \ - + b'\x00\x00' \ - + b'\x40' \ - + b'\x06' \ - + b'\x00\x00' \ - + self.src_ip_bin \ - + self.dst_ip_bin - - # tcp !HHIIBBHHH + option - t_buf = b'\x19\x0F' \ - + b'\x1F\x90' \ - + b'\x00\x00\x01\x23' \ - + b'\x00\x00\x00\x01' \ - + b'\x60' \ - + b'\x2A' \ - + b'\x08\x00' \ - + b'\x00\x00' \ - + b'\x00\x6F' \ - + b'\x01\x02\x00\x00' - - buf = e_buf + ip_buf + t_buf + self.payload - - # parse - pkt = packet.Packet(p.data) - protocols = self.get_protocols(pkt) - p_eth = protocols['ethernet'] - p_ipv4 = protocols['ipv4'] - p_tcp = protocols['tcp'] - - # ethernet - ok_(p_eth) - eq_(self.dst_mac, p_eth.dst) - eq_(self.src_mac, p_eth.src) - eq_(ether.ETH_TYPE_IP, p_eth.ethertype) - - # ipv4 - ok_(p_ipv4) - eq_(4, p_ipv4.version) - eq_(5, p_ipv4.header_length) - eq_(0, p_ipv4.tos) - l = len(ip_buf) + len(t_buf) + len(self.payload) - eq_(l, p_ipv4.total_length) - eq_(0, p_ipv4.identification) - eq_(0, p_ipv4.flags) - eq_(64, p_ipv4.ttl) - eq_(inet.IPPROTO_TCP, p_ipv4.proto) - eq_(self.src_ip, p_ipv4.src) - eq_(self.dst_ip, p_ipv4.dst) - t = bytearray(ip_buf) - struct.pack_into('!H', t, 10, p_ipv4.csum) - eq_(packet_utils.checksum(t), 0) - - # tcp - ok_(p_tcp) - eq_(0x190f, p_tcp.src_port) - eq_(0x1F90, p_tcp.dst_port) - eq_(0x123, p_tcp.seq) - eq_(1, p_tcp.ack) - eq_(6, p_tcp.offset) - eq_(0b101010, p_tcp.bits) - eq_(2048, p_tcp.window_size) - eq_(0x6f, p_tcp.urgent) - eq_(len(t_buf), len(p_tcp)) - t = bytearray(t_buf) - struct.pack_into('!H', t, 16, p_tcp.csum) - ph = struct.pack('!4s4sBBH', self.src_ip_bin, self.dst_ip_bin, 0, - 6, len(t_buf) + len(self.payload)) - t = ph + t + self.payload - eq_(packet_utils.checksum(t), 0) - - # payload - ok_('payload' in protocols) - eq_(self.payload, protocols['payload']) - - # to string - eth_values = {'dst': self.dst_mac, - 'src': self.src_mac, - 'ethertype': ether.ETH_TYPE_IP} - _eth_str = ','.join(['%s=%s' % (k, repr(eth_values[k])) - for k, v in inspect.getmembers(p_eth) - if k in eth_values]) - eth_str = '%s(%s)' % (ethernet.ethernet.__name__, _eth_str) - - ipv4_values = {'version': 4, - 'header_length': 5, - 'tos': 0, - 'total_length': l, - 'identification': 0, - 'flags': 0, - 'offset': p_ipv4.offset, - 'ttl': 64, - 'proto': inet.IPPROTO_TCP, - 'csum': p_ipv4.csum, - 'src': self.src_ip, - 'dst': self.dst_ip, - 'option': None} - _ipv4_str = ','.join(['%s=%s' % (k, repr(ipv4_values[k])) - for k, v in inspect.getmembers(p_ipv4) - if k in ipv4_values]) - ipv4_str = '%s(%s)' % (ipv4.ipv4.__name__, _ipv4_str) - - tcp_values = {'src_port': 0x190f, - 'dst_port': 0x1F90, - 'seq': 0x123, - 'ack': 1, - 'offset': 6, - 'bits': 0b101010, - 'window_size': 2048, - 'csum': p_tcp.csum, - 'urgent': 0x6f, - 'option': p_tcp.option} - _tcp_str = ','.join(['%s=%s' % (k, repr(tcp_values[k])) - for k, v in inspect.getmembers(p_tcp) - if k in tcp_values]) - tcp_str = '%s(%s)' % (tcp.tcp.__name__, _tcp_str) - - pkt_str = '%s, %s, %s, %s' % (eth_str, ipv4_str, tcp_str, - repr(protocols['payload'])) - - eq_(eth_str, str(p_eth)) - eq_(eth_str, repr(p_eth)) - - eq_(ipv4_str, str(p_ipv4)) - eq_(ipv4_str, repr(p_ipv4)) - - eq_(tcp_str, str(p_tcp)) - eq_(tcp_str, repr(p_tcp)) - - eq_(pkt_str, str(pkt)) - eq_(pkt_str, repr(pkt)) - - def test_ipv4_sctp(self): - # build packet - e = ethernet.ethernet() - ip = ipv4.ipv4(proto=inet.IPPROTO_SCTP) - s = sctp.sctp(chunks=[sctp.chunk_data(payload_data=self.payload)]) - - p = e / ip / s - p.serialize() - - ipaddr = addrconv.ipv4.text_to_bin('0.0.0.0') - - # ethernet !6s6sH - e_buf = b'\xff\xff\xff\xff\xff\xff' \ - + b'\x00\x00\x00\x00\x00\x00' \ - + b'\x08\x00' - - # ipv4 !BBHHHBBHII - ip_buf = b'\x45' \ - + b'\x00' \ - + b'\x00\x50' \ - + b'\x00\x00' \ - + b'\x00\x00' \ - + b'\xff' \ - + b'\x84' \ - + b'\x00\x00' \ - + ipaddr \ - + ipaddr - - # sctp !HHII + chunk_data !BBHIHHI + payload - s_buf = b'\x00\x00' \ - + b'\x00\x00' \ - + b'\x00\x00\x00\x00' \ - + b'\x00\x00\x00\x00' \ - + b'\x00' \ - + b'\x00' \ - + b'\x00\x00' \ - + b'\x00\x00\x00\x00' \ - + b'\x00\x00' \ - + b'\x00\x00' \ - + b'\x00\x00\x00\x00' \ - + self.payload - - buf = e_buf + ip_buf + s_buf - - # parse - pkt = packet.Packet(p.data) - protocols = self.get_protocols(pkt) - p_eth = protocols['ethernet'] - p_ipv4 = protocols['ipv4'] - p_sctp = protocols['sctp'] - - # ethernet - ok_(p_eth) - eq_('ff:ff:ff:ff:ff:ff', p_eth.dst) - eq_('00:00:00:00:00:00', p_eth.src) - eq_(ether.ETH_TYPE_IP, p_eth.ethertype) - - # ipv4 - ok_(p_ipv4) - eq_(4, p_ipv4.version) - eq_(5, p_ipv4.header_length) - eq_(0, p_ipv4.tos) - l = len(ip_buf) + len(s_buf) - eq_(l, p_ipv4.total_length) - eq_(0, p_ipv4.identification) - eq_(0, p_ipv4.flags) - eq_(255, p_ipv4.ttl) - eq_(inet.IPPROTO_SCTP, p_ipv4.proto) - eq_('10.0.0.1', p_ipv4.src) - eq_('10.0.0.2', p_ipv4.dst) - t = bytearray(ip_buf) - struct.pack_into('!H', t, 10, p_ipv4.csum) - eq_(packet_utils.checksum(t), 0x1403) - - # sctp - ok_(p_sctp) - eq_(1, p_sctp.src_port) - eq_(1, p_sctp.dst_port) - eq_(0, p_sctp.vtag) - assert isinstance(p_sctp.chunks[0], sctp.chunk_data) - eq_(0, p_sctp.chunks[0]._type) - eq_(0, p_sctp.chunks[0].unordered) - eq_(0, p_sctp.chunks[0].begin) - eq_(0, p_sctp.chunks[0].end) - eq_(16 + len(self.payload), p_sctp.chunks[0].length) - eq_(0, p_sctp.chunks[0].tsn) - eq_(0, p_sctp.chunks[0].sid) - eq_(0, p_sctp.chunks[0].seq) - eq_(0, p_sctp.chunks[0].payload_id) - eq_(self.payload, p_sctp.chunks[0].payload_data) - eq_(len(s_buf), len(p_sctp)) - - # to string - eth_values = {'dst': 'ff:ff:ff:ff:ff:ff', - 'src': '00:00:00:00:00:00', - 'ethertype': ether.ETH_TYPE_IP} - _eth_str = ','.join(['%s=%s' % (k, repr(eth_values[k])) - for k, v in inspect.getmembers(p_eth) - if k in eth_values]) - eth_str = '%s(%s)' % (ethernet.ethernet.__name__, _eth_str) - - ipv4_values = {'version': 4, - 'header_length': 5, - 'tos': 0, - 'total_length': l, - 'identification': 0, - 'flags': 0, - 'offset': 0, - 'ttl': 255, - 'proto': inet.IPPROTO_SCTP, - 'csum': p_ipv4.csum, - 'src': '10.0.0.1', - 'dst': '10.0.0.2', - 'option': None} - _ipv4_str = ','.join(['%s=%s' % (k, repr(ipv4_values[k])) - for k, v in inspect.getmembers(p_ipv4) - if k in ipv4_values]) - ipv4_str = '%s(%s)' % (ipv4.ipv4.__name__, _ipv4_str) - - data_values = {'unordered': 0, - 'begin': 0, - 'end': 0, - 'length': 16 + len(self.payload), - 'tsn': 0, - 'sid': 0, - 'seq': 0, - 'payload_id': 0, - 'payload_data': self.payload} - _data_str = ','.join(['%s=%s' % (k, repr(data_values[k])) - for k in sorted(data_values.keys())]) - data_str = '[%s(%s)]' % (sctp.chunk_data.__name__, _data_str) - - sctp_values = {'src_port': 1, - 'dst_port': 1, - 'vtag': 0, - 'csum': repr(p_sctp.csum), - 'chunks': data_str} - _sctp_str = ','.join(['%s=%s' % (k, sctp_values[k]) - for k, _ in inspect.getmembers(p_sctp) - if k in sctp_values]) - sctp_str = '%s(%s)' % (sctp.sctp.__name__, _sctp_str) - - pkt_str = '%s, %s, %s' % (eth_str, ipv4_str, sctp_str) - - eq_(eth_str, str(p_eth)) - eq_(eth_str, repr(p_eth)) - - eq_(ipv4_str, str(p_ipv4)) - eq_(ipv4_str, repr(p_ipv4)) - - eq_(sctp_str, str(p_sctp)) - eq_(sctp_str, repr(p_sctp)) - - eq_(pkt_str, str(pkt)) - eq_(pkt_str, repr(pkt)) - - def test_ipv4_icmp(self): - # buid packet - e = ethernet.ethernet() - ip = ipv4.ipv4(proto=inet.IPPROTO_ICMP) - ic = icmp.icmp() - - p = e / ip / ic - p.serialize() - - ipaddr = addrconv.ipv4.text_to_bin('0.0.0.0') - - # ethernet !6s6sH - e_buf = b'\xff\xff\xff\xff\xff\xff' \ - + b'\x00\x00\x00\x00\x00\x00' \ - + b'\x08\x00' - - # ipv4 !BBHHHBBHII - ip_buf = b'\x45' \ - + b'\x00' \ - + b'\x00\x1c' \ - + b'\x00\x00' \ - + b'\x00\x00' \ - + b'\xff' \ - + b'\x01' \ - + b'\x00\x00' \ - + ipaddr \ - + ipaddr - - # icmp !BBH + echo !HH - ic_buf = b'\x08' \ - + b'\x00' \ - + b'\x00\x00' \ - + b'\x00\x00' \ - + b'\x00\x00' - - buf = e_buf + ip_buf + ic_buf - - # parse - pkt = packet.Packet(p.data) - protocols = self.get_protocols(pkt) - p_eth = protocols['ethernet'] - p_ipv4 = protocols['ipv4'] - p_icmp = protocols['icmp'] - - # ethernet - ok_(p_eth) - eq_('ff:ff:ff:ff:ff:ff', p_eth.dst) - eq_('00:00:00:00:00:00', p_eth.src) - eq_(ether.ETH_TYPE_IP, p_eth.ethertype) - - # ipv4 - ok_(p_ipv4) - eq_(4, p_ipv4.version) - eq_(5, p_ipv4.header_length) - eq_(0, p_ipv4.tos) - l = len(ip_buf) + len(ic_buf) - eq_(l, p_ipv4.total_length) - eq_(0, p_ipv4.identification) - eq_(0, p_ipv4.flags) - eq_(255, p_ipv4.ttl) - eq_(inet.IPPROTO_ICMP, p_ipv4.proto) - eq_('10.0.0.1', p_ipv4.src) - eq_('10.0.0.2', p_ipv4.dst) - t = bytearray(ip_buf) - struct.pack_into('!H', t, 10, p_ipv4.csum) - eq_(packet_utils.checksum(t), 0x1403) - - # icmp - ok_(p_icmp) - eq_(8, p_icmp.type) - eq_(0, p_icmp.code) - eq_(0, p_icmp.data.id) - eq_(0, p_icmp.data.seq) - eq_(len(ic_buf), len(p_icmp)) - t = bytearray(ic_buf) - struct.pack_into('!H', t, 2, p_icmp.csum) - eq_(packet_utils.checksum(t), 0) - - # to string - eth_values = {'dst': 'ff:ff:ff:ff:ff:ff', - 'src': '00:00:00:00:00:00', - 'ethertype': ether.ETH_TYPE_IP} - _eth_str = ','.join(['%s=%s' % (k, repr(eth_values[k])) - for k, _ in inspect.getmembers(p_eth) - if k in eth_values]) - eth_str = '%s(%s)' % (ethernet.ethernet.__name__, _eth_str) - - ipv4_values = {'version': 4, - 'header_length': 5, - 'tos': 0, - 'total_length': l, - 'identification': 0, - 'flags': 0, - 'offset': p_ipv4.offset, - 'ttl': 255, - 'proto': inet.IPPROTO_ICMP, - 'csum': p_ipv4.csum, - 'src': '10.0.0.1', - 'dst': '10.0.0.2', - 'option': None} - _ipv4_str = ','.join(['%s=%s' % (k, repr(ipv4_values[k])) - for k, _ in inspect.getmembers(p_ipv4) - if k in ipv4_values]) - ipv4_str = '%s(%s)' % (ipv4.ipv4.__name__, _ipv4_str) - - echo_values = {'id': 0, - 'seq': 0, - 'data': None} - _echo_str = ','.join(['%s=%s' % (k, repr(echo_values[k])) - for k in sorted(echo_values.keys())]) - echo_str = '%s(%s)' % (icmp.echo.__name__, _echo_str) - icmp_values = {'type': 8, - 'code': 0, - 'csum': p_icmp.csum, - 'data': echo_str} - _icmp_str = ','.join(['%s=%s' % (k, icmp_values[k]) - for k, _ in inspect.getmembers(p_icmp) - if k in icmp_values]) - icmp_str = '%s(%s)' % (icmp.icmp.__name__, _icmp_str) - - pkt_str = '%s, %s, %s' % (eth_str, ipv4_str, icmp_str) - - eq_(eth_str, str(p_eth)) - eq_(eth_str, repr(p_eth)) - - eq_(ipv4_str, str(p_ipv4)) - eq_(ipv4_str, repr(p_ipv4)) - - eq_(icmp_str, str(p_icmp)) - eq_(icmp_str, repr(p_icmp)) - - eq_(pkt_str, str(pkt)) - eq_(pkt_str, repr(pkt)) - - def test_ipv6_udp(self): - # build packet - e = ethernet.ethernet(ethertype=ether.ETH_TYPE_IPV6) - ip = ipv6.ipv6(nxt=inet.IPPROTO_UDP) - u = udp.udp() - - p = e / ip / u / self.payload - p.serialize() - - ipaddr = addrconv.ipv6.text_to_bin('::') - - # ethernet !6s6sH - e_buf = b'\xff\xff\xff\xff\xff\xff' \ - + b'\x00\x00\x00\x00\x00\x00' \ - + b'\x86\xdd' - - # ipv6 !IHBB16s16s' - ip_buf = b'\x60\x00\x00\x00' \ - + b'\x00\x00' \ - + b'\x11' \ - + b'\xff' \ - + b'\x00\x00' \ - + ipaddr \ - + ipaddr - - # udp !HHHH - u_buf = b'\x00\x00' \ - + b'\x00\x00' \ - + b'\x00\x28' \ - + b'\x00\x00' - - buf = e_buf + ip_buf + u_buf + self.payload - - # parse - pkt = packet.Packet(p.data) - protocols = self.get_protocols(pkt) - p_eth = protocols['ethernet'] - p_ipv6 = protocols['ipv6'] - p_udp = protocols['udp'] - - # ethernet - ok_(p_eth) - eq_('ff:ff:ff:ff:ff:ff', p_eth.dst) - eq_('00:00:00:00:00:00', p_eth.src) - eq_(ether.ETH_TYPE_IPV6, p_eth.ethertype) - - # ipv6 - ok_(p_ipv6) - eq_(6, p_ipv6.version) - eq_(0, p_ipv6.traffic_class) - eq_(0, p_ipv6.flow_label) - eq_(len(u_buf) + len(self.payload), p_ipv6.payload_length) - eq_(inet.IPPROTO_UDP, p_ipv6.nxt) - eq_(255, p_ipv6.hop_limit) - eq_('10::10', p_ipv6.src) - eq_('20::20', p_ipv6.dst) - - # udp - ok_(p_udp) - eq_(1, p_udp.src_port) - eq_(1, p_udp.dst_port) - eq_(len(u_buf) + len(self.payload), p_udp.total_length) - eq_(0x2B60, p_udp.csum) - t = bytearray(u_buf) - struct.pack_into('!H', t, 6, p_udp.csum) - ph = struct.pack('!16s16sI3xB', ipaddr, ipaddr, - len(u_buf) + len(self.payload), 17) - t = ph + t + self.payload - eq_(packet_utils.checksum(t), 0x62) - - # payload - ok_('payload' in protocols) - eq_(self.payload, protocols['payload']) - - # to string - eth_values = {'dst': 'ff:ff:ff:ff:ff:ff', - 'src': '00:00:00:00:00:00', - 'ethertype': ether.ETH_TYPE_IPV6} - _eth_str = ','.join(['%s=%s' % (k, repr(eth_values[k])) - for k, v in inspect.getmembers(p_eth) - if k in eth_values]) - eth_str = '%s(%s)' % (ethernet.ethernet.__name__, _eth_str) - - ipv6_values = {'version': 6, - 'traffic_class': 0, - 'flow_label': 0, - 'payload_length': len(u_buf) + len(self.payload), - 'nxt': inet.IPPROTO_UDP, - 'hop_limit': 255, - 'src': '10::10', - 'dst': '20::20', - 'ext_hdrs': []} - _ipv6_str = ','.join(['%s=%s' % (k, repr(ipv6_values[k])) - for k, v in inspect.getmembers(p_ipv6) - if k in ipv6_values]) - ipv6_str = '%s(%s)' % (ipv6.ipv6.__name__, _ipv6_str) - - udp_values = {'src_port': 1, - 'dst_port': 1, - 'total_length': len(u_buf) + len(self.payload), - 'csum': 0x2B60} - _udp_str = ','.join(['%s=%s' % (k, repr(udp_values[k])) - for k, v in inspect.getmembers(p_udp) - if k in udp_values]) - udp_str = '%s(%s)' % (udp.udp.__name__, _udp_str) - - pkt_str = '%s, %s, %s, %s' % (eth_str, ipv6_str, udp_str, - repr(protocols['payload'])) - - eq_(eth_str, str(p_eth)) - eq_(eth_str, repr(p_eth)) - - eq_(ipv6_str, str(p_ipv6)) - eq_(ipv6_str, repr(p_ipv6)) - - eq_(udp_str, str(p_udp)) - eq_(udp_str, repr(p_udp)) - - eq_(pkt_str, str(pkt)) - eq_(pkt_str, repr(pkt)) - - def test_ipv6_tcp(self): - # build packet - e = ethernet.ethernet(ethertype=ether.ETH_TYPE_IPV6) - ip = ipv6.ipv6() - t = tcp.tcp(option=b'\x01\x02') - - p = e / ip / t / self.payload - p.serialize() - - ipaddr = addrconv.ipv6.text_to_bin('::') - - # ethernet !6s6sH - e_buf = b'\xff\xff\xff\xff\xff\xff' \ - + b'\x00\x00\x00\x00\x00\x00' \ - + b'\x86\xdd' - - # ipv6 !IHBB16s16s' - ip_buf = b'\x60\x00\x00\x00' \ - + b'\x00\x00' \ - + b'\x06' \ - + b'\xff' \ - + b'\x00\x00' \ - + ipaddr \ - + ipaddr - - # tcp !HHIIBBHHH + option - t_buf = b'\x00\x00' \ - + b'\x00\x00' \ - + b'\x00\x00\x00\x00' \ - + b'\x00\x00\x00\x00' \ - + b'\x60' \ - + b'\x00' \ - + b'\x00\x00' \ - + b'\x00\x00' \ - + b'\x00\x00' \ - + b'\x01\x02\x00\x00' - - buf = e_buf + ip_buf + t_buf + self.payload - - # parse - pkt = packet.Packet(p.data) - protocols = self.get_protocols(pkt) - p_eth = protocols['ethernet'] - p_ipv6 = protocols['ipv6'] - p_tcp = protocols['tcp'] - - # ethernet - ok_(p_eth) - eq_('ff:ff:ff:ff:ff:ff', p_eth.dst) - eq_('00:00:00:00:00:00', p_eth.src) - eq_(ether.ETH_TYPE_IPV6, p_eth.ethertype) - - # ipv6 - ok_(p_ipv6) - eq_(6, p_ipv6.version) - eq_(0, p_ipv6.traffic_class) - eq_(0, p_ipv6.flow_label) - eq_(len(t_buf) + len(self.payload), p_ipv6.payload_length) - eq_(inet.IPPROTO_TCP, p_ipv6.nxt) - eq_(255, p_ipv6.hop_limit) - eq_('10::10', p_ipv6.src) - eq_('20::20', p_ipv6.dst) - - # tcp - ok_(p_tcp) - eq_(1, p_tcp.src_port) - eq_(1, p_tcp.dst_port) - eq_(0, p_tcp.seq) - eq_(0, p_tcp.ack) - eq_(6, p_tcp.offset) - eq_(0, p_tcp.bits) - eq_(0, p_tcp.window_size) - eq_(0, p_tcp.urgent) - eq_(len(t_buf), len(p_tcp)) - t = bytearray(t_buf) - struct.pack_into('!H', t, 16, p_tcp.csum) - ph = struct.pack('!16s16sI3xB', ipaddr, ipaddr, - len(t_buf) + len(self.payload), 6) - t = ph + t + self.payload - eq_(packet_utils.checksum(t), 0x62) - - # payload - ok_('payload' in protocols) - eq_(self.payload, protocols['payload']) - - # to string - eth_values = {'dst': 'ff:ff:ff:ff:ff:ff', - 'src': '00:00:00:00:00:00', - 'ethertype': ether.ETH_TYPE_IPV6} - _eth_str = ','.join(['%s=%s' % (k, repr(eth_values[k])) - for k, v in inspect.getmembers(p_eth) - if k in eth_values]) - eth_str = '%s(%s)' % (ethernet.ethernet.__name__, _eth_str) - - ipv6_values = {'version': 6, - 'traffic_class': 0, - 'flow_label': 0, - 'payload_length': len(t_buf) + len(self.payload), - 'nxt': inet.IPPROTO_TCP, - 'hop_limit': 255, - 'src': '10::10', - 'dst': '20::20', - 'ext_hdrs': []} - _ipv6_str = ','.join(['%s=%s' % (k, repr(ipv6_values[k])) - for k, v in inspect.getmembers(p_ipv6) - if k in ipv6_values]) - ipv6_str = '%s(%s)' % (ipv6.ipv6.__name__, _ipv6_str) - - tcp_values = {'src_port': 1, - 'dst_port': 1, - 'seq': 0, - 'ack': 0, - 'offset': 6, - 'bits': 0, - 'window_size': 0, - 'csum': p_tcp.csum, - 'urgent': 0, - 'option': p_tcp.option} - _tcp_str = ','.join(['%s=%s' % (k, repr(tcp_values[k])) - for k, v in inspect.getmembers(p_tcp) - if k in tcp_values]) - tcp_str = '%s(%s)' % (tcp.tcp.__name__, _tcp_str) - - pkt_str = '%s, %s, %s, %s' % (eth_str, ipv6_str, tcp_str, - repr(protocols['payload'])) - - eq_(eth_str, str(p_eth)) - eq_(eth_str, repr(p_eth)) - - eq_(ipv6_str, str(p_ipv6)) - eq_(ipv6_str, repr(p_ipv6)) - - eq_(tcp_str, str(p_tcp)) - eq_(tcp_str, repr(p_tcp)) - - eq_(pkt_str, str(pkt)) - eq_(pkt_str, repr(pkt)) - - def test_ipv6_sctp(self): - # build packet - e = ethernet.ethernet(ethertype=ether.ETH_TYPE_IPV6) - ip = ipv6.ipv6(nxt=inet.IPPROTO_SCTP) - s = sctp.sctp(chunks=[sctp.chunk_data(payload_data=self.payload)]) - - p = e / ip / s - p.serialize() - - ipaddr = addrconv.ipv6.text_to_bin('::') - - # ethernet !6s6sH - e_buf = b'\xff\xff\xff\xff\xff\xff' \ - + b'\x00\x00\x00\x00\x00\x00' \ - + b'\x86\xdd' - - # ipv6 !IHBB16s16s' - ip_buf = b'\x60\x00\x00\x00' \ - + b'\x00\x00' \ - + b'\x84' \ - + b'\xff' \ - + b'\x00\x00' \ - + ipaddr \ - + ipaddr - - # sctp !HHII + chunk_data !BBHIHHI + payload - s_buf = b'\x00\x00' \ - + b'\x00\x00' \ - + b'\x00\x00\x00\x00' \ - + b'\x00\x00\x00\x00' \ - + b'\x00' \ - + b'\x00' \ - + b'\x00\x00' \ - + b'\x00\x00\x00\x00' \ - + b'\x00\x00' \ - + b'\x00\x00' \ - + b'\x00\x00\x00\x00' \ - + self.payload - - buf = e_buf + ip_buf + s_buf - - # parse - pkt = packet.Packet(p.data) - protocols = self.get_protocols(pkt) - p_eth = protocols['ethernet'] - p_ipv6 = protocols['ipv6'] - p_sctp = protocols['sctp'] - - # ethernet - ok_(p_eth) - eq_('ff:ff:ff:ff:ff:ff', p_eth.dst) - eq_('00:00:00:00:00:00', p_eth.src) - eq_(ether.ETH_TYPE_IPV6, p_eth.ethertype) - - # ipv6 - ok_(p_ipv6) - eq_(6, p_ipv6.version) - eq_(0, p_ipv6.traffic_class) - eq_(0, p_ipv6.flow_label) - eq_(len(s_buf), p_ipv6.payload_length) - eq_(inet.IPPROTO_SCTP, p_ipv6.nxt) - eq_(255, p_ipv6.hop_limit) - eq_('10::10', p_ipv6.src) - eq_('20::20', p_ipv6.dst) - - # sctp - ok_(p_sctp) - eq_(1, p_sctp.src_port) - eq_(1, p_sctp.dst_port) - eq_(0, p_sctp.vtag) - assert isinstance(p_sctp.chunks[0], sctp.chunk_data) - eq_(0, p_sctp.chunks[0]._type) - eq_(0, p_sctp.chunks[0].unordered) - eq_(0, p_sctp.chunks[0].begin) - eq_(0, p_sctp.chunks[0].end) - eq_(16 + len(self.payload), p_sctp.chunks[0].length) - eq_(0, p_sctp.chunks[0].tsn) - eq_(0, p_sctp.chunks[0].sid) - eq_(0, p_sctp.chunks[0].seq) - eq_(0, p_sctp.chunks[0].payload_id) - eq_(self.payload, p_sctp.chunks[0].payload_data) - eq_(len(s_buf), len(p_sctp)) - - # to string - eth_values = {'dst': 'ff:ff:ff:ff:ff:ff', - 'src': '00:00:00:00:00:00', - 'ethertype': ether.ETH_TYPE_IPV6} - _eth_str = ','.join(['%s=%s' % (k, repr(eth_values[k])) - for k, v in inspect.getmembers(p_eth) - if k in eth_values]) - eth_str = '%s(%s)' % (ethernet.ethernet.__name__, _eth_str) - - ipv6_values = {'version': 6, - 'traffic_class': 0, - 'flow_label': 0, - 'payload_length': len(s_buf), - 'nxt': inet.IPPROTO_SCTP, - 'hop_limit': 255, - 'src': '10::10', - 'dst': '20::20', - 'ext_hdrs': []} - _ipv6_str = ','.join(['%s=%s' % (k, repr(ipv6_values[k])) - for k, v in inspect.getmembers(p_ipv6) - if k in ipv6_values]) - ipv6_str = '%s(%s)' % (ipv6.ipv6.__name__, _ipv6_str) - - data_values = {'unordered': 0, - 'begin': 0, - 'end': 0, - 'length': 16 + len(self.payload), - 'tsn': 0, - 'sid': 0, - 'seq': 0, - 'payload_id': 0, - 'payload_data': self.payload} - _data_str = ','.join(['%s=%s' % (k, repr(data_values[k])) - for k in sorted(data_values.keys())]) - data_str = '[%s(%s)]' % (sctp.chunk_data.__name__, _data_str) - - sctp_values = {'src_port': 1, - 'dst_port': 1, - 'vtag': 0, - 'csum': repr(p_sctp.csum), - 'chunks': data_str} - _sctp_str = ','.join(['%s=%s' % (k, sctp_values[k]) - for k, _ in inspect.getmembers(p_sctp) - if k in sctp_values]) - sctp_str = '%s(%s)' % (sctp.sctp.__name__, _sctp_str) - - pkt_str = '%s, %s, %s' % (eth_str, ipv6_str, sctp_str) - - eq_(eth_str, str(p_eth)) - eq_(eth_str, repr(p_eth)) - - eq_(ipv6_str, str(p_ipv6)) - eq_(ipv6_str, repr(p_ipv6)) - - eq_(sctp_str, str(p_sctp)) - eq_(sctp_str, repr(p_sctp)) - - eq_(pkt_str, str(pkt)) - eq_(pkt_str, repr(pkt)) - - def test_ipv6_icmpv6(self): - # build packet - e = ethernet.ethernet(ethertype=ether.ETH_TYPE_IPV6) - ip = ipv6.ipv6(nxt=inet.IPPROTO_ICMPV6) - ic = icmpv6.icmpv6() - - p = e / ip / ic - p.serialize() - - ipaddr = addrconv.ipv6.text_to_bin('::') - - # ethernet !6s6sH - e_buf = b'\xff\xff\xff\xff\xff\xff' \ - + b'\x00\x00\x00\x00\x00\x00' \ - + b'\x86\xdd' - - # ipv6 !IHBB16s16s' - ip_buf = b'\x60\x00\x00\x00' \ - + b'\x00\x00' \ - + b'\x3a' \ - + b'\xff' \ - + b'\x00\x00' \ - + ipaddr \ - + ipaddr - - # icmpv6 !BBH - ic_buf = b'\x00' \ - + b'\x00' \ - + b'\x00\x00' - - buf = e_buf + ip_buf + ic_buf - - # parse - pkt = packet.Packet(p.data) - protocols = self.get_protocols(pkt) - p_eth = protocols['ethernet'] - p_ipv6 = protocols['ipv6'] - p_icmpv6 = protocols['icmpv6'] - - # ethernet - ok_(p_eth) - eq_('ff:ff:ff:ff:ff:ff', p_eth.dst) - eq_('00:00:00:00:00:00', p_eth.src) - eq_(ether.ETH_TYPE_IPV6, p_eth.ethertype) - - # ipv6 - ok_(p_ipv6) - eq_(6, p_ipv6.version) - eq_(0, p_ipv6.traffic_class) - eq_(0, p_ipv6.flow_label) - eq_(len(ic_buf), p_ipv6.payload_length) - eq_(inet.IPPROTO_ICMPV6, p_ipv6.nxt) - eq_(255, p_ipv6.hop_limit) - eq_('10::10', p_ipv6.src) - eq_('20::20', p_ipv6.dst) - - # icmpv6 - ok_(p_icmpv6) - eq_(0, p_icmpv6.type_) - eq_(0, p_icmpv6.code) - eq_(len(ic_buf), len(p_icmpv6)) - t = bytearray(ic_buf) - struct.pack_into('!H', t, 2, p_icmpv6.csum) - ph = struct.pack('!16s16sI3xB', ipaddr, ipaddr, len(ic_buf), 58) - t = ph + t - eq_(packet_utils.checksum(t), 0x60) - - # to string - eth_values = {'dst': 'ff:ff:ff:ff:ff:ff', - 'src': '00:00:00:00:00:00', - 'ethertype': ether.ETH_TYPE_IPV6} - _eth_str = ','.join(['%s=%s' % (k, repr(eth_values[k])) - for k, _ in inspect.getmembers(p_eth) - if k in eth_values]) - eth_str = '%s(%s)' % (ethernet.ethernet.__name__, _eth_str) - - ipv6_values = {'version': 6, - 'traffic_class': 0, - 'flow_label': 0, - 'payload_length': len(ic_buf), - 'nxt': inet.IPPROTO_ICMPV6, - 'hop_limit': 255, - 'src': '10::10', - 'dst': '20::20', - 'ext_hdrs': []} - _ipv6_str = ','.join(['%s=%s' % (k, repr(ipv6_values[k])) - for k, _ in inspect.getmembers(p_ipv6) - if k in ipv6_values]) - ipv6_str = '%s(%s)' % (ipv6.ipv6.__name__, _ipv6_str) - - icmpv6_values = {'type_': 0, - 'code': 0, - 'csum': p_icmpv6.csum, - 'data': None} - _icmpv6_str = ','.join(['%s=%s' % (k, repr(icmpv6_values[k])) - for k, _ in inspect.getmembers(p_icmpv6) - if k in icmpv6_values]) - icmpv6_str = '%s(%s)' % (icmpv6.icmpv6.__name__, _icmpv6_str) - - pkt_str = '%s, %s, %s' % (eth_str, ipv6_str, icmpv6_str) - - eq_(eth_str, str(p_eth)) - eq_(eth_str, repr(p_eth)) - - eq_(ipv6_str, str(p_ipv6)) - eq_(ipv6_str, repr(p_ipv6)) - - eq_(icmpv6_str, str(p_icmpv6)) - eq_(icmpv6_str, repr(p_icmpv6)) - - eq_(pkt_str, str(pkt)) - eq_(pkt_str, repr(pkt)) - - def test_llc_bpdu(self): - # buid packet - e = ethernet.ethernet(self.dst_mac, self.src_mac, - ether.ETH_TYPE_IEEE802_3) - llc_control = llc.ControlFormatU(0, 0, 0) - l = llc.llc(llc.SAP_BPDU, llc.SAP_BPDU, llc_control) - b = bpdu.ConfigurationBPDUs(flags=0, - root_priority=32768, - root_system_id_extension=0, - root_mac_address=self.src_mac, - root_path_cost=0, - bridge_priority=32768, - bridge_system_id_extension=0, - bridge_mac_address=self.dst_mac, - port_priority=128, - port_number=4, - message_age=1, - max_age=20, - hello_time=2, - forward_delay=15) - - p = packet.Packet() - p.add_protocol(e) - p.add_protocol(l) - p.add_protocol(b) - p.serialize() - - # ethernet !6s6sH - e_buf = self.dst_mac_bin + self.src_mac_bin + b'\x05\xdc' - - # llc !BBB - l_buf = (b'\x42' - b'\x42' - b'\x03') - - # bpdu !HBBBQIQHHHHH - b_buf = (b'\x00\x00' - b'\x00' - b'\x00' - b'\x00' - b'\x80\x00\xbb\xbb\xbb\xbb\xbb\xbb' - b'\x00\x00\x00\x00' - b'\x80\x00\xaa\xaa\xaa\xaa\xaa\xaa' - b'\x80\x04' - b'\x01\x00' - b'\x14\x00' - b'\x02\x00' - b'\x0f\x00') - - buf = e_buf + l_buf + b_buf - - # Append padding if ethernet frame is less than 60 bytes length - pad_len = 60 - len(buf) - if pad_len > 0: - buf += b'\x00' * pad_len - eq_(buf, p.data) - - # parse - pkt = packet.Packet(p.data) - protocols = self.get_protocols(pkt) - p_eth = protocols['ethernet'] - p_llc = protocols['llc'] - p_bpdu = protocols['ConfigurationBPDUs'] - - # ethernet - ok_(p_eth) - eq_(self.dst_mac, p_eth.dst) - eq_(self.src_mac, p_eth.src) - eq_(ether.ETH_TYPE_IEEE802_3, p_eth.ethertype) - - # llc - ok_(p_llc) - eq_(llc.SAP_BPDU, p_llc.dsap_addr) - eq_(llc.SAP_BPDU, p_llc.ssap_addr) - eq_(0, p_llc.control.modifier_function1) - eq_(0, p_llc.control.pf_bit) - eq_(0, p_llc.control.modifier_function2) - - # bpdu - ok_(p_bpdu) - eq_(bpdu.PROTOCOL_IDENTIFIER, p_bpdu._protocol_id) - eq_(bpdu.PROTOCOLVERSION_ID_BPDU, p_bpdu._version_id) - eq_(bpdu.TYPE_CONFIG_BPDU, p_bpdu._bpdu_type) - eq_(0, p_bpdu.flags) - eq_(32768, p_bpdu.root_priority) - eq_(0, p_bpdu.root_system_id_extension) - eq_(self.src_mac, p_bpdu.root_mac_address) - eq_(0, p_bpdu.root_path_cost) - eq_(32768, p_bpdu.bridge_priority) - eq_(0, p_bpdu.bridge_system_id_extension) - eq_(self.dst_mac, p_bpdu.bridge_mac_address) - eq_(128, p_bpdu.port_priority) - eq_(4, p_bpdu.port_number) - eq_(1, p_bpdu.message_age) - eq_(20, p_bpdu.max_age) - eq_(2, p_bpdu.hello_time) - eq_(15, p_bpdu.forward_delay) - - # to string - eth_values = {'dst': self.dst_mac, - 'src': self.src_mac, - 'ethertype': ether.ETH_TYPE_IEEE802_3} - _eth_str = ','.join(['%s=%s' % (k, repr(eth_values[k])) - for k, v in inspect.getmembers(p_eth) - if k in eth_values]) - eth_str = '%s(%s)' % (ethernet.ethernet.__name__, _eth_str) - - ctrl_values = {'modifier_function1': 0, - 'pf_bit': 0, - 'modifier_function2': 0} - _ctrl_str = ','.join(['%s=%s' % (k, repr(ctrl_values[k])) - for k, v in inspect.getmembers(p_llc.control) - if k in ctrl_values]) - ctrl_str = '%s(%s)' % (llc.ControlFormatU.__name__, _ctrl_str) - - llc_values = {'dsap_addr': repr(llc.SAP_BPDU), - 'ssap_addr': repr(llc.SAP_BPDU), - 'control': ctrl_str} - _llc_str = ','.join(['%s=%s' % (k, llc_values[k]) - for k, v in inspect.getmembers(p_llc) - if k in llc_values]) - llc_str = '%s(%s)' % (llc.llc.__name__, _llc_str) - - _long = int if six.PY3 else long - bpdu_values = {'flags': 0, - 'root_priority': _long(32768), - 'root_system_id_extension': _long(0), - 'root_mac_address': self.src_mac, - 'root_path_cost': 0, - 'bridge_priority': _long(32768), - 'bridge_system_id_extension': _long(0), - 'bridge_mac_address': self.dst_mac, - 'port_priority': 128, - 'port_number': 4, - 'message_age': float(1), - 'max_age': float(20), - 'hello_time': float(2), - 'forward_delay': float(15)} - _bpdu_str = ','.join(['%s=%s' % (k, repr(bpdu_values[k])) - for k, v in inspect.getmembers(p_bpdu) - if k in bpdu_values]) - bpdu_str = '%s(%s)' % (bpdu.ConfigurationBPDUs.__name__, _bpdu_str) - - pkt_str = '%s, %s, %s' % (eth_str, llc_str, bpdu_str) - - eq_(eth_str, str(p_eth)) - eq_(eth_str, repr(p_eth)) - - eq_(llc_str, str(p_llc)) - eq_(llc_str, repr(p_llc)) - - eq_(bpdu_str, str(p_bpdu)) - eq_(bpdu_str, repr(p_bpdu)) - - eq_(pkt_str, str(pkt)) - eq_(pkt_str, repr(pkt)) - - def test_div_api(self): - e = ethernet.ethernet(self.dst_mac, self.src_mac, ether.ETH_TYPE_IP) - i = ipv4.ipv4() - u = udp.udp(self.src_port, self.dst_port) - pkt = e / i / u - ok_(isinstance(pkt, packet.Packet)) - ok_(isinstance(pkt.protocols[0], ethernet.ethernet)) - ok_(isinstance(pkt.protocols[1], ipv4.ipv4)) - ok_(isinstance(pkt.protocols[2], udp.udp)) diff --git a/tests/unit/packet/test_pbb.py b/tests/unit/packet/test_pbb.py deleted file mode 100644 index dd7778cd..00000000 --- a/tests/unit/packet/test_pbb.py +++ /dev/null @@ -1,172 +0,0 @@ -# Copyright (C) 2013 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 logging -import struct -import unittest - -from nose.tools import eq_ -from nose.tools import ok_ -from nose.tools import raises -from ryu.ofproto import ether -from ryu.ofproto import inet -from ryu.lib.packet import ethernet -from ryu.lib.packet import packet -from ryu.lib.packet import ipv4 -from ryu.lib.packet import vlan -from ryu.lib.packet import pbb - - -LOG = logging.getLogger(__name__) - - -class Test_itag(unittest.TestCase): - - pcp = 3 - dei = 0 - uca = 1 - sid = 16770000 - data = pcp << 29 | dei << 28 | uca << 27 | sid - buf = struct.pack(pbb.itag._PACK_STR, data) - it = pbb.itag(pcp, dei, uca, sid) - - def setUp(self): - pass - - def tearDown(self): - pass - - def test_init(self): - eq_(self.pcp, self.it.pcp) - eq_(self.dei, self.it.dei) - eq_(self.uca, self.it.uca) - eq_(self.sid, self.it.sid) - - def test_parser(self): - _res = pbb.itag.parser(self.buf) - if type(_res) is tuple: - res = _res[0] - else: - res = _res - eq_(res.pcp, self.pcp) - eq_(res.dei, self.dei) - eq_(res.uca, self.uca) - eq_(res.sid, self.sid) - - def test_serialize(self): - data = bytearray() - prev = None - buf = self.it.serialize(data, prev) - res = struct.unpack(pbb.itag._PACK_STR, buf) - eq_(res[0], self.data) - - def _build_itag(self): - b_src_mac = '00:07:0d:af:f4:54' - b_dst_mac = '00:00:00:00:00:00' - b_ethertype = ether.ETH_TYPE_8021AD - e1 = ethernet.ethernet(b_dst_mac, b_src_mac, b_ethertype) - - b_pcp = 0 - b_cfi = 0 - b_vid = 32 - b_ethertype = ether.ETH_TYPE_8021Q - bt = vlan.svlan(b_pcp, b_cfi, b_vid, b_ethertype) - - c_src_mac = '11:11:11:11:11:11' - c_dst_mac = 'aa:aa:aa:aa:aa:aa' - c_ethertype = ether.ETH_TYPE_8021AD - e2 = ethernet.ethernet(c_dst_mac, c_src_mac, c_ethertype) - - s_pcp = 0 - s_cfi = 0 - s_vid = 32 - s_ethertype = ether.ETH_TYPE_8021Q - st = vlan.svlan(s_pcp, s_cfi, s_vid, s_ethertype) - - c_pcp = 0 - c_cfi = 0 - c_vid = 32 - c_ethertype = ether.ETH_TYPE_IP - ct = vlan.vlan(c_pcp, c_cfi, c_vid, c_ethertype) - - version = 4 - header_length = 20 - tos = 0 - total_length = 24 - identification = 0x8a5d - flags = 0 - offset = 1480 - ttl = 64 - proto = inet.IPPROTO_ICMP - csum = 0xa7f2 - src = '131.151.32.21' - dst = '131.151.32.129' - option = b'TEST' - ip = ipv4.ipv4(version, header_length, tos, total_length, - identification, flags, offset, ttl, proto, csum, - src, dst, option) - - p = packet.Packet() - - p.add_protocol(e1) - p.add_protocol(bt) - p.add_protocol(self.it) - p.add_protocol(e2) - p.add_protocol(st) - p.add_protocol(ct) - p.add_protocol(ip) - p.serialize() - - return p - - def test_build_itag(self): - p = self._build_itag() - - e = p.get_protocols(ethernet.ethernet) - ok_(e) - ok_(isinstance(e, list)) - eq_(e[0].ethertype, ether.ETH_TYPE_8021AD) - eq_(e[1].ethertype, ether.ETH_TYPE_8021AD) - - sv = p.get_protocols(vlan.svlan) - ok_(sv) - ok_(isinstance(sv, list)) - eq_(sv[0].ethertype, ether.ETH_TYPE_8021Q) - eq_(sv[1].ethertype, ether.ETH_TYPE_8021Q) - - it = p.get_protocol(pbb.itag) - ok_(it) - - v = p.get_protocol(vlan.vlan) - ok_(v) - eq_(v.ethertype, ether.ETH_TYPE_IP) - - ip = p.get_protocol(ipv4.ipv4) - ok_(ip) - - eq_(it.pcp, self.pcp) - eq_(it.dei, self.dei) - eq_(it.uca, self.uca) - eq_(it.sid, self.sid) - - @raises(Exception) - def test_malformed_itag(self): - m_short_buf = self.buf[1:pbb.itag._MIN_LEN] - pbb.itag.parser(m_short_buf) - - def test_json(self): - jsondict = self.it.to_jsondict() - it = pbb.itag.from_jsondict(jsondict['itag']) - eq_(str(self.it), str(it)) diff --git a/tests/unit/packet/test_sctp.py b/tests/unit/packet/test_sctp.py deleted file mode 100644 index d7afb7cc..00000000 --- a/tests/unit/packet/test_sctp.py +++ /dev/null @@ -1,1454 +0,0 @@ -# Copyright (C) 2013 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 inspect -import logging -import six -import struct -import unittest - -from nose.tools import eq_ -from nose.tools import ok_ -from ryu.lib import addrconv -from ryu.lib.packet import packet -from ryu.lib.packet import ethernet -from ryu.lib.packet import ipv4 -from ryu.lib.packet import sctp -from ryu.ofproto import ether -from ryu.ofproto import inet - - -LOG = logging.getLogger(__name__) - - -class Test_sctp(unittest.TestCase): - - def setUp(self): - self.chunks = [] - self.csum = 0 - self.dst_port = 1234 - self.src_port = 5678 - self.vtag = 98765432 - - self.sc = sctp.sctp( - self.src_port, self.dst_port, self.vtag, self.csum, - self.chunks) - - self.buf = b'\x16\x2e\x04\xd2\x05\xe3\x0a\x78\x00\x00\x00\x00' - - def setUp_with_data(self): - self.unordered = 1 - self.begin = 1 - self.end = 1 - self.length = 16 + 10 - self.tsn = 12345 - self.sid = 1 - self.seq = 0 - self.payload_id = 0 - self.payload_data = b'\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a' - - self.data = sctp.chunk_data( - unordered=self.unordered, begin=self.begin, end=self.end, - tsn=self.tsn, sid=self.sid, payload_data=self.payload_data) - - self.chunks = [self.data] - - self.sc = sctp.sctp( - self.src_port, self.dst_port, self.vtag, self.csum, - self.chunks) - - self.buf += b'\x00\x07\x00\x1a\x00\x00\x30\x39\x00\x01\x00\x00' + \ - b'\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a' - - def setUp_with_init(self): - self.flags = 0 - self.length = 20 + 8 + 20 + 8 + 4 + 16 + 16 - self.init_tag = 123456 - self.a_rwnd = 9876 - self.os = 3 - self.mis = 3 - self.i_tsn = 123456 - - self.p_ipv4 = sctp.param_ipv4('192.168.1.1') - self.p_ipv6 = sctp.param_ipv6('fe80::647e:1aff:fec4:8284') - self.p_cookie_preserve = sctp.param_cookie_preserve(5000) - self.p_ecn = sctp.param_ecn() - self.p_host_addr = sctp.param_host_addr(b'test host\x00') - self.p_support_type = sctp.param_supported_addr( - [sctp.PTYPE_IPV4, sctp.PTYPE_IPV6, sctp.PTYPE_COOKIE_PRESERVE, - sctp.PTYPE_ECN, sctp.PTYPE_HOST_ADDR]) - self.params = [ - self.p_ipv4, self.p_ipv6, self.p_cookie_preserve, - self.p_ecn, self.p_host_addr, self.p_support_type] - - self.init = sctp.chunk_init( - init_tag=self.init_tag, a_rwnd=self.a_rwnd, os=self.os, - mis=self.mis, i_tsn=self.i_tsn, params=self.params) - - self.chunks = [self.init] - - self.sc = sctp.sctp( - self.src_port, self.dst_port, self.vtag, self.csum, - self.chunks) - - self.buf += b'\x01\x00\x00\x5c\x00\x01\xe2\x40\x00\x00\x26\x94' + \ - b'\x00\x03\x00\x03\x00\x01\xe2\x40' + \ - b'\x00\x05\x00\x08\xc0\xa8\x01\x01' + \ - b'\x00\x06\x00\x14' + \ - b'\xfe\x80\x00\x00\x00\x00\x00\x00' + \ - b'\x64\x7e\x1a\xff\xfe\xc4\x82\x84' + \ - b'\x00\x09\x00\x08\x00\x00\x13\x88' + \ - b'\x80\x00\x00\x04' + \ - b'\x00\x0b\x00\x0e' + \ - b'\x74\x65\x73\x74\x20\x68\x6f\x73\x74\x00\x00\x00' + \ - b'\x00\x0c\x00\x0e\x00\x05\x00\x06\x00\x09\x80\x00' + \ - b'\x00\x0b\x00\x00' - - def setUp_with_init_ack(self): - self.flags = 0 - self.length = 20 + 8 + 8 + 20 + 8 + 4 + 16 - self.init_tag = 123456 - self.a_rwnd = 9876 - self.os = 3 - self.mis = 3 - self.i_tsn = 123456 - - self.p_state_cookie = sctp.param_state_cookie(b'\x01\x02\x03') - self.p_ipv4 = sctp.param_ipv4('192.168.1.1') - self.p_ipv6 = sctp.param_ipv6('fe80::647e:1aff:fec4:8284') - self.p_unrecognized_param = sctp.param_unrecognized_param( - b'\xff\xff\x00\x04') - self.p_ecn = sctp.param_ecn() - self.p_host_addr = sctp.param_host_addr(b'test host\x00') - self.params = [ - self.p_state_cookie, self.p_ipv4, self.p_ipv6, - self.p_unrecognized_param, self.p_ecn, self.p_host_addr] - - self.init_ack = sctp.chunk_init_ack( - init_tag=self.init_tag, a_rwnd=self.a_rwnd, os=self.os, - mis=self.mis, i_tsn=self.i_tsn, params=self.params) - - self.chunks = [self.init_ack] - - self.sc = sctp.sctp( - self.src_port, self.dst_port, self.vtag, self.csum, - self.chunks) - - self.buf += b'\x02\x00\x00\x54\x00\x01\xe2\x40\x00\x00\x26\x94' + \ - b'\x00\x03\x00\x03\x00\x01\xe2\x40' + \ - b'\x00\x07\x00\x07\x01\x02\x03\x00' + \ - b'\x00\x05\x00\x08\xc0\xa8\x01\x01' + \ - b'\x00\x06\x00\x14' + \ - b'\xfe\x80\x00\x00\x00\x00\x00\x00' + \ - b'\x64\x7e\x1a\xff\xfe\xc4\x82\x84' + \ - b'\x00\x08\x00\x08\xff\xff\x00\x04' + \ - b'\x80\x00\x00\x04' + \ - b'\x00\x0b\x00\x0e' + \ - b'\x74\x65\x73\x74\x20\x68\x6f\x73\x74\x00\x00\x00' - - def setUp_with_sack(self): - self.flags = 0 - self.length = 16 + 2 * 2 * 5 + 4 * 5 - self.tsn_ack = 123456 - self.a_rwnd = 9876 - self.gapack_num = 5 - self.duptsn_num = 5 - self.gapacks = [[2, 3], [10, 12], [20, 24], [51, 52], [62, 63]] - self.duptsns = [123458, 123466, 123476, 123507, 123518] - - self.sack = sctp.chunk_sack( - tsn_ack=self.tsn_ack, a_rwnd=self.a_rwnd, - gapack_num=self.gapack_num, duptsn_num=self.duptsn_num, - gapacks=self.gapacks, duptsns=self.duptsns) - - self.chunks = [self.sack] - - self.sc = sctp.sctp( - self.src_port, self.dst_port, self.vtag, self.csum, - self.chunks) - - self.buf += b'\x03\x00\x00\x38\x00\x01\xe2\x40' + \ - b'\x00\x00\x26\x94\x00\x05\x00\x05' + \ - b'\x00\x02\x00\x03\x00\x0a\x00\x0c\x00\x14\x00\x18' + \ - b'\x00\x33\x00\x34\x00\x3e\x00\x3f' + \ - b'\x00\x01\xe2\x42\x00\x01\xe2\x4a\x00\x01\xe2\x54' + \ - b'\x00\x01\xe2\x73\x00\x01\xe2\x7e' - - def setUp_with_heartbeat(self): - self.flags = 0 - self.length = 4 + 8 - - self.p_heartbeat = sctp.param_heartbeat(b'\x01\x02\x03\x04') - - self.heartbeat = sctp.chunk_heartbeat(info=self.p_heartbeat) - - self.chunks = [self.heartbeat] - - self.sc = sctp.sctp( - self.src_port, self.dst_port, self.vtag, self.csum, - self.chunks) - - self.buf += b'\x04\x00\x00\x0c' + \ - b'\x00\x01\x00\x08' + \ - b'\x01\x02\x03\x04' - - def setUp_with_heartbeat_ack(self): - self.flags = 0 - self.length = 4 + 12 - - self.p_heartbeat = sctp.param_heartbeat( - b'\xff\xee\xdd\xcc\xbb\xaa\x99\x88') - - self.heartbeat_ack = sctp.chunk_heartbeat_ack(info=self.p_heartbeat) - - self.chunks = [self.heartbeat_ack] - - self.sc = sctp.sctp( - self.src_port, self.dst_port, self.vtag, self.csum, - self.chunks) - - self.buf += b'\x05\x00\x00\x10' + \ - b'\x00\x01\x00\x0c' + \ - b'\xff\xee\xdd\xcc\xbb\xaa\x99\x88' - - def setUp_with_abort(self): - self.tflag = 0 - self.length = 4 + 8 + 16 + 8 + 4 + 20 + 8 + 4 + 8 + 8 + 4 + 12 \ - + 20 + 20 - - self.c_invalid_stream_id = sctp.cause_invalid_stream_id(4096) - self.c_missing_param = sctp.cause_missing_param( - [sctp.PTYPE_IPV4, sctp.PTYPE_IPV6, - sctp.PTYPE_COOKIE_PRESERVE, sctp.PTYPE_HOST_ADDR]) - self.c_stale_cookie = sctp.cause_stale_cookie(b'\x00\x00\x13\x88') - self.c_out_of_resource = sctp.cause_out_of_resource() - self.c_unresolvable_addr = sctp.cause_unresolvable_addr( - sctp.param_host_addr(b'test host\x00')) - self.c_unrecognized_chunk = sctp.cause_unrecognized_chunk( - b'\xff\x00\x00\x04') - self.c_invalid_param = sctp.cause_invalid_param() - self.c_unrecognized_param = sctp.cause_unrecognized_param( - b'\xff\xff\x00\x04') - self.c_no_userdata = sctp.cause_no_userdata(b'\x00\x01\xe2\x40') - self.c_cookie_while_shutdown = sctp.cause_cookie_while_shutdown() - self.c_restart_with_new_addr = sctp.cause_restart_with_new_addr( - sctp.param_ipv4('192.168.1.1')) - self.c_user_initiated_abort = sctp.cause_user_initiated_abort( - b'Key Interrupt.\x00') - self.c_protocol_violation = sctp.cause_protocol_violation( - b'Unknown reason.\x00') - - self.causes = [ - self.c_invalid_stream_id, self.c_missing_param, - self.c_stale_cookie, self.c_out_of_resource, - self.c_unresolvable_addr, self.c_unrecognized_chunk, - self.c_invalid_param, self.c_unrecognized_param, - self.c_no_userdata, self.c_cookie_while_shutdown, - self.c_restart_with_new_addr, self.c_user_initiated_abort, - self.c_protocol_violation] - - self.abort = sctp.chunk_abort(causes=self.causes) - - self.chunks = [self.abort] - - self.sc = sctp.sctp( - self.src_port, self.dst_port, self.vtag, self.csum, - self.chunks) - - self.buf += b'\x06\x00\x00\x90' + \ - b'\x00\x01\x00\x08\x10\x00\x00\x00' + \ - b'\x00\x02\x00\x10\x00\x00\x00\x04' + \ - b'\x00\x05\x00\x06\x00\x09\x00\x0b' + \ - b'\x00\x03\x00\x08\x00\x00\x13\x88' + \ - b'\x00\x04\x00\x04' + \ - b'\x00\x05\x00\x14' + \ - b'\x00\x0b\x00\x0e' + \ - b'\x74\x65\x73\x74\x20\x68\x6f\x73\x74\x00\x00\x00' + \ - b'\x00\x06\x00\x08\xff\x00\x00\x04' + \ - b'\x00\x07\x00\x04' + \ - b'\x00\x08\x00\x08\xff\xff\x00\x04' + \ - b'\x00\x09\x00\x08\x00\x01\xe2\x40' + \ - b'\x00\x0a\x00\x04' + \ - b'\x00\x0b\x00\x0c' + \ - b'\x00\x05\x00\x08\xc0\xa8\x01\x01' + \ - b'\x00\x0c\x00\x13' + \ - b'\x4b\x65\x79\x20\x49\x6e\x74\x65' + \ - b'\x72\x72\x75\x70\x74\x2e\x00\x00' + \ - b'\x00\x0d\x00\x14' + \ - b'\x55\x6e\x6b\x6e\x6f\x77\x6e\x20' + \ - b'\x72\x65\x61\x73\x6f\x6e\x2e\x00' - - def setUp_with_shutdown(self): - self.flags = 0 - self.length = 8 - self.tsn_ack = 123456 - - self.shutdown = sctp.chunk_shutdown(tsn_ack=self.tsn_ack) - - self.chunks = [self.shutdown] - - self.sc = sctp.sctp( - self.src_port, self.dst_port, self.vtag, self.csum, - self.chunks) - - self.buf += b'\x07\x00\x00\x08\x00\x01\xe2\x40' - - def setUp_with_shutdown_ack(self): - self.flags = 0 - self.length = 4 - - self.shutdown_ack = sctp.chunk_shutdown_ack() - - self.chunks = [self.shutdown_ack] - - self.sc = sctp.sctp( - self.src_port, self.dst_port, self.vtag, self.csum, - self.chunks) - - self.buf += b'\x08\x00\x00\x04' - - def setUp_with_error(self): - self.flags = 0 - self.length = 4 + 8 + 16 + 8 + 4 + 20 + 8 + 4 + 8 + 8 + 4 + 12 \ - + 20 + 20 - - self.c_invalid_stream_id = sctp.cause_invalid_stream_id(4096) - self.c_missing_param = sctp.cause_missing_param( - [sctp.PTYPE_IPV4, sctp.PTYPE_IPV6, - sctp.PTYPE_COOKIE_PRESERVE, sctp.PTYPE_HOST_ADDR]) - self.c_stale_cookie = sctp.cause_stale_cookie(b'\x00\x00\x13\x88') - self.c_out_of_resource = sctp.cause_out_of_resource() - self.c_unresolvable_addr = sctp.cause_unresolvable_addr( - sctp.param_host_addr(b'test host\x00')) - self.c_unrecognized_chunk = sctp.cause_unrecognized_chunk( - b'\xff\x00\x00\x04') - self.c_invalid_param = sctp.cause_invalid_param() - self.c_unrecognized_param = sctp.cause_unrecognized_param( - b'\xff\xff\x00\x04') - self.c_no_userdata = sctp.cause_no_userdata(b'\x00\x01\xe2\x40') - self.c_cookie_while_shutdown = sctp.cause_cookie_while_shutdown() - self.c_restart_with_new_addr = sctp.cause_restart_with_new_addr( - sctp.param_ipv4('192.168.1.1')) - self.c_user_initiated_abort = sctp.cause_user_initiated_abort( - b'Key Interrupt.\x00') - self.c_protocol_violation = sctp.cause_protocol_violation( - b'Unknown reason.\x00') - - self.causes = [ - self.c_invalid_stream_id, self.c_missing_param, - self.c_stale_cookie, self.c_out_of_resource, - self.c_unresolvable_addr, self.c_unrecognized_chunk, - self.c_invalid_param, self.c_unrecognized_param, - self.c_no_userdata, self.c_cookie_while_shutdown, - self.c_restart_with_new_addr, self.c_user_initiated_abort, - self.c_protocol_violation] - - self.error = sctp.chunk_error(causes=self.causes) - - self.chunks = [self.error] - - self.sc = sctp.sctp( - self.src_port, self.dst_port, self.vtag, self.csum, - self.chunks) - - self.buf += b'\x09\x00\x00\x90' + \ - b'\x00\x01\x00\x08\x10\x00\x00\x00' + \ - b'\x00\x02\x00\x10\x00\x00\x00\x04' + \ - b'\x00\x05\x00\x06\x00\x09\x00\x0b' + \ - b'\x00\x03\x00\x08\x00\x00\x13\x88' + \ - b'\x00\x04\x00\x04' + \ - b'\x00\x05\x00\x14' + \ - b'\x00\x0b\x00\x0e' + \ - b'\x74\x65\x73\x74\x20\x68\x6f\x73\x74\x00\x00\x00' + \ - b'\x00\x06\x00\x08\xff\x00\x00\x04' + \ - b'\x00\x07\x00\x04' + \ - b'\x00\x08\x00\x08\xff\xff\x00\x04' + \ - b'\x00\x09\x00\x08\x00\x01\xe2\x40' + \ - b'\x00\x0a\x00\x04' + \ - b'\x00\x0b\x00\x0c' + \ - b'\x00\x05\x00\x08\xc0\xa8\x01\x01' + \ - b'\x00\x0c\x00\x13' + \ - b'\x4b\x65\x79\x20\x49\x6e\x74\x65' + \ - b'\x72\x72\x75\x70\x74\x2e\x00\x00' + \ - b'\x00\x0d\x00\x14' + \ - b'\x55\x6e\x6b\x6e\x6f\x77\x6e\x20' + \ - b'\x72\x65\x61\x73\x6f\x6e\x2e\x00' - - def setUp_with_cookie_echo(self): - self.flags = 0 - self.length = 8 - self.cookie = b'\x12\x34\x56\x78' - - self.cookie_echo = sctp.chunk_cookie_echo(cookie=self.cookie) - - self.chunks = [self.cookie_echo] - - self.sc = sctp.sctp( - self.src_port, self.dst_port, self.vtag, self.csum, - self.chunks) - - self.buf += b'\x0a\x00\x00\x08\x12\x34\x56\x78' - - def setUp_with_cookie_ack(self): - self.flags = 0 - self.length = 4 - - self.cookie_ack = sctp.chunk_cookie_ack() - - self.chunks = [self.cookie_ack] - - self.sc = sctp.sctp( - self.src_port, self.dst_port, self.vtag, self.csum, - self.chunks) - - self.buf += b'\x0b\x00\x00\x04' - - def setUp_with_ecn_echo(self): - self.flags = 0 - self.length = 8 - self.low_tsn = 123456 - - self.ecn_echo = sctp.chunk_ecn_echo(low_tsn=self.low_tsn) - - self.chunks = [self.ecn_echo] - - self.sc = sctp.sctp( - self.src_port, self.dst_port, self.vtag, self.csum, - self.chunks) - - self.buf += b'\x0c\x00\x00\x08\x00\x01\xe2\x40' - - def setUp_with_cwr(self): - self.flags = 0 - self.length = 8 - self.low_tsn = 123456 - - self.cwr = sctp.chunk_cwr(low_tsn=self.low_tsn) - - self.chunks = [self.cwr] - - self.sc = sctp.sctp( - self.src_port, self.dst_port, self.vtag, self.csum, - self.chunks) - - self.buf += b'\x0d\x00\x00\x08\x00\x01\xe2\x40' - - def setUp_with_shutdown_complete(self): - self.tflag = 0 - self.length = 4 - - self.shutdown_complete = sctp.chunk_shutdown_complete() - - self.chunks = [self.shutdown_complete] - - self.sc = sctp.sctp( - self.src_port, self.dst_port, self.vtag, self.csum, - self.chunks) - - self.buf += b'\x0e\x00\x00\x04' - - def setUp_with_multi_chunks(self): - self.s_flags = 0 - self.s_length = 16 - self.s_tsn_ack = 123456 - self.s_a_rwnd = 9876 - self.s_gapack_num = 0 - self.s_duptsn_num = 0 - self.s_gapacks = None - self.s_duptsns = None - - self.sack = sctp.chunk_sack( - tsn_ack=self.s_tsn_ack, a_rwnd=self.s_a_rwnd) - - self.d1_unordered = 0 - self.d1_begin = 1 - self.d1_end = 0 - self.d1_length = 16 + 10 - self.d1_tsn = 12345 - self.d1_sid = 1 - self.d1_seq = 0 - self.d1_payload_id = 0 - self.d1_payload_data = b'\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a' - - self.data1 = sctp.chunk_data( - begin=self.d1_begin, tsn=self.d1_tsn, sid=self.d1_sid, - payload_data=self.d1_payload_data) - - self.d2_unordered = 0 - self.d2_begin = 0 - self.d2_end = 1 - self.d2_length = 16 + 10 - self.d2_tsn = 12346 - self.d2_sid = 1 - self.d2_seq = 1 - self.d2_payload_id = 0 - self.d2_payload_data = b'\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a' - - self.data2 = sctp.chunk_data( - end=self.d2_end, tsn=self.d2_tsn, sid=self.d2_sid, - seq=self.d2_seq, payload_data=self.d2_payload_data) - - self.chunks = [self.sack, self.data1, self.data2] - - self.sc = sctp.sctp( - self.src_port, self.dst_port, self.vtag, self.csum, - self.chunks) - - self.buf += b'\x03\x00\x00\x10\x00\x01\xe2\x40' + \ - b'\x00\x00\x26\x94\x00\x00\x00\x00' + \ - b'\x00\x02\x00\x1a\x00\x00\x30\x39\x00\x01\x00\x00' + \ - b'\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a' + \ - b'\x00\x01\x00\x1a\x00\x00\x30\x3a\x00\x01\x00\x01' + \ - b'\x00\x00\x00\x00\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a' - - def tearDown(self): - pass - - def test_init(self): - eq_(self.src_port, self.sc.src_port) - eq_(self.dst_port, self.sc.dst_port) - eq_(self.vtag, self.sc.vtag) - eq_(self.csum, self.sc.csum) - eq_(self.chunks, self.sc.chunks) - - def test_init_with_data(self): - self.setUp_with_data() - self.test_init() - - def test_init_with_init(self): - self.setUp_with_init() - self.test_init() - - def test_init_with_init_ack(self): - self.setUp_with_init_ack() - self.test_init() - - def test_init_with_sack(self): - self.setUp_with_sack() - self.test_init() - - def test_init_with_heartbeat(self): - self.setUp_with_heartbeat() - self.test_init() - - def test_init_with_heartbeat_ack(self): - self.setUp_with_heartbeat_ack() - self.test_init() - - def test_init_with_abort(self): - self.setUp_with_abort() - self.test_init() - - def test_init_with_shutdown(self): - self.setUp_with_shutdown() - self.test_init() - - def test_init_with_shutdown_ack(self): - self.setUp_with_shutdown_ack() - self.test_init() - - def test_init_with_error(self): - self.setUp_with_error() - self.test_init() - - def test_init_with_cookie_echo(self): - self.setUp_with_cookie_echo() - self.test_init() - - def test_init_with_cookie_ack(self): - self.setUp_with_cookie_ack() - self.test_init() - - def test_init_with_ecn_echo(self): - self.setUp_with_ecn_echo() - self.test_init() - - def test_init_with_cwr(self): - self.setUp_with_cwr() - self.test_init() - - def test_init_with_shutdown_complete(self): - self.setUp_with_shutdown_complete() - self.test_init() - - def test_init_with_multi_chunks(self): - self.setUp_with_multi_chunks() - self.test_init() - - def test_parser(self): - _res = self.sc.parser(six.binary_type(self.buf)) - if type(_res) is tuple: - res = _res[0] - else: - res = _res - # to calculate the lengths of parameters. - self.sc.serialize(None, None) - - eq_(self.src_port, res.src_port) - eq_(self.dst_port, res.dst_port) - eq_(self.vtag, res.vtag) - eq_(self.csum, res.csum) - eq_(str(self.chunks), str(res.chunks)) - - def test_parser_with_data(self): - self.setUp_with_data() - self.test_parser() - - def test_parser_with_init(self): - self.setUp_with_init() - self.test_parser() - - def test_parser_with_init_ack(self): - self.setUp_with_init_ack() - self.test_parser() - - def test_parser_with_sack(self): - self.setUp_with_sack() - self.test_parser() - - def test_parser_with_heartbeat(self): - self.setUp_with_heartbeat() - self.test_parser() - - def test_parser_with_heartbeat_ack(self): - self.setUp_with_heartbeat_ack() - self.test_parser() - - def test_parser_with_abort(self): - self.setUp_with_abort() - self.test_parser() - - def test_parser_with_shutdown(self): - self.setUp_with_shutdown() - self.test_parser() - - def test_parser_with_shutdown_ack(self): - self.setUp_with_shutdown_ack() - self.test_parser() - - def test_parser_with_error(self): - self.setUp_with_error() - self.test_parser() - - def test_parser_with_cookie_echo(self): - self.setUp_with_cookie_echo() - self.test_parser() - - def test_parser_with_cookie_ack(self): - self.setUp_with_cookie_ack() - self.test_parser() - - def test_parser_with_ecn_echo(self): - self.setUp_with_ecn_echo() - self.test_parser() - - def test_parser_with_cwr(self): - self.setUp_with_cwr() - self.test_parser() - - def test_parser_with_shutdown_complete(self): - self.setUp_with_shutdown_complete() - self.test_parser() - - def test_parser_with_multi_chunks(self): - self.setUp_with_multi_chunks() - self.test_parser() - - def _test_serialize(self): - buf = self.sc.serialize(bytearray(), None) - res = struct.unpack_from(sctp.sctp._PACK_STR, buf) - eq_(self.src_port, res[0]) - eq_(self.dst_port, res[1]) - eq_(self.vtag, res[2]) - # skip compare checksum - # eq_(self.csum, res[3]) - - return buf[sctp.sctp._MIN_LEN:] - - def test_serialize(self): - self._test_serialize() - - def test_serialize_with_data(self): - self.setUp_with_data() - buf = self._test_serialize() - res = struct.unpack_from(sctp.chunk_data._PACK_STR, buf) - eq_(sctp.chunk_data.chunk_type(), res[0]) - flags = ( - (self.unordered << 2) | - (self.begin << 1) | - (self.end << 0)) - eq_(flags, res[1]) - eq_(self.length, res[2]) - eq_(self.tsn, res[3]) - eq_(self.sid, res[4]) - eq_(self.seq, res[5]) - eq_(self.payload_id, res[6]) - eq_(self.payload_data, buf[sctp.chunk_data._MIN_LEN:]) - - def test_serialize_with_init(self): - self.setUp_with_init() - buf = self._test_serialize() - res = struct.unpack_from(sctp.chunk_init._PACK_STR, buf) - eq_(sctp.chunk_init.chunk_type(), res[0]) - eq_(self.flags, res[1]) - eq_(self.length, res[2]) - eq_(self.init_tag, res[3]) - eq_(self.a_rwnd, res[4]) - eq_(self.os, res[5]) - eq_(self.mis, res[6]) - eq_(self.i_tsn, res[7]) - - buf = buf[sctp.chunk_init._MIN_LEN:] - res1 = struct.unpack_from(sctp.param_ipv4._PACK_STR, buf) - eq_(sctp.param_ipv4.param_type(), res1[0]) - eq_(8, res1[1]) - eq_('192.168.1.1', addrconv.ipv4.bin_to_text( - buf[sctp.param_ipv4._MIN_LEN:sctp.param_ipv4._MIN_LEN + 4])) - - buf = buf[8:] - res2 = struct.unpack_from(sctp.param_ipv6._PACK_STR, buf) - eq_(sctp.param_ipv6.param_type(), res2[0]) - eq_(20, res2[1]) - eq_('fe80::647e:1aff:fec4:8284', addrconv.ipv6.bin_to_text( - buf[sctp.param_ipv6._MIN_LEN:sctp.param_ipv6._MIN_LEN + 16])) - - buf = buf[20:] - res3 = struct.unpack_from(sctp.param_cookie_preserve._PACK_STR, - buf) - eq_(sctp.param_cookie_preserve.param_type(), res3[0]) - eq_(8, res3[1]) - eq_(5000, res3[2]) - - buf = buf[8:] - res4 = struct.unpack_from(sctp.param_ecn._PACK_STR, buf) - eq_(sctp.param_ecn.param_type(), res4[0]) - eq_(4, res4[1]) - - buf = buf[4:] - res5 = struct.unpack_from(sctp.param_host_addr._PACK_STR, buf) - eq_(sctp.param_host_addr.param_type(), res5[0]) - eq_(14, res5[1]) - eq_(b'test host\x00', - buf[sctp.param_host_addr._MIN_LEN: - sctp.param_host_addr._MIN_LEN + 10]) - - buf = buf[16:] - res6 = struct.unpack_from(sctp.param_supported_addr._PACK_STR, buf) - res6 = list(res6) - eq_(sctp.param_supported_addr.param_type(), res6[0]) - eq_(14, res6[1]) - buf = buf[sctp.param_supported_addr._MIN_LEN:] - offset = 0 - tmplist = [] - while offset < len(buf): - (tmp, ) = struct.unpack_from('!H', buf, offset) - tmplist.append(tmp) - offset += struct.calcsize('!H') - res6.extend(tmplist) - eq_(sctp.PTYPE_IPV4, res6[2]) - eq_(sctp.PTYPE_IPV6, res6[3]) - eq_(sctp.PTYPE_COOKIE_PRESERVE, res6[4]) - eq_(sctp.PTYPE_ECN, res6[5]) - eq_(sctp.PTYPE_HOST_ADDR, res6[6]) - - def test_serialize_with_init_ack(self): - self.setUp_with_init_ack() - buf = self._test_serialize() - res = struct.unpack_from(sctp.chunk_init_ack._PACK_STR, buf) - eq_(sctp.chunk_init_ack.chunk_type(), res[0]) - eq_(self.flags, res[1]) - eq_(self.length, res[2]) - eq_(self.init_tag, res[3]) - eq_(self.a_rwnd, res[4]) - eq_(self.os, res[5]) - eq_(self.mis, res[6]) - eq_(self.i_tsn, res[7]) - - buf = buf[sctp.chunk_init_ack._MIN_LEN:] - res1 = struct.unpack_from(sctp.param_state_cookie._PACK_STR, buf) - eq_(sctp.param_state_cookie.param_type(), res1[0]) - eq_(7, res1[1]) - eq_(b'\x01\x02\x03', - buf[sctp.param_state_cookie._MIN_LEN: - sctp.param_state_cookie._MIN_LEN + 3]) - - buf = buf[8:] - res2 = struct.unpack_from(sctp.param_ipv4._PACK_STR, buf) - eq_(sctp.param_ipv4.param_type(), res2[0]) - eq_(8, res2[1]) - eq_('192.168.1.1', addrconv.ipv4.bin_to_text( - buf[sctp.param_ipv4._MIN_LEN:sctp.param_ipv4._MIN_LEN + 4])) - - buf = buf[8:] - res3 = struct.unpack_from(sctp.param_ipv6._PACK_STR, buf) - eq_(sctp.param_ipv6.param_type(), res3[0]) - eq_(20, res3[1]) - eq_('fe80::647e:1aff:fec4:8284', addrconv.ipv6.bin_to_text( - buf[sctp.param_ipv6._MIN_LEN:sctp.param_ipv6._MIN_LEN + 16])) - - buf = buf[20:] - res4 = struct.unpack_from( - sctp.param_unrecognized_param._PACK_STR, buf) - eq_(sctp.param_unrecognized_param.param_type(), res4[0]) - eq_(8, res4[1]) - eq_(b'\xff\xff\x00\x04', - buf[sctp.param_unrecognized_param._MIN_LEN: - sctp.param_unrecognized_param._MIN_LEN + 4]) - - buf = buf[8:] - res5 = struct.unpack_from(sctp.param_ecn._PACK_STR, buf) - eq_(sctp.param_ecn.param_type(), res5[0]) - eq_(4, res5[1]) - - buf = buf[4:] - res6 = struct.unpack_from(sctp.param_host_addr._PACK_STR, buf) - eq_(sctp.param_host_addr.param_type(), res6[0]) - eq_(14, res6[1]) - eq_(b'test host\x00', - buf[sctp.param_host_addr._MIN_LEN: - sctp.param_host_addr._MIN_LEN + 10]) - - def test_serialize_with_sack(self): - self.setUp_with_sack() - buf = self._test_serialize() - res = struct.unpack_from(sctp.chunk_sack._PACK_STR, buf) - eq_(sctp.chunk_sack.chunk_type(), res[0]) - eq_(self.flags, res[1]) - eq_(self.length, res[2]) - eq_(self.tsn_ack, res[3]) - eq_(self.a_rwnd, res[4]) - eq_(self.gapack_num, res[5]) - eq_(self.duptsn_num, res[6]) - - buf = buf[sctp.chunk_sack._MIN_LEN:] - gapacks = [] - for _ in range(self.gapack_num): - (gap_s, gap_e) = struct.unpack_from( - sctp.chunk_sack._GAPACK_STR, buf) - one = [gap_s, gap_e] - gapacks.append(one) - buf = buf[sctp.chunk_sack._GAPACK_LEN:] - duptsns = [] - for _ in range(self.duptsn_num): - (duptsn, ) = struct.unpack_from( - sctp.chunk_sack._DUPTSN_STR, buf) - duptsns.append(duptsn) - buf = buf[sctp.chunk_sack._DUPTSN_LEN:] - eq_(self.gapacks, gapacks) - eq_(self.duptsns, duptsns) - - def test_serialize_with_heartbeat(self): - self.setUp_with_heartbeat() - buf = self._test_serialize() - res = struct.unpack_from(sctp.chunk_heartbeat._PACK_STR, buf) - eq_(sctp.chunk_heartbeat.chunk_type(), res[0]) - eq_(self.flags, res[1]) - eq_(self.length, res[2]) - - buf = buf[sctp.chunk_heartbeat._MIN_LEN:] - res1 = struct.unpack_from(sctp.param_heartbeat._PACK_STR, buf) - eq_(sctp.param_heartbeat.param_type(), res1[0]) - eq_(8, res1[1]) - eq_(b'\x01\x02\x03\x04', - buf[sctp.param_heartbeat._MIN_LEN: - sctp.param_heartbeat._MIN_LEN + 4]) - - def test_serialize_with_heartbeat_ack(self): - self.setUp_with_heartbeat_ack() - buf = self._test_serialize() - res = struct.unpack_from(sctp.chunk_heartbeat_ack._PACK_STR, buf) - eq_(sctp.chunk_heartbeat_ack.chunk_type(), res[0]) - eq_(self.flags, res[1]) - eq_(self.length, res[2]) - - buf = buf[sctp.chunk_heartbeat_ack._MIN_LEN:] - res1 = struct.unpack_from(sctp.param_heartbeat._PACK_STR, buf) - eq_(sctp.param_heartbeat.param_type(), res1[0]) - eq_(12, res1[1]) - eq_(b'\xff\xee\xdd\xcc\xbb\xaa\x99\x88', - buf[sctp.param_heartbeat._MIN_LEN: - sctp.param_heartbeat._MIN_LEN + 8]) - - def test_serialize_with_abort(self): - self.setUp_with_abort() - buf = self._test_serialize() - res = struct.unpack_from(sctp.chunk_abort._PACK_STR, buf) - eq_(sctp.chunk_abort.chunk_type(), res[0]) - flags = self.tflag << 0 - eq_(flags, res[1]) - eq_(self.length, res[2]) - - buf = buf[sctp.chunk_abort._MIN_LEN:] - res1 = struct.unpack_from(sctp.cause_invalid_stream_id._PACK_STR, buf) - eq_(sctp.cause_invalid_stream_id.cause_code(), res1[0]) - eq_(8, res1[1]) - eq_(4096, res1[2]) - - buf = buf[8:] - res2 = struct.unpack_from(sctp.cause_missing_param._PACK_STR, buf) - eq_(sctp.cause_missing_param.cause_code(), res2[0]) - eq_(16, res2[1]) - eq_(4, res2[2]) - types = [] - for count in range(4): - (tmp, ) = struct.unpack_from( - '!H', buf, sctp.cause_missing_param._MIN_LEN + 2 * count) - types.append(tmp) - eq_(str([sctp.PTYPE_IPV4, sctp.PTYPE_IPV6, - sctp.PTYPE_COOKIE_PRESERVE, sctp.PTYPE_HOST_ADDR]), - str(types)) - - buf = buf[16:] - res3 = struct.unpack_from(sctp.cause_stale_cookie._PACK_STR, buf) - eq_(sctp.cause_stale_cookie.cause_code(), res3[0]) - eq_(8, res3[1]) - eq_(b'\x00\x00\x13\x88', - buf[sctp.cause_stale_cookie._MIN_LEN: - sctp.cause_stale_cookie._MIN_LEN + 4]) - - buf = buf[8:] - res4 = struct.unpack_from(sctp.cause_out_of_resource._PACK_STR, buf) - eq_(sctp.cause_out_of_resource.cause_code(), res4[0]) - eq_(4, res4[1]) - - buf = buf[4:] - res5 = struct.unpack_from( - sctp.cause_unresolvable_addr._PACK_STR, buf) - eq_(sctp.cause_unresolvable_addr.cause_code(), res5[0]) - eq_(20, res5[1]) - eq_(b'\x00\x0b\x00\x0e\x74\x65\x73\x74' + - b'\x20\x68\x6f\x73\x74\x00\x00\x00', - buf[sctp.cause_unresolvable_addr._MIN_LEN: - sctp.cause_unresolvable_addr._MIN_LEN + 16]) - - buf = buf[20:] - res6 = struct.unpack_from( - sctp.cause_unrecognized_chunk._PACK_STR, buf) - eq_(sctp.cause_unrecognized_chunk.cause_code(), res6[0]) - eq_(8, res6[1]) - eq_(b'\xff\x00\x00\x04', - buf[sctp.cause_unrecognized_chunk._MIN_LEN: - sctp.cause_unrecognized_chunk._MIN_LEN + 4]) - - buf = buf[8:] - res7 = struct.unpack_from(sctp.cause_invalid_param._PACK_STR, buf) - eq_(sctp.cause_invalid_param.cause_code(), res7[0]) - eq_(4, res7[1]) - - buf = buf[4:] - res8 = struct.unpack_from( - sctp.cause_unrecognized_param._PACK_STR, buf) - eq_(sctp.cause_unrecognized_param.cause_code(), res8[0]) - eq_(8, res8[1]) - eq_(b'\xff\xff\x00\x04', - buf[sctp.cause_unrecognized_param._MIN_LEN: - sctp.cause_unrecognized_param._MIN_LEN + 4]) - - buf = buf[8:] - res9 = struct.unpack_from(sctp.cause_no_userdata._PACK_STR, buf) - eq_(sctp.cause_no_userdata.cause_code(), res9[0]) - eq_(8, res9[1]) - eq_(b'\x00\x01\xe2\x40', - buf[sctp.cause_no_userdata._MIN_LEN: - sctp.cause_no_userdata._MIN_LEN + 4]) - - buf = buf[8:] - res10 = struct.unpack_from( - sctp.cause_cookie_while_shutdown._PACK_STR, buf) - eq_(sctp.cause_cookie_while_shutdown.cause_code(), res10[0]) - eq_(4, res10[1]) - - buf = buf[4:] - res11 = struct.unpack_from( - sctp.cause_restart_with_new_addr._PACK_STR, buf) - eq_(sctp.cause_restart_with_new_addr.cause_code(), res11[0]) - eq_(12, res11[1]) - eq_(b'\x00\x05\x00\x08\xc0\xa8\x01\x01', - buf[sctp.cause_restart_with_new_addr._MIN_LEN: - sctp.cause_restart_with_new_addr._MIN_LEN + 8]) - - buf = buf[12:] - res12 = struct.unpack_from( - sctp.cause_user_initiated_abort._PACK_STR, buf) - eq_(sctp.cause_user_initiated_abort.cause_code(), res12[0]) - eq_(19, res12[1]) - eq_(b'Key Interrupt.\x00', - buf[sctp.cause_user_initiated_abort._MIN_LEN: - sctp.cause_user_initiated_abort._MIN_LEN + 15]) - - buf = buf[20:] - res13 = struct.unpack_from( - sctp.cause_protocol_violation._PACK_STR, buf) - eq_(sctp.cause_protocol_violation.cause_code(), res13[0]) - eq_(20, res13[1]) - eq_(b'Unknown reason.\x00', - buf[sctp.cause_protocol_violation._MIN_LEN: - sctp.cause_protocol_violation._MIN_LEN + 16]) - - def test_serialize_with_shutdown(self): - self.setUp_with_shutdown() - buf = self._test_serialize() - res = struct.unpack_from(sctp.chunk_shutdown._PACK_STR, buf) - eq_(sctp.chunk_shutdown.chunk_type(), res[0]) - eq_(self.flags, res[1]) - eq_(self.length, res[2]) - eq_(self.tsn_ack, res[3]) - - def test_serialize_with_shutdown_ack(self): - self.setUp_with_shutdown_ack() - buf = self._test_serialize() - res = struct.unpack_from(sctp.chunk_shutdown_ack._PACK_STR, buf) - eq_(sctp.chunk_shutdown_ack.chunk_type(), res[0]) - eq_(self.flags, res[1]) - eq_(self.length, res[2]) - - def test_serialize_with_error(self): - self.setUp_with_error() - buf = self._test_serialize() - res = struct.unpack_from(sctp.chunk_error._PACK_STR, buf) - eq_(sctp.chunk_error.chunk_type(), res[0]) - eq_(self.flags, res[1]) - eq_(self.length, res[2]) - - buf = buf[sctp.chunk_error._MIN_LEN:] - res1 = struct.unpack_from(sctp.cause_invalid_stream_id._PACK_STR, buf) - eq_(sctp.cause_invalid_stream_id.cause_code(), res1[0]) - eq_(8, res1[1]) - eq_(4096, res1[2]) - - buf = buf[8:] - res2 = struct.unpack_from(sctp.cause_missing_param._PACK_STR, buf) - eq_(sctp.cause_missing_param.cause_code(), res2[0]) - eq_(16, res2[1]) - eq_(4, res2[2]) - types = [] - for count in range(4): - (tmp, ) = struct.unpack_from( - '!H', buf, sctp.cause_missing_param._MIN_LEN + 2 * count) - types.append(tmp) - eq_(str([sctp.PTYPE_IPV4, sctp.PTYPE_IPV6, - sctp.PTYPE_COOKIE_PRESERVE, sctp.PTYPE_HOST_ADDR]), - str(types)) - - buf = buf[16:] - res3 = struct.unpack_from(sctp.cause_stale_cookie._PACK_STR, buf) - eq_(sctp.cause_stale_cookie.cause_code(), res3[0]) - eq_(8, res3[1]) - eq_(b'\x00\x00\x13\x88', - buf[sctp.cause_stale_cookie._MIN_LEN: - sctp.cause_stale_cookie._MIN_LEN + 4]) - - buf = buf[8:] - res4 = struct.unpack_from(sctp.cause_out_of_resource._PACK_STR, buf) - eq_(sctp.cause_out_of_resource.cause_code(), res4[0]) - eq_(4, res4[1]) - - buf = buf[4:] - res5 = struct.unpack_from( - sctp.cause_unresolvable_addr._PACK_STR, buf) - eq_(sctp.cause_unresolvable_addr.cause_code(), res5[0]) - eq_(20, res5[1]) - eq_(b'\x00\x0b\x00\x0e\x74\x65\x73\x74' + - b'\x20\x68\x6f\x73\x74\x00\x00\x00', - buf[sctp.cause_unresolvable_addr._MIN_LEN: - sctp.cause_unresolvable_addr._MIN_LEN + 16]) - - buf = buf[20:] - res6 = struct.unpack_from( - sctp.cause_unrecognized_chunk._PACK_STR, buf) - eq_(sctp.cause_unrecognized_chunk.cause_code(), res6[0]) - eq_(8, res6[1]) - eq_(b'\xff\x00\x00\x04', - buf[sctp.cause_unrecognized_chunk._MIN_LEN: - sctp.cause_unrecognized_chunk._MIN_LEN + 4]) - - buf = buf[8:] - res7 = struct.unpack_from(sctp.cause_invalid_param._PACK_STR, buf) - eq_(sctp.cause_invalid_param.cause_code(), res7[0]) - eq_(4, res7[1]) - - buf = buf[4:] - res8 = struct.unpack_from( - sctp.cause_unrecognized_param._PACK_STR, buf) - eq_(sctp.cause_unrecognized_param.cause_code(), res8[0]) - eq_(8, res8[1]) - eq_(b'\xff\xff\x00\x04', - buf[sctp.cause_unrecognized_param._MIN_LEN: - sctp.cause_unrecognized_param._MIN_LEN + 4]) - - buf = buf[8:] - res9 = struct.unpack_from(sctp.cause_no_userdata._PACK_STR, buf) - eq_(sctp.cause_no_userdata.cause_code(), res9[0]) - eq_(8, res9[1]) - eq_(b'\x00\x01\xe2\x40', - buf[sctp.cause_no_userdata._MIN_LEN: - sctp.cause_no_userdata._MIN_LEN + 4]) - - buf = buf[8:] - res10 = struct.unpack_from( - sctp.cause_cookie_while_shutdown._PACK_STR, buf) - eq_(sctp.cause_cookie_while_shutdown.cause_code(), res10[0]) - eq_(4, res10[1]) - - buf = buf[4:] - res11 = struct.unpack_from( - sctp.cause_restart_with_new_addr._PACK_STR, buf) - eq_(sctp.cause_restart_with_new_addr.cause_code(), res11[0]) - eq_(12, res11[1]) - eq_(b'\x00\x05\x00\x08\xc0\xa8\x01\x01', - buf[sctp.cause_restart_with_new_addr._MIN_LEN: - sctp.cause_restart_with_new_addr._MIN_LEN + 8]) - - buf = buf[12:] - res12 = struct.unpack_from( - sctp.cause_user_initiated_abort._PACK_STR, buf) - eq_(sctp.cause_user_initiated_abort.cause_code(), res12[0]) - eq_(19, res12[1]) - eq_(b'Key Interrupt.\x00', - buf[sctp.cause_user_initiated_abort._MIN_LEN: - sctp.cause_user_initiated_abort._MIN_LEN + 15]) - - buf = buf[20:] - res13 = struct.unpack_from( - sctp.cause_protocol_violation._PACK_STR, buf) - eq_(sctp.cause_protocol_violation.cause_code(), res13[0]) - eq_(20, res13[1]) - eq_(b'Unknown reason.\x00', - buf[sctp.cause_protocol_violation._MIN_LEN: - sctp.cause_protocol_violation._MIN_LEN + 16]) - - def test_serialize_with_cookie_echo(self): - self.setUp_with_cookie_echo() - buf = self._test_serialize() - res = struct.unpack_from(sctp.chunk_cookie_echo._PACK_STR, buf) - eq_(sctp.chunk_cookie_echo.chunk_type(), res[0]) - eq_(self.flags, res[1]) - eq_(self.length, res[2]) - eq_(self.cookie, - buf[sctp.chunk_cookie_echo._MIN_LEN: - sctp.chunk_cookie_echo._MIN_LEN + 4]) - - def test_serialize_with_cookie_ack(self): - self.setUp_with_cookie_ack() - buf = self._test_serialize() - res = struct.unpack_from(sctp.chunk_cookie_ack._PACK_STR, buf) - eq_(sctp.chunk_cookie_ack.chunk_type(), res[0]) - eq_(self.flags, res[1]) - eq_(self.length, res[2]) - - def test_serialize_with_ecn_echo(self): - self.setUp_with_ecn_echo() - buf = self._test_serialize() - res = struct.unpack_from(sctp.chunk_ecn_echo._PACK_STR, buf) - eq_(sctp.chunk_ecn_echo.chunk_type(), res[0]) - eq_(self.flags, res[1]) - eq_(self.length, res[2]) - eq_(self.low_tsn, res[3]) - - def test_serialize_with_cwr(self): - self.setUp_with_cwr() - buf = self._test_serialize() - res = struct.unpack_from(sctp.chunk_cwr._PACK_STR, buf) - eq_(sctp.chunk_cwr.chunk_type(), res[0]) - eq_(self.flags, res[1]) - eq_(self.length, res[2]) - eq_(self.low_tsn, res[3]) - - def test_serialize_with_shutdown_complete(self): - self.setUp_with_shutdown_complete() - buf = self._test_serialize() - res = struct.unpack_from( - sctp.chunk_shutdown_complete._PACK_STR, buf) - eq_(sctp.chunk_shutdown_complete.chunk_type(), res[0]) - flags = self.tflag << 0 - eq_(flags, res[1]) - eq_(self.length, res[2]) - - def test_serialize_with_multi_chunks(self): - self.setUp_with_multi_chunks() - buf = self._test_serialize() - res = struct.unpack_from(sctp.chunk_sack._PACK_STR, buf) - eq_(sctp.chunk_sack.chunk_type(), res[0]) - eq_(self.s_flags, res[1]) - eq_(self.s_length, res[2]) - eq_(self.s_tsn_ack, res[3]) - eq_(self.s_a_rwnd, res[4]) - eq_(self.s_gapack_num, res[5]) - eq_(self.s_duptsn_num, res[6]) - - buf = buf[self.s_length:] - res = struct.unpack_from(sctp.chunk_data._PACK_STR, buf) - eq_(sctp.chunk_data.chunk_type(), res[0]) - d1_flags = ( - (self.d1_unordered << 2) | - (self.d1_begin << 1) | - (self.d1_end << 0)) - eq_(d1_flags, res[1]) - eq_(self.d1_length, res[2]) - eq_(self.d1_tsn, res[3]) - eq_(self.d1_sid, res[4]) - eq_(self.d1_seq, res[5]) - eq_(self.d1_payload_id, res[6]) - eq_(self.d1_payload_data, - buf[sctp.chunk_data._MIN_LEN: - sctp.chunk_data._MIN_LEN + 10]) - - buf = buf[self.d1_length:] - res = struct.unpack_from(sctp.chunk_data._PACK_STR, buf) - eq_(sctp.chunk_data.chunk_type(), res[0]) - d2_flags = ( - (self.d2_unordered << 2) | - (self.d2_begin << 1) | - (self.d2_end << 0)) - eq_(d2_flags, res[1]) - eq_(self.d2_length, res[2]) - eq_(self.d2_tsn, res[3]) - eq_(self.d2_sid, res[4]) - eq_(self.d2_seq, res[5]) - eq_(self.d2_payload_id, res[6]) - eq_(self.d2_payload_data, - buf[sctp.chunk_data._MIN_LEN: - sctp.chunk_data._MIN_LEN + 10]) - - def test_build_sctp(self): - eth = ethernet.ethernet('00:aa:aa:aa:aa:aa', '00:bb:bb:bb:bb:bb', - ether.ETH_TYPE_IP) - ip4 = ipv4.ipv4(4, 5, 16, 0, 0, 2, 0, 64, inet.IPPROTO_SCTP, 0, - '192.168.1.1', '10.144.1.1') - pkt = eth / ip4 / self.sc - - eth = pkt.get_protocol(ethernet.ethernet) - ok_(eth) - eq_(eth.ethertype, ether.ETH_TYPE_IP) - - ip4 = pkt.get_protocol(ipv4.ipv4) - ok_(ip4) - eq_(ip4.proto, inet.IPPROTO_SCTP) - - sc = pkt.get_protocol(sctp.sctp) - ok_(sc) - eq_(sc, self.sc) - - def test_build_sctp_with_data(self): - self.setUp_with_data() - self.test_build_sctp() - - def test_build_sctp_with_init(self): - self.setUp_with_init() - self.test_build_sctp() - - def test_build_sctp_with_init_ack(self): - self.setUp_with_init_ack() - self.test_build_sctp() - - def test_build_sctp_with_sack(self): - self.setUp_with_sack() - self.test_build_sctp() - - def test_build_sctp_with_heartbeat(self): - self.setUp_with_heartbeat() - self.test_build_sctp() - - def test_build_sctp_with_heartbeat_ack(self): - self.setUp_with_heartbeat_ack() - self.test_build_sctp() - - def test_build_sctp_with_abort(self): - self.setUp_with_abort() - self.test_build_sctp() - - def test_build_sctp_with_shutdown(self): - self.setUp_with_shutdown() - self.test_build_sctp() - - def test_build_sctp_with_shutdown_ack(self): - self.setUp_with_shutdown_ack() - self.test_build_sctp() - - def test_build_sctp_with_error(self): - self.setUp_with_error() - self.test_build_sctp() - - def test_build_sctp_with_cookie_echo(self): - self.setUp_with_cookie_echo() - self.test_build_sctp() - - def test_build_sctp_with_cookie_ack(self): - self.setUp_with_cookie_ack() - self.test_build_sctp() - - def test_build_sctp_with_ecn_echo(self): - self.setUp_with_ecn_echo() - self.test_build_sctp() - - def test_build_sctp_with_cwr(self): - self.setUp_with_cwr() - self.test_build_sctp() - - def test_build_sctp_with_shutdown_complete(self): - self.setUp_with_shutdown_complete() - self.test_build_sctp() - - def tset_build_sctp_with_multi_chunks(self): - self.setUp_with_multi_chunks() - self.test_build_sctp() - - def test_to_string(self): - sctp_values = {'src_port': self.src_port, - 'dst_port': self.dst_port, - 'vtag': self.vtag, - 'csum': self.csum, - 'chunks': self.chunks} - _sctp_str = ','.join(['%s=%s' % (k, sctp_values[k]) - for k, _ in inspect.getmembers(self.sc) - if k in sctp_values]) - sctp_str = '%s(%s)' % (sctp.sctp.__name__, _sctp_str) - - eq_(str(self.sc), sctp_str) - eq_(repr(self.sc), sctp_str) - - def test_to_string_with_data(self): - self.setUp_with_data() - self.test_to_string() - - def test_to_string_with_init(self): - self.setUp_with_init() - self.test_to_string() - - def test_to_string_with_init_ack(self): - self.setUp_with_init_ack() - self.test_to_string() - - def test_to_string_with_sack(self): - self.setUp_with_sack() - self.test_to_string() - - def test_to_string_with_heartbeat(self): - self.setUp_with_heartbeat() - self.test_to_string() - - def test_to_string_with_heartbeat_ack(self): - self.setUp_with_heartbeat_ack() - self.test_to_string() - - def test_to_string_with_abort(self): - self.setUp_with_abort() - self.test_to_string() - - def test_to_string_with_shutdown(self): - self.setUp_with_shutdown() - self.test_to_string() - - def test_to_string_with_shutdown_ack(self): - self.setUp_with_shutdown_ack() - self.test_to_string() - - def test_to_string_with_error(self): - self.setUp_with_error() - self.test_to_string() - - def test_to_string_with_cookie_echo(self): - self.setUp_with_cookie_echo() - self.test_to_string() - - def test_to_string_with_cookie_ack(self): - self.setUp_with_cookie_ack() - self.test_to_string() - - def test_to_string_with_ecn_echo(self): - self.setUp_with_ecn_echo() - self.test_to_string() - - def test_to_string_with_cwr(self): - self.setUp_with_cwr() - self.test_to_string() - - def test_to_string_with_shutdown_complete(self): - self.setUp_with_shutdown_complete() - self.test_to_string() - - def test_to_string_with_multi_chunks(self): - self.setUp_with_multi_chunks() - self.test_to_string() - - def test_json(self): - jsondict = self.sc.to_jsondict() - sc = sctp.sctp.from_jsondict(jsondict['sctp']) - eq_(str(self.sc), str(sc)) - - def test_json_with_data(self): - self.setUp_with_data() - self.test_json() - - def test_json_with_init(self): - self.setUp_with_init() - self.test_json() - - def test_json_with_init_ack(self): - self.setUp_with_init_ack() - self.test_json() - - def test_json_with_sack(self): - self.setUp_with_sack() - self.test_json() - - def test_json_with_heartbeat(self): - self.setUp_with_heartbeat() - self.test_json() - - def test_json_with_heartbeat_ack(self): - self.setUp_with_heartbeat_ack() - self.test_json() - - def test_json_with_abort(self): - self.setUp_with_abort() - self.test_json() - - def test_json_with_shutdown(self): - self.setUp_with_shutdown() - self.test_json() - - def test_json_with_shutdown_ack(self): - self.setUp_with_shutdown_ack() - self.test_json() - - def test_json_with_error(self): - self.setUp_with_error() - self.test_json() - - def test_json_with_cookie_echo(self): - self.setUp_with_cookie_echo() - self.test_json() - - def test_json_with_cookie_ack(self): - self.setUp_with_cookie_ack() - self.test_json() - - def test_json_with_ecn_echo(self): - self.setUp_with_ecn_echo() - self.test_json() - - def test_json_with_cwr(self): - self.setUp_with_cwr() - self.test_json() - - def test_json_with_shutdown_complete(self): - self.setUp_with_shutdown_complete() - self.test_json() - - def test_json_with_multi_chunks(self): - self.setUp_with_multi_chunks() - self.test_json() diff --git a/tests/unit/packet/test_slow.py b/tests/unit/packet/test_slow.py deleted file mode 100644 index 9e077fd2..00000000 --- a/tests/unit/packet/test_slow.py +++ /dev/null @@ -1,1104 +0,0 @@ -# Copyright (C) 2013 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. - -# vim: tabstop=4 shiftwidth=4 softtabstop=4 - -import copy -import logging -from struct import pack, unpack_from -import unittest - -from nose.tools import ok_, eq_, raises -from ryu.ofproto import ether -from ryu.lib.packet.ethernet import ethernet -from ryu.lib.packet.packet import Packet -from ryu.lib import addrconv -from ryu.lib.packet.slow import slow, lacp -from ryu.lib.packet.slow import SLOW_PROTOCOL_MULTICAST -from ryu.lib.packet.slow import SLOW_SUBTYPE_LACP -from ryu.lib.packet.slow import SLOW_SUBTYPE_MARKER - -LOG = logging.getLogger(__name__) - - -class Test_slow(unittest.TestCase): - """ Test case for Slow Protocol - """ - def setUp(self): - self.subtype = SLOW_SUBTYPE_LACP - self.version = lacp.LACP_VERSION_NUMBER - self.actor_tag = lacp.LACP_TLV_TYPE_ACTOR - self.actor_length = 20 - self.actor_system_priority = 65534 - self.actor_system = '00:07:0d:af:f4:54' - self.actor_key = 1 - self.actor_port_priority = 65535 - self.actor_port = 1 - self.actor_state_activity = lacp.LACP_STATE_ACTIVE - self.actor_state_timeout = lacp.LACP_STATE_LONG_TIMEOUT - self.actor_state_aggregation = lacp.LACP_STATE_AGGREGATEABLE - self.actor_state_synchronization = lacp.LACP_STATE_IN_SYNC - self.actor_state_collecting = lacp.LACP_STATE_COLLECTING_ENABLED - self.actor_state_distributing = lacp.LACP_STATE_DISTRIBUTING_ENABLED - self.actor_state_defaulted = lacp.LACP_STATE_OPERATIONAL_PARTNER - self.actor_state_expired = lacp.LACP_STATE_EXPIRED - self.actor_state = ( - (self.actor_state_activity << 0) | - (self.actor_state_timeout << 1) | - (self.actor_state_aggregation << 2) | - (self.actor_state_synchronization << 3) | - (self.actor_state_collecting << 4) | - (self.actor_state_distributing << 5) | - (self.actor_state_defaulted << 6) | - (self.actor_state_expired << 7)) - self.partner_tag = lacp.LACP_TLV_TYPE_PARTNER - self.partner_length = 20 - self.partner_system_priority = 0 - self.partner_system = '00:00:00:00:00:00' - self.partner_key = 0 - self.partner_port_priority = 0 - self.partner_port = 0 - self.partner_state_activity = 0 - self.partner_state_timeout = lacp.LACP_STATE_SHORT_TIMEOUT - self.partner_state_aggregation = 0 - self.partner_state_synchronization = 0 - self.partner_state_collecting = 0 - self.partner_state_distributing = 0 - self.partner_state_defaulted = 0 - self.partner_state_expired = 0 - self.partner_state = ( - (self.partner_state_activity << 0) | - (self.partner_state_timeout << 1) | - (self.partner_state_aggregation << 2) | - (self.partner_state_synchronization << 3) | - (self.partner_state_collecting << 4) | - (self.partner_state_distributing << 5) | - (self.partner_state_defaulted << 6) | - (self.partner_state_expired << 7)) - self.collector_tag = lacp.LACP_TLV_TYPE_COLLECTOR - self.collector_length = 16 - self.collector_max_delay = 0 - self.terminator_tag = lacp.LACP_TLV_TYPE_TERMINATOR - self.terminator_length = 0 - - self.head_fmt = lacp._HLEN_PACK_STR - self.head_len = lacp._HLEN_PACK_LEN - self.act_fmt = lacp._ACTPRT_INFO_PACK_STR - self.act_len = lacp._ACTPRT_INFO_PACK_LEN - self.prt_fmt = lacp._ACTPRT_INFO_PACK_STR - self.prt_len = lacp._ACTPRT_INFO_PACK_LEN - self.col_fmt = lacp._COL_INFO_PACK_STR - self.col_len = lacp._COL_INFO_PACK_LEN - self.trm_fmt = lacp._TRM_PACK_STR - self.trm_len = lacp._TRM_PACK_LEN - self.length = lacp._ALL_PACK_LEN - - self.head_buf = pack(self.head_fmt, - self.subtype, - self.version) - self.act_buf = pack(self.act_fmt, - self.actor_tag, - self.actor_length, - self.actor_system_priority, - addrconv.mac.text_to_bin(self.actor_system), - self.actor_key, - self.actor_port_priority, - self.actor_port, - self.actor_state) - self.prt_buf = pack(self.prt_fmt, - self.partner_tag, - self.partner_length, - self.partner_system_priority, - addrconv.mac.text_to_bin(self.partner_system), - self.partner_key, - self.partner_port_priority, - self.partner_port, - self.partner_state) - self.col_buf = pack(self.col_fmt, - self.collector_tag, - self.collector_length, - self.collector_max_delay) - self.trm_buf = pack(self.trm_fmt, - self.terminator_tag, - self.terminator_length) - - self.buf = self.head_buf + self.act_buf + self.prt_buf + \ - self.col_buf + self.trm_buf - - def tearDown(self): - pass - - def test_parser(self): - slow.parser(self.buf) - - def test_not_implemented_subtype(self): - not_implemented_buf = pack( - slow._PACK_STR, SLOW_SUBTYPE_MARKER) + self.buf[1:] - (instance, nexttype, last) = slow.parser(not_implemented_buf) - assert None == instance - assert None == nexttype - assert None != last - - def test_invalid_subtype(self): - invalid_buf = b'\xff' + self.buf[1:] - (instance, nexttype, last) = slow.parser(invalid_buf) - assert None == instance - assert None == nexttype - assert None != last - - -class Test_lacp(unittest.TestCase): - """ Test case for lacp - """ - - def setUp(self): - self.subtype = SLOW_SUBTYPE_LACP - self.version = lacp.LACP_VERSION_NUMBER - self.actor_tag = lacp.LACP_TLV_TYPE_ACTOR - self.actor_length = 20 - self.actor_system_priority = 65534 - self.actor_system = '00:07:0d:af:f4:54' - self.actor_key = 1 - self.actor_port_priority = 65535 - self.actor_port = 1 - self.actor_state_activity = lacp.LACP_STATE_ACTIVE - self.actor_state_timeout = lacp.LACP_STATE_LONG_TIMEOUT - self.actor_state_aggregation = lacp.LACP_STATE_AGGREGATEABLE - self.actor_state_synchronization = lacp.LACP_STATE_IN_SYNC - self.actor_state_collecting = lacp.LACP_STATE_COLLECTING_ENABLED - self.actor_state_distributing = lacp.LACP_STATE_DISTRIBUTING_ENABLED - self.actor_state_defaulted = lacp.LACP_STATE_OPERATIONAL_PARTNER - self.actor_state_expired = lacp.LACP_STATE_EXPIRED - self.actor_state = ( - (self.actor_state_activity << 0) | - (self.actor_state_timeout << 1) | - (self.actor_state_aggregation << 2) | - (self.actor_state_synchronization << 3) | - (self.actor_state_collecting << 4) | - (self.actor_state_distributing << 5) | - (self.actor_state_defaulted << 6) | - (self.actor_state_expired << 7)) - self.partner_tag = lacp.LACP_TLV_TYPE_PARTNER - self.partner_length = 20 - self.partner_system_priority = 0 - self.partner_system = '00:00:00:00:00:00' - self.partner_key = 0 - self.partner_port_priority = 0 - self.partner_port = 0 - self.partner_state_activity = 0 - self.partner_state_timeout = lacp.LACP_STATE_SHORT_TIMEOUT - self.partner_state_aggregation = 0 - self.partner_state_synchronization = 0 - self.partner_state_collecting = 0 - self.partner_state_distributing = 0 - self.partner_state_defaulted = 0 - self.partner_state_expired = 0 - self.partner_state = ( - (self.partner_state_activity << 0) | - (self.partner_state_timeout << 1) | - (self.partner_state_aggregation << 2) | - (self.partner_state_synchronization << 3) | - (self.partner_state_collecting << 4) | - (self.partner_state_distributing << 5) | - (self.partner_state_defaulted << 6) | - (self.partner_state_expired << 7)) - self.collector_tag = lacp.LACP_TLV_TYPE_COLLECTOR - self.collector_length = 16 - self.collector_max_delay = 0 - self.terminator_tag = lacp.LACP_TLV_TYPE_TERMINATOR - self.terminator_length = 0 - - self.head_fmt = lacp._HLEN_PACK_STR - self.head_len = lacp._HLEN_PACK_LEN - self.act_fmt = lacp._ACTPRT_INFO_PACK_STR - self.act_len = lacp._ACTPRT_INFO_PACK_LEN - self.prt_fmt = lacp._ACTPRT_INFO_PACK_STR - self.prt_len = lacp._ACTPRT_INFO_PACK_LEN - self.col_fmt = lacp._COL_INFO_PACK_STR - self.col_len = lacp._COL_INFO_PACK_LEN - self.trm_fmt = lacp._TRM_PACK_STR - self.trm_len = lacp._TRM_PACK_LEN - self.length = lacp._ALL_PACK_LEN - - self.head_buf = pack(self.head_fmt, - self.subtype, - self.version) - self.act_buf = pack(self.act_fmt, - self.actor_tag, - self.actor_length, - self.actor_system_priority, - addrconv.mac.text_to_bin(self.actor_system), - self.actor_key, - self.actor_port_priority, - self.actor_port, - self.actor_state) - self.prt_buf = pack(self.prt_fmt, - self.partner_tag, - self.partner_length, - self.partner_system_priority, - addrconv.mac.text_to_bin(self.partner_system), - self.partner_key, - self.partner_port_priority, - self.partner_port, - self.partner_state) - self.col_buf = pack(self.col_fmt, - self.collector_tag, - self.collector_length, - self.collector_max_delay) - self.trm_buf = pack(self.trm_fmt, - self.terminator_tag, - self.terminator_length) - - self.buf = self.head_buf + self.act_buf + self.prt_buf + \ - self.col_buf + self.trm_buf - - self.l = lacp(self.version, - self.actor_system_priority, - self.actor_system, - self.actor_key, - self.actor_port_priority, - self.actor_port, - self.actor_state_activity, - self.actor_state_timeout, - self.actor_state_aggregation, - self.actor_state_synchronization, - self.actor_state_collecting, - self.actor_state_distributing, - self.actor_state_defaulted, - self.actor_state_expired, - self.partner_system_priority, - self.partner_system, - self.partner_key, - self.partner_port_priority, - self.partner_port, - self.partner_state_activity, - self.partner_state_timeout, - self.partner_state_aggregation, - self.partner_state_synchronization, - self.partner_state_collecting, - self.partner_state_distributing, - self.partner_state_defaulted, - self.partner_state_expired, - self.collector_max_delay) - - def tearDown(self): - pass - - def find_protocol(self, pkt, name): - for p in pkt.protocols: - if p.protocol_name == name: - return p - - def test_init(self): - eq_(self.subtype, self.l._subtype) - eq_(self.version, self.l.version) - eq_(self.actor_tag, self.l._actor_tag) - eq_(self.actor_length, self.l._actor_length) - eq_(self.actor_system_priority, self.l.actor_system_priority) - eq_(self.actor_system, self.l.actor_system) - eq_(self.actor_key, self.l.actor_key) - eq_(self.actor_port_priority, self.l.actor_port_priority) - eq_(self.actor_port, self.l.actor_port) - eq_(self.actor_state_activity, self.l.actor_state_activity) - eq_(self.actor_state_timeout, self.l.actor_state_timeout) - eq_(self.actor_state_aggregation, - self.l.actor_state_aggregation) - eq_(self.actor_state_synchronization, - self.l.actor_state_synchronization) - eq_(self.actor_state_collecting, - self.l.actor_state_collecting) - eq_(self.actor_state_distributing, - self.l.actor_state_distributing) - eq_(self.actor_state_defaulted, self.l.actor_state_defaulted) - eq_(self.actor_state_expired, self.l.actor_state_expired) - eq_(self.actor_state, self.l._actor_state) - eq_(self.partner_tag, self.l._partner_tag) - eq_(self.partner_length, self.l._partner_length) - eq_(self.partner_system_priority, - self.l.partner_system_priority) - eq_(self.partner_system, self.l.partner_system) - eq_(self.partner_key, self.l.partner_key) - eq_(self.partner_port_priority, self.l.partner_port_priority) - eq_(self.partner_port, self.l.partner_port) - eq_(self.partner_state_activity, self.l.partner_state_activity) - eq_(self.partner_state_timeout, self.l.partner_state_timeout) - eq_(self.partner_state_aggregation, - self.l.partner_state_aggregation) - eq_(self.partner_state_synchronization, - self.l.partner_state_synchronization) - eq_(self.partner_state_collecting, - self.l.partner_state_collecting) - eq_(self.partner_state_distributing, - self.l.partner_state_distributing) - eq_(self.partner_state_defaulted, - self.l.partner_state_defaulted) - eq_(self.partner_state_expired, self.l.partner_state_expired) - eq_(self.partner_state, self.l._partner_state) - eq_(self.collector_tag, self.l._collector_tag) - eq_(self.collector_length, self.l._collector_length) - eq_(self.collector_max_delay, self.l.collector_max_delay) - eq_(self.terminator_tag, self.l._terminator_tag) - eq_(self.terminator_length, self.l._terminator_length) - - def test_parser(self): - _res = self.l.parser(self.buf) - if type(_res) is tuple: - res = _res[0] - else: - res = _res - - eq_(res._subtype, self.subtype) - eq_(res.version, self.version) - eq_(res._actor_tag, self.actor_tag) - eq_(res._actor_length, self.actor_length) - eq_(res.actor_system_priority, self.actor_system_priority) - eq_(res.actor_system, self.actor_system) - eq_(res.actor_key, self.actor_key) - eq_(res.actor_port_priority, self.actor_port_priority) - eq_(res.actor_port, self.actor_port) - eq_(res.actor_state_activity, self.actor_state_activity) - eq_(res.actor_state_timeout, self.actor_state_timeout) - eq_(res.actor_state_aggregation, self.actor_state_aggregation) - eq_(res.actor_state_synchronization, - self.actor_state_synchronization) - eq_(res.actor_state_collecting, self.actor_state_collecting) - eq_(res.actor_state_distributing, self.actor_state_distributing) - eq_(res.actor_state_defaulted, self.actor_state_defaulted) - eq_(res.actor_state_expired, self.actor_state_expired) - eq_(res._actor_state, self.actor_state) - eq_(res._partner_tag, self.partner_tag) - eq_(res._partner_length, self.partner_length) - eq_(res.partner_system_priority, self.partner_system_priority) - eq_(res.partner_system, self.partner_system) - eq_(res.partner_key, self.partner_key) - eq_(res.partner_port_priority, self.partner_port_priority) - eq_(res.partner_port, self.partner_port) - eq_(res.partner_state_activity, self.partner_state_activity) - eq_(res.partner_state_timeout, self.partner_state_timeout) - eq_(res.partner_state_aggregation, - self.partner_state_aggregation) - eq_(res.partner_state_synchronization, - self.partner_state_synchronization) - eq_(res.partner_state_collecting, self.partner_state_collecting) - eq_(res.partner_state_distributing, - self.partner_state_distributing) - eq_(res.partner_state_defaulted, self.partner_state_defaulted) - eq_(res.partner_state_expired, self.partner_state_expired) - eq_(res._partner_state, self.partner_state) - eq_(res._collector_tag, self.collector_tag) - eq_(res._collector_length, self.collector_length) - eq_(res.collector_max_delay, self.collector_max_delay) - eq_(res._terminator_tag, self.terminator_tag) - eq_(res._terminator_length, self.terminator_length) - - def test_serialize(self): - data = bytearray() - prev = None - buf = self.l.serialize(data, prev) - - offset = 0 - head_res = unpack_from(self.head_fmt, buf, offset) - offset += self.head_len - act_res = unpack_from(self.act_fmt, buf, offset) - offset += self.act_len - prt_res = unpack_from(self.prt_fmt, buf, offset) - offset += self.prt_len - col_res = unpack_from(self.col_fmt, buf, offset) - offset += self.col_len - trm_res = unpack_from(self.trm_fmt, buf, offset) - - eq_(head_res[0], self.subtype) - eq_(head_res[1], self.version) - - eq_(act_res[0], self.actor_tag) - eq_(act_res[1], self.actor_length) - eq_(act_res[2], self.actor_system_priority) - eq_(act_res[3], addrconv.mac.text_to_bin(self.actor_system)) - eq_(act_res[4], self.actor_key) - eq_(act_res[5], self.actor_port_priority) - eq_(act_res[6], self.actor_port) - eq_(act_res[7], self.actor_state) - - eq_(prt_res[0], self.partner_tag) - eq_(prt_res[1], self.partner_length) - eq_(prt_res[2], self.partner_system_priority) - eq_(prt_res[3], addrconv.mac.text_to_bin(self.partner_system)) - eq_(prt_res[4], self.partner_key) - eq_(prt_res[5], self.partner_port_priority) - eq_(prt_res[6], self.partner_port) - eq_(prt_res[7], self.partner_state) - - eq_(col_res[0], self.collector_tag) - eq_(col_res[1], self.collector_length) - eq_(col_res[2], self.collector_max_delay) - - eq_(trm_res[0], self.terminator_tag) - eq_(trm_res[1], self.terminator_length) - - def _build_lacp(self): - ethertype = ether.ETH_TYPE_SLOW - dst = SLOW_PROTOCOL_MULTICAST - e = ethernet(dst, self.actor_system, ethertype) - p = Packet() - - p.add_protocol(e) - p.add_protocol(self.l) - p.serialize() - return p - - def test_build_lacp(self): - p = self._build_lacp() - - e = self.find_protocol(p, "ethernet") - ok_(e) - eq_(e.ethertype, ether.ETH_TYPE_SLOW) - - l = self.find_protocol(p, "lacp") - ok_(l) - - eq_(l._subtype, self.subtype) - eq_(l.version, self.version) - eq_(l._actor_tag, self.actor_tag) - eq_(l._actor_length, self.actor_length) - eq_(l.actor_system_priority, self.actor_system_priority) - eq_(l.actor_system, self.actor_system) - eq_(l.actor_key, self.actor_key) - eq_(l.actor_port_priority, self.actor_port_priority) - eq_(l.actor_port, self.actor_port) - eq_(l.actor_state_activity, self.actor_state_activity) - eq_(l.actor_state_timeout, self.actor_state_timeout) - eq_(l.actor_state_aggregation, self.actor_state_aggregation) - eq_(l.actor_state_synchronization, - self.actor_state_synchronization) - eq_(l.actor_state_collecting, self.actor_state_collecting) - eq_(l.actor_state_distributing, self.actor_state_distributing) - eq_(l.actor_state_defaulted, self.actor_state_defaulted) - eq_(l.actor_state_expired, self.actor_state_expired) - eq_(l._actor_state, self.actor_state) - eq_(l._partner_tag, self.partner_tag) - eq_(l._partner_length, self.partner_length) - eq_(l.partner_system_priority, self.partner_system_priority) - eq_(l.partner_system, self.partner_system) - eq_(l.partner_key, self.partner_key) - eq_(l.partner_port_priority, self.partner_port_priority) - eq_(l.partner_port, self.partner_port) - eq_(l.partner_state_activity, self.partner_state_activity) - eq_(l.partner_state_timeout, self.partner_state_timeout) - eq_(l.partner_state_aggregation, self.partner_state_aggregation) - eq_(l.partner_state_synchronization, - self.partner_state_synchronization) - eq_(l.partner_state_collecting, self.partner_state_collecting) - eq_(l.partner_state_distributing, - self.partner_state_distributing) - eq_(l.partner_state_defaulted, self.partner_state_defaulted) - eq_(l.partner_state_expired, self.partner_state_expired) - eq_(l._partner_state, self.partner_state) - eq_(l._collector_tag, self.collector_tag) - eq_(l._collector_length, self.collector_length) - eq_(l.collector_max_delay, self.collector_max_delay) - eq_(l._terminator_tag, self.terminator_tag) - eq_(l._terminator_length, self.terminator_length) - - @raises(Exception) - def test_malformed_lacp(self): - m_short_buf = self.buf[1:self.length] - slow.parser(m_short_buf) - - @raises(Exception) - def test_invalid_subtype(self): - invalid_lacv = copy.deepcopy(self.l) - invalid_lacv.subtype = 0xff - invalid_buf = invalid_lacv.serialize() - slow.parser(invalid_buf) - - @raises(Exception) - def test_invalid_version(self): - invalid_lacv = copy.deepcopy(self.l) - invalid_lacv.version = 0xff - invalid_buf = invalid_lacv.serialize() - slow.parser(invalid_buf) - - @raises(Exception) - def test_invalid_actor_tag(self): - invalid_lacv = copy.deepcopy(self.l) - invalid_lacv.actor_tag = 0x04 - invalid_buf = invalid_lacv.serialize() - slow.parser(invalid_buf) - - @raises(Exception) - def test_invalid_actor_length(self): - invalid_lacv = copy.deepcopy(self.l) - invalid_lacv.actor_length = 50 - invalid_buf = invalid_lacv.serialize() - slow.parser(invalid_buf) - - @raises(Exception) - def test_invalid_partner_tag(self): - invalid_lacv = copy.deepcopy(self.l) - invalid_lacv.partner_tag = 0x01 - invalid_buf = invalid_lacv.serialize() - slow.parser(invalid_buf) - - @raises(Exception) - def test_invalid_partner_length(self): - invalid_lacv = copy.deepcopy(self.l) - invalid_lacv.partner_length = 0 - invalid_buf = invalid_lacv.serialize() - slow.parser(invalid_buf) - - @raises(Exception) - def test_invalid_collector_tag(self): - invalid_lacv = copy.deepcopy(self.l) - invalid_lacv.collector_tag = 0x00 - invalid_buf = invalid_lacv.serialize() - slow.parser(invalid_buf) - - @raises(Exception) - def test_invalid_collector_length(self): - invalid_lacv = copy.deepcopy(self.l) - invalid_lacv.collector_length = 20 - invalid_buf = invalid_lacv.serialize() - slow.parser(invalid_buf) - - @raises(Exception) - def test_invalid_terminator_tag(self): - invalid_lacv = copy.deepcopy(self.l) - invalid_lacv.terminator_tag = 0x04 - invalid_buf = invalid_lacv.serialize() - slow.parser(invalid_buf) - - @raises(Exception) - def test_invalid_terminator_length(self): - invalid_lacv = copy.deepcopy(self.l) - invalid_lacv.terminator_length = self.trm_len - invalid_buf = invalid_lacv.serialize() - slow.parser(invalid_buf) - - @raises(Exception) - def test_invalid_actor_state_activity(self): - l = lacp(self.version, - self.actor_system_priority, - self.actor_system, - self.actor_key, - self.actor_port_priority, - self.actor_port, - 2, - self.actor_state_timeout, - self.actor_state_aggregation, - self.actor_state_synchronization, - self.actor_state_collecting, - self.actor_state_distributing, - self.actor_state_defaulted, - self.actor_state_expired, - self.partner_system_priority, - self.partner_system, - self.partner_key, - self.partner_port_priority, - self.partner_port, - self.partner_state_activity, - self.partner_state_timeout, - self.partner_state_aggregation, - self.partner_state_synchronization, - self.partner_state_collecting, - self.partner_state_distributing, - self.partner_state_defaulted, - self.partner_state_expired, - self.collector_max_delay) - l.serialize() - - @raises(Exception) - def test_invalid_actor_state_timeout(self): - l = lacp(self.version, - self.actor_system_priority, - self.actor_system, - self.actor_key, - self.actor_port_priority, - self.actor_port, - self.actor_state_activity, - 2, - self.actor_state_aggregation, - self.actor_state_synchronization, - self.actor_state_collecting, - self.actor_state_distributing, - self.actor_state_defaulted, - self.actor_state_expired, - self.partner_system_priority, - self.partner_system, - self.partner_key, - self.partner_port_priority, - self.partner_port, - self.partner_state_activity, - self.partner_state_timeout, - self.partner_state_aggregation, - self.partner_state_synchronization, - self.partner_state_collecting, - self.partner_state_distributing, - self.partner_state_defaulted, - self.partner_state_expired, - self.collector_max_delay) - l.serialize() - - @raises(Exception) - def test_invalid_actor_state_aggregation(self): - l = lacp(self.version, - self.actor_system_priority, - self.actor_system, - self.actor_key, - self.actor_port_priority, - self.actor_port, - self.actor_state_activity, - self.actor_state_timeout, - 2, - self.actor_state_synchronization, - self.actor_state_collecting, - self.actor_state_distributing, - self.actor_state_defaulted, - self.actor_state_expired, - self.partner_system_priority, - self.partner_system, - self.partner_key, - self.partner_port_priority, - self.partner_port, - self.partner_state_activity, - self.partner_state_timeout, - self.partner_state_aggregation, - self.partner_state_synchronization, - self.partner_state_collecting, - self.partner_state_distributing, - self.partner_state_defaulted, - self.partner_state_expired, - self.collector_max_delay) - l.serialize() - - @raises(Exception) - def test_invalid_actor_state_synchronization(self): - l = lacp(self.version, - self.actor_system_priority, - self.actor_system, - self.actor_key, - self.actor_port_priority, - self.actor_port, - self.actor_state_activity, - self.actor_state_timeout, - self.actor_state_aggregation, - 2, - self.actor_state_collecting, - self.actor_state_distributing, - self.actor_state_defaulted, - self.actor_state_expired, - self.partner_system_priority, - self.partner_system, - self.partner_key, - self.partner_port_priority, - self.partner_port, - self.partner_state_activity, - self.partner_state_timeout, - self.partner_state_aggregation, - self.partner_state_synchronization, - self.partner_state_collecting, - self.partner_state_distributing, - self.partner_state_defaulted, - self.partner_state_expired, - self.collector_max_delay) - l.serialize() - - @raises(Exception) - def test_invalid_actor_state_collecting(self): - l = lacp(self.version, - self.actor_system_priority, - self.actor_system, - self.actor_key, - self.actor_port_priority, - self.actor_port, - self.actor_state_activity, - self.actor_state_timeout, - self.actor_state_aggregation, - self.actor_state_synchronization, - 2, - self.actor_state_distributing, - self.actor_state_defaulted, - self.actor_state_expired, - self.partner_system_priority, - self.partner_system, - self.partner_key, - self.partner_port_priority, - self.partner_port, - self.partner_state_activity, - self.partner_state_timeout, - self.partner_state_aggregation, - self.partner_state_synchronization, - self.partner_state_collecting, - self.partner_state_distributing, - self.partner_state_defaulted, - self.partner_state_expired, - self.collector_max_delay) - l.serialize() - - @raises(Exception) - def test_invalid_actor_state_distributing(self): - l = lacp(self.version, - self.actor_system_priority, - self.actor_system, - self.actor_key, - self.actor_port_priority, - self.actor_port, - self.actor_state_activity, - self.actor_state_timeout, - self.actor_state_aggregation, - self.actor_state_synchronization, - self.actor_state_collecting, - 2, - self.actor_state_defaulted, - self.actor_state_expired, - self.partner_system_priority, - self.partner_system, - self.partner_key, - self.partner_port_priority, - self.partner_port, - self.partner_state_activity, - self.partner_state_timeout, - self.partner_state_aggregation, - self.partner_state_synchronization, - self.partner_state_collecting, - self.partner_state_distributing, - self.partner_state_defaulted, - self.partner_state_expired, - self.collector_max_delay) - l.serialize() - - @raises(Exception) - def test_invalid_actor_state_defaulted(self): - l = lacp(self.version, - self.actor_system_priority, - self.actor_system, - self.actor_key, - self.actor_port_priority, - self.actor_port, - self.actor_state_activity, - self.actor_state_timeout, - self.actor_state_aggregation, - self.actor_state_synchronization, - self.actor_state_collecting, - self.actor_state_distributing, - 2, - self.actor_state_expired, - self.partner_system_priority, - self.partner_system, - self.partner_key, - self.partner_port_priority, - self.partner_port, - self.partner_state_activity, - self.partner_state_timeout, - self.partner_state_aggregation, - self.partner_state_synchronization, - self.partner_state_collecting, - self.partner_state_distributing, - self.partner_state_defaulted, - self.partner_state_expired, - self.collector_max_delay) - l.serialize() - - @raises(Exception) - def test_invalid_actor_state_expired(self): - l = lacp(self.version, - self.actor_system_priority, - self.actor_system, - self.actor_key, - self.actor_port_priority, - self.actor_port, - self.actor_state_activity, - self.actor_state_timeout, - self.actor_state_aggregation, - self.actor_state_synchronization, - self.actor_state_collecting, - self.actor_state_distributing, - self.actor_state_defaulted, - 2, - self.partner_system_priority, - self.partner_system, - self.partner_key, - self.partner_port_priority, - self.partner_port, - self.partner_state_activity, - self.partner_state_timeout, - self.partner_state_aggregation, - self.partner_state_synchronization, - self.partner_state_collecting, - self.partner_state_distributing, - self.partner_state_defaulted, - self.partner_state_expired, - self.collector_max_delay) - l.serialize() - - @raises(Exception) - def test_invalid_partner_state_activity(self): - l = lacp(self.version, - self.actor_system_priority, - self.actor_system, - self.actor_key, - self.actor_port_priority, - self.actor_port, - self.actor_state_activity, - self.actor_state_timeout, - self.actor_state_aggregation, - self.actor_state_synchronization, - self.actor_state_collecting, - self.actor_state_distributing, - self.actor_state_defaulted, - self.actor_state_expired, - self.partner_system_priority, - self.partner_system, - self.partner_key, - self.partner_port_priority, - self.partner_port, - -1, - self.partner_state_timeout, - self.partner_state_aggregation, - self.partner_state_synchronization, - self.partner_state_collecting, - self.partner_state_distributing, - self.partner_state_defaulted, - self.partner_state_expired, - self.collector_max_delay) - l.serialize() - - @raises(Exception) - def test_invalid_partner_state_timeout(self): - l = lacp(self.version, - self.actor_system_priority, - self.actor_system, - self.actor_key, - self.actor_port_priority, - self.actor_port, - self.actor_state_activity, - self.actor_state_timeout, - self.actor_state_aggregation, - self.actor_state_synchronization, - self.actor_state_collecting, - self.actor_state_distributing, - self.actor_state_defaulted, - self.actor_state_expired, - self.partner_system_priority, - self.partner_system, - self.partner_key, - self.partner_port_priority, - self.partner_port, - self.partner_state_activity, - -1, - self.partner_state_aggregation, - self.partner_state_synchronization, - self.partner_state_collecting, - self.partner_state_distributing, - self.partner_state_defaulted, - self.partner_state_expired, - self.collector_max_delay) - l.serialize() - - @raises(Exception) - def test_invalid_partner_state_aggregation(self): - l = lacp(self.version, - self.actor_system_priority, - self.actor_system, - self.actor_key, - self.actor_port_priority, - self.actor_port, - self.actor_state_activity, - self.actor_state_timeout, - self.actor_state_aggregation, - self.actor_state_synchronization, - self.actor_state_collecting, - self.actor_state_distributing, - self.actor_state_defaulted, - self.actor_state_expired, - self.partner_system_priority, - self.partner_system, - self.partner_key, - self.partner_port_priority, - self.partner_port, - self.partner_state_activity, - self.partner_state_timeout, - -1, - self.partner_state_synchronization, - self.partner_state_collecting, - self.partner_state_distributing, - self.partner_state_defaulted, - self.partner_state_expired, - self.collector_max_delay) - l.serialize() - - @raises(Exception) - def test_invalid_partner_state_synchronization(self): - l = lacp(self.version, - self.actor_system_priority, - self.actor_system, - self.actor_key, - self.actor_port_priority, - self.actor_port, - self.actor_state_activity, - self.actor_state_timeout, - self.actor_state_aggregation, - self.actor_state_synchronization, - self.actor_state_collecting, - self.actor_state_distributing, - self.actor_state_defaulted, - self.actor_state_expired, - self.partner_system_priority, - self.partner_system, - self.partner_key, - self.partner_port_priority, - self.partner_port, - self.partner_state_activity, - self.partner_state_timeout, - self.partner_state_aggregation, - -1, - self.partner_state_collecting, - self.partner_state_distributing, - self.partner_state_defaulted, - self.partner_state_expired, - self.collector_max_delay) - l.serialize() - - @raises(Exception) - def test_invalid_partner_state_collecting(self): - l = lacp(self.version, - self.actor_system_priority, - self.actor_system, - self.actor_key, - self.actor_port_priority, - self.actor_port, - self.actor_state_activity, - self.actor_state_timeout, - self.actor_state_aggregation, - self.actor_state_synchronization, - self.actor_state_collecting, - self.actor_state_distributing, - self.actor_state_defaulted, - self.actor_state_expired, - self.partner_system_priority, - self.partner_system, - self.partner_key, - self.partner_port_priority, - self.partner_port, - self.partner_state_activity, - self.partner_state_timeout, - self.partner_state_aggregation, - self.partner_state_synchronization, - -1, - self.partner_state_distributing, - self.partner_state_defaulted, - self.partner_state_expired, - self.collector_max_delay) - l.serialize() - - @raises(Exception) - def test_invalid_partner_state_distributing(self): - l = lacp(self.version, - self.actor_system_priority, - self.actor_system, - self.actor_key, - self.actor_port_priority, - self.actor_port, - self.actor_state_activity, - self.actor_state_timeout, - self.actor_state_aggregation, - self.actor_state_synchronization, - self.actor_state_collecting, - self.actor_state_distributing, - self.actor_state_defaulted, - self.actor_state_expired, - self.partner_system_priority, - self.partner_system, - self.partner_key, - self.partner_port_priority, - self.partner_port, - self.partner_state_activity, - self.partner_state_timeout, - self.partner_state_aggregation, - self.partner_state_synchronization, - self.partner_state_collecting, - -1, - self.partner_state_defaulted, - self.partner_state_expired, - self.collector_max_delay) - l.serialize() - - @raises(Exception) - def test_invalid_partner_state_defaulted(self): - l = lacp(self.version, - self.actor_system_priority, - self.actor_system, - self.actor_key, - self.actor_port_priority, - self.actor_port, - self.actor_state_activity, - self.actor_state_timeout, - self.actor_state_aggregation, - self.actor_state_synchronization, - self.actor_state_collecting, - self.actor_state_distributing, - self.actor_state_defaulted, - self.actor_state_expired, - self.partner_system_priority, - self.partner_system, - self.partner_key, - self.partner_port_priority, - self.partner_port, - self.partner_state_activity, - self.partner_state_timeout, - self.partner_state_aggregation, - self.partner_state_synchronization, - self.partner_state_collecting, - self.partner_state_distributing, - -1, - self.partner_state_expired, - self.collector_max_delay) - l.serialize() - - @raises(Exception) - def test_invalid_partner_state_expired(self): - l = lacp(self.version, - self.actor_system_priority, - self.actor_system, - self.actor_key, - self.actor_port_priority, - self.actor_port, - self.actor_state_activity, - self.actor_state_timeout, - self.actor_state_aggregation, - self.actor_state_synchronization, - self.actor_state_collecting, - self.actor_state_distributing, - self.actor_state_defaulted, - self.actor_state_expired, - self.partner_system_priority, - self.partner_system, - self.partner_key, - self.partner_port_priority, - self.partner_port, - self.partner_state_activity, - self.partner_state_timeout, - self.partner_state_aggregation, - self.partner_state_synchronization, - self.partner_state_collecting, - self.partner_state_distributing, - self.partner_state_defaulted, - -1, - self.collector_max_delay) - l.serialize() - - def test_json(self): - jsondict = self.l.to_jsondict() - l = lacp.from_jsondict(jsondict['lacp']) - eq_(str(self.l), str(l)) diff --git a/tests/unit/packet/test_tcp.py b/tests/unit/packet/test_tcp.py deleted file mode 100644 index 7224df0e..00000000 --- a/tests/unit/packet/test_tcp.py +++ /dev/null @@ -1,267 +0,0 @@ -# Copyright (C) 2012-2015 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. - -# vim: tabstop=4 shiftwidth=4 softtabstop=4 - -import unittest -import logging -import six -import struct -from struct import * -from nose.tools import * -from ryu.ofproto import inet -from ryu.lib.packet import tcp -from ryu.lib.packet.ipv4 import ipv4 -from ryu.lib.packet import packet_utils -from ryu.lib import addrconv - - -LOG = logging.getLogger('test_tcp') - - -class Test_tcp(unittest.TestCase): - """ Test case for tcp - """ - src_port = 6431 - dst_port = 8080 - seq = 5 - ack = 1 - offset = 6 - bits = 0b101010 - window_size = 2048 - csum = 12345 - urgent = 128 - option = b'\x01\x02\x03\x04' - - t = tcp.tcp(src_port, dst_port, seq, ack, offset, bits, - window_size, csum, urgent, option) - - buf = pack(tcp.tcp._PACK_STR, src_port, dst_port, seq, ack, - offset << 4, bits, window_size, csum, urgent) - buf += option - - def setUp(self): - pass - - def tearDown(self): - pass - - def test_init(self): - eq_(self.src_port, self.t.src_port) - eq_(self.dst_port, self.t.dst_port) - eq_(self.seq, self.t.seq) - eq_(self.ack, self.t.ack) - eq_(self.offset, self.t.offset) - eq_(self.bits, self.t.bits) - eq_(self.window_size, self.t.window_size) - eq_(self.csum, self.t.csum) - eq_(self.urgent, self.t.urgent) - eq_(self.option, self.t.option) - - def test_parser(self): - r1, r2, _ = self.t.parser(self.buf) - - eq_(self.src_port, r1.src_port) - eq_(self.dst_port, r1.dst_port) - eq_(self.seq, r1.seq) - eq_(self.ack, r1.ack) - eq_(self.offset, r1.offset) - eq_(self.bits, r1.bits) - eq_(self.window_size, r1.window_size) - eq_(self.csum, r1.csum) - eq_(self.urgent, r1.urgent) - eq_(self.option, r1.option) - eq_(None, r2) - - def test_serialize(self): - offset = 5 - csum = 0 - - src_ip = '192.168.10.1' - dst_ip = '192.168.100.1' - prev = ipv4(4, 5, 0, 0, 0, 0, 0, 64, - inet.IPPROTO_TCP, 0, src_ip, dst_ip) - - t = tcp.tcp(self.src_port, self.dst_port, self.seq, self.ack, - offset, self.bits, self.window_size, csum, self.urgent) - buf = t.serialize(bytearray(), prev) - res = struct.unpack(tcp.tcp._PACK_STR, six.binary_type(buf)) - - eq_(res[0], self.src_port) - eq_(res[1], self.dst_port) - eq_(res[2], self.seq) - eq_(res[3], self.ack) - eq_(res[4], offset << 4) - eq_(res[5], self.bits) - eq_(res[6], self.window_size) - eq_(res[8], self.urgent) - - # test __len__ - # offset indicates the number of 32 bit (= 4 bytes) - # words in the TCP Header. - # So, we compare len(tcp) with offset * 4, here. - eq_(offset * 4, len(t)) - - # checksum - ph = struct.pack('!4s4sBBH', - addrconv.ipv4.text_to_bin(src_ip), - addrconv.ipv4.text_to_bin(dst_ip), 0, 6, offset * 4) - d = ph + buf - s = packet_utils.checksum(d) - eq_(0, s) - - def test_serialize_option(self): - # prepare test data - offset = 0 - csum = 0 - option = [ - tcp.TCPOptionMaximumSegmentSize(max_seg_size=1460), - tcp.TCPOptionSACKPermitted(), - tcp.TCPOptionTimestamps(ts_val=287454020, ts_ecr=1432778632), - tcp.TCPOptionNoOperation(), - tcp.TCPOptionWindowScale(shift_cnt=9), - ] - option_buf = ( - b'\x02\x04\x05\xb4' - b'\x04\x02' - b'\x08\x0a\x11\x22\x33\x44\x55\x66\x77\x88' - b'\x01' - b'\x03\x03\x09' - ) - prev = ipv4(4, 5, 0, 0, 0, 0, 0, 64, - inet.IPPROTO_TCP, 0, '192.168.10.1', '192.168.100.1') - - # test serializer - t = tcp.tcp(self.src_port, self.dst_port, self.seq, self.ack, - offset, self.bits, self.window_size, csum, self.urgent, - option) - buf = t.serialize(bytearray(), prev) - r_option_buf = buf[tcp.tcp._MIN_LEN:tcp.tcp._MIN_LEN + len(option_buf)] - eq_(option_buf, r_option_buf) - - # test parser - (r_tcp, _, _) = tcp.tcp.parser(buf) - eq_(str(option), str(r_tcp.option)) - - @raises(Exception) - def test_malformed_tcp(self): - m_short_buf = self.buf[1:tcp.tcp._MIN_LEN] - tcp.tcp.parser(m_short_buf) - - def test_default_args(self): - prev = ipv4(proto=inet.IPPROTO_TCP) - t = tcp.tcp() - buf = t.serialize(bytearray(), prev) - res = struct.unpack(tcp.tcp._PACK_STR, buf) - - eq_(res[0], 1) - eq_(res[1], 1) - eq_(res[2], 0) - eq_(res[3], 0) - eq_(res[4], 5 << 4) - eq_(res[5], 0) - eq_(res[6], 0) - eq_(res[8], 0) - - # with option, without offset - t = tcp.tcp(option=[tcp.TCPOptionMaximumSegmentSize(1460)]) - buf = t.serialize(bytearray(), prev) - res = struct.unpack(tcp.tcp._PACK_STR + '4s', buf) - - eq_(res[0], 1) - eq_(res[1], 1) - eq_(res[2], 0) - eq_(res[3], 0) - eq_(res[4], 6 << 4) - eq_(res[5], 0) - eq_(res[6], 0) - eq_(res[8], 0) - eq_(res[9], b'\x02\x04\x05\xb4') - - # with option, with long offset - t = tcp.tcp(offset=7, option=[tcp.TCPOptionWindowScale(shift_cnt=9)]) - buf = t.serialize(bytearray(), prev) - res = struct.unpack(tcp.tcp._PACK_STR + '8s', buf) - - eq_(res[0], 1) - eq_(res[1], 1) - eq_(res[2], 0) - eq_(res[3], 0) - eq_(res[4], 7 << 4) - eq_(res[5], 0) - eq_(res[6], 0) - eq_(res[8], 0) - eq_(res[9], b'\x03\x03\x09\x00\x00\x00\x00\x00') - - def test_json(self): - jsondict = self.t.to_jsondict() - t = tcp.tcp.from_jsondict(jsondict['tcp']) - eq_(str(self.t), str(t)) - - -class Test_TCPOption(unittest.TestCase): - # prepare test data - input_options = [ - tcp.TCPOptionEndOfOptionList(), - tcp.TCPOptionNoOperation(), - tcp.TCPOptionMaximumSegmentSize(max_seg_size=1460), - tcp.TCPOptionWindowScale(shift_cnt=9), - tcp.TCPOptionSACKPermitted(), - tcp.TCPOptionSACK(blocks=[(1, 2), (3, 4)], length=18), - tcp.TCPOptionTimestamps(ts_val=287454020, ts_ecr=1432778632), - tcp.TCPOptionUserTimeout(granularity=1, user_timeout=564), - tcp.TCPOptionAuthentication( - key_id=1, r_next_key_id=2, - mac=b'abcdefghijkl', length=16), - tcp.TCPOptionUnknown(value=b'foobar', kind=255, length=8), - tcp.TCPOptionUnknown(value=b'', kind=255, length=2), - ] - input_buf = ( - b'\x00' # End of Option List - b'\x01' # No-Operation - b'\x02\x04\x05\xb4' # Maximum Segment Size - b'\x03\x03\x09' # Window Scale - b'\x04\x02' # SACK Permitted - b'\x05\x12' # SACK - b'\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04' - b'\x08\x0a' # Timestamps - b'\x11\x22\x33\x44\x55\x66\x77\x88' - b'\x1c\x04\x82\x34' # User Timeout Option - b'\x1d\x10\x01\x02' # TCP Authentication Option (TCP-AO) - b'abcdefghijkl' - b'\xff\x08' # Unknown with body - b'foobar' - b'\xff\x02' # Unknown - ) - - def test_serialize(self): - output_buf = bytearray() - for option in self.input_options: - output_buf += option.serialize() - eq_(self.input_buf, output_buf) - - def test_parser(self): - buf = self.input_buf - output_options = [] - while buf: - opt, buf = tcp.TCPOption.parser(buf) - output_options.append(opt) - eq_(str(self.input_options), str(output_options)) - - def test_json(self): - for option in self.input_options: - json_dict = option.to_jsondict()[option.__class__.__name__] - output_option = option.__class__.from_jsondict(json_dict) - eq_(str(option), str(output_option)) diff --git a/tests/unit/packet/test_udp.py b/tests/unit/packet/test_udp.py deleted file mode 100644 index 0d7d0aa9..00000000 --- a/tests/unit/packet/test_udp.py +++ /dev/null @@ -1,110 +0,0 @@ -# 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. - -# vim: tabstop=4 shiftwidth=4 softtabstop=4 - -import unittest -import logging -import struct -from struct import * -from nose.tools import * -from ryu.ofproto import ether, inet -from ryu.lib.packet.packet import Packet -from ryu.lib.packet.udp import udp -from ryu.lib.packet.ipv4 import ipv4 -from ryu.lib.packet import packet_utils -from ryu.lib import addrconv - - -LOG = logging.getLogger('test_udp') - - -class Test_udp(unittest.TestCase): - """ Test case for udp - """ - src_port = 6431 - dst_port = 8080 - total_length = 65507 - csum = 12345 - u = udp(src_port, dst_port, total_length, csum) - buf = pack(udp._PACK_STR, src_port, dst_port, total_length, csum) - - def setUp(self): - pass - - def tearDown(self): - pass - - def test_init(self): - eq_(self.src_port, self.u.src_port) - eq_(self.dst_port, self.u.dst_port) - eq_(self.total_length, self.u.total_length) - eq_(self.csum, self.u.csum) - - def test_parser(self): - r1, r2, _ = self.u.parser(self.buf) - - eq_(self.src_port, r1.src_port) - eq_(self.dst_port, r1.dst_port) - eq_(self.total_length, r1.total_length) - eq_(self.csum, r1.csum) - eq_(None, r2) - - def test_serialize(self): - src_port = 6431 - dst_port = 8080 - total_length = 0 - csum = 0 - - src_ip = '192.168.10.1' - dst_ip = '192.168.100.1' - prev = ipv4(4, 5, 0, 0, 0, 0, 0, 64, - inet.IPPROTO_UDP, 0, src_ip, dst_ip) - - u = udp(src_port, dst_port, total_length, csum) - buf = u.serialize(bytearray(), prev) - res = struct.unpack(udp._PACK_STR, buf) - - eq_(res[0], src_port) - eq_(res[1], dst_port) - eq_(res[2], struct.calcsize(udp._PACK_STR)) - - # checksum - ph = struct.pack('!4s4sBBH', - addrconv.ipv4.text_to_bin(src_ip), - addrconv.ipv4.text_to_bin(dst_ip), 0, 17, res[2]) - d = ph + buf + bytearray() - s = packet_utils.checksum(d) - eq_(0, s) - - @raises(Exception) - def test_malformed_udp(self): - m_short_buf = self.buf[1:udp._MIN_LEN] - udp.parser(m_short_buf) - - def test_default_args(self): - prev = ipv4(proto=inet.IPPROTO_UDP) - u = udp() - buf = u.serialize(bytearray(), prev) - res = struct.unpack(udp._PACK_STR, buf) - - eq_(res[0], 1) - eq_(res[1], 1) - eq_(res[2], udp._MIN_LEN) - - def test_json(self): - jsondict = self.u.to_jsondict() - u = udp.from_jsondict(jsondict['udp']) - eq_(str(self.u), str(u)) diff --git a/tests/unit/packet/test_vlan.py b/tests/unit/packet/test_vlan.py deleted file mode 100644 index b8e3a048..00000000 --- a/tests/unit/packet/test_vlan.py +++ /dev/null @@ -1,265 +0,0 @@ -# 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. - -# vim: tabstop=4 shiftwidth=4 softtabstop=4 - -import unittest -import logging -import struct -from struct import * -from nose.tools import * -from ryu.ofproto import ether, inet -from ryu.lib.packet.ethernet import ethernet -from ryu.lib.packet.packet import Packet -from ryu.lib.packet.ipv4 import ipv4 -from ryu.lib.packet.vlan import vlan -from ryu.lib.packet.vlan import svlan - - -LOG = logging.getLogger('test_vlan') - - -class Test_vlan(unittest.TestCase): - """ Test case for vlan - """ - - pcp = 0 - cfi = 0 - vid = 32 - tci = pcp << 15 | cfi << 12 | vid - ethertype = ether.ETH_TYPE_IP - - buf = pack(vlan._PACK_STR, tci, ethertype) - - v = vlan(pcp, cfi, vid, ethertype) - - def setUp(self): - pass - - def tearDown(self): - pass - - def find_protocol(self, pkt, name): - for p in pkt.protocols: - if p.protocol_name == name: - return p - - def test_init(self): - eq_(self.pcp, self.v.pcp) - eq_(self.cfi, self.v.cfi) - eq_(self.vid, self.v.vid) - eq_(self.ethertype, self.v.ethertype) - - def test_parser(self): - res, ptype, _ = self.v.parser(self.buf) - - eq_(res.pcp, self.pcp) - eq_(res.cfi, self.cfi) - eq_(res.vid, self.vid) - eq_(res.ethertype, self.ethertype) - eq_(ptype, ipv4) - - def test_serialize(self): - data = bytearray() - prev = None - buf = self.v.serialize(data, prev) - - fmt = vlan._PACK_STR - res = struct.unpack(fmt, buf) - - eq_(res[0], self.tci) - eq_(res[1], self.ethertype) - - def _build_vlan(self): - src_mac = '00:07:0d:af:f4:54' - dst_mac = '00:00:00:00:00:00' - ethertype = ether.ETH_TYPE_8021Q - e = ethernet(dst_mac, src_mac, ethertype) - - version = 4 - header_length = 20 - tos = 0 - total_length = 24 - identification = 0x8a5d - flags = 0 - offset = 1480 - ttl = 64 - proto = inet.IPPROTO_ICMP - csum = 0xa7f2 - src = '131.151.32.21' - dst = '131.151.32.129' - option = b'TEST' - ip = ipv4(version, header_length, tos, total_length, identification, - flags, offset, ttl, proto, csum, src, dst, option) - - p = Packet() - - p.add_protocol(e) - p.add_protocol(self.v) - p.add_protocol(ip) - p.serialize() - - return p - - def test_build_vlan(self): - p = self._build_vlan() - - e = self.find_protocol(p, "ethernet") - ok_(e) - eq_(e.ethertype, ether.ETH_TYPE_8021Q) - - v = self.find_protocol(p, "vlan") - ok_(v) - eq_(v.ethertype, ether.ETH_TYPE_IP) - - ip = self.find_protocol(p, "ipv4") - ok_(ip) - - eq_(v.pcp, self.pcp) - eq_(v.cfi, self.cfi) - eq_(v.vid, self.vid) - eq_(v.ethertype, self.ethertype) - - @raises(Exception) - def test_malformed_vlan(self): - m_short_buf = self.buf[1:vlan._MIN_LEN] - vlan.parser(m_short_buf) - - def test_json(self): - jsondict = self.v.to_jsondict() - v = vlan.from_jsondict(jsondict['vlan']) - eq_(str(self.v), str(v)) - - -class Test_svlan(unittest.TestCase): - - pcp = 0 - cfi = 0 - vid = 32 - tci = pcp << 15 | cfi << 12 | vid - ethertype = ether.ETH_TYPE_8021Q - - buf = pack(svlan._PACK_STR, tci, ethertype) - - sv = svlan(pcp, cfi, vid, ethertype) - - def setUp(self): - pass - - def tearDown(self): - pass - - def find_protocol(self, pkt, name): - for p in pkt.protocols: - if p.protocol_name == name: - return p - - def test_init(self): - eq_(self.pcp, self.sv.pcp) - eq_(self.cfi, self.sv.cfi) - eq_(self.vid, self.sv.vid) - eq_(self.ethertype, self.sv.ethertype) - - def test_parser(self): - res, ptype, _ = self.sv.parser(self.buf) - - eq_(res.pcp, self.pcp) - eq_(res.cfi, self.cfi) - eq_(res.vid, self.vid) - eq_(res.ethertype, self.ethertype) - eq_(ptype, vlan) - - def test_serialize(self): - data = bytearray() - prev = None - buf = self.sv.serialize(data, prev) - - fmt = svlan._PACK_STR - res = struct.unpack(fmt, buf) - - eq_(res[0], self.tci) - eq_(res[1], self.ethertype) - - def _build_svlan(self): - src_mac = '00:07:0d:af:f4:54' - dst_mac = '00:00:00:00:00:00' - ethertype = ether.ETH_TYPE_8021AD - e = ethernet(dst_mac, src_mac, ethertype) - - pcp = 0 - cfi = 0 - vid = 32 - tci = pcp << 15 | cfi << 12 | vid - ethertype = ether.ETH_TYPE_IP - v = vlan(pcp, cfi, vid, ethertype) - - version = 4 - header_length = 20 - tos = 0 - total_length = 24 - identification = 0x8a5d - flags = 0 - offset = 1480 - ttl = 64 - proto = inet.IPPROTO_ICMP - csum = 0xa7f2 - src = '131.151.32.21' - dst = '131.151.32.129' - option = b'TEST' - ip = ipv4(version, header_length, tos, total_length, identification, - flags, offset, ttl, proto, csum, src, dst, option) - - p = Packet() - - p.add_protocol(e) - p.add_protocol(self.sv) - p.add_protocol(v) - p.add_protocol(ip) - p.serialize() - - return p - - def test_build_svlan(self): - p = self._build_svlan() - - e = self.find_protocol(p, "ethernet") - ok_(e) - eq_(e.ethertype, ether.ETH_TYPE_8021AD) - - sv = self.find_protocol(p, "svlan") - ok_(sv) - eq_(sv.ethertype, ether.ETH_TYPE_8021Q) - - v = self.find_protocol(p, "vlan") - ok_(v) - eq_(v.ethertype, ether.ETH_TYPE_IP) - - ip = self.find_protocol(p, "ipv4") - ok_(ip) - - eq_(sv.pcp, self.pcp) - eq_(sv.cfi, self.cfi) - eq_(sv.vid, self.vid) - eq_(sv.ethertype, self.ethertype) - - @raises(Exception) - def test_malformed_svlan(self): - m_short_buf = self.buf[1:svlan._MIN_LEN] - svlan.parser(m_short_buf) - - def test_json(self): - jsondict = self.sv.to_jsondict() - sv = svlan.from_jsondict(jsondict['svlan']) - eq_(str(self.sv), str(sv)) diff --git a/tests/unit/packet/test_vrrp.py b/tests/unit/packet/test_vrrp.py deleted file mode 100644 index 71c52500..00000000 --- a/tests/unit/packet/test_vrrp.py +++ /dev/null @@ -1,496 +0,0 @@ -# Copyright (C) 2013 Nippon Telegraph and Telephone Corporation. -# Copyright (C) 2013 Isaku Yamahata <yamahata at private email ne 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. - -# vim: tabstop=4 shiftwidth=4 softtabstop=4 - -from __future__ import print_function - -import unittest -import logging -import six -import struct -import inspect - -from nose.tools import eq_, ok_ -from nose.tools import raises - -from ryu.ofproto import inet -from ryu.lib.packet import ipv4 -from ryu.lib.packet import ipv6 -from ryu.lib.packet import packet -from ryu.lib.packet import packet_utils -from ryu.lib.packet import vrrp -from ryu.lib import addrconv - - -LOG = logging.getLogger(__name__) - - -class Test_vrrpv2(unittest.TestCase): - """ Test case for vrrp v2 - """ - version = vrrp.VRRP_VERSION_V2 - type_ = vrrp.VRRP_TYPE_ADVERTISEMENT - vrid = 128 - priority = 100 - count_ip = 1 - auth_type = vrrp.VRRP_AUTH_NO_AUTH - max_adver_int = 100 - checksum = 0 - ip_address = '192.168.0.1' - auth_data = (0, 0) - vrrpv2 = vrrp.vrrpv2.create(type_, vrid, priority, max_adver_int, - [ip_address]) - buf = struct.pack(vrrp.vrrpv2._PACK_STR + '4sII', - vrrp.vrrp_to_version_type(vrrp.VRRP_VERSION_V2, type_), - vrid, priority, count_ip, - auth_type, max_adver_int, checksum, - addrconv.ipv4.text_to_bin(ip_address), - auth_data[0], auth_data[1]) - - def setUp(self): - pass - - def tearDown(self): - pass - - def test_init(self): - eq_(self.type_, self.vrrpv2.type) - eq_(self.vrid, self.vrrpv2.vrid) - eq_(self.priority, self.vrrpv2.priority) - eq_(self.count_ip, self.vrrpv2.count_ip) - eq_(self.auth_type, self.vrrpv2.auth_type) - eq_(1, len(self.vrrpv2.ip_addresses)) - eq_(self.ip_address, self.vrrpv2.ip_addresses[0]) - eq_(self.auth_data, self.vrrpv2.auth_data) - - def test_parser(self): - vrrpv2, _cls, _ = self.vrrpv2.parser(self.buf) - - eq_(self.version, vrrpv2.version) - eq_(self.type_, vrrpv2.type) - eq_(self.vrid, vrrpv2.vrid) - eq_(self.priority, vrrpv2.priority) - eq_(self.count_ip, vrrpv2.count_ip) - eq_(self.auth_type, vrrpv2.auth_type) - eq_(self.max_adver_int, vrrpv2.max_adver_int) - eq_(self.checksum, vrrpv2.checksum) - eq_(1, len(vrrpv2.ip_addresses)) - eq_(str, type(vrrpv2.ip_addresses[0])) - eq_(self.ip_address, vrrpv2.ip_addresses[0]) - eq_(self.auth_data, vrrpv2.auth_data) - - def test_serialize(self): - src_ip = '192.168.0.1' - dst_ip = vrrp.VRRP_IPV4_DST_ADDRESS - prev = ipv4.ipv4(4, 5, 0, 0, 0, 0, 0, vrrp.VRRP_IPV4_TTL, - inet.IPPROTO_VRRP, 0, src_ip, dst_ip) - - type_ = vrrp.VRRP_TYPE_ADVERTISEMENT - vrid = 5 - priority = 10 - max_adver_int = 30 - ip_address = '192.168.0.2' - ip_addresses = [ip_address] - - vrrp_ = vrrp.vrrpv2.create( - type_, vrid, priority, max_adver_int, ip_addresses) - - buf = vrrp_.serialize(bytearray(), prev) - pack_str = vrrp.vrrpv2._PACK_STR + '4sII' - pack_len = struct.calcsize(pack_str) - res = struct.unpack(pack_str, six.binary_type(buf)) - eq_(res[0], vrrp.vrrp_to_version_type(vrrp.VRRP_VERSION_V2, type_)) - eq_(res[1], vrid) - eq_(res[2], priority) - eq_(res[3], len(ip_addresses)) - eq_(res[4], vrrp.VRRP_AUTH_NO_AUTH) - eq_(res[5], max_adver_int) - # res[6] is checksum - eq_(res[7], addrconv.ipv4.text_to_bin(ip_address)) - eq_(res[8], 0) - eq_(res[9], 0) - eq_(len(buf), pack_len) - - # checksum - s = packet_utils.checksum(buf) - eq_(0, s) - - @raises(Exception) - def test_malformed_vrrpv2(self): - m_short_buf = self.buf[1:vrrp.vrrpv2._MIN_LEN] - vrrp.vrrp.parser(m_short_buf) - - def test_create_packet(self): - primary_ip = '192.168.0.2' - p0 = self.vrrpv2.create_packet(primary_ip) - p0.serialize() - p1 = packet.Packet(six.binary_type(p0.data)) - p1.serialize() - eq_(p0.data, p1.data) - - def _test_is_valid(self, type_=None, vrid=None, priority=None, - max_adver_int=None): - if type_ is None: - type_ = self.type_ - if vrid is None: - vrid = self.vrid - if priority is None: - priority = self.priority - if max_adver_int is None: - max_adver_int = self.max_adver_int - - vrrp_ = vrrp.vrrpv2.create(type_, vrid, priority, max_adver_int, - [self.ip_address]) - return vrrp_.is_valid() - - def test_is_valid_ok(self): - ok_(self._test_is_valid()) - - def test_is_valid_ng_type(self): - ok_(not self._test_is_valid(type_=15)) - - def test_is_valid_ng_vrid_min(self): - vrid = vrrp.VRRP_VRID_MIN - 1 - ok_(not self._test_is_valid(vrid=vrid)) - - def test_is_valid_ng_vrid_max(self): - vrid = vrrp.VRRP_VRID_MAX + 1 - ok_(not self._test_is_valid(vrid=vrid)) - - def test_is_valid_ng_priority_min(self): - priority = vrrp.VRRP_PRIORITY_MIN - 1 - ok_(not self._test_is_valid(priority=priority)) - - def test_is_valid_ng_priority_max(self): - priority = vrrp.VRRP_PRIORITY_MAX + 1 - ok_(not self._test_is_valid(priority=priority)) - - def test_is_valid_ng_adver_min(self): - max_adver_int = vrrp.VRRP_V2_MAX_ADVER_INT_MIN - 1 - ok_(not self._test_is_valid(max_adver_int=max_adver_int)) - - def test_is_valid_ng_adver_max(self): - max_adver_int = vrrp.VRRP_V2_MAX_ADVER_INT_MAX + 1 - ok_(not self._test_is_valid(max_adver_int=max_adver_int)) - - def test_to_string(self): - vrrpv2_values = {'version': self.version, - 'type': self.type_, - 'vrid': self.vrid, - 'priority': self.priority, - 'count_ip': self.count_ip, - 'max_adver_int': self.max_adver_int, - 'checksum': self.vrrpv2.checksum, - 'ip_addresses': [self.ip_address], - 'auth_type': self.auth_type, - 'auth_data': self.auth_data, - 'identification': self.vrrpv2.identification} - _vrrpv2_str = ','.join(['%s=%s' % (k, repr(vrrpv2_values[k])) - for k, v in inspect.getmembers(self.vrrpv2) - if k in vrrpv2_values]) - vrrpv2_str = '%s(%s)' % (vrrp.vrrpv2.__name__, _vrrpv2_str) - - eq_(str(self.vrrpv2), vrrpv2_str) - eq_(repr(self.vrrpv2), vrrpv2_str) - - -class Test_vrrpv3_ipv4(unittest.TestCase): - """ Test case for vrrp v3 IPv4 - """ - version = vrrp.VRRP_VERSION_V3 - type_ = vrrp.VRRP_TYPE_ADVERTISEMENT - vrid = 128 - priority = 99 - count_ip = 1 - max_adver_int = 111 - checksum = 0 - ip_address = '192.168.0.1' - vrrpv3 = vrrp.vrrpv3.create(type_, vrid, priority, max_adver_int, - [ip_address]) - buf = struct.pack(vrrp.vrrpv3._PACK_STR + '4s', - vrrp.vrrp_to_version_type(vrrp.VRRP_VERSION_V3, type_), - vrid, priority, count_ip, - max_adver_int, checksum, - addrconv.ipv4.text_to_bin(ip_address)) - - def setUp(self): - pass - - def tearDown(self): - pass - - def test_init(self): - eq_(self.type_, self.vrrpv3.type) - eq_(self.vrid, self.vrrpv3.vrid) - eq_(self.priority, self.vrrpv3.priority) - eq_(self.count_ip, self.vrrpv3.count_ip) - eq_(1, len(self.vrrpv3.ip_addresses)) - eq_(self.ip_address, self.vrrpv3.ip_addresses[0]) - - def test_parser(self): - vrrpv3, _cls, _ = self.vrrpv3.parser(self.buf) - - eq_(self.version, vrrpv3.version) - eq_(self.type_, vrrpv3.type) - eq_(self.vrid, vrrpv3.vrid) - eq_(self.priority, vrrpv3.priority) - eq_(self.count_ip, vrrpv3.count_ip) - eq_(self.max_adver_int, vrrpv3.max_adver_int) - eq_(self.checksum, vrrpv3.checksum) - eq_(1, len(vrrpv3.ip_addresses)) - eq_(str, type(vrrpv3.ip_addresses[0])) - eq_(self.ip_address, vrrpv3.ip_addresses[0]) - - def test_serialize(self): - src_ip = '192.168.0.1' - dst_ip = vrrp.VRRP_IPV4_DST_ADDRESS - prev = ipv4.ipv4(4, 5, 0, 0, 0, 0, 0, vrrp.VRRP_IPV4_TTL, - inet.IPPROTO_VRRP, 0, src_ip, dst_ip) - - type_ = vrrp.VRRP_TYPE_ADVERTISEMENT - vrid = 5 - priority = 10 - max_adver_int = 30 - ip_address = '192.168.0.2' - ip_addresses = [ip_address] - - vrrp_ = vrrp.vrrpv3.create( - type_, vrid, priority, max_adver_int, ip_addresses) - - buf = vrrp_.serialize(bytearray(), prev) - print(len(buf), type(buf), buf) - pack_str = vrrp.vrrpv3._PACK_STR + '4s' - pack_len = struct.calcsize(pack_str) - res = struct.unpack(pack_str, six.binary_type(buf)) - eq_(res[0], vrrp.vrrp_to_version_type(vrrp.VRRP_VERSION_V3, type_)) - eq_(res[1], vrid) - eq_(res[2], priority) - eq_(res[3], len(ip_addresses)) - eq_(res[4], max_adver_int) - # res[5] is checksum - eq_(res[6], addrconv.ipv4.text_to_bin(ip_address)) - eq_(len(buf), pack_len) - print(res) - - # checksum - ph = struct.pack('!4s4sxBH', - addrconv.ipv4.text_to_bin(src_ip), - addrconv.ipv4.text_to_bin(dst_ip), - inet.IPPROTO_VRRP, pack_len) - s = packet_utils.checksum(ph + buf) - eq_(0, s) - - @raises(Exception) - def test_malformed_vrrpv3(self): - m_short_buf = self.buf[1:vrrp.vrrpv3._MIN_LEN] - vrrp.vrrp.parser(m_short_buf) - - def test_create_packet(self): - primary_ip = '192.168.0.2' - p0 = self.vrrpv3.create_packet(primary_ip) - p0.serialize() - p1 = packet.Packet(six.binary_type(p0.data)) - p1.serialize() - eq_(p0.data, p1.data) - - def _test_is_valid(self, type_=None, vrid=None, priority=None, - max_adver_int=None): - if type_ is None: - type_ = self.type_ - if vrid is None: - vrid = self.vrid - if priority is None: - priority = self.priority - if max_adver_int is None: - max_adver_int = self.max_adver_int - - vrrp_ = vrrp.vrrpv3.create(type_, vrid, priority, max_adver_int, - [self.ip_address]) - return vrrp_.is_valid() - - def test_is_valid_ok(self): - ok_(self._test_is_valid()) - - def test_is_valid_ng_type(self): - ok_(not self._test_is_valid(type_=15)) - - def test_is_valid_ng_vrid_min(self): - vrid = vrrp.VRRP_VRID_MIN - 1 - ok_(not self._test_is_valid(vrid=vrid)) - - def test_is_valid_ng_vrid_max(self): - vrid = vrrp.VRRP_VRID_MAX + 1 - ok_(not self._test_is_valid(vrid=vrid)) - - def test_is_valid_ng_priority_min(self): - priority = vrrp.VRRP_PRIORITY_MIN - 1 - ok_(not self._test_is_valid(priority=priority)) - - def test_is_valid_ng_priority_max(self): - priority = vrrp.VRRP_PRIORITY_MAX + 1 - ok_(not self._test_is_valid(priority=priority)) - - def test_is_valid_ng_adver_min(self): - max_adver_int = vrrp.VRRP_V3_MAX_ADVER_INT_MIN - 1 - ok_(not self._test_is_valid(max_adver_int=max_adver_int)) - - def test_is_valid_ng_adver_max(self): - max_adver_int = vrrp.VRRP_V3_MAX_ADVER_INT_MAX + 1 - ok_(not self._test_is_valid(max_adver_int=max_adver_int)) - - def test_to_string(self): - vrrpv3_values = {'version': self.version, - 'type': self.type_, - 'vrid': self.vrid, - 'priority': self.priority, - 'count_ip': self.count_ip, - 'max_adver_int': self.max_adver_int, - 'checksum': self.vrrpv3.checksum, - 'ip_addresses': [self.ip_address], - 'auth_type': None, - 'auth_data': None, - 'identification': self.vrrpv3.identification} - _vrrpv3_str = ','.join(['%s=%s' % (k, repr(vrrpv3_values[k])) - for k, v in inspect.getmembers(self.vrrpv3) - if k in vrrpv3_values]) - vrrpv3_str = '%s(%s)' % (vrrp.vrrpv3.__name__, _vrrpv3_str) - - eq_(str(self.vrrpv3), vrrpv3_str) - eq_(repr(self.vrrpv3), vrrpv3_str) - - -class Test_vrrpv3_ipv6(unittest.TestCase): - """ Test case for vrrp v3 IPv6 - """ - version = vrrp.VRRP_VERSION_V3 - type_ = vrrp.VRRP_TYPE_ADVERTISEMENT - vrid = 128 - priority = 99 - count_ip = 1 - max_adver_int = 111 - checksum = 0 - ip_address = '2001:db8:2000::1' - vrrpv3 = vrrp.vrrpv3.create(type_, vrid, priority, max_adver_int, - [ip_address]) - buf = struct.pack(vrrp.vrrpv3._PACK_STR + '16s', - vrrp.vrrp_to_version_type(vrrp.VRRP_VERSION_V3, type_), - vrid, priority, count_ip, - max_adver_int, checksum, - addrconv.ipv6.text_to_bin(ip_address)) - - def setUp(self): - pass - - def tearDown(self): - pass - - def test_init(self): - eq_(self.type_, self.vrrpv3.type) - eq_(self.vrid, self.vrrpv3.vrid) - eq_(self.priority, self.vrrpv3.priority) - eq_(self.count_ip, self.vrrpv3.count_ip) - eq_(1, len(self.vrrpv3.ip_addresses)) - eq_(self.ip_address, self.vrrpv3.ip_addresses[0]) - - def test_parser(self): - vrrpv3, _cls, _ = self.vrrpv3.parser(self.buf) - - eq_(self.version, vrrpv3.version) - eq_(self.type_, vrrpv3.type) - eq_(self.vrid, vrrpv3.vrid) - eq_(self.priority, vrrpv3.priority) - eq_(self.count_ip, vrrpv3.count_ip) - eq_(self.max_adver_int, vrrpv3.max_adver_int) - eq_(self.checksum, vrrpv3.checksum) - eq_(1, len(vrrpv3.ip_addresses)) - eq_(str, type(vrrpv3.ip_addresses[0])) - eq_(self.ip_address, vrrpv3.ip_addresses[0]) - - def test_serialize(self): - src_ip = '2001:db8:2000::1' - dst_ip = vrrp.VRRP_IPV6_DST_ADDRESS - prev = ipv6.ipv6(6, 0, 0, 0, inet.IPPROTO_VRRP, - vrrp.VRRP_IPV6_HOP_LIMIT, src_ip, dst_ip) - - type_ = vrrp.VRRP_TYPE_ADVERTISEMENT - vrid = 5 - priority = 10 - max_adver_int = 30 - ip_address = '2001:db8:2000::2' - ip_addresses = [ip_address] - - vrrp_ = vrrp.vrrpv3.create( - type_, vrid, priority, max_adver_int, ip_addresses) - - buf = vrrp_.serialize(bytearray(), prev) - print(len(buf), type(buf), buf) - pack_str = vrrp.vrrpv3._PACK_STR + '16s' - pack_len = struct.calcsize(pack_str) - res = struct.unpack(pack_str, six.binary_type(buf)) - eq_(res[0], vrrp.vrrp_to_version_type(vrrp.VRRP_VERSION_V3, type_)) - eq_(res[1], vrid) - eq_(res[2], priority) - eq_(res[3], len(ip_addresses)) - eq_(res[4], max_adver_int) - # res[5] is checksum - eq_(res[6], addrconv.ipv6.text_to_bin(ip_address)) - eq_(len(buf), pack_len) - print(res) - - # checksum - ph = struct.pack('!16s16sI3xB', - addrconv.ipv6.text_to_bin(src_ip), - addrconv.ipv6.text_to_bin(dst_ip), - pack_len, inet.IPPROTO_VRRP) - s = packet_utils.checksum(ph + buf) - eq_(0, s) - - @raises(Exception) - def test_malformed_vrrpv3(self): - m_short_buf = self.buf[1:vrrp.vrrpv3._MIN_LEN] - vrrp.vrrp.parser(m_short_buf) - - def test_create_packet(self): - primary_ip = '2001:db8:2000::3' - p0 = self.vrrpv3.create_packet(primary_ip) - p0.serialize() - print(len(p0.data), p0.data) - p1 = packet.Packet(six.binary_type(p0.data)) - p1.serialize() - print(len(p0.data), p0.data) - print(len(p1.data), p1.data) - eq_(p0.data, p1.data) - - def test_to_string(self): - vrrpv3_values = {'version': self.version, - 'type': self.type_, - 'vrid': self.vrid, - 'priority': self.priority, - 'count_ip': self.count_ip, - 'max_adver_int': self.max_adver_int, - 'checksum': self.vrrpv3.checksum, - 'ip_addresses': [self.ip_address], - 'auth_type': None, - 'auth_data': None, - 'identification': self.vrrpv3.identification} - _vrrpv3_str = ','.join(['%s=%s' % (k, repr(vrrpv3_values[k])) - for k, v in inspect.getmembers(self.vrrpv3) - if k in vrrpv3_values]) - vrrpv3_str = '%s(%s)' % (vrrp.vrrpv3.__name__, _vrrpv3_str) - - eq_(str(self.vrrpv3), vrrpv3_str) - eq_(repr(self.vrrpv3), vrrpv3_str) diff --git a/tests/unit/packet/test_vxlan.py b/tests/unit/packet/test_vxlan.py deleted file mode 100644 index 8cace581..00000000 --- a/tests/unit/packet/test_vxlan.py +++ /dev/null @@ -1,82 +0,0 @@ -# Copyright (C) 2016 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 logging -import unittest - -from nose.tools import eq_ -from nose.tools import raises - -from ryu.lib.packet import ethernet -from ryu.lib.packet import vxlan - - -LOG = logging.getLogger(__name__) - - -class Test_vxlan(unittest.TestCase): - """ - Test case for VXLAN (RFC 7348) header encoder/decoder class. - """ - - vni = 0x123456 - buf = ( - b'\x08\x00\x00\x00' # flags = R|R|R|R|I|R|R|R (8 bits) - b'\x12\x34\x56\x00' # vni = 0x123456 (24 bits) - b'test_payload' # for test - ) - pkt = vxlan.vxlan(vni) - jsondict = { - 'vxlan': { - 'vni': vni - } - } - - def test_init(self): - eq_(self.vni, self.pkt.vni) - - def test_parser(self): - parsed_pkt, next_proto_cls, rest_buf = vxlan.vxlan.parser(self.buf) - eq_(self.vni, parsed_pkt.vni) - eq_(ethernet.ethernet, next_proto_cls) - eq_(b'test_payload', rest_buf) - - @raises(AssertionError) - def test_invalid_flags(self): - invalid_flags_bug = ( - b'\x00\x00\x00\x00' # all bits are set to zero - b'\x12\x34\x56\x00' # vni = 0x123456 (24 bits) - ) - vxlan.vxlan.parser(invalid_flags_bug) - - def test_serialize(self): - serialized_buf = self.pkt.serialize(payload=None, prev=None) - eq_(self.buf[:vxlan.vxlan._MIN_LEN], serialized_buf) - - def test_from_jsondict(self): - pkt_from_json = vxlan.vxlan.from_jsondict( - self.jsondict[vxlan.vxlan.__name__]) - eq_(self.vni, pkt_from_json.vni) - - def test_to_jsondict(self): - jsondict_from_pkt = self.pkt.to_jsondict() - eq_(self.jsondict, jsondict_from_pkt) - - def test_vni_from_bin(self): - vni = vxlan.vni_from_bin(b'\x12\x34\x56') - eq_(self.vni, vni) - - def test_vni_to_bin(self): - eq_(b'\x12\x34\x56', vxlan.vni_to_bin(self.vni)) diff --git a/tests/unit/packet/test_zebra.py b/tests/unit/packet/test_zebra.py deleted file mode 100644 index 19ff88de..00000000 --- a/tests/unit/packet/test_zebra.py +++ /dev/null @@ -1,66 +0,0 @@ -# Copyright (C) 2017 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. - -from __future__ import print_function - -import os -import sys -import unittest - -from nose.tools import eq_ -from nose.tools import ok_ -import six - -from ryu.lib import pcaplib -from ryu.lib.packet import packet -from ryu.lib.packet import zebra -from ryu.utils import binary_str - - -PCAP_DATA_DIR = os.path.join( - os.path.dirname(sys.modules[__name__].__file__), - '../../packet_data/pcap/') - - -class Test_zebra(unittest.TestCase): - """ - Test case for ryu.lib.packet.zebra. - """ - - def test_pcap(self): - files = [ - 'zebra_v2', - 'zebra_v3', - ] - - for f in files: - zebra_pcap_file = os.path.join(PCAP_DATA_DIR, f + '.pcap') - # print('*** testing %s' % zebra_pcap_file) - - for _, buf in pcaplib.Reader(open(zebra_pcap_file, 'rb')): - # Checks if Zebra message can be parsed as expected. - pkt = packet.Packet(buf) - zebra_pkts = pkt.get_protocols(zebra.ZebraMessage) - for zebra_pkt in zebra_pkts: - ok_(isinstance(zebra_pkt, zebra.ZebraMessage), - 'Failed to parse Zebra message: %s' % pkt) - ok_(not isinstance(pkt.protocols[-1], - (six.binary_type, bytearray)), - 'Some messages could not be parsed: %s' % pkt) - - # Checks if Zebra message can be serialized as expected. - pkt.serialize() - eq_(buf, pkt.data, - "b'%s' != b'%s'" % (binary_str(buf), binary_str(pkt.data))) |