The FreeRADIUS server  $Id: 15bac2a4c627c01d1aa2047687b3418955ac7f00 $
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 
63 typedef enum {
68  FR_TAC_PLUS_MAX = 0x04
70 
71 /*
72  * GCC doesn't support flag_enum (yet)
73  *
74  * https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81665
75  */
76 DIAG_OFF(attributes)
77 typedef enum CC_HINT(flag_enum) {
82 DIAG_ON(attributes)
83 
84 typedef 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 
104 typedef enum {
109 
110 typedef enum {
114  FR_TAC_PLUS_AUTHEN_TYPE_ARAP = 0x04, /* deprecated */
118 
119 typedef enum {
125 
126 typedef enum {
138 
139 typedef struct CC_HINT(__packed__) {
149 
150 typedef enum {
151  FR_TAC_PLUS_AUTHEN_STATUS_PASS = 0x01, /* accept */
152  FR_TAC_PLUS_AUTHEN_STATUS_FAIL = 0x02, /* reject */
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 
161 typedef enum {
162  FR_TAC_PLUS_REPLY_FLAG_UNSET = 0x00, /* gdb candy */
165 
166 typedef struct CC_HINT(__packed__) {
172 
173 typedef enum {
174  FR_TAC_PLUS_CONTINUE_FLAG_UNSET = 0x00, /* gdb candy */
177 
178 typedef struct CC_HINT(__packed__) {
183 
184 typedef enum {
197 
198 typedef struct CC_HINT(__packed__) {
207  uint8_t arg_len[];
209 
210 typedef 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 */
213  FR_TAC_PLUS_AUTHOR_STATUS_FAIL = 0x10, /* reject */
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 
218 typedef struct CC_HINT(__packed__) {
223  uint8_t arg_len[];
225 
226 typedef enum {
231 
232 typedef struct CC_HINT(__packed__) {
242  uint8_t arg_len[];
244 
245 typedef enum {
253 
254 typedef enum {
257  FR_TAC_PLUS_ACCT_STATUS_FOLLOW = 0x21 /* forward, should be treated as FR_TAC_PLUS_ACCT_STATUS_ERROR */
259 
260 typedef struct CC_HINT(__packed__) {
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__
274 DIAG_OFF(flexible-array-extensions)
275 #endif
276 typedef struct CC_HINT(__packed__) {
278  union {
286  };
288 #ifdef __clang__
289 DIAG_ON(flexible-array-extensions)
290 #endif
291 
292 typedef 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 
319 
320 
321 #define FR_TACACS_PACKET_CODE_VALID(_code) (((_code) > 0) && ((_code) < FR_TACACS_CODE_MAX))
322 
323 extern char const *fr_tacacs_packet_names[FR_TACACS_CODE_MAX];
324 
325 /** Used as the decoder ctx
326  *
327  */
328 typedef struct {
330  char const *secret;
332 
333 /* encode.c */
334 ssize_t fr_tacacs_encode(fr_dbuff_t *dbuff, uint8_t const *original, char const *const secret, size_t secret_len,
335  unsigned int code, fr_pair_list_t *vps);
336 
338 
339 /* decode.c */
340 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,
341  UNUSED const uint8_t *original, char const * const secret, size_t secret_len, int *code);
342 
344 
345 /* base.c */
346 ssize_t fr_tacacs_length(uint8_t const *buffer, size_t buffer_len);
347 
348 int fr_tacacs_global_init(void);
349 
350 void fr_tacacs_global_free(void);
351 
352 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) CC_HINT(nonnull(1,2,4));
353 
354 #define fr_tacacs_packet_log_hex(_log, _packet, _size) _fr_tacacs_packet_log_hex(_log, _packet, _size, __FILE__, __LINE__)
355 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) CC_HINT(nonnull);
static int const char char buffer[256]
Definition: acutest.h:574
int const char * file
Definition: acutest.h:702
int const char int line
Definition: acutest.h:702
#define DIAG_ON(_x)
Definition: build.h:419
#define UNUSED
Definition: build.h:313
#define DIAG_OFF(_x)
Definition: build.h:418
unsigned short uint16_t
Definition: merged_model.c:31
unsigned int uint32_t
Definition: merged_model.c:33
long int ssize_t
Definition: merged_model.c:24
unsigned char uint8_t
Definition: merged_model.c:30
static size_t array[MY_ARRAY_SIZE]
static char * secret
Definition: radclient-ng.c:69
Definition: log.h:96
fr_tacacs_author_authen_method_t authen_method
Definition: tacacs.h:199
char const * secret
Definition: tacacs.h:330
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:329
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_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_action_t action
Definition: tacacs.h:140
fr_tacacs_acct_req_flags_t flags
Definition: tacacs.h:233
uint32_t session_id
Definition: tacacs.h:100
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:328
int nonnull(2, 5))
static size_t char ** out
Definition: value.h:984