Oberon/ETH Oberon/2.3.7/PPP.Tool

$VCS   6, Edgar@EdgarSchwarz.de, 06.06.00 21:34:10 $

Welcome
Version 1.2.0, 06.06.2000 by Edgar@EdgarSchwarz.de
- PAP password now set with NetSystem.Setuser. You can configure several providers with different passwords now.
Version 1.1.1,  09.05.2000 by Edgar@EdgarSchwarz.de
- Running already on Beta 25.04.2000 (just because thats my working system just now :-)
- Logging now to a own text. Open with PPPTest.ShowLog .
- If server doesn't tell his IP-address ask for it.
- Still a problem with at least one ISP with PAP.
- Sometimes connection goes down after a while (idle time ?). Not yet clear what
   happens, because I also have some problems now under windows, since my
   provider changed to new nationwide (Germany) phone number.
Version 1.1.0 06.09.1999 by Edgar.Schwarz@z.zgs.de.
- Logging changed to kernel log (shown interactive with System.OpenKernelLog)
- Echo requests without data handled correctly
- es.PPP.Tool without outlines
- some small corrections/clarifications
Version 1.0.0 28.02.1999
-  First versioned release.

BTW, some technical stuff :-)
"<" something ">" means: insert the stuff that's right for you.
Stuff between "[" and "]" is optional.

For setting up PPP you should read System.Text first. If you then have probems you can use this document for additional information. If you have any comments or proposals for this document just send me a mail.

What is PPP 
PPP means 'Point to Point Protocol' and is basically a specification how two computers can communicate and exchange data. It also specifies how PPP server and client can negotiate certain parameters. Maximum packet size, compression techniques and so on.
The PPP packet provides services PPPHDLC.SendPacket and PPPHDLC.ReceivePacket which the can be used e.g. by TCP/IP.
This implementation is configured to communicate with a COM port. In principle it's also possible to use Ethernet, ISDN or whatelse. It's just
necessary to change the interface to the hardware.
PPP is described in RFC (Request for Comment. These are Standards really, just the name is a little misleading) 1584.
Also of interest is RFC 1172 on IPCP (PPP Internet Protocol Control Protocol) and RFC 1334 on PPP Authentication Protocols.

Creating Release
ET.Call System.CopyFiles "es.* => *" ~
VCSPacket.NewPacket PPP.Pkt PPPDebug.Mod 
	PPPTools.Mod PPPHDLC.Mod PPPFSM.Mod PPPIPCP.Mod
	PPPPAP.Mod PPPLCP.Mod PPPMain.Mod PPPTest.Mod 
	PPP.Tool ~
Compress.Add PPP.1.2.0.Arc ^

Add \s if necessary.

Installing PPP
Compiler.Compile PPPDebug.Mod  PPPTools.Mod PPPHDLC.Mod
	PPPFSM.Mod PPPIPCP.Mod PPPPAP.Mod PPPLCP.Mod
	PPPMain.Mod PPPTest.Mod ~
Add \s if necessary.

What does PPP do 
First I will give you a sketch, which parties are involved if you are connected
with less detail on the ISP side.
	ISP																					YOU
	---																				   ---
	Web sever															 HTML, Mail, ftp
		TCP/IP															TCP/IP
	 																	a device
	 	  PPP													PPP
	 	  						                               serial interface
	 	          modem							modem
	 	                           phone line

TCP/IP uses a device. This is by default the device which is set for
Oberon.Text:NetSystem.Hosts.Route0 which at the moment means
Device0.
Now you have to tell PPP which device and which serial interface
it should use (set it in Oberon.Text:NetSystem).
Finally you have to configure setting up your modem connection
to your ISP and starting PPP when done (set it in Oberon.Text:<ISP name>).

Using PPP 
In Oberon.Text you can define profiles for ISPs. My ISP is "StZ".
- setup
Setting stuff like described in System.Text. Also see chapter 'My setup' below.
- initialisation
> NetSystem.Start
> NetSystem.SetUser dialup:z974hzb@StZ ~  set password for user "z974hzb"
- connect
> Dialer.Dial StZ device0 ~ 
After the modem is connected and the script is finished you get a 'IPCP is finally up' in System.Log. Now you can access the WWW.
If you don't get the 'IPCP is finally up' then see below.
- disconnect
> PPPMain.StopInst 
	
