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) )
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)