2012-11-06 3 views
2

리눅스 커널 &에 대한 모듈을 작성하면 & 패킷을 도용하려고 시도합니다. sk_buff. 이렇게하려면 struct sk_buff *skb_copy(const struct sk_buff *skb, gfp_t gfp_mask) &을 사용하고 커널에 반환 유형을 전달하려면 패킷이으로 삭제됩니다.sk_buff copy & sk_buff 복제본

그래서 커널이 패킷 드롭에 대한 정보를 얻으면 sk_buff를 해제하려고합니다. 여기 내 질문은 내 새로 복사 skb & 패킷의 그 지적 데이터에 영향을 미친다 온다? 아니면 지금 내 새 sk_buff 놀 수있어?

또는는 패킷의 복사 비용을 reduse 때문에 가능() & 오래된 sk_buff를하여 참조 데이터를 삭제하지 않고 패킷 데이터 부분을 사용 skb_clone을 사용하는 것입니다.

답변

5

skb_copy을 사용하면 sk_buff과 패킷을 새 메모리로 복사합니다. 커널이 다른 것을 해제 할 때 사본은 영향을받지 않습니다.

skb_clone 다른 한편으로는 sk_buff 구조를 새 메모리로 복사하지만 패킷은 복사하지 않습니다. 이전 버전이 해제 될 때 사본에는 패킷도 해제됩니다. 여기

몇 가지 링크입니다 :

+0

실제로 내가 skb_clone의 도움으로 패킷 데이터를 사용하려면() 데이터 복사가 필요하지 않으므로 sk_buff 구조체 만 복사됩니다. 그래서 내가 이전 sk_buff의 참조 횟수를 줄이면 가능합니다 ... 복제 중에 coz 내가 참조 카운트가 증가했다고 생각 ...? – akp