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