2012-03-02 2 views
1

수신/발신 패킷의 사용자 공간 수정에 libnetfilter_queue를 사용하고 있습니다. 단일 스레드 모델을 사용하고 있습니다. 그러나 2.6.31 커널에서 다른 연결에 대해 다른 대기열을 가질 수 있다는 것을 알았습니다. 그래서 그 다른 스레드에서 각 큐를 관리 할 수 ​​있다면 방황했다. 내가 100 큐처럼 관리 할 경우 내가 초기화 위에 구조 및 루프를 시간, QH 및 que_num을 포장합니다, 지금netfilter_queue : 멀티 스레드 환경에서 --queue-balance 사용

struct nfq_handle * h = nfq_open(); 
nfq_unbind_pf(h, AF_NET); 
nfq_bind_pf(h,m AF_NET); 
struct nfq_q_handle(h, 0, &cb, NULL); 
nfq_set_mode(qh, NFQNL_COPY_PACKET, 0xffff); 

:

은 일반적으로 내가 울부 짖는 소리처럼 처리 대기열을 설정합니다.

지금 내 질문은 :

내가 메인 스레드에서 위의 초기화하고 별도의 스레드에서 콜백 를 실행하려는 경우, 충분히 앞서 pthread_create 부여하는 함수의 경우에도 루프를 실행하는 것입니다()? 스레드에서 콜백을 실행합니까?

확신 할 수는 없지만 nfq_set_verdict가 반환 될 때 패킷이 대기열에서 팝됩니다. 그래서 nfq_set_verdict를 별도의 스레드에서 실행하여 i 패킷을 대기열 병렬에서 팝핑 할 수 있도록해야합니다.

편집 : 누군가 내 문제를 이해해야하는 경우 내 코드를 제공합니다. 여기에 모든 코드를 붙여 넣는 것은 시각적 잡음을 발생시키는 것처럼 불합리한 것처럼 보입니다.

+0

단일 스레드에서이 작업을 수행하는 것이 너무 느 립니 까? 그렇지 않다면, 왜 당신은 그것에 스레드를 던지기 위해 점프하고 있습니까? 사람들은 실제로 생각하지 않고 나사 레버를 너무 자주 던졌습니다. – tbert

답변

1

나는 이것이 약간의 necroposting이지만, 누구든지이 문제에 걸림돌이되는 경우에 대비합니다.

멀티 스레딩에 --queue-balance를 사용하면 netfilter가 모든 패킷을 하나의 큐에 넣는 것처럼 보입니다. --queue-cpu-fanout을 추가해야 iptable이 흐름 대신 cpuid를 기반으로 패킷을 공유합니다.

관련 문제