Some more information in case of problems
My setup in Oberon.Text 
NetSystem = {
	Hosts = { 
		Domain = { "zgs.de", "" }
		DNS0 = { "dns0", "195.145.135.1" }
		DNS1 = { "dns1", "195.145.135.2" }

		Device0 = {"PPPMain.InstPPP", "COM1"}
		
		Route0 = {
			Device = "Device0"
			Mode = ""	{* "arp" for LAN, "" for PPP or SLIP *}
		}
	}
	SMTP = "zmail.zgs.de"	{* outgoing mail server *}
	POP = "zmail.zgs.de"	{* incoming mail server *}
	NNTP = "znews.zgs.de"	{* news server *}
	POPMode = "POP3"	{* POP3 or APOP *}

	EMail = "Edgar@EdgarSchwarz.de"	{* your return address *}
	MailSignature = "Mail.Sig.Text"	{* appended to every outgoing mail *}
	NewsSignature = "News.Sig.Text"{* appended to every outgoing news *}

	ProxyDomain = "zgs.de" {* optional *}
	HTTPProxy = "zproxy.zgs.de:8080"

	NewsThreading = Yes	{* Newsreader keeps message threads together? *}
	NewsFont = Courier10.Scn.Fnt	{* Font for news articles *}

	HTMLImages = No	{* Download WWW images with background task? *}
	KeepURLs = Yes
	KeepCache = Yes      {* only valid if KeepURLs = Yes *}

}
{* profile for my ISP (Stuttgarter Zeitung) *}
StZ = {
	Init = { COM1 38400 }	{* modem port and speed *}
	Dial = {
		"ATZ" 
		10 "OK" 
		"ATD 07111324300" 
		60 "CONNECT" 
		10 "Login:" 
		USER
		20 "word:" 
		PASSWORD
		20 "PPP Mode." 
		CALL PPPMain.StartInst
	}

In case your provider uses PAP (Password Authentication Protocol)  you should set the PAP parameters and try the following dial script. Your provider probably uses PAP or CHAP (not yet supported) if you don't receive anything like 'Login' or 'Password'.

<provider> = {
	Init = { COM1 38400 }	{* modem port and speed *}
	Dial = {
		"ATZ" 
		10 "OK" 
		"ATD <phone>" 
		60 "CONNECT" 
		CALL "PPPMain.StartInst <provider> <user>"
	}
}

You set your PAP authentication by the usual way with NetSystem:
NetSystem.SetUser pap:<user>[:<password>]@<provider> ~

Some more or less common problems already encountered 
- A provider had a PPP server which wanted to configure illegal configuration options which I discarded. I changed my code to refuse these options.
- Be sure you don't have a typo somewhere in your configuration. Here I remember   a case where somebody couldn't connect to his mailbox because of an error in his email address.
- A modem was setup in echo mode on power on so my PPP module tried to talk to itself without much success.
- If you get somthing like 'deviceX pending' check whether your settings in Oberon.Text:NetSystem are looking good.
	
Points to keep in mind
- If you change your dial script you can just redial.
- If you change something in your NetSystem configuration it's probably best to reboot.

If you still have problems
- PPPTest.LogOn to turn logging on
- If it doesn't go through to 'Calling [PPPMain.StartInst]' you have already
problem with dialing. Check your dial script.
If you don't have an idea send me a step by step description of what you did, your setup for NetSystem and dialing from Oberon.Text and the partial log you got in System.Log.
- If you get 'Calling [PPPMain.StartInst]' but not 'IPCP is finally ready. Device opened.'
Then you have a problem in PPP setup. This can be errors in the DNS entry, your provider has problems at the moment (this also happens :-) ), your provider wants CHAP (I only support PAP at the moment), problems with modem configuration or much more. So in this case you can do a PPPTest.ShowLog which gives you the PPP log.
You can try to understand it yourself (If you read the RFCs :-) ) or send it to Edgar@EdgarSchwarz.de together with the information in the first case.

The log I get in System.Log with Dialer.Dial StZ device0 ~ 

Dial script started
Sending [ATZ]
Waiting 10s for [OK] {ATZ||OK}
Sending [ATD 07111324300]
Waiting 60s for [CONNECT] {|ATD 07111324300||CONNECT}
Waiting 10s for [Login:] { 38400||*** POP Stuttgart 1 ***|||Login:}
Sending USER [z974hzb]
Waiting 20s for [word:] { z974hzb|Password:}
Sending PASSWORD [***]
Waiting 20s for [PPP Mode.] { |    Entering PPP Mode.}
Calling [PPPMain.StartInst]
End of script
IPCP is finally ready. Device opened.

How can I see the log ?
PPPTest.ShowLog show you what's going on.

A PPP  log I got
! This log was taken before switching to kernel log for debugging, !
! so perhaps it changed a little bit. 												  !

Starting receiving-loop
Pustekuchen, macht Devicepolling
FSM.LowerUp
protocol: LCP  -  channel: PPP
state: Initial

FSM.Open
protocol: LCP  -  channel: PPP
state: Closed

reset CI
FSM.SendConfReq
protocol: LCP  -  channel: PPP
id:    1    state: Closed

LCP.AddCI
protocol: LCP  -  channel: PPP
MRU AsyncMap 

FSM.SendData
protocol: LCP  -  channel: PPP
code: ConfReq
state: Closed
id:    1
0101000E 010405DC 02060000 0000

11:06:46SendPacket: len =    20
FF03C021 0101000E 010405DC 02060000 
00004F35 
11:06:46CheckPacket: len=   55
0D0A2020 20204950 20616464 72657373 
20697320 3139352E 3134352E 3133322E 
3136350D 0A202020 204D5455 20697320 
31353234 2E0D0A
Checksum failure11:06:46CheckPacket: len=   37
FF03C021 0101001F 010405F4 0206000A 
00000702 08021104 05F41309 0300C07B 
8056F048 BA
FSM.Input
new Input
protocol: LCP  -  channel: PPP
state: ReqSent

