2 # SPDX-License-Identifier: GPL-2.0
5 #This file has basic link layer tests for generic NIC drivers.
6 #The test comprises of auto-negotiation, speed and duplex checks.
9 #Connect the DUT PC with NIC card to partner pc back via ethernet medium of your choice(RJ45, T1)
12 #┌───────────────────────┐ ┌──────────────────────────┐
17 #│ │Interface ─┼─────────────────────────┼─ any eth Interface │
21 #└───────────────────────┘ └──────────────────────────┘
24 #Required minimum ethtool version is 6.10 (supports json)
26 #time_delay = 8 #time taken to wait for transitions to happen, in seconds.
30 from lib
.py
import ksft_run
, ksft_exit
, ksft_pr
, ksft_eq
31 from lib
.py
import KsftFailEx
, KsftSkipEx
32 from lib
.py
import NetDrvEpEnv
33 from lib
.py
import LinkConfig
35 def _pre_test_checks(cfg
: object, link_config
: LinkConfig
) -> None:
36 if link_config
.partner_netif
is None:
37 KsftSkipEx("Partner interface is not available")
38 if not link_config
.check_autoneg_supported() or not link_config
.check_autoneg_supported(remote
=True):
39 KsftSkipEx(f
"Auto-negotiation not supported for interface {cfg.ifname} or {link_config.partner_netif}")
40 if not link_config
.verify_link_up():
41 raise KsftSkipEx(f
"Link state of interface {cfg.ifname} is DOWN")
43 def verify_autonegotiation(cfg
: object, expected_state
: str, link_config
: LinkConfig
) -> None:
44 if not link_config
.verify_link_up():
45 raise KsftSkipEx(f
"Link state of interface {cfg.ifname} is DOWN")
46 """Verifying the autonegotiation state in partner"""
47 partner_autoneg_output
= link_config
.get_ethtool_field("auto-negotiation", remote
=True)
48 if partner_autoneg_output
is None:
49 KsftSkipEx(f
"Auto-negotiation state not available for interface {link_config.partner_netif}")
50 partner_autoneg_state
= "on" if partner_autoneg_output
is True else "off"
52 ksft_eq(partner_autoneg_state
, expected_state
)
54 """Verifying the autonegotiation state of local"""
55 autoneg_output
= link_config
.get_ethtool_field("auto-negotiation")
56 if autoneg_output
is None:
57 KsftSkipEx(f
"Auto-negotiation state not available for interface {cfg.ifname}")
58 actual_state
= "on" if autoneg_output
is True else "off"
60 ksft_eq(actual_state
, expected_state
)
62 """Verifying the link establishment"""
63 link_available
= link_config
.get_ethtool_field("link-detected")
64 if link_available
is None:
65 KsftSkipEx(f
"Link status not available for interface {cfg.ifname}")
66 if link_available
!= True:
67 raise KsftSkipEx("Link not established at interface {cfg.ifname} after changing auto-negotiation")
69 def test_autonegotiation(cfg
: object, link_config
: LinkConfig
, time_delay
: int) -> None:
70 _pre_test_checks(cfg
, link_config
)
71 for state
in ["off", "on"]:
72 if not link_config
.set_autonegotiation_state(state
, remote
=True):
73 raise KsftSkipEx(f
"Unable to set auto-negotiation state for interface {link_config.partner_netif}")
74 if not link_config
.set_autonegotiation_state(state
):
75 raise KsftSkipEx(f
"Unable to set auto-negotiation state for interface {cfg.ifname}")
76 time
.sleep(time_delay
)
77 verify_autonegotiation(cfg
, state
, link_config
)
79 def test_network_speed(cfg
: object, link_config
: LinkConfig
, time_delay
: int) -> None:
80 _pre_test_checks(cfg
, link_config
)
81 common_link_modes
= link_config
.common_link_modes
82 if not common_link_modes
:
83 KsftSkipEx("No common link modes exist")
84 speeds
, duplex_modes
= link_config
.get_speed_duplex_values(common_link_modes
)
86 if speeds
and duplex_modes
and len(speeds
) == len(duplex_modes
):
87 for idx
in range(len(speeds
)):
89 duplex
= duplex_modes
[idx
]
90 if not link_config
.set_speed_and_duplex(speed
, duplex
):
91 raise KsftFailEx(f
"Unable to set speed and duplex parameters for {cfg.ifname}")
92 time
.sleep(time_delay
)
93 if not link_config
.verify_speed_and_duplex(speed
, duplex
):
94 raise KsftSkipEx(f
"Error occurred while verifying speed and duplex states for interface {cfg.ifname}")
96 if not speeds
or not duplex_modes
:
97 KsftSkipEx(f
"No supported speeds or duplex modes found for interface {cfg.ifname}")
99 KsftSkipEx("Mismatch in the number of speeds and duplex modes")
102 parser
= argparse
.ArgumentParser(description
="Run basic link layer tests for NIC driver")
103 parser
.add_argument('--time-delay', type=int, default
=8, help='Time taken to wait for transitions to happen(in seconds). Default is 8 seconds.')
104 args
= parser
.parse_args()
105 time_delay
= args
.time_delay
106 with
NetDrvEpEnv(__file__
, nsim_test
=False) as cfg
:
107 link_config
= LinkConfig(cfg
)
108 ksft_run(globs
=globals(), case_pfx
={"test_"}, args
=(cfg
, link_config
, time_delay
,))
109 link_config
.reset_interface()
112 if __name__
== "__main__":