X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=test%2Fvpp_ip.py;h=3c01ba5e4b8b442b7d03e9b017cf25ebbbb2e6aa;hb=e64e5fff4;hp=7f3a6b01e95cd66fec583542b6e72a5514dd906d;hpb=8c8acc027871f97370ee549306876690030c3bbb;p=vpp.git diff --git a/test/vpp_ip.py b/test/vpp_ip.py index 7f3a6b01e95..3c01ba5e4b8 100644 --- a/test/vpp_ip.py +++ b/test/vpp_ip.py @@ -2,10 +2,17 @@ IP Types """ +import logging from ipaddress import ip_address from socket import AF_INET, AF_INET6 from vpp_papi import VppEnum +try: + text_type = unicode +except NameError: + text_type = str + +_log = logging.getLogger(__name__) class DpoProto: @@ -20,16 +27,23 @@ class DpoProto: INVALID_INDEX = 0xffffffff +def get_dpo_proto(addr): + if ip_address(addr).version == 6: + return DpoProto.DPO_PROTO_IP6 + else: + return DpoProto.DPO_PROTO_IP4 + + class VppIpAddressUnion(): def __init__(self, addr): self.addr = addr - self.ip_addr = ip_address(unicode(self.addr)) + self.ip_addr = ip_address(text_type(self.addr)) def encode(self): - if self.version is 6: - return {'ip6': self.ip_addr.packed} + if self.version == 6: + return {'ip6': self.ip_addr} else: - return {'ip4': self.ip_addr.packed} + return {'ip4': self.ip_addr} @property def version(self): @@ -41,10 +55,7 @@ class VppIpAddressUnion(): @property def length(self): - if self.version is 6: - return 128 - else: - return 32 + return self.ip_addr.max_prefixlen @property def bytes(self): @@ -55,179 +66,70 @@ class VppIpAddressUnion(): return self.ip_addr == other.ip_addr elif hasattr(other, "ip4") and hasattr(other, "ip6"): # vl_api_address_union_t - if 4 is self.version: - return self.ip_addr.packed == other.ip4 - else: - return self.ip_addr.packed == other.ip6 - else: - raise Exception("Comparing VppIpAddresUnions:%s" - " with unknown type: %s" % - (self, other)) - - return False - - -class VppIpAddress(): - def __init__(self, addr): - self.addr = VppIpAddressUnion(addr) - - def encode(self): - if self.addr.version is 6: - return { - 'af': VppEnum.vl_api_address_family_t.ADDRESS_IP6, - 'un': self.addr.encode() - } - else: - return { - 'af': VppEnum.vl_api_address_family_t.ADDRESS_IP4, - 'un': self.addr.encode() - } - - def __eq__(self, other): - if isinstance(other, self.__class__): - return self.addr == other.addr - elif hasattr(other, "af") and hasattr(other, "un"): - # a vp_api_address_t - if 4 is self.version: - return other.af == \ - VppEnum.vl_api_address_family_t.ADDRESS_IP4 and \ - other.un == self.addr + if 4 == self.version: + return self.ip_addr == other.ip4 else: - return other.af == \ - VppEnum.vl_api_address_family_t.ADDRESS_IP6 and \ - other.un == self.addr + return self.ip_addr == other.ip6 else: - raise Exception("Comparing VppIpAddress:%s with unknown type: %s" % - (self, other)) - return False + raise Exception("Comparing VppIpAddressUnions:%s" + " with incomparable type: %s", + self, other) def __ne__(self, other): return not (self == other) def __str__(self): - return self.address - - @property - def bytes(self): - return self.addr.bytes - - @property - def bytes(self): - return self.addr.bytes - - @property - def address(self): - return self.addr.address - - @property - def length(self): - return self.addr.length - - @property - def version(self): - return self.addr.version - - @property - def is_ip6(self): - return (self.version == 6) - - @property - def af(self): - if self.version == 6: - return AF_INET6 - else: - return AF_INET + return str(self.ip_addr) - @property - def dpo_proto(self): - if self.version is 6: - return DpoProto.DPO_PROTO_IP6 - else: - return DpoProto.DPO_PROTO_IP4 - -class VppIpPrefix(): - def __init__(self, addr, len): - self.addr = VppIpAddress(addr) - self.len = len - - def __eq__(self, other): - if self.addr == other.addr and self.len == other.len: - return True - return False +class VppIpMPrefix(): + def __init__(self, saddr, gaddr, glen): + self.saddr = saddr + self.gaddr = gaddr + self.glen = glen + if ip_address(self.saddr).version != \ + ip_address(self.gaddr).version: + raise ValueError('Source and group addresses must be of the ' + 'same address family.') def encode(self): - return {'address': self.addr.encode(), - 'address_length': self.len} - - @property - def address(self): - return self.addr.address - - @property - def bytes(self): - return self.addr.bytes + return { + 'af': ip_address(self.gaddr).vapi_af, + 'grp_address': { + ip_address(self.gaddr).vapi_af_name: self.gaddr + }, + 'src_address': { + ip_address(self.saddr).vapi_af_name: self.saddr + }, + 'grp_address_length': self.glen, + } @property def length(self): - return self.len + return self.glen @property - def is_ip6(self): - return self.addr.is_ip6 + def version(self): + return ip_address(self.gaddr).version def __str__(self): - return "%s/%d" % (self.address, self.length) + return "(%s,%s)/%d" % (self.saddr, self.gaddr, self.glen) def __eq__(self, other): if isinstance(other, self.__class__): - return (self.len == other.len and self.addr == other.addr) - elif hasattr(other, "address") and hasattr(other, "address_length"): - # vl_api_prefix_t - return self.len == other.address_length and \ - self.addr == other.address - else: - raise Exception("Comparing VppIpPrefix:%s with unknown type: %s" % - (self, other)) - return False - - -class VppIp6Prefix(): - def __init__(self, prefix, prefixlen): - self.ip_prefix = ip_address(unicode(prefix)) - self.prefixlen = prefixlen - - def encode(self): - return {'prefix': self.ip_prefix.packed, - 'len': self.prefixlen} - - -class VppIp4Prefix(VppIp6Prefix): - pass - - -class VppIpMPrefix(): - def __init__(self, saddr, gaddr, len): - self.saddr = saddr - self.gaddr = gaddr - self.len = len - self.ip_saddr = ip_address(unicode(self.saddr)) - self.ip_gaddr = ip_address(unicode(self.gaddr)) - - def encode(self): - - if 6 is self.ip_saddr.version: - prefix = { - 'af': VppEnum.vl_api_address_family_t.ADDRESS_IP6, - 'grp_address': {'ip6': self.ip_gaddr.packed}, - 'src_address': {'ip6': self.ip_saddr.packed}, - 'grp_address_length': self.len, - } - else: - prefix = { - 'af': VppEnum.vl_api_address_family_t.ADDRESS_IP4, - 'grp_address': {'ip4': self.ip_gaddr.packed}, - 'src_address': {'ip4': self.ip_saddr.packed}, - 'grp_address_length': self.len, - } - return prefix + return (self.glen == other.glen and + self.saddr == other.gaddr and + self.saddr == other.saddr) + elif (hasattr(other, "grp_address_length") and + hasattr(other, "grp_address") and + hasattr(other, "src_address")): + # vl_api_mprefix_t + if 4 == self.version: + return (self.glen == other.grp_address_length and + self.gaddr == str(other.grp_address.ip4) and + self.saddr == str(other.src_address.ip4)) + else: + return (self.glen == other.grp_address_length and + self.gaddr == str(other.grp_address.ip6) and + self.saddr == str(other.src_address.ip6)) + return NotImplemented