From: Martin Mares Date: Mon, 31 May 2004 17:42:38 +0000 (+0000) Subject: Make RIP nolisten mode actually work. The socket is required for X-Git-Tag: v1.2.0~395 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4a02013767ab05b9cf7567c09e5fad59c9bd1c10;p=thirdparty%2Fbird.git Make RIP nolisten mode actually work. The socket is required for sending, the received data has to be discarded instead. (patch by Andreas Steinmetz modified by me) --- diff --git a/proto/rip/rip.c b/proto/rip/rip.c index 392a687fa..c3a495100 100644 --- a/proto/rip/rip.c +++ b/proto/rip/rip.c @@ -457,6 +457,10 @@ rip_rx(sock *s, int size) struct proto *p = i->proto; int num; + /* In non-listening mode, just ignore packet */ + if (i->mode & IM_NOLISTEN) + return 1; + CHK_MAGIC; DBG( "RIP: message came: %d bytes from %I via %s\n", size, s->faddr, i->iface ? i->iface->name : "(dummy)" ); size -= sizeof( struct rip_packet_heading ); @@ -716,17 +720,15 @@ new_iface(struct proto *p, struct iface *new, unsigned long flags, struct iface_ if (!ipa_nonzero(rif->sock->daddr)) { if (rif->iface) log( L_WARN "%s: interface %s is too strange for me", P_NAME, rif->iface->name ); - } else - if (!(rif->mode & IM_NOLISTEN)) - if (sk_open(rif->sock)<0) { - log( L_ERR "%s: could not listen on %s", P_NAME, rif->iface ? rif->iface->name : "(dummy)" ); - if (rif->iface) { - rfree(rif->sock); - mb_free(rif); - return NULL; - } - /* On dummy, we just return non-working socket, so that user gets error every time anyone requests table */ - } + } else if (sk_open(rif->sock)<0) { + log( L_ERR "%s: could not create socket for %s", P_NAME, rif->iface ? rif->iface->name : "(dummy)" ); + if (rif->iface) { + rfree(rif->sock); + mb_free(rif); + return NULL; + } + /* On dummy, we just return non-working socket, so that user gets error every time anyone requests table */ + } TRACE(D_EVENTS, "Listening on %s, port %d, mode %s (%I)", rif->iface ? rif->iface->name : "(dummy)", P_CF->port, rif->multicast ? "multicast" : "broadcast", rif->sock->daddr );