首页 > 其他 > 详细

话说10g光口不能down

时间:2021-01-25 19:04:31      阅读:31      评论:0      收藏:0      [点我收藏+]

今天遇到一个问题:对 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文档吧

 

话说10g光口不能down

原文:https://www.cnblogs.com/codestack/p/14326735.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!