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)를 사용합니다. 이 모드는 이더넷(ethernet) 패킷 헤더를 시뮬레이트 하고 있어, 다른 타입의 기기와의 인터페이스가 용이합니다.

인터페이스 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)

버그
데이터의 전송중의 핸드쉐이크에는 Busy 웨이트 루프가 사용되고 있습니다. (게다가 수신측 시스템에서의 패킷 개시의 세치기에 응답하기 위한 대기에 두어도 같습니다. ) 그 때문에, 저속인 시스템과 통신을 실시하고 있는 고속의 시스템에서는 상당한 CPU 시간을 소비해 버립니다. 이것은 핸드쉐이크의 신호의 선택에 의해 CLPIP 모드에서는 피할 수 없는 것입니다. 이론적으로는 LPIP 모드의 경우에서는 개선할 수가 있습니다.

폴링의 타임 아웃은 타이머는 아니고 루프의 회수에 의해 제어되고 있어 CPU 의 속도에 의존하고 있습니다. 이것은 실제로 포트를 읽기 위해서(때문에) (저속인) ISA 의 버스 사이클을 실행할 필요가 있기 (위해)때문에, 조금 안정화 되고 있습니다.