f8891ee2ad9950865de78061b1414e858dc9e512
[libradsec.git] / lib / include / radsec / radsec-impl.h
1 /** @file libradsec-impl.h
2     @brief Libraray internal header file for libradsec.  */
3
4 /* See the file COPYING for licensing information.  */
5
6 #include <freeradius/libradius.h>
7 #include <event2/util.h>
8 #include <confuse.h>
9 #if defined(RS_ENABLE_TLS)
10 #include <openssl/ssl.h>
11 #endif
12
13 /* Constants.  */
14 #define RS_HEADER_LEN 4
15
16 /* Data types.  */
17 enum rs_cred_type {
18     RS_CRED_NONE = 0,
19     RS_CRED_TLS_PSK_RSA,        /* RFC 4279.  */
20 };
21 typedef unsigned int rs_cred_type_t;
22
23 #if defined (__cplusplus)
24 extern "C" {
25 #endif
26
27 struct rs_credentials {
28     enum rs_cred_type type;
29     char *identity;
30     char *secret;
31 };
32
33 struct rs_error {
34     int code;
35     char buf[1024];
36 };
37
38 /** Configuration object for a connection.  */
39 struct rs_peer {
40     struct rs_connection *conn;
41     struct rs_realm *realm;
42     struct evutil_addrinfo *addr;
43     char *secret;
44     struct rs_peer *next;
45 };
46
47 /** Configuration object for a RADIUS realm.  */
48 struct rs_realm {
49     char *name;
50     enum rs_conn_type type;
51     int timeout;
52     int retries;
53     char *cacertfile;
54     char *cacertpath;
55     char *certfile;
56     char *certkeyfile;
57     struct rs_peer *peers;
58     struct rs_realm *next;
59 };
60
61 /** Top configuration object.  */
62 struct rs_config {
63     char *dictionary;
64     struct rs_realm *realms;
65     cfg_t *cfg;
66 };
67
68 struct rs_context {
69     struct rs_config *config;
70     struct rs_alloc_scheme alloc_scheme;
71     struct rs_error *err;
72     fr_randctx fr_randctx;
73 };
74
75 struct rs_connection {
76     struct rs_context *ctx;
77     struct rs_realm *realm;     /* Owned by ctx.  */
78     struct event_base *evb;     /* Event base.  */
79     struct event *tev;          /* Timeout event.  */
80     struct rs_credentials transport_credentials;
81     struct rs_conn_callbacks callbacks;
82     void *user_data;
83     struct rs_peer *peers;
84     struct rs_peer *active_peer;
85     struct rs_error *err;
86     struct timeval timeout;
87     char is_connecting;         /* FIXME: replace with a single state member */
88     char is_connected;          /* FIXME: replace with a single state member */
89     int fd;                     /* Socket.  */
90     int tryagain;               /* For server failover.  */
91     int nextid;                 /* Next RADIUS packet identifier.  */
92     /* TCP transport specifics.  */
93     struct bufferevent *bev;    /* Buffer event.  */
94     /* UDP transport specifics.  */
95     struct event *wev;          /* Write event (for UDP).  */
96     struct event *rev;          /* Read event (for UDP).  */
97     struct rs_packet *out_queue; /* Queue for outgoing UDP packets.  */
98 #if defined(RS_ENABLE_TLS)
99     /* TLS specifics.  */
100     SSL_CTX *tls_ctx;
101     SSL *tls_ssl;
102 #endif
103 };
104
105 enum rs_packet_flags {
106     rs_packet_hdr_read_flag,
107     rs_packet_received_flag,
108     rs_packet_sent_flag,
109 };
110
111 struct rs_packet {
112     struct rs_connection *conn;
113     unsigned int flags;
114     uint8_t hdr[RS_HEADER_LEN];
115     RADIUS_PACKET *rpkt;        /* FreeRADIUS object.  */
116     struct rs_packet *next;     /* Used for UDP output queue.  */
117 };
118
119 /* Nonpublic functions (in radsec.c -- FIXME: move?).  */
120 struct rs_error *rs_resolv (struct evutil_addrinfo **addr,
121                             rs_conn_type_t type,
122                             const char *hostname,
123                             const char *service);
124 #if defined (__cplusplus)
125 }
126 #endif
127
128 /* Convenience macros.  */
129 #define rs_calloc(h, nmemb, size) \
130     (h->alloc_scheme.calloc ? h->alloc_scheme.calloc : calloc)(nmemb, size)
131 #define rs_malloc(h, size) \
132     (h->alloc_scheme.malloc ? h->alloc_scheme.malloc : malloc)(size)
133 #define rs_free(h, ptr) \
134     (h->alloc_scheme.free ? h->alloc_scheme.free : free)(ptr)
135 #define rs_realloc(h, realloc, ptr, size) \
136     (h->alloc_scheme.realloc ? h->alloc_scheme.realloc : realloc)(ptr, size)
137 #define min(a, b) ((a) < (b) ? (a) : (b))
138 #define max(a, b) ((a) > (b) ? (a) : (b))
139
140 /* Local Variables: */
141 /* c-file-style: "stroustrup" */
142 /* End: */