From 8006c6aa425126529b4017768a9201e4f03964ad Mon Sep 17 00:00:00 2001 From: Ole Troan Date: Mon, 17 Dec 2018 12:02:26 +0100 Subject: 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 --- 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 ++-- 4 files changed, 67 insertions(+), 3 deletions(-) create mode 100644 src/vpp-api/python/vpp_papi/macaddress.py (limited to 'src/vpp-api/python') 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) -- cgit 1.2.3-korg