From 8006c6aa425126529b4017768a9201e4f03964ad Mon Sep 17 00:00:00 2001 From: Ole Troan Date: Mon, 17 Dec 2018 12:02:26 +0100 Subject: [PATCH] PAPI: Add MACAddress object wrapper for vl_api_mac_address_t Change the definition of vl_api_mac_address_t to an aliased type. Change-Id: I1434f316d0fad6a099592f39bceeb8faeaf1d134 Signed-off-by: Ole Troan --- extras/vom/vom/api_types.cpp | 12 ++-- extras/vom/vom/api_types.hpp | 2 +- extras/vom/vom/bridge_domain_arp_entry_cmds.cpp | 4 +- extras/vom/vom/gbp_contract_cmds.cpp | 2 +- extras/vom/vom/gbp_endpoint_cmds.cpp | 2 +- src/plugins/gbp/gbp_api.c | 6 +- src/vat/api_format.c | 10 +-- src/vnet/ethernet/ethernet_types.api | 4 +- src/vnet/ethernet/ethernet_types_api.c | 8 +-- src/vnet/ethernet/ethernet_types_api.h | 11 +-- src/vnet/l2/l2.api | 2 +- src/vnet/l2/l2_api.c | 2 +- src/vpp-api/python/vpp_papi/macaddress.py | 54 +++++++++++++++ src/vpp-api/python/vpp_papi/vpp_format.py | 7 ++ src/vpp-api/python/vpp_papi/vpp_papi.py | 2 + src/vpp-api/python/vpp_papi/vpp_serializer.py | 7 +- src/vpp/api/types.c | 4 +- test/test_bond.py | 4 +- test/test_dhcp.py | 22 +++--- test/test_gbp.py | 91 ++++++++++++------------- test/test_ip4_irb.py | 4 +- test/test_l2_fib.py | 5 +- test/test_l2bd_arp_term.py | 3 +- test/test_nat.py | 14 ++-- test/test_p2p_ethernet.py | 12 ++-- test/test_pppoe.py | 1 - test/test_util.py | 6 +- test/util.py | 4 +- test/vpp_interface.py | 15 ++-- test/vpp_l2.py | 26 +++---- test/vpp_mac.py | 50 -------------- test/vpp_neighbor.py | 6 +- test/vpp_papi_provider.py | 7 +- test/vpp_pppoe_interface.py | 6 +- 34 files changed, 199 insertions(+), 216 deletions(-) create mode 100644 src/vpp-api/python/vpp_papi/macaddress.py delete mode 100644 test/vpp_mac.py diff --git a/extras/vom/vom/api_types.cpp b/extras/vom/vom/api_types.cpp index 418f3e43564..53cd047332a 100644 --- a/extras/vom/vom/api_types.cpp +++ b/extras/vom/vom/api_types.cpp @@ -54,20 +54,16 @@ from_api(const vapi_type_address& v) return addr; } -vapi_type_mac_address -to_api(const mac_address_t& a) +void +to_api(const mac_address_t& a, vapi_type_mac_address& v) { - vapi_type_mac_address v; - - std::copy(std::begin(a.bytes), std::end(a.bytes), v.bytes); - - return (v); + std::copy(std::begin(a.bytes), std::end(a.bytes), v); } mac_address_t from_api(const vapi_type_mac_address& v) { - return mac_address_t(v.bytes); + return mac_address_t(v); } route::prefix_t diff --git a/extras/vom/vom/api_types.hpp b/extras/vom/vom/api_types.hpp index c28ae1e997d..784ace2c293 100644 --- a/extras/vom/vom/api_types.hpp +++ b/extras/vom/vom/api_types.hpp @@ -29,7 +29,7 @@ void to_api(const boost::asio::ip::address& a, vapi_type_ip4_address& v); ip_address_t from_api(const vapi_type_address& v); ip_address_t from_api(const vapi_type_ip4_address& v); -vapi_type_mac_address to_api(const mac_address_t& a); +void to_api(const mac_address_t& a, vapi_type_mac_address& m); mac_address_t from_api(const vapi_type_mac_address& v); diff --git a/extras/vom/vom/bridge_domain_arp_entry_cmds.cpp b/extras/vom/vom/bridge_domain_arp_entry_cmds.cpp index da5c547bb3b..a72ad3ed874 100644 --- a/extras/vom/vom/bridge_domain_arp_entry_cmds.cpp +++ b/extras/vom/vom/bridge_domain_arp_entry_cmds.cpp @@ -45,7 +45,7 @@ create_cmd::issue(connection& con) auto& payload = req.get_request().get_payload(); payload.bd_id = m_bd; payload.is_add = 1; - payload.mac = to_api(m_mac); + to_api(m_mac, payload.mac); to_api(m_ip_addr, payload.ip); VAPI_CALL(req.execute()); @@ -90,7 +90,7 @@ delete_cmd::issue(connection& con) auto& payload = req.get_request().get_payload(); payload.bd_id = m_bd; payload.is_add = 0; - payload.mac = to_api(m_mac); + to_api(m_mac, payload.mac); to_api(m_ip_addr, payload.ip); VAPI_CALL(req.execute()); diff --git a/extras/vom/vom/gbp_contract_cmds.cpp b/extras/vom/vom/gbp_contract_cmds.cpp index 1a3975b832a..8b15e8cb519 100644 --- a/extras/vom/vom/gbp_contract_cmds.cpp +++ b/extras/vom/vom/gbp_contract_cmds.cpp @@ -78,7 +78,7 @@ create_cmd::issue(connection& con) payload.contract.rules[ii].nh_set.n_nhs = nh_size; while (jj < nh_size) { to_api(nh_it->getIp(), payload.contract.rules[ii].nh_set.nhs[jj].ip); - payload.contract.rules[ii].nh_set.nhs[jj].mac = to_api(nh_it->getMac()); + to_api(nh_it->getMac(), payload.contract.rules[ii].nh_set.nhs[jj].mac); payload.contract.rules[ii].nh_set.nhs[jj].bd_id = nh_it->getBdId(); payload.contract.rules[ii].nh_set.nhs[jj].rd_id = nh_it->getRdId(); ++nh_it; diff --git a/extras/vom/vom/gbp_endpoint_cmds.cpp b/extras/vom/vom/gbp_endpoint_cmds.cpp index b15b941b125..2732d1cc297 100644 --- a/extras/vom/vom/gbp_endpoint_cmds.cpp +++ b/extras/vom/vom/gbp_endpoint_cmds.cpp @@ -56,7 +56,7 @@ create_cmd::issue(connection& con) for (n = 0; n < payload.endpoint.n_ips; n++) { to_api(m_ip_addrs[n], payload.endpoint.ips[n]); } - payload.endpoint.mac = to_api(m_mac); + to_api(m_mac, payload.endpoint.mac); VAPI_CALL(req.execute()); diff --git a/src/plugins/gbp/gbp_api.c b/src/plugins/gbp/gbp_api.c index 5f87db8f83c..74355d1c033 100644 --- a/src/plugins/gbp/gbp_api.c +++ b/src/plugins/gbp/gbp_api.c @@ -154,7 +154,7 @@ vl_api_gbp_endpoint_add_t_handler (vl_api_gbp_endpoint_add_t * mp) ip_address_decode (&mp->endpoint.ips[ii], &ips[ii]); } } - mac_address_decode (&mp->endpoint.mac, &mac); + mac_address_decode (mp->endpoint.mac, &mac); if (GBP_ENDPOINT_FLAG_REMOTE & gef) { @@ -260,7 +260,7 @@ gbp_endpoint_send_details (index_t gei, void *args) mp->endpoint.flags = gbp_endpoint_flags_encode (gef->gef_flags); mp->handle = htonl (gei); mp->age = vlib_time_now (vlib_get_main ()) - ge->ge_last_time; - mac_address_encode (&ge->ge_key.gek_mac, &mp->endpoint.mac); + mac_address_encode (&ge->ge_key.gek_mac, mp->endpoint.mac); vec_foreach_index (ii, ge->ge_key.gek_ips) { @@ -821,7 +821,7 @@ gbp_next_hop_decode (const vl_api_gbp_next_hop_t * in, index_t * gnhi) return (VNET_API_ERROR_NO_SUCH_FIB); ip_address_decode (&in->ip, &ip); - mac_address_decode (&in->mac, &mac); + mac_address_decode (in->mac, &mac); *gnhi = gbp_next_hop_alloc (&ip, grd, &mac, gbd); diff --git a/src/vat/api_format.c b/src/vat/api_format.c index fc4c38b52c8..55f5197b5eb 100644 --- a/src/vat/api_format.c +++ b/src/vat/api_format.c @@ -82,14 +82,6 @@ #if VPP_API_TEST_BUILTIN == 0 #include -/* *INDENT-OFF* */ -const mac_address_t ZERO_MAC_ADDRESS = { - .bytes = { - 0, 0, 0, 0, 0, 0, - }, -}; -/* *INDENT-ON* */ - u32 vl (void *p) { @@ -7323,7 +7315,7 @@ static int api_bd_ip_mac_add_del (vat_main_t * vam) { vl_api_address_t ip = VL_API_ZERO_ADDRESS; - vl_api_mac_address_t mac = VL_API_ZERO_MAC_ADDRESS; + vl_api_mac_address_t mac = { 0 }; unformat_input_t *i = vam->input; vl_api_bd_ip_mac_add_del_t *mp; ip46_type_t type; diff --git a/src/vnet/ethernet/ethernet_types.api b/src/vnet/ethernet/ethernet_types.api index c33a02c377a..f945f20910f 100644 --- a/src/vnet/ethernet/ethernet_types.api +++ b/src/vnet/ethernet/ethernet_types.api @@ -14,6 +14,4 @@ * limitations under the License. */ -typedef mac_address { - u8 bytes[6]; -}; +typedef u8 mac_address[6]; diff --git a/src/vnet/ethernet/ethernet_types_api.c b/src/vnet/ethernet/ethernet_types_api.c index 4b84d386e4e..90b630d46be 100644 --- a/src/vnet/ethernet/ethernet_types_api.c +++ b/src/vnet/ethernet/ethernet_types_api.c @@ -30,15 +30,15 @@ #undef vl_printfun void -mac_address_decode (const vl_api_mac_address_t * in, mac_address_t * out) +mac_address_decode (const u8 * in, mac_address_t * out) { - mac_address_from_bytes (out, in->bytes); + mac_address_from_bytes (out, in); } void -mac_address_encode (const mac_address_t * in, vl_api_mac_address_t * out) +mac_address_encode (const mac_address_t * in, u8 * out) { - clib_memcpy_fast (out->bytes, in->bytes, 6); + clib_memcpy_fast (out, in->bytes, 6); } /* diff --git a/src/vnet/ethernet/ethernet_types_api.h b/src/vnet/ethernet/ethernet_types_api.h index b65d9d46c86..e2c638d1fec 100644 --- a/src/vnet/ethernet/ethernet_types_api.h +++ b/src/vnet/ethernet/ethernet_types_api.h @@ -22,15 +22,8 @@ #include -/** - * Forward declarations so we need not #include the API definitions here - */ -struct _vl_api_mac_address; - -extern void mac_address_decode (const struct _vl_api_mac_address *in, - mac_address_t * out); -extern void mac_address_encode (const mac_address_t * in, - struct _vl_api_mac_address *out); +extern void mac_address_decode (const u8 * in, mac_address_t * out); +extern void mac_address_encode (const mac_address_t * in, u8 * out); #endif diff --git a/src/vnet/l2/l2.api b/src/vnet/l2/l2.api index 7c71ea6e151..ea24a71feb5 100644 --- a/src/vnet/l2/l2.api +++ b/src/vnet/l2/l2.api @@ -499,7 +499,7 @@ define bd_ip_mac_details u32 bd_id; u8 is_ipv6; u8 ip_address[16]; - u8 mac_address[6]; + vl_api_mac_address_t mac_address; }; /** \brief Dump bridge domain IP to MAC entries diff --git a/src/vnet/l2/l2_api.c b/src/vnet/l2/l2_api.c index 2fa238eadb3..9e3a47f772b 100644 --- a/src/vnet/l2/l2_api.c +++ b/src/vnet/l2/l2_api.c @@ -883,7 +883,7 @@ vl_api_bd_ip_mac_add_del_t_handler (vl_api_bd_ip_mac_add_del_t * mp) bd_index = p[0]; type = ip_address_decode (&mp->ip, &ip_addr); - mac_address_decode (&mp->mac, &mac); + mac_address_decode (mp->mac, &mac); if (bd_add_del_ip_mac (bd_index, type, &ip_addr, &mac, mp->is_add)) rv = VNET_API_ERROR_UNSPECIFIED; diff --git a/src/vpp-api/python/vpp_papi/macaddress.py b/src/vpp-api/python/vpp_papi/macaddress.py new file mode 100644 index 00000000000..a1003812003 --- /dev/null +++ b/src/vpp-api/python/vpp_papi/macaddress.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016 Cisco and/or its affiliates. +# 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 binascii + + +def mac_pton(s): + '''Convert MAC address as text to binary''' + return binascii.unhexlify(s.replace(':', '')) + + +def mac_ntop(binary): + '''Convert MAC address as binary to text''' + x = b':'.join(binascii.hexlify(binary)[i:i + 2] + for i in range(0, 12, 2)) + return str(x.decode('ascii')) + + +class MACAddress(): + def __init__(self, mac): + '''MAC Address as a text-string (aa:bb:cc:dd:ee:ff) or 6 bytes''' + # Of course Python 2 doesn't distinguish str from bytes + if type(mac) is bytes and len(mac) == 6: + self.mac_binary = mac + self.mac_string = mac_ntop(mac) + else: + self.mac_binary = mac_pton(mac) + self.mac_string = mac + + @property + def packed(self): + return self.mac_binary + + def __len__(self): + return 6 + + def __str__(self): + return self.mac_string + + def __repr__(self): + return '%s(%s)' % (self.__class__.__name__, self.mac_string) diff --git a/src/vpp-api/python/vpp_papi/vpp_format.py b/src/vpp-api/python/vpp_papi/vpp_format.py index 1b880ecd248..fec0667862c 100644 --- a/src/vpp-api/python/vpp_papi/vpp_format.py +++ b/src/vpp-api/python/vpp_papi/vpp_format.py @@ -16,6 +16,7 @@ from socket import inet_pton, inet_ntop, AF_INET6, AF_INET import socket import ipaddress +from . import macaddress # Copies from vl_api_address_t definition ADDRESS_IP4 = 0 @@ -94,6 +95,11 @@ conversion_table = { 'len': o.prefixlen}, 'str': lambda s: format_vl_api_prefix_t(s) }, + 'vl_api_mac_address_t': + { + 'MACAddress': lambda o: o.packed, + 'str': lambda s: macaddress.mac_pton(s) + }, } @@ -118,4 +124,5 @@ conversion_unpacker_table = { 'vl_api_ip4_prefix_t': lambda o: ipaddress.IPv4Network((o.prefix, o.len)), 'vl_api_address_t': lambda o: unformat_api_address_t(o), 'vl_api_prefix_t': lambda o: unformat_api_prefix_t(o), + 'vl_api_mac_address_t': lambda o: macaddress.MACAddress(o), } diff --git a/src/vpp-api/python/vpp_papi/vpp_papi.py b/src/vpp-api/python/vpp_papi/vpp_papi.py index 4de257c6924..9c4ede90d48 100644 --- a/src/vpp-api/python/vpp_papi/vpp_papi.py +++ b/src/vpp-api/python/vpp_papi/vpp_papi.py @@ -28,6 +28,7 @@ import weakref import atexit from . vpp_serializer import VPPType, VPPEnumType, VPPUnionType, BaseTypes from . vpp_serializer import VPPMessage, vpp_get_type, VPPTypeAlias +from . macaddress import MACAddress, mac_pton, mac_ntop logger = logging.getLogger(__name__) @@ -57,6 +58,7 @@ def vpp_atexit(vpp_weakref): vpp_instance.logger.debug('Cleaning up VPP on exit') vpp_instance.disconnect() + if sys.version[0] == '2': def vpp_iterator(d): return d.iteritems() diff --git a/src/vpp-api/python/vpp_papi/vpp_serializer.py b/src/vpp-api/python/vpp_papi/vpp_serializer.py index 418c0243402..d62e3a4a57a 100644 --- a/src/vpp-api/python/vpp_papi/vpp_serializer.py +++ b/src/vpp-api/python/vpp_papi/vpp_serializer.py @@ -30,9 +30,10 @@ import socket logger = logging.getLogger(__name__) if sys.version[0] == '2': - check = lambda d: type(d) is dict + def check(d): type(d) is dict else: - check = lambda d: type(d) is dict or type(d) is bytes + def check(d): type(d) is dict or type(d) is bytes + def conversion_required(data, field_type): if check(data): @@ -101,7 +102,7 @@ class String(object): return b'', 0 p = BaseTypes('u8', length) x, size = p.unpack(data, offset + length_field_size) - x2 = x.split(b'\0',1)[0] + x2 = x.split(b'\0', 1)[0] return (x2.decode('utf8'), size + length_field_size) diff --git a/src/vpp/api/types.c b/src/vpp/api/types.c index 1e36bf5fb69..0a48711c611 100644 --- a/src/vpp/api/types.c +++ b/src/vpp/api/types.c @@ -63,7 +63,7 @@ unformat_vl_api_mac_address (unformat_input_t * input, va_list * args) { vl_api_mac_address_t *mac = va_arg (*args, vl_api_mac_address_t *); - return (unformat (input, "%U",unformat_ethernet_address, mac->bytes)); + return (unformat (input, "%U",unformat_ethernet_address, mac)); } uword @@ -86,6 +86,6 @@ format_vl_api_mac_address (u8 * s, va_list * args) { vl_api_mac_address_t *mac = va_arg (*args, vl_api_mac_address_t *); - return (format (s, "%U", format_ethernet_address, mac->bytes)); + return (format (s, "%U", format_ethernet_address, mac)); } diff --git a/test/test_bond.py b/test/test_bond.py index b955f899190..9926d230564 100644 --- a/test/test_bond.py +++ b/test/test_bond.py @@ -7,8 +7,8 @@ from framework import VppTestCase, VppTestRunner from scapy.packet import Raw from scapy.layers.l2 import Ether from scapy.layers.inet import IP, UDP -from vpp_mac import mactobinary from vpp_bond_interface import VppBondInterface +from vpp_papi import MACAddress class TestBondInterface(VppTestCase): @@ -56,7 +56,7 @@ class TestBondInterface(VppTestCase): # create interface (BondEthernet0) # self.logger.info("create bond") bond0_mac = "02:fe:38:30:59:3c" - mac = mactobinary(bond0_mac) + mac = MACAddress(bond0_mac).packed bond0 = VppBondInterface(self, mode=3, lb=1, diff --git a/test/test_dhcp.py b/test/test_dhcp.py index db3e3f3bab0..3d00f1b8468 100644 --- a/test/test_dhcp.py +++ b/test/test_dhcp.py @@ -8,7 +8,6 @@ from framework import VppTestCase, VppTestRunner, running_extended_tests from vpp_neighbor import VppNeighbor from vpp_ip_route import find_route, VppIpTable from util import mk_ll_addr -from vpp_mac import mactobinary, binarytomac from scapy.layers.l2 import Ether, getmacbyip, ARP from scapy.layers.inet import IP, UDP, ICMP from scapy.layers.inet6 import IPv6, in6_getnsmac @@ -20,6 +19,7 @@ from scapy.layers.dhcp6 import DHCP6, DHCP6_Solicit, DHCP6_RelayForward, \ from socket import AF_INET, AF_INET6 from scapy.utils import inet_pton, inet_ntop from scapy.utils6 import in6_ptop +from vpp_papi import mac_pton DHCP4_CLIENT_PORT = 68 DHCP4_SERVER_PORT = 67 @@ -1218,7 +1218,7 @@ class TestDHCP(VppTestCase): UDP(sport=DHCP4_SERVER_PORT, dport=DHCP4_CLIENT_PORT) / BOOTP(op=1, yiaddr=self.pg3.local_ip4, - chaddr=mactobinary(self.pg3.local_mac)) / + chaddr=mac_pton(self.pg3.local_mac)) / DHCP(options=[('message-type', 'offer'), ('server_id', self.pg3.remote_ip4), 'end'])) @@ -1238,7 +1238,7 @@ class TestDHCP(VppTestCase): IP(src=self.pg3.remote_ip4, dst="255.255.255.255") / UDP(sport=DHCP4_SERVER_PORT, dport=DHCP4_CLIENT_PORT) / BOOTP(op=1, yiaddr=self.pg3.local_ip4, - chaddr=mactobinary(self.pg3.local_mac)) / + chaddr=mac_pton(self.pg3.local_mac)) / DHCP(options=[('message-type', 'ack'), ('subnet_mask', "255.255.255.0"), ('router', self.pg3.remote_ip4), @@ -1267,7 +1267,7 @@ class TestDHCP(VppTestCase): # remove the left over ARP entry self.vapi.ip_neighbor_add_del(self.pg3.sw_if_index, - mactobinary(self.pg3.remote_mac), + mac_pton(self.pg3.remote_mac), self.pg3.remote_ip4, is_add=0) # @@ -1315,7 +1315,7 @@ class TestDHCP(VppTestCase): IP(src=self.pg3.remote_ip4, dst=self.pg3.local_ip4) / UDP(sport=DHCP4_SERVER_PORT, dport=DHCP4_CLIENT_PORT) / BOOTP(op=1, yiaddr=self.pg3.local_ip4, - chaddr=mactobinary(self.pg3.local_mac)) / + chaddr=mac_pton(self.pg3.local_mac)) / DHCP(options=[('message-type', 'ack'), ('subnet_mask', "255.255.255.0"), ('router', self.pg3.remote_ip4), @@ -1373,7 +1373,7 @@ class TestDHCP(VppTestCase): IP(src=self.pg3.remote_ip4, dst=self.pg3.local_ip4) / UDP(sport=DHCP4_SERVER_PORT, dport=DHCP4_CLIENT_PORT) / BOOTP(op=1, yiaddr=self.pg3.local_ip4, - chaddr=mactobinary(self.pg3.local_mac)) / + chaddr=mac_pton(self.pg3.local_mac)) / DHCP(options=[('message-type', 'offer'), ('server_id', self.pg3.remote_ip4), 'end'])) @@ -1394,7 +1394,7 @@ class TestDHCP(VppTestCase): IP(src=self.pg3.remote_ip4, dst=self.pg3.local_ip4) / UDP(sport=DHCP4_SERVER_PORT, dport=DHCP4_CLIENT_PORT) / BOOTP(op=1, yiaddr=self.pg3.local_ip4, - chaddr=mactobinary(self.pg3.local_mac)) / + chaddr=mac_pton(self.pg3.local_mac)) / DHCP(options=[('message-type', 'ack'), ('subnet_mask', "255.255.255.0"), ('router', self.pg3.remote_ip4), @@ -1423,7 +1423,7 @@ class TestDHCP(VppTestCase): # remove the left over ARP entry self.vapi.ip_neighbor_add_del(self.pg3.sw_if_index, - mactobinary(self.pg3.remote_mac), + mac_pton(self.pg3.remote_mac), self.pg3.remote_ip4, is_add=0) @@ -1481,7 +1481,7 @@ class TestDHCP(VppTestCase): UDP(sport=DHCP4_SERVER_PORT, dport=DHCP4_CLIENT_PORT) / BOOTP(op=1, yiaddr=self.pg3.local_ip4, - chaddr=mactobinary(self.pg3.local_mac)) / + chaddr=mac_pton(self.pg3.local_mac)) / DHCP(options=[('message-type', 'offer'), ('server_id', self.pg3.remote_ip4), ('lease_time', lease_time), @@ -1502,7 +1502,7 @@ class TestDHCP(VppTestCase): IP(src=self.pg3.remote_ip4, dst='255.255.255.255') / UDP(sport=DHCP4_SERVER_PORT, dport=DHCP4_CLIENT_PORT) / BOOTP(op=1, yiaddr=self.pg3.local_ip4, - chaddr=mactobinary(self.pg3.local_mac)) / + chaddr=mac_pton(self.pg3.local_mac)) / DHCP(options=[('message-type', 'ack'), ('subnet_mask', '255.255.255.0'), ('router', self.pg3.remote_ip4), @@ -1530,7 +1530,7 @@ class TestDHCP(VppTestCase): # remove the left over ARP entry self.vapi.ip_neighbor_add_del(self.pg3.sw_if_index, - mactobinary(self.pg3.remote_mac), + mac_pton(self.pg3.remote_mac), self.pg3.remote_ip4, is_add=0) diff --git a/test/test_gbp.py b/test/test_gbp.py index efac2de6756..d587759fffa 100644 --- a/test/test_gbp.py +++ b/test/test_gbp.py @@ -14,9 +14,8 @@ from vpp_vxlan_gbp_tunnel import * from vpp_sub_interface import VppDot1QSubint from vpp_ip import * -from vpp_mac import * from vpp_papi_provider import L2_PORT_TYPE -from vpp_papi import VppEnum +from vpp_papi import VppEnum, MACAddress from scapy.packet import Raw from scapy.layers.l2 import Ether, ARP, Dot1Q @@ -35,7 +34,7 @@ def find_gbp_endpoint(test, sw_if_index=None, ip=None, mac=None): if ip: vip = VppIpAddress(ip) if mac: - vmac = VppMacAddress(mac) + vmac = MACAddress(mac) eps = test.vapi.gbp_endpoint_dump() @@ -48,7 +47,7 @@ def find_gbp_endpoint(test, sw_if_index=None, ip=None, mac=None): if vip == eip: return True if mac: - if vmac == ep.endpoint.mac: + if vmac.packed == ep.endpoint.mac: return True return False @@ -66,13 +65,9 @@ class VppGbpEndpoint(VppObject): GBP Endpoint """ - @property - def bin_mac(self): - return self.vmac.bytes - @property def mac(self): - return self.vmac.address + return str(self.vmac) @property def mac(self): @@ -118,9 +113,9 @@ class VppGbpEndpoint(VppObject): self._fip6 = VppIpAddress(fip6) if mac: - self.vmac = VppMacAddress(self.itf.remote_mac) + self.vmac = MACAddress(self.itf.remote_mac) else: - self.vmac = VppMacAddress("00:00:00:00:00:00") + self.vmac = MACAddress("00:00:00:00:00:00") self.flags = flags self.tun_src = VppIpAddress(tun_src) @@ -130,7 +125,7 @@ class VppGbpEndpoint(VppObject): res = self._test.vapi.gbp_endpoint_add( self.itf.sw_if_index, [self.ip4.encode(), self.ip6.encode()], - self.vmac.encode(), + self.vmac.packed, self.epg.epg, self.flags, self.tun_src.encode(), @@ -414,7 +409,7 @@ class VppGbpContractNextHop(): def encode(self): return {'ip': self.ip.encode(), - 'mac': self.mac.encode(), + 'mac': self.mac.packed, 'bd_id': self.bd.bd.bd_id, 'rd_id': self.rd.rd_id} @@ -584,7 +579,7 @@ class TestGBP(VppTestCase): self.create_pg_interfaces(range(9)) self.create_loopback_interfaces(8) - self.router_mac = VppMacAddress("00:11:22:33:44:55") + self.router_mac = MACAddress("00:11:22:33:44:55") for i in self.pg_interfaces: i.admin_up() @@ -671,7 +666,7 @@ class TestGBP(VppTestCase): rx = self.send_and_expect(src, tx, dst) for r in rx: - self.assertEqual(r[Ether].src, self.router_mac.address) + self.assertEqual(r[Ether].src, str(self.router_mac)) self.assertEqual(r[Ether].dst, dst.remote_mac) self.assertEqual(r[IP].dst, dst_ip) self.assertEqual(r[IP].src, src_ip) @@ -681,7 +676,7 @@ class TestGBP(VppTestCase): rx = self.send_and_expect(src, tx, dst) for r in rx: - self.assertEqual(r[Ether].src, self.router_mac.address) + self.assertEqual(r[Ether].src, str(self.router_mac)) self.assertEqual(r[Ether].dst, dst.remote_mac) self.assertEqual(r[IPv6].dst, dst_ip) self.assertEqual(r[IPv6].src, src_ip) @@ -797,7 +792,7 @@ class TestGBP(VppTestCase): VppIpInterfaceBind(self, epg.bvi, epg.rd.t6).add_vpp_config() self.vapi.sw_interface_set_mac_address( epg.bvi.sw_if_index, - self.router_mac.bytes) + self.router_mac.packed) # The BVIs are NAT inside interfaces self.vapi.nat44_interface_add_del_feature(epg.bvi.sw_if_index, @@ -818,10 +813,10 @@ class TestGBP(VppTestCase): # add the BD ARP termination entry for BVI IP epg.bd_arp_ip4 = VppBridgeDomainArpEntry(self, epg.bd.bd, - self.router_mac.address, + str(self.router_mac), epg.bvi_ip4) epg.bd_arp_ip6 = VppBridgeDomainArpEntry(self, epg.bd.bd, - self.router_mac.address, + str(self.router_mac), epg.bvi_ip6) epg.bd_arp_ip4.add_vpp_config() epg.bd_arp_ip6.add_vpp_config() @@ -977,13 +972,13 @@ class TestGBP(VppTestCase): # packets to non-local L3 destinations dropped # pkt_intra_epg_220_ip4 = (Ether(src=self.pg0.remote_mac, - dst=self.router_mac.address) / + dst=str(self.router_mac)) / IP(src=eps[0].ip4.address, dst="10.0.0.99") / UDP(sport=1234, dport=1234) / Raw('\xa5' * 100)) pkt_inter_epg_222_ip4 = (Ether(src=self.pg0.remote_mac, - dst=self.router_mac.address) / + dst=str(self.router_mac)) / IP(src=eps[0].ip4.address, dst="10.0.1.99") / UDP(sport=1234, dport=1234) / @@ -992,7 +987,7 @@ class TestGBP(VppTestCase): self.send_and_assert_no_replies(self.pg0, pkt_intra_epg_220_ip4 * 65) pkt_inter_epg_222_ip6 = (Ether(src=self.pg0.remote_mac, - dst=self.router_mac.address) / + dst=str(self.router_mac)) / IPv6(src=eps[0].ip6.address, dst="2001:10::99") / UDP(sport=1234, dport=1234) / @@ -1120,7 +1115,7 @@ class TestGBP(VppTestCase): UDP(sport=1234, dport=1234) / Raw('\xa5' * 100)) pkt_inter_epg_220_to_222 = (Ether(src=self.pg0.remote_mac, - dst=self.router_mac.address) / + dst=str(self.router_mac)) / IP(src=eps[0].ip4.address, dst=eps[3].ip4.address) / UDP(sport=1234, dport=1234) / @@ -1201,7 +1196,7 @@ class TestGBP(VppTestCase): self.send_and_expect_routed(eps[0].itf, pkt_inter_epg_220_to_222 * 65, eps[3].itf, - self.router_mac.address) + str(self.router_mac)) # # remove both contracts, traffic stops in both directions @@ -1272,7 +1267,7 @@ class TestGBP(VppTestCase): # From an EP to an outside addess: IN2OUT # pkt_inter_epg_220_to_global = (Ether(src=self.pg0.remote_mac, - dst=self.router_mac.address) / + dst=str(self.router_mac)) / IP(src=eps[0].ip4.address, dst="1.1.1.1") / UDP(sport=1234, dport=1234) / @@ -1307,7 +1302,7 @@ class TestGBP(VppTestCase): eps[0].fip4.address) pkt_inter_epg_220_to_global = (Ether(src=self.pg0.remote_mac, - dst=self.router_mac.address) / + dst=str(self.router_mac)) / IPv6(src=eps[0].ip6.address, dst="6001::1") / UDP(sport=1234, dport=1234) / @@ -1321,7 +1316,7 @@ class TestGBP(VppTestCase): # # From a global address to an EP: OUT2IN # - pkt_inter_epg_220_from_global = (Ether(src=self.router_mac.address, + pkt_inter_epg_220_from_global = (Ether(src=str(self.router_mac), dst=self.pg0.remote_mac) / IP(dst=eps[0].fip4.address, src="1.1.1.1") / @@ -1347,7 +1342,7 @@ class TestGBP(VppTestCase): eps[0].itf, eps[0].ip4.address) - pkt_inter_epg_220_from_global = (Ether(src=self.router_mac.address, + pkt_inter_epg_220_from_global = (Ether(src=str(self.router_mac), dst=self.pg0.remote_mac) / IPv6(dst=eps[0].fip6.address, src="6001::1") / @@ -1364,7 +1359,7 @@ class TestGBP(VppTestCase): # IN2OUT2IN # pkt_intra_epg_220_global = (Ether(src=self.pg0.remote_mac, - dst=self.router_mac.address) / + dst=str(self.router_mac)) / IP(src=eps[0].ip4.address, dst=eps[1].fip4.address) / UDP(sport=1234, dport=1234) / @@ -1377,7 +1372,7 @@ class TestGBP(VppTestCase): eps[1].ip4.address) pkt_intra_epg_220_global = (Ether(src=self.pg0.remote_mac, - dst=self.router_mac.address) / + dst=str(self.router_mac)) / IPv6(src=eps[0].ip6.address, dst=eps[1].fip6.address) / UDP(sport=1234, dport=1234) / @@ -2039,7 +2034,7 @@ class TestGBP(VppTestCase): rd1 = VppGbpRouteDomain(self, 2, t4, t6, tun_ip4_uu, tun_ip6_uu) rd1.add_vpp_config() - self.loop0.set_mac(self.router_mac.address) + self.loop0.set_mac(self.router_mac) # # Bind the BVI to the RD @@ -2476,7 +2471,7 @@ class TestGBP(VppTestCase): rd1 = VppGbpRouteDomain(self, 2, t4, t6) rd1.add_vpp_config() - self.loop0.set_mac(self.router_mac.address) + self.loop0.set_mac(self.router_mac) # # Bind the BVI to the RD @@ -2840,19 +2835,19 @@ class TestGBP(VppTestCase): # an L3 switch packet between local EPs in different EPGs # different dest ports on each so the are LB hashed differently # - p4 = [(Ether(src=ep1.mac, dst=self.router_mac.address) / + p4 = [(Ether(src=ep1.mac, dst=str(self.router_mac)) / IP(src=ep1.ip4.address, dst=ep2.ip4.address) / UDP(sport=1234, dport=1234) / Raw('\xa5' * 100)), - (Ether(src=ep2.mac, dst=self.router_mac.address) / + (Ether(src=ep2.mac, dst=str(self.router_mac)) / IP(src=ep2.ip4.address, dst=ep1.ip4.address) / UDP(sport=1234, dport=1234) / Raw('\xa5' * 100))] - p6 = [(Ether(src=ep1.mac, dst=self.router_mac.address) / + p6 = [(Ether(src=ep1.mac, dst=str(self.router_mac)) / IPv6(src=ep1.ip6.address, dst=ep2.ip6.address) / UDP(sport=1234, dport=1234) / Raw('\xa5' * 100)), - (Ether(src=ep2.mac, dst=self.router_mac.address) / + (Ether(src=ep2.mac, dst=str(self.router_mac)) / IPv6(src=ep2.ip6.address, dst=ep1.ip6.address) / UDP(sport=1234, dport=1234) / Raw('\xa5' * 100))] @@ -2907,7 +2902,7 @@ class TestGBP(VppTestCase): dst=self.pg7.local_ip4) / UDP(sport=1234, dport=48879) / VXLAN(vni=444, gpid=221, flags=0x88) / - Ether(src="00:22:22:22:22:33", dst=self.router_mac.address) / + Ether(src="00:22:22:22:22:33", dst=str(self.router_mac)) / IP(src="10.0.0.88", dst=ep1.ip4.address) / UDP(sport=1234, dport=1234) / Raw('\xa5' * 100)) @@ -2925,7 +2920,7 @@ class TestGBP(VppTestCase): dst=self.pg7.local_ip4) / UDP(sport=1234, dport=48879) / VXLAN(vni=444, gpid=221, flags=0x88) / - Ether(src="00:22:22:22:22:33", dst=self.router_mac.address) / + Ether(src="00:22:22:22:22:33", dst=str(self.router_mac)) / IPv6(src="2001:10::88", dst=ep1.ip6.address) / UDP(sport=1234, dport=1234) / Raw('\xa5' * 100)) @@ -2940,11 +2935,11 @@ class TestGBP(VppTestCase): # # L3 switch from local to remote EP # - p4 = [(Ether(src=ep1.mac, dst=self.router_mac.address) / + p4 = [(Ether(src=ep1.mac, dst=str(self.router_mac)) / IP(src=ep1.ip4.address, dst="10.0.0.88") / UDP(sport=1234, dport=1234) / Raw('\xa5' * 100))] - p6 = [(Ether(src=ep1.mac, dst=self.router_mac.address) / + p6 = [(Ether(src=ep1.mac, dst=str(self.router_mac)) / IPv6(src=ep1.ip6.address, dst="2001:10::88") / UDP(sport=1234, dport=1234) / Raw('\xa5' * 100))] @@ -3027,7 +3022,7 @@ class TestGBP(VppTestCase): rd1 = VppGbpRouteDomain(self, 2, t4, t6) rd1.add_vpp_config() - self.loop0.set_mac(self.router_mac.address) + self.loop0.set_mac(self.router_mac) # # Bind the BVI to the RD @@ -3104,12 +3099,12 @@ class TestGBP(VppTestCase): # packets destined to unkown addresses in the BVI's subnet # are ARP'd for # - p4 = (Ether(src=self.pg0.remote_mac, dst=self.router_mac.address) / + p4 = (Ether(src=self.pg0.remote_mac, dst=str(self.router_mac)) / Dot1Q(vlan=100) / IP(src="10.0.0.1", dst="10.0.0.88") / UDP(sport=1234, dport=1234) / Raw('\xa5' * 100)) - p6 = (Ether(src=self.pg0.remote_mac, dst=self.router_mac.address) / + p6 = (Ether(src=self.pg0.remote_mac, dst=str(self.router_mac)) / Dot1Q(vlan=100) / IPv6(src="2001:10::1", dst="2001:10::88") / UDP(sport=1234, dport=1234) / @@ -3165,7 +3160,7 @@ class TestGBP(VppTestCase): dst=self.pg7.local_ip4) / UDP(sport=1234, dport=48879) / VXLAN(vni=444, gpid=220, flags=0x88) / - Ether(src=self.pg0.remote_mac, dst=self.router_mac.address) / + Ether(src=self.pg0.remote_mac, dst=str(self.router_mac)) / IP(src="10.0.0.101", dst="10.0.0.1") / UDP(sport=1234, dport=1234) / Raw('\xa5' * 100)) @@ -3193,7 +3188,7 @@ class TestGBP(VppTestCase): dst=self.pg7.local_ip4) / UDP(sport=1234, dport=48879) / VXLAN(vni=444, gpid=220, flags=0x88) / - Ether(src=self.pg0.remote_mac, dst=self.router_mac.address) / + Ether(src=self.pg0.remote_mac, dst=str(self.router_mac)) / IP(src="10.0.0.101", dst="10.220.0.1") / UDP(sport=1234, dport=1234) / Raw('\xa5' * 100)) @@ -3221,7 +3216,7 @@ class TestGBP(VppTestCase): dst=self.pg7.local_ip4) / UDP(sport=1234, dport=48879) / VXLAN(vni=444, gpid=220, flags=0x88) / - Ether(src=self.pg0.remote_mac, dst=self.router_mac.address) / + Ether(src=self.pg0.remote_mac, dst=str(self.router_mac)) / IP(src="10.0.0.101", dst="10.200.0.1") / UDP(sport=1234, dport=1234) / Raw('\xa5' * 100)) @@ -3234,7 +3229,7 @@ class TestGBP(VppTestCase): # # from the the subnet in EPG 220 beyond the external to remote # - p4 = (Ether(src=self.pg0.remote_mac, dst=self.router_mac.address) / + p4 = (Ether(src=self.pg0.remote_mac, dst=str(self.router_mac)) / Dot1Q(vlan=100) / IP(src="10.220.0.1", dst=rep.ip4.address) / UDP(sport=1234, dport=1234) / @@ -3257,7 +3252,7 @@ class TestGBP(VppTestCase): # from the the subnet in EPG 200 beyond the external to remote # dropped due to no contract # - p4 = (Ether(src=self.pg0.remote_mac, dst=self.router_mac.address) / + p4 = (Ether(src=self.pg0.remote_mac, dst=str(self.router_mac)) / Dot1Q(vlan=100) / IP(src="10.200.0.1", dst=rep.ip4.address) / UDP(sport=1234, dport=1234) / diff --git a/test/test_ip4_irb.py b/test/test_ip4_irb.py index a7fe7875053..8c3830c2d81 100644 --- a/test/test_ip4_irb.py +++ b/test/test_ip4_irb.py @@ -31,7 +31,7 @@ from scapy.layers.l2 import Ether from scapy.layers.inet import IP, UDP from framework import VppTestCase, VppTestRunner -from vpp_mac import mactobinary +from vpp_papi import MACAddress from vpp_papi_provider import L2_PORT_TYPE @@ -265,7 +265,7 @@ class TestIpIrb(VppTestCase): self.send_and_verify_l2_to_ip() # change the BVI's mac and resed traffic - self.loop0.set_mac("00:00:00:11:11:33") + self.loop0.set_mac(MACAddress("00:00:00:11:11:33")) self.send_and_verify_l2_to_ip() # check it wasn't flooded diff --git a/test/test_l2_fib.py b/test/test_l2_fib.py index 436aa10c3ec..1cee58982e5 100644 --- a/test/test_l2_fib.py +++ b/test/test_l2_fib.py @@ -69,6 +69,7 @@ from scapy.layers.inet import IP, UDP from framework import VppTestCase, VppTestRunner from util import Host, ppp +from vpp_papi import mac_pton # from src/vnet/l2/l2_fib.h MAC_EVENT_ACTION_ADD = 0 @@ -205,7 +206,7 @@ class TestL2fib(VppTestCase): swif = pg_if.sw_if_index for host in hosts[swif]: self.vapi.l2fib_add_del( - host.mac, bd_id, swif, static_mac=1) + mac_pton(host.mac), bd_id, swif, static_mac=1) def delete_l2_fib_entry(self, bd_id, hosts): """ @@ -218,7 +219,7 @@ class TestL2fib(VppTestCase): swif = pg_if.sw_if_index for host in hosts[swif]: self.vapi.l2fib_add_del( - host.mac, bd_id, swif, is_add=0) + mac_pton(host.mac), bd_id, swif, is_add=0) def flush_int(self, swif, learned_hosts): """ diff --git a/test/test_l2bd_arp_term.py b/test/test_l2bd_arp_term.py index f25be57d8e4..2321aa7c094 100644 --- a/test/test_l2bd_arp_term.py +++ b/test/test_l2bd_arp_term.py @@ -20,7 +20,6 @@ from scapy.layers.inet6 import IPv6, UDP, ICMPv6ND_NS, ICMPv6ND_RS, \ from framework import VppTestCase, VppTestRunner from util import Host, ppp -from vpp_mac import VppMacAddress, mactobinary class TestL2bdArpTerm(VppTestCase): @@ -72,7 +71,7 @@ class TestL2bdArpTerm(VppTestCase): for e in entries: ip = e.ip4 if is_ipv6 == 0 else e.ip6 self.vapi.bd_ip_mac_add_del(bd_id=bd_id, - mac=VppMacAddress(e.mac).encode(), + mac=e.mac, ip=ip, is_ipv6=is_ipv6, is_add=is_add) diff --git a/test/test_nat.py b/test/test_nat.py index a7ca6d3a6e0..9879b762cc9 100644 --- a/test/test_nat.py +++ b/test/test_nat.py @@ -18,7 +18,7 @@ from util import ppp from ipfix import IPFIX, Set, Template, Data, IPFIXDecoder from time import sleep from util import ip4_range -from vpp_mac import mactobinary +from vpp_papi import mac_pton from syslog_rfc5424_parser import SyslogMessage, ParseError from syslog_rfc5424_parser.constants import SyslogFacility, SyslogSeverity from vpp_papi_provider import SYSLOG_SEVERITY @@ -2952,11 +2952,11 @@ class TestNAT44(MethodHolder): """ NAT44 interfaces without configured IP address """ self.vapi.ip_neighbor_add_del(self.pg7.sw_if_index, - mactobinary(self.pg7.remote_mac), + mac_pton(self.pg7.remote_mac), self.pg7.remote_ip4n, is_static=1) self.vapi.ip_neighbor_add_del(self.pg8.sw_if_index, - mactobinary(self.pg8.remote_mac), + mac_pton(self.pg8.remote_mac), self.pg8.remote_ip4n, is_static=1) @@ -2994,11 +2994,11 @@ class TestNAT44(MethodHolder): """ NAT44 interfaces without configured IP address - 1:1 NAT """ self.vapi.ip_neighbor_add_del(self.pg7.sw_if_index, - mactobinary(self.pg7.remote_mac), + mac_pton(self.pg7.remote_mac), self.pg7.remote_ip4n, is_static=1) self.vapi.ip_neighbor_add_del(self.pg8.sw_if_index, - mactobinary(self.pg8.remote_mac), + mac_pton(self.pg8.remote_mac), self.pg8.remote_ip4n, is_static=1) @@ -3040,11 +3040,11 @@ class TestNAT44(MethodHolder): self.icmp_id_out = 30608 self.vapi.ip_neighbor_add_del(self.pg7.sw_if_index, - mactobinary(self.pg7.remote_mac), + mac_pton(self.pg7.remote_mac), self.pg7.remote_ip4n, is_static=1) self.vapi.ip_neighbor_add_del(self.pg8.sw_if_index, - mactobinary(self.pg8.remote_mac), + mac_pton(self.pg8.remote_mac), self.pg8.remote_ip4n, is_static=1) diff --git a/test/test_p2p_ethernet.py b/test/test_p2p_ethernet.py index f08d0cc2b1f..34a4c24f655 100644 --- a/test/test_p2p_ethernet.py +++ b/test/test_p2p_ethernet.py @@ -13,7 +13,7 @@ from framework import VppTestCase, VppTestRunner from vpp_sub_interface import VppP2PSubint from vpp_ip import DpoProto from vpp_ip_route import VppIpRoute, VppRoutePath -from vpp_mac import mactobinary +from vpp_papi import mac_pton class P2PEthernetAPI(VppTestCase): @@ -33,12 +33,12 @@ class P2PEthernetAPI(VppTestCase): i.admin_up() def create_p2p_ethernet(self, parent_if, sub_id, remote_mac): - p2p = VppP2PSubint(self, parent_if, sub_id, mactobinary(remote_mac)) + p2p = VppP2PSubint(self, parent_if, sub_id, mac_pton(remote_mac)) self.p2p_sub_ifs.append(p2p) def delete_p2p_ethernet(self, parent_if, remote_mac): self.vapi.delete_p2pethernet_subif(parent_if.sw_if_index, - mactobinary(remote_mac)) + mac_pton(remote_mac)) def test_api(self): """delete/create p2p subif""" @@ -79,7 +79,7 @@ class P2PEthernetAPI(VppTestCase): try: macs.append(':'.join(re.findall('..', '{:02x}'.format(mac+i)))) self.vapi.create_p2pethernet_subif(self.pg2.sw_if_index, - mactobinary(macs[i-1]), + mac_pton(macs[i-1]), i) except Exception: self.logger.info("Failed to create subif %d %s" % ( @@ -144,7 +144,7 @@ class P2PEthernetIPV6(VppTestCase): super(P2PEthernetIPV6, self).tearDown() def create_p2p_ethernet(self, parent_if, sub_id, remote_mac): - p2p = VppP2PSubint(self, parent_if, sub_id, mactobinary(remote_mac)) + p2p = VppP2PSubint(self, parent_if, sub_id, mac_pton(remote_mac)) p2p.admin_up() p2p.config_ip6() p2p.disable_ipv6_ra() @@ -389,7 +389,7 @@ class P2PEthernetIPV4(VppTestCase): return dst_if.get_capture(count) def create_p2p_ethernet(self, parent_if, sub_id, remote_mac): - p2p = VppP2PSubint(self, parent_if, sub_id, mactobinary(remote_mac)) + p2p = VppP2PSubint(self, parent_if, sub_id, mac_pton(remote_mac)) p2p.admin_up() p2p.config_ip4() return p2p diff --git a/test/test_pppoe.py b/test/test_pppoe.py index 615b7a0c880..b181f6bced7 100644 --- a/test/test_pppoe.py +++ b/test/test_pppoe.py @@ -14,7 +14,6 @@ from scapy.layers.ppp import PPPoE, PPPoED, PPP from scapy.layers.inet import IP, UDP from scapy.layers.inet6 import IPv6 from scapy.volatile import RandMAC, RandIP -from vpp_mac import mactobinary from util import ppp, ppc import socket diff --git a/test/test_util.py b/test/test_util.py index 49095d85931..01ba8623952 100755 --- a/test/test_util.py +++ b/test/test_util.py @@ -3,15 +3,15 @@ import unittest from framework import VppTestCase, VppTestRunner -from vpp_mac import mactobinary, binarytomac +from vpp_papi import mac_pton, mac_ntop class TestUtil (VppTestCase): """ MAC to binary and back """ def test_mac_to_binary(self): mac = 'aa:bb:cc:dd:ee:ff' - b = mactobinary(mac) - mac2 = binarytomac(b) + b = mac_pton(mac) + mac2 = mac_ntop(b) self.assertEqual(type(mac), type(mac2)) self.assertEqual(mac2, mac) diff --git a/test/util.py b/test/util.py index a3ec6e3326b..9652b803f1d 100644 --- a/test/util.py +++ b/test/util.py @@ -14,7 +14,7 @@ from scapy.layers.inet6 import IPv6, IPv6ExtHdrFragment, IPv6ExtHdrRouting,\ from scapy.utils import hexdump from socket import AF_INET6 from io import BytesIO -from vpp_mac import mactobinary +from vpp_papi import mac_pton def ppp(headline, packet): @@ -130,7 +130,7 @@ class Host(object): @property def bin_mac(self): """ MAC address """ - return mactobinary(self._mac) + return mac_pton(self._mac) @property def ip4(self): diff --git a/test/vpp_interface.py b/test/vpp_interface.py index 3235d3f68c6..719f77b36c7 100644 --- a/test/vpp_interface.py +++ b/test/vpp_interface.py @@ -5,7 +5,7 @@ from abc import abstractmethod, ABCMeta from six import moves from util import Host, mk_ll_addr -from vpp_mac import mactobinary, binarytomac +from vpp_papi import mac_pton, mac_ntop class VppInterface(object): @@ -191,11 +191,10 @@ class VppInterface(object): self._hosts_by_ip6 = {} def set_mac(self, mac): - self._local_mac = mac - self._local_ip6_ll = mk_ll_addr(mac) + self._local_mac = str(mac) + self._local_ip6_ll = mk_ll_addr(self._local_mac) self.test.vapi.sw_interface_set_mac_address( - self.sw_if_index, - mactobinary(self._local_mac)) + self.sw_if_index, mac.packed) def set_sw_if_index(self, sw_if_index): self._sw_if_index = sw_if_index @@ -234,7 +233,7 @@ class VppInterface(object): if intf.sw_if_index == self.sw_if_index: self._name = intf.interface_name.split(b'\0', 1)[0].decode('utf8') - self._local_mac = binarytomac(intf.l2_address) + self._local_mac = mac_ntop(intf.l2_address) self._dump = intf break else: @@ -274,7 +273,7 @@ class VppInterface(object): :param vrf_id: The FIB table / VRF ID. (Default value = 0) """ for host in self._remote_hosts: - macn = mactobinary(host.mac) + macn = mac_pton(host.mac) ipn = host.ip4n self.test.vapi.ip_neighbor_add_del( self.sw_if_index, macn, ipn) @@ -305,7 +304,7 @@ class VppInterface(object): :param vrf_id: The FIB table / VRF ID. (Default value = 0) """ for host in self._remote_hosts: - macn = mactobinary(host.mac) + macn = mac_pton(host.mac) ipn = host.ip6n self.test.vapi.ip_neighbor_add_del( self.sw_if_index, macn, ipn, is_ipv6=1) diff --git a/test/vpp_l2.py b/test/vpp_l2.py index e2f3760f1d1..182f2ce7419 100644 --- a/test/vpp_l2.py +++ b/test/vpp_l2.py @@ -5,8 +5,8 @@ from vpp_object import * from vpp_ip import VppIpAddress -from vpp_mac import VppMacAddress, mactobinary from vpp_lo_interface import VppLoInterface +from vpp_papi import MACAddress class L2_PORT_TYPE: @@ -39,7 +39,7 @@ def find_bridge_domain_port(test, bd_id, sw_if_index): def find_bridge_domain_arp_entry(test, bd_id, mac, ip): - vmac = VppMacAddress(mac) + vmac = MACAddress(mac) vip = VppIpAddress(ip) if vip.version == 4: @@ -50,17 +50,17 @@ def find_bridge_domain_arp_entry(test, bd_id, mac, ip): arps = test.vapi.bd_ip_mac_dump(bd_id) for arp in arps: # do IP addr comparison too once .api is fixed... - if vmac.bytes == arp.mac_address and \ + if vmac.packed == arp.mac_address and \ vip.bytes == arp.ip_address[:n]: return True return False def find_l2_fib_entry(test, bd_id, mac, sw_if_index): - vmac = VppMacAddress(mac) + vmac = MACAddress(mac) lfs = test.vapi.l2_fib_table_dump(bd_id) for lf in lfs: - if vmac.bytes == lf.mac and sw_if_index == lf.sw_if_index: + if vmac.packed == lf.mac and sw_if_index == lf.sw_if_index: return True return False @@ -143,13 +143,13 @@ class VppBridgeDomainArpEntry(VppObject): def __init__(self, test, bd, mac, ip): self._test = test self.bd = bd - self.mac = VppMacAddress(mac) + self.mac = MACAddress(mac) self.ip = VppIpAddress(ip) def add_vpp_config(self): self._test.vapi.bd_ip_mac_add_del( self.bd.bd_id, - self.mac.encode(), + self.mac.packed, self.ip.encode(), is_add=1) self._test.registry.register(self, self._test.logger) @@ -157,14 +157,14 @@ class VppBridgeDomainArpEntry(VppObject): def remove_vpp_config(self): self._test.vapi.bd_ip_mac_add_del( self.bd.bd_id, - self.mac.encode(), + self.mac.packed, self.ip.encode(), is_add=0) def query_vpp_config(self): return find_bridge_domain_arp_entry(self._test, self.bd.bd_id, - self.mac.address, + self.mac.packed, self.ip.address) def __str__(self): @@ -180,7 +180,7 @@ class VppL2FibEntry(VppObject): static_mac=0, filter_mac=0, bvi_mac=-1): self._test = test self.bd = bd - self.mac = VppMacAddress(mac) + self.mac = MACAddress(mac) self.itf = itf self.static_mac = static_mac self.filter_mac = filter_mac @@ -191,7 +191,7 @@ class VppL2FibEntry(VppObject): def add_vpp_config(self): self._test.vapi.l2fib_add_del( - self.mac.address, + self.mac.packed, self.bd.bd_id, self.itf.sw_if_index, is_add=1, @@ -202,7 +202,7 @@ class VppL2FibEntry(VppObject): def remove_vpp_config(self): self._test.vapi.l2fib_add_del( - self.mac.address, + self.mac.packed, self.bd.bd_id, self.itf.sw_if_index, is_add=0) @@ -210,7 +210,7 @@ class VppL2FibEntry(VppObject): def query_vpp_config(self): return find_l2_fib_entry(self._test, self.bd.bd_id, - self.mac.address, + self.mac.packed, self.itf.sw_if_index) def __str__(self): diff --git a/test/vpp_mac.py b/test/vpp_mac.py deleted file mode 100644 index b20bf54634c..00000000000 --- a/test/vpp_mac.py +++ /dev/null @@ -1,50 +0,0 @@ -""" - MAC Types - -""" -import binascii - - -def mactobinary(mac): - """ Convert the : separated format into binary packet data for the API """ - return binascii.unhexlify(mac.replace(':', '')) - - -def binarytomac(binary): - """ Convert binary packed data in a : separated string """ - x = b':'.join(binascii.hexlify(binary)[i:i + 2] - for i in range(0, 12, 2)) - return str(x.decode('ascii')) - - -class VppMacAddress(): - def __init__(self, addr): - self._address = addr - - def encode(self): - return { - 'bytes': self.bytes - } - - @property - def bytes(self): - return mactobinary(self.address) - - @property - def address(self): - return self._address - - def __str__(self): - return self.address - - def __eq__(self, other): - if isinstance(other, self.__class__): - return self.address == other.address - elif hasattr(other, "bytes"): - # vl_api_mac_addres_t - return self.bytes == other.bytes - else: - raise TypeError("Comparing VppMacAddress:%s" - "with unknown type: %s" % - (self, other)) - return False diff --git a/test/vpp_neighbor.py b/test/vpp_neighbor.py index 46854c9ba8c..7815a286fef 100644 --- a/test/vpp_neighbor.py +++ b/test/vpp_neighbor.py @@ -6,7 +6,7 @@ from socket import inet_pton, inet_ntop, AF_INET, AF_INET6 from vpp_object import * -from vpp_mac import mactobinary +from vpp_papi import mac_pton def find_nbr(test, sw_if_index, ip_addr, is_static=0, inet=AF_INET, mac=None): @@ -22,7 +22,7 @@ def find_nbr(test, sw_if_index, ip_addr, is_static=0, inet=AF_INET, mac=None): if nbr_addr == n.ip_address[:s] \ and is_static == n.is_static: if mac: - if n.mac_address == mactobinary(mac): + if n.mac_address == mac_pton(mac): return True else: return True @@ -38,7 +38,7 @@ class VppNeighbor(VppObject): af=AF_INET, is_static=False, is_no_fib_entry=0): self._test = test self.sw_if_index = sw_if_index - self.mac_addr = mactobinary(mac_addr) + self.mac_addr = mac_pton(mac_addr) self.af = af self.is_static = is_static self.is_no_fib_entry = is_no_fib_entry diff --git a/test/vpp_papi_provider.py b/test/vpp_papi_provider.py index 4812cb6ef70..0a33c1eb2ac 100644 --- a/test/vpp_papi_provider.py +++ b/test/vpp_papi_provider.py @@ -4,7 +4,7 @@ import time from collections import deque from six import moves -from vpp_mac import mactobinary +from vpp_papi import mac_pton from hook import Hook from vpp_l2 import L2_PORT_TYPE @@ -223,9 +223,6 @@ class VppPapiProvider(object): """ return cli + "\n" + str(self.cli(cli)) - def _convert_mac(self, mac): - return mactobinary(mac) - def show_version(self): """ """ return self.api(self.papi.show_version, {}) @@ -643,7 +640,7 @@ class VppPapiProvider(object): interface. (Default value = 0) """ return self.api(self.papi.l2fib_add_del, - {'mac': self._convert_mac(mac), + {'mac': mac, 'bd_id': bd_id, 'sw_if_index': sw_if_index, 'is_add': is_add, diff --git a/test/vpp_pppoe_interface.py b/test/vpp_pppoe_interface.py index 28d8a714972..9be92327dcf 100644 --- a/test/vpp_pppoe_interface.py +++ b/test/vpp_pppoe_interface.py @@ -1,7 +1,7 @@ from vpp_interface import VppInterface import socket -from vpp_mac import mactobinary +from vpp_papi import mac_pton class VppPppoeInterface(VppInterface): @@ -20,7 +20,7 @@ class VppPppoeInterface(VppInterface): def add_vpp_config(self): cip = socket.inet_pton(socket.AF_INET, self.client_ip) - cmac = mactobinary(self.client_mac) + cmac = mac_pton(self.client_mac) r = self.test.vapi.pppoe_add_del_session( cip, cmac, session_id=self.session_id, @@ -30,7 +30,7 @@ class VppPppoeInterface(VppInterface): def remove_vpp_config(self): cip = socket.inet_pton(socket.AF_INET, self.client_ip) - cmac = mactobinary(self.client_mac) + cmac = mac_pton(self.client_mac) self.unconfig() self.test.vapi.pppoe_add_del_session( cip, cmac, -- 2.16.6