LP(4)

名称
lp - プリンタポートインターネットプロトコルドライバ

書式
ifconfig lp0 自アドレス 相手アドレス [-link0] device lpt0 at isa? port? tty irq 7

解説
lp ドライバによって、PC パラレルプリンタポートを、 同様に設定された 2 つのシステム間で、 point-to-point ネットワークインタフェースとして使うことができます。 データは一度に 4 ビットずつ転送し、 入力にはプリンタ状態信号を使用します。 よって、特別な双方向ハードウェアは必要とせず、 割り込みで動作する標準の AT 互換のプリンタポートを使うことができます。

lp ドライバは lpt ドライバを統合したものとして実装されており、 インターネットのサポートと少なくとも 1 つの lpt デバイスを設定したカーネルに自動的に組み込まれます。 ブートプロセス中に検出され割り込みが割り当てられた各 lpt プリンタデバイスについて、 対応する lp ネットワークデバイスが生成されます。 使用可能なデバイスは
    lp0: TCP/IP capable interface
のようなメッセージによってアナウンスされます。

初期状態では lpt デバイスは印刷用にアクティブとなっており、 ネットワークインタフェースは非アクティブです。 しかし、一旦対応する lp デバイスが ifconfig(8) によって 'up' に設定されると、 ネットワークインタフェースが 'down' に設定されるまで印刷は行えません。

通信プロトコルは link0 フラグによって選択されます。

-link0
    (デフォルト) FreeBSD モード (LPIP) を使用します。 もう一つのモードに比べシンプルなもので、やや効率が良いものです。

link0
    Cyrnwr/Linux 互換のモード (CLPIP) を使用します。 このモードはイーサネットパケットヘッダをシミュレートしており、 他のタイプの機器とのインタフェースが容易です。

インタフェース MTU のデフォルト値は 1500 となっていますが、 ほかの値に設定することが可能です。 リンクの両端では同じ値の MTU に設定されることが必要です。

  ケーブルの接続
2 つのパラレルポートを接続するケーブルは、 次のように結線されていることが必要です。

    	ピン	ピン	説明
    	2	15	Data0 -> ERROR*
    	3	13	Data1 -> SLCT
    	4	12	Data2 -> PE
    	5	10	Data3 -> ACK*
    	6	11	Data4 -> BUSY
    	15	2	ERROR* -> Data0
    	13	3	SLCT   -> Data1
    	12	4	PE     -> Data2
    	10	5	ACK*   -> Data3
    	11	6	BUSY   -> Data4
    	18-25	18-25	グランド

この結線のケーブルは 'Laplink' ケーブルとして広く入手可能であり、 よく黄色にカラーリングされています。

接続は対称的であり、各方向で 5 本を使用します (データに 4 本とハンドシェイク用に 1 本)。 2 つのモードは同じ結線のものを使いますが、 どの線をハンドシェイクに使用するかが異なっています。

  FreeBSD LPIP モード
信号線は次のように使われます。

Data0 (ピン 2)
    出力データのビット 0。

Data1 (ピン 3)
    出力データのビット 1。

Data2 (ピン 4)
    出力データのビット 2。

Data3 (ピン 5)
    ハンドシェイク出力。

Data4 (ピン 6)
    出力データのビット 3。

ERROR* (ピン 15)
    入力データのビット 0。

SLCT (ピン 13)
    入力データのビット 1。

PE (ピン 12)
    入力データのビット 2。

BUSY (ピン 11)
    入力データのビット 3。

ACK* (ピン 10)
    ハンドシェイク入力。

アイドル時、すべてのデータ線は 0 になっています。 各バイトは次のように 4 段階で送信されます。 送信側が上位 4 ビットを書き込み、ハンドシェイクラインを上げます。 受信側はその 4 ビットを読み、 読み込んだことを知らせるためにハンドシェイクラインを上げます。 送信側は下位 4 ビットをデータ線にセットし、ハンドシェイクラインを下げます。 受信側はデータを読み、ハンドシェイクラインを下げます。

