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