#!/bin/sh
while :
do
ifconfig eth0 up
sleep 3
cat /sys/class/net/eth0/carrier
ifconfig eth0 down
done
我在这里是一直稳定为1,即使sleep 1。网卡是 Realtek RTL-8139。
> 如果使用 ifconfig, ip addr去设置ip 的话也会在一段时间产生这种游离的状态。这样会发生很多意想不到的问题,例如:
> 你认为Link 是up 的,但实际读出来是down;你认为某些服务紧接着起来是正常的,其实它的socket并没有去侦探端口,等等。
>
> 应用层向内核模块发送命令就了事了,并不等待它的返回。
>
> 有没有其他方法可以更有效些?
我自己看的一些网卡驱动会监听硬件寄存器来发现carrier的状态,如果发生改变就会报告上层(netif_carrier_on 和
netif_carrier_off)。
内核会记录下接口的上报。
那个ifup eth0 包含两个动作,第一个是驱动相关的netdev->open,第二个是驱动无关的设置地址。比如你open的时候可能需要初始化网卡DMA等等,那么你就需要短时间的网卡复位等等。
因此个人认为链路状态是网卡驱动做的事情,内核没有稳定的方法来获得。
--
MSN/GTalk: izhangxc[AT]gmail.com
只是你频繁操作 ifconfig
up/dow,会导致网卡不断open/close,底下就是网卡的MAC/PHY要不断init/reset。估计你们的PHY都是用自动协商速度的,所以LINK
UP/DOWN是不太确定的。
此外,如果你操作的网卡连接到交换机,交换机开启了Spanning Tree,别说3秒了,20秒后可能还是LINK DOWN!
--
Regards
Anders
��������һ��
>> ���ʹ�� ifconfig, ip addrȥ����ip �Ļ�Ҳ����һ��ʱ��������������״̬������ᷢ��ܶ����벻�������⣬���磺
>> ����ΪLink ��up �ģ���ʵ�ʶ�������down������ΪijЩ�����������������ģ���ʵ���socket��û��ȥ��̽�˿ڣ��ȵȡ�
>>
>> Ӧ�ò����ں�ģ�鷢������������ˣ������ȴ���ķ��ء�
>>
>> ��û���������Ը���ЧЩ��
> ���Լ�����һЩ��������Ӳ���Ĵ���������carrier��״̬�������ı�ͻᱨ���ϲ�(netif_carrier_on ��
> netif_carrier_off)��
> �ں˻��¼�½ӿڵ��ϱ���
>
> �Ǹ�ifup eth0 ��������������һ��������ص�netdev->open���ڶ��������ص����õ�ַ��������open��ʱ�������Ҫ��ʼ����DMA�ȵȣ���ô�����Ҫ��ʱ�����λ�ȵȡ�
>
> ��˸�����Ϊ��·״̬�������������飬�ں�û���ȶ��ķ�������á�
>
只是你频繁操作 ifconfig
up/dow,会导致网卡不断open/close,底下就是网卡的MAC/PHY要不断init/reset。估计你们的PHY都是用自动协商速度的,所以LINK
UP/DOWN是不太确定的。
此外,如果你操作的网卡连接到交换机,交换机开启了Spanning Tree,别说3秒了,20秒后可能还是LINK DOWN!