]> git.ipfire.org Git - thirdparty/FORT-validator.git/commitdiff
Simplify PDUs sender.
authorpcarana <pc.moreno2099@gmail.com>
Fri, 10 May 2019 22:44:20 +0000 (17:44 -0500)
committerpcarana <pc.moreno2099@gmail.com>
Fri, 10 May 2019 22:44:20 +0000 (17:44 -0500)
-Remove data_buffer struct since isn't really needed.
-Move BUFFER_SIZE (now MAX_BUFFER_SIZE) to pdu_serializer, and increment to 1024.
-The static sender function (send_response) just sends whatever data it receives, since every other PDU sender function and the serializer are responsible to set the data length to the exact size of the data that'll be sent.

src/rtr/pdu_sender.c
src/rtr/pdu_serializer.c
src/rtr/pdu_serializer.h

index 26cb6285607a21b6f9e58f0171cb8e30e656a872..9b1fb2cacbf55d1009cb512b8856a54675743f96 100644 (file)
@@ -19,6 +19,8 @@
 #define IPV4_PREFIX_LENGTH     12
 #define IPV6_PREFIX_LENGTH     24
 
+/* Max buffer size to serialize PDUs (maybe the largest are error PDUs) */
+#define MAX_BUFFER_SIZE                1024
 
 struct vrp_node {
        struct vrp vrp;
@@ -97,73 +99,24 @@ length_error_report_pdu(struct error_report_pdu *pdu)
            pdu->error_message_length + sizeof(pdu->error_message_length);
 }
 
-/*
- * TODO Needs some testing, this is just a beta version
- */
-static int
-send_large_response(int fd, struct data_buffer *buffer)
-{
-       unsigned char *tmp_buffer, *ptr;
-       size_t buf_size, pending;
-       int written;
-
-       buf_size = buffer->capacity;
-       pending = buffer->len;
-       ptr = buffer->data;
-       while (pending > 0) {
-               tmp_buffer = calloc(pending, sizeof(unsigned char));
-               if (tmp_buffer == NULL)
-                       return pr_enomem();
-
-               memcpy(tmp_buffer, ptr, buf_size);
-
-               written = write(fd, tmp_buffer, buf_size);
-               free(tmp_buffer);
-               if (written < 0)
-                       return pr_err("Error sending response");
-
-               pending -= buf_size;
-               ptr += buf_size;
-               buf_size = pending > buffer->capacity ? buffer->capacity :
-                   pending;
-       }
-
-       return 0;
-}
-
 static int
 send_response(int fd, unsigned char *data, size_t data_len)
 {
-       struct data_buffer buffer;
        int error;
 
-       init_buffer(&buffer);
-       memcpy(buffer.data, data, data_len);
-       buffer.len = data_len;
-
-       /* Check for buffer overflow */
-       if (data_len <= buffer.capacity) {
-               error = write(fd, buffer.data, buffer.len);
-               free_buffer(&buffer);
-               if (error < 0)
-                       return pr_err("Error sending response");
-
-               return 0;
-       }
-
-       error = send_large_response(fd, &buffer);
-       free_buffer(&buffer);
-       if (error)
-               return error;
+       error = write(fd, data, data_len);
+       if (error < 0)
+               return pr_errno(errno, "Error sending response");
 
        return 0;
 }
 
+
 int
 send_serial_notify_pdu(struct sender_common *common)
 {
        struct serial_notify_pdu pdu;
-       unsigned char data[BUFFER_SIZE];
+       unsigned char data[MAX_BUFFER_SIZE];
        size_t len;
 
        set_header_values(&pdu.header, common->version, PDU_TYPE_SERIAL_NOTIFY,
@@ -181,7 +134,7 @@ int
 send_cache_reset_pdu(struct sender_common *common)
 {
        struct cache_reset_pdu pdu;
-       unsigned char data[BUFFER_SIZE];
+       unsigned char data[MAX_BUFFER_SIZE];
        size_t len;
 
        /* This PDU has only the header */
@@ -197,7 +150,7 @@ int
 send_cache_response_pdu(struct sender_common *common)
 {
        struct cache_response_pdu pdu;
-       unsigned char data[BUFFER_SIZE];
+       unsigned char data[MAX_BUFFER_SIZE];
        size_t len;
 
        /* This PDU has only the header */
@@ -214,7 +167,7 @@ static int
 send_ipv4_prefix_pdu(struct sender_common *common, struct vrp *vrp)
 {
        struct ipv4_prefix_pdu pdu;
-       unsigned char data[BUFFER_SIZE];
+       unsigned char data[MAX_BUFFER_SIZE];
        size_t len;
 
        set_header_values(&pdu.header, common->version, PDU_TYPE_IPV4_PREFIX,
@@ -237,7 +190,7 @@ static int
 send_ipv6_prefix_pdu(struct sender_common *common, struct vrp *vrp)
 {
        struct ipv6_prefix_pdu pdu;
-       unsigned char data[BUFFER_SIZE];
+       unsigned char data[MAX_BUFFER_SIZE];
        size_t len;
 
        set_header_values(&pdu.header, common->version, PDU_TYPE_IPV6_PREFIX,
@@ -354,7 +307,7 @@ int
 send_end_of_data_pdu(struct sender_common *common)
 {
        struct end_of_data_pdu pdu;
-       unsigned char data[BUFFER_SIZE];
+       unsigned char data[MAX_BUFFER_SIZE];
        size_t len;
        int error;
 
@@ -383,7 +336,7 @@ send_error_report_pdu(int fd, uint8_t version, uint16_t code,
 struct pdu_header *err_pdu_header, char const *message)
 {
        struct error_report_pdu pdu;
-       unsigned char data[BUFFER_SIZE];
+       unsigned char data[MAX_BUFFER_SIZE];
        size_t len;
 
        set_header_values(&pdu.header, version, PDU_TYPE_ERROR_REPORT,
index fbb74b206cd98d9f93445f8b316721420c9149e0..1cc6868b0c1a34a8f5805d544b2eadeb163c6a5f 100644 (file)
@@ -4,19 +4,6 @@
 #include <string.h>
 #include "primitive_writer.h"
 
-void
-init_buffer(struct data_buffer *buffer)
-{
-       buffer->capacity = BUFFER_SIZE;
-       buffer->data = malloc(BUFFER_SIZE);
-}
-
-void
-free_buffer(struct data_buffer *buffer)
-{
-       free(buffer->data);
-}
-
 static size_t
 serialize_pdu_header(struct pdu_header *header, uint16_t union_value,
     unsigned char *buf)
index 4889f7f2eb3c68e640c6a4dde127c65ed18eb19d..45f1107a272f823b48f6586c97cb3a4bcbaec0c9 100644 (file)
@@ -1,18 +1,7 @@
 #ifndef SRC_RTR_PDU_SERIALIZER_H_
 #define SRC_RTR_PDU_SERIALIZER_H_
 
-#include "pdu.h"
-
-#define BUFFER_SIZE    512
-
-struct data_buffer {
-       size_t len;
-       size_t capacity;
-       unsigned char *data;
-};
-
-void init_buffer(struct data_buffer *);
-void free_buffer(struct data_buffer *);
+#include "rtr/pdu.h"
 
 size_t serialize_serial_notify_pdu(struct serial_notify_pdu *,
     unsigned char *);