xref: /freebsd/lib/libradius/libradius.3 (revision b5c508fba33452c36601090d080ddc688efad870)
1082bfe67SJohn Polstra.\" Copyright 1998 Juniper Networks, Inc.
2082bfe67SJohn Polstra.\" All rights reserved.
3082bfe67SJohn Polstra.\"
4082bfe67SJohn Polstra.\" Redistribution and use in source and binary forms, with or without
5082bfe67SJohn Polstra.\" modification, are permitted provided that the following conditions
6082bfe67SJohn Polstra.\" are met:
7082bfe67SJohn Polstra.\" 1. Redistributions of source code must retain the above copyright
8082bfe67SJohn Polstra.\"    notice, this list of conditions and the following disclaimer.
9082bfe67SJohn Polstra.\" 2. Redistributions in binary form must reproduce the above copyright
10082bfe67SJohn Polstra.\"    notice, this list of conditions and the following disclaimer in the
11082bfe67SJohn Polstra.\"    documentation and/or other materials provided with the distribution.
12082bfe67SJohn Polstra.\"
13082bfe67SJohn Polstra.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14082bfe67SJohn Polstra.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15082bfe67SJohn Polstra.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16082bfe67SJohn Polstra.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17082bfe67SJohn Polstra.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18082bfe67SJohn Polstra.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19082bfe67SJohn Polstra.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20082bfe67SJohn Polstra.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21082bfe67SJohn Polstra.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22082bfe67SJohn Polstra.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23082bfe67SJohn Polstra.\" SUCH DAMAGE.
24082bfe67SJohn Polstra.\"
257f3dea24SPeter Wemm.\" $FreeBSD$
26082bfe67SJohn Polstra.\"
270981dfefSJohn Polstra.Dd October 30, 1999
28082bfe67SJohn Polstra.Dt LIBRADIUS 3
29082bfe67SJohn Polstra.Os FreeBSD
30082bfe67SJohn Polstra.Sh NAME
31082bfe67SJohn Polstra.Nm libradius
32082bfe67SJohn Polstra.Nd RADIUS client library
33082bfe67SJohn Polstra.Sh SYNOPSIS
34082bfe67SJohn Polstra.Fd #include <radlib.h>
350981dfefSJohn Polstra.Ft struct rad_handle *
360981dfefSJohn Polstra.Fn rad_acct_open "void"
37082bfe67SJohn Polstra.Ft int
38082bfe67SJohn Polstra.Fn rad_add_server "struct rad_handle *h" "const char *host" "int port" "const char *secret" "int timeout" "int max_tries"
390981dfefSJohn Polstra.Ft struct rad_handle *
400981dfefSJohn Polstra.Fn rad_auth_open "void"
41082bfe67SJohn Polstra.Ft void
42082bfe67SJohn Polstra.Fn rad_close "struct rad_handle *h"
43082bfe67SJohn Polstra.Ft int
44082bfe67SJohn Polstra.Fn rad_config "struct rad_handle *h" "const char *file"
45082bfe67SJohn Polstra.Ft int
4648caee2aSBrian Somers.Fn rad_continue_send_request "struct rad_handle *h" "int selected" "int *fd" "struct timeval *tv"
4748caee2aSBrian Somers.Ft int
48082bfe67SJohn Polstra.Fn rad_create_request "struct rad_handle *h" "int code"
49082bfe67SJohn Polstra.Ft struct in_addr
50082bfe67SJohn Polstra.Fn rad_cvt_addr "const void *data"
51082bfe67SJohn Polstra.Ft u_int32_t
52082bfe67SJohn Polstra.Fn rad_cvt_int "const void *data"
53082bfe67SJohn Polstra.Ft char *
54082bfe67SJohn Polstra.Fn rad_cvt_string "const void *data" "size_t len"
55082bfe67SJohn Polstra.Ft int
56082bfe67SJohn Polstra.Fn rad_get_attr "struct rad_handle *h" "const void **data" "size_t *len"
5748caee2aSBrian Somers.Ft int
5848caee2aSBrian Somers.Fn rad_init_send_request "struct rad_handle *h" "int *fd" "struct timeval *tv"
59082bfe67SJohn Polstra.Ft int
60082bfe67SJohn Polstra.Fn rad_put_addr "struct rad_handle *h" "int type" "struct in_addr addr"
61082bfe67SJohn Polstra.Ft int
62082bfe67SJohn Polstra.Fn rad_put_attr "struct rad_handle *h" "int type" "const void *data" "size_t len"
63082bfe67SJohn Polstra.Ft int
64082bfe67SJohn Polstra.Fn rad_put_int "struct rad_handle *h" "int type" "u_int32_t value"
65082bfe67SJohn Polstra.Ft int
66082bfe67SJohn Polstra.Fn rad_put_string "struct rad_handle *h" "int type" "const char *str"
67082bfe67SJohn Polstra.Ft int
68082bfe67SJohn Polstra.Fn rad_send_request "struct rad_handle *h"
69082bfe67SJohn Polstra.Ft const char *
70082bfe67SJohn Polstra.Fn rad_strerror "struct rad_handle *h"
71082bfe67SJohn Polstra.Sh DESCRIPTION
72082bfe67SJohn PolstraThe
73082bfe67SJohn Polstra.Nm
740981dfefSJohn Polstralibrary implements the client side of the Remote Authentication Dial
750981dfefSJohn PolstraIn User Service (RADIUS).  RADIUS, defined in RFCs 2138 and 2139,
760981dfefSJohn Polstraallows clients to perform authentication and accounting by means of
770981dfefSJohn Polstranetwork requests to remote servers.
78082bfe67SJohn Polstra.Sh INITIALIZATION
79082bfe67SJohn PolstraTo use the library, an application must first call
800981dfefSJohn Polstra.Fn rad_auth_open
810981dfefSJohn Polstraor
820981dfefSJohn Polstra.Fn rad_acct_open
83082bfe67SJohn Polstrato obtain a
84082bfe67SJohn Polstra.Va struct rad_handle * ,
85082bfe67SJohn Polstrawhich provides the context for subsequent operations.
860981dfefSJohn PolstraThe former function is used for RADIUS authentication and the
870981dfefSJohn Polstralatter is used for RADIUS accounting.
88082bfe67SJohn PolstraCalls to
890981dfefSJohn Polstra.Fn rad_auth_open
900981dfefSJohn Polstraand
910981dfefSJohn Polstra.Fn rad_acct_open
92082bfe67SJohn Polstraalways succeed unless insufficient virtual memory is available.  If
930981dfefSJohn Polstrathe necessary memory cannot be allocated, the functions return
94082bfe67SJohn Polstra.Dv NULL .
950981dfefSJohn PolstraFor compatibility with earlier versions of this library,
960981dfefSJohn Polstra.Fn rad_open
970981dfefSJohn Polstrais provided as a synonym for
980981dfefSJohn Polstra.Fn rad_auth_open .
99082bfe67SJohn Polstra.Pp
100082bfe67SJohn PolstraBefore issuing any RADIUS requests, the library must be made aware
101082bfe67SJohn Polstraof the servers it can contact.  The easiest way to configure the
102082bfe67SJohn Polstralibrary is to call
103082bfe67SJohn Polstra.Fn rad_config .
104082bfe67SJohn Polstra.Fn rad_config
105082bfe67SJohn Polstracauses the library to read a configuration file whose format is
106082bfe67SJohn Polstradescribed in
107082bfe67SJohn Polstra.Xr radius.conf 5 .
108082bfe67SJohn PolstraThe pathname of the configuration file is passed as the
109082bfe67SJohn Polstra.Va file
110082bfe67SJohn Polstraargument to
111082bfe67SJohn Polstra.Fn rad_config .
112082bfe67SJohn PolstraThis argument may also be given as
113082bfe67SJohn Polstra.Dv NULL ,
114082bfe67SJohn Polstrain which case the standard configuration file
115082bfe67SJohn Polstra.Pa /etc/radius.conf
116082bfe67SJohn Polstrais used.
117082bfe67SJohn Polstra.Fn rad_config
118082bfe67SJohn Polstrareturns 0 on success, or -1 if an error occurs.
119082bfe67SJohn Polstra.Pp
120082bfe67SJohn PolstraThe library can also be configured programmatically by calls to
121082bfe67SJohn Polstra.Fn rad_add_server .
122082bfe67SJohn PolstraThe
123082bfe67SJohn Polstra.Va host
124082bfe67SJohn Polstraparameter specifies the server host, either as a fully qualified
125082bfe67SJohn Polstradomain name or as a dotted-quad IP address in text form.
126082bfe67SJohn PolstraThe
127082bfe67SJohn Polstra.Va port
128082bfe67SJohn Polstraparameter specifies the UDP port to contact on the server.  If
129082bfe67SJohn Polstra.Va port
130082bfe67SJohn Polstrais given as 0, the library looks up the
131082bfe67SJohn Polstra.Ql radius/udp
1320981dfefSJohn Polstraor
1330981dfefSJohn Polstra.Ql radacct/udp
134082bfe67SJohn Polstraservice in the network services database, and uses the port found
1350981dfefSJohn Polstrathere.  If no entry is found, the library uses the standard RADIUS
1360981dfefSJohn Polstraports, 1812 for authentication and 1813 for accounting.
1370981dfefSJohn PolstraThe shared secret for the server host is passed to the
138082bfe67SJohn Polstra.Va secret
139082bfe67SJohn Polstraparameter.
140082bfe67SJohn PolstraIt may be any NUL-terminated string of bytes.  The RADIUS protocol
141082bfe67SJohn Polstraignores all but the leading 128 bytes of the shared secret.
142082bfe67SJohn PolstraThe timeout for receiving replies from the server is passed to the
143082bfe67SJohn Polstra.Va timeout
144082bfe67SJohn Polstraparameter, in units of seconds.  The maximum number of repeated
145082bfe67SJohn Polstrarequests to make before giving up is passed into the
146082bfe67SJohn Polstra.Va max_tries
147082bfe67SJohn Polstraparameter.
148082bfe67SJohn Polstra.Fn rad_add_server
149082bfe67SJohn Polstrareturns 0 on success, or -1 if an error occurs.
150082bfe67SJohn Polstra.Pp
151082bfe67SJohn Polstra.Fn rad_add_server
152082bfe67SJohn Polstramay be called multiple times, and it may be used together with
153082bfe67SJohn Polstra.Fn rad_config .
154082bfe67SJohn PolstraAt most 10 servers may be specified.
155082bfe67SJohn PolstraWhen multiple servers are given, they are tried in round-robin
156082bfe67SJohn Polstrafashion until a valid response is received, or until each server's
157082bfe67SJohn Polstra.Va max_tries
158082bfe67SJohn Polstralimit has been reached.
159082bfe67SJohn Polstra.Sh CREATING A RADIUS REQUEST
160082bfe67SJohn PolstraA RADIUS request consists of a code specifying the kind of request,
161082bfe67SJohn Polstraand zero or more attributes which provide additional information.  To
162082bfe67SJohn Polstrabegin constructing a new request, call
163082bfe67SJohn Polstra.Fn rad_create_request .
164082bfe67SJohn PolstraIn addition to the usual
165082bfe67SJohn Polstra.Va struct rad_handle * ,
166082bfe67SJohn Polstrathis function takes a
167082bfe67SJohn Polstra.Va code
168082bfe67SJohn Polstraparameter which specifies the type of the request.  Most often this
169082bfe67SJohn Polstrawill be
170082bfe67SJohn Polstra.Dv RAD_ACCESS_REQUEST .
171082bfe67SJohn Polstra.Fn rad_create_request
172082bfe67SJohn Polstrareturns 0 on success, or -1 on if an error occurs.
173082bfe67SJohn Polstra.Pp
174082bfe67SJohn PolstraAfter the request has been created with
175abac9a9eSBrian Somers.Fn rad_create_request ,
176082bfe67SJohn Polstraattributes can be attached to it.  This is done through calls to
177082bfe67SJohn Polstra.Fn rad_put_addr ,
178082bfe67SJohn Polstra.Fn rad_put_int ,
179082bfe67SJohn Polstraand
180082bfe67SJohn Polstra.Fn rad_put_string .
181082bfe67SJohn PolstraEach accepts a
182082bfe67SJohn Polstra.Va type
183082bfe67SJohn Polstraparameter identifying the attribute, and a value which may be
184082bfe67SJohn Polstraan Internet address, an integer, or a NUL-terminated string,
185082bfe67SJohn Polstrarespectively.
186082bfe67SJohn Polstra.Pp
187082bfe67SJohn PolstraThe library also provides a function
188082bfe67SJohn Polstra.Fn rad_put_attr
189082bfe67SJohn Polstrawhich can be used to supply a raw, uninterpreted attribute.  The
190082bfe67SJohn Polstra.Va data
191082bfe67SJohn Polstraargument points to an array of bytes, and the
192082bfe67SJohn Polstra.Va len
193082bfe67SJohn Polstraargument specifies its length.
194082bfe67SJohn Polstra.Pp
195082bfe67SJohn PolstraThe
196082bfe67SJohn Polstra.Fn rad_put_X
197082bfe67SJohn Polstrafunctions return 0 on success, or -1 if an error occurs.
198082bfe67SJohn Polstra.Sh SENDING THE REQUEST AND RECEIVING THE RESPONSE
19948caee2aSBrian SomersAfter the RADIUS request has been constructed, it is sent either by means of
20048caee2aSBrian Somers.Fn rad_send_request
20148caee2aSBrian Somersor by a combination of calls to
20248caee2aSBrian Somers.Fn rad_init_send_request
20348caee2aSBrian Somersand
20448caee2aSBrian Somers.Fn rad_continue_send_request .
20548caee2aSBrian Somers.Pp
20648caee2aSBrian SomersThe
20748caee2aSBrian Somers.Fn rad_send_request
20848caee2aSBrian Somersfunction sends the request and waits for a valid reply,
209082bfe67SJohn Polstraretrying the defined servers in round-robin fashion as necessary.
210082bfe67SJohn PolstraIf a valid response is received,
211082bfe67SJohn Polstra.Fn rad_send_request
212082bfe67SJohn Polstrareturns the RADIUS code which specifies the type of the response.
213082bfe67SJohn PolstraThis will typically be
214082bfe67SJohn Polstra.Dv RAD_ACCESS_ACCEPT ,
215082bfe67SJohn Polstra.Dv RAD_ACCESS_REJECT ,
216082bfe67SJohn Polstraor
217082bfe67SJohn Polstra.Dv RAD_ACCESS_CHALLENGE .
218082bfe67SJohn PolstraIf no valid response is received,
219082bfe67SJohn Polstra.Fn rad_send_request
220082bfe67SJohn Polstrareturns -1.
221082bfe67SJohn Polstra.Pp
22248caee2aSBrian SomersAs an alternative, if you do not wish to block waiting for a response,
22348caee2aSBrian Somers.Fn rad_init_send_request
22448caee2aSBrian Somersand
22548caee2aSBrian Somers.Fn rad_continue_send_request
22648caee2aSBrian Somersmay be used instead.  If a reply is received from the RADIUS server or a
22748caee2aSBrian Somerstimeout occurs, these functions return a value as described for
22848caee2aSBrian Somers.Fn rad_send_request .
22948caee2aSBrian SomersOtherwise, a value of zero is returned and the values pointed to by
23048caee2aSBrian Somers.Ar fd
23148caee2aSBrian Somersand
23248caee2aSBrian Somers.Ar tv
23348caee2aSBrian Somersare set to the descriptor and timeout that should be passed to
23448caee2aSBrian Somers.Xr select 2 .
23548caee2aSBrian Somers.Pp
23648caee2aSBrian Somers.Fn rad_init_send_request
23748caee2aSBrian Somersmust be called first, followed by repeated calls to
23848caee2aSBrian Somers.Fn rad_continue_send_request
23948caee2aSBrian Somersas long as a return value of zero is given.
24048caee2aSBrian SomersBetween each call, the application should call
24148caee2aSBrian Somers.Xr select 2 ,
24248caee2aSBrian Somerspassing
24348caee2aSBrian Somers.Ar *fd
24448caee2aSBrian Somersas a read descriptor and timing out after the interval specified by
24548caee2aSBrian Somers.Ar tv .
24648caee2aSBrian SomersWhen select returns,
24748caee2aSBrian Somers.Fn rad_continue_send_request
24848caee2aSBrian Somersshould be called with
24948caee2aSBrian Somers.Ar selected
25048caee2aSBrian Somersset to a non-zero value if
25148caee2aSBrian Somers.Xr select 2
25248caee2aSBrian Somersindicated that the descriptor is readable.
25348caee2aSBrian Somers.Pp
254082bfe67SJohn PolstraLike RADIUS requests, each response may contain zero or more
255082bfe67SJohn Polstraattributes.  After a response has been received successfully by
25648caee2aSBrian Somers.Fn rad_send_request
25748caee2aSBrian Somersor
25848caee2aSBrian Somers.Fn rad_continue_send_request ,
259082bfe67SJohn Polstraits attributes can be extracted one by one using
260082bfe67SJohn Polstra.Fn rad_get_attr .
261082bfe67SJohn PolstraEach time
262082bfe67SJohn Polstra.Fn rad_get_attr
263082bfe67SJohn Polstrais called, it gets the next attribute from the current response, and
264082bfe67SJohn Polstrastores a pointer to the data and the length of the data via the
265082bfe67SJohn Polstrareference parameters
266082bfe67SJohn Polstra.Va data
267082bfe67SJohn Polstraand
268082bfe67SJohn Polstra.Va len ,
269082bfe67SJohn Polstrarespectively.  Note that the data resides in the response itself,
270082bfe67SJohn Polstraand must not be modified.
271082bfe67SJohn PolstraA successful call to
272082bfe67SJohn Polstra.Fn rad_get_attr
273082bfe67SJohn Polstrareturns the RADIUS attribute type.
274082bfe67SJohn PolstraIf no more attributes remain in the current response,
275082bfe67SJohn Polstra.Fn rad_get_attr
276082bfe67SJohn Polstrareturns 0.
277082bfe67SJohn PolstraIf an error such as a malformed attribute is detected, -1 is
278082bfe67SJohn Polstrareturned.
279082bfe67SJohn Polstra.Pp
280082bfe67SJohn PolstraThe common types of attributes can be decoded using
281082bfe67SJohn Polstra.Fn rad_cvt_addr ,
282082bfe67SJohn Polstra.Fn rad_cvt_int ,
283082bfe67SJohn Polstraand
284082bfe67SJohn Polstra.Fn rad_cvt_string .
285082bfe67SJohn PolstraThese functions accept a pointer to the attribute data, which should
286082bfe67SJohn Polstrahave been obtained using
287082bfe67SJohn Polstra.Fn rad_get_attr .
288082bfe67SJohn PolstraIn the case of
289082bfe67SJohn Polstra.Fn rad_cvt_string ,
290082bfe67SJohn Polstrathe length
291082bfe67SJohn Polstra.Va len
292082bfe67SJohn Polstramust also be given.  These functions interpret the attribute as an
293082bfe67SJohn PolstraInternet address, an integer, or a string, respectively, and return
294082bfe67SJohn Polstraits value.
295082bfe67SJohn Polstra.Fn rad_cvt_string
296082bfe67SJohn Polstrareturns its value as a NUL-terminated string in dynamically
297082bfe67SJohn Polstraallocated memory.  The application should free the string using
298082bfe67SJohn Polstra.Xr free 3
299082bfe67SJohn Polstrawhen it is no longer needed.
300082bfe67SJohn Polstra.Pp
301082bfe67SJohn PolstraIf insufficient virtual memory is available,
302082bfe67SJohn Polstra.Fn rad_cvt_string
303082bfe67SJohn Polstrareturns
304082bfe67SJohn Polstra.Dv NULL .
305082bfe67SJohn Polstra.Fn rad_cvt_addr
306082bfe67SJohn Polstraand
307082bfe67SJohn Polstra.Fn rad_cvt_int
308082bfe67SJohn Polstracannot fail.
309082bfe67SJohn Polstra.Sh OBTAINING ERROR MESSAGES
310082bfe67SJohn PolstraThose functions which accept a
311082bfe67SJohn Polstra.Va struct rad_handle *
312082bfe67SJohn Polstraargument record an error message if they fail.  The error message
313082bfe67SJohn Polstracan be retrieved by calling
314082bfe67SJohn Polstra.Fn rad_strerror .
315082bfe67SJohn PolstraThe message text is overwritten on each new error for the given
316082bfe67SJohn Polstra.Va struct rad_handle * .
317082bfe67SJohn PolstraThus the message must be copied if it is to be preserved through
318082bfe67SJohn Polstrasubsequent library calls using the same handle.
319082bfe67SJohn Polstra.Sh CLEANUP
320082bfe67SJohn PolstraTo free the resources used by the RADIUS library, call
321082bfe67SJohn Polstra.Fn rad_close .
322082bfe67SJohn Polstra.Sh RETURN VALUES
323082bfe67SJohn PolstraThe following functions return a non-negative value on success.  If
324082bfe67SJohn Polstrathey detect an error, they return -1 and record an error message
325082bfe67SJohn Polstrawhich can be retrieved using
326082bfe67SJohn Polstra.Fn rad_strerror .
327082bfe67SJohn Polstra.Pp
328082bfe67SJohn Polstra.Bl -item -offset indent -compact
329082bfe67SJohn Polstra.It
330082bfe67SJohn Polstra.Fn rad_add_server
331082bfe67SJohn Polstra.It
332082bfe67SJohn Polstra.Fn rad_config
333082bfe67SJohn Polstra.It
334082bfe67SJohn Polstra.Fn rad_create_request
335082bfe67SJohn Polstra.It
336082bfe67SJohn Polstra.Fn rad_get_attr
337082bfe67SJohn Polstra.It
338082bfe67SJohn Polstra.Fn rad_put_addr
339082bfe67SJohn Polstra.It
340082bfe67SJohn Polstra.Fn rad_put_attr
341082bfe67SJohn Polstra.It
342082bfe67SJohn Polstra.Fn rad_put_int
343082bfe67SJohn Polstra.It
344082bfe67SJohn Polstra.Fn rad_put_string
345082bfe67SJohn Polstra.It
34648caee2aSBrian Somers.Fn rad_init_send_request
34748caee2aSBrian Somers.It
34848caee2aSBrian Somers.Fn rad_continue_send_request
34948caee2aSBrian Somers.It
350082bfe67SJohn Polstra.Fn rad_send_request
351082bfe67SJohn Polstra.El
352082bfe67SJohn Polstra.Pp
353082bfe67SJohn PolstraThe following functions return a
354082bfe67SJohn Polstra.No non- Ns Dv NULL
355082bfe67SJohn Polstrapointer on success.  If they are unable to allocate sufficient
356082bfe67SJohn Polstravirtual memory, they return
357082bfe67SJohn Polstra.Dv NULL ,
358082bfe67SJohn Polstrawithout recording an error message.
359082bfe67SJohn Polstra.Pp
360082bfe67SJohn Polstra.Bl -item -offset indent -compact
361082bfe67SJohn Polstra.It
3620981dfefSJohn Polstra.Fn rad_acct_open
363082bfe67SJohn Polstra.It
3640981dfefSJohn Polstra.Fn rad_auth_open
3650981dfefSJohn Polstra.It
3660981dfefSJohn Polstra.Fn rad_cvt_string
367082bfe67SJohn Polstra.El
368082bfe67SJohn Polstra.Sh FILES
369082bfe67SJohn Polstra.Pa /etc/radius.conf
370082bfe67SJohn Polstra.Sh SEE ALSO
371082bfe67SJohn Polstra.Xr radius.conf 5
372082bfe67SJohn Polstra.Rs
373082bfe67SJohn Polstra.%A C. Rigney, et al
374082bfe67SJohn Polstra.%T Remote Authentication Dial In User Service (RADIUS)
375082bfe67SJohn Polstra.%O RFC 2138
376082bfe67SJohn Polstra.Re
3770981dfefSJohn Polstra.Rs
3780981dfefSJohn Polstra.%A C. Rigney
3790981dfefSJohn Polstra.%T RADIUS Accounting
3800981dfefSJohn Polstra.%O RFC 2139
3810981dfefSJohn Polstra.Re
382082bfe67SJohn Polstra.Sh AUTHORS
3830981dfefSJohn PolstraThis software was originally written by
384082bfe67SJohn Polstra.An John Polstra ,
385b5c508fbSRuslan Ermilovand donated to the
386b5c508fbSRuslan Ermilov.Fx
387b5c508fbSRuslan Ermilovproject by Juniper Networks, Inc.
3880981dfefSJohn PolstraOleg Semyonov subsequently added the ability to perform RADIUS
3890981dfefSJohn Polstraaccounting.
390