PPPアクセスラッパクラス(2001.03.29から)

最終目標はMochaPPPです。

ネットワークに接続できるPCにHOTSYNCケーブルでPalmをつないで、Palmからネットワークに接続できるようにするPC用ソフトです。

PC側で必要な処理はPalmからのPPPパケットの分解。そしてそのパケットをPCが接続しているネットワークへ送り出さなければなりません。逆にネットワークからPalmへのパケットをPPPパケットに包みなおすことも必要です。

まずPPPアクセスのラッパクラスを製作することにします。

この時点での疑問は

です。

PPPについてのRFCを読むと、パケットの詳細などがかかれているもののピンと来ません。そこで実際にPalmから送信されるパケットを見てみることにしました。

ハイパーターミナルで見てみる

~ }#タ!}!F} }.}"}&} } } } }'}"}(}"bO~~ }#タ!}!G} }.}"}&} } } } }'}"}(}"マJ~~ }#タ!}!
H} }.}"}&} } } } }'}"}(}"・~~ }#タ!}!I} }.}"}&} } } } }'}"}(}"Iz~~ }#タ!}!J} }.}"}
&} } } } }'}"}(}"セt~~ }#タ!}!K} }.}"}&} } } } }'}"}(}"}3q~~ }#タ!}!L} }.}"}&} } }
} }'}"}(}"Pi~~ }#タ!}!M} }.}"}&} } } } }'}"}(}"l~

予想通り人間には読めないものの、先頭の「~」が0x7eでありフラグシーケンスと確認できたのでOK。

つづいて、COMポートから受信した文字を表示するコマンドを製作し、上記と同じものを記録してみました。

ff 7e ff 7d 23 c0 21 7d 21 39 7d 20 7d 2e 7d 22
7d 26 7d 20 7d 20 7d 20 7d 20 7d 27 7d 22 7d 28
7d 22 68 f6 7e 7e ff 7d 23 c0 21 7d 21 3a 7d 20
7d 2e 7d 22 7d 26 7d 20 7d 20 7d 20 7d 20 7d 27
7d 22 7d 28 7d 22 9f f8 7e 7e ff 7d 23 c0 21 7d
21 3b 7d 20 7d 2e 7d 22 7d 26 7d 20 7d 20 7d 20
7d 20 7d 27 7d 22 7d 28 7d 22 32 fd 7e 7e ff 7d
23 c0 21 7d 21 3c 7d 20 7d 2e 7d 22 7d 26 7d 20
7d 20 7d 20 7d 20 7d 27 7d 22 7d 28 7d 22 71 e5
7e 7e ff 7d 23 c0 21 7d 21 3d 7d 20 7d 2e 7d 22
7d 26 7d 20 7d 20 7d 20 7d 20 7d 27 7d 22 7d 28
7d 22 dc e0 7e 7e ff 7d 23 c0 21 7d 21 3e 7d 20
7d 2e 7d 22 7d 26 7d 20 7d 20 7d 20 7d 20 7d 27
7d 22 7d 28 7d 22 2b ee 7e 7e ff 7d 23 c0 21 7d
21 3f 7d 20 7d 2e 

先頭の0xffはよくわかりませんが、7e〜7eのパケットのまとまりが確認できました。

RFCを読むとこれはLCPのようです。リンクを確立しようとしてるわけですね。確かにPalmのディスプレイ上には「接続状況 ログオン」と表示されています。よく似たパケットが繰り返されているのはリトライしているわけですね。

リンク制御プロトコルで通信設定要求し、PFCとACFCを要求しているようです。これに対してACKのパケットを返せば次のステップに進めそうです。

(つづく)

PPPについて

RFC1661を元にすべきのようです。

PalmのHOTSYNCケーブルはPCのCOMポートに接続するので、HDLC-likeのRFC1662も参照する必要があるようです。

COMポートキャプチャのソース(抜粋)

while(i++ < 256 /* getch() != 'q' */ ){
  DWORD dwRLength;
  unsigned char bfRecv[256];
  dwRLength = 0;
  ReadFile(hCom, bfRecv, 1, &dwRLength, NULL);
  if(dwRLength >0)
  printf("%2x ",bfRecv[0]);
} /* while */

2001.04.01

