From: pcarana Date: Wed, 20 Feb 2019 23:33:34 +0000 (-0600) Subject: Add PDUs serializer and a common buffer writer X-Git-Tag: v0.0.2~52^2~64 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4525a92a42785cbb40b6b44bb272b00c2f379065;p=thirdparty%2FFORT-validator.git Add PDUs serializer and a common buffer writer --- diff --git a/src/Makefile.am b/src/Makefile.am index fcb7d29c..feba0bc6 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -13,8 +13,10 @@ rtr_server_SOURCES += line_file.c line_file.h rtr_server_SOURCES += vrps.c vrps.h rtr_server_SOURCES += rtr/pdu_handler.c rtr/pdu_handler.h +rtr_server_SOURCES += rtr/pdu_serializer.c rtr/pdu_serializer.h rtr_server_SOURCES += rtr/pdu.c rtr/pdu.h rtr_server_SOURCES += rtr/primitive_reader.c rtr/primitive_reader.h +rtr_server_SOURCES += rtr/primitive_writer.c rtr/primitive_writer.h rtr_server_SOURCES += rtr/rtr.c rtr/rtr.h rtr_server_LDADD = ${JANSSON_LIBS} \ No newline at end of file diff --git a/src/rtr/pdu_serializer.c b/src/rtr/pdu_serializer.c new file mode 100644 index 00000000..a5808342 --- /dev/null +++ b/src/rtr/pdu_serializer.c @@ -0,0 +1,78 @@ +#include "pdu_serializer.h" + +#include "primitive_writer.h" + +static size_t +serialize_pdu_header(struct pdu_header *header, u_int16_t union_value, + char *buf) +{ + char *ptr; + + ptr = buf; + ptr = write_int8(ptr, header->protocol_version); + ptr = write_int8(ptr, header->pdu_type); + ptr = write_int16(ptr, union_value); + ptr = write_int32(ptr, header->length); + return ptr - buf; +} + +size_t +serialize_serial_notify_pdu(struct serial_notify_pdu *pdu, char *buf) +{ + // FIXME Complete me! + return 0; +} + +size_t +serialize_cache_response_pdu(struct cache_response_pdu *pdu, char *buf) +{ + /* No payload to serialize */ + return serialize_pdu_header(&pdu->header, pdu->header.session_id, buf); +} + +size_t +serialize_ipv4_prefix_pdu(struct ipv4_prefix_pdu *pdu, char *buf) +{ + // FIXME Complete me! + return 0; +} + +size_t +serialize_ipv6_prefix_pdu(struct ipv6_prefix_pdu *pdu, char *buf) +{ + // FIXME Complete me! + return 0; +} + +size_t +serialize_end_of_data_pdu(struct end_of_data_pdu *pdu, char *buf) +{ + size_t head_size; + char *ptr; + + head_size = serialize_pdu_header(&pdu->header, pdu->header.session_id, buf); + + ptr = buf + head_size; + ptr = write_int32(ptr, pdu->serial_number); + if (pdu->header.protocol_version == RTR_V1) { + ptr = write_int32(ptr, pdu->refresh_interval); + ptr = write_int32(ptr, pdu->retry_interval); + ptr = write_int32(ptr, pdu->expire_interval); + } + + return ptr - buf; +} + +size_t +serialize_cache_reset_pdu(struct cache_reset_pdu *pdu, char *buf) +{ + // FIXME Complete me! + return 0; +} + +size_t +serialize_error_report_pdu(struct error_report_pdu *pdu, char *buf) +{ + // FIXME Complete me! + return 0; +} diff --git a/src/rtr/pdu_serializer.h b/src/rtr/pdu_serializer.h new file mode 100644 index 00000000..ef449c40 --- /dev/null +++ b/src/rtr/pdu_serializer.h @@ -0,0 +1,16 @@ +#ifndef SRC_RTR_PDU_SERIALIZER_H_ +#define SRC_RTR_PDU_SERIALIZER_H_ + +#include "pdu.h" + +__BEGIN_DECLS +size_t serialize_serial_notify_pdu(struct serial_notify_pdu *, char *); +size_t serialize_cache_response_pdu(struct cache_response_pdu *, char *); +size_t serialize_ipv4_prefix_pdu(struct ipv4_prefix_pdu *, char *); +size_t serialize_ipv6_prefix_pdu(struct ipv6_prefix_pdu *, char *); +size_t serialize_end_of_data_pdu(struct end_of_data_pdu *, char *); +size_t serialize_cache_reset_pdu(struct cache_reset_pdu *, char *); +size_t serialize_error_report_pdu(struct error_report_pdu *, char *); +__END_DECLS + +#endif /* SRC_RTR_PDU_SERIALIZER_H_ */ diff --git a/src/rtr/primitive_writer.c b/src/rtr/primitive_writer.c new file mode 100644 index 00000000..31c8490c --- /dev/null +++ b/src/rtr/primitive_writer.c @@ -0,0 +1,43 @@ +#include "primitive_writer.h" + +char * +write_int8(char *buf, u_int8_t value) +{ + buf[0] = value; + return buf + 1; +} + +/** Big Endian. */ +char * +write_int16(char *buf, u_int16_t value) +{ + buf[0] = value >> 8; + buf[1] = value; + return buf + 2; +} + +/** Big Endian. */ +char * +write_int32(char *buf, u_int32_t value) +{ + buf[0] = value >> 24; + buf[1] = value >> 16; + buf[2] = value >> 8; + buf[3] = value; + return buf + 4; +} + +char * +write_in_addr(char *buf, struct in_addr value) +{ + return write_int32(buf, value.s_addr); +} + +char * +write_in6_addr(char *buf, struct in6_addr value) +{ + buf = write_int32(buf, value.s6_addr32[0]); + buf = write_int32(buf, value.s6_addr32[1]); + buf = write_int32(buf, value.s6_addr32[2]); + return write_int32(buf, value.s6_addr32[3]); +} diff --git a/src/rtr/primitive_writer.h b/src/rtr/primitive_writer.h new file mode 100644 index 00000000..7a12251f --- /dev/null +++ b/src/rtr/primitive_writer.h @@ -0,0 +1,14 @@ +#ifndef RTR_PRIMITIVE_WRITER_H_ +#define RTR_PRIMITIVE_WRITER_H_ + +#include + +__BEGIN_DECLS +char * write_int8(char *, u_int8_t); +char * write_int16(char *, u_int16_t); +char * write_int32(char *, u_int32_t); +char * write_in_addr(char *, struct in_addr); +char * write_in6_addr(char *, struct in6_addr); +__END_DECLS + +#endif /* RTR_PRIMITIVE_WRITER_H_ */