I capture all the packets in one side with help of nfqueue, “record” them (all the data: ip info, next protocol info etc) with nfq_get_payload and deliver them into another side with help of udp. How can I restore this packet on another side and then send to myself(2 side) like there is no udp-encapsulation between? Should I use some nfqueue API or I have to implement all the protocols packet creation (UDP, ICMP, TCP, etc)? And how should I send this restored packet?
Advertisement
Answer
Ok, I successfully recreated and sent forward my packet encapsulated in UDP. After recreation I needed to send this packet to another IP, but you can use original destination address. So the code snippet:
char *full_packet; int size; // some actions to get full_packet and size from UDP packet // assume you recreated this: int size = nfq_get_payload(nfa, &full_packet); int sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW); // also optional string needed in my case: setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, "wlan0", strlen("wlan0")); if (sock == -1) { perror("socket() failed"); return 1; } struct sockaddr_in to; struct ip *iph = (struct ip *)full_packet; to.sin_addr.s_addr = inet_addr("192.168.0.107"); // here you can set IP address where you need send this packet to.sin_family = AF_INET; int bytes = sendto(sock, full_packet, size, 0, (struct sockaddr*) &to, sizeof(to)); if (bytes == -1) { perror("send() failed"); return 1; }
I hope this will help somebody