diff options
Diffstat (limited to 'src/org/xbill/DNS/OPTRecord.java')
-rw-r--r-- | src/org/xbill/DNS/OPTRecord.java | 191 |
1 files changed, 191 insertions, 0 deletions
diff --git a/src/org/xbill/DNS/OPTRecord.java b/src/org/xbill/DNS/OPTRecord.java new file mode 100644 index 0000000..47fef2f --- /dev/null +++ b/src/org/xbill/DNS/OPTRecord.java @@ -0,0 +1,191 @@ +// Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) + +package org.xbill.DNS; + +import java.io.*; +import java.util.*; + +/** + * Options - describes Extended DNS (EDNS) properties of a Message. + * No specific options are defined other than those specified in the + * header. An OPT should be generated by Resolver. + * + * EDNS is a method to extend the DNS protocol while providing backwards + * compatibility and not significantly changing the protocol. This + * implementation of EDNS is mostly complete at level 0. + * + * @see Message + * @see Resolver + * + * @author Brian Wellington + */ + +public class OPTRecord extends Record { + +private static final long serialVersionUID = -6254521894809367938L; + +private List options; + +OPTRecord() {} + +Record +getObject() { + return new OPTRecord(); +} + +/** + * Creates an OPT Record. This is normally called by SimpleResolver, but can + * also be called by a server. + * @param payloadSize The size of a packet that can be reassembled on the + * sending host. + * @param xrcode The value of the extended rcode field. This is the upper + * 16 bits of the full rcode. + * @param flags Additional message flags. + * @param version The EDNS version that this DNS implementation supports. + * This should be 0 for dnsjava. + * @param options The list of options that comprise the data field. There + * are currently no defined options. + * @see ExtendedFlags + */ +public +OPTRecord(int payloadSize, int xrcode, int version, int flags, List options) { + super(Name.root, Type.OPT, payloadSize, 0); + checkU16("payloadSize", payloadSize); + checkU8("xrcode", xrcode); + checkU8("version", version); + checkU16("flags", flags); + ttl = ((long)xrcode << 24) + ((long)version << 16) + flags; + if (options != null) { + this.options = new ArrayList(options); + } +} + +/** + * Creates an OPT Record with no data. This is normally called by + * SimpleResolver, but can also be called by a server. + * @param payloadSize The size of a packet that can be reassembled on the + * sending host. + * @param xrcode The value of the extended rcode field. This is the upper + * 16 bits of the full rcode. + * @param flags Additional message flags. + * @param version The EDNS version that this DNS implementation supports. + * This should be 0 for dnsjava. + * @see ExtendedFlags + */ +public +OPTRecord(int payloadSize, int xrcode, int version, int flags) { + this(payloadSize, xrcode, version, flags, null); +} + +/** + * Creates an OPT Record with no data. This is normally called by + * SimpleResolver, but can also be called by a server. + */ +public +OPTRecord(int payloadSize, int xrcode, int version) { + this(payloadSize, xrcode, version, 0, null); +} + +void +rrFromWire(DNSInput in) throws IOException { + if (in.remaining() > 0) + options = new ArrayList(); + while (in.remaining() > 0) { + EDNSOption option = EDNSOption.fromWire(in); + options.add(option); + } +} + +void +rdataFromString(Tokenizer st, Name origin) throws IOException { + throw st.exception("no text format defined for OPT"); +} + +/** Converts rdata to a String */ +String +rrToString() { + StringBuffer sb = new StringBuffer(); + if (options != null) { + sb.append(options); + sb.append(" "); + } + sb.append(" ; payload "); + sb.append(getPayloadSize()); + sb.append(", xrcode "); + sb.append(getExtendedRcode()); + sb.append(", version "); + sb.append(getVersion()); + sb.append(", flags "); + sb.append(getFlags()); + return sb.toString(); +} + +/** Returns the maximum allowed payload size. */ +public int +getPayloadSize() { + return dclass; +} + +/** + * Returns the extended Rcode + * @see Rcode + */ +public int +getExtendedRcode() { + return (int)(ttl >>> 24); +} + +/** Returns the highest supported EDNS version */ +public int +getVersion() { + return (int)((ttl >>> 16) & 0xFF); +} + +/** Returns the EDNS flags */ +public int +getFlags() { + return (int)(ttl & 0xFFFF); +} + +void +rrToWire(DNSOutput out, Compression c, boolean canonical) { + if (options == null) + return; + Iterator it = options.iterator(); + while (it.hasNext()) { + EDNSOption option = (EDNSOption) it.next(); + option.toWire(out); + } +} + +/** + * Gets all options in the OPTRecord. This returns a list of EDNSOptions. + */ +public List +getOptions() { + if (options == null) + return Collections.EMPTY_LIST; + return Collections.unmodifiableList(options); +} + +/** + * Gets all options in the OPTRecord with a specific code. This returns a list + * of EDNSOptions. + */ +public List +getOptions(int code) { + if (options == null) + return Collections.EMPTY_LIST; + List list = Collections.EMPTY_LIST; + for (Iterator it = options.iterator(); it.hasNext(); ) { + EDNSOption opt = (EDNSOption) it.next(); + if (opt.getCode() == code) { + if (list == Collections.EMPTY_LIST) + list = new ArrayList(); + list.add(opt); + } + } + return list; +} + +} |