]> jfr.im git - irc/charybdis-ircd/charybdis.git/commitdiff
Add workaround for Linux SCTP_I_WANT_MAPPED_V4_ADDR bug on older kernels
authorSimon Arlott <sa.me.uk>
Wed, 23 Aug 2017 23:21:02 +0000 (00:21 +0100)
committerSimon Arlott <sa.me.uk>
Thu, 24 Aug 2017 19:08:22 +0000 (20:08 +0100)
librb/src/commio.c

index a994d5bca470a7448a99325e8f34008e42505345..3fda4bca10fdbc0f2ab4a297f61eb6093d297dcf 100644 (file)
@@ -361,6 +361,9 @@ rb_setsockopt_sctp(rb_fde_t *F)
 {
        int opt_zero = 0;
        int opt_one = 1;
+       /* workaround for https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/net/sctp?id=299ee123e19889d511092347f5fc14db0f10e3a6 */
+       char *env_mapped = getenv("SCTP_I_WANT_MAPPED_V4_ADDR");
+       int opt_mapped = env_mapped != NULL ? atoi(env_mapped) : opt_zero;
        int ret;
        struct sctp_initmsg initmsg;
        struct sctp_rtoinfo rtoinfo;
@@ -374,7 +377,7 @@ rb_setsockopt_sctp(rb_fde_t *F)
                return ret;
        }
 
-       ret = setsockopt(F->fd, SOL_SCTP, SCTP_I_WANT_MAPPED_V4_ADDR, &opt_zero, sizeof(opt_zero));
+       ret = setsockopt(F->fd, SOL_SCTP, SCTP_I_WANT_MAPPED_V4_ADDR, &opt_mapped, sizeof(opt_mapped));
        if (ret) {
                rb_lib_log("rb_setsockopt_sctp: Cannot unset SCTP_I_WANT_MAPPED_V4_ADDR for fd %d: %s",
                                F->fd, strerror(rb_get_sockerr(F)));