def __init__(self, dns_servers: Iterable[IPv6Address], always_send: bool = False): option = RecursiveNameServersOption(dns_servers=dns_servers) option.validate() super().__init__(option, always_send=always_send)
def setUp(self): self.option_bytes = bytes.fromhex('00170020' '20010db8000000000000000000000001' '20010db8000000000000000000000002') self.option_object = RecursiveNameServersOption(dns_servers=[ IPv6Address('2001:db8::1'), IPv6Address('2001:db8::2') ]) self.parse_option()
def test_bad_option_length(self): with self.assertRaisesRegex(ValueError, 'length must be a multiple of 16'): RecursiveNameServersOption.parse(bytes.fromhex('0017000f20010db8000000000000000000000001')) with self.assertRaisesRegex(ValueError, 'longer than the available buffer'): RecursiveNameServersOption.parse(bytes.fromhex('0017001120010db8000000000000000000000001')) with self.assertRaisesRegex(ValueError, 'length must be a multiple of 16'): RecursiveNameServersOption.parse(bytes.fromhex('0017001120010db800000000000000000000000100'))
def test_bad_option_length(self): with self.assertRaisesRegex(ValueError, 'length must be a multiple of 16'): RecursiveNameServersOption.parse( bytes.fromhex('0017000f20010db8000000000000000000000001')) with self.assertRaisesRegex(ValueError, 'longer than the available buffer'): RecursiveNameServersOption.parse( bytes.fromhex('0017001120010db8000000000000000000000001')) with self.assertRaisesRegex(ValueError, 'length must be a multiple of 16'): RecursiveNameServersOption.parse( bytes.fromhex('0017001120010db800000000000000000000000100'))
def combine( self, existing_options: Iterable[RecursiveNameServersOption] ) -> RecursiveNameServersOption: """ Combine multiple options into one. :param existing_options: The existing options to include name servers from :return: The combined option """ addresses = [] # Add from existing options first for option in existing_options: for address in option.dns_servers: if address not in addresses: addresses.append(address) # Then add our own for address in self.option.dns_servers: if address not in addresses: addresses.append(address) # And return a new option with the combined addresses return RecursiveNameServersOption(dns_servers=addresses)
IAPDOption(iaid=bytes.fromhex('c43cb2f1'), options=[ IAPrefixOption( prefix=IPv6Network('2001:db8:ffcc:fe00::/56'), preferred_lifetime=375, valid_lifetime=600), ]), ClientIdOption(duid=LinkLayerDUID(hardware_type=1, link_layer_address=bytes.fromhex( '3431c43cb2f1'))), ServerIdOption(duid=LinkLayerTimeDUID(hardware_type=1, time=488458703, link_layer_address=bytes.fromhex( '00137265ca42'))), ReconfigureAcceptOption(), RecursiveNameServersOption( dns_servers=[IPv6Address('2001:4860:4860::8888')]), ], ) reply_packet = codecs.decode( '07f350d600030028c43cb2f100000000' '000000000005001820010db8ffff0001' '000c00000000e09c0000017700000258' '00190029c43cb2f10000000000000000' '001a001900000177000002583820010d' 'b8ffccfe000000000000000000000100' '0a000300013431c43cb2f10002000e00' '0100011d1d49cf00137265ca42001400' '00001700102001486048600000000000' '0000008888', 'hex')
def __init__(self, dns_servers: [IPv6Address]): option = RecursiveNameServersOption(dns_servers=dns_servers) option.validate() super().__init__(option)