diff --git a/server/process_packet.c b/server/process_packet.c index 32e99cb2..c0c26784 100644 --- a/server/process_packet.c +++ b/server/process_packet.c @@ -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***/