2

IP 헤더 압축 프로토콜을 IPv4 헤더를 가져 와서 작은 헤더 ("iphc"헤더라고 부름)로 압축하는로드 가능한 커널 모듈로 구현하고 있습니다.압축 IP 헤더의 Xmit 마무리

이렇게하려면 나가는 패킷의 경우 라우팅 결정이 끝나면 NF_IP_POST_ROUTING netfilter 후크를 사용하여 패킷을 가져 왔습니다. 그런 다음 IP 헤더를 IPHC 헤더 (압축 IP)로 바꾸고, ethertype을 다른 것으로 변경하고, 스택으로 보내고 (이더넷으로) 보내고 싶습니다. 내가보고있는 바로는, NF_IP_POST_ROUTING 훅에서 패킷을 가로 챌 때 MAC 헤더가 아직 추가되지 않았습니다.

몇 가지 질문은 내가했다 :

  1. 내가 그 맥 하드웨어 주소를 찾을 수 이더넷의 능력에 영향을 미칠 것이다, IP 헤더를 대체하는거야 감안할 때? 나는 ip_finish_output2() 함수에서, 그들은 skbuff (skb_dst() 함수 사용)에서 dst 값을 취하여 이웃 테이블에서 ARP 항목을 검색하는 것을 보았습니다. IPHC 헤더로 IP 헤더를 교체하고 프로토콜을 변경하는 경우 ARP 조회가 실패합니까? 나는 skbuff에서 "dst"필드를 건드린 적이 없다고 생각합니다.

  2. IP 헤더를 IPHC 헤더로 바꾸고 Ethertype을 변경 한 다음 다시 스택으로 보내면됩니까? 또는 ip_finish_output2에 반환하지 않고 직접 전송해야합니까?

# 2를하면 내 코드가 충돌합니다.

struct iphc *my_hdr; 

/* stripping the IPv4 header from skbuff */ 
skb_pull(skb, sizeof (struct iphdr)); 

/* adding my header skb */ 
skb_push(skb, IPHC_HDR_SIZE); 

/* reset network header */ 
skb_reset_network_header(skb); 

my_hdr = (struct iphc *)skb; 

my_hdr->field1 = 1; 
my_hdr->field2 = 2; 

/* change ethertype */ 
skb->protocol = __constant_htons(ETH_P_IPHC); 

return NF_ACCEPT; 

내가 여기서 뭔가를 놓치고 있습니까 : 다음은 내가 (SKB에 전달)을 NF_IP_POST_ROUTING 넷 필터 훅으로 훅 후 할 노력하고있어 샘플입니다? 감사!

답변

0

skb_pull() 및 skb_push()는 현재 skb-> 데이터가 가리키는 위치를 모른 채 사용할 수 없습니다.

패킷이 NF_IP_POST_ROUTING에서 인터셉트 될 때, 대부분의 skb-> 데이터는 MAC 헤더의 시작 부분 인 프레임의 시작 부분을 가리키고 있습니다.

따라서 skb_push() 작업을 수행하기 전에 skb_pull()을 사용하여 MAC 헤더를 먼저 빼낸 다음 IP 헤더를 꺼내야합니다. 그런 다음 데이터 (MAC + IPHDR)를 (MAC + IPHC)로 축소하고 결합한 (MAC + IPHC)을 skb_push()합니다. 그렇지 않으면 IPHC를 먼저 누른 다음 MAC을 밀어 넣을 수 있습니다.

이러한 skb 함수에 대한 자세한 내용은 skbuff.h를 참조하고 skb에 대한 유용한 자습서는 here에서 찾을 수 있습니다.