FreeBSD 2.X についての FAQ (よくある質問とその答え) : ネットワーキング : ppp が動きません. どこを間違えているのでしょう? : auto modeでdialをするようなprocessがconnectしてくれない
Previous: ppp が segmentation fault になるのですが, ppp.core
Next: 何故ほとんどのゲームが -alias スイッチ付きだと動かないんですか?

10.7.19. auto modeでdialをするようなprocessがconnectしてくれない

これはpppが動的なlocalのIP numberを相手とnegotiateする ように設定されている時のknown problemです. 最初のプログラムが connect(2)を呼び出した時, tun intergaceのIP numberが socketのendpointに割り当てられます. kernelは最初に外へ出ていく packetを作り, それをtunデバイスへ書きます. 次にpppはpacket を読んで接続を確立します. pppの動的IP割り当ての結果として, interfaceのアドレスは変わりますので, 一番最初のsocketのendpoint のは無効になります. そしてそれ以降相手に送られるpacketは落とされ てしまいます. 仮にそうでないとしても, 既にIP numberは変更されて いるので, どんな返事も始めのmachineには戻ってきません.

この問題に対処する理論的な方法がいくつかあります. もし可能なら, 相手が同じIP numberを割り当てなおす事ができるのが最も良いです:-)

我々の側から対処できる最も簡単な方法は, tun interfaceのIP numberを固定する事ですが, かわりに外に出ていくpacketを変更して source IP numberをinterfaceのIPからnegotiateされたIPに書きかえる 事によっても対処できます. これが, libalias(3) (およびpppの-alias switch)の行っている 方法です.

もう1つの(最も確かな)方法は, 全てのbindされているsocketの IPを変更するようにsystem callを実装する事です. pppは, 新しくIP numberがnegotiateされた時に, このsystem callを用いて 全てのsocketを書きかえるのです.

3つ目の方法は, interfaceをIP number無しで立ち上げる事を許す ことです. 外に出ていくpacketは最初のSIOCAIFADDR ioctlが終わるまで は255.255.255.255というIP numberを与えられます. これによって socketを完全にbindすることができます. pppに対してsource IP numberを変更させる事になりますが, もしそれが255.255.255.255になって おり, IP numberとIP checksumだけ変更すれば良ければの話になります. しかし, この方法は, 他の部分の仕組みが古い物との互換性を持つよう 変更されてしまった場合には, kernelが適切に設定されていないinterface に対して悪いpacketを送信してしまいます.

現在のところ, これらの方法のどれもまだ実装されていません.


FreeBSD 2.X についての FAQ (よくある質問とその答え) : ネットワーキング : ppp が動きません. どこを間違えているのでしょう? : auto modeでdialをするようなprocessがconnectしてくれない
Previous: ppp が segmentation fault になるのですが, ppp.core
Next: 何故ほとんどのゲームが -alias スイッチ付きだと動かないんですか?