Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 13 Dec 1998 01:49:37 +0000
From:      Brian Somers <brian@Awfulhak.org>
To:        Poul-Henning Kamp <phk@FreeBSD.ORG>
Cc:        current@FreeBSD.ORG, isdn@FreeBSD.ORG
Subject:   Re: if_sppp is BROKEN!!! 
Message-ID:  <199812130149.BAA00784@keep.lan.Awfulhak.org>
In-Reply-To: Your message of "Sun, 13 Dec 1998 00:20:42 %2B0100." <8711.913504842@critter.freebsd.dk> 

next in thread | previous in thread | raw e-mail | index | archive | help
> 
> I think I have finally found out what the problem is with the state
> machine in the if_sppp implementation.  Whoever wrote the implementation
> didn't carefully consider the inter-layer calls tls and tlf.
> 
> If one applies a lot of patches like this one:
> 
>                 case STATE_OPENED:
> -                       (cp->tld)(sp);
>                         sp->rst_counter[cp->protoidx] = 0;
>                         sppp_cp_change_state(cp, sp, STATE_STOPPING);
> +                       (cp->tld)(sp);
>                         goto sta;
>                         break;
> 
> Then things actually start to make sense...
> 
> The problem is that the tld and tlf functions often just call the
> pp_up and pp_down routines directly, and therefore most if not all
> of the expected up and down events happen in the previous state
> as opposed to the next state.
> 
> Flipping it around like I have done above, on the other hand, may
> not be a good idea either, since it means we can nest another layer
> on the stack and get somewhat confused on the way down.
> 
> It is quite obvious that this will need some more work to sort out,
> anybody interested in participating ?

I haven't got much time before Christmas, but if you're still looking 
for volunteers in the new year I'll be interested.

I had similar problems with user-ppp, and ended up having the state 
machine call the TLU/TLS/TLD/TLF, then tweak the state before calling 
the same function for the parent.... 

  case ST_OPENED:
    (*fp->fn->LayerDown)(fp);
    FsmInitRestartCounter(fp);
    FsmSendTerminateReq(fp);
    NewState(fp, ST_CLOSING);
    (*fp->parent->LayerDown)(fp->parent->object, fp);
    break;

A given layer never calls another layer, it just gets called from the 
state machine.

Things aren't as important on the way up, although the TLU has to 
tell the FSM if it should proceed and call the parent TLU....

      if ((*fp->fn->LayerUp)(fp))
        (*fp->parent->LayerUp)(fp->parent->object, fp);
      else {
        (*fp->fn->LayerDown)(fp);
        FsmInitRestartCounter(fp);
        FsmSendTerminateReq(fp);
        NewState(fp, ST_CLOSING);
      }

Doing it this way certainly confused me less :-)

> --
> Poul-Henning Kamp             FreeBSD coreteam member
> phk@FreeBSD.ORG               "Real hackers run -current on their laptop."
> "ttyv0" -- What UNIX calls a $20K state-of-the-art, 3D, hi-res color terminal
-- 
Brian <brian@Awfulhak.org> <brian@FreeBSD.org> <brian@OpenBSD.org>
      <http://www.Awfulhak.org>;
Don't _EVER_ lose your sense of humour !



To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message



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