C 如何在使用libnetfilter_队列截获数据包后将HopbyHop扩展头添加到Ipv6头

C 如何在使用libnetfilter_队列截获数据包后将HopbyHop扩展头添加到Ipv6头,c,networking,network-programming,ipv6,iptables,C,Networking,Network Programming,Ipv6,Iptables,我想通过添加逐跳扩展标头作为数据包下一个标头来修改ipv6标头。目前,使用libnetfilter_队列,我截取Ipv6数据包并获取其Ipv6报头(打印src ip、dst ip、数据包长度和下一个报头类型) 现在,我尝试完成这项任务,但没有成功: 如果(ipv6标头已包含HopbyHop标头){存储此HopbyHop,在}之后使用它}否则{将存储的HopbyHop标头添加到此标头} 有人能帮我吗?先谢谢你 int mycallBack( struct nfq_q_handle *hq, str

我想通过添加逐跳扩展标头作为数据包下一个标头来修改ipv6标头。目前,使用libnetfilter_队列,我截取Ipv6数据包并获取其Ipv6报头(打印src ip、dst ip、数据包长度和下一个报头类型)

现在,我尝试完成这项任务,但没有成功:

如果(ipv6标头已包含HopbyHop标头){存储此HopbyHop,在}之后使用它}否则{将存储的HopbyHop标头添加到此标头}

有人能帮我吗?先谢谢你

int mycallBack( struct nfq_q_handle *hq, struct nfgenmsg *nfmsg, struct nfq_data *nfad, void *data){

  unsigned int len, id, temp_id;
  unsigned char *packet, payload[2048], buf[2048];
  struct ip6_hdr *packet_header; //ipv6 header
  char ip_addr_source[INET6_ADDRSTRLEN], ip_addr_destination[INET6_ADDRSTRLEN];


     struct nfqnl_msg_packet_hdr *hp = nfq_get_msg_packet_hdr(nfad); //get packet header
      if (hp != NULL) {
        id = ntohl(hp->packet_id);     // Get packet id
        printf("Received packet n°: %d\n", id ); //printf received message
    }

 len = nfq_get_payload(nfad, &packet); //get payload length
 packet_header = (struct ip6_hdr *) packet; // get ip header

 inet_ntop(AF_INET6, &packet_header->ip6_src, ip_addr_source,   INET6_ADDRSTRLEN); //get src ip
 inet_ntop(AF_INET6, &packet_header->ip6_dst, ip_addr_destination, INET6_ADDRSTRLEN); //get dst ip

 printf("Ip source: %s\n", ip_addr_source); //printf @
 printf("Ip destination: %s\n", ip_addr_destination); //printf @


 ////////////////start  Ip hearder modification /////////////////////

if(packet_header->ip6_nxt !=IPPROTO_HOPOPTS){ // IPPROTO_HOPOPTS=0
    printf("Next header is not a HOP by Hop header \n\n");

    //set a set ip6_nxt as a hopbyhop header  and this hopbyhop ->next header as the firstly ip6_nxt ???

    //and set a stored hopbyhop options data to the header ??

    //struct ip6_hbh * hophdr= (struct ip6_hbh *)packet;

}else{

    printf("Next header is already hopbyhop header); 

        //store the hopbyhop and its options data??

    }
      nfq_set_verdict(hq, id, NF_ACCEPT, 0, NULL);  //resending of packet

return 0;
}