Radcli library 2.0.0
A simple radius library -- legacy API reference
Loading...
Searching...
No Matches
radcli-defs.h
1/*
2 * Copyright (C) 1995,1996,1997,1998 Lars Fenneberg
3 *
4 * Copyright 1992 Livingston Enterprises, Inc.
5 *
6 * Copyright 1992,1993, 1994,1995 The Regents of the University of Michigan
7 * and Merit Network, Inc. All Rights Reserved
8 *
9 * See the file COPYRIGHT for the respective terms and conditions.
10 * If the file is missing contact me at lf@elemental.net
11 * and I'll send you a copy.
12 *
13 * Copyright (C) 2026 Nikos Mavrogiannopoulos
14 *
15 * Redistribution and use in source and binary forms, with or without
16 * modification, are permitted provided that the following conditions
17 * are met:
18 * 1. Redistributions of source code must retain the above copyright
19 * notice, this list of conditions and the following disclaimer.
20 * 2. Redistributions in binary form must reproduce the above copyright
21 * notice, this list of conditions and the following disclaimer in the
22 * documentation and/or other materials provided with the distribution.
23 *
24 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
25 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
26 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
27 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
28 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
29 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
30 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
31 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
33 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 */
35
67
68#ifndef RADCLI_DEFS_H
69#define RADCLI_DEFS_H
70
71/* *INDENT-OFF* */
72#ifdef __cplusplus
73extern "C" {
74#endif
75/* *INDENT-ON* */
76
79typedef enum rc_attr_id {
80 PW_USER_NAME=1,
81 PW_USER_PASSWORD=2,
82 PW_CHAP_PASSWORD=3,
83 PW_NAS_IP_ADDRESS=4,
84 PW_NAS_PORT=5,
85 PW_SERVICE_TYPE=6,
86 PW_FRAMED_PROTOCOL=7,
87 PW_FRAMED_IP_ADDRESS=8,
88 PW_FRAMED_IP_NETMASK=9,
89 PW_FRAMED_ROUTING=10,
90 PW_FILTER_ID=11,
91 PW_FRAMED_MTU=12,
92 PW_FRAMED_COMPRESSION=13,
93 PW_LOGIN_IP_HOST=14,
94 PW_LOGIN_SERVICE=15,
95 PW_LOGIN_PORT=16,
96 PW_OLD_PASSWORD=17,
97 PW_REPLY_MESSAGE=18,
98 PW_LOGIN_CALLBACK_NUMBER=19,
99 PW_FRAMED_CALLBACK_ID=20,
100 PW_EXPIRATION=21,
101 PW_FRAMED_ROUTE=22,
102 PW_FRAMED_IPX_NETWORK=23,
103 PW_STATE=24,
104 PW_CLASS=25,
105 PW_VENDOR_SPECIFIC=26,
106 PW_SESSION_TIMEOUT=27,
107 PW_IDLE_TIMEOUT=28,
108 PW_TERMINATION_ACTION=29,
109 PW_CALLED_STATION_ID=30,
110 PW_CALLING_STATION_ID=31,
111 PW_NAS_IDENTIFIER=32,
112 PW_PROXY_STATE=33,
113 PW_LOGIN_LAT_SERVICE=34,
114 PW_LOGIN_LAT_NODE=35,
115 PW_LOGIN_LAT_GROUP=36,
116 PW_FRAMED_APPLETALK_LINK=37,
117 PW_FRAMED_APPLETALK_NETWORK=38,
118 PW_FRAMED_APPLETALK_ZONE=39,
119 PW_ACCT_STATUS_TYPE=40,
120 PW_ACCT_DELAY_TIME=41,
121 PW_ACCT_INPUT_OCTETS=42,
122 PW_ACCT_OUTPUT_OCTETS=43,
123 PW_ACCT_SESSION_ID=44,
124 PW_ACCT_AUTHENTIC=45,
125 PW_ACCT_SESSION_TIME=46,
126 PW_ACCT_INPUT_PACKETS=47,
127 PW_ACCT_OUTPUT_PACKETS=48,
128 PW_ACCT_TERMINATE_CAUSE=49,
129 PW_ACCT_MULTI_SESSION_ID=50,
130 PW_ACCT_LINK_COUNT=51,
131 PW_ACCT_INPUT_GIGAWORDS=52,
132 PW_ACCT_OUTPUT_GIGAWORDS=53,
133 PW_EVENT_TIMESTAMP=55,
134 PW_EGRESS_VLANID=56,
135 PW_INGRESS_FILTERS=57,
136 PW_EGRESS_VLAN_NAME=58,
137 PW_USER_PRIORITY_TABLE=59,
138 PW_CHAP_CHALLENGE=60,
139 PW_NAS_PORT_TYPE=61,
140 PW_PORT_LIMIT=62,
141 PW_LOGIN_LAT_PORT=63,
142 PW_TUNNEL_TYPE=64,
143 PW_TUNNEL_MEDIUM_TYPE=65,
144 PW_TUNNEL_CLIENT_ENDPOINT=66,
145 PW_TUNNEL_SERVER_ENDPOINT=67,
146 PW_ACCT_TUNNEL_CONNECTION=68,
147 PW_TUNNEL_PASSWORD=69,
148 PW_ARAP_PASSWORD=70,
149 PW_ARAP_FEATURES=71,
150 PW_ARAP_ZONE_ACCESS=72,
151 PW_ARAP_SECURITY=73,
152 PW_ARAP_SECURITY_DATA=74,
153 PW_PASSWORD_RETRY=75,
154 PW_PROMPT=76,
155 PW_CONNECT_INFO=77,
156 PW_CONFIGURATION_TOKEN=78,
157 PW_EAP_MESSAGE=79,
158 PW_MESSAGE_AUTHENTICATOR=80,
159 PW_TUNNEL_PRIVATE_GROUP_ID=81,
160 PW_TUNNEL_ASSIGNMENT_ID=82,
161 PW_TUNNEL_PREFERENCE=83,
162 PW_ARAP_CHALLENGE_RESPONSE=84,
163 PW_ACCT_INTERIM_INTERVAL=85,
164 PW_ACCT_TUNNEL_PACKETS_LOST=86,
165 PW_NAS_PORT_ID_STRING=87,
166 PW_FRAMED_POOL=88,
167 PW_CHARGEABLE_USER_IDENTITY=89,
168 PW_CUI=89,
169 PW_TUNNEL_CLIENT_AUTH_ID=90,
170 PW_TUNNEL_SERVER_AUTH_ID=91,
171 PW_NAS_FILTER_RULE=92,
172 PW_ORIGINATING_LINE_INFO=94,
173 PW_NAS_IPV6_ADDRESS=95,
174 PW_FRAMED_INTERFACE_ID=96,
175 PW_FRAMED_IPV6_PREFIX=97,
176 PW_LOGIN_IPV6_HOST=98,
177 PW_FRAMED_IPV6_ROUTE=99,
178 PW_FRAMED_IPV6_POOL=100,
179 PW_ERROR_CAUSE=101,
180 PW_EAP_KEY_NAME=102,
181
183 PW_DIGEST_RESPONSE=103,
184 PW_DIGEST_REALM=104,
185 PW_DIGEST_NONCE=105,
186 PW_DIGEST_RESPONSE_AUTH=106,
187 PW_DIGEST_NEXTNONCE=107,
188 PW_DIGEST_METHOD=108,
189 PW_DIGEST_URI=109,
190 PW_DIGEST_QOP=110,
191 PW_DIGEST_ALGORITHM=111,
192 PW_DIGEST_ENTITY_BODY_HASH=112,
193 PW_DIGEST_CNONCE=113,
194 PW_DIGEST_NONCE_COUNT=114,
195 PW_DIGEST_USERNAME=115,
196 PW_DIGEST_OPAQUE=116,
197 PW_DIGEST_AUTH_PARAM=117,
198 PW_DIGEST_AKA_AUTS=118,
199 PW_DIGEST_DOMAIN=119,
200 PW_DIGEST_STALE=120,
201 PW_DIGEST_HA1=121,
202 PW_SIP_AOR=122,
203
204 PW_DELEGATED_IPV6_PREFIX=123,
205
210 PW_MIP6_FEATURE_VECTOR=124,
211
213 PW_ACTUAL_DATA_RATE_UPSTREAM=129,
214 PW_ACTUAL_DATA_RATE_DOWNSTREAM=130,
215 PW_MINIMUM_DATA_RATE_UPSTREAM=131,
216 PW_MINIMUM_DATA_RATE_DOWNSTREAM=132,
217 PW_ATTAINABLE_DATA_RATE_UPSTREAM=133,
218 PW_ATTAINABLE_DATA_RATE_DOWNSTREAM=134,
219 PW_MAXIMUM_DATA_RATE_UPSTREAM=135,
220 PW_MAXIMUM_DATA_RATE_DOWNSTREAM=136,
221 PW_MINIMUM_DATA_RATE_UPSTREAM_LOW_POWER=137,
222 PW_MINIMUM_DATA_RATE_DOWNSTREAM_LOW_POWER=138,
223 PW_MAXIMUM_INTERLEAVING_DELAY_UPSTREAM=139,
224 PW_ACTUAL_INTERLEAVING_DELAY_UPSTREAM=140,
225 PW_MAXIMUM_INTERLEAVING_DELAY_DOWNSTREAM=141,
226 PW_ACTUAL_INTERLEAVING_DELAY_DOWNSTREAM=142,
227
228 PW_ACCESS_LOOP_ENCAPSULATION=144,
229
230 PW_FRAMED_IPV6_ADDRESS=168,
231 PW_DNS_SERVER_IPV6_ADDRESS=169,
232 PW_ROUTE_IPV6_INFORMATION=170,
233 PW_DELEGATED_IPV6_PREFIX_POOL=171,
234 PW_STATEFUL_IPV6_ADDRESS_POOL=172,
235
237 PW_USER_ID=222,
238 PW_USER_REALM=223,
239
240 PW_IWF_SESSION=254
241} rc_attr_id;
242
243/* Compatibility names for the two RFC 5090 attributes whose canonical name
244 * differs from the old draft-sterman-aaa-sip-00 spelling, in case any
245 * out-of-tree caller already uses the old macro name. These are the *new*
246 * numeric values (112/115) -- a caller recompiling against this header gets
247 * correct RFC 5090 wire behavior under the old name for free. */
248#define PW_DIGEST_BODY_DIGEST PW_DIGEST_ENTITY_BODY_HASH
249#define PW_DIGEST_USER_NAME PW_DIGEST_USERNAME
250
253typedef enum rc_service_type {
254 PW_LOGIN=1,
255 PW_FRAMED=2,
256 PW_CALLBACK_LOGIN=3,
257 PW_CALLBACK_FRAMED=4,
258 PW_OUTBOUND=5,
259 PW_ADMINISTRATIVE=6,
260 PW_NAS_PROMPT=7,
261 PW_AUTHENTICATE_ONLY=8,
262 PW_CALLBACK_NAS_PROMPT=9
263} rc_service_type;
264
267typedef enum rc_framed_protocol {
268 PW_PPP=1,
269 PW_SLIP=2,
270 PW_ARA= 3,
271 PW_GANDALF=4,
272 PW_XYLOGICS=5
273} rc_framed_protocol;
274
277typedef enum rc_framed_routing_type {
278 PW_NONE=0,
279 PW_BROADCAST=1,
280 PW_LISTEN=2,
281 PW_BROADCAST_LISTEN=3
282} rc_framed_routing_type;
283
286typedef enum rc_framed_comp {
287 PW_COMP_NONE=0,
288 PW_VAN_JACOBSON_TCP_IP=1,
289 PW_IPX_HEADER_COMPRESSION=2,
290 PW_COMP_LZS=3
291} rc_framed_comp;
292
295typedef enum rc_login_service_type {
296 PW_TELNET=0,
297 PW_RLOGIN=1,
298 PW_TCP_CLEAR=2,
299 PW_PORTMASTER=3,
300 PW_LAT=4,
301 PW_X25_PAD=5,
302 PW_X25_T3POS=6
303} rc_login_service_type;
304
307typedef enum rc_termination_action {
308 PW_DEFAULT=0,
309 PW_RADIUS_REQUEST=1
310} rc_termination_action;
311
314typedef enum rc_acct_status_type {
315 PW_STATUS_START=1,
316 PW_STATUS_STOP=2,
317 PW_STATUS_ALIVE=3,
318 PW_STATUS_MODEM_START=4,
319 PW_STATUS_MODEM_STOP=5,
320 PW_STATUS_CANCEL=6,
321 PW_ACCOUNTING_ON=7,
322 PW_ACCOUNTING_OFF=8
323} rc_acct_status_type;
324
327typedef enum rc_acct_terminate_cause {
328 PW_USER_REQUEST=1,
329 PW_LOST_CARRIER=2,
330 PW_LOST_SERVICE=3,
331 PW_ACCT_IDLE_TIMEOUT=4,
332 PW_ACCT_SESSION_TIMEOUT=5,
333 PW_ADMIN_RESET=6,
334 PW_ADMIN_REBOOT=7,
335 PW_PORT_ERROR=8,
336 PW_NAS_ERROR=9,
337 PW_NAS_REQUEST=10,
338 PW_NAS_REBOOT=11,
339 PW_PORT_UNNEEDED=12,
340 PW_PORT_PREEMPTED=13,
341 PW_PORT_SUSPENDED=14,
342 PW_SERVICE_UNAVAILABLE=15,
343 PW_CALLBACK=16,
344 PW_USER_ERROR=17,
345 PW_HOST_REQUEST=18
346} rc_acct_terminate_cause;
347
350typedef enum rc_nas_port_type {
351 PW_ASYNC=0,
352 PW_SYNC=1,
353 PW_ISDN_SYNC=2,
354 PW_ISDN_SYNC_V120=3,
355 PW_ISDN_SYNC_V110=4,
356 PW_VIRTUAL=5
357} rc_nas_port_type;
358
361typedef enum rc_acct_auth_type {
362 PW_RADIUS=1,
363 PW_LOCAL=2,
364 PW_REMOTE=3
365} rc_acct_auth_type;
366
369typedef enum rc_vendor_pec {
370 VENDOR_NONE=0,
371 VENDOR_MICROSOFT = 311,
372 VENDOR_ROARING_PENGUIN = 10055
373} rc_vendor_type;
374
375/* Option value types -- shared between lib/options.h's internal OPTION.type
376 * and, indirectly, radcli_ctx_set_opt_str()/_set_opt_int()'s validation
377 * that the right setter is used for a given radcli_opt_id. */
378#define RADCLI_OPT_TYPE_STR (1<<0)
379#define RADCLI_OPT_TYPE_INT (1<<1)
380#define RADCLI_OPT_TYPE_SRV (1<<2)
381
382#define RC_OPTION_TABLE \
383/* internally used options */ \
384RADCLI_OPT_ENTRY(OPT_CONFIG_FILE, "config_file", RADCLI_OPT_TYPE_STR) \
385/* RADIUS specific options */ \
386RADCLI_OPT_ENTRY(OPT_SERV_TYPE, "serv-type", RADCLI_OPT_TYPE_STR) \
387RADCLI_OPT_ENTRY(OPT_SERV_AUTH_TYPE, "serv-auth-type", RADCLI_OPT_TYPE_STR) /* alias for serv-type */ \
388RADCLI_OPT_ENTRY(OPT_NAMESPACE, "namespace", RADCLI_OPT_TYPE_STR) \
389RADCLI_OPT_ENTRY(OPT_USE_PUBLIC_ADDR, "use-public-addr", RADCLI_OPT_TYPE_STR) \
390RADCLI_OPT_ENTRY(OPT_TLS_VERIFY_HOSTNAME, "tls-verify-hostname", RADCLI_OPT_TYPE_STR) \
391RADCLI_OPT_ENTRY(OPT_REQUIRE_MESSAGE_AUTHENTICATOR, "require-message-authenticator", RADCLI_OPT_TYPE_STR) /* default: required; set "no" for legacy servers */ \
392RADCLI_OPT_ENTRY(OPT_TLS_CA_FILE, "tls-ca-file", RADCLI_OPT_TYPE_STR) \
393RADCLI_OPT_ENTRY(OPT_TLS_CERT_FILE, "tls-cert-file", RADCLI_OPT_TYPE_STR) \
394RADCLI_OPT_ENTRY(OPT_TLS_KEY_FILE, "tls-key-file", RADCLI_OPT_TYPE_STR) \
395/* Config-file equivalent of radcli2.h's radcli_ctx_set_tls_psk(): identity
396 * as plain text, key as hex text (like the legacy authserver
397 * "psk@username@hexkey" form, but as two independent options instead of a
398 * delimited string). Only meaningful when serv-type is tls/dtls; both must
399 * be set together. See rc_init_tls() (lib/tls.c). */ \
400RADCLI_OPT_ENTRY(OPT_TLS_PSK_IDENTITY, "tls-psk-identity", RADCLI_OPT_TYPE_STR) \
401RADCLI_OPT_ENTRY(OPT_TLS_PSK_KEY, "tls-psk-key", RADCLI_OPT_TYPE_STR) \
402/* Seconds between RFC 5997 Status-Server watchdogs on an established
403 * RadSec (TLS/DTLS) session: radcli_ctx_get_poll() advises the timing,
404 * radcli_ctx_dispatch() sends them automatically once due -- radcli owns
405 * no timer itself (REQ-GEN-SEC-003). Any RadSec radcli_ctx, DAE or not
406 * (REQ-WATCHDOG-NET-001/002). No effect on UDP. Default 15
407 * (draft-ietf-radext-reverse-coa's recommended Tw); 0 disables it.
408 * Otherwise MUST be at least 6 (REQ-WATCHDOG-CFG-001) -- a smaller value is
409 * rejected outright, since the watchdog send reconnects once 2.5x this has
410 * elapsed with nothing received (REQ-WATCHDOG-NET-003). */ \
411RADCLI_OPT_ENTRY(OPT_WATCHDOG_INTERVAL, "watchdog-interval", RADCLI_OPT_TYPE_INT) \
412RADCLI_OPT_ENTRY(OPT_NAS_IDENTIFIER, "nas-identifier", RADCLI_OPT_TYPE_STR) \
413RADCLI_OPT_ENTRY(OPT_NAS_IP, "nas-ip", RADCLI_OPT_TYPE_STR) \
414RADCLI_OPT_ENTRY(OPT_AUTHSERVER, "authserver", RADCLI_OPT_TYPE_SRV) \
415RADCLI_OPT_ENTRY(OPT_ACCTSERVER, "acctserver", RADCLI_OPT_TYPE_SRV) \
416RADCLI_OPT_ENTRY(OPT_SERVERS, "servers", RADCLI_OPT_TYPE_STR) \
417/* Fallback shared secret for authserver/acctserver, applied only when a
418 * server's SERVER->secret[0] is not already set inline (host:port:secret)
419 * -- the config-file equivalent of radcli2.h's radcli_ctx_set_secret().
420 * See radcli2_priv_apply_config() (lib/config.c). */ \
421RADCLI_OPT_ENTRY(OPT_SECRET, "secret", RADCLI_OPT_TYPE_STR) \
422RADCLI_OPT_ENTRY(OPT_DICTIONARY, "dictionary", RADCLI_OPT_TYPE_STR) \
423RADCLI_OPT_ENTRY(OPT_DEFAULT_REALM, "default_realm", RADCLI_OPT_TYPE_STR) \
424RADCLI_OPT_ENTRY(OPT_RADIUS_TIMEOUT, "radius_timeout", RADCLI_OPT_TYPE_INT) \
425RADCLI_OPT_ENTRY(OPT_RADIUS_RETRIES, "radius_retries", RADCLI_OPT_TYPE_INT) \
426RADCLI_OPT_ENTRY(OPT_BINDADDR, "bindaddr", RADCLI_OPT_TYPE_STR) \
427RADCLI_OPT_ENTRY(OPT_CLIENTDEBUG, "clientdebug", RADCLI_OPT_TYPE_INT) \
428/* RFC 5176 dynamic authorization (CoA/Disconnect) -- see lib/dae.c.
429 * dae-server is a comma-separated list of "address_or_hostname[:secret]"
430 * entries (no port: it identifies an authorized sender, not something
431 * radcli connects to); parsing, prefix rejection, and hostname
432 * resolution are lib/dae.c's job, not the generic config layer's. */ \
433RADCLI_OPT_ENTRY(OPT_DAE_ACCEPT, "dae-accept", RADCLI_OPT_TYPE_STR) \
434RADCLI_OPT_ENTRY(OPT_DAE_LISTEN, "dae-listen", RADCLI_OPT_TYPE_STR) \
435RADCLI_OPT_ENTRY(OPT_DAE_SECRET, "dae-secret", RADCLI_OPT_TYPE_STR) \
436RADCLI_OPT_ENTRY(OPT_DAE_SERVER, "dae-server", RADCLI_OPT_TYPE_STR) \
437RADCLI_OPT_ENTRY(OPT_DAE_MAX_CLOCK_SKEW, "dae-max-clock-skew", RADCLI_OPT_TYPE_INT) \
438RADCLI_OPT_ENTRY(OPT_DAE_REQUIRE_MESSAGE_AUTHENTICATOR, "dae-require-message-authenticator", RADCLI_OPT_TYPE_STR)
439
440/* *INDENT-OFF* */
441#ifdef __cplusplus
442}
443#endif
444/* *INDENT-ON* */
445
446#endif /* RADCLI_DEFS_H */