• 技术文章 >运维 >linux运维

    linux linkwatch是什么进程

    藏色散人藏色散人2023-03-14 10:30:05原创128

    linux linkwatch是“链接状态改变”进程;在linux 网络协议栈中,linkwatch模块用来通知网卡当前是否能够进行数据传输;在驱动中调用“netif_carrier_on/netif_carrier_off”函数来通知网络状态变化。

    本教程操作环境:linux5.9.8系统、Dell G3电脑。

    linux linkwatch是什么进程?

    链接状态改变(linkwatch)

    在Linux网络协议栈中linkwatch模块用来通知网卡当前是否能够进行数据传输.

    驱动中调用netif_carrier_on/netif_carrier_off函数来通知网络状态变化.

    主要作用:

    void netif_carrier_on(struct net_device *dev)
    {
             if (test_and_clear_bit(__LINK_STATE_NOCARRIER, &dev->state)) {
                       if (dev->reg_state == NETREG_UNINITIALIZED)
                                return;
                       linkwatch_fire_event(dev);
                       if (netif_running(dev))
                                __netdev_watchdog_up(dev);
             }
    }
    void netif_carrier_off(struct net_device *dev)
    {
             if (!test_and_set_bit(__LINK_STATE_NOCARRIER, &dev->state)) {
                       if (dev->reg_state == NETREG_UNINITIALIZED)
                                return ;
                       linkwatch_fire_event(dev);
             }
    }
    linwatch模块,只需要知道状态改变了,不需要知道具体是on还是off
    void linkwatch_fire_event(struct net_device *dev)
    {
       /*判断是否为紧急事件, 内核规定两次事件的间隔至少为1个HZ*/
             bool urgent = linkwatch_urgent_event(dev);
             if (!test_and_set_bit(__LINK_STATE_LINKWATCH_PENDING, &dev->state)) {
                       linkwatch_add_event(dev);//把dev添加到lweventlist链表
             } else if (!urgent)
                       return;
       /*调用工作队列linkwatch_event */
             linkwatch_schedule_work(urgent);
    }
     
    static void __linkwatch_run_queue(int urgent_only)
    {
             struct net_device *dev;
             LIST_HEAD(wrk);
             while (!list_empty(&wrk)) {
                       dev = list_first_entry(&wrk, struct net_device, link_watch_list);
                       list_del_init(&dev->link_watch_list);
          /*判断是否只执行紧急事件 */
                       if (urgent_only && !linkwatch_urgent_event(dev)) {
                                list_add_tail(&dev->link_watch_list, &lweventlist);
                                continue;
                       }       
                       spin_unlock_irq(&lweventlist_lock);
                       linkwatch_do_dev(dev);
                       spin_lock_irq(&lweventlist_lock);
             }
             if (!list_empty(&lweventlist)){
                       linkwatch_schedule_work(0);
             }
             spin_unlock_irq(&lweventlist_lock);
    }
     
    static void linkwatch_do_dev(struct net_device *dev)
    {
             rfc2863_policy(dev);
             if (dev->flags & IFF_UP) {
                       if (netif_carrier_ok(dev))
                                dev_activate(dev);//启动tx队列流量控制功能
                       else
                                dev_deactivate(dev);//禁止tx队列流量控制功能
                       netdev_state_change(dev);//发起Netlink事件:NETDEV_CHANGE
             }
             dev_put(dev);
    }

    相关推荐:《Linux视频教程

    以上就是linux linkwatch是什么进程的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:linkwatch linux
    上一篇:linux查看有几个分区 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • linux用lvm吗• linux可以装安卓软件吗• linux mysql启动用什么权限• linux localhost是什么意思• linux ftp 530什么意思
    1/1

    PHP中文网