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