]> git.ipfire.org Git - thirdparty/FORT-validator.git/commitdiff
Add PDUs serializer and a common buffer writer
authorpcarana <pc.moreno2099@gmail.com>
Wed, 20 Feb 2019 23:33:34 +0000 (17:33 -0600)
committerpcarana <pc.moreno2099@gmail.com>
Wed, 20 Feb 2019 23:33:34 +0000 (17:33 -0600)
src/Makefile.am
src/rtr/pdu_serializer.c [new file with mode: 0644]
src/rtr/pdu_serializer.h [new file with mode: 0644]
src/rtr/primitive_writer.c [new file with mode: 0644]
src/rtr/primitive_writer.h [new file with mode: 0644]

index fcb7d29c597818b987794dede8f97ede0d262e7a..feba0bc6b5ae012a58096044c89aa890619722dc 100644 (file)
@@ -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 (file)
index 0000000..a580834
--- /dev/null
@@ -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 (file)
index 0000000..ef449c4
--- /dev/null
@@ -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 (file)
index 0000000..31c8490
--- /dev/null
@@ -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 (file)
index 0000000..7a12251
--- /dev/null
@@ -0,0 +1,14 @@
+#ifndef RTR_PRIMITIVE_WRITER_H_
+#define RTR_PRIMITIVE_WRITER_H_
+
+#include <netinet/ip.h>
+
+__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_ */