Lines Matching +full:force +full:- +full:internal +full:- +full:phy
1 // SPDX-License-Identifier: GPL-2.0
12 #include <linux/phy.h>
66 size = attr->size + NET_TEST_PKT_SIZE; in net_test_get_skb()
68 if (attr->tcp) in net_test_get_skb()
73 if (attr->max_size && attr->max_size > size) in net_test_get_skb()
74 size = attr->max_size; in net_test_get_skb()
80 prefetchw(skb->data); in net_test_get_skb()
85 skb_set_network_header(skb, skb->len); in net_test_get_skb()
88 skb_set_transport_header(skb, skb->len); in net_test_get_skb()
89 if (attr->tcp) in net_test_get_skb()
94 eth_zero_addr(ehdr->h_dest); in net_test_get_skb()
96 if (attr->src) in net_test_get_skb()
97 ether_addr_copy(ehdr->h_source, attr->src); in net_test_get_skb()
98 if (attr->dst) in net_test_get_skb()
99 ether_addr_copy(ehdr->h_dest, attr->dst); in net_test_get_skb()
101 ehdr->h_proto = htons(ETH_P_IP); in net_test_get_skb()
103 if (attr->tcp) { in net_test_get_skb()
105 thdr->source = htons(attr->sport); in net_test_get_skb()
106 thdr->dest = htons(attr->dport); in net_test_get_skb()
107 thdr->doff = sizeof(struct tcphdr) / 4; in net_test_get_skb()
109 uhdr->source = htons(attr->sport); in net_test_get_skb()
110 uhdr->dest = htons(attr->dport); in net_test_get_skb()
111 uhdr->len = htons(sizeof(*shdr) + sizeof(*uhdr) + attr->size); in net_test_get_skb()
112 if (attr->max_size) in net_test_get_skb()
113 uhdr->len = htons(attr->max_size - in net_test_get_skb()
115 uhdr->check = 0; in net_test_get_skb()
118 ihdr->ihl = 5; in net_test_get_skb()
119 ihdr->ttl = 32; in net_test_get_skb()
120 ihdr->version = 4; in net_test_get_skb()
121 if (attr->tcp) in net_test_get_skb()
122 ihdr->protocol = IPPROTO_TCP; in net_test_get_skb()
124 ihdr->protocol = IPPROTO_UDP; in net_test_get_skb()
125 iplen = sizeof(*ihdr) + sizeof(*shdr) + attr->size; in net_test_get_skb()
126 if (attr->tcp) in net_test_get_skb()
131 if (attr->max_size) in net_test_get_skb()
132 iplen = attr->max_size - sizeof(*ehdr); in net_test_get_skb()
134 ihdr->tot_len = htons(iplen); in net_test_get_skb()
135 ihdr->frag_off = 0; in net_test_get_skb()
136 ihdr->saddr = htonl(attr->ip_src); in net_test_get_skb()
137 ihdr->daddr = htonl(attr->ip_dst); in net_test_get_skb()
138 ihdr->tos = 0; in net_test_get_skb()
139 ihdr->id = 0; in net_test_get_skb()
143 shdr->version = 0; in net_test_get_skb()
144 shdr->magic = cpu_to_be64(NET_TEST_PKT_MAGIC); in net_test_get_skb()
145 attr->id = net_test_next_id; in net_test_get_skb()
146 shdr->id = net_test_next_id++; in net_test_get_skb()
148 if (attr->size) { in net_test_get_skb()
149 void *payload = skb_put(skb, attr->size); in net_test_get_skb()
151 memset(payload, 0, attr->size); in net_test_get_skb()
154 if (attr->max_size && attr->max_size > skb->len) { in net_test_get_skb()
155 size_t pad_len = attr->max_size - skb->len; in net_test_get_skb()
161 skb->csum = 0; in net_test_get_skb()
162 skb->ip_summed = CHECKSUM_PARTIAL; in net_test_get_skb()
163 if (attr->tcp) { in net_test_get_skb()
164 int l4len = skb->len - skb_transport_offset(skb); in net_test_get_skb()
166 thdr->check = ~tcp_v4_check(l4len, ihdr->saddr, ihdr->daddr, 0); in net_test_get_skb()
167 skb->csum_start = skb_transport_header(skb) - skb->head; in net_test_get_skb()
168 skb->csum_offset = offsetof(struct tcphdr, check); in net_test_get_skb()
170 if (attr->bad_csum) { in net_test_get_skb()
171 /* Force mangled checksum */ in net_test_get_skb()
177 if (thdr->check != CSUM_MANGLED_0) in net_test_get_skb()
178 thdr->check = CSUM_MANGLED_0; in net_test_get_skb()
180 thdr->check = csum16_sub(thdr->check, in net_test_get_skb()
184 udp4_hwcsum(skb, ihdr->saddr, ihdr->daddr); in net_test_get_skb()
187 skb->protocol = htons(ETH_P_IP); in net_test_get_skb()
188 skb->pkt_type = PACKET_HOST; in net_test_get_skb()
189 skb->dev = ndev; in net_test_get_skb()
199 struct net_test_priv *tpriv = pt->af_packet_priv; in net_test_loopback_validate()
200 const unsigned char *src = tpriv->packet->src; in net_test_loopback_validate()
201 const unsigned char *dst = tpriv->packet->dst; in net_test_loopback_validate()
214 if (skb_headlen(skb) < (NET_TEST_PKT_SIZE - ETH_HLEN)) in net_test_loopback_validate()
219 if (!ether_addr_equal_unaligned(ehdr->h_dest, dst)) in net_test_loopback_validate()
224 if (!ether_addr_equal_unaligned(ehdr->h_source, src)) in net_test_loopback_validate()
229 if (tpriv->double_vlan) in net_test_loopback_validate()
232 if (tpriv->packet->tcp) { in net_test_loopback_validate()
233 if (ihdr->protocol != IPPROTO_TCP) in net_test_loopback_validate()
236 thdr = (struct tcphdr *)((u8 *)ihdr + 4 * ihdr->ihl); in net_test_loopback_validate()
237 if (thdr->dest != htons(tpriv->packet->dport)) in net_test_loopback_validate()
242 if (ihdr->protocol != IPPROTO_UDP) in net_test_loopback_validate()
245 uhdr = (struct udphdr *)((u8 *)ihdr + 4 * ihdr->ihl); in net_test_loopback_validate()
246 if (uhdr->dest != htons(tpriv->packet->dport)) in net_test_loopback_validate()
252 if (shdr->magic != cpu_to_be64(NET_TEST_PKT_MAGIC)) in net_test_loopback_validate()
254 if (tpriv->packet->id != shdr->id) in net_test_loopback_validate()
257 if (tpriv->packet->bad_csum && skb->ip_summed == CHECKSUM_UNNECESSARY) in net_test_loopback_validate()
258 tpriv->ok = -EIO; in net_test_loopback_validate()
260 tpriv->ok = true; in net_test_loopback_validate()
262 complete(&tpriv->comp); in net_test_loopback_validate()
277 return -ENOMEM; in __net_test_loopback()
279 tpriv->ok = false; in __net_test_loopback()
280 init_completion(&tpriv->comp); in __net_test_loopback()
282 tpriv->pt.type = htons(ETH_P_IP); in __net_test_loopback()
283 tpriv->pt.func = net_test_loopback_validate; in __net_test_loopback()
284 tpriv->pt.dev = ndev; in __net_test_loopback()
285 tpriv->pt.af_packet_priv = tpriv; in __net_test_loopback()
286 tpriv->packet = attr; in __net_test_loopback()
287 dev_add_pack(&tpriv->pt); in __net_test_loopback()
291 ret = -ENOMEM; in __net_test_loopback()
295 ret = dev_direct_xmit(skb, attr->queue_mapping); in __net_test_loopback()
299 ret = -ENETUNREACH; in __net_test_loopback()
303 if (!attr->timeout) in __net_test_loopback()
304 attr->timeout = NET_LB_TIMEOUT; in __net_test_loopback()
306 wait_for_completion_timeout(&tpriv->comp, attr->timeout); in __net_test_loopback()
307 if (tpriv->ok < 0) in __net_test_loopback()
308 ret = tpriv->ok; in __net_test_loopback()
309 else if (!tpriv->ok) in __net_test_loopback()
310 ret = -ETIMEDOUT; in __net_test_loopback()
315 dev_remove_pack(&tpriv->pt); in __net_test_loopback()
322 return netif_carrier_ok(ndev) ? 0 : -ENOLINK; in net_test_netif_carrier()
327 return ndev->phydev ? 0 : -EOPNOTSUPP; in net_test_phy_phydev()
332 if (!ndev->phydev) in net_test_phy_loopback_enable()
333 return -EOPNOTSUPP; in net_test_phy_loopback_enable()
335 return phy_loopback(ndev->phydev, true, 0); in net_test_phy_loopback_enable()
340 if (!ndev->phydev) in net_test_phy_loopback_disable()
341 return -EOPNOTSUPP; in net_test_phy_loopback_disable()
343 return phy_loopback(ndev->phydev, false, 0); in net_test_phy_loopback_disable()
350 attr.dst = ndev->dev_addr; in net_test_phy_loopback_udp()
358 attr.dst = ndev->dev_addr; in net_test_phy_loopback_udp_mtu()
359 attr.max_size = ndev->mtu; in net_test_phy_loopback_udp_mtu()
367 attr.dst = ndev->dev_addr; in net_test_phy_loopback_tcp()
373 * net_test_phy_loopback_tcp_bad_csum - PHY loopback test with a deliberately
378 * net_test_phy_loopback_tcp(), then flips the least-significant bit of the TCP
380 * The frame is transmitted through the device’s internal PHY loopback path:
382 * test code -> MAC driver -> MAC HW -> xMII -> PHY ->
383 * internal PHY loopback -> xMII -> MAC HW -> MAC driver -> test code
386 * ---------------------
388 * ip_summed as CHECKSUM_NONE or CHECKSUM_COMPLETE - both are
390 * -ETIMEDOUT The MAC/PHY silently dropped the frame; hardware checksum
392 * -EIO The driver returned the frame with ip_summed ==
394 * indicating a serious RX-path defect.
402 attr.dst = ndev->dev_addr; in net_test_phy_loopback_tcp_bad_csum()
416 .name = "PHY dev is present ",
419 /* This test should be done before all PHY loopback test */
420 .name = "PHY internal loopback, enable ",
423 .name = "PHY internal loopback, UDP ",
426 .name = "PHY internal loopback, MTU ",
429 .name = "PHY internal loopback, TCP ",
432 .name = "PHY loopback, bad TCP csum ",
435 /* This test should be done after all PHY loopback test */
436 .name = "PHY internal loopback, disable",
449 if (etest->flags != ETH_TEST_FL_OFFLINE) { in net_selftest()
451 etest->flags |= ETH_TEST_FL_FAILED; in net_selftest()
458 if (buf[i] && (buf[i] != -EOPNOTSUPP)) in net_selftest()
459 etest->flags |= ETH_TEST_FL_FAILED; in net_selftest()
480 MODULE_DESCRIPTION("Common library for generic PHY ethtool selftests");