注意:
1: userinfo表的isactive值並不是即時更新的而是在userinfo表滿的情況下, 新進skb沒有找到1==isactive且mac位址相同條目時才會去更新表的isactive值。
一: int usermgmt_init(void)
呼叫: 系統初始化時呼叫。
作用:(1) 分配8條bwlimitrule空間, 初始位址為bwlimitrule;
bwlimitrule bwlimitrule[user_mgmt_max_bw_limit_rule];
(2) 分配100條userinfo的空間, 初始位址為userinfo;
userinfo userinfo[user_mgmt_max_user_num];
usermgmt_isallowforward_hook = usermgmt_isallowforward;
usermgmt_setmark_hook = usermgmt_setmark;
二: int usermgmt_enable( int isbandwidthlimitenable);
呼叫: board_ioctl在設定限速功能開啟關閉時呼叫;
作用:(1) 當限速功能開啟時: usermgmt_isallowforward_hook = usermgmt_isallowforward;
(2) 當限速功能關閉時: usermgmt_isallowforward_hook = null;
三: int usermgmt_isallowforward(struct sk_buff *skb; int direction; unsigned long pktjiffies);
引數說明: (1) skb;
(2) direction; 包方向, 1-uplink, 0-downlink;
(3) unsigned long pktjiffies; 包進來的時間, ptkjiffies.
呼叫: 限速功能開啟時, 在kernel, dev.c中呼叫。
作用:
isfound = 0;
firstunusedentry = -1;
(1)for (遍歷100條userinfo entry)
if (1 ==userinfo[i].isactive)
if (skbmac與userinfo[i].mac相同)
isfound = 1;
break;
表明在當前活躍的userinfo entry中找到對應的entry.
else ( 即0 == userinfo[i].isactive)
firstunusedentry = i;
(此處可優化?break)
(2)if ( 0 == isfound, 表明沒有找到1 == isactive且mac位址相同的條目)
if ( -1 == firstunusedentry) 表明(1)的遍歷沒有找到0 == isactive的條目
更新userinfo表的狀態將長時間不用entry(5s)的isactive置為0, 並且將更新表後
第一條0==isactive的entry的下標值返回給firstunusedentry, 如沒有 0 == isactive
的條目, 則返回-1。
firstunusedentry = usermgmt_refreshuserstatus();
if ( -1 != firstunusedentry) 表明在userinfo表中, 在沒有0 != isactive且mac位址相同的條目時, 找到了
0 == isactive的userinfo entry.
因為是新entry的的第乙個包所以在更新userinfo[firstunusedentry]狀態後**skb, return 0;
userinfoptr = &userinfo[firstunusedentry];
userinfoptr->isactive = 1;
此處更新userinfo[firstunusedentry]的bwlimit, 只有此處更新, 不是實時更新。
usermgmt_getbwlimitbyifname(&(userinfoptr->upbwlimit),
&(userinfoptr->downbwlimit),
skb->dev->name);
userinfo[firstunusedentry]的條目更新結束, 下面是限速和流量統計。
當 0 == bwlimit時, 只統計流量, 而不進行限速。
if (bwlimit == 0)
(*totalbtis) += ((skb->len + skb_len_delta)) ??
else
usermgmt_preforwardhandler((direction?(&userinfoptr->uplink):(&userinfoptr->downlink)),
(skb->len + skb_len_delta),
pktjiffies);
return 0;
此處的else即為-1 == firstunusedentry, 即更新過使用者表後仍然沒有0 == isactive的條目, drop
else
return -1;
此處的else對應 1 == isfound, 流量統計和限速功能可參照上面
else
獲取使用者條目, 流量統計, 限速的前期準備工作
userinfoptr = &userinfo[i];
流量統計
if ( 0 == bwlimit)
(*totalbits) += ((skb->len + skb_len_delta)*8);
return 0;
else
頻寬計算
if ( (usedmgmt_calusedbw(pktlisthead, pktjiffies) + (skb->len + skb_len_delta)*8)))
forward, 更新條目
usermgmt_preforwardhandler(pktlisthead, (skb->len + skb_len_delta), pktjiffies);
(*totalbits) += ((skb->len + skb_len_delta) * 8)
return 0;
else
{ calusedbw計算頻寬超出, drop;
return -1;
os模組相關函式
os 對系統進行操作 import os 1 system 對系統進行操作 res os.system ipconfig 檢視ip 列印亂碼 因為在windows中是gbk編碼 2 popen 執行系統命令 返回物件,通過read方法讀出字串 防止字串亂碼,使用popen進行操作 res os.po...
Nginx頻寬控制(限速模組使用)
有個老專案,通過 squid 提供檔案 功能,利用 delay parameters 實現頻寬控制,問題是我玩不轉 squid,於是盤算著是不是能在 nginx 裡找到類似的功能。好訊息是 nginx 提供了 limit r 和limit rate after,舉個例子來說明一下 複製 如下 loc...
畢設相關元件模組函式
void delay1ms unsigned int y 延時1ms,延時多少就傳多少 unsigned char ds18b20init c return1 初始化成功 外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳 img wkk2ihzx 1582043230885 image 2...