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