Date: Sun, 20 Oct 2002 11:18:39 -0700 (PDT) From: Archie Cobbs <archie@dellroad.org> To: Nikolai Saoukh <bsd#nms@otdel-1.org> Cc: freebsd-net@FreeBSD.ORG Subject: Re: For those who had problems with MPD server and win clients Message-ID: <200210201818.g9KIIdqF048199@arch20m.dellroad.org> In-Reply-To: <20021018132732.GA27692@otdel1.org> "from Nikolai Saoukh at Oct 18, 2002 05:27:32 pm"
next in thread | previous in thread | raw e-mail | index | archive | help
Nikolai Saoukh writes: > IMHO, there is a combination of two bugs. > > 1) MPD (3.9, at least) calculates and sets mtu (bund.c/BundUpdateParams()) > at wrong time -- when one of MIN() args is still zero. ioctl with bizzare mtu > value rejected, thus leaving the default (1500), which in turn is above > MRU requested from win client (1400 for multilink). See my comments below... > 2) MS clients has setting 'Negotiate multi-link for single link connections'. > Even when this option is negotiated, ms client does not understand partial MP > (RFC1990) fragments. When both (begin, end) flags set, then everything is > fine, as long as everything fits MRU. If this is true, then "set bundle enable round-robin" should work around the windows problem.. can you verify this? > --- bund.c.orig Tue Oct 8 13:40:15 2002 > +++ bund.c Fri Oct 18 17:17:23 2002 > @@ -548,22 +548,20 @@ > mtu = NG_IFACE_MTU_DEFAULT; /* Reset to default settings */ > break; > case 1: > - if (!Enabled(&bund->conf.options, BUND_CONF_MULTILINK)) { > - mtu = MIN(bund->links[the_link]->lcp.peer_mru, > - bund->links[the_link]->phys->type->mtu); > - break; > - } > - /* FALLTHROUGH */ > + mtu = bund->links[the_link]->lcp.peer_mru; > + break; > default: /* We fragment everything, use bundle MRRU */ > mtu = bund->mp.peer_mrru; > break; > } It doesn't seem possible to me that "bund->links[the_link]->phys->type->mtu" could ever be zero as you claim because this is a static variable initialized at compile time. However, this code is in fact broken. As sent in private email, I think the correct fix is this: --- bund.c 17 Oct 2002 18:48:47 -0000 1.8 +++ bund.c 20 Oct 2002 18:11:00 -0000 @@ -548,7 +548,7 @@ mtu = NG_IFACE_MTU_DEFAULT; /* Reset to default settings */ break; case 1: - if (!Enabled(&bund->conf.options, BUND_CONF_MULTILINK)) { + if (!bund->multilink) { /* If no multilink, use peer MRU */ mtu = MIN(bund->links[the_link]->lcp.peer_mru, bund->links[the_link]->phys->type->mtu); break; > - /* Subtract to make room for various frame-bloating protocols */ > - if (Enabled(&bund->conf.options, BUND_CONF_COMPRESSION)) > - mtu = CcpSubtractBloat(mtu); > - if (Enabled(&bund->conf.options, BUND_CONF_ENCRYPTION)) > - mtu = EcpSubtractBloat(mtu); > + if (bm->n_up > 0) { > + /* Subtract to make room for various frame-bloating protocols */ > + if (bund->ccp.xmit != NULL) > + mtu = CcpSubtractBloat(mtu); > + if (bund->ecp.xmit != NULL) > + mtu = EcpSubtractBloat(mtu); > + } Looks good, though I have a modified version that fixes another bug as well (we were subtracting from the MTU even if compression negotation failed). > --- iface.c.orig Tue Oct 8 14:28:09 2002 > +++ iface.c Sat Oct 12 11:54:36 2002 > @@ -346,6 +346,8 @@ > /* Sanity */ > assert(!iface->ip_up); > > + BundUpdateParams(); > + > /* Set addresses and bring interface up */ > snprintf(hisaddr, sizeof(hisaddr), "%s", inet_ntoa(iface->peer_addr)); > ExecCmd(LG_IFACE, "%s %s %s %s netmask 0xffffffff %slink0", Doesn't hurt :-) I've combined your and my changes into the combined patch below. Please apply & let me know if this fixes the problems you're seeing. Thanks, -Archie __________________________________________________________________________ Archie Cobbs * Packet Design * http://www.packetdesign.com Index: bund.c =================================================================== RCS file: /home/cvs/archie/mpd/src/bund.c,v retrieving revision 1.8 diff -u -r1.8 bund.c --- bund.c 17 Oct 2002 18:48:47 -0000 1.8 +++ bund.c 20 Oct 2002 18:17:28 -0000 @@ -548,7 +548,7 @@ mtu = NG_IFACE_MTU_DEFAULT; /* Reset to default settings */ break; case 1: - if (!Enabled(&bund->conf.options, BUND_CONF_MULTILINK)) { + if (!bund->multilink) { /* If no multilink, use peer MRU */ mtu = MIN(bund->links[the_link]->lcp.peer_mru, bund->links[the_link]->phys->type->mtu); break; @@ -560,10 +560,12 @@ } /* Subtract to make room for various frame-bloating protocols */ - if (Enabled(&bund->conf.options, BUND_CONF_COMPRESSION)) - mtu = CcpSubtractBloat(mtu); - if (Enabled(&bund->conf.options, BUND_CONF_ENCRYPTION)) - mtu = EcpSubtractBloat(mtu); + if (bm->n_up > 0) { + if (Enabled(&bund->conf.options, BUND_CONF_COMPRESSION)) + mtu = CcpSubtractBloat(mtu); + if (Enabled(&bund->conf.options, BUND_CONF_ENCRYPTION)) + mtu = EcpSubtractBloat(mtu); + } /* Update interface MTU */ if (mtu > BUND_MAX_MTU) Index: ccp.c =================================================================== RCS file: /home/cvs/archie/mpd/src/ccp.c,v retrieving revision 1.4 diff -u -r1.4 ccp.c --- ccp.c 17 Oct 2002 18:48:47 -0000 1.4 +++ ccp.c 20 Oct 2002 18:17:28 -0000 @@ -578,12 +578,14 @@ CcpState const ccp = &bund->ccp; /* Account for CCP's protocol number overhead */ - size -= CCP_OVERHEAD; + if (OPEN_STATE(ccp->fsm.state)) + size -= CCP_OVERHEAD; /* Account for transmit compression overhead */ - if (OPEN_STATE(ccp->fsm.state) && ccp->xmit && ccp->xmit->SubtractBloat) { + if (OPEN_STATE(ccp->fsm.state) && ccp->xmit && ccp->xmit->SubtractBloat) size = (*ccp->xmit->SubtractBloat)(size); - } + + /* Done */ return(size); } Index: ecp.c =================================================================== RCS file: /home/cvs/archie/mpd/src/ecp.c,v retrieving revision 1.4 diff -u -r1.4 ecp.c --- ecp.c 17 Oct 2002 18:48:48 -0000 1.4 +++ ecp.c 20 Oct 2002 18:17:28 -0000 @@ -583,12 +583,14 @@ EcpState const ecp = &bund->ecp; /* Account for ECP's protocol number overhead */ - size -= ECP_OVERHEAD; + if (OPEN_STATE(ecp->fsm.state)) + size -= ECP_OVERHEAD; /* Check transmit encryption */ - if (OPEN_STATE(ecp->fsm.state) && ecp->xmit && ecp->xmit->SubtractBloat) { + if (OPEN_STATE(ecp->fsm.state) && ecp->xmit && ecp->xmit->SubtractBloat) size = (*ecp->xmit->SubtractBloat)(size); - } + + /* Done */ return(size); } Index: iface.c =================================================================== RCS file: /home/cvs/archie/mpd/src/iface.c,v retrieving revision 1.4 diff -u -r1.4 iface.c --- iface.c 19 Oct 2002 18:14:26 -0000 1.4 +++ iface.c 20 Oct 2002 18:17:28 -0000 @@ -346,6 +346,9 @@ /* Sanity */ assert(!iface->ip_up); + /* For good measure */ + BundUpdateParams(); + /* Set addresses and bring interface up */ snprintf(hisaddr, sizeof(hisaddr), "%s", inet_ntoa(iface->peer_addr)); ExecCmd(LG_IFACE, "%s %s %s %s netmask 0xffffffff %slink0", To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-net" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200210201818.g9KIIdqF048199>