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
--- /dev/null
+#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;
+}
--- /dev/null
+#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_ */
--- /dev/null
+#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]);
+}
--- /dev/null
+#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_ */