From fd3c1d2519f2e55483725b40e4a06b14b63d828f Mon Sep 17 00:00:00 2001 From: Guillem Jover Date: Wed, 13 Dec 2017 11:30:06 +0100 Subject: [PATCH] TT#26513 Delete the kernel forwarding table on startup If we are creating the kernel forwarding table, we have to make sure it has been deleted already, otherwise we can get into collisions with the already setup forwardings, and the subsequent add will fail anyway. Change-Id: I2601c602543ff3e3493bae296d263dde545ff352 --- daemon/kernel.c | 19 +++++++++++++++++-- debian/ngcp-rtpengine-daemon.init | 3 --- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/daemon/kernel.c b/daemon/kernel.c index 397f98ae8..7ce3fefca 100644 --- a/daemon/kernel.c +++ b/daemon/kernel.c @@ -28,7 +28,7 @@ struct kernel_interface kernel; -static int kernel_create_table(unsigned int id) { +static int kernel_action_table(const char *action, unsigned int id) { char str[64]; int saved_errno; int fd; @@ -37,7 +37,9 @@ static int kernel_create_table(unsigned int id) { fd = open(PREFIX "/control", O_WRONLY | O_TRUNC); if (fd == -1) return -1; - sprintf(str, "add %u\n", id); + i = snprintf(str, sizeof(str), "%s %u\n", action, id); + if (i >= sizeof(str)) + goto fail; i = write(fd, str, strlen(str)); if (i == -1) goto fail; @@ -52,6 +54,14 @@ fail: return -1; } +static int kernel_create_table(unsigned int id) { + return kernel_action_table("add", id); +} + +static int kernel_delete_table(unsigned int id) { + return kernel_action_table("del", id); +} + static int kernel_open_table(unsigned int id) { char str[64]; int saved_errno; @@ -85,6 +95,11 @@ int kernel_setup_table(unsigned int id) { kernel.is_wanted = 1; + if (kernel_delete_table(id) && errno != ENOENT) { + ilog(LOG_ERR, "FAILED TO DELETE KERNEL TABLE %i (%s), KERNEL FORWARDING DISABLED", + id, strerror(errno)); + return -1; + } if (kernel_create_table(id)) { ilog(LOG_ERR, "FAILED TO CREATE KERNEL TABLE %i (%s), KERNEL FORWARDING DISABLED", id, strerror(errno)); diff --git a/debian/ngcp-rtpengine-daemon.init b/debian/ngcp-rtpengine-daemon.init index 62a5a9778..875aaa31f 100755 --- a/debian/ngcp-rtpengine-daemon.init +++ b/debian/ngcp-rtpengine-daemon.init @@ -182,9 +182,6 @@ case "$1" in ip6tables -D rtpengine -p udp -j RTPENGINE --id "$TABLE" 2>/dev/null ip6tables -I rtpengine -p udp -j RTPENGINE --id "$TABLE" fi - if [ -e /proc/rtpengine/control ]; then - echo "del $TABLE" > /proc/rtpengine/control 2>/dev/null - fi fi set -e log_daemon_msg "Starting $DESC" "$NAME"