Radcli library 2.0.0
A simple radius library -- new API reference
Loading...
Searching...
No Matches
radcli2.h
1/*
2 * Copyright (C) 2026 Nikos Mavrogiannopoulos
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
14 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
15 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
16 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
17 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
18 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
19 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
20 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
22 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23 */
24
49
50#ifndef RADCLI2_H
51#define RADCLI2_H
52
53#include <stdint.h>
54#include <stddef.h>
55#include <netinet/in.h>
56#include <poll.h> /* struct pollfd, radcli_ctx_get_poll() */
57#include <radcli/radcli-defs.h>
58
59/* *INDENT-OFF* */
60#ifdef __cplusplus
61extern "C" {
62#endif
63/* *INDENT-ON* */
64
71
79struct rc_conf;
80typedef struct rc_conf radcli_ctx;
81
92typedef enum radcli_opt_id {
93#define RADCLI_OPT_ENTRY(id, name, type) RADCLI_##id,
94 RC_OPTION_TABLE
95#undef RADCLI_OPT_ENTRY
96 RADCLI_OPT_COUNT
98
107
108radcli_ctx *radcli_ctx_new(unsigned flags);
109
110radcli_ctx *radcli_ctx_read_config(const char *filename, unsigned flags);
111
112int radcli_ctx_set_opt_str(radcli_ctx *ctx, radcli_opt_id opt, const char *val);
113
114int radcli_ctx_set_opt_int(radcli_ctx *ctx, radcli_opt_id opt, long val);
115
116const char *radcli_ctx_get_opt_str(const radcli_ctx *ctx, radcli_opt_id opt);
117
118int radcli_ctx_get_opt_int(const radcli_ctx *ctx, radcli_opt_id opt, long *out);
119
120int radcli_ctx_apply(radcli_ctx *ctx);
121
122int radcli_ctx_read_dictionary(radcli_ctx *ctx, const char *path);
123
124int radcli_ctx_read_dictionary_from_buffer(radcli_ctx *ctx, const char *buf, size_t size);
125
138
139int radcli_ctx_set_secret(radcli_ctx *ctx, unsigned target_mask, const char *secret);
140
141int radcli_ctx_set_tls_psk(radcli_ctx *ctx,
142 const void *identity, size_t identity_len,
143 const uint8_t *key, size_t keylen);
144
145void radcli_ctx_free(radcli_ctx *ctx);
146
148
155
237
252struct radcli_attr_def_st;
253typedef struct radcli_attr_def_st radcli_attr_def;
254
255const radcli_attr_def *radcli_dict_lookup(const radcli_ctx *ctx, const char *name);
256
257const radcli_attr_def *radcli_dict_lookup_oid(const radcli_ctx *ctx, const char *oid);
258
259const radcli_attr_def *radcli_dict_lookup_num(const radcli_ctx *ctx, uint32_t attrid, uint32_t vendor);
260
261const char *radcli_attr_def_name(const radcli_attr_def *def);
262
263radcli_attr_type radcli_attr_def_type(const radcli_attr_def *def);
264
265int radcli_attr_def_oid(const radcli_attr_def *def, char *buf, size_t buflen);
266
267int radcli_dict_lookup_value(const radcli_ctx *ctx, const radcli_attr_def *def,
268 const char *name, uint32_t *out);
269
271
279
286struct radcli_avp_st;
287typedef struct radcli_avp_st radcli_avp;
288
294struct radcli_avp_list_st;
295typedef struct radcli_avp_list_st radcli_avp_list;
296
297radcli_avp_list *radcli_avp_list_new(void);
298
299void radcli_avp_list_free(radcli_avp_list *list);
300
301int radcli_avp_add_bytes(radcli_avp_list *list, const radcli_attr_def *def, const void *value, size_t len);
302
303int radcli_avp_add_str(radcli_avp_list *list, const radcli_attr_def *def, const char *value);
304
305int radcli_avp_add_uint32(radcli_avp_list *list, const radcli_attr_def *def, uint32_t value);
306
307int radcli_avp_add_uint64(radcli_avp_list *list, const radcli_attr_def *def, uint64_t value);
308
309int radcli_avp_add_ip4(radcli_avp_list *list, const radcli_attr_def *def, struct in_addr value);
310
311int radcli_avp_add_ip6(radcli_avp_list *list, const radcli_attr_def *def,
312 const struct in6_addr *value, unsigned prefix);
313
314int radcli_avp_add_ip4prefix(radcli_avp_list *list, const radcli_attr_def *def,
315 struct in_addr value, unsigned prefix);
316
337
338int radcli_avp_add_bytes_by_num(radcli_avp_list *list, const radcli_ctx *ctx,
339 uint32_t attrid, uint32_t vendor,
340 const void *value, size_t len);
341
342int radcli_avp_add_str_by_num(radcli_avp_list *list, const radcli_ctx *ctx,
343 uint32_t attrid, uint32_t vendor, const char *value);
344
345int radcli_avp_add_uint32_by_num(radcli_avp_list *list, const radcli_ctx *ctx,
346 uint32_t attrid, uint32_t vendor, uint32_t value);
347
348int radcli_avp_add_uint64_by_num(radcli_avp_list *list, const radcli_ctx *ctx,
349 uint32_t attrid, uint32_t vendor, uint64_t value);
350
351int radcli_avp_add_ip4_by_num(radcli_avp_list *list, const radcli_ctx *ctx,
352 uint32_t attrid, uint32_t vendor, struct in_addr value);
353
354int radcli_avp_add_ip6_by_num(radcli_avp_list *list, const radcli_ctx *ctx,
355 uint32_t attrid, uint32_t vendor,
356 const struct in6_addr *value, unsigned prefix);
357
358int radcli_avp_add_ip4prefix_by_num(radcli_avp_list *list, const radcli_ctx *ctx,
359 uint32_t attrid, uint32_t vendor,
360 struct in_addr value, unsigned prefix);
361
363
364int radcli_avp_add_username(radcli_avp_list *list, const radcli_ctx *ctx,
365 const char *username, const char *realm);
366
367const radcli_avp *radcli_avp_get(const radcli_avp_list *list, const radcli_attr_def *def, unsigned idx);
368
389typedef struct {
390 const radcli_avp_list *list;
391 const radcli_avp *cur;
393
394radcli_avp_iter radcli_avp_list_iter(const radcli_avp_list *list);
395
396const radcli_avp *radcli_avp_iter_next(radcli_avp_iter *it);
397
398const radcli_attr_def *radcli_avp_def(const radcli_avp *a);
399
400int radcli_avp_get_uint32(const radcli_avp *a, uint32_t *out);
401
402int radcli_avp_get_uint64(const radcli_avp *a, uint64_t *out);
403
404int radcli_avp_get_ip6(const radcli_avp *a, struct in6_addr *out, unsigned *prefix);
405
406int radcli_avp_get_ip4prefix(const radcli_avp *a, struct in_addr *out, unsigned *prefix);
407
408int radcli_avp_get_bytes(const radcli_avp *a, const void **out, size_t *len);
409
410const char *radcli_avp_get_cstr(const radcli_avp *a);
411
428
429const radcli_avp *radcli_avp_get_by_num(const radcli_avp_list *list, const radcli_ctx *ctx,
430 uint32_t attrid, uint32_t vendor, unsigned idx);
431
432int radcli_avp_get_uint32_by_num(const radcli_avp_list *list, const radcli_ctx *ctx,
433 uint32_t attrid, uint32_t vendor, uint32_t *out);
434
435int radcli_avp_get_uint64_by_num(const radcli_avp_list *list, const radcli_ctx *ctx,
436 uint32_t attrid, uint32_t vendor, uint64_t *out);
437
438int radcli_avp_get_ip6_by_num(const radcli_avp_list *list, const radcli_ctx *ctx,
439 uint32_t attrid, uint32_t vendor,
440 struct in6_addr *out, unsigned *prefix);
441
442int radcli_avp_get_ip4prefix_by_num(const radcli_avp_list *list, const radcli_ctx *ctx,
443 uint32_t attrid, uint32_t vendor,
444 struct in_addr *out, unsigned *prefix);
445
446int radcli_avp_get_bytes_by_num(const radcli_avp_list *list, const radcli_ctx *ctx,
447 uint32_t attrid, uint32_t vendor,
448 const void **out, size_t *len);
449
450const char *radcli_avp_get_cstr_by_num(const radcli_avp_list *list, const radcli_ctx *ctx,
451 uint32_t attrid, uint32_t vendor);
452
454
462
463int radcli_avp_concat_str(char *buf, size_t buflen, const radcli_avp_list *list,
464 const radcli_attr_def *def, const char *sep);
465
466int radcli_avp_concat_str_by_num(char *buf, size_t buflen, const radcli_avp_list *list,
467 const radcli_ctx *ctx, uint32_t attrid, uint32_t vendor,
468 const char *sep);
469
471
472int radcli_avp_list_error(const radcli_avp_list *list);
473
474int radcli_avp_add_gigawords64(radcli_ctx *ctx, radcli_avp_list *list,
475 const radcli_attr_def *octets, uint64_t value);
476
477int radcli_avp_get_gigawords64(const radcli_ctx *ctx, const radcli_avp_list *list,
478 const radcli_attr_def *octets, uint64_t *out);
479
480int radcli_avp_add_gigawords64_by_num(radcli_ctx *ctx, radcli_avp_list *list,
481 uint32_t attrid, uint32_t vendor, uint64_t value);
482
483int radcli_avp_get_gigawords64_by_num(const radcli_ctx *ctx, const radcli_avp_list *list,
484 uint32_t attrid, uint32_t vendor, uint64_t *out);
485
487
488
496
506typedef enum radcli_code {
507 RADCLI_CODE_ACCESS_REQUEST = 1,
508 RADCLI_CODE_ACCESS_ACCEPT = 2,
509 RADCLI_CODE_ACCESS_REJECT = 3,
510 RADCLI_CODE_ACCOUNTING_REQUEST = 4,
511 RADCLI_CODE_ACCOUNTING_RESPONSE = 5,
512 RADCLI_CODE_ACCESS_CHALLENGE = 11,
513 /* RFC 5176 SS3: Dynamic Authorization. The legacy rc_standard_codes
514 * enum (radcli.h) is not extended -- these belong to the new API
515 * only, since radcli.h's request/reply path never handles them. */
516 RADCLI_DISCONNECT_REQUEST = 40,
517 RADCLI_DISCONNECT_ACK = 41,
518 RADCLI_DISCONNECT_NAK = 42,
519 RADCLI_COA_REQUEST = 43,
520 RADCLI_COA_ACK = 44,
521 RADCLI_COA_NAK = 45
523
531typedef enum radcli_error_cause {
532 RADCLI_ERROR_RESIDUAL_SESSION_CONTEXT_REMOVED = 201,
533 RADCLI_ERROR_INVALID_EAP_PACKET = 202,
534 RADCLI_ERROR_UNSUPPORTED_ATTRIBUTE = 401,
535 RADCLI_ERROR_MISSING_ATTRIBUTE = 402,
536 RADCLI_ERROR_NAS_IDENTIFICATION_MISMATCH = 403,
537 RADCLI_ERROR_INVALID_REQUEST = 404,
538 RADCLI_ERROR_UNSUPPORTED_SERVICE = 405,
539 RADCLI_ERROR_UNSUPPORTED_EXTENSION = 406,
540 RADCLI_ERROR_INVALID_ATTRIBUTE_VALUE = 407,
541 RADCLI_ERROR_ADMINISTRATIVELY_PROHIBITED = 501,
542 RADCLI_ERROR_REQUEST_NOT_ROUTABLE = 502,
543 RADCLI_ERROR_SESSION_CONTEXT_NOT_FOUND = 503,
544 RADCLI_ERROR_SESSION_CONTEXT_NOT_REMOVABLE = 504,
545 RADCLI_ERROR_OTHER_PROXY_PROCESSING_ERROR = 505,
546 RADCLI_ERROR_RESOURCES_UNAVAILABLE = 506,
547 RADCLI_ERROR_REQUEST_INITIATED = 507,
548 RADCLI_ERROR_MULTIPLE_SESSION_SELECTION_UNSUPPORTED = 508,
549 RADCLI_ERROR_LOCATION_INFO_REQUIRED = 509,
550 RADCLI_ERROR_RESPONSE_TOO_BIG = 601
552
572
579struct radcli_request_st;
580typedef struct radcli_request_st radcli_request;
581
584 RADCLI_REQUEST_NONE = 0,
605
606radcli_request *radcli_request_new(radcli_ctx *ctx, radcli_code code, const radcli_avp_list *send);
607
608int radcli_request_perform(radcli_request *r, unsigned flags);
609
610/* Poll-driven async progress for a request sent with RADCLI_REQUEST_SENDONLY:
611 * drive it to completion via radcli_ctx_get_poll()/radcli_ctx_dispatch()
612 * (lib/dae.c) -- r shares ctx's own descriptor(s), there is no per-request
613 * accessor -- then read the outcome here; see lib/request.c's doc comment
614 * for the full contract and a usage example. */
615int radcli_request_done(radcli_request *r);
616
617radcli_code radcli_request_code(const radcli_request *r);
618
619const radcli_avp_list *radcli_request_attrs(const radcli_request *r);
620
621const char *radcli_request_server(const radcli_request *r);
622
623void radcli_request_free(radcli_request *r);
624
625int radcli_aaa(radcli_ctx *ctx, radcli_code code, const radcli_avp_list *send,
626 radcli_code *out_code, radcli_avp_list **out_attrs);
627
629
676
678typedef struct radcli_dae_st radcli_dae;
679
688typedef struct radcli_dae_request_st radcli_dae_request;
689
703typedef void (*radcli_dae_handler)(radcli_dae_request *req, void *user);
704
706
707const radcli_avp_list *radcli_dae_req_attrs(const radcli_dae_request *req);
708
709const char *radcli_dae_req_session_id(const radcli_dae_request *req);
710
711const char *radcli_dae_req_user_name(const radcli_dae_request *req);
712
713int radcli_dae_req_framed_ip(const radcli_dae_request *req, struct sockaddr_storage *out);
714
715int radcli_dae_req_nas_port(const radcli_dae_request *req, uint32_t *out);
716
717int radcli_dae_reply(radcli_dae_request *req, int ack);
718
719int radcli_dae_reply_error(radcli_dae_request *req, uint32_t error_cause);
720
721int radcli_dae_reply_to_buffer(radcli_dae_request *req, int ack, uint32_t error_cause,
722 void *buf, size_t *len);
723
725
728#define RADCLI_DAE_NEW 0
733#define RADCLI_DAE_DUPLICATE 1
734
735int radcli_dae_process(radcli_dae *dae, const void *buf, size_t len,
736 const struct sockaddr *from, socklen_t fromlen,
737 radcli_dae_request **req);
738
749
750radcli_dae *radcli_dae_new(radcli_ctx *ctx, unsigned flags);
751
752void radcli_dae_set_handler(radcli_dae *dae, radcli_dae_handler cb, void *user);
753
755
756void radcli_dae_free(radcli_dae *dae);
757
764#define RADCLI_CTX_MAX_POLLFDS 2
765
766int radcli_ctx_get_poll(radcli_ctx *ctx, struct pollfd *pfds, size_t max_pfds,
767 size_t *nfds, int *timeout_ms);
768
769int radcli_ctx_dispatch(radcli_ctx *ctx);
770
772
773
777
783
787
791
795
799
800/* *INDENT-OFF* */
801#ifdef __cplusplus
802}
803#endif
804/* *INDENT-ON* */
805
806#endif /* RADCLI2_H */
int radcli_dae_req_nas_port(const radcli_dae_request *req, uint32_t *out)
Return the request's NAS-Port.
Definition dae.c:1704
void radcli_dae_free(radcli_dae *dae)
Release a listener, closing its socket if radcli_dae_start() opened one.
Definition dae.c:978
const char * radcli_dae_req_session_id(const radcli_dae_request *req)
Return the request's Acct-Session-Id, if it carried one.
Definition dae.c:1621
void(* radcli_dae_handler)(radcli_dae_request *req, void *user)
Application callback invoked by radcli_ctx_dispatch() for a validated request.
Definition radcli2.h:703
int radcli_ctx_get_poll(radcli_ctx *ctx, struct pollfd *pfds, size_t max_pfds, size_t *nfds, int *timeout_ms)
Report what to wait for on ctx's behalf, for the caller's own event loop – radcli never calls poll()/...
Definition dae.c:1091
void radcli_dae_set_handler(radcli_dae *dae, radcli_dae_handler cb, void *user)
Register the callback radcli_ctx_dispatch() invokes for each validated request. May be called before ...
Definition dae.c:852
radcli_code radcli_dae_req_code(const radcli_dae_request *req)
Return the received packet's RADIUS code.
Definition dae.c:1593
int radcli_ctx_dispatch(radcli_ctx *ctx)
Read what is ready on ctx's descriptor(s), validate it, and invoke the registered handler for anythin...
Definition dae.c:2324
int radcli_dae_reply(radcli_dae_request *req, int ack)
Answer a request with an ACK or NAK, selecting 41/42 or 44/45 from the request's own code,...
Definition dae.c:1806
struct radcli_dae_st radcli_dae
Definition radcli2.h:678
const char * radcli_dae_req_user_name(const radcli_dae_request *req)
Return the request's User-Name, if it carried one.
Definition dae.c:1634
int radcli_dae_start(radcli_dae *dae)
Start receiving: binds the socket described by dae-listen.
Definition dae.c:896
const radcli_avp_list * radcli_dae_req_attrs(const radcli_dae_request *req)
Return the request's decoded attributes.
Definition dae.c:1608
int radcli_dae_reply_to_buffer(radcli_dae_request *req, int ack, uint32_t error_cause, void *buf, size_t *len)
Produce a reply as bytes instead of sending it – the L0 counterpart of radcli_dae_reply()/radcli_dae_...
Definition dae.c:1852
radcli_dae_flags
Definition radcli2.h:744
int radcli_dae_process(radcli_dae *dae, const void *buf, size_t len, const struct sockaddr *from, socklen_t fromlen, radcli_dae_request **req)
Validate a caller-supplied packet, without a radcli-owned socket – the L0 counterpart of radcli_ctx_d...
Definition dae.c:2487
int radcli_dae_reply_error(radcli_dae_request *req, uint32_t error_cause)
Answer a request with a NAK carrying the given Error-Cause.
Definition dae.c:1821
radcli_dae * radcli_dae_new(radcli_ctx *ctx, unsigned flags)
Validate dae-* configuration and build a dynamic-authorization listener. Opens no socket – see radcli...
Definition dae.c:638
int radcli_dae_req_framed_ip(const radcli_dae_request *req, struct sockaddr_storage *out)
Return the request's Framed-IP-Address or Framed-IPv6-Address.
Definition dae.c:1649
struct radcli_dae_request_st radcli_dae_request
Definition radcli2.h:688
void radcli_dae_request_free(radcli_dae_request *req)
Release a request.
Definition dae.c:1890
@ RADCLI_DAE_NO_NAS_CHECK
Definition radcli2.h:745
int radcli_avp_add_ip6_by_num(radcli_avp_list *list, const radcli_ctx *ctx, uint32_t attrid, uint32_t vendor, const struct in6_addr *value, unsigned prefix)
Look up an IPv6-address or IPv6-prefix-typed attribute by legacy numeric ID and append it.
Definition avp.c:558
int radcli_avp_add_uint32_by_num(radcli_avp_list *list, const radcli_ctx *ctx, uint32_t attrid, uint32_t vendor, uint32_t value)
Look up an integer/IPv4-address/date-typed attribute by legacy numeric ID and append it.
Definition avp.c:503
int radcli_avp_add_uint64_by_num(radcli_avp_list *list, const radcli_ctx *ctx, uint32_t attrid, uint32_t vendor, uint64_t value)
Look up a 64-bit integer-typed attribute by legacy numeric ID and append it.
Definition avp.c:521
int radcli_avp_add_bytes_by_num(radcli_avp_list *list, const radcli_ctx *ctx, uint32_t attrid, uint32_t vendor, const void *value, size_t len)
Look up an attribute by legacy numeric ID and append its bytes.
Definition avp.c:466
int radcli_avp_add_str_by_num(radcli_avp_list *list, const radcli_ctx *ctx, uint32_t attrid, uint32_t vendor, const char *value)
Look up a string-typed attribute by legacy numeric ID and append it.
Definition avp.c:485
int radcli_avp_add_ip4prefix_by_num(radcli_avp_list *list, const radcli_ctx *ctx, uint32_t attrid, uint32_t vendor, struct in_addr value, unsigned prefix)
Look up an IPv4-prefix-typed attribute by legacy numeric ID and append it.
Definition avp.c:578
int radcli_avp_add_ip4_by_num(radcli_avp_list *list, const radcli_ctx *ctx, uint32_t attrid, uint32_t vendor, struct in_addr value)
Look up an IPv4-address-typed attribute by legacy numeric ID and append it.
Definition avp.c:539
int radcli_avp_concat_str(char *buf, size_t buflen, const radcli_avp_list *list, const radcli_attr_def *def, const char *sep)
Concatenate every occurrence of an attribute into a bounded buffer.
Definition avp.c:1117
int radcli_avp_concat_str_by_num(char *buf, size_t buflen, const radcli_avp_list *list, const radcli_ctx *ctx, uint32_t attrid, uint32_t vendor, const char *sep)
Look up an attribute by legacy numeric ID and concatenate every occurrence into a bounded buffer.
Definition avp.c:1189
int radcli_avp_get_uint64_by_num(const radcli_avp_list *list, const radcli_ctx *ctx, uint32_t attrid, uint32_t vendor, uint64_t *out)
Look up a 64-bit integer-typed attribute by legacy numeric ID and read its first occurrence.
Definition avp.c:988
const radcli_avp * radcli_avp_get_by_num(const radcli_avp_list *list, const radcli_ctx *ctx, uint32_t attrid, uint32_t vendor, unsigned idx)
Look up the idx-th occurrence of an attribute by legacy numeric ID.
Definition avp.c:952
int radcli_avp_get_ip4prefix_by_num(const radcli_avp_list *list, const radcli_ctx *ctx, uint32_t attrid, uint32_t vendor, struct in_addr *out, unsigned *prefix)
Look up an IPv4-prefix-typed attribute by legacy numeric ID and read its first occurrence.
Definition avp.c:1027
int radcli_avp_get_uint32_by_num(const radcli_avp_list *list, const radcli_ctx *ctx, uint32_t attrid, uint32_t vendor, uint32_t *out)
Look up an integer/IPv4-address/date-typed attribute by legacy numeric ID and read its first occurren...
Definition avp.c:970
const char * radcli_avp_get_cstr_by_num(const radcli_avp_list *list, const radcli_ctx *ctx, uint32_t attrid, uint32_t vendor)
Look up an attribute by legacy numeric ID and read its first occurrence as a NUL-terminated string.
Definition avp.c:1068
int radcli_avp_get_bytes_by_num(const radcli_avp_list *list, const radcli_ctx *ctx, uint32_t attrid, uint32_t vendor, const void **out, size_t *len)
Look up an attribute by legacy numeric ID and read its first occurrence's raw bytes.
Definition avp.c:1047
int radcli_avp_get_ip6_by_num(const radcli_avp_list *list, const radcli_ctx *ctx, uint32_t attrid, uint32_t vendor, struct in6_addr *out, unsigned *prefix)
Look up an IPv6-address or IPv6-prefix-typed attribute by legacy numeric ID and read its first occurr...
Definition avp.c:1007
int radcli_avp_add_ip4prefix(radcli_avp_list *list, const radcli_attr_def *def, struct in_addr value, unsigned prefix)
Append an IPv4-prefix-typed attribute.
Definition avp.c:429
int radcli_avp_get_uint64(const radcli_avp *a, uint64_t *out)
Read an attribute's value as a 64-bit integer or ifid.
Definition avp.c:742
int radcli_avp_add_username(radcli_avp_list *list, const radcli_ctx *ctx, const char *username, const char *realm)
Append a User-Name AVP, appending a realm as "username@realm" unless username already contains one.
Definition avp.c:610
int radcli_avp_get_gigawords64_by_num(const radcli_ctx *ctx, const radcli_avp_list *list, uint32_t attrid, uint32_t vendor, uint64_t *out)
Look up the octets attribute by legacy numeric ID and reassemble a 64-bit counter from an Octets/Giga...
Definition avp.c:1373
int radcli_avp_list_error(const radcli_avp_list *list)
Check whether any radcli_avp_add_*()/_by_num() call on list has ever failed.
Definition avp.c:1230
void radcli_avp_list_free(radcli_avp_list *list)
Free a list and every attribute it holds.
Definition avp.c:159
radcli_avp_iter radcli_avp_list_iter(const radcli_avp_list *list)
Begin iterating list.
Definition avp.c:666
const radcli_avp * radcli_avp_get(const radcli_avp_list *list, const radcli_attr_def *def, unsigned idx)
Find the idx-th occurrence of an attribute in a list.
Definition avp.c:644
int radcli_avp_get_ip6(const radcli_avp *a, struct in6_addr *out, unsigned *prefix)
Read an attribute's value as an IPv6 address or prefix.
Definition avp.c:769
int radcli_avp_add_ip6(radcli_avp_list *list, const radcli_attr_def *def, const struct in6_addr *value, unsigned prefix)
Append an IPv6-address or IPv6-prefix-typed attribute.
Definition avp.c:386
int radcli_avp_get_gigawords64(const radcli_ctx *ctx, const radcli_avp_list *list, const radcli_attr_def *octets, uint64_t *out)
Reassemble a 64-bit counter from an Octets/Gigawords attribute pair.
Definition avp.c:1312
int radcli_avp_add_ip4(radcli_avp_list *list, const radcli_attr_def *def, struct in_addr value)
Append an IPv4-address-typed attribute from a struct in_addr.
Definition avp.c:363
int radcli_avp_get_ip4prefix(const radcli_avp *a, struct in_addr *out, unsigned *prefix)
Read an attribute's value as an IPv4 prefix.
Definition avp.c:813
int radcli_avp_add_gigawords64(radcli_ctx *ctx, radcli_avp_list *list, const radcli_attr_def *octets, uint64_t value)
Append a 64-bit counter as an Octets/Gigawords attribute pair.
Definition avp.c:1271
int radcli_avp_add_bytes(radcli_avp_list *list, const radcli_attr_def *def, const void *value, size_t len)
Append an attribute holding an arbitrary byte string.
Definition avp.c:224
int radcli_avp_get_uint32(const radcli_avp *a, uint32_t *out)
Read an attribute's value as an integer/IPv4-address/date.
Definition avp.c:716
radcli_avp_list * radcli_avp_list_new(void)
Create an empty attribute-value pair list.
Definition avp.c:145
int radcli_avp_add_gigawords64_by_num(radcli_ctx *ctx, radcli_avp_list *list, uint32_t attrid, uint32_t vendor, uint64_t value)
Look up the octets attribute by legacy numeric ID and append a 64-bit counter as an Octets/Gigawords ...
Definition avp.c:1355
const radcli_attr_def * radcli_avp_def(const radcli_avp *a)
Return the attribute definition of a.
Definition avp.c:703
int radcli_avp_add_uint32(radcli_avp_list *list, const radcli_attr_def *def, uint32_t value)
Append an integer/IPv4-address/date-typed attribute.
Definition avp.c:323
const radcli_avp * radcli_avp_iter_next(radcli_avp_iter *it)
Return the current attribute and advance.
Definition avp.c:680
int radcli_avp_get_bytes(const radcli_avp *a, const void **out, size_t *len)
Read an attribute's value as raw bytes.
Definition avp.c:853
int radcli_avp_add_str(radcli_avp_list *list, const radcli_attr_def *def, const char *value)
Append a string- or text-typed attribute.
Definition avp.c:299
int radcli_avp_add_uint64(radcli_avp_list *list, const radcli_attr_def *def, uint64_t value)
Append a 64-bit integer- or ifid-typed attribute.
Definition avp.c:345
const char * radcli_avp_get_cstr(const radcli_avp *a)
Read an attribute's value as a NUL-terminated string, with no allocation or copy.
Definition avp.c:896
radcli_ctx * radcli_ctx_new(unsigned flags)
Create an empty context, ready for radcli_ctx_set_opt_str()/ _set_opt_int() and radcli_ctx_apply() – ...
Definition config2.c:65
int radcli_ctx_set_opt_str(radcli_ctx *ctx, radcli_opt_id opt, const char *val)
Set a string-typed configuration option.
Definition config2.c:242
const char * radcli_ctx_get_opt_str(const radcli_ctx *ctx, radcli_opt_id opt)
Read back a string-typed configuration option.
Definition config2.c:303
int radcli_ctx_set_opt_int(radcli_ctx *ctx, radcli_opt_id opt, long val)
Set an integer-typed configuration option.
Definition config2.c:274
int radcli_ctx_apply(radcli_ctx *ctx)
Validate the options set so far and initialise the transport.
Definition config2.c:164
radcli_opt_id
Definition radcli2.h:92
int radcli_ctx_read_dictionary(radcli_ctx *ctx, const char *path)
Load an additional attribute dictionary.
Definition config2.c:129
radcli_secret_target
Definition radcli2.h:134
radcli_ctx * radcli_ctx_read_config(const char *filename, unsigned flags)
Create a context by parsing a config file – the main, recommended way to configure radcli.
Definition config2.c:108
void radcli_ctx_free(radcli_ctx *ctx)
Release a context.
Definition config2.c:173
radcli_ctx_flags
Definition radcli2.h:104
int radcli_ctx_read_dictionary_from_buffer(radcli_ctx *ctx, const char *buf, size_t size)
Load an additional attribute dictionary from an in-memory buffer.
Definition config2.c:148
int radcli_ctx_set_tls_psk(radcli_ctx *ctx, const void *identity, size_t identity_len, const uint8_t *key, size_t keylen)
Set the RFC 6614/7360 TLS-transport Pre-Shared Key credentials for the configured authserver.
Definition config2.c:417
int radcli_ctx_set_secret(radcli_ctx *ctx, unsigned target_mask, const char *secret)
Set the RADIUS shared secret for the configured authserver and/or acctserver.
Definition config2.c:378
int radcli_ctx_get_opt_int(const radcli_ctx *ctx, radcli_opt_id opt, long *out)
Read back an integer-typed configuration option.
Definition config2.c:320
@ RADCLI_SECRET_AUTH
Applies to the configured authserver (Access-Request).
Definition radcli2.h:135
@ RADCLI_SECRET_ACCT
Applies to the configured acctserver (Accounting-Request).
Definition radcli2.h:136
@ RADCLI_CTX_NO_BUILTIN_DICT
Skip loading the built-in RFC 2865/2866/2869 dictionary.
Definition radcli2.h:105
const radcli_attr_def * radcli_dict_lookup(const radcli_ctx *ctx, const char *name)
Look up a dictionary attribute by its canonical name.
Definition dict2.c:542
const radcli_attr_def * radcli_dict_lookup_num(const radcli_ctx *ctx, uint32_t attrid, uint32_t vendor)
Look up a dictionary attribute by its legacy numeric ID and vendor.
Definition dict2.c:564
const char * radcli_attr_def_name(const radcli_attr_def *def)
Return an attribute definition's canonical name.
Definition dict2.c:615
radcli_attr_type
Definition radcli2.h:173
const radcli_attr_def * radcli_dict_lookup_oid(const radcli_ctx *ctx, const char *oid)
Look up a dictionary attribute by RFC 6929 §2.7 OID notation.
Definition dict2.c:586
radcli_attr_type radcli_attr_def_type(const radcli_attr_def *def)
Return an attribute definition's wire type.
Definition dict2.c:624
int radcli_attr_def_oid(const radcli_attr_def *def, char *buf, size_t buflen)
Render an attribute definition's RFC 6929 §2.7 OID notation.
Definition dict2.c:638
int radcli_dict_lookup_value(const radcli_ctx *ctx, const radcli_attr_def *def, const char *name, uint32_t *out)
Resolve a dictionary VALUE by name, scoped to one attribute.
Definition dict2.c:674
@ RADCLI_TYPE_IPV6PREFIX
Definition radcli2.h:200
@ RADCLI_TYPE_TEXT
Definition radcli2.h:215
@ RADCLI_TYPE_STRING
Definition radcli2.h:174
@ RADCLI_TYPE_DATE
Definition radcli2.h:190
@ RADCLI_TYPE_IFID
Definition radcli2.h:224
@ RADCLI_TYPE_INTEGER64
Definition radcli2.h:205
@ RADCLI_TYPE_IPADDR
Definition radcli2.h:183
@ RADCLI_TYPE_IPV6ADDR
Definition radcli2.h:197
@ RADCLI_TYPE_IPV4PREFIX
Definition radcli2.h:211
@ RADCLI_TYPE_INTEGER
Definition radcli2.h:180
int radcli_request_perform(radcli_request *r, unsigned flags)
Send a request, optionally waiting for the reply.
Definition request.c:364
int radcli_aaa(radcli_ctx *ctx, radcli_code code, const radcli_avp_list *send, radcli_code *out_code, radcli_avp_list **out_attrs)
Perform an authentication or accounting exchange with Acct-Delay-Time autofill and fail-over across e...
Definition aaa2.c:160
const radcli_avp_list * radcli_request_attrs(const radcli_request *r)
Return the reply's decoded attributes.
Definition request.c:486
radcli_result
Definition radcli2.h:562
const char * radcli_request_server(const radcli_request *r)
Return the name of the server a request was (or will be) sent to.
Definition request.c:497
int radcli_request_done(radcli_request *r)
Report r's outcome once radcli_ctx_dispatch() has resolved it – a pure state query,...
Definition request.c:444
radcli_code
Definition radcli2.h:506
radcli_error_cause
Definition radcli2.h:531
radcli_request * radcli_request_new(radcli_ctx *ctx, radcli_code code, const radcli_avp_list *send)
Create a request to send.
Definition request.c:97
radcli_request_flags
Definition radcli2.h:583
void radcli_request_free(radcli_request *r)
Release a request.
Definition request.c:517
radcli_code radcli_request_code(const radcli_request *r)
Return the reply's RADIUS code.
Definition request.c:473
@ RADCLI_TIMEOUT
No reply from any address the server name resolved to.
Definition radcli2.h:565
@ RADCLI_AGAIN
Definition radcli2.h:570
@ RADCLI_ERROR
Malformed input, a verification failure, or no server configured.
Definition radcli2.h:564
@ RADCLI_OK
A validated reply was received; see radcli_request_code() for which one.
Definition radcli2.h:563
@ RADCLI_REQUEST_SENDONLY
Definition radcli2.h:603