diff options
author | Brian Maissy <brian@medigate.io> | 2019-11-20 10:04:59 +0200 |
---|---|---|
committer | Jakub Stasiak <jakub@stasiak.at> | 2020-06-21 02:07:29 +0200 |
commit | 94b7fb677516255874f8a70b10bedca70c66a01d (patch) | |
tree | f0c64b5296c69c132ce943cbd77b48c29842965b | |
parent | af57da4e0315c5a2ff72f307b75aa9aab6558a89 (diff) | |
download | netaddr-94b7fb677516255874f8a70b10bedca70c66a01d.tar.gz |
support IABs in the 40:D8:55 OUI
-rw-r--r-- | netaddr/eui/__init__.py | 12 | ||||
-rw-r--r-- | netaddr/tests/eui/test_eui.py | 15 |
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') |