aboutsummaryrefslogtreecommitdiff
path: root/src/org/xbill/DNS/OPTRecord.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/org/xbill/DNS/OPTRecord.java')
-rw-r--r--src/org/xbill/DNS/OPTRecord.java191
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;
+}
+
+}