문제

나는 쓰고 싶다 Linux 2.6 netfilter module, 들어가는 것을 확인할 수 있습니다 IP Dest-IP, Source-IP와 같은 패킷 정보. 그 후이 정보를 전달합니다 user space 앱 (예 : Socket 앱)은 패킷이 후크에 도달하자마자 이러한 정보를 처리합니다.

두 가지 방법을 시도하고 싶습니다.

1 . 내부 netfilter 모듈, 만들기 fifo 패킷이 도달 할 때마다 구조선 hook, 패킷 정보를 FIFO에 넣으십시오. 그리고 도움으로 /proc/example 파일 시스템 . 사용자 우주 앱이 읽을 때마다 /proc/example 파일, FIFO 헤드에서 패킷 정보를 얻습니다.

나는 초보자이다 kernel 프로그램,이 프로그램은 커널이 여러 번 충돌합니다. -_-! 이런 식으로 가능해야합니까?

2. NetFilter 모듈 내에서 Char 장치를 만들고 사용자 공간 앱은이 Char 장치에서 패킷 정보를 읽습니다. 그러나 나는 여전히 패킷을 가능한 빨리 얻는 방법을 모르고, 패킷이 NetFilter 후크에 도달 할 때 어떤 방법이 있습니까? 커널은 정보 사용자 공간 앱에 신호를 보냅니다. 그러면 사용자 공간 앱이 패킷 정보를 선택 하시겠습니까?

매우 감사합니다.

도움이 되었습니까?

해결책

가능한 한 빨리 무엇을 의미합니까? 실제 하드/소프트 실시간 요구 사항이 있습니까?

옵션 2를 선택하면 문자 장치를 비 블로킹하고 읽기 FD에서 ()를 선택하여 새 데이터를 빠르게 얻을 수 있어야합니다. 커널 레벨 소켓과 비슷한 작업을 수행했는데, 여기서 소켓 데이터는 캐릭터 드라이버를 통해 사용자 수준 프로세스에 제시되었습니다. 소켓을 적시에 서비스하는 한 지연 시간이 거의 보지 못했습니다. 드라이버는 소프트 실시간 요구 사항이있는 환경에서 사용되었으며 밀링 커널 시설을 사용하여 해당 요구 사항을 충족시키는 데 아무런 문제가 없었습니다.

Linux 장치 드라이버, 3 판을 살펴보십시오.

다른 팁

이 작업을 수행하는 방법 : 네트워크 활동에 연결되도록 커널 모듈을 만듭니다. 그런 다음 커널에서 사용자 공간과 대화 할 수있는 NetLink를 사용하여 데이터 IPC를 전달하십시오.

옵션 1이 가능하고 실행 가능합니다. 문제는 무엇입니까? 그러나 나는 보통 사이에 의사 소통하는 데 사용합니다 user-space 그리고 kernel space 사용 netlink

netlink_kernel_create

netLink_Kernel_Release

nl_sk = netlink_kernel_create(&init_net, 17, 0, recv_cmd, NULL, THIS_MODULE);

netlink_kernel_release(nl_sk);

netlink_unicast

첫 번째 방법에 대해서는 잘 모르겠지만 두 번째 방법을 사용하여 사용자 공간 앱은 Char 장치와 함께 Select () 호출을 유일한 대상으로 사용할 수 있습니다. select ()가 반환되는 즉시 읽을 데이터가 있습니다. . 하나의 패킷의 데이터를 가정하는 것이 아니라 모든 것을 읽으십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top