summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Maissy <brian@medigate.io>2019-11-20 10:04:59 +0200
committerJakub Stasiak <jakub@stasiak.at>2020-06-21 02:07:29 +0200
commit94b7fb677516255874f8a70b10bedca70c66a01d (patch)
treef0c64b5296c69c132ce943cbd77b48c29842965b
parentaf57da4e0315c5a2ff72f307b75aa9aab6558a89 (diff)
downloadnetaddr-94b7fb677516255874f8a70b10bedca70c66a01d.tar.gz
support IABs in the 40:D8:55 OUI
-rw-r--r--netaddr/eui/__init__.py12
-rw-r--r--netaddr/tests/eui/test_eui.py15
2 files changed, 22 insertions, 5 deletions
diff --git a/netaddr/eui/__init__.py b/netaddr/eui/__init__.py
index c4c7759..5639676 100644
--- a/netaddr/eui/__init__.py
+++ b/netaddr/eui/__init__.py
@@ -182,6 +182,8 @@ class OUI(BaseIdentifier):
class IAB(BaseIdentifier):
+ IAB_EUI_VALUES = (0x0050c2, 0x40d855)
+
"""
An individual IEEE IAB (Individual Address Block) identifier.
@@ -190,8 +192,8 @@ class IAB(BaseIdentifier):
"""
__slots__ = ('record',)
- @staticmethod
- def split_iab_mac(eui_int, strict=False):
+ @classmethod
+ def split_iab_mac(cls, eui_int, strict=False):
"""
:param eui_int: a MAC IAB as an unsigned integer.
@@ -199,7 +201,7 @@ class IAB(BaseIdentifier):
IAB MAC/EUI-48 address are non-zero, ignores them otherwise.
(Default: False)
"""
- if 0x50c2000 <= eui_int <= 0x50c2fff:
+ if (eui_int >> 12) in cls.IAB_EUI_VALUES:
return eui_int, 0
user_mask = 2 ** 12 - 1
@@ -207,7 +209,7 @@ class IAB(BaseIdentifier):
iab_bits = eui_int >> 12
user_bits = (eui_int | iab_mask) - iab_mask
- if 0x50c2000 <= iab_bits <= 0x50c2fff:
+ if (iab_bits >> 12) in cls.IAB_EUI_VALUES:
if strict and user_bits != 0:
raise ValueError('%r is not a strict IAB!' % hex(user_bits))
else:
@@ -492,7 +494,7 @@ class EUI(BaseIdentifier):
def is_iab(self):
""":return: True if this EUI is an IAB address, False otherwise"""
- return 0x50c2000 <= (self._value >> 12) <= 0x50c2fff
+ return (self._value >> 24) in IAB.IAB_EUI_VALUES
@property
def iab(self):
diff --git a/netaddr/tests/eui/test_eui.py b/netaddr/tests/eui/test_eui.py
index e713529..645a518 100644
--- a/netaddr/tests/eui/test_eui.py
+++ b/netaddr/tests/eui/test_eui.py
@@ -233,6 +233,21 @@ def test_iab():
assert int(eui.oui) == 0x0050c2
assert int(eui.iab) == 0x0050c205c
+ assert IAB(eui.value) == eui.iab
+
+
+def test_new_iab():
+ eui = EUI('40-D8-55-13-10-00')
+
+ assert eui.is_iab()
+ assert str(eui.oui) == '40-D8-55'
+ assert str(eui.iab) == '40-D8-55-13-10-00'
+ assert eui.ei == '13-10-00'
+ assert int(eui.oui) == 0x40d855
+ assert int(eui.iab) == 0x40d855131
+
+ assert IAB(eui.value) == eui.iab
+
def test_eui48_vs_eui64():
eui48 = EUI('01-00-00-01-00-00')