PPPはまぁだいたいわかった(うそ)ので、今度はPC上で行うパケット変換処理について考えてみます。

PPPではIPCP(RFC1332)でIPパケットを透過的に扱えるようです。ここで疑問にぶつかります。WINDOWSでIPパケットを直接扱えるのでしょうか?今まではなんとなくWinsockを使ってSocketプログラミングで行けるだろうと思っていました。しかしながらWinsockはTCP/IPまたはUDP/IPプロトコルを利用するためのAPIです。IPアドレスはIPCPで取得する仕組みがあります。ではポート番号はIPパケットに含まれるのでしょうか?なんとなく、IPパケットに包まれたTCPまたはUDPパケットの中に書かれているような気がします。作ろうとしているソフトでは、例えばPalmからのパケットを

  1. PalmからのPPPパケットから、IPパケットを取り出す。
  2. さらにIPパケットからTCP/IPかUDP/IPパケットを取り出す。
  3. そこからIPアドレスとポート番号を取り出す。
  4. 改めてSocketからTCP/IPかUDP/IPパケットとして送り出す。

というようなことをせにゃならんのでしょうか。うむ。がんばればできそうな気もします。逆にPalmへのパケットも処理はできそうですね。

でもこれで本当にいいんでしょうか?なんやえらい遠回りのような気がします。もしPC上でIPパケットを直接扱えるならば、IPCP<-->IP変換だけでいいはずなんですが…

あと、PPPってTAPI(RAS 誤記訂正2001.04.02)でさらっと処理できないんでしょうか?できたらいいなぁ…

文献

SoftwareDesign1999.11 特集

Interace2000.10 付録


2001.04.02

RASでPalmをつなぎます。ミス発見。TAPIと書いたのはRASのつもりでした。

実はNTのRASがPPPであることはわかっていたので、ヌルモデムケーブル接続でチャレンジしてみたことはあるんです。でもNT側が全く無反応でした。無反応というのは、リモートアクセス管理のダイアログが無反応だったのです。

今日別の件でPPPを調べているときにPalm to RASというのが目にとまりました。これを読む限り、PalmOS3.3以降では

NT4でも95でも追加ソフトなしでつながるやんけ〜。

(注:NT4ではRASで、95ではケーブル接続です。)

という結論です。ログインスクリプトに問題があり、まだうまくログインできていませんが、もうちょっとできそうな気がします。ダイアルネットワークモニタもピーピー反応していますし…

ここ数日の努力はなんだったのでしょうか?MochaPPPの利点がわかりません。RASではできないことがあるんでしょうか?WINDOWSにもIPルーティングの機能/設定があるので、OKのような気がします。

もしかすると、PalmOS3.3よりも前の「シリアル接続PC−PC」ができないPalmでMochaPPPが必要だっただけでは?という気もしてきました。

いきなりやる気がなくなってきました。MochaPPPの利点がわからないとこのまま進む気が起こりそうにありません。ふぅ。


2001.04.03

NTのRASにうまくつながりません。ログはNT側で採ることができます。(Article ID:Q115929) Palm側のログではNT側の応答が悪いように思えるのですが、NT側のログを見ると認証まで行っているのにPalm側が勝手にやり直しているように見えます。

そこで、comp.os.ms-windows.programmer.win32で見つけたportmonをつかってPalmとMochaPPPの間でおこなわれるやりとりを記録してみました。

この2つを比較すればRASにうまくPalmをつなぐ設定がわかるかもしれません。(だんだん趣旨がずれていっているような…)

 

Received(Palm m100 --> MochaPPP)
00-01-02-03-04-05-06-07-08-09-0a-0b-0c-0d-0e-0f-
7E FF 7D 23 C0 21 7D 21 7D 21 7D 20 7D 2E 7D 22 
7D 26 7D 20 7D 20 7D 20 7D 20 7D 27 7D 22 7D 28 
7D 22 70 34 7E 
Protocol 0xc021:LCP
code 01:Configure-Request
Identifier 01
Length 0x000e:14 octet
 Type 2,Length 6:ACCM 0x00 0x00 0x00 0x00 
 Type 7,Length 2:PFC
 Type 8,Length 2:ACFC
