• 话说10g光口不能down


    今天遇到一个问题:对 10g 光口 执行“ifconfig ethx down” 时 发现内核接口down了;ethtool ethx 时 发现 link detect 为 no;但是其协商速率为10000Mb/s;

    同时查看盒子面板,发现link 指示灯是亮的。

    问题就是:“down 端口结果  端口在物理链路上没有down”

    首先确定ifconfig 命令没有出错; 同时dmesg 发现内核没有相关错误;那就只能strace 了

    strace 结果如下:

    ioctl(4, SIOCGIFFLAGS, {ifr_name="eth22", ifr_flags=IFF_UP|IFF_BROADCAST|IFF_RUNNING|IFF_MULTICAST}) = 0
    ioctl(4, SIOCSIFFLAGS, {ifr_name="eth22", ifr_flags=IFF_BROADCAST|IFF_RUNNING|IFF_MULTICAST}) = 0

    也就是去掉了IFF_UP标志:

    那对应内核执行过程是怎样的呢?

    通过 ioctl 系统调用SIOCSIFFLAGS 查找对应代码:

    */
    
    int dev_ioctl(struct net *net, unsigned int cmd, void __user *arg)
    {---------------------
    
        /*
         *    These ioctl calls:
         *    - require superuser power.
         *    - require strict serialization.
         *    - do not return a value
         */
        case SIOCSIFFLAGS:
        case SIOCSIFMETRIC:
        case SIOCSIFMTU:
    -----------------------
            dev_load(net, ifr.ifr_name);
            rtnl_lock();
            ret = dev_ifsioc(net, &ifr, cmd);
            rtnl_unlock();
            return ret;
    
        ------------------------------------
    }
    View Code

    根据SIOCSIFFLAGS 条件会调用dev_ifsioc 最后

    dev_ifsioc(net, &ifr, cmd)->
    
          dev_change_flags(dev, ifr->ifr_flags)-> 
    
               __dev_change_flags(dev, flags);

    __dev_change_flags 中根据 dev状态来执行是否需要dev_close or dev_open

    if ((old_flags ^ flags) & IFF_UP) {    /* Bit is different  ? */
            ret = ((old_flags & IFF_UP) ? __dev_close : __dev_open)(dev);
    
            if (!ret)
                dev_set_rx_mode(dev);
        }

    以dev_close为例:其核心函数为

    const struct net_device_ops *ops = dev->netdev_ops;
    
            /*
             *    Call the device specific close. This cannot fail.
             *    Only if device is UP
             *
             *    We allow it to be called even after a DETACH hot-plug
             *    event.
             */
            if (ops->ndo_stop)
                ops->ndo_stop(dev);
    
            dev->flags &= ~IFF_UP;
            net_dmaengine_put();

    执行设备的ops 其对应函数为:

    static const struct net_device_ops i40e_netdev_ops = {
        .ndo_open        = i40e_open,
        .ndo_stop        = i40e_close,
    ------------------------------------------------
    }

    也就是 最后会执行 设备驱动对应的nedev_ops close 函数 

    遇到这个问题 也就只能 继续分析设备驱动了!!!!!!

    继续看网卡的pr文档吧!!----明天看吧----

     

    看了好长时间pr文档头都大了!!

    突然想到: 别的igb 驱动能够down掉1g 光口,就去看了一下igb的close回调,发现确实会去rw 寄存器;也就是说10g 光口驱动没有操作对应寄存器??

    看了一下 10g光口驱动的open 函数,他能将接口up 说明其会对某写寄存器写数据;看代码过程中看到了i40e_force_link_state

    再看close 函数;发现也会调用i40e_force_link_state,但是调用i40e_force_link_state是有条件的,难道是由于这些条件导致的??

    仔细看了一下代码;修修改改!!!解决了!!然后对这个驱动还是不很了解!!管它呢 解决问题最重要!等有时间在回头看吧!!!!

    希望不是忘了继续看 driver 代码---

    http代理服务器(3-4-7层代理)-网络事件库公共组件、内核kernel驱动 摄像头驱动 tcpip网络协议栈、netfilter、bridge 好像看过!!!! 但行好事 莫问前程 --身高体重180的胖子
  • 相关阅读:
    浏览器对象
    内置对象(Date String Math Array)
    事件
    流程控制语句
    数组
    控制类名(className属性)
    显示和隐藏(display属性)
    改变HTML样式
    通过ID获取元素
    【iOS 入门】网络api
  • 原文地址:https://www.cnblogs.com/codestack/p/14326735.html
Copyright © 2020-2023  润新知