bool is_packet_needed(const char *packet) { bool is_needed = false; uint16_t size_ip, size_tcp, tot_len, cont_len, header_len; tc_ip_header_t *ip_header; tc_tcp_header_t *tcp_header; ip_header = (tc_ip_header_t *) packet; /* check if it is a tcp packet(could be removed) */ if (ip_header->protocol != IPPROTO_TCP) { return is_needed; } size_ip = ip_header->ihl << 2; tot_len = ntohs(ip_header->tot_len); if (size_ip < 20) { tc_log_info(LOG_WARN, 0, "Invalid IP header length: %d", size_ip); return is_needed; } tcp_header = (tc_tcp_header_t *) ((char *) ip_header + size_ip); size_tcp = tcp_header->doff << 2; if (size_tcp < 20) { tc_log_info(LOG_WARN, 0, "Invalid TCP header len: %d bytes,pack len:%d", size_tcp, tot_len); return is_needed; } /* filter the packets we do care about */ if (LOCAL == check_pack_src(&(settings.stat), ip_header->daddr, tcp_header->dest, CHECK_DEST)) { header_len = size_tcp + size_ip; if (tot_len >= header_len) { is_needed = true; cont_len = tot_len - header_len; if (tcp_header->syn) { clt_syn_cnt++; } else if (cont_len > 0) { clt_cont_cnt++; } clt_packs_cnt++; } else { tc_log_info(LOG_WARN, 0, "bad tot_len:%d bytes, header len:%d", tot_len, header_len); } } return is_needed; }
/* * filter packets */ bool is_packet_needed(const char *packet) { bool is_needed = false; uint16_t size_ip, size_udp, tot_len; struct iphdr *ip_header; struct udphdr *udp_header; ip_header = (struct iphdr*)packet; /* check if it is a udp packet */ if(ip_header->protocol != IPPROTO_UDP){ return is_needed; } size_ip = ip_header->ihl << 2; tot_len = ntohs(ip_header->tot_len); if (size_ip < 20) { log_info(LOG_WARN, "Invalid IP header length: %d", size_ip); return is_needed; } udp_header = (struct udphdr*)((char *)ip_header + size_ip); size_udp = ntohs(udp_header->len); if (size_udp < sizeof(struct udphdr)) { log_info(LOG_WARN, "Invalid udp header len: %d bytes,pack len:%d", size_udp, tot_len); return is_needed; } /* filter the packets we do care about */ if(LOCAL == check_pack_src(&(clt_settings.transfer), ip_header->daddr, udp_header->dest, CHECK_DEST)){ is_needed = true; clt_udp_cnt++; strace_pack(LOG_DEBUG, ip_header, udp_header); } return is_needed; }
/* * filter udp packets */ bool tc_check_ingress_pack_needed(tc_iph_t *ip) { bool is_needed = false; uint16_t size_ip, size_udp, tot_len; tc_udpt_t *udp; /* check if it is a udp packet */ if (ip->protocol != IPPROTO_UDP) { return is_needed; } size_ip = ip->ihl << 2; tot_len = ntohs(ip->tot_len); if (size_ip < IPH_MIN_LEN) { tc_log_info(LOG_WARN, 0, "Invalid IP header length: %d", size_ip); return is_needed; } udp = (tc_udpt_t *) ((char *) ip + size_ip); size_udp = ntohs(udp->len); if (size_udp < sizeof(tc_udpt_t)) { tc_log_info(LOG_WARN, 0, "Invalid udp header len: %d,pack len:%d", size_udp, tot_len); return is_needed; } /* filter the packets we do care about */ if (TC_CLT == check_pack_src(&(clt_settings.transfer), ip->daddr, udp->dest, CHECK_DEST)) { is_needed = true; clt_udp_cnt++; } return is_needed; }