UDP w/o bufferevents, part 1.
[radsecproxy.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 *msg;
36     char buf[1024];
37 };
38
39 struct rs_peer {                /* Config object for a connection.  */
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 struct rs_realm {             /* Config object for a RADIUS realm.  */
48     char *name;
49     enum rs_conn_type type;
50     int timeout;
51     int retries;
52     char *cacertfile;
53     char *cacertpath;
54     char *certfile;
55     char *certkeyfile;
56     struct rs_peer *peers;
57     struct rs_realm *next;
58 };
59
60 struct rs_context {
61     struct rs_realm *realms;
62     struct rs_alloc_scheme alloc_scheme;
63     struct rs_error *err;
64     fr_randctx fr_randctx;
65     cfg_t *cfg;
66 };
67
68 struct rs_connection {
69     struct rs_context *ctx;
70     struct rs_realm *realm;     /* Owned by ctx.  */
71     struct event_base *evb;     /* Event base.  */
72     struct event *tev;          /* Timeout event.  */
73     struct rs_credentials transport_credentials;
74     struct rs_conn_callbacks callbacks;
75     void *user_data;
76     struct rs_peer *peers;
77     struct rs_peer *active_peer;
78     struct rs_error *err;
79     char is_connecting;         /* FIXME: replace with a single state member */
80     char is_connected;          /* FIXME: replace with a single state member */
81     int fd;                     /* Socket.  */
82     int tryagain;               /* For server failover.  */
83     int nextid;                 /* Next RADIUS packet identifier.  */
84     int user_dispatch_flag : 1; /* User does the dispatching.  */
85     /* TCP transport specifics.  */
86     struct bufferevent *bev;    /* Buffer event.  */
87     /* UDP transport specifics.  */
88     struct event *wev;          /* Write event (for UDP).  */
89     struct event *rev;          /* Read event (for UDP).  */
90     struct rs_packet *out_queue; /* Queue for outgoing UDP packets.  */
91 #if defined(RS_ENABLE_TLS)
92     /* TLS specifics.  */
93     SSL_CTX *tls_ctx;
94     SSL *tls_ssl;
95 #endif
96 };
97
98 struct rs_packet {
99     struct rs_connection *conn;
100     char hdr_read_flag;
101     uint8_t hdr[4];
102     RADIUS_PACKET *rpkt;
103     struct rs_packet *original;
104     char valid_flag;
105     char written_flag;
106     struct rs_packet *next;     /* Used for UDP output queue.  */
107 };
108
109 struct rs_attr {
110     struct rs_packet *pkt;
111     VALUE_PAIR *vp;
112 };
113
114 /* Nonpublic functions.  */
115 struct rs_error *_rs_resolv(struct evutil_addrinfo **addr,
116                             rs_conn_type_t type, const char *hostname,
117                             const char *service);
118 struct rs_peer *_rs_peer_create(struct rs_context *ctx,
119                                 struct rs_peer **rootp);
120 struct rs_error *_rs_err_create(unsigned int code, const char *file,
121                                 int line, const char *fmt, ...);
122 int _rs_err_conn_push_err(struct rs_connection *conn,
123                           struct rs_error *err);
124
125
126 #if defined (__cplusplus)
127 }
128 #endif
129
130 /* Convenience macros.  */
131 #define rs_calloc(h, nmemb, size) \
132     (h->alloc_scheme.calloc ? h->alloc_scheme.calloc : calloc)(nmemb, size)
133 #define rs_malloc(h, size) \
134     (h->alloc_scheme.malloc ? h->alloc_scheme.malloc : malloc)(size)
135 #define rs_free(h, ptr) \
136     (h->alloc_scheme.free ? h->alloc_scheme.free : free)(ptr)
137 #define rs_realloc(h, realloc, ptr, size) \
138     (h->alloc_scheme.realloc ? h->alloc_scheme.realloc : realloc)(ptr, size)
139 #define min(a, b) ((a) < (b) ? (a) : (b))
140 #define max(a, b) ((a) > (b) ? (a) : (b))
141
142 /* Local Variables: */
143 /* c-file-style: "stroustrup" */
144 /* End: */