rtr_server_SOURCES += updates_daemon.c updates_daemon.h
rtr_server_SOURCES += vrps.c vrps.h
+rtr_server_SOURCES += rtr/err_pdu.c rtr/err_pdu.h
rtr_server_SOURCES += rtr/pdu_handler.c rtr/pdu_handler.h
rtr_server_SOURCES += rtr/pdu_sender.c rtr/pdu_sender.h
rtr_server_SOURCES += rtr/pdu_serializer.c rtr/pdu_serializer.h
--- /dev/null
+#include "err_pdu.h"
+
+#include <err.h>
+#include <unistd.h>
+#include "pdu_sender.h"
+
+int err_pdu_send(int fd, u_int8_t version, u_int16_t code,
+ void *err_pdu_header, char *message)
+{
+ int error;
+
+ error = send_error_report_pdu(fd, version, code, err_pdu_header, message);
+ if (err_pdu_is_fatal(code)) {
+ warnx("Fatal error report PDU sent, closing socket.");
+ close(fd);
+ }
+
+ return error;
+}
+
+bool
+err_pdu_is_fatal(u_int16_t code)
+{
+ /* Only NO_DATA_AVAILABLE error isn't fatal */
+ return code != ERR_PDU_NO_DATA_AVAILABLE;
+}
+
+void
+err_pdu_log(u_int16_t code, char *message)
+{
+ char *code_title;
+
+ switch (code) {
+ case ERR_PDU_CORRUPT_DATA:
+ code_title = "Corrupt Data";
+ break;
+ case ERR_PDU_INTERNAL_ERROR:
+ code_title = "Internal Error";
+ break;
+ case ERR_PDU_NO_DATA_AVAILABLE:
+ code_title = "No Data Available";
+ break;
+ case ERR_PDU_INVALID_REQUEST:
+ code_title = "Invalid Request";
+ break;
+ case ERR_PDU_UNSUP_PROTO_VERSION:
+ code_title = "Unsupported Protocol Version";
+ break;
+ case ERR_PDU_UNSUP_PDU_TYPE:
+ code_title = "Unsupported PDU Type";
+ break;
+ case ERR_PDU_WITHDRAWAL_UNKNOWN:
+ code_title = "Withdrawal of Unknown Record";
+ break;
+ case ERR_PDU_DUPLICATE_ANNOUNCE:
+ code_title = "Duplicate Announcement Received";
+ break;
+ case ERR_PDU_UNEXPECTED_PROTO_VERSION:
+ code_title = "Unexpected Protocol Version";
+ break;
+ default:
+ code_title = "Unknown error code";
+ break;
+ }
+
+ warnx("Error report info: '%s', message '%s'.",
+ code_title, message == NULL ? "[empty]" : message);
+}
--- /dev/null
+#ifndef SRC_RTR_ERR_PDU_H_
+#define SRC_RTR_ERR_PDU_H_
+
+#include <stdbool.h>
+#include <sys/types.h>
+
+#define ERR_PDU_CORRUPT_DATA 0
+#define ERR_PDU_INTERNAL_ERROR 1
+#define ERR_PDU_NO_DATA_AVAILABLE 2
+#define ERR_PDU_INVALID_REQUEST 3
+#define ERR_PDU_UNSUP_PROTO_VERSION 4
+#define ERR_PDU_UNSUP_PDU_TYPE 5
+#define ERR_PDU_WITHDRAWAL_UNKNOWN 6
+#define ERR_PDU_DUPLICATE_ANNOUNCE 7
+#define ERR_PDU_UNEXPECTED_PROTO_VERSION 8
+
+
+int err_pdu_send(int, u_int8_t, u_int16_t, void *, char *);
+bool err_pdu_is_fatal(u_int16_t);
+void err_pdu_log(u_int16_t, char *);
+
+#endif /* SRC_RTR_ERR_PDU_H_ */