using netfilter to capture UDP data but i got lot of packet loss

21 Views Asked by At

I am using net filter to capture UDP packet and in application side receiving packet in call back. below i have give the callback function. I am processing data in call back function but mostly packets are missed but in driver all packets are added in NF_QUEUE

int device::filter_fn(struct nfq_q_handle *qh, struct nfgenmsg *nfmsg, struct nfq_data *nfa, void *data)
{
    int id;

    struct nfqnl_msg_packet_hdr *ph;
    ph = nfq_get_msg_packet_hdr(nfa);
    id = ntohl(ph->packet_id);
    printf("filter function id=%d\n",id);

    unsigned char *pktData;
    int len = nfq_get_payload(nfa, &pktData);


      if (len > 36 and IsHeaderDetected == true && cnt < 480){
          memcpy(Frame_data + size, pktData + 28, len - 28);
          size += len - 28;
          cnt++;
      }
      else if (len == 36 && pktData[28] == 0xaa /*&& pktData[29] == 0x55*/ /*&& pktData[30] == 0xaa && pktData[31] == 0x55*/){
        IsHeaderDetected = true;
        size = 0;
        cnt= 0;
        //memset(Frame_data,0, 1920*1080*2);
      }
      else if (len == 36 && pktData[28] == 0xbb /*&& pktData[29] == 0x66*/ /*&& pktData[30] == 0xbb && pktData[31] == 0x66*/){
          
          if (cnt == 480 && size == 4147200 ){

            memcpy(RenderFrame_data, Frame_data, size);

            FrameQueue.push((unsigned char *)RenderFrame_data);
            memset(Frame_data,0, 1920*1080*2);
            currFPS = FPS();
        }
        IsHeaderDetected = false;
        size = 0;
        cnt= 0;

      }

    if ( id % 3 == 0)
        return nfq_set_verdict(qh, id, NF_DROP, 0, NULL);

    return nfq_set_verdict(qh, id, NF_ACCEPT, 0, NULL);
}

How to avoid packet loss?

i tried to solve this issue by implementing threads to process data but after that also i got same issue

0

There are 0 best solutions below