From: pcarana Date: Mon, 11 Mar 2019 17:38:23 +0000 (-0600) Subject: Create custom handling methods for Error PDUs X-Git-Tag: v0.0.2~52^2~33 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d66ec98dea5d8448652fa8c8b13444815e35a201;p=thirdparty%2FFORT-validator.git Create custom handling methods for Error PDUs --- diff --git a/src/Makefile.am b/src/Makefile.am index a70f996a..ce5019eb 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -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 index 00000000..573488ac --- /dev/null +++ b/src/rtr/err_pdu.c @@ -0,0 +1,68 @@ +#include "err_pdu.h" + +#include +#include +#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 index 00000000..034fb89f --- /dev/null +++ b/src/rtr/err_pdu.h @@ -0,0 +1,22 @@ +#ifndef SRC_RTR_ERR_PDU_H_ +#define SRC_RTR_ERR_PDU_H_ + +#include +#include + +#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_ */