FreeBSD里面的media status(2022/8/1)
在FreeBSD的Linux系统中,使用ifconfig命令会看到这样的信息:
media: Ethernet autoselect (100baseTX )
media: Ethernet autoselect (1000baseT )
media: Ethernet autoselect (10Gbase-SR )
media: Ethernet autoselect <full-duplex,rxpause,txpause> (25GBase-CR <full-duplex,rxpause>)
media: Ethernet autoselect <full-duplex,rxpause,txpause> (40Gbase-SR4 <full-duplex,rxpause,txpause>)
media: Ethernet autoselect <full-duplex,rxpause,txpause> (100GBase-CR4 <full-duplex,rxpause>)
100BASE-T是IEEE定义的以速度100Mbps传输的非屏蔽双绞线电缆及其以太网的各个方面的标准。以此类推:
10baseT的传输速率是10Mbps, 即1.25MB/sec
100baseT为100Mbps,即12.5MB/sec
1000baseT为1000Mbps, 即125MB/sec
10Gbase为10,000Mbps, 即1250MB/sec
40Gbase为40,000Mbps,即12.2GB/sec
100Gbase为100,000Mbps,即122GB/sec
注意:
注意,网卡的这个属性是和其所连接的交换机协商的结果,可能我们的网卡是1000base的,但是连接的交换机的口是100base的,或者网线是100base的,那么可能刚刚启动的时候,运行ifconfig会看到是1000base的,但是数据量多一点,就会改为100base的了。注意更换网口或者相匹配的网线即可修复。
参考:https://www.cnblogs.com/awpatp/p/14261899.html
代码里面有关这方面的代码是:
一:
bnxt_def_cp_task
bnxt_handle_async_event
bnxt_media_status
bnxt_get_baudrate
ifmedia_baudrate
bnxt_report_link(iflib_link_state_change, ifmedia_removeall
bnxt_add_media_types,ifmedia_set)
bnxt_update_link(bnxt_hwrm_port_phy_qcfg)
二:
bnxt_media_change
bnxt_hwrm_set_link_setting;
bnxt_media_status;
这里的media和status的设置是在bnxt_attach_post函数里完成的,
该函数首先bnxt_probe_phy,bnxt_update_link一个个函数的调用,最终会调用到bnxt_hwrm_port_phy_qcfg查询链路的状态,然后得到一个的信息,最终通过 bnxt_add_media_types(softc);和
ifmedia_set(softc->media, IFM_ETHER | IFM_AUTO);两个函数设置
media和status。如果插入模块以后bnxt_attach_post函数是必然会被执行的。
而这个函数bnxt_media_status是更新media和status的状态,它们最终是通过调用bnxt_report_link函数,而bnxt_report_link函数里面也是通过掉到bnxt_hwrm_port_phy_qcfg查询链路的状态,然后调用iflib_link_state_change改变链路的状态,同时,会移除用来的media值,然后还是一样再次bnxt_add_media_types和设置ifmedia_set。。
这个函数(bnxt_media_status)应该是每隔一段事件会调用一次,从而不间断的查询链路的状态,然后将他们的值实时的反应出来。
而bnxt_media_change函数就是去设置链路的状态,他通过bnxt_hwrm_set_link_setting函数去设置的。设置完以后会去调用
bnxt_media_status该函数,该函数里面其实就是先查询,因为我刚刚设置了,我得知道我有没有设置成功吧,查询完了以后呢?在通过iflib那边的几个函数,iflib_link_state_change, ifmedia_removeall
,bnxt_add_media_types,ifmedia_set 把这设置,下去,然后程序到的值更新到iflib那边去。。。这样我就可以达到我的目的了,即改变链路的设置。
总结:其实概况下来主要有3步。
第一步,初始化的时候对链路状态进行查询。
第二步是,每隔一段时间的查询。
第三步是,我想去改变链路的设置。
设置和查询的接口分别是,bnxt_hwrm_set_link_setting,bnxt_hwrm_port_phy_qcfg。
FreeBSD里面的media status相关函数深入研究(2022/8/3)
经过不懈的努力,现在使用ifconfig时可以看到驱动已经成功的挂载上去了。。
但是,现在代码是写死了,所以在media和status哪里只是显示一些默认的值,现在需要花几天的时间完善这些工作,后面再到收发包相关的工作。
go go go !!!
查询链路状态当中,最主要用到的字段含义为:
link:当前的链路状态(0,1,2,,可以正常检测到值是2)
link_speed:(当前的链路速度)
duplex_cfg:(0,1 全双工和半双工模式)
pause:(取值为0,1, this value represents the autoneg results of pause configuration)
support_speeds:(控制器支持的链路速度,如果支持,相应的位会被置为1)
force_link_speeds:()
auto_mode:(取值为,0,1,2,一般值应该是2)
auto_pause:(取值为,0,1,2,)
auto_link_speed:(这个字段仅在auto_mode设置位2时,设置才有效)
auto_link_speed_mask:
media_type:(0-unknown, 1-tp, 2-dac, 3-fibre)
preemphasis:(current setting for preemphasis)
xcvr_pkg_type:(收发器类型,取值为1和2)
eee_config_phy_addr:(0-4,5-7是eee相关的配置)