diff options
author | Linus Nordberg <linus@nordu.net> | 2010-08-27 13:29:47 +0200 |
---|---|---|
committer | Linus Nordberg <linus@nordu.net> | 2010-08-27 13:29:47 +0200 |
commit | 9e57eb93599ce05eda992e288d42399e26a87efb (patch) | |
tree | 1fc59d23060c4cf623d0d31f22418ef1e503dccd /lib/libradsec.h | |
parent | 2eb56ca9aea02ae987f92a289c1ea6cd0173cc52 (diff) |
Add lib/libradsec.h.
First sketch of the API.
Diffstat (limited to 'lib/libradsec.h')
-rw-r--r-- | lib/libradsec.h | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/lib/libradsec.h b/lib/libradsec.h new file mode 100644 index 0000000..9783322 --- /dev/null +++ b/lib/libradsec.h @@ -0,0 +1,148 @@ +/*! \file libradsec.h + \brief Header file for libradsec. */ + +/* FIXME: License blurb goes here. */ + +#include <stdint.h> +#include <sys/socket.h> +#include "../list.h" + + +/* Data types. */ + +enum rs_cred_type { + RS_CRED_NONE = 0, + RS_CRED_TLS_PSK_RSA, /* RFC 4279. */ +}; + +struct rs_credentials { + enum rs_cred_type type; + char *identity; + char *secret; /* Passphrase or PSK. */ +}; + +enum rs_conn_type { + RS_CONN_TYPE_NONE = 0, + RS_CONN_TYPE_UDP, + RS_CONN_TYPE_TCP, + RS_CONN_TYPE_TLS, + RS_CONN_TYPE_DTLS, +}; +struct rs_conn { + enum rs_conn_type type; + struct rs_credentials transport_credentials; + struct sockaddr_storage addr; + char open_flag; +}; + +struct rs_attribute { + uint8_t type; + uint8_t lenght; + uint8_t *value; +}; + +struct rs_packet { + uint8_t code; + uint8_t id; + uint8_t auth[16]; + struct list *attrs; +}; + + +typedef void (*rs_conn_connected_cb)(void *user_data /* FIXME: peer? */); +typedef void (*rs_conn_disconnected_cb)(void *user_data /* FIXME: reason? */); +typedef void (*rs_conn_packet_received_cb)(const struct rs_packet *packet, + void *user_data); +typedef void (*rs_conn_packet_sent_cb)(void *user_data); + +/*! Connection callbacks. */ +struct rs_conn_callbacks { + /*! Callback invoked when the connection has been established. */ + rs_conn_connected_cb connected_cb; + /*! Callback invoked when the connection has been torn down. */ + rs_conn_disconnected_cb disconnected_cb; + /*! Callback invoked when a packet was received. */ + rs_conn_packet_received_cb received_cb; + /*! Callback invoked when a packet was successfully sent. */ + rs_conn_packet_sent_cb sent_cb; +}; + + +/* Function prototypes. */ + +/* + FIXME: Do we want alloc and free? Or perhaps init and free, + decoupling allocation from initialization? IMO we want _some_ init + function, f.ex. for setting open_flag = 1 when type == UDP. + +struct conn *conn_alloc (enum conn_type type, struct sockaddr_in6 address, ...); +void conn_free (struct conn *conn); +*/ + +/*! Open connection and return 0 on success. + \param conn Connection object, obtained through a call to \a + conn_alloc. + \param cb Callbacks for events on the connection. If NULL, all I/O + will be blocking. + \param user_data A pointer passed to the callbacks when invoked. */ +int rs_conn_open(struct rs_conn *conn, + const struct rs_conn_callbacks *cb, + void *user_data); + +/*! Close connection and return 0 on success. + \param conn Connection object, obtained through a call to \a + conn_alloc. + \param user_data A pointer passed to the callbacks when the \a + disconnected_cb in \a conn is invoked. */ +int rs_conn_close(struct rs_conn *conn, void *user_data); /* FIXME: return type? */ + +/*! Allocate a packet object. Should be freed using \a rs_packet_free. */ +struct rs_packet *rs_packet_alloc(); + +/*! Free a packet object previously allocated with \a rs_packet_alloc. */ +void rs_packet_free(); + +/*! Add an attribute to a packet. + \param packet The packet. + \param attribute Attribute to add to packet. */ +int rs_packet_add_attribute(struct rs_packet *packet, + const struct rs_attribute *attribute); + +/*! Send \a packet on \a conn and return 0 on success. + \param conn Connection object, obtained through a call to \a + conn_alloc and opened with \a rs_conn_open. + \param packet Packet to send. + \param user_data Pointer passed to \a rs_conn_packet_sent_cb, invoked + when packet has been sent. + */ +int rs_packet_send(const struct rs_conn *conn, + const struct rs_packet *packet, + void *user_data); + +/*! Return the next packet received on \a conn, blocking while waiting. + The packet returned must be freed using \a rs_packet_free. */ +struct rs_packet *rs_packet_receive(const struct rs_conn *conn); + + +/* Thinking out loud here... + + We could let the user drive the underlying libevent event loop in + three different ways, from easiest to hairiest: + + i) Blocking i/o model: User passes NULL for the callbacks in + rc_conn_open() and the open, send and receive calls will block + until the wanted event occurs. Other events occurring while + waiting will be either silently discarded or signaled as an error + (f.ex. broken connection while sending). + + ii) Simple interface with a timeout: User calls + rs_event_loop(timeout) to process pending i/o. + + iii) full libevent interface: TODO. + */ +#error "need an rs_event_loop() and more" + + +/* Local Variables: */ +/* c-file-style: "stroustrup" */ +/* End: */ |