Ejemplo n.º 1
0
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;

}
Ejemplo n.º 2
0
/*
 * 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;

}
Ejemplo n.º 3
0
/*
 * 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;

}