码迷,mamicode.com
首页 > 其他好文 > 详细

限速模块相关函数

时间:2014-10-13 16:03:39      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:io   ar   for   sp   on   cti   amp   时间   ef   

注意:

1: userInfo表的isActive值并不是即时更新的而是在userInfo表满的情况下, 新进skb没有找到1==isActive且mac地址相同条目时才会去更新表的isActive值。

 

1: 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];

        (3)限速模块户口函数hook地址赋值:

                usermgmt_isallowforward_hook = userMgmt_isAllowForward;

        (4) setmark_hook地址赋值:

                usermgmt_setmark_hook = userMgmt_setMark;

 

2:  int userMgmt_enable( int isBandwidthLimitEnable);

    调用: board_ioctl在设置限速功能开启关闭时调用;

    作用:

        (1) 当限速功能开启时: usermgmt_isallowforward_hook = userMgmt_isAllowForward;

        (2) 当限速功能关闭时: usermgmt_isallowforward_hook = NULL;

 

3: 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;

                         userMgmt_getBwLimitByIfName(&(userInfoPtr->upBwLimit),

                                                                      &(userInfoPtr->downBwLimit),
                                                                      skb->dev->name);

                    }

                }

 

限速模块相关函数

标签:io   ar   for   sp   on   cti   amp   时间   ef   

原文地址:http://www.cnblogs.com/gavinwu/p/4021948.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!