Sent
00-01-02-03-04-05-06-07-08-09-0a-0b-0c-0d-0e-0f-
7E FF 03 C0 21 02 01 00 0E 02 06 00 00 00 00 07 
02 08 02 4E B7 
Protocol 0xc021:LCP
code 02:Configure-Ack
Identifier 01
Length 0x000e:14 octet
 Type 2,Length 6:ACCM 0x00 0x00 0x00 0x00 
 Type 7,Length 2:PFC
 Type 8,Length 2:ACFC
Received
00-01-02-03-04-05-06-07-08-09-0a-0b-0c-0d-0e-0f-
7E FF 7D 23 C0 21 7D 22 7D 2B 7D 20 7D 2E 7D 22 
7D 26 7D 20 7D 20 7D 20 7D 20 7D 27 7D 22 7D 28 
7D 22 7C 91 7E 
Protocol 0xc021:LCP
code 02:Configure-Ack
Identifier 0x0b
Length 0x000e:14 octet
 Type 2,Length 6:ACCM 0x00 0x00 0x00 0x00 
 Type 7,Length 2:PFC
 Type 8,Length 2:ACFC
 
Received
00-01-02-03-04-05-06-07-08-09-0a-0b-0c-0d-0e-0f-
7E 80 21 01 01 00 1C 03 06 C0 A8 00 09 02 06 00 
2D 03 01 81 06 00 00 00 00 83 06 00 00 00 00 B9 
1A 7E 
Protocol 0x8021:ICPC
code 01:Configure-Request
Identifier 01
Length 0x001c:28 octet
 Type 3,Length 6:IP-Adress 0xc0 0xa8 0x00 0x09 
 Type 2,Length 6:IP-Compression-P 0x002d 0x03 0x01
 Type 129,Length 6:IP Primary DNS 0x00 0x00 0x00 0x00
 Type 131,Length 6:IP Secondary DNS 0x00 0x00 0x00 0x00
Sent
00-01-02-03-04-05-06-07-08-09-0a-0b-0c-0d-0e-0f-
7E 80 21 03 01 00 16 03 06 C0 A8 00 09 81 06 C0 
A8 00 02 83 06 

Protocol 0x8021:ICPC
code 03:Configure-Ack
Identifier 01
Length 0x0016:24 octet
 Type 3,Length 6:IP-Adress 0xc0 0xa8 0x00 0x09 
 Type 129,Length 6:IP Primary 0xc0 0xa8 0x00 0x09
Received
00-01-02-03-04-05-06-07-08-09-0a-0b-0c-0d-0e-0f-
7E 80 21 01 02 00 16 03 06 C0 A8 00 09 02 06 00 
2D 03 01 81 06 C0 A8 00 02 FE B4 7E 

Protocol 0x8021:ICPC
code 01:Configure-Request
Identifier 02
Length 0x0016:24 octet
 Type 3,Length 6:IP-Adress 0xc0 0xa8 0x00 0x09 
 Type 2,Length 6:IP-Compression-P 0x002d 0x03 0x01
 Type 129,Length 6:IP Primary 0xc0 0xa8 0x00 0x09
(以下略)
Sent
00-01-02-03-04-05-06-07-08-09-0a-0b-0c-0d-0e-0f-
7E 80 21 02 02 00 16 03 06 C0 A8 00 09 02 06 00 
2D 03 01 81 06 

Received
00-01-02-03-04-05-06-07-08-09-0a-0b-0c-0d-0e-0f-
7E 80 21 02 02 00 0A 03 06 C0 A8 00 02 DD B5 7E 

Received
00-01-02-03-04-05-06-07-08-09-0a-0b-0c-0d-0e-0f-
7E 80 21 05 03 00 04 EF 5E 7E 
Received
00-01-02-03-04-05-06-07-08-09-0a-0b-0c-0d-0e-0f-
7E FF 7D 23 C0 21 7D 25 7D 22 7D 20 7D 24 59 28 
7E
Sent
00-01-02-03-04-05-06-07-08-09-0a-0b-0c-0d-0e-0f-
7E C0 21 06 02 00 04 2F 23 7E 
Sent
00-01-02-03-04-05-06-07-08-09-0a-0b-0c-0d-0e-0f-
7E C0 21 01 0C 00 0E 02 06 00 00