Exemple #1
0
int Active_ForceDropAction(Packet *p)
{
    if ( !IsIP(p) )
        return 0;

    // explicitly drop packet
    Active_ForceDropPacket();

    switch ( GET_IPH_PROTO(p) )
    {
        case IPPROTO_TCP:
        case IPPROTO_UDP:
            Active_DropSession();
            _Active_ForceIgnoreSession(p);
    }
    return 0;
}
static void UpdateFlows(char * src_ip, char * dst_ip, uint16_t src_port, uint16_t dst_port, uint16_t proto, uint32_t seq_number, long sec, long usec, char * payload, uint16_t payload_size, uint16_t hash_value, Packet *p)
{
	//printf("UpdateFlows\n");
	FlowRecord * ite_record = hash_table[hash_value].hash_flow_header;
	//the first node in the index
	if(ite_record == NULL)
	{
		FlowRecord * new_record = (FlowRecord *)malloc(sizeof(FlowRecord));
		new_record->pkt_entropy[0] = AboveEntropy(payload, payload_size);
		if(payload_size > 16)
		{
			new_record->have_payload = 1;
		}
		else
		{
			new_record->have_payload = 0;
		}
		new_record->packet_count = 1;
		new_record->labeled = -1;
		strcpy(new_record->src_ip, src_ip);
		strcpy(new_record->dst_ip, dst_ip);
		new_record->proto = proto;
		new_record->first_sec = sec;
		new_record->first_usec = usec;
		new_record->src_port = src_port;
		new_record->dst_port = dst_port;
		new_record->last_sec = sec;
		new_record->last_usec = usec;
		new_record->prev = NULL;
		new_record->next = NULL;
		hash_table[hash_value].hash_flow_header = new_record;
		return;
	}

	while(1)
	{
		//find the right record
		if( ( (proto == ite_record->proto) && (strcmp(ite_record->src_ip, src_ip) == 0)&&(strcmp(ite_record->dst_ip, dst_ip) == 0)&&(ite_record->src_port == src_port)&&(ite_record->dst_port == dst_port) ) ||
		( (strcmp(ite_record->src_ip, dst_ip) == 0)&&(strcmp(ite_record->dst_ip, src_ip) == 0)&&(ite_record->src_port == dst_port)&&(ite_record->dst_port == src_port) && (proto == ite_record->proto) ) )
		{
			if(ite_record->labeled == -1)
			{
				if(ite_record->packet_count < PKTSPERFLOW)
				{
					ite_record->pkt_entropy[ite_record->packet_count] = AboveEntropy(payload, payload_size);
				}
				if(ite_record->packet_count == PktsLimit)
				{
					//printf("Decide\n");
					DecideHighEntropyFlow(ite_record);	
				}
				if(payload_size > 0)
				{
					ite_record->have_payload = 1;
				}
			}
			else if(ite_record->labeled == 1)
			{
				//printf("Drop packet\n");
				DisableAllDetect(p);
				Active_DropSession(p);
			}
			ite_record->packet_count++;
			ite_record->last_sec = sec;
			ite_record->last_usec = usec;
			return;
		}
		if(ite_record->next != NULL)
		{
			ite_record = ite_record->next;
		}
		else
		{
			break;
		}
	}
	FlowRecord * new_record = (FlowRecord *)malloc(sizeof(FlowRecord));
	new_record->pkt_entropy[0] = AboveEntropy(payload, payload_size);
	new_record->packet_count = 1;
	if(payload_size > 0)
	{
		new_record->have_payload = 1;
	}
	else
	{
		new_record->have_payload = 0;
	}
	new_record->labeled = -1;
	strcpy(new_record->src_ip, src_ip);
	strcpy(new_record->dst_ip, dst_ip);
	new_record->src_port = src_port;
	new_record->dst_port = dst_port;
	new_record->proto = proto;
	new_record->first_sec = sec;
	new_record->first_usec = usec;
	new_record->last_sec = sec;
	new_record->last_usec = usec;
	new_record->prev = ite_record;
	new_record->next = NULL;
	ite_record->next = new_record;
}