]> git.ipfire.org Git - thirdparty/FORT-validator.git/commitdiff
Create custom handling methods for Error PDUs
authorpcarana <pc.moreno2099@gmail.com>
Mon, 11 Mar 2019 17:38:23 +0000 (11:38 -0600)
committerpcarana <pc.moreno2099@gmail.com>
Mon, 11 Mar 2019 17:38:23 +0000 (11:38 -0600)
src/Makefile.am
src/rtr/err_pdu.c [new file with mode: 0644]
src/rtr/err_pdu.h [new file with mode: 0644]

index a70f996a77d866e6f022ebfa37a5c4437fb8e3d1..ce5019eb53216edefc50327394aecf51e7ed196f 100644 (file)
@@ -15,6 +15,7 @@ rtr_server_SOURCES += notify.c notify.h
 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
diff --git a/src/rtr/err_pdu.c b/src/rtr/err_pdu.c
new file mode 100644 (file)
index 0000000..573488a
--- /dev/null
@@ -0,0 +1,68 @@
+#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);
+}
diff --git a/src/rtr/err_pdu.h b/src/rtr/err_pdu.h
new file mode 100644 (file)
index 0000000..034fb89
--- /dev/null
@@ -0,0 +1,22 @@
+#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_ */