| """ |
| IP Types |
| |
| """ |
| |
| from ipaddress import ip_address |
| |
| |
| class IpAddressFamily: |
| ADDRESS_IP4 = 0 |
| ADDRESS_IP6 = 1 |
| |
| |
| INVALID_INDEX = 0xffffffff |
| |
| |
| def compare_ip_address(api_address, py_address): |
| if 4 is py_address.version: |
| if py_address.packed == api_address.ip4.address: |
| return True |
| else: |
| if py_address.packed == api_address.ip6.address: |
| return True |
| return False |
| |
| |
| class VppIpAddressUnion(): |
| def __init__(self, addr): |
| self.addr = addr |
| self.ip_addr = ip_address(unicode(self.addr)) |
| |
| @property |
| def version(self): |
| return self.ip_addr.version |
| |
| @property |
| def address(self): |
| return self.addr |
| |
| def encode(self): |
| if self.ip_addr.version is 6: |
| return { |
| 'ip6': { |
| 'address': self.ip_addr.packed |
| }, |
| } |
| else: |
| return { |
| 'ip4': { |
| 'address': self.ip_addr.packed |
| }, |
| } |
| |
| |
| class VppIpAddress(): |
| def __init__(self, addr): |
| self.addr = VppIpAddressUnion(addr) |
| |
| def encode(self): |
| if self.addr.version is 6: |
| return { |
| 'af': IpAddressFamily.ADDRESS_IP6, |
| 'un': self.addr.encode() |
| } |
| else: |
| return { |
| 'af': IpAddressFamily.ADDRESS_IP4, |
| 'un': self.addr.encode() |
| } |
| |
| @property |
| def address(self): |
| return self.addr.address |
| |
| |
| 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 |
| |
| def encode(self): |
| return {'address': self.addr.encode(), |
| 'address_length': self.len} |
| |
| @property |
| def address(self): |
| return self.addr.address |
| |
| |
| 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': IpAddressFamily.ADDRESS_IP6, |
| 'grp_address': { |
| 'ip6': { |
| 'address': self.ip_gaddr.packed |
| }, |
| }, |
| 'src_address': { |
| 'ip6': { |
| 'address': self.ip_saddr.packed |
| }, |
| }, |
| 'grp_address_length': self.len, |
| } |
| else: |
| prefix = { |
| 'af': IpAddressFamily.ADDRESS_IP4, |
| 'grp_address': { |
| 'ip4': { |
| 'address': self.ip_gaddr.packed |
| }, |
| }, |
| 'src_address': { |
| 'ip4': { |
| 'address': self.ip_saddr.packed |
| }, |
| }, |
| 'grp_address_length': self.len, |
| } |
| return prefix |