netdev
[Top] [All Lists]

Re: RFC: PPP over X

To: jamal <hadi@xxxxxxxxxx>
Subject: Re: RFC: PPP over X
From: Henner Eisen <eis@xxxxxxxxxxxxx>
Date: 03 Feb 2000 23:03:17 +0100
Cc: netdev@xxxxxxxxxxx, axboe@xxxxxxx, Mark Spencer <markster@xxxxxxxxx>, mitch@xxxxxxxxxx, Andi Kleen <ak@xxxxxxx>, Marc Boucher <marc@xxxxxxx>, paulus@xxxxxxxxxxxxx, Michal Ostrowski <mostrows@xxxxxxxxxxxxxxxxx>, Ben LaHaise <bcrl@xxxxxxxxxx>
In-reply-to: jamal's message of "Wed, 2 Feb 2000 10:42:47 -0500 (EST)"
References: <Pine.GSO.4.20.0002021030520.22723-100000@xxxxxxxxxxxxxxxx>
Sender: owner-netdev@xxxxxxxxxxx
>>>>> "jamal" == jamal  <hadi@xxxxxxxxxx> writes:

    jamal> -Hard coded for PPPOE -Creating a whole socket family for
    jamal> just PPPOE is a bad idea (claim: Could make it for PPPOX
    jamal> with type PPPOE, L2TP etc).

What about a generic ´ppp over socket´ paradigm which would eliminate
the need of special protocol families for each ppp carrier?

I´was thinking about it like this:

- Connection is controlled via usual socket system calls (bind(), connect(),
  accept(), setsockopt(), ...)

- a special ioctl() allows for attaching a ppp channel to a socket is provided.
  After successful completion of that ioctl(), a struct ppp_channel will
  have been created. The socket´s protocol stack will pass incoming
  data upstream by calling ppp_input() instead of appending 
  the frame to sk->receive_queue. The ppp_channel_ops´ queue_xmit()
  method will pass the frame to the protocol engine´s output method.

  I think that for SOCK_PACKET and SOCK_SEQ_PACKET sockets, this could be
  implemented rather generically by providing some standard hook functions
  for the struct sock callbacks (e.g. ppp_input() might be called from
  sk->data_ready()). (However, a certain amount of protocol specific
  code will be necessary because different ppp carrier protocols use
  different methods to encapsulate ppp frames).



ppp connections would be set up like this:

- pppd creates socket corresponding to ppp carrier, e.g.
  PPP over ethernet:   s = socket(PF_PACKET,SOCK_PACKET,ETH_P_PPPOE);
  PPP over X.25:       s = socket(PF_X25,SOCK_SEQ_PACKET,0);
  PPP over YOUR_FAVOURITE_CARRIER_PROTOCOL:
                       s = socket(PF_YOUR_FAVORITE_FAMILY,SOCK[_SEQ]_PACKET,?);
  (please forgive me that i don´t know the paramters for
   YOUR_FAVOURITE_CARRIER by heart, but the above should extend easily to
   things like PPP over ATM, PPP over IRDA or PPP over UDP)

- pppd directly (by means of connect() or accept()) or indirectly
  (by means of protocol family specific utility programs) establishes
  carrier connection of desired type.

- When carrier connection is established, pppd executes
                       ioctl(s,SIOCATTPPP,&pppchan);
  which attaches the data path of the socket to a ppp channel.

- after that, pppd continues to process the ppp protocol proper.

- pppd might perform further socket connection control triggerd by local
  events or remote events. E.g. additional channels might be set up or closed
  when MPPP negotiation is indicationg this.



Henner


<Prev in Thread] Current Thread [Next in Thread>