Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 8 Dec 2012 06:10:00 GMT
From:      Brett Glass <freebsd-prs@brettglass.com>
To:        freebsd-ports-bugs@FreeBSD.org
Subject:   Re: ports/173533: mpd5 PPTP server race condition with some clients
Message-ID:  <201212080610.qB86A0Li088900@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR ports/173533; it has been noted by GNATS.

From: Brett Glass <freebsd-prs@brettglass.com>
To: bug-followup@FreeBSD.org, freebsd-prs@brettglass.com
Cc:  
Subject: Re: ports/173533: mpd5 PPTP server race condition with some
  clients
Date: Fri, 07 Dec 2012 23:01:29 -0700

 Because altering the PPP state machine would technically violate 
 the RFC (even though one might argue that the RFC is flawed because 
 it does not provide for a delay), I've developed patches that do 
 not alter the state machine code. Rather, the code in link.c is 
 modified so that a delay can be introduced before the finite state 
 machine which performs the LCP negotation is started. A new 
 command, "link set lcp-delay {ms]", is added to set this delay, 
 which is 250 ms by default and can be set to any value from 0 to 
 30000. (Experimentation has shown that the default of a quarter of 
 a second is ample time for the routers we have tested to set up a 
 PPTP, PPPoE, or L2TP call, so the problem we experienced is fixed 
 by default.) If the peer attempts to initiate negotiations during 
 the delay, the request is ignored but no harm is done.
 
 Diff for link.c:
 
 45a46
  >     SET_LCP_DELAY,
 64a66
  >   static void LinkLcpDelayTimeout(void *arg);
 108c110,112
 <       LinkSetCommand, NULL, 2, (void *) SET_IDENT },
 ---
  >       LinkSetCommand, NULL, 2, (void *) SET_LCP_DELAY },
  >     { "lcp-delay {ms}",                       "Delay before LCP start",
  >       LinkSetCommand, NULL, 2, (void *) SET_NO },
 248a253,273
  >
  >     if (l->conf.lcp_delay == 0) {
  >       LcpUp(l);
  >     } else {
  >       TimerStop(&l->lcpDelayTimer);
  >       TimerInit(&l->lcpDelayTimer, "LcpOpen",
  >           l->conf.lcp_delay, LinkLcpDelayTimeout, l);
  >       TimerStart(&l->lcpDelayTimer);
  >       Log(LG_LINK, ("[%s] Link: delaying %d ms before initiating 
 LCP negotiation",
  >                   l->name, l->conf.lcp_delay));
  >     }
  > }
  >
  > static void
  > LinkLcpDelayTimeout(void *arg)
  > {
  >     Link      const l = (Link)arg;
  >
  >     if (gShutdownInProgress)
  >       return;
  >
 431a457
  >       l->conf.lcp_delay = LINK_DEFAULT_LCP_DELAY;
 1567a1594,1605
  >       case SET_LCP_DELAY:
  >           if (ac != 1)
  >               return(-1);
  >           val = atoi(*av);
  >           if (val < 0)
  >               Error("lcp-delay cannot be negative");
  >           else if (val > MP_MAX_MRRU)
  >               Error("max lcp-delay is %d", LINK_MAX_LCP_DELAY);
  >           else
  >               l->conf.lcp_delay = val;
  >           break;
  >
 
 Diff for link.h:
 
 38a39,42
  >   /* Default delay before starting LCP configuration negotiation */
  >   #define LINK_DEFAULT_LCP_DELAY      250             /* 250 ms, 
 or 1/4 second */
  >   #define LINK_MAX_LCP_DELAY          30000           /* 30 seconds */
  >
 82a87
  >     uint16_t          lcp_delay;      /* Delay before initiating LCP */
 152a158
  >     struct pppTimer   lcpDelayTimer;          /* LCP delay timer */
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201212080610.qB86A0Li088900>