1 /** @file libradsec-impl.h
2 @brief Libraray internal header file for libradsec. */
4 /* Copyright 2010,2011,2013 NORDUnet A/S. All rights reserved.
5 See LICENSE for licensing information. */
7 #ifndef _RADSEC_RADSEC_IMPL_H_
8 #define _RADSEC_RADSEC_IMPL_H_ 1
11 #include <event2/util.h>
13 #if defined(RS_ENABLE_TLS)
14 #include <openssl/ssl.h>
20 #define RS_HEADER_LEN 4
21 #define RS_CONN_MAGIC_BASE 0xAE004711u
22 #define RS_CONN_MAGIC_GENERIC 0x843AEF47u
23 #define RS_CONN_MAGIC_LISTENER 0xDCB04783u
29 /* TLS pre-shared keys, RFC 4279. */
31 /* RS_CRED_TLS_DH_PSK, */
32 /* RS_CRED_TLS_RSA_PSK, */
34 typedef unsigned int rs_cred_type_t;
36 enum rs_key_encoding {
37 RS_KEY_ENCODING_UTF8 = 1,
38 RS_KEY_ENCODING_ASCII_HEX = 2,
40 typedef unsigned int rs_key_encoding_t;
43 RS_PEER_TYPE_CLIENT = 1,
44 RS_PEER_TYPE_SERVER = 2
47 enum rs_conn_subtype {
48 RS_CONN_OBJTYPE_BASE = 1,
49 RS_CONN_OBJTYPE_GENERIC,
50 RS_CONN_OBJTYPE_LISTENER,
53 #if defined (__cplusplus)
57 struct rs_credentials {
58 enum rs_cred_type type;
61 enum rs_key_encoding secret_encoding;
69 /** Configuration object for a connection. */
71 enum rs_peer_type type;
72 struct rs_conn_base *connbase; /**< For error handling. */
73 struct rs_realm *realm;
76 char *secret; /* RADIUS secret. */
77 struct evutil_addrinfo *addr_cache;
82 struct rs_credentials *transport_cred;
86 /** Configuration object for a RADIUS realm. */
89 enum rs_conn_type type;
92 struct rs_listener *listeners;
93 struct rs_peer *peers;
94 struct rs_realm *next;
97 /** Top configuration object. */
99 struct rs_realm *realms;
103 /** Libradsec context. */
105 struct rs_config *config;
106 struct rs_alloc_scheme alloc_scheme;
107 struct rs_error *err;
108 struct event_base *evb; /* Event base. */
111 /** Base class for a connection. */
112 struct rs_conn_base {
113 uint32_t magic; /* Must be one of RS_CONN_MAGIC_*. */
114 struct rs_context *ctx;
115 struct rs_realm *realm; /* Owned by ctx. */
116 /** For a listener, allowed client addr/port pairs.
117 For an outgoing connection, set of servers.
118 For an incoming connection, the peer (as the only entry). */
119 struct rs_peer *peers; /**< Configured peers. */
120 struct rs_peer *active_peer; /**< The other end of the connection. */
121 struct timeval timeout;
122 int tryagain; /* For server failover. */
124 struct rs_error *err;
125 int fd; /* Socket. */
126 /* TCP transport specifics. */
127 struct bufferevent *bev; /* Buffer event. */
128 /* UDP transport specifics. */
129 struct event *wev; /* Write event (for UDP). */
130 struct event *rev; /* Read event (for UDP). */
135 RS_CONN_STATE_UNDEFINED = 0,
136 RS_CONN_STATE_CONNECTING,
137 RS_CONN_STATE_CONNECTED,
140 /** A "generic" connection. */
141 struct rs_connection {
142 struct rs_conn_base base_;
143 struct event *tev; /* Timeout event. */
144 struct rs_conn_callbacks callbacks;
145 enum rs_conn_state state;
147 char is_connecting; /* FIXME: replace with a single state member */
148 char is_connected; /* FIXME: replace with a single state member */
150 struct rs_message *out_queue; /* Queue for outgoing UDP packets. */
151 #if defined(RS_ENABLE_TLS)
158 /** A listening connection. Spawns generic connections when peers
161 struct rs_conn_base base_;
162 struct evconnlistener *evlistener;
163 struct rs_listener_callbacks callbacks;
164 struct rs_listener *next;
167 enum rs_message_flags {
168 RS_MESSAGE_HEADER_READ,
173 struct radius_packet;
176 struct rs_connection *conn;
178 uint8_t hdr[RS_HEADER_LEN];
179 struct radius_packet *rpkt; /* FreeRADIUS object. */
180 struct rs_message *next; /* Used for UDP output queue. */
183 #if defined (__cplusplus)
187 /***********************/
188 /* Convenience macros. */
190 /* Memory allocation. */
191 #define rs_calloc(h, nmemb, size) ((h)->alloc_scheme.calloc != NULL \
192 ? (h)->alloc_scheme.calloc : calloc)((nmemb), (size))
193 #define rs_malloc(h, size) ((h)->alloc_scheme.malloc != NULL \
194 ? (h)->alloc_scheme.malloc : malloc)((size))
195 #define rs_free(h, ptr) ((h)->alloc_scheme.free != NULL \
196 ? (h)->alloc_scheme.free : free)((ptr))
197 #define rs_realloc(h, ptr, size) ((h)->alloc_scheme.realloc != NULL \
198 ? (h)->alloc_scheme.realloc : realloc)((ptr), (size))
199 #define min(a, b) ((a) < (b) ? (a) : (b))
200 #define max(a, b) ((a) > (b) ? (a) : (b))
202 /* Basic CPP-based classes, proudly borrowed from Tor. */
203 #if defined(__GNUC__) && __GNUC__ > 3
204 #define STRUCT_OFFSET(tp, member) __builtin_offsetof(tp, member)
206 #define STRUCT_OFFSET(tp, member) \
207 ((off_t) (((char*)&((tp*)0)->member)-(char*)0))
209 #define SUBTYPE_P(p, subtype, basemember) \
210 ((void*) (((char*)(p)) - STRUCT_OFFSET(subtype, basemember)))
211 #define DOWNCAST(to, ptr) ((to*)SUBTYPE_P(ptr, to, base_))
212 #define TO_BASE_CONN(c) (&((c)->base_))
213 static struct rs_connection *TO_GENERIC_CONN (struct rs_conn_base *);
214 static struct rs_listener *TO_LISTENER_CONN (struct rs_conn_base *);
215 static INLINE struct rs_connection *TO_GENERIC_CONN (struct rs_conn_base *b)
217 assert (b->magic == RS_CONN_MAGIC_GENERIC);
218 return DOWNCAST (struct rs_connection, b);
220 static INLINE struct rs_listener *TO_LISTENER_CONN (struct rs_conn_base *b)
222 assert (b->magic == RS_CONN_MAGIC_LISTENER);
223 return DOWNCAST (struct rs_listener, b);
226 #endif /* _RADSEC_RADSEC_IMPL_H_ */
228 /* Local Variables: */
229 /* c-file-style: "stroustrup" */