1d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) 2d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 3d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpackage org.xbill.DNS; 4d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 5d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.io.*; 6d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.net.*; 7d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 8d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** 9d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * A6 Record - maps a domain name to an IPv6 address (experimental) 10d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 11d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @author Brian Wellington 12d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 13d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 14d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic class A6Record extends Record { 15d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 16d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprivate static final long serialVersionUID = -8815026887337346789L; 17d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 18d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprivate int prefixBits; 19d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprivate InetAddress suffix; 20d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprivate Name prefix; 21d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 22d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenA6Record() {} 23d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 24d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenRecord 25d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChengetObject() { 26d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return new A6Record(); 27d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 28d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 29d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** 30d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Creates an A6 Record from the given data 31d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param prefixBits The number of bits in the address prefix 32d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param suffix The address suffix 33d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param prefix The name of the prefix 34d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 35d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic 36d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenA6Record(Name name, int dclass, long ttl, int prefixBits, 37d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen InetAddress suffix, Name prefix) 38d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen{ 39d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen super(name, Type.A6, dclass, ttl); 40d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.prefixBits = checkU8("prefixBits", prefixBits); 41d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (suffix != null && Address.familyOf(suffix) != Address.IPv6) 42d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw new IllegalArgumentException("invalid IPv6 address"); 43d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.suffix = suffix; 44d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (prefix != null) 45d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.prefix = checkName("prefix", prefix); 46d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 47d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 48d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenvoid 49d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenrrFromWire(DNSInput in) throws IOException { 50d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen prefixBits = in.readU8(); 51d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen int suffixbits = 128 - prefixBits; 52d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen int suffixbytes = (suffixbits + 7) / 8; 53d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (prefixBits < 128) { 54d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen byte [] bytes = new byte[16]; 55d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen in.readByteArray(bytes, 16 - suffixbytes, suffixbytes); 56d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen suffix = InetAddress.getByAddress(bytes); 57d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 58d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (prefixBits > 0) 59d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen prefix = new Name(in); 60d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 61d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 62d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenvoid 63d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenrdataFromString(Tokenizer st, Name origin) throws IOException { 64d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen prefixBits = st.getUInt8(); 65d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (prefixBits > 128) { 66d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw st.exception("prefix bits must be [0..128]"); 67d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } else if (prefixBits < 128) { 68d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen String s = st.getString(); 69d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen try { 70d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen suffix = Address.getByAddress(s, Address.IPv6); 71d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 72d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen catch (UnknownHostException e) { 73d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw st.exception("invalid IPv6 address: " + s); 74d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 75d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 76d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (prefixBits > 0) 77d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen prefix = st.getName(origin); 78d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 79d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 80d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** Converts rdata to a String */ 81d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenString 82d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenrrToString() { 83d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen StringBuffer sb = new StringBuffer(); 84d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append(prefixBits); 85d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (suffix != null) { 86d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append(" "); 87d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append(suffix.getHostAddress()); 88d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 89d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (prefix != null) { 90d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append(" "); 91d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append(prefix); 92d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 93d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return sb.toString(); 94d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 95d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 96d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** Returns the number of bits in the prefix */ 97d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic int 98d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChengetPrefixBits() { 99d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return prefixBits; 100d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 101d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 102d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** Returns the address suffix */ 103d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic InetAddress 104d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChengetSuffix() { 105d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return suffix; 106d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 107d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 108d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** Returns the address prefix */ 109d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic Name 110d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChengetPrefix() { 111d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return prefix; 112d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 113d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 114d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenvoid 115d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenrrToWire(DNSOutput out, Compression c, boolean canonical) { 116d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen out.writeU8(prefixBits); 117d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (suffix != null) { 118d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen int suffixbits = 128 - prefixBits; 119d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen int suffixbytes = (suffixbits + 7) / 8; 120d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen byte [] data = suffix.getAddress(); 121d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen out.writeByteArray(data, 16 - suffixbytes, suffixbytes); 122d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 123d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (prefix != null) 124d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen prefix.toWire(out, null, canonical); 125d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 126d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 127d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 128