blob: 539a590e3223b20a31f0d89bd1795f6153ebf8b7 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.apache.directory.server.dns.io.encoder;
import org.apache.directory.server.dns.messages.ResourceRecord;
import org.apache.directory.server.dns.store.DnsAttribute;
import org.apache.mina.core.buffer.IoBuffer;
/**
* The format of the SRV RR
*
* Here is the format of the SRV RR, whose DNS type code is 33:
*
* _Service._Proto.Name TTL Class SRV Priority Weight Port Target
*
* (There is an example near the end of this document.)
*
* Service
* The symbolic name of the desired service, as defined in Assigned
* Numbers [STD 2] or locally. An underscore (_) is prepended to
* the service identifier to avoid collisions with DNS labels that
* occur in nature.
*
* Some widely used services, notably POP, don't have a single
* universal name. If Assigned Numbers names the service
* indicated, that name is the only name which is legal for SRV
* lookups. The Service is case insensitive.
*
* Proto
* The symbolic name of the desired protocol, with an underscore
* (_) prepended to prevent collisions with DNS labels that occur
* in nature. _TCP and _UDP are at present the most useful values
* for this field, though any name defined by Assigned Numbers or
* locally may be used (as for Service). The Proto is case
* insensitive.
*
* Name
* The domain this RR refers to. The SRV RR is unique in that the
* name one searches for is not this name; the example near the end
* shows this clearly.
*
* TTL
* Standard DNS meaning [RFC 1035].
*
* Class
* Standard DNS meaning [RFC 1035]. SRV records occur in the IN
* Class.
*
* Priority
* The priority of this target host. A client MUST attempt to
* contact the target host with the lowest-numbered priority it can
* reach; target hosts with the same priority SHOULD be tried in an
* order defined by the weight field. The range is 0-65535. This
* is a 16 bit unsigned integer in network byte order.
*
* Weight
* A server selection mechanism. The weight field specifies a
* relative weight for entries with the same priority. Larger
* weights SHOULD be given a proportionately higher probability of
* being selected. The range of this number is 0-65535. This is a
* 16 bit unsigned integer in network byte order. Domain
* administrators SHOULD use Weight 0 when there isn't any server
* selection to do, to make the RR easier to read for humans (less
* noisy). In the presence of records containing weights greater
* than 0, records with weight 0 should have a very small chance of
* being selected.
*
* In the absence of a protocol whose specification calls for the
* use of other weighting information, a client arranges the SRV
* RRs of the same Priority in the order in which target hosts,
* specified by the SRV RRs, will be contacted. The following
* algorithm SHOULD be used to order the SRV RRs of the same
* priority:
*
* To select a target to be contacted next, arrange all SRV RRs
* (that have not been ordered yet) in any order, except that all
* those with weight 0 are placed at the beginning of the list.
*
* Compute the sum of the weights of those RRs, and with each RR
* associate the running sum in the selected order. Then choose a
* uniform random number between 0 and the sum computed
* (inclusive), and select the RR whose running sum value is the
* first in the selected order which is greater than or equal to
* the random number selected. The target host specified in the
* selected SRV RR is the next one to be contacted by the client.
* Remove this SRV RR from the set of the unordered SRV RRs and
* apply the described algorithm to the unordered SRV RRs to select
* the next target host. Continue the ordering process until there
* are no unordered SRV RRs. This process is repeated for each
* Priority.
*
* Port
* The port on this target host of this service. The range is 0-
* 65535. This is a 16 bit unsigned integer in network byte order.
* This is often as specified in Assigned Numbers but need not be.
*
* Target
* The domain name of the target host. There MUST be one or more
* address records for this name, the name MUST NOT be an alias (in
* the sense of RFC 1034 or RFC 2181). Implementors are urged, but
* not required, to return the address record(s) in the Additional
* Data section. Unless and until permitted by future standards
* action, name compression is not to be used for this field.
*
* A Target of "." means that the service is decidedly not
* available at this domain.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
public class ServerSelectionRecordEncoder extends ResourceRecordEncoder
{
protected void putResourceRecordData( IoBuffer byteBuffer, ResourceRecord record )
{
byteBuffer.putShort( Short.parseShort( record.get( DnsAttribute.SERVICE_PRIORITY ) ) );
byteBuffer.putShort( Short.parseShort( record.get( DnsAttribute.SERVICE_WEIGHT ) ) );
byteBuffer.putShort( Short.parseShort( record.get( DnsAttribute.SERVICE_PORT ) ) );
putDomainName( byteBuffer, record.get( DnsAttribute.DOMAIN_NAME ) );
}
}