unsigned long int g_tx_port[16] = {0};
/*******
speed: 1Mb is 1*1000*1000bit
bytes: tx pkt bytes
*******/
int speed_limit(unsigned long speed, int port_id, unsigned int bytes)
{
unsigned long cycles_speed = speed / HZ;
unsigned long diff_cycles = 0;
unsigned long cur_cycles = 0;
static unsigned long last_tsc[16] = {0};
cur_cycles = jiffies;
if(last_tsc[port_id] == 0)
{
last_tsc[port_id] = cur_cycles;
g_tx_port[port_id] = cycles_speed;
goto label;
}
diff_cycles = cur_cycles - last_tsc[port_id];
last_tsc[port_id] = cur_cycles;
g_tx_port[port_id] += cycles_speed * diff_cycles;
if(g_tx_port[port_id] > speed)
{
g_tx_port[port_id] = speed;
}
while(g_tx_port[port_id] < bytes * 8)
{
cur_cycles = jiffies;
diff_cycles = cur_cycles - last_tsc[port_id];
last_tsc[port_id] = cur_cycles;
g_tx_port[port_id] += cycles_speed * diff_cycles;
if(g_tx_port[port_id] > speed)
{
g_tx_port[port_id] = speed;
}
}
g_tx_port[port_id] -= bytes * 8;
label:
return 0;
}
版权声明:本文为nuanmin原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。