void dispatcher_handler(u_char *temp1, 
						const struct pcap_pkthdr *header, 
						const u_char *pkt_data)
{
	u_int i=0;

	/*
	 * unused variable
	 */
//	(VOID*)temp1;

	//Variable in head
	unsigned int VLAN_HEAD_LEN = 0;
	bool IS_TCP = true;

	/* Capture the packet information */
	u_char	ip_header_len, 
			total_len[2], 
			trans_proto, 
			src_ip[4], 
			dest_ip[4], 
			src_port[2], 
			dest_port[2], 
			trans_header_len;

	u_char broadcast_head[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
	u_char vlan_head[2] = {0x81, 0x00};

	if( !u_char_equ(broadcast_head, pkt_data, 6) ){ //Is broadcast pkt
		//If there is a VLAN head
		VLAN_HEAD_LEN = 0;
		if(u_char_equ(vlan_head, pkt_data + ETHER_HEAD_LEN - 2, 2) )
			VLAN_HEAD_LEN = 4;

		u_char_cpy(&ip_header_len, pkt_data + ETHER_HEAD_LEN + VLAN_HEAD_LEN, 1);
		//IP header length is counted in 4 bytes.
		ip_header_len &= 0x0f;
		ip_header_len *= 4;
				
		u_char_cpy(total_len, pkt_data + ETHER_HEAD_LEN + VLAN_HEAD_LEN + 2, 2);

		IS_TCP = true;
		u_char_cpy(&trans_proto, pkt_data + ETHER_HEAD_LEN + VLAN_HEAD_LEN + 9, 1);
		switch (trans_proto)
		{
		case 0x06: //TCP
			u_char_cpy(&trans_header_len, pkt_data + ETHER_HEAD_LEN + VLAN_HEAD_LEN + ip_header_len + 12, 1);
			//The high 4 bits is TCP header length, also counted in 4 bytes. So operate below is a direct way.
			trans_header_len = (trans_header_len & 0xf0) >> 2;
			break;
		
		case 0x11: //UDP
			trans_header_len = UDP_HEAD_LEN;
			IS_TCP = false;
			break;

		default:
			return;
		}

		u_char_cpy(src_ip, pkt_data + ETHER_HEAD_LEN + VLAN_HEAD_LEN + 12, 4);
		u_char_cpy(dest_ip, pkt_data + ETHER_HEAD_LEN + VLAN_HEAD_LEN + 16, 4);
		u_char_cpy(src_port, pkt_data + ETHER_HEAD_LEN + VLAN_HEAD_LEN + (u_int)ip_header_len, 2);
		u_char_cpy(dest_port, pkt_data + ETHER_HEAD_LEN + VLAN_HEAD_LEN + (u_int)ip_header_len + 2, 2);

		unsigned int payload_len = ((u_int)total_len[0] << 8) + (u_int)total_len[1] - (u_int)ip_header_len - (u_int)trans_header_len;

		//fprintf(file, "%d.%d.%d.%d, %d, ", src_ip[0], src_ip[1], src_ip[2], src_ip[3], ((u_int)src_port[0] << 8) + (u_int)src_port[1]);
		//fprintf(file, "%d.%d.%d.%d, %d, ", dest_ip[0], dest_ip[1], dest_ip[2], dest_ip[3], ((u_int)dest_port[0] << 8) + (u_int)dest_port[1]);
		//fprintf(file, "%ld, %ld, %ld, %ld\n", header->ts.tv_sec, header->ts.tv_usec, header->len, payload_len);

		info_head tih;
		pkt_info tpi;

		tih.src_ip = ((u_long)src_ip[0] << 24) | ((u_long)src_ip[1] << 16) | ((u_long)src_ip[2] << 8) | (u_long)src_ip[3];
		tih.dest_ip = ((u_long)dest_ip[0] << 24) | ((u_long)dest_ip[1] << 16) | ((u_long)dest_ip[2] << 8) | (u_long)dest_ip[3];
		tih.src_port = ((u_short)src_port[0] << 8) | (u_short)src_port[1];
		tih.dest_port = ((u_short)dest_port[0] << 8) | (u_short)dest_port[1];
		//tih.generate_flow_name();
		tih.isTCP = IS_TCP;
		tih.generate_flow_name_2();

		tpi.sec = header->ts.tv_sec;
		tpi.usec = header->ts.tv_usec;
		tpi.pkt_size = header->len;
		tpi.pld_size = payload_len;
		
		if(pkt_counter <= 1000000){
			pl.append(tih, tpi);
			++ pkt_counter;
		}
		else{
			++ buffer_full_times;
			printf("%ldM packets have already been read. Now buffer is full. Processing...\n", buffer_full_times);
			pim.handler(pl);
			pl.head_to_pkt.clear();
									
			printf("Go on reading...\n");
			pl.append(tih, tpi);
			pkt_counter = 1;
		}

	} //End of if( !u_char_equ(broadcast_head, pkt_data, 6) )
Exemplo n.º 2
0
int read_fp_string(char *fp_string)
{
    char range_string[MAX_LEN_PARA_STRING+1];  // enthält Bereichsstring
    char value_string[MAX_LEN_PARA_STRING+1];  // enthält Zahlenstring für Bereichsgrenzen
    // des Parameterstrings -f...
    char string[MAX_LEN_PARA_STRING+1];        // Zwischenergebnisse
    unsigned long min;                         // untere Grenze eines Durchlaßbereiches
    unsigned long max;                         // uobere Grenze eines Durchlaßbereiches
    unsigned int ui_min;                       // untere Grenze eines Durchlaßbereiches
    unsigned int ui_max;                       // obere Grenze eines Durchlaßbereiches
    int i,k;                                   // Laufvariable
    int ready;                                 // TRUE Algorithmus fertig
    int no_min;                                // TRUE keine untere Grenze für
    // Durchlaßbereich im Bereichsstring
// Initialisierung n_range
// Wenn n_range < 0 dann sind alle Werte im Feld r_array[MAX_RANGE] ungültig!
    n_range = -1;
#ifdef DEBUGCODE
    if ((test_mod_para_str > 0) || (test_mod_range_ar > 0))
    {
        /* keyhit(); */
        printf("\n\rZerlegung Parameterstring fuer Filter (-f...)\n\r");
        printf("=============================================\n\r");
    } // if ((test_mod_para_str > 0) || (test_mod_range_ar > 0))
#endif
// Prüfung Parameterstring auf zulässige Länge
    if (strlen(fp_string) > MAX_LEN_PARA_STRING)
    {
#ifdef DEBUGCODE
        printf("\n\rFilterparameter ist zu lang (maximal %d Zeichen)!\n\r",
               MAX_LEN_PARA_STRING);
#endif
        return (FALSE);
    } // if (strlen(fp_string) > MAX_LEN_PARA_STRING)

    if (strlen(fp_string) < 1)
    {
#ifdef DEBUGCODE
        if(debug) {
            printf(ERROR_FILTERPARAMETER);
        }
#endif
        return (FALSE);
    } // if (strlen(fp_string) < 1)

    /* strcpy(rest_string, fp_string); */
    while (strlen(fp_string) > 0)
    {
#ifdef DEBUGCODE
        if (test_mod_para_str > 1) {
            printf("\n\rReststring:          %s\n\r", fp_string);
        }
#endif
        // Lese Bereichsstring
        u_char_cpy(range_string,fp_string,',');
#ifdef DEBUGCODE
        if (test_mod_para_str > 0) {
            printf("Bereichsstring:      %s\n\r",range_string);
        }
#endif

        //Auswertung Bereichsstring
        if (strlen(range_string) > 0)
        {
            // Lese Minimum
            no_min = FALSE;
            u_char_cpy(value_string,range_string,'-');
#ifdef DEBUGCODE
            if (test_mod_para_str > 1) {
                printf("Wertstring Minimum:  %s\n\r",value_string);
            }
#endif
            if (strlen(value_string) == 0)
            {
                no_min = TRUE;
                min = 0;
            } // if (strlen(value_string) == 0)
            else
#if 0
            {
                if (strlen(value_string) > 6 )
                {
                    printf("\n\rWert zu lang (maximal 6 Zeichen)!");
                    return(FALSE);
                }  // if (strlen(value_string) > 6)
                if (is_hex(value_string) == TRUE)
                {
                    min = strtol(value_string,NULL,0);
                }  // if (is_hex(value_string) == TRUE)
                else
                {
                    if (is_number(value_string) == TRUE)
                    {
                        min = atoi(value_string);
                    } // if (is_number(value_string) == TRUE)
                    else
                    {
                        printf(ERROR_FILTERPARAMETER);
                        return(FALSE);
                    } // else --> if (is_number(value_string) == TRUE)
                } // else if (is_hex(value_string) == TRUE)
            } // else --> if (strlen(value_string) == 0)
#else
                min = strtol(value_string, NULL, 0);
#endif
#ifdef DEBUGCODE
            if (test_mod_para_str > 0) {
                printf("Minimum:             %lu\n\r",min);
            }
#endif

            // Lese Maximum
            if (strchr(range_string,'-') == NULL)
            {
                max = min;
#ifdef DEBUGCODE
                if (test_mod_para_str > 1)  {
                    printf("Kein Trennzeichen '-'!\n\r");
                }
#endif
            } // if (strchr(range_string,'-') == NULL)
            else
            {
                a_char_cpy(value_string,range_string,'-');
#ifdef DEBUGCODE
                if (test_mod_para_str > 1) {
                    printf("Wertstring Maximum:  %s\n\r",value_string);
                }
#endif
                if (strlen(value_string) == 0)
                {
                    if (no_min == TRUE)
                    {
#ifdef DEBUGCODE
                        printf(ERROR_FILTERPARAMETER);
#endif
                        return(FALSE);
                    } // if (no_min == TRUE)
                    else
                    {
                        max = MAX_UINT;
                    } // else --> if (no_min == TRUE)
                } // if (strlen(value_string) == 0)
                else
#if 0
                {
                    if (strlen(value_string) > 6)
                    {
#ifdef DEBUGCODE
                        printf("\n\rWert zu lang (maximal 6 Zeichen)!");
#endif
                        return(FALSE);
                    } // if (strlen(value_string) >6)
                    if (is_hex(value_string) == TRUE)
                    {
                        max = strtol(value_string,NULL,0);
                    } // if (is_hex(value_string) == TRUE)
                    else
                    {
                        if (is_number(value_string) == TRUE)
                        {
                            max = atoi(value_string);
                        } // if (is_number(value_string) == TRUE)
                        else
                        {
                            printf(ERROR_FILTERPARAMETER);
                            return(FALSE);
                        } // else --> if (is_number(value_string) == TRUE)
                    } // else --> if (is_hex(value_string) == TRUE)
                } // else --> if (strlen(value_string) == 0)
#else
                    max = strtol(value_string, NULL, 0);
#endif
            } // else --> if (strchr(range_string,'-') == NULL)
#ifdef DEBUGCODE
            if (test_mod_para_str > 0) {
                printf("Maximum:             %lu\n\r",max);
            }
#endif
        } // if (strlen(range_string) > 0)
        else
        {
            printf(ERROR_FILTERPARAMETER);
            return(FALSE);
        } // else --> if (strlen(range_string) > 0)

        // Test Minimum und Maximum
        if (min > MAX_UINT)
        {
            printf("\n\rWert zu gross (Minimum > %u oder 0x%X)!",0xFFFF,0xFFFF);
            return(FALSE);
        } // if (min > MAX_UINT)
        if (max > MAX_UINT)
        {
            printf("\n\rWert zu gross (Maximum > %u oder 0x%X)!",0xFFFF,0xFFFF);
            return(FALSE);
        } // if (max > MAX_UINT)
        if (min > max)
        {
            printf("\nBereichsfehler (Minimum > Maximum)!");
            return(FALSE);
        } // if (min > max)

        //Max und Min in Bereichsfeld r_array[MAX_RANGE] eintragen
        ui_min = (unsigned int) min;
        ui_max = (unsigned int) max;
        if (n_range == -1)
        {
            // noch kein Eintrag im Feld vorhanden
            r_array[0].min = ui_min;
            r_array[0].max = ui_max;
            n_range = 0;
        } // if (n_range == -1)
        else
        {
            if (n_range < MAX_RANGE)
            {
                n_range++;
                r_array[n_range].min = ui_min;
                r_array[n_range].max = ui_max;
            } // if (n_range < MAX_RANGE)
            else
            {
                printf("\nPrameterstring enthaelt zuviele Bereiche!");
                return(FALSE);
            } // else --> if (n_range < MAX_RANGE)
        } // else --> if (n_range == -1)

        // Entferne ausgewerteten Bereichsstring
        strcpy(string,fp_string);
        a_char_cpy(fp_string,string,',');
#ifdef DEBUGCODE
        if (test_mod_para_str > 0) {
            /* keyhit(); */
        }
#endif
    } // while (strlen(fp_string) > 0)

// Sortieren und Ordnen des Feldes r_array[k]
// Das Sortieren gewährleistet, daß r_array[k].min < r_array[k+1].min
// für alle 0 <= k <= n_range gilt.
// Es dürfen sich keine Bereiche überlappen.

#ifdef DEBUGCODE
    if (test_mod_range_ar > 1)
    {
        printf("\nFilterbereiche sortieren\n");
        printf("------------------------\n");
        f_array_h();
        /* keyhit(); */
    } // if (test_mod_range_ar > 1)
#endif

    if (n_range > 0)
    {
        // Das Feld muß nur dann sortiert werden, wenn mehr als ein
        // Bereich eingetragen ist
        // exchange sort, bubblesort
        do
        {
            ready = TRUE;
            for (k=0; k<n_range; k++)
            {
                if (r_array[k].min > r_array[k+1].min)
                {
                    //  r_array[k].min > r_array[k+1].min
                    //  Plätze tauschen
                    ui_min = r_array[k].min;
                    ui_max = r_array[k].max;
                    r_array[k].min = r_array[k+1].min;
                    r_array[k].max = r_array[k+1].max;
                    r_array[k+1].min = ui_min;
                    r_array[k+1].max = ui_max;
                    ready = FALSE;
                } // if (r_array[k].min > r_array[k+1].min)
            } // for (k=0;k<n_range;k++)
        } // do
        while (ready == FALSE);

#ifdef DEBUGCODE
        if (test_mod_range_ar > 1) {
            printf("\nFilterbereiche sortiert:\n");
            f_array_h();
            /* keyhit(); */
        } // if (test_mod_range_ar > 1)
        // Zusammenfasen der Bereiche
        if (test_mod_range_ar > 0) {
            printf("\nZusammenfassen Filterbereichen\n");
            printf("-----------------------------\n\n");
            f_array_h();
        } // if (test_mod_range_ar > 0)
#endif
        k = 0;
        ready = FALSE;
        while (ready == FALSE)
        {
            if ( r_array[k+1].max > r_array[k].max)
            {
                // Fall 1
                //            |---------|     Bereich  k
                //            |..........|    Bereich  k+1
                //            |...............|
                //                 |.....|
                //                 |..........|
                //                      |.....|
                //                       |....|
                //                             |....|
                if (r_array[k+1].min > (r_array[k].max + 1))
                {
#ifdef DEBUGCODE
                    if (test_mod_range_ar > 0) {
                        printf("-->Fall 1.1 k = %d n_range= %d Bereich %d und %d sind getrennt (**fertig**)!\n", k, n_range, k, k+1);
                    }
#endif
                    // Fall 1.1
                    //            |---------|         Bereich  k
                    //                         |....| Bereich  k+1
                    k++;
                    if (k == n_range)
                    {
                        ready = TRUE;
                    } // if (k == n_range)
                } // if (r_array[k+1].min > (r_array[k].max + 1))
                else
                {
#ifdef DEBUGCODE
                    if (test_mod_range_ar > 0) {
                        printf("--> Fall 1.2 k = %d n_range= %d Bereich %d und %d zusammenfassen!\n", k, n_range, k, k+1);
                    }
#endif
                    // Fall 1.2
                    //            |---------|     Bereich  k
                    //            |..........|    Bereich  k+1
                    //            |...............|
                    //                 |.....|
                    //                 |..........|
                    //                      |.....|
                    //                       |....|
                    r_array[k].max = r_array[k+1].max;
                    i = k + 1;
                    while (i < n_range)
                    {
                        r_array[i].min = r_array[i+1].min;
                        r_array[i].max = r_array[i+1].max;
                        i++;
                    } //  while (i < n_range)
                    n_range = n_range - 1;
                    k = 0;
                } // else --> if (r_array[k+1].min > (r_array[k].max + 1))
            } // if ( r_array[k+1].max > r_array[k].max)
            else
            {
#ifdef DEBUGCODE
                if (test_mod_range_ar > 0) {
                    printf("--> Fall 2   k = %d n_range= %d Bereich %d und %d zusammenfassen!\n", k, n_range, k, k+1);
                }
#endif
                // Fall 2
                //            |---------|     Bereich  k
                //            |.........|     Bereich  k+1
                //            |........|
                i = k + 1;
                while (i < n_range)
                {
                    r_array[i].min = r_array[i+1].min;
                    r_array[i].max = r_array[i+1].max;
                    i++;
                } // while (i < n_range)
                n_range = n_range - 1;
                k = 0;
            } // else --> if ( r_array[k+1].max > r_array[k].max)
#ifdef DEBUGCODE
            if (test_mod_range_ar > 0) {
                /* keyhit(); */
                printf("Ergebnisse: \n");
                printf("k = %d n_range= %d\n", k, n_range);
                f_array_h();
            } // if (test_mod_range_ar > 0)
#endif
        } // while (ready == FALSE)
    } // if (n_range > 0)


#ifdef DEBUGCODE
    f_array_h();
#endif
    return(TRUE);

} // read_fp_string(char *fp_string)