The FreeRADIUS server $Id: 15bac2a4c627c01d1aa2047687b3418955ac7f00 $
Loading...
Searching...
No Matches
tacacs.h
Go to the documentation of this file.
1#pragma once
2/*
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation; either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
16 *
17 * @copyright 2017 The FreeRADIUS server project
18 * @copyright 2017 Network RADIUS SAS (legal@networkradius.com)
19 */
20
21#include <freeradius-devel/util/dbuff.h>
22
23#include <freeradius-devel/protocol/tacacs/freeradius.internal.h>
24#include <freeradius-devel/protocol/tacacs/dictionary.h>
25
26#define FR_HEADER_LENGTH sizeof(fr_tacacs_packet_hdr_t)
27#define FR_MAX_PACKET_SIZE 4096
28#define FR_MAX_ATTRIBUTES 255
29
30
31#define FR_TAC_PLUS_MAJOR_VER 12
32#define FR_TAC_PLUS_MINOR_VER_DEFAULT 0
33#define FR_TAC_PLUS_MINOR_VER_ONE 1
34
35/**
36 * 3.4. The TACACS+ Packet Header
37 *
38 * seq_no
39 *
40 * This is the sequence number of the current packet for the current session.
41 * The first packet in a session MUST have the sequence number 1 and each subsequent
42 * packet will increment the sequence number by one. Thus clients only send packets
43 * containing odd sequence numbers, and TACACS+ servers only send packets containing
44 * even sequence numbers.
45 *
46 * The sequence number must never wrap i.e. if the sequence number 2^8-1 is ever reached,
47 * that session must terminate and be restarted with a sequence number of 1.
48 */
49#define packet_is_authen_start_request(p) (((p)->hdr.type == FR_TAC_PLUS_AUTHEN) && ((p)->hdr.seq_no == 1))
50#define packet_is_authen_continue(p) (((p)->hdr.type == FR_TAC_PLUS_AUTHEN) && ((p)->hdr.seq_no > 1) && (((p)->hdr.seq_no % 2) == 1))
51#define packet_is_authen_reply(p) (((p)->hdr.type == FR_TAC_PLUS_AUTHEN) && (((p)->hdr.seq_no % 2) == 0))
52
53#define packet_is_author_request(p) (((p)->hdr.type == FR_TAC_PLUS_AUTHOR) && (((p)->hdr.seq_no % 2) == 1))
54#define packet_is_author_reply(p) (((p)->hdr.type == FR_TAC_PLUS_AUTHOR) && (((p)->hdr.seq_no % 2) == 0))
55
56#define packet_is_acct_request(p) (((p)->hdr.type == FR_TAC_PLUS_ACCT) && (((p)->hdr.seq_no % 2) == 1))
57#define packet_is_acct_reply(p) (((p)->hdr.type == FR_TAC_PLUS_ACCT) && (((p)->hdr.seq_no % 2) == 0))
58
59#define packet_has_valid_seq_no(p) ((p)->hdr.seq_no != 0)
60
61#define packet_is_encrypted(p) (((p)->hdr.flags & FR_TAC_PLUS_UNENCRYPTED_FLAG) == 0)
62
70
71/*
72 * GCC doesn't support flag_enum (yet)
73 *
74 * https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81665
75 */
76DIAG_OFF(attributes)
82DIAG_ON(attributes)
83
84typedef struct CC_HINT(__packed__) {
85 union {
86 uint8_t version;
87 struct CC_HINT(__packed__) {
88#ifdef WORDS_BIGENDIAN
89 unsigned int major:4;
90 unsigned int minor:4;
91#else
92 unsigned int minor:4;
93 unsigned int major:4;
94#endif
95 } ver;
96 };
103
109
118
125
138
149
150typedef enum {
153 FR_TAC_PLUS_AUTHEN_STATUS_GETDATA = 0x03, /* prompt for data */
154 FR_TAC_PLUS_AUTHEN_STATUS_GETUSER = 0x04, /* prompt for username */
155 FR_TAC_PLUS_AUTHEN_STATUS_GETPASS = 0x05, /* prmpt for password */
156 FR_TAC_PLUS_AUTHEN_STATUS_RESTART = 0x06, /* client restarts with START and seq_no=1 */
157 FR_TAC_PLUS_AUTHEN_STATUS_ERROR = 0x07, /* server has unrecoverable error */
158 FR_TAC_PLUS_AUTHEN_STATUS_FOLLOW = 0x21 /* forward, should be treated as FR_TAC_PLUS_AUTHEN_STATUS_FAIL */
160
165
172
177
183
197
209
210typedef enum {
211 FR_TAC_PLUS_AUTHOR_STATUS_PASS_ADD = 0x01, /* authorized, append new arguments (if any) */
212 FR_TAC_PLUS_AUTHOR_STATUS_PASS_REPL = 0x02, /* authorized, replace arguments */
214 FR_TAC_PLUS_AUTHOR_STATUS_ERROR = 0x11, /* server error, no argument values */
215 FR_TAC_PLUS_AUTHOR_STATUS_FOLLOW = 0x21 /* forward, should be treated as FR_TAC_PLUS_AUTHOR_STATUS_FAIL */
217
225
231
244
253
254typedef enum {
257 FR_TAC_PLUS_ACCT_STATUS_FOLLOW = 0x21 /* forward, should be treated as FR_TAC_PLUS_ACCT_STATUS_ERROR */
259
265
266/*
267 * Technically the flexible array extensions aren't allowed
268 * but clang and GCC still seem to do the right thing.
269 *
270 * If this ever becomes an issue the code will need to be
271 * refactored.
272 */
273#ifdef __clang__
274DIAG_OFF(flexible-array-extensions)
275#endif
288#ifdef __clang__
289DIAG_ON(flexible-array-extensions)
290#endif
291
292typedef enum {
294
295 FR_TACACS_CODE_AUTH_START = FR_PACKET_TYPE_VALUE_AUTHENTICATION_START,
296 FR_TACACS_CODE_AUTH_PASS = FR_PACKET_TYPE_VALUE_AUTHENTICATION_PASS,
297 FR_TACACS_CODE_AUTH_FAIL = FR_PACKET_TYPE_VALUE_AUTHENTICATION_FAIL,
298 FR_TACACS_CODE_AUTH_GETDATA = FR_PACKET_TYPE_VALUE_AUTHENTICATION_GETDATA,
299 FR_TACACS_CODE_AUTH_GETUSER = FR_PACKET_TYPE_VALUE_AUTHENTICATION_GETUSER,
300 FR_TACACS_CODE_AUTH_GETPASS = FR_PACKET_TYPE_VALUE_AUTHENTICATION_GETPASS,
301 FR_TACACS_CODE_AUTH_RESTART = FR_PACKET_TYPE_VALUE_AUTHENTICATION_RESTART,
302 FR_TACACS_CODE_AUTH_ERROR = FR_PACKET_TYPE_VALUE_AUTHENTICATION_ERROR,
303
304 FR_TACACS_CODE_AUTH_CONT = FR_PACKET_TYPE_VALUE_AUTHENTICATION_CONTINUE,
305 FR_TACACS_CODE_AUTH_CONT_ABORT = FR_PACKET_TYPE_VALUE_AUTHENTICATION_CONTINUE_ABORT,
306
307 FR_TACACS_CODE_AUTZ_REQUEST = FR_PACKET_TYPE_VALUE_AUTHORIZATION_REQUEST,
308 FR_TACACS_CODE_AUTZ_PASS_ADD = FR_PACKET_TYPE_VALUE_AUTHORIZATION_PASS_ADD,
309 FR_TACACS_CODE_AUTZ_PASS_REPLACE = FR_PACKET_TYPE_VALUE_AUTHORIZATION_PASS_REPLACE,
310 FR_TACACS_CODE_AUTZ_FAIL = FR_PACKET_TYPE_VALUE_AUTHORIZATION_FAIL,
311 FR_TACACS_CODE_AUTZ_ERROR = FR_PACKET_TYPE_VALUE_AUTHORIZATION_ERROR,
312
313 FR_TACACS_CODE_ACCT_REQUEST = FR_PACKET_TYPE_VALUE_ACCOUNTING_REQUEST,
314 FR_TACACS_CODE_ACCT_SUCCESS = FR_PACKET_TYPE_VALUE_ACCOUNTING_SUCCESS,
315 FR_TACACS_CODE_ACCT_ERROR = FR_PACKET_TYPE_VALUE_ACCOUNTING_ERROR,
316
320
321
322#define FR_TACACS_PACKET_CODE_VALID(_code) (((_code) > 0) && ((_code) < FR_TACACS_CODE_MAX))
323
325
326/** Used as the decoder ctx
327 *
328 */
329typedef struct {
331 char const *secret;
333
334/* encode.c */
335ssize_t fr_tacacs_encode(fr_dbuff_t *dbuff, uint8_t const *original, char const *const secret, size_t secret_len,
336 unsigned int code, fr_pair_list_t *vps);
337
339
340/* decode.c */
341ssize_t fr_tacacs_decode(TALLOC_CTX *ctx, fr_pair_list_t *out, fr_dict_attr_t const *vendor, uint8_t const *buffer, size_t buffer_len,
342 UNUSED const uint8_t *original, char const * const secret, size_t secret_len, int *code);
343
345
346/* base.c */
347ssize_t fr_tacacs_length(uint8_t const *buffer, size_t buffer_len);
348
349int fr_tacacs_global_init(void);
350
351void fr_tacacs_global_free(void);
352
353int fr_tacacs_body_xor(fr_tacacs_packet_t const *pkt, uint8_t *body, size_t body_len, char const *secret, size_t secret_len) CC_HINT(nonnull(1,2,4));
354
355#define fr_tacacs_packet_log_hex(_log, _packet, _size) _fr_tacacs_packet_log_hex(_log, _packet, _size, __FILE__, __LINE__)
356void _fr_tacacs_packet_log_hex(fr_log_t const *log, fr_tacacs_packet_t const *packet, size_t packet_len, char const *file, int line) CC_HINT(nonnull);
static int const char char buffer[256]
Definition acutest.h:576
int const char * file
Definition acutest.h:702
int const char int line
Definition acutest.h:702
#define DIAG_ON(_x)
Definition build.h:458
#define UNUSED
Definition build.h:315
#define DIAG_OFF(_x)
Definition build.h:457
unsigned short uint16_t
unsigned int uint32_t
long int ssize_t
unsigned char uint8_t
int fr_tacacs_body_xor(fr_tacacs_packet_t const *pkt, uint8_t *body, size_t body_len, char const *secret, size_t secret_len)
XOR the body based on the secret key.
Definition base.c:180
void _fr_tacacs_packet_log_hex(fr_log_t const *log, fr_tacacs_packet_t const *packet, size_t packet_len, char const *file, int line)
Definition base.c:420
ssize_t fr_tacacs_length(uint8_t const *buffer, size_t buffer_len)
Definition base.c:242
char const * fr_tacacs_packet_names[FR_TACACS_CODE_MAX]
Definition base.c:119
void fr_tacacs_global_free(void)
Definition base.c:167
int fr_tacacs_global_init(void)
Definition base.c:144
ssize_t fr_tacacs_decode(TALLOC_CTX *ctx, fr_pair_list_t *out, fr_dict_attr_t const *vendor, uint8_t const *buffer, size_t buffer_len, const uint8_t *original, char const *const secret, size_t secret_len, int *code)
Decode a TACACS+ packet.
Definition decode.c:409
int fr_tacacs_packet_to_code(fr_tacacs_packet_t const *pkt)
Definition decode.c:36
int fr_tacacs_code_to_packet(fr_tacacs_packet_t *pkt, uint32_t code)
Definition encode.c:36
ssize_t fr_tacacs_encode(fr_dbuff_t *dbuff, uint8_t const *original_packet, char const *secret, size_t secret_len, unsigned int code, fr_pair_list_t *vps)
Encode VPS into a raw TACACS packet.
Definition encode.c:363
static char * secret
Definition log.h:96
fr_tacacs_author_authen_method_t authen_method
Definition tacacs.h:199
char const * secret
Definition tacacs.h:331
fr_tacacs_author_authen_method_t authen_method
Definition tacacs.h:234
ssize_t fr_tacacs_encode(fr_dbuff_t *dbuff, uint8_t const *original, char const *const secret, size_t secret_len, unsigned int code, fr_pair_list_t *vps)
Encode VPS into a raw TACACS packet.
Definition encode.c:363
void _fr_tacacs_packet_log_hex(fr_log_t const *log, fr_tacacs_packet_t const *packet, size_t packet_len, char const *file, int line)
Definition base.c:420
int fr_tacacs_code_to_packet(fr_tacacs_packet_t *pkt, uint32_t code)
Definition encode.c:36
ssize_t fr_tacacs_length(uint8_t const *buffer, size_t buffer_len)
Definition base.c:242
int fr_tacacs_body_xor(fr_tacacs_packet_t const *pkt, uint8_t *body, size_t body_len, char const *secret, size_t secret_len))
XOR the body based on the secret key.
Definition base.c:180
fr_tacacs_authenservice_t
Definition tacacs.h:126
@ FR_TAC_PLUS_AUTHEN_SVC_FWPROXY
Definition tacacs.h:136
@ FR_TAC_PLUS_AUTHEN_SVC_X25
Definition tacacs.h:134
@ FR_TAC_PLUS_AUTHEN_SVC_ENABLE
Definition tacacs.h:129
@ FR_TAC_PLUS_AUTHEN_SVC_ARAP
Definition tacacs.h:131
@ FR_TAC_PLUS_AUTHEN_SVC_PPP
Definition tacacs.h:130
@ FR_TAC_PLUS_AUTHEN_SVC_RCMD
Definition tacacs.h:133
@ FR_TAC_PLUS_AUTHEN_SVC_PT
Definition tacacs.h:132
@ FR_TAC_PLUS_AUTHEN_SVC_NONE
Definition tacacs.h:127
@ FR_TAC_PLUS_AUTHEN_SVC_LOGIN
Definition tacacs.h:128
@ FR_TAC_PLUS_AUTHEN_SVC_NASI
Definition tacacs.h:135
fr_tacacs_authen_reply_flags_t
Definition tacacs.h:161
@ FR_TAC_PLUS_REPLY_FLAG_UNSET
Definition tacacs.h:162
@ FR_TAC_PLUS_REPLY_FLAG_NOECHO
Definition tacacs.h:163
fr_tacacs_authentype_t authen_type
Definition tacacs.h:201
fr_tacacs_packet_body_type_t
Definition tacacs.h:245
@ FR_PACKET_BODY_TYPE_REQUEST
Definition tacacs.h:250
@ FR_PACKET_BODY_TYPE_CONTINUE
Definition tacacs.h:249
@ FR_PACKET_BODY_TYPE_UNKNOWN
Definition tacacs.h:246
@ FR_PACKET_BODY_TYPE_RESPONSE
Definition tacacs.h:251
@ FR_PACKET_BODY_TYPE_REPLY
Definition tacacs.h:248
@ FR_PACKET_BODY_TYPE_START
Definition tacacs.h:247
fr_tacacs_authen_cont_flags_t
Definition tacacs.h:173
@ FR_TAC_PLUS_CONTINUE_FLAG_UNSET
Definition tacacs.h:174
@ FR_TAC_PLUS_CONTINUE_FLAG_ABORT
Definition tacacs.h:175
char const * fr_tacacs_packet_names[FR_TACACS_CODE_MAX]
Definition base.c:119
fr_tacacs_authen_cont_flags_t flags
Definition tacacs.h:181
fr_tacacs_flags_t
Definition tacacs.h:77
@ FR_TAC_PLUS_SINGLE_CONNECT_FLAG
Definition tacacs.h:80
@ FR_TAC_PLUS_UNENCRYPTED_FLAG
Definition tacacs.h:79
@ FR_TAC_PLUS_FLAGS_NONE
Definition tacacs.h:78
void fr_tacacs_global_free(void)
Definition base.c:167
fr_dict_attr_t const * root
Definition tacacs.h:330
fr_tacacs_privlvl_t
Definition tacacs.h:119
@ FR_TAC_PLUS_PRIV_LVL_USER
Definition tacacs.h:122
@ FR_TAC_PLUS_PRIV_LVL_ROOT
Definition tacacs.h:121
@ FR_TAC_PLUS_PRIV_LVL_MIN
Definition tacacs.h:123
@ FR_TAC_PLUS_PRIV_LVL_MAX
Definition tacacs.h:120
fr_tacacs_author_reply_status_t
Definition tacacs.h:210
@ FR_TAC_PLUS_AUTHOR_STATUS_PASS_ADD
Definition tacacs.h:211
@ FR_TAC_PLUS_AUTHOR_STATUS_FOLLOW
Definition tacacs.h:215
@ FR_TAC_PLUS_AUTHOR_STATUS_ERROR
Definition tacacs.h:214
@ FR_TAC_PLUS_AUTHOR_STATUS_FAIL
Definition tacacs.h:213
@ FR_TAC_PLUS_AUTHOR_STATUS_PASS_REPL
Definition tacacs.h:212
fr_tacacs_authenservice_t authen_service
Definition tacacs.h:237
ssize_t fr_tacacs_decode(TALLOC_CTX *ctx, fr_pair_list_t *out, fr_dict_attr_t const *vendor, uint8_t const *buffer, size_t buffer_len, UNUSED const uint8_t *original, char const *const secret, size_t secret_len, int *code)
int fr_tacacs_global_init(void)
Definition base.c:144
fr_tacacs_type_t
Definition tacacs.h:63
@ FR_TAC_PLUS_INVALID
Definition tacacs.h:64
@ FR_TAC_PLUS_ACCT
Definition tacacs.h:67
@ FR_TAC_PLUS_MAX
Definition tacacs.h:68
@ FR_TAC_PLUS_AUTHEN
Definition tacacs.h:65
@ FR_TAC_PLUS_AUTHOR
Definition tacacs.h:66
fr_tacacs_authentype_t authen_type
Definition tacacs.h:236
fr_tacacs_privlvl_t priv_lvl
Definition tacacs.h:200
fr_tacacs_author_authen_method_t
Definition tacacs.h:184
@ FR_TAC_PLUS_AUTHEN_METH_KRB5
Definition tacacs.h:187
@ FR_TAC_PLUS_AUTHEN_METH_RCMD
Definition tacacs.h:195
@ FR_TAC_PLUS_AUTHEN_METH_LINE
Definition tacacs.h:188
@ FR_TAC_PLUS_AUTHEN_METH_RADIUS
Definition tacacs.h:193
@ FR_TAC_PLUS_AUTHEN_METH_KRB4
Definition tacacs.h:194
@ FR_TAC_PLUS_AUTHEN_METH_LOCAL
Definition tacacs.h:190
@ FR_TAC_PLUS_AUTHEN_METH_NONE
Definition tacacs.h:186
@ FR_TAC_PLUS_AUTHEN_METH_ENABLE
Definition tacacs.h:189
@ FR_TAC_PLUS_AUTHEN_METH_GUEST
Definition tacacs.h:192
@ FR_TAC_PLUS_AUTHEN_METH_NOT_SET
Definition tacacs.h:185
@ FR_TAC_PLUS_AUTHEN_METH_TACACSPLUS
Definition tacacs.h:191
fr_tacacs_acct_reply_status_t status
Definition tacacs.h:263
fr_tacacs_privlvl_t priv_lvl
Definition tacacs.h:235
fr_tacacs_author_reply_status_t status
Definition tacacs.h:219
fr_tacacs_action_t
Definition tacacs.h:104
@ FR_TAC_PLUS_AUTHEN_SENDAUTH
Definition tacacs.h:107
@ FR_TAC_PLUS_AUTHEN_LOGIN
Definition tacacs.h:105
@ FR_TAC_PLUS_AUTHEN_CHPASS
Definition tacacs.h:106
fr_tacacs_acct_req_flags_t
Definition tacacs.h:226
@ FR_TAC_PLUS_ACCT_FLAG_WATCHDOG
Definition tacacs.h:229
@ FR_TAC_PLUS_ACCT_FLAG_START
Definition tacacs.h:227
@ FR_TAC_PLUS_ACCT_FLAG_STOP
Definition tacacs.h:228
fr_tacacs_authenservice_t authen_service
Definition tacacs.h:143
fr_tacacs_authentype_t authen_type
Definition tacacs.h:142
fr_tacacs_packet_hdr_t hdr
Definition tacacs.h:277
fr_tacacs_authenservice_t authen_service
Definition tacacs.h:202
fr_tacacs_authentype_t
Definition tacacs.h:110
@ FR_TAC_PLUS_AUTHEN_TYPE_PAP
Definition tacacs.h:112
@ FR_TAC_PLUS_AUTHEN_TYPE_CHAP
Definition tacacs.h:113
@ FR_TAC_PLUS_AUTHEN_TYPE_ASCII
Definition tacacs.h:111
@ FR_TAC_PLUS_AUTHEN_TYPE_MSCHAP
Definition tacacs.h:115
@ FR_TAC_PLUS_AUTHEN_TYPE_MSCHAPV2
Definition tacacs.h:116
@ FR_TAC_PLUS_AUTHEN_TYPE_ARAP
Definition tacacs.h:114
fr_tacacs_flags_t flags
Definition tacacs.h:99
fr_tacacs_privlvl_t priv_lvl
Definition tacacs.h:141
fr_tacacs_type_t type
Definition tacacs.h:97
fr_tacacs_packet_code_t
Definition tacacs.h:292
@ FR_TACACS_CODE_ACCT_ERROR
Definition tacacs.h:315
@ FR_TACACS_CODE_INVALID
Definition tacacs.h:293
@ FR_TACACS_CODE_DO_NOT_RESPOND
Definition tacacs.h:318
@ FR_TACACS_CODE_ACCT_REQUEST
Definition tacacs.h:313
@ FR_TACACS_CODE_AUTZ_REQUEST
Definition tacacs.h:307
@ FR_TACACS_CODE_AUTH_GETDATA
Definition tacacs.h:298
@ FR_TACACS_CODE_AUTH_RESTART
Definition tacacs.h:301
@ FR_TACACS_CODE_AUTZ_PASS_REPLACE
Definition tacacs.h:309
@ FR_TACACS_CODE_MAX
Definition tacacs.h:317
@ FR_TACACS_CODE_AUTH_GETUSER
Definition tacacs.h:299
@ FR_TACACS_CODE_AUTH_GETPASS
Definition tacacs.h:300
@ FR_TACACS_CODE_AUTZ_FAIL
Definition tacacs.h:310
@ FR_TACACS_CODE_AUTH_CONT_ABORT
Definition tacacs.h:305
@ FR_TACACS_CODE_AUTH_PASS
Definition tacacs.h:296
@ FR_TACACS_CODE_AUTH_CONT
Definition tacacs.h:304
@ FR_TACACS_CODE_AUTZ_PASS_ADD
Definition tacacs.h:308
@ FR_TACACS_CODE_AUTH_START
Definition tacacs.h:295
@ FR_TACACS_CODE_AUTH_FAIL
Definition tacacs.h:297
@ FR_TACACS_CODE_AUTH_ERROR
Definition tacacs.h:302
@ FR_TACACS_CODE_AUTZ_ERROR
Definition tacacs.h:311
@ FR_TACACS_CODE_ACCT_SUCCESS
Definition tacacs.h:314
int fr_tacacs_packet_to_code(fr_tacacs_packet_t const *pkt)
Definition decode.c:36
fr_tacacs_acct_req_flags_t flags
Definition tacacs.h:233
fr_tacacs_authen_reply_status_t status
Definition tacacs.h:167
fr_tacacs_acct_reply_status_t
Definition tacacs.h:254
@ FR_TAC_PLUS_ACCT_STATUS_SUCCESS
Definition tacacs.h:255
@ FR_TAC_PLUS_ACCT_STATUS_FOLLOW
Definition tacacs.h:257
@ FR_TAC_PLUS_ACCT_STATUS_ERROR
Definition tacacs.h:256
fr_tacacs_authen_reply_status_t
Definition tacacs.h:150
@ FR_TAC_PLUS_AUTHEN_STATUS_PASS
Definition tacacs.h:151
@ FR_TAC_PLUS_AUTHEN_STATUS_GETDATA
Definition tacacs.h:153
@ FR_TAC_PLUS_AUTHEN_STATUS_ERROR
Definition tacacs.h:157
@ FR_TAC_PLUS_AUTHEN_STATUS_GETUSER
Definition tacacs.h:154
@ FR_TAC_PLUS_AUTHEN_STATUS_FAIL
Definition tacacs.h:152
@ FR_TAC_PLUS_AUTHEN_STATUS_FOLLOW
Definition tacacs.h:158
@ FR_TAC_PLUS_AUTHEN_STATUS_RESTART
Definition tacacs.h:156
@ FR_TAC_PLUS_AUTHEN_STATUS_GETPASS
Definition tacacs.h:155
fr_tacacs_authen_reply_flags_t flags
Definition tacacs.h:168
Used as the decoder ctx.
Definition tacacs.h:329
int nonnull(2, 5))
static size_t char ** out
Definition value.h:997