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;
}
linux 内核软件限速
Linux内核:速率限制函数实现
最新推荐文章于 2023-07-03 17:00:41 发布
该代码实现了一个速率限制函数,用于计算并限制特定端口的数据传输速率。它基于时间片(jiffies)计算周期,并更新g_tx_port变量来跟踪已传输的位数。当达到指定速度限制时,进一步的数据传输会被调整到该限制。函数还确保了在达到给定字节数传输后进行相应的减法操作。
9387

被折叠的 条评论
为什么被折叠?



