From 09b68e6c13b16843dc3bec65db61a27c27675847 Mon Sep 17 00:00:00 2001 From: pcarana Date: Fri, 10 May 2019 17:44:20 -0500 Subject: [PATCH] Simplify PDUs sender. -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 | 73 +++++++--------------------------------- src/rtr/pdu_serializer.c | 13 ------- src/rtr/pdu_serializer.h | 13 +------ 3 files changed, 14 insertions(+), 85 deletions(-) diff --git a/src/rtr/pdu_sender.c b/src/rtr/pdu_sender.c index 26cb6285..9b1fb2ca 100644 --- a/src/rtr/pdu_sender.c +++ b/src/rtr/pdu_sender.c @@ -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, diff --git a/src/rtr/pdu_serializer.c b/src/rtr/pdu_serializer.c index fbb74b20..1cc6868b 100644 --- a/src/rtr/pdu_serializer.c +++ b/src/rtr/pdu_serializer.c @@ -4,19 +4,6 @@ #include #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) diff --git a/src/rtr/pdu_serializer.h b/src/rtr/pdu_serializer.h index 4889f7f2..45f1107a 100644 --- a/src/rtr/pdu_serializer.h +++ b/src/rtr/pdu_serializer.h @@ -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 *); -- 2.47.3