This repository has been archived on 2025-09-14. You can view files and clone it, but cannot push or open issues or pull requests.
Files
tango-kni/kni_ratelimit.c

123 lines
2.9 KiB
C

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include "kni_entry.h"
#include "kni_sendlog.h"
#include "kni_ratelimit.h"
char kni_judge_droppkt(int molecule,int denominator)
{
int i = random() % denominator;
if(i < molecule)
{
return APP_STATE_DROPPKT;
}
return APP_STATE_FAWPKT;
}
int kni_get_ratelimit(int cfg_id,struct kni_ratelimit_info* ratelimit_info,int ser_def_len,char* service_defined)
{
int i= 0;
int molecule_len = 0;
char* value = NULL;
char* molecule = NULL;
char* tmp = NULL;
tmp = kni_memncasemem(service_defined, ser_def_len,(char*)"Droprate=", strlen("Droprate="));
if(tmp == NULL)
{
MESA_handle_runtime_log(g_kni_comminfo.logger,RLOG_LV_FATAL,"RATELIMIT","service defined error!cfg_id:%d,region:%s",cfg_id,service_defined);
return -1;
}
value = kni_memncasemem(service_defined, ser_def_len,(char*)"=", strlen("="));
if(value == NULL)
{
MESA_handle_runtime_log(g_kni_comminfo.logger,RLOG_LV_FATAL,"RATELIMIT","service defined error!cfg_id:%d,region:%s",cfg_id,service_defined);
return -1;
}
value = value + 1;
if((value != NULL) && (value[0] == 1) && (value[1] == '.'))
{
ratelimit_info->denominator = 1;
ratelimit_info->molecule = 1;
return 0;
}
molecule = kni_memncasemem(service_defined, ser_def_len,(char*)".", strlen("."));
if(molecule == NULL)
{
MESA_handle_runtime_log(g_kni_comminfo.logger,RLOG_LV_FATAL,"RATELIMIT","service defined error!cfg_id:%d,region:%s",cfg_id,service_defined);
return -1;
}
molecule = molecule + 1;
if((molecule != NULL))
{
molecule_len = strlen(molecule) - 1;
ratelimit_info->denominator = 1;
for(i=0;i<=molecule_len;i++)
{
ratelimit_info->denominator *= 10;
}
ratelimit_info->molecule = atoi(molecule);
}
return 0;
}
char kni_process_ratelimit(int thread_seq,const struct streaminfo* pstream,const void* a_packet,struct kni_pme_info* pmeinfo)
{
if((pmeinfo == NULL) || (g_kni_switch_info.ratelimit_switch == 0))
{
return APP_STATE_DROPME;
}
kni_filestate2_set(thread_seq,FS_RATELIMIT_UDP,0,1);
char ret = APP_STATE_GIVEME;
struct kni_ratelimit_info* ratelimit_info = &(pmeinfo->ratelimit_info);
struct kni_log sendlog_msg;
if((ratelimit_info->denominator == 0) && (ratelimit_info->molecule == 0))
{
if(kni_get_ratelimit(pmeinfo->cfg_id,ratelimit_info,pmeinfo->ser_def_len,pmeinfo->service_defined) < 0)
{
kni_log_debug(RLOG_LV_FATAL,(char*)"RATELIMIT",a_packet,(char*)"kni_get_ratelimit error");
return APP_STATE_DROPME;
}
sendlog_msg.stream = pstream;
sendlog_msg.result = pmeinfo->maat_result;
sendlog_msg.result_num = pmeinfo->maat_result_num;
kni_send_log(&sendlog_msg,NULL,NULL);
kni_log_debug(RLOG_LV_INFO,(char*)"RATELIMIT",a_packet,(char*)"config_id:%d,molecule:%d,denominator:%d",pmeinfo->cfg_id,ratelimit_info->molecule,ratelimit_info->denominator);
}
ret = kni_judge_droppkt(ratelimit_info->molecule,ratelimit_info->denominator);
return ret;
}