]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
add "written" argument to app_io->write
authorAlan T. DeKok <aland@freeradius.org>
Sun, 3 Jun 2018 17:30:31 +0000 (13:30 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Sun, 3 Jun 2018 17:32:31 +0000 (13:32 -0400)
so that we can do partial writes in the network code, instead of
relying on every application to re-implement it

src/lib/io/io.h
src/lib/io/master.c
src/lib/io/network.c
src/modules/proto_control/proto_control_tcp.c
src/modules/proto_detail/proto_detail_file.c
src/modules/proto_detail/proto_detail_work.c
src/modules/proto_dhcpv4/proto_dhcpv4_udp.c
src/modules/proto_radius/proto_radius_tcp.c
src/modules/proto_radius/proto_radius_udp.c
src/modules/proto_vmps/proto_vmps_udp.c
src/tests/util/radius_schedule_test.c

index 8a1141f351adee5dd23cf4f401e5b43c11cc2b26..bfdd2fd139a46dafdf166da0f1e0ffd09285f751 100644 (file)
@@ -211,21 +211,27 @@ typedef ssize_t (*fr_io_data_read_t)(void *instance, void **packet_ctx, fr_time_
  *  write packets to the transport context.  The data may or may not
  *  go out to the network right away.
  *
- *  If the writer returns LESS THAN buffer_len, that's a special case
- *  saying "I took saved the data, but the socket wasn't ready, so you
- *  need to call me again at a later point".
+ *  If the write function does a partial write, it should return a
+ *  value smaller than buffer_len to indicate this.  The network
+ *  functions will then pass that value to a subsequent write call, in
+ *  the "written" argument.
+ *
+ *  The reason for this odd API is that read/write should be writing
+ *  *packets*, not raw streams of bytes.  This API allows the "buffer"
+ *  parameter to always contain a full packet.
  *
  * @param[in] instance         the context for this function
  * @param[in] packet_ctx       Request specific data.
  * @param[in] request_time     when the original request was received
  * @param[in] buffer           the buffer where the raw packet will be written from
  * @param[in] buffer_len       the length of the buffer
+ * @param[in] written          total number of bytes written in previous calls for this packet.
  * @return
  *     - <0 on error
  *     - >=0 length of the data read or written.
  */
 typedef ssize_t (*fr_io_data_write_t)(void *instance, void *packet_ctx, fr_time_t request_time,
-                                     uint8_t *buffer, size_t buffer_len);
+                                     uint8_t *buffer, size_t buffer_len, size_t written);
 
 /** Inject data into a socket.
  *
index 724a3f97e6134312c6b8b70f37189157c5edb722..89764fb5745ba72caedbcda2eb8db20169754b6f 100644 (file)
@@ -1807,8 +1807,8 @@ static void packet_expiry_timer(fr_event_list_t *el, struct timeval *now, void *
        }
 }
 
-static ssize_t mod_write(void *instance, void *packet_ctx,
-                        fr_time_t request_time, uint8_t *buffer, size_t buffer_len)
+static ssize_t mod_write(void *instance, void *packet_ctx, fr_time_t request_time,
+                        uint8_t *buffer, size_t buffer_len, size_t written)
 {
        fr_io_instance_t *inst;
        fr_io_connection_t *connection;
@@ -1871,7 +1871,7 @@ static ssize_t mod_write(void *instance, void *packet_ctx,
                 */
 
                packet_len = inst->app_io->write(app_io_instance, track, request_time,
-                                                buffer, buffer_len);
+                                                buffer, buffer_len, written);
                if (packet_len > 0) {
                        rad_assert(buffer_len == (size_t) packet_len);
                        MEM(track->reply = talloc_memdup(track, buffer, buffer_len));
index 83569a555727ab61aefe47e4499f195306e85515..b955749b38742fb088667a0a725be519523f6f47 100644 (file)
@@ -600,7 +600,8 @@ static void fr_network_write(UNUSED fr_event_list_t *el, UNUSED int sockfd, UNUS
                rad_assert(listen == cd->listen);
 
                rcode = listen->app_io->write(listen->app_io_instance, cd->packet_ctx,
-                                             cd->reply.request_time, cd->m.data, cd->m.data_size);
+                                             cd->reply.request_time,
+                                             cd->m.data, cd->m.data_size, 0);
                if (rcode < 0) {
 
                        /*
@@ -1198,7 +1199,8 @@ static void fr_network_post_event(UNUSED fr_event_list_t *el, UNUSED struct time
                 *      that NAKs are not written to the network.
                 */
                rcode = listen->app_io->write(listen->app_io_instance, cd->packet_ctx,
-                                             cd->reply.request_time, cd->m.data, cd->m.data_size);
+                                             cd->reply.request_time,
+                                             cd->m.data, cd->m.data_size, 0);
                if (rcode < 0) {
                        if (errno == EWOULDBLOCK) {
                                if (fr_event_fd_insert(nr, nr->el, s->fd,
index 73e3e2001b9916eabfcbb63ff1951816ed0dd8c5..9fc157b9dfa9f93c047bb7988d90c0aac8ff869f 100644 (file)
@@ -149,8 +149,8 @@ static ssize_t mod_read(void *instance, UNUSED void **packet_ctx, fr_time_t **re
 }
 
 
-static ssize_t mod_write(void *instance, void *packet_ctx,
-                        UNUSED fr_time_t request_time, uint8_t *buffer, size_t buffer_len)
+static ssize_t mod_write(void *instance, void *packet_ctx, UNUSED fr_time_t request_time,
+                        uint8_t *buffer, size_t buffer_len, UNUSED size_t written)
 {
        proto_control_tcp_t             *inst = talloc_get_type_abort(instance, proto_control_tcp_t);
        fr_io_track_t                   *track = talloc_get_type_abort(packet_ctx, fr_io_track_t);
index 2767f1b0d3badf46293da6b769be9788f02ffc2b..616d949e2ec297cec49fdb457150c92a4680819c 100644 (file)
@@ -83,12 +83,12 @@ static int mod_decode(void const *instance, REQUEST *request, uint8_t *const dat
        return inst->parent->work_io->decode(inst->parent->work_io_instance, request, data, data_len);
 }
 
-static ssize_t mod_write(void *instance, void *packet_ctx,
-                        fr_time_t request_time, uint8_t *buffer, size_t buffer_len)
+static ssize_t mod_write(void *instance, void *packet_ctx, fr_time_t request_time,
+                        uint8_t *buffer, size_t buffer_len, size_t written)
 {
        proto_detail_file_t const       *inst = talloc_get_type_abort_const(instance, proto_detail_file_t);
 
-       return inst->parent->work_io->write(inst->parent->work_io_instance, packet_ctx, request_time, buffer, buffer_len);
+       return inst->parent->work_io->write(inst->parent->work_io_instance, packet_ctx, request_time, buffer, buffer_len, written);
 }
 
 static void mod_vnode_extend(void *instance, UNUSED uint32_t fflags)
index cef502e36ca14896b367a520b5f9509c1d1cf810..043699d8bdf01a9cb8871a970053d930321f9d58 100644 (file)
@@ -556,8 +556,8 @@ static void work_retransmit(UNUSED fr_event_list_t *el, UNUSED struct timeval *n
 #endif
 }
 
-static ssize_t mod_write(void *instance, void *packet_ctx,
-                        fr_time_t request_time, uint8_t *buffer, size_t buffer_len)
+static ssize_t mod_write(void *instance, void *packet_ctx, fr_time_t request_time,
+                        uint8_t *buffer, size_t buffer_len, UNUSED size_t written)
 {
        proto_detail_work_t             *inst = talloc_get_type_abort(instance, proto_detail_work_t);
        fr_detail_entry_t               *track = packet_ctx;
index 0255fcb200ce97e272dd8cf05d0016a35a555193..b70c66e88a8bf381366c94c4910c84eb1b8bef2c 100644 (file)
@@ -211,8 +211,8 @@ static ssize_t mod_read(void *instance, void **packet_ctx, fr_time_t **recv_time
 }
 
 
-static ssize_t mod_write(void *instance, void *packet_ctx,
-                        UNUSED fr_time_t request_time, uint8_t *buffer, size_t buffer_len)
+static ssize_t mod_write(void *instance, void *packet_ctx, UNUSED fr_time_t request_time,
+                        uint8_t *buffer, size_t buffer_len, UNUSED size_t written)
 {
        proto_dhcpv4_udp_t              *inst = talloc_get_type_abort(instance, proto_dhcpv4_udp_t);
        fr_io_track_t                   *track = talloc_get_type_abort(packet_ctx, fr_io_track_t);
index cc82b9bd21433ba6de24e76b5f220bbc9627063e..133e24ff28cff53135f88043a7d63addadd5c49e 100644 (file)
@@ -203,8 +203,8 @@ static ssize_t mod_read(void *instance, UNUSED void **packet_ctx, fr_time_t **re
 }
 
 
-static ssize_t mod_write(void *instance, void *packet_ctx,
-                        UNUSED fr_time_t request_time, uint8_t *buffer, size_t buffer_len)
+static ssize_t mod_write(void *instance, void *packet_ctx, UNUSED fr_time_t request_time,
+                        uint8_t *buffer, size_t buffer_len, UNUSED size_t written)
 {
        proto_radius_tcp_t              *inst = talloc_get_type_abort(instance, proto_radius_tcp_t);
        fr_io_track_t                   *track = talloc_get_type_abort(packet_ctx, fr_io_track_t);
index fc0420f21105a769cdf2b5ef6950ed2782e5ad60..c2b9ce3faba1eeb9c096289840d968f5da4f7bd6 100644 (file)
@@ -193,8 +193,8 @@ static ssize_t mod_read(void *instance, void **packet_ctx, fr_time_t **recv_time
 }
 
 
-static ssize_t mod_write(void *instance, void *packet_ctx,
-                        UNUSED fr_time_t request_time, uint8_t *buffer, size_t buffer_len)
+static ssize_t mod_write(void *instance, void *packet_ctx, UNUSED fr_time_t request_time,
+                        uint8_t *buffer, size_t buffer_len, UNUSED size_t written)
 {
        proto_radius_udp_t              *inst = talloc_get_type_abort(instance, proto_radius_udp_t);
        fr_io_track_t                   *track = talloc_get_type_abort(packet_ctx, fr_io_track_t);
index 97dc6c6596b95e47ea00d09ec158dd286d62264a..5f9eda4f33765ec5f7b706b3ad09aa2c4d84cc05 100644 (file)
@@ -196,8 +196,8 @@ static ssize_t mod_read(void *instance, void **packet_ctx, fr_time_t **recv_time
 }
 
 
-static ssize_t mod_write(void *instance, void *packet_ctx,
-                        UNUSED fr_time_t request_time, uint8_t *buffer, size_t buffer_len)
+static ssize_t mod_write(void *instance, void *packet_ctx, UNUSED fr_time_t request_time,
+                        uint8_t *buffer, size_t buffer_len, UNUSED size_t written)
 {
        proto_vmps_udp_t                *inst = talloc_get_type_abort(instance, proto_vmps_udp_t);
        fr_io_track_t                   *track = talloc_get_type_abort(packet_ctx, fr_io_track_t);
index 416dad6630ab64b0bb3768f1a5cbbfa44bc7ff5b..0aa090c0add3eed91aa59e9b24cda30ab305e211 100644 (file)
@@ -159,7 +159,7 @@ static ssize_t test_read(void *ctx, UNUSED void **packet_ctx, fr_time_t **recv_t
 
 
 static ssize_t test_write(void *ctx, UNUSED void *packet_ctx,  UNUSED fr_time_t request_time,
-                         uint8_t *buffer, size_t buffer_len)
+                         uint8_t *buffer, size_t buffer_len, UNUSED size_t written)
 {
        ssize_t                 data_size;
        fr_listen_test_t        *io_ctx = talloc_get_type_abort(ctx, fr_listen_test_t);