UNIX의 사용자 정의 링크 계층 프로토콜 [닫기]

UNIX의 사용자 정의 링크 계층 프로토콜 [닫기]

GPIO(예: Raspberry Pi에서)를 사용하여 링크 레이어 포트콜을 구현하는 방법에 대한 정보가 있는 사람이 있는지 궁금합니다.

아이디어는 지점 간 사용자 정의 인터페이스(eth0과 유사)를 구현하는 것입니다. 이더넷 모듈을 호출하는 대신 이 인터페이스를 통해 메시지가 전송되면 새 커널 모듈(장치 드라이버)이 호출됩니다. GPIO를 사용하는 패킷.

나는 몇 가지를 알고 싶습니다:

  • 내가 알아야 할 비슷한 예나 정보가 있는 책/논문/...을 아는 사람이 있나요? 커널 모듈에서 많은 것을 찾았지만 새 인터페이스를 커널 모듈과 "연결"하는 것에 대해서는 아무것도 찾지 못했습니다.

  • 새 인터페이스로 표시하려면 TCP/IP를 사용해야 합니까? (내 생각에 대답은 '그렇다'이다)

제가 조사한 결과 다음과 같은 흥미로운 웹페이지가 나타났습니다.

그러나 인터페이스 구현 부분과 이를 드라이버에 "연결"하는 방법에 관해서는 여전히 잘 모르겠습니다. 따라서 새 인터페이스를 사용할 때 pingIP 패킷이 장치 드라이버로 전송되므로 이를 캡슐화하여 하드웨어를 통해 보내야 합니다.

감사합니다. 답변을 얻을 수 있기를 바랍니다!

답변1

프로토콜이 사용자 공간을 통해 GPIO 핀을 제어하기에 충분하다고 가정하면 /sys/class/gpio/가장 쉬운 방법은 사용자 공간 드라이버를 작성하는 것입니다 tap. 커널 문서에서 linux/Documentation/networking/tuntap.txt:

TUN/TAP은 사용자 공간 프로그램에 대한 패킷 수신 및 전송을 제공합니다. 물리적 매체에서 패킷을 수신하는 대신 사용자 공간 프로그램에서 패킷을 수신하고 물리적 매체를 통해 패킷을 보내는 대신 사용자에게 기록하는 간단한 지점 간 또는 이더넷 장치로 생각할 수 있습니다. 우주 프로그램.

드라이버를 사용하려면 프로그램이 /dev/net/tun적절한 ioctl()을 열고 실행하여 네트워크 장치를 커널에 등록해야 합니다. 네트워크 장치는 선택한 옵션에 따라 tunXX표시 됩니다 . tapXX,프로그램이 파일 설명자를 닫으면 네트워크 장치와 해당 경로가 모두 사라집니다.

선택한 장치 유형에 따라 사용자 공간 프로그램은 IP 패킷(tun 사용) 또는 이더넷 프레임(tap 사용)을 읽고 써야 합니다. 어느 것이 사용되는지는 ioctl()이 제공하는 플래그에 따라 다릅니다.

패키지는 다음에서 제공됩니다.http://vtun.sourceforge.net/tun튜닝 및 탭 장치를 사용하는 방법에 대한 두 가지 간단한 예가 포함되어 있습니다. 두 프로그램 모두 두 네트워크 인터페이스 사이의 브리지처럼 작동합니다.

  • br_select.c- 선택된 시스템 호출을 기반으로 한 브리징.
  • br_sigio.c - 비동기식 io 및 SIGIO 신호를 기반으로 한 브리지입니다.

그러나 가장 좋은 예는 VTun입니다.http://vtun.sourceforge.net:))

또한 Google에서 수많은 튜토리얼을 찾아볼 수도 있습니다(대부분은 tun이더넷 프레임이 아닌 IP 패킷과 같은 인터페이스에 관한 것일 수도 있지만).

최종 제품이 커널 모듈이어야 하더라도 tap디버깅이 더 쉽기 때문에 드라이버부터 시작하겠습니다. 대부분이 작동한 후에도 여전히 커널 모듈로 전환할 수 있습니다.

관련 정보