summaryrefslogtreecommitdiffstats
path: root/src/vpp-api/python
diff options
context:
space:
mode:
authorOle Troan <ot@cisco.com>2018-12-17 12:02:26 +0100
committerNeale Ranns <nranns@cisco.com>2018-12-18 11:54:24 +0000
commit8006c6aa425126529b4017768a9201e4f03964ad (patch)
tree7b7342e6fb4964a5c8ca65c3d13d8dcc980f120d /src/vpp-api/python
parent02782d6ebd13ce02f2d3facebb54fec3c2137c88 (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/python')
-rw-r--r--src/vpp-api/python/vpp_papi/macaddress.py54
-rw-r--r--src/vpp-api/python/vpp_papi/vpp_format.py7
-rw-r--r--src/vpp-api/python/vpp_papi/vpp_papi.py2
-rw-r--r--src/vpp-api/python/vpp_papi/vpp_serializer.py7
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)