限速模組相關函式

2022-03-06 02:46:14 字數 3214 閱讀 9863

注意:

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...