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