Annotation of embedaddon/dhcp/common/dhcp-eval.5, revision 1.1
1.1 ! misho 1: .\" $Id: dhcp-eval.5,v 1.27.364.3.6.1 2011-11-28 18:13:51 sar Exp $
! 2: .\"
! 3: .\" Copyright (c) 2009-2011 by Internet Systems Consortium, Inc. ("ISC")
! 4: .\" Copyright (c) 2004,2007 by Internet Systems Consortium, Inc. ("ISC")
! 5: .\" Copyright (c) 1996-2003 by Internet Software Consortium
! 6: .\"
! 7: .\" Permission to use, copy, modify, and distribute this software for any
! 8: .\" purpose with or without fee is hereby granted, provided that the above
! 9: .\" copyright notice and this permission notice appear in all copies.
! 10: .\"
! 11: .\" THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
! 12: .\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
! 13: .\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
! 14: .\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
! 15: .\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
! 16: .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
! 17: .\" OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
! 18: .\"
! 19: .\" Internet Systems Consortium, Inc.
! 20: .\" 950 Charter Street
! 21: .\" Redwood City, CA 94063
! 22: .\" <info@isc.org>
! 23: .\" https://www.isc.org/
! 24: .\"
! 25: .\" This software has been written for Internet Systems Consortium
! 26: .\" by Ted Lemon in cooperation with Vixie Enterprises and Nominum, Inc.
! 27: .\"
! 28: .\" Support and other services are available for ISC products - see
! 29: .\" https://www.isc.org for more information or to learn more about ISC.
! 30: .\"
! 31: .TH dhcp-eval 5
! 32: .SH NAME
! 33: dhcp-eval - ISC DHCP conditional evaluation
! 34: .SH DESCRIPTION
! 35: The Internet Systems Consortium DHCP client and server both provide
! 36: the ability to perform conditional behavior depending on the contents
! 37: of packets they receive. The syntax for specifying this conditional
! 38: behaviour is documented here.
! 39: .SH REFERENCE: CONDITIONAL BEHAVIOUR
! 40: Conditional behaviour is specified using the if statement and the else
! 41: or elsif statements. A conditional statement can appear anywhere
! 42: that a regular statement (e.g., an option statement) can appear, and
! 43: can enclose one or more such statements. A typical conditional
! 44: statement in a server might be:
! 45: .PP
! 46: .nf
! 47: if option dhcp-user-class = "accounting" {
! 48: max-lease-time 17600;
! 49: option domain-name "accounting.example.org";
! 50: option domain-name-servers ns1.accounting.example.org,
! 51: ns2.accounting.example.org;
! 52: } elsif option dhcp-user-class = "sales" {
! 53: max-lease-time 17600;
! 54: option domain-name "sales.example.org";
! 55: option domain-name-servers ns1.sales.example.org,
! 56: ns2.sales.example.org;
! 57: } elsif option dhcp-user-class = "engineering" {
! 58: max-lease-time 17600;
! 59: option domain-name "engineering.example.org";
! 60: option domain-name-servers ns1.engineering.example.org,
! 61: ns2.engineering.example.org;
! 62: } else {
! 63: max-lease-time 600;
! 64: option domain-name "misc.example.org";
! 65: option domain-name-servers ns1.misc.example.org,
! 66: ns2.misc.example.org;
! 67: }
! 68: .fi
! 69: .PP
! 70: On the client side, an example of conditional evaluation might be:
! 71: .PP
! 72: .nf
! 73: # example.org filters DNS at its firewall, so we have to use their DNS
! 74: # servers when we connect to their network. If we are not at
! 75: # example.org, prefer our own DNS server.
! 76: if not option domain-name = "example.org" {
! 77: prepend domain-name-servers 127.0.0.1;
! 78: }
! 79: .fi
! 80: .PP
! 81: The
! 82: .B if
! 83: statement and the
! 84: .B elsif
! 85: continuation statement both take boolean expressions as their
! 86: arguments. That is, they take expressions that, when evaluated,
! 87: produce a boolean result. If the expression evaluates to true, then
! 88: the statements enclosed in braces following the
! 89: .B if
! 90: statement are executed, and all subsequent
! 91: .B elsif
! 92: and
! 93: .B else
! 94: clauses are skipped. Otherwise, each subsequent
! 95: .B elsif
! 96: clause's expression is checked, until an elsif clause is encountered
! 97: whose test evaluates to true. If such a clause is found, the
! 98: statements in braces following it are executed, and then any
! 99: subsequent
! 100: .B elsif
! 101: and
! 102: .B else
! 103: clauses are skipped. If all the
! 104: .B if
! 105: and
! 106: .B elsif
! 107: clauses are checked but none
! 108: of their expressions evaluate true, then if there is an
! 109: .B else
! 110: clause, the statements enclosed in braces following the
! 111: .B else
! 112: are evaluated. Boolean expressions that evaluate to null are
! 113: treated as false in conditionals.
! 114: .SH BOOLEAN EXPRESSIONS
! 115: The following is the current list of boolean expressions that are
! 116: supported by the DHCP distribution.
! 117: .PP
! 118: .I data-expression-1 \fB=\fR \fIdata-expression-2\fR
! 119: .RS 0.25i
! 120: .PP
! 121: The \fB=\fR operator compares the values of two data expressions,
! 122: returning true if they are the same, false if they are not. If
! 123: either the left-hand side or the right-hand side are null, the
! 124: result is also null.
! 125: .RE
! 126: .PP
! 127: .I data-expression-1 \fB~=\fR \fIdata-expression-2\fR
! 128: .I data-expression-1 \fB~~\fR \fIdata-expression-2\fR
! 129: .RS 0.25i
! 130: .PP
! 131: The \fB~=\fR and \fB~~\fR operators (not available on all systems) perform
! 132: extended regex(7) matching of the values of two data expressions, returning
! 133: true if \fIdata-expression-1\fR matches against the regular expression
! 134: evaluated by \fIdata-expression-2\fR, or false if it does not match or
! 135: encounters some error. If either the left-hand side or the right-hand side
! 136: are null or empty strings, the result is also false. The \fB~~\fR operator
! 137: differs from the \fB~=\fR operator in that it is case-insensitive.
! 138: .RE
! 139: .PP
! 140: .I boolean-expression-1 \fBand\fR \fIboolean-expression-2\fR
! 141: .PP
! 142: .RS 0.25i
! 143: The \fBand\fR operator evaluates to true if the boolean expression on
! 144: the left-hand side and the boolean expression on the right-hand side
! 145: both evaluate to true. Otherwise, it evaluates to false. If either
! 146: the expression on the left-hand side or the expression on the
! 147: right-hand side are null, the result is null.
! 148: .RE
! 149: .PP
! 150: .I boolean-expression-1 \fBor\fR \fIboolean-expression-2\fR
! 151: .PP
! 152: .RS 0.25i
! 153: The \fBor\fR operator evaluates to true if either the boolean
! 154: expression on the left-hand side or the boolean expression on the
! 155: right-hand side evaluate to true. Otherwise, it evaluates to false.
! 156: If either the expression on the left-hand side or the expression on
! 157: the right-hand side are null, the result is null.
! 158: .RE
! 159: .PP
! 160: .B not \fIboolean-expression
! 161: .PP
! 162: .RS 0.25i
! 163: The \fBnot\fR operator evaluates to true if \fIboolean-expression\fR
! 164: evaluates to false, and returns false if \fIboolean-expression\fR evaluates
! 165: to true. If \fIboolean-expression\fR evaluates to null, the result
! 166: is also null.
! 167: .RE
! 168: .PP
! 169: .B exists \fIoption-name\fR
! 170: .PP
! 171: .RS 0.25i
! 172: The \fBexists\fR expression returns true if the specified option
! 173: exists in the incoming DHCP packet being processed.
! 174: .RE
! 175: .B known
! 176: .PP
! 177: .RS 0.25i
! 178: The \fBknown\fR expression returns true if the client whose request is
! 179: currently being processed is known - that is, if there's a host
! 180: declaration for it.
! 181: .RE
! 182: .B static
! 183: .PP
! 184: .RS 0.25i
! 185: The \fBstatic\fR expression returns true if the lease assigned to the
! 186: client whose request is currently being processed is derived from a static
! 187: address assignment.
! 188: .RE
! 189: .SH DATA EXPRESSIONS
! 190: Several of the boolean expressions above depend on the results of
! 191: evaluating data expressions. A list of these expressions is provided
! 192: here.
! 193: .PP
! 194: .B substring (\fIdata-expr\fB, \fIoffset\fB, \fIlength\fB)\fR
! 195: .PP
! 196: .RS 0.25i
! 197: The \fBsubstring\fR operator evaluates the data expression and returns
! 198: the substring of the result of that evaluation that starts
! 199: \fIoffset\fR bytes from the beginning, continuing for \fIlength\fR
! 200: bytes. \fIOffset\fR and \fIlength\fR are both numeric expressions.
! 201: If \fIdata-expr\fR, \fIoffset\fR or \fIlength\fR evaluate to null,
! 202: then the result is also null. If \fIoffset\fR is greater than or
! 203: equal to the length of the evaluated data, then a zero-length data
! 204: string is returned. If \fIlength\fI is greater then the remaining
! 205: length of the evaluated data after \fIoffset\fR, then a data string
! 206: containing all data from \fIoffset\fR to the end of the evaluated data
! 207: is returned.
! 208: .RE
! 209: .PP
! 210: .B suffix (\fIdata-expr\fB, \fIlength\fB)\fR
! 211: .PP
! 212: .RS 0.25i
! 213: The \fBsuffix\fR operator evaluates \fIdata-expr\fR and returns the
! 214: last \fIlength\fR bytes of the result of that evaluation. \fILength\fR
! 215: is a numeric expression. If \fIdata-expr\fR or \fIlength\fR evaluate
! 216: to null, then the result is also null. If \fIsuffix\fR evaluates to a
! 217: number greater than the length of the evaluated data, then the
! 218: evaluated data is returned.
! 219: .RE
! 220: .PP
! 221: .B lcase (\fIdata-expr\fB)\fR
! 222: .PP
! 223: .RS 0.25i
! 224: The \fBlcase\fR function returns the result of evaluating
! 225: \fIdata-expr\fR converted to lower case. If \fIdata-expr\fR evaluates
! 226: to null, then the result is also null.
! 227: .RE
! 228: .PP
! 229: .B ucase (\fIdata-expr\fB)\fR
! 230: .PP
! 231: .RS 0.25i
! 232: The \fBucase\fR function returns the result of evaluating
! 233: \fIdata-expr\fR converted to upper case. If \fIdata-expr\fR evaluates
! 234: to null, then the result is also null.
! 235: .RE
! 236: .PP
! 237: .B option \fIoption-name\fR
! 238: .PP
! 239: .RS 0.25i
! 240: The \fBoption\fR operator returns the contents of the specified option in
! 241: the packet to which the server is responding.
! 242: .RE
! 243: .PP
! 244: .B config-option \fIoption-name\fR
! 245: .PP
! 246: .RS 0.25i
! 247: The \fBconfig-option\fR operator returns the value for the specified option
! 248: that the DHCP client or server has been configured to send.
! 249: .RE
! 250: .PP
! 251: .B hardware
! 252: .PP
! 253: .RS 0.25i
! 254: The \fBhardware\fR operator returns a data string whose first element
! 255: is the type of network interface indicated in packet being considered,
! 256: and whose subsequent elements are client's link-layer address. If
! 257: there is no packet, or if the RFC2131 \fIhlen\fR field is invalid,
! 258: then the result is null. Hardware types include ethernet (1),
! 259: token-ring (6), and fddi (8). Hardware types are specified by the
! 260: IETF, and details on how the type numbers are defined can be found in
! 261: RFC2131 (in the ISC DHCP distribution, this is included in the doc/
! 262: subdirectory).
! 263: .RE
! 264: .PP
! 265: .B packet (\fIoffset\fB, \fIlength\fB)\fR
! 266: .PP
! 267: .RS 0.25i
! 268: The \fBpacket\fR operator returns the specified portion of the packet
! 269: being considered, or null in contexts where no packet is being
! 270: considered. \fIOffset\fR and \fIlength\fR are applied to the
! 271: contents packet as in the \fBsubstring\fR operator.
! 272: .RE
! 273: .PP
! 274: .I string
! 275: .PP
! 276: .RS 0.25i
! 277: A string, enclosed in quotes, may be specified as a data expression,
! 278: and returns the text between the quotes, encoded in ASCII. The
! 279: backslash ('\\') character is treated specially, as in C programming: '\\t'
! 280: means TAB, '\\r' means carriage return, '\\n' means newline, and '\\b' means
! 281: bell. Any octal value can be specified with '\\nnn', where nnn is any
! 282: positive octal number less than 0400. Any hexadecimal value can be
! 283: specified with '\\xnn', where nn is any positive hexadecimal number less
! 284: than or equal to 0xff.
! 285: .RE
! 286: .PP
! 287: .I colon-separated hexadecimal list
! 288: .PP
! 289: .RS 0.25i
! 290: A list of hexadecimal octet values, separated by colons, may be
! 291: specified as a data expression.
! 292: .RE
! 293: .PP
! 294: .B concat (\fIdata-expr1\fB, ..., \fIdata-exprN\fB)\fR
! 295: .RS 0.25i
! 296: The expressions are evaluated, and the results of each evaluation are
! 297: concatenated in the sequence that the subexpressions are listed. If
! 298: any subexpression evaluates to null, the result of the concatenation
! 299: is null.
! 300: .RE
! 301: .PP
! 302: .B reverse (\fInumeric-expr1\fB, \fIdata-expr2\fB)\fR
! 303: .RS 0.25i
! 304: The two expressions are evaluated, and then the result of evaluating
! 305: the data expression is reversed in place, using hunks of the size
! 306: specified in the numeric expression. For example, if the numeric
! 307: expression evaluates to four, and the data expression evaluates to
! 308: twelve bytes of data, then the reverse expression will evaluate to
! 309: twelve bytes of data, consisting of the last four bytes of the the
! 310: input data, followed by the middle four bytes, followed by the first
! 311: four bytes.
! 312: .RE
! 313: .PP
! 314: .B leased-address
! 315: .RS 0.25i
! 316: In any context where the client whose request is being processed has
! 317: been assigned an IP address, this data expression returns that IP
! 318: address. In any context where the client whose request is being
! 319: processed has not been assigned an ip address, if this data expression
! 320: is found in executable statements executed on that client's behalf,
! 321: a log message indicating "there is no lease associated with this client"
! 322: is syslogged to the debug level (this is considered dhcpd.conf debugging
! 323: information).
! 324: .RE
! 325: .PP
! 326: .B binary-to-ascii (\fInumeric-expr1\fB, \fInumeric-expr2\fB,
! 327: .B \fIdata-expr1\fB,\fR \fIdata-expr2\fB)\fR
! 328: .RS 0.25i
! 329: Converts the result of evaluating data-expr2 into a text string
! 330: containing one number for each element of the result of evaluating
! 331: data-expr2. Each number is separated from the other by the result of
! 332: evaluating data-expr1. The result of evaluating numeric-expr1
! 333: specifies the base (2 through 16) into which the numbers should be
! 334: converted. The result of evaluating numeric-expr2 specifies the
! 335: width in bits of each number, which may be either 8, 16 or 32.
! 336: .PP
! 337: As an example of the preceding three types of expressions, to produce
! 338: the name of a PTR record for the IP address being assigned to a
! 339: client, one could write the following expression:
! 340: .RE
! 341: .PP
! 342: .nf
! 343: concat (binary-to-ascii (10, 8, ".",
! 344: reverse (1, leased-address)),
! 345: ".in-addr.arpa.");
! 346:
! 347: .fi
! 348: .RE
! 349: .PP
! 350: .B encode-int (\fInumeric-expr\fB, \fIwidth\fB)\fR
! 351: .RS 0.25i
! 352: Numeric-expr is evaluated and encoded as a data string of the
! 353: specified width, in network byte order (most significant byte first).
! 354: If the numeric expression evaluates to the null value, the result is
! 355: also null.
! 356: .RE
! 357: .PP
! 358: .B pick-first-value (\fIdata-expr1\fR [ ... \fIexpr\fRn ] \fB)\fR
! 359: .RS 0.25i
! 360: The pick-first-value function takes any number of data expressions as
! 361: its arguments. Each expression is evaluated, starting with the first
! 362: in the list, until an expression is found that does not evaluate to a
! 363: null value. That expression is returned, and none of the subsequent
! 364: expressions are evaluated. If all expressions evaluate to a null
! 365: value, the null value is returned.
! 366: .RE
! 367: .PP
! 368: .B host-decl-name
! 369: .RS 0.25i
! 370: The host-decl-name function returns the name of the host declaration
! 371: that matched the client whose request is currently being processed, if
! 372: any. If no host declaration matched, the result is the null value.
! 373: .RE
! 374: .SH NUMERIC EXPRESSIONS
! 375: Numeric expressions are expressions that evaluate to an integer. In
! 376: general, the maximum size of such an integer should not be assumed to
! 377: be representable in fewer than 32 bits, but the precision of such
! 378: integers may be more than 32 bits.
! 379: .PP
! 380: .B extract-int (\fIdata-expr\fB, \fIwidth\fB)\fR
! 381: .PP
! 382: .RS 0.25i
! 383: The \fBextract-int\fR operator extracts an integer value in network
! 384: byte order from the result of evaluating the specified data
! 385: expression. Width is the width in bits of the integer to extract.
! 386: Currently, the only supported widths are 8, 16 and 32. If the
! 387: evaluation of the data expression doesn't provide sufficient bits to
! 388: extract an integer of the specified size, the null value is returned.
! 389: .RE
! 390: .PP
! 391: .B lease-time
! 392: .PP
! 393: .RS 0.25i
! 394: The duration of the current lease - that is, the difference between
! 395: the current time and the time that the lease expires.
! 396: .RE
! 397: .PP
! 398: .I number
! 399: .PP
! 400: .RS 0.25i
! 401: Any number between zero and the maximum representable size may be
! 402: specified as a numeric expression.
! 403: .RE
! 404: .PP
! 405: .B client-state
! 406: .PP
! 407: .RS 0.25i
! 408: The current state of the client instance being processed. This is
! 409: only useful in DHCP client configuration files. Possible values are:
! 410: .TP 2
! 411: .I \(bu
! 412: Booting - DHCP client is in the INIT state, and does not yet have an
! 413: IP address. The next message transmitted will be a DHCPDISCOVER,
! 414: which will be broadcast.
! 415: .TP
! 416: .I \(bu
! 417: Reboot - DHCP client is in the INIT-REBOOT state. It has an IP
! 418: address, but is not yet using it. The next message to be transmitted
! 419: will be a DHCPREQUEST, which will be broadcast. If no response is
! 420: heard, the client will bind to its address and move to the BOUND state.
! 421: .TP
! 422: .I \(bu
! 423: Select - DHCP client is in the SELECTING state - it has received at
! 424: least one DHCPOFFER message, but is waiting to see if it may receive
! 425: other DHCPOFFER messages from other servers. No messages are sent in
! 426: the SELECTING state.
! 427: .TP
! 428: .I \(bu
! 429: Request - DHCP client is in the REQUESTING state - it has received at
! 430: least one DHCPOFFER message, and has chosen which one it will
! 431: request. The next message to be sent will be a DHCPREQUEST message,
! 432: which will be broadcast.
! 433: .TP
! 434: .I \(bu
! 435: Bound - DHCP client is in the BOUND state - it has an IP address. No
! 436: messages are transmitted in this state.
! 437: .TP
! 438: .I \(bu
! 439: Renew - DHCP client is in the RENEWING state - it has an IP address,
! 440: and is trying to contact the server to renew it. The next message to
! 441: be sent will be a DHCPREQUEST message, which will be unicast directly
! 442: to the server.
! 443: .TP
! 444: .I \(bu
! 445: Rebind - DHCP client is in the REBINDING state - it has an IP address,
! 446: and is trying to contact any server to renew it. The next message to
! 447: be sent will be a DHCPREQUEST, which will be broadcast.
! 448: .RE
! 449: .SH REFERENCE: ACTION EXPRESSIONS
! 450: .PP
! 451: .B log (\fIpriority\fB, \fIdata-expr\fB)\fR
! 452: .RS 0.25i
! 453: .PP
! 454: Logging statements may be used to send information to the standard logging
! 455: channels. A logging statement includes an optional priority (\fBfatal\fR,
! 456: \fBerror\fR, \fBinfo\fR, or \fBdebug\fR), and a data expression.
! 457: .PP
! 458: Logging statements take only a single data expression argument, so if you
! 459: want to output multiple data values, you will need to use the \fBconcat\fR
! 460: operator to concatenate them.
! 461: .RE
! 462: .PP
! 463: .B execute (\fIcommand-path\fB [, \fIdata-expr1\fB, ... \fIdata-exprN\fB]);\fR
! 464: .RS 0.25i
! 465: .PP
! 466: The \fBexecute\fR statement runs an external command. The first argument
! 467: is a string literal containing the name or path of the command to run.
! 468: The other arguments, if present, are either string literals or data-
! 469: expressions which evaluate to text strings, to be passed as command-line
! 470: arguments to the command.
! 471: .PP
! 472: \fBexecute\fR is synchronous; the program will block until the external
! 473: command being run has finished. Please note that lengthy program
! 474: execution (for example, in an "on commit" in dhcpd.conf) may result in
! 475: bad performance and timeouts. Only external applications with very short
! 476: execution times are suitable for use.
! 477: .PP
! 478: Passing user-supplied data to an external application might be dangerous.
! 479: Make sure the external application checks input buffers for validity.
! 480: Non-printable ASCII characters will be converted into dhcpd.conf language
! 481: octal escapes ("\777"), make sure your external command handles them as
! 482: such.
! 483: .PP
! 484: It is possible to use the execute statement in any context, not only
! 485: on events. If you put it in a regular scope in the configuration file
! 486: you will execute that command every time a scope is evaluated.
! 487: .RE
! 488: .SH REFERENCE: DYNAMIC DNS UPDATES
! 489: .PP
! 490: The DHCP client and server have the ability to dynamically update the
! 491: Domain Name System. Within the configuration files, you can define
! 492: how you want the Domain Name System to be updated. These updates are
! 493: RFC 2136 compliant so any DNS server supporting RFC 2136 should be
! 494: able to accept updates from the DHCP server.
! 495: .SH SECURITY
! 496: Support for TSIG and DNSSEC is not yet available. When you set your
! 497: DNS server up to allow updates from the DHCP server or client, you may
! 498: be exposing it to unauthorized updates. To avoid this, the best you
! 499: can do right now is to use IP address-based packet filtering to
! 500: prevent unauthorized hosts from submitting update requests.
! 501: Obviously, there is currently no way to provide security for client
! 502: updates - this will require TSIG or DNSSEC, neither of which is yet
! 503: available in the DHCP distribution.
! 504: .PP
! 505: Dynamic DNS (DDNS) updates are performed by using the \fBdns-update\fR
! 506: expression. The \fBdns-update\fR expression is a boolean expression
! 507: that takes four parameters. If the update succeeds, the result is
! 508: true. If it fails, the result is false. The four parameters that the
! 509: are the resource record type (RR), the left hand side of the RR, the
! 510: right hand side of the RR and the ttl that should be applied to the
! 511: record. The simplest example of the use of the function can be found
! 512: in the reference section of the dhcpd.conf file, where events are
! 513: described. In this example several statements are being used to make
! 514: the arguments to the \fBdns-update\fR.
! 515: .PP
! 516: In the example, the first argument to the first \f\Bdns-update\fR
! 517: expression is a data expression that evaluates to the A RR type. The
! 518: second argument is constructed by concatenating the DHCP host-name
! 519: option with a text string containing the local domain, in this case
! 520: "ssd.example.net". The third argument is constructed by converting
! 521: the address the client has been assigned from a 32-bit number into an
! 522: ascii string with each byte separated by a ".". The fourth argument,
! 523: the TTL, specifies the amount of time remaining in the lease (note
! 524: that this isn't really correct, since the DNS server will pass this
! 525: TTL out whenever a request comes in, even if that is only a few
! 526: seconds before the lease expires).
! 527: .PP
! 528: If the first \fBdns-update\fR statement succeeds, it is followed up
! 529: with a second update to install a PTR RR. The installation of a PTR
! 530: record is similar to installing an A RR except that the left hand side
! 531: of the record is the leased address, reversed, with ".in-addr.arpa"
! 532: concatenated. The right hand side is the fully qualified domain name
! 533: of the client to which the address is being leased.
! 534: .SH SEE ALSO
! 535: dhcpd.conf(5), dhcpd.leases(5), dhclient.conf(5), dhcp-options(5), dhcpd(8),
! 536: dhclient(8), RFC2132, RFC2131.
! 537: .SH AUTHOR
! 538: The Internet Systems Consortium DHCP Distribution was written by Ted
! 539: Lemon under a contract with Vixie Labs. Funding for
! 540: this project was provided through Internet Systems Consortium.
! 541: Information about Internet Systems Consortium can be found at
! 542: .B https://www.isc.org.
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>