Rework the network listening routine

This commit is contained in:
Pierre Pronchery 2018-06-15 16:38:11 -04:00
parent 2367bc23e8
commit ce9b5fb364

View File

@ -41,49 +41,60 @@
#include "log_msg.h"
static void
process_packet_ethernet(fko_srv_options_t * opts, const unsigned char * packet,
unsigned short pkt_len, int caplen, int offset);
static void
process_packet_ipv4(fko_srv_options_t * opts, const unsigned char * packet,
int offset, unsigned char * fr_end);
static void
process_packet_ipv6(fko_srv_options_t * opts, const unsigned char * packet,
int offset, unsigned char * fr_end);
static void
process_packet_raw(fko_srv_options_t * opts, const unsigned char * packet);
void
process_packet(PROCESS_PKT_ARGS_TYPE *args, PACKET_HEADER_META,
const unsigned char *packet)
{
struct ether_header *eth_p;
struct iphdr *iph_p;
struct tcphdr *tcph_p;
struct udphdr *udph_p;
struct icmphdr *icmph_p;
unsigned char *pkt_data;
unsigned short pkt_data_len;
unsigned char *pkt_end;
unsigned char *fr_end;
unsigned int ip_hdr_words;
unsigned char proto;
unsigned int src_ip;
unsigned int dst_ip;
unsigned short src_port = 0;
unsigned short dst_port = 0;
unsigned short eth_type;
fko_srv_options_t *opts = (fko_srv_options_t *)args;
int offset = opts->data_link_offset;
if (offset != 0)
#if USE_LIBPCAP
unsigned short pkt_len = packet_header->len;
process_packet_ethernet(opts, packet, packet_header->len,
packet_header->caplen, offset);
#else
process_packet_ethernet(opts, packet, pkt_len, pkt_len, offset);
#endif
else
process_packet_raw(opts, packet);
}
static void
process_packet_ethernet(fko_srv_options_t * opts, const unsigned char * packet,
unsigned short pkt_len, int caplen, int offset)
{
struct ether_header *eth_p;
unsigned char *fr_end;
unsigned short eth_type;
#if USE_LIBPCAP
/* Gotta have a complete ethernet header.
*/
if (packet_header->caplen < ETHER_HDR_LEN)
if (caplen < ETHER_HDR_LEN)
return;
/* Determine packet end.
*/
fr_end = (unsigned char *) packet + packet_header->caplen;
fr_end = (unsigned char *) packet + caplen;
#else
/* This is coming from NFQ and we get the packet lentgh as an arg.
/* This is coming from NFQ and we get the packet length as an arg.
*/
if (pkt_len < ETHER_HDR_LEN)
return;
@ -127,6 +138,35 @@ process_packet(PROCESS_PKT_ARGS_TYPE *args, PACKET_HEADER_META,
if (! ETHER_IS_VALID_LEN(pkt_len) )
return;
if (eth_type == ETHERTYPE_IP)
process_packet_ipv4(opts, packet, offset, fr_end);
else if (eth_type == ETHERTYPE_IPV6)
process_packet_ipv6(opts, packet, offset, fr_end);
}
static void
process_packet_ipv4(fko_srv_options_t * opts, const unsigned char * packet,
int offset, unsigned char * fr_end)
{
struct iphdr *iph_p;
struct tcphdr *tcph_p;
struct udphdr *udph_p;
struct icmphdr *icmph_p;
unsigned char *pkt_data;
unsigned short pkt_data_len;
unsigned char *pkt_end;
unsigned int ip_hdr_words;
unsigned char proto;
unsigned int src_ip;
unsigned int dst_ip;
unsigned short src_port = 0;
unsigned short dst_port = 0;
/* Pull the IP header.
*/
iph_p = (struct iphdr*)(packet + offset);
@ -236,4 +276,19 @@ process_packet(PROCESS_PKT_ARGS_TYPE *args, PACKET_HEADER_META,
}
static void
process_packet_ipv6(fko_srv_options_t * opts, const unsigned char * packet,
int offset, unsigned char * fr_end)
{
/* FIXME implement */
}
static void
process_packet_raw(fko_srv_options_t * opts, const unsigned char * packet)
{
/* FIXME implement */
}
/***EOF***/