パケットは固定値 0x08, 0x00 からなる 2 バイトのヘッダに IP ヘッダとデータが続く形式となっています。

パケットの開始は単にヘッダの最初のバイトを送信することで示されます。 パケットの終了はハンドシェイクラインの状態を変えずに、 データ線を反転する (すなわち直前に送信したニブルの 1 の補数を書く) ことによって示されます。

パケット終了のマークはハンドシェイク信号と出力データビットが 1 つの命令で書き込めることを前提にしていることに注意してください。 さもなければ、パケットデータ中のあるバイト値が パケット終了として誤って解釈されることが起こりえます。 これは PC のプリンタポートでは問題とはなりませんが、 このプロトコルを他の機器に実装する場合に注意が必要となります。

  Crynwr/Linux CLPIP モード
信号線は次のように使われます。

Data0 (ピン 2)
    出力データのビット 0。

Data1 (ピン 3)
    出力データのビット 1。

Data2 (ピン 4)
    出力データのビット 2。

Data3 (ピン 5)
    出力データのビット 3。

Data4 (ピン 6)
    ハンドシェイク出力。

ERROR* (ピン 15)
    入力データのビット 0。

SLCT (ピン 13)
    入力データのビット 1。

PE (ピン 12)
    入力データのビット 2。

ACK* (ピン 10)
    入力データのビット 3。

BUSY (ピン 11)
    ハンドシェイク入力。

アイドル時にはすべてのデータ線は 0 になっています。 各バイトは次のように 4 段階で送信されます。 送信側が下位 4 ビットを書き込み、ハンドシェイクラインを上げます。 受信側はその 4 ビットを読み、 読み込んだことを知らせるためにハンドシェイクラインを上げます。 送信側は上位 4 ビットをデータ線にセットし、ハンドシェイクラインを下げます。 受信側はデータを読み、ハンドシェイクラインを下げます。 [LPIP モードとはニブルの順番が逆になっていることに注意してください。]

パケットの形式は次のようになります。

    長さ (下位バイト)
    長さ (上位バイト)
    12 バイトの想定 MAC アドレス (FreeBSD では無視)
    固定バイト 0x08
    固定バイト 0x00
    <IP データグラム>
    チェックサムバイト

長さには、ヘッダの 14 バイトが含まれますが、 長さを示すバイト自身とチェックサムバイトは含まれません。

チェックサムはすべてのバイト (繰り返しますが、ヘッダ部分は含みますが、チェックサムと長さのバイトは除きます) の単純な算術和です。 FreeBSD では送信時にはチェックサムを計算していますが、 受信したものについての確認は行っていません。

ハンドシェイク入力に選択されている信号線は 割り込みを生成するためには使われていないので、 パケットの開始は特別な方法で信号化することが必要です。 送信側は、データ線に値 0x08 を書き、 受信側がデータ線に 0x01 を書くことにより応答するのを待ちます。 その後、送信側はパケットの最初のバイト (長さバイト) の送信を開始します。

パケットの終了はパケット長から分かるため、 特別な方法での信号化はされません。 (データ線はアイドル状態である 0 に戻され、 次のパケットの開始とならないようにはされますが。)

関連項目
lpt(4), ifconfig(8)

バグ
データの転送中のハンドシェイクにはビジーウェイトループが使われています。 (さらに、受信側システムでのパケット開始の割り込みに応答するための待ちに おいても同様です。) そのため、低速なシステムと通信を行っている高速なシステムでは かなりの CPU 時間を消費してしまいます。 これは ハンドシェイクの信号の選択により CLPIP モードでは避けられないものです。 理論的には LPIP モードの場合では改善することができます。

ポーリングのタイムアウトはタイマではなく ループの回数によって制御されており、CPU の速度に依存しています。 これは実際にポートを読むために (低速な) ISA のバスサイクルを実行する必要があるため、 いくぶん安定化されています。