diff options
author | Ole Troan <ot@cisco.com> | 2018-12-17 12:02:26 +0100 |
---|---|---|
committer | Neale Ranns <nranns@cisco.com> | 2018-12-18 11:54:24 +0000 |
commit | 8006c6aa425126529b4017768a9201e4f03964ad (patch) | |
tree | 7b7342e6fb4964a5c8ca65c3d13d8dcc980f120d /src/vpp-api | |
parent | 02782d6ebd13ce02f2d3facebb54fec3c2137c88 (diff) |
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 <ot@cisco.com>
Diffstat (limited to 'src/vpp-api')
-rw-r--r-- | src/vpp-api/python/vpp_papi/macaddress.py | 54 | ||||
-rw-r--r-- | src/vpp-api/python/vpp_papi/vpp_format.py | 7 | ||||
-rw-r--r-- | src/vpp-api/python/vpp_papi/vpp_papi.py | 2 | ||||
-rw-r--r-- | src/vpp-api/python/vpp_papi/vpp_serializer.py | 7 |
4 files changed, 67 insertions, 3 deletions
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) |