0101001F 010405F4 0206000A 00000702 
08021104 05F41309 0300C07B 8056F0

FSM.ReceiveConfigureRequest
protocol: LCP  -  channel: PPP
id:    1

RejPCCompRejACCompRejLCPConf17RejLCPConf19FSM.SendData
protocol: LCP  -  channel: PPP
code: ConfRej
state: ReqSent
id:    1
04010015 07020802 110405F4 13090300 
C07B8056 F0

11:06:46SendPacket: len =    27
FF03C021 04010015 07020802 110405F4 
13090300 C07B8056 F03A1C
11:06:46CheckPacket: len=    0

11:06:46CheckPacket: len=   20
FF03C021 0201000E 010405DC 02060000 
000071B6 
FSM.Input
new Input
protocol: LCP  -  channel: PPP
state: ReqSent

0201000E 010405DC 02060000 0000

FSM.ReceiveConfAck
protocol: LCP  -  channel: PPP
id:    1

11:06:46CheckPacket: len=    0

11:06:46CheckPacket: len=   20
FF03C021 0102000E 010405F4 0206000A 
0000ADF5 
FSM.Input
new Input
protocol: LCP  -  channel: PPP
state: AckRcvd

0102000E 010405F4 0206000A 0000

FSM.ReceiveConfigureRequest
protocol: LCP  -  channel: PPP
id:    2

FSM.SendData
protocol: LCP  -  channel: PPP
code: ConfAck
state: AckRcvd
id:    2
0202000E 010405F4 0206000A 0000

11:06:46SendPacket: len =    20
FF03C021 0202000E 010405F4 0206000A 
00009376 
LCP is finally ready!!
FSM.LowerUp
protocol: IPCP  -  channel: PPP
state: Initial

FSM.Open
protocol: IPCP  -  channel: PPP
state: Closed

FSM.SendConfReq
protocol: IPCP  -  channel: PPP
id:    1    state: Closed


FSM.SendData
protocol: IPCP  -  channel: PPP
code: ConfReq
state: Closed
id:    1
0101000A 03060000 0000

11:06:46SendPacket: len =    16
FF038021 0101000A 03060000 00001328 

11:06:47CheckPacket: len=    0

11:06:47CheckPacket: len=   22
FF038021 01010010 0206002D 0F010306 
C391877B 0C58
FSM.Input
new Input
protocol: IPCP  -  channel: PPP
state: ReqSent

01010010 0206002D 0F010306 C391877B 


FSM.ReceiveConfigureRequest
protocol: IPCP  -  channel: PPP
id:    1

FSM.SendData
protocol: IPCP  -  channel: PPP
code: ConfRej
state: ReqSent
id:    1
0401000A 0206002D 0F01

11:06:47SendPacket: len =    16
FF038021 0401000A 0206002D 0F0186DE 

11:06:47CheckPacket: len=    0

11:06:47CheckPacket: len=   16
FF0380FD 0101000A 11060001 0103CEDF 

11:06:47CheckPacket: len=    0

11:06:47CheckPacket: len=   16
FF038021 0301000A 0306C391 84A5E7A4 

FSM.Input
new Input
protocol: IPCP  -  channel: PPP
state: ReqSent

0301000A 0306C391 84A5

FSM.ReceiveConfigureNak/Reject
protocol: IPCP  -  channel: PPP
id:    1

FSM.SendConfReq
protocol: IPCP  -  channel: PPP
id:    2    state: ReqSent


FSM.SendData
protocol: IPCP  -  channel: PPP
code: ConfReq
state: ReqSent
id:    2
0102000A 0306C391 84A5

11:06:47SendPacket: len =    16
FF038021 0102000A 0306C391 84A5AE2A 

11:06:47CheckPacket: len=    0

11:06:47CheckPacket: len=   16
FF038021 0102000A 0306C391 877B353F 

FSM.Input
new Input
protocol: IPCP  -  channel: PPP
state: ReqSent

0102000A 0306C391 877B

FSM.ReceiveConfigureRequest
protocol: IPCP  -  channel: PPP
id:    2

FSM.SendData
protocol: IPCP  -  channel: PPP
code: ConfAck
state: ReqSent
id:    2
0202000A 0306C391 877B

11:06:47SendPacket: len =    16
FF038021 0202000A 0306C391 877B5C4B 

11:06:47CheckPacket: len=    0

11:06:47CheckPacket: len=   16
FF038021 0202000A 0306C391 84A5C75E 

FSM.Input
new Input
protocol: IPCP  -  channel: PPP
state: AckSent

0202000A 0306C391 84A5

FSM.ReceiveConfAck
protocol: IPCP  -  channel: PPP
id:    2

OurAddress = C39184A5
HisAddress = C391877B
IPCP is finally ready!!

Now the lower layers are up and PPP is running. If there are still problems these probably come from the upper layer protocols.

Some concluding remarks
- In doubt send more information than you think relevant. Sometimes there is an error in an unexpected place.
- Also send me errors and proposals for this document. PPP installation should be as painless as possible for a user.

Regards, Edgar Schwarz, Edgar@EdgarSchwarz.de