diff --git a/daemon/call.c b/daemon/call.c index 6aad02816..9ff674b71 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -105,6 +105,10 @@ static void kernelize(struct callstream *c) { struct peer *p, *pp; struct streamrelay *r, *rp; struct kernel_stream ks; + struct callmaster *cm = c->call->callmaster; + + if (cm->kernelfd < 0 || cm->kernelid < 0) + return; mylog(LOG_DEBUG, LOG_PREFIX_C "Kernelizing RTP streams", LOG_PARAMS_C(c->call)); @@ -125,26 +129,26 @@ static void kernelize(struct callstream *c) { continue; ks.local_port = r->localport; - ks.tos = c->call->callmaster->tos; + ks.tos = cm->tos; ks.src.port = rp->localport; ks.dest.port = r->peer.port; if (IN6_IS_ADDR_V4MAPPED(&r->peer.ip46)) { ks.src.family = AF_INET; - ks.src.ipv4 = c->call->callmaster->ipv4; + ks.src.ipv4 = cm->ipv4; ks.dest.family = AF_INET; ks.dest.ipv4 = r->peer.ip46.s6_addr32[3]; } else { ks.src.family = AF_INET6; - ks.src.ipv6 = c->call->callmaster->ipv6; + ks.src.ipv6 = cm->ipv6; ks.dest.family = AF_INET6; ks.dest.ipv6 = r->peer.ip46; } ZERO(r->kstats); - kernel_add_stream(c->call->callmaster->kernelfd, &ks, 0); + kernel_add_stream(cm->kernelfd, &ks, 0); } p->kernelized = 1; diff --git a/daemon/main.c b/daemon/main.c index 62e96d152..0665b4b60 100644 --- a/daemon/main.c +++ b/daemon/main.c @@ -267,7 +267,7 @@ int main(int argc, char **argv) { struct callmaster *m; struct control *c; struct control_udp *cu; - int kfd; + int kfd = -1; int ret; options(&argc, &argv); @@ -275,11 +275,19 @@ int main(int argc, char **argv) { resources(); - if (kernel_create_table(table)) - die("Failed to create kernel table %i\n", table); - kfd = kernel_open_table(table); - if (kfd == -1) - die("Failed to open kernel table %i\n", table); + if (table >= 0 && kernel_create_table(table)) { + fprintf(stderr, "FAILED TO CREATE KERNEL TABLE %i, KERNEL FORWARDING DISABLED\n", table); + mylog(LOG_CRIT, "FAILED TO CREATE KERNEL TABLE %i, KERNEL FORWARDING DISABLED\n", table); + table = -1; + } + if (table >= 0) { + kfd = kernel_open_table(table); + if (kfd == -1) { + fprintf(stderr, "FAILED TO OPEN KERNEL TABLE %i, KERNEL FORWARDING DISABLED\n", table); + mylog(LOG_CRIT, "FAILED TO OPEN KERNEL TABLE %i, KERNEL FORWARDING DISABLED\n", table); + table = -1; + } + } p = poller_new(); if (!p)