939cdd94c798550ee4b9a89179c0808473e77619
[radsecproxy.git] / lib / libradsec-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
9 /* Constants.  */
10 #define RS_HEADER_LEN 4
11
12 /* Data types.  */
13 enum rs_cred_type {
14     RS_CRED_NONE = 0,
15     RS_CRED_TLS_PSK_RSA,        /* RFC 4279.  */
16 };
17 typedef unsigned int rs_cred_type_t;
18
19 struct rs_packet;
20
21 struct rs_credentials {
22     enum rs_cred_type type;
23     char *identity;
24     char *secret;
25 };
26
27 struct rs_error {
28     int code;
29     char *msg;
30     char buf[1024];
31 };
32
33 typedef void * (*rs_calloc_fp)(size_t nmemb, size_t size);
34 typedef void * (*rs_malloc_fp)(size_t size);
35 typedef void (*rs_free_fp)(void *ptr);
36 typedef void * (*rs_realloc_fp)(void *ptr, size_t size);
37 struct rs_alloc_scheme {
38     rs_calloc_fp calloc;
39     rs_malloc_fp malloc;
40     rs_free_fp free;
41     rs_realloc_fp realloc;
42 };
43
44 typedef void (*rs_conn_connected_cb)(void *user_data /* FIXME: peer? */);
45 typedef void (*rs_conn_disconnected_cb)(void *user_data /* FIXME: reason? */);
46 typedef void (*rs_conn_packet_received_cb)(const struct rs_packet *packet,
47                                            void *user_data);
48 typedef void (*rs_conn_packet_sent_cb)(void *user_data);
49
50 /** Connection callbacks.  */
51 struct rs_conn_callbacks {
52     /** Callback invoked when the connection has been established.  */
53     rs_conn_connected_cb connected_cb;
54     /** Callback invoked when the connection has been torn down.  */
55     rs_conn_disconnected_cb disconnected_cb;
56     /** Callback invoked when a packet was received.  */
57     rs_conn_packet_received_cb received_cb;
58     /** Callback invoked when a packet was successfully sent.  */
59     rs_conn_packet_sent_cb sent_cb;
60 };
61
62 struct rs_handle {
63     struct rs_alloc_scheme alloc_scheme;
64     struct rs_error *err;
65     fr_randctx fr_randctx;
66
67     /* TODO: dictionary? */
68 };
69
70 struct rs_peer {
71     struct rs_connection *conn;
72     struct evutil_addrinfo *addr;
73     int s;                      /* Socket.  */
74     char *secret;
75     int timeout;                /* client only */
76     int tries;                  /* client only */
77     struct rs_peer *next;
78 };
79
80 struct rs_connection {
81     struct rs_handle *ctx;
82     enum rs_conn_type type;
83     struct rs_credentials transport_credentials;
84     struct rs_conn_callbacks callbacks;
85     struct rs_peer *peers;
86     struct rs_peer *active_peer;
87     struct rs_error *err;
88 };
89
90 struct rs_packet {
91     struct rs_connection *conn;
92     RADIUS_PACKET *rpkt;
93 };
94
95 struct rs_attr {
96     struct rs_packet *pkt;
97     VALUE_PAIR *vp;
98 };
99
100 /* Internal functions.  */
101 int rs_conn_open(struct rs_connection *conn);
102
103 /* Convenience macros.  */
104 #define rs_calloc(h, nmemb, size) \
105     (h->alloc_scheme.calloc ? h->alloc_scheme.calloc : calloc)(nmemb, size)
106 #define rs_malloc(h, size) \
107     (h->alloc_scheme.malloc ? h->alloc_scheme.malloc : malloc)(size)
108 #define rs_free(h, ptr) \
109     (h->alloc_scheme.free ? h->alloc_scheme.free : free)(ptr)
110 #define rs_realloc(h, realloc, ptr, size) \
111     (h->alloc_scheme.realloc ? h->alloc_scheme.realloc : realloc)(ptr, size)
112
113 /* Local Variables: */
114 /* c-file-style: "stroustrup" */
115 /* End: */