1 /** @file
2 @brief Ethernet
3
4 This is not to be included by the application.
5 */
6
7 /*
8 * Copyright (c) 2016 Intel Corporation
9 *
10 * SPDX-License-Identifier: Apache-2.0
11 */
12
13 #ifndef ZEPHYR_INCLUDE_NET_ETHERNET_H_
14 #define ZEPHYR_INCLUDE_NET_ETHERNET_H_
15
16 #include <zephyr/kernel.h>
17 #include <zephyr/types.h>
18 #include <stdbool.h>
19 #include <zephyr/sys/atomic.h>
20
21 #include <zephyr/net/net_ip.h>
22 #include <zephyr/net/net_pkt.h>
23 #include <zephyr/net/lldp.h>
24 #include <zephyr/sys/util.h>
25 #include <zephyr/net/net_if.h>
26 #include <zephyr/net/ethernet_vlan.h>
27 #include <zephyr/net/ptp_time.h>
28
29 #if defined(CONFIG_NET_DSA)
30 #include <zephyr/net/dsa.h>
31 #endif
32
33 #if defined(CONFIG_NET_ETHERNET_BRIDGE)
34 #include <zephyr/net/ethernet_bridge.h>
35 #endif
36
37 #ifdef __cplusplus
38 extern "C" {
39 #endif
40
41 /**
42 * @brief Ethernet support functions
43 * @defgroup ethernet Ethernet Support Functions
44 * @since 1.0
45 * @version 0.8.0
46 * @ingroup networking
47 * @{
48 */
49
50 #define NET_ETH_ADDR_LEN 6U /**< Ethernet MAC address length */
51
52 /** Ethernet address */
53 struct net_eth_addr {
54 uint8_t addr[NET_ETH_ADDR_LEN]; /**< Buffer storing the address */
55 };
56
57 /** @cond INTERNAL_HIDDEN */
58
59 #define NET_ETH_HDR(pkt) ((struct net_eth_hdr *)net_pkt_data(pkt))
60
61 /* zephyr-keep-sorted-start */
62 #define NET_ETH_PTYPE_ALL 0x0003 /* from linux/if_ether.h */
63 #define NET_ETH_PTYPE_ARP 0x0806
64 #define NET_ETH_PTYPE_CAN 0x000C /* CAN: Controller Area Network */
65 #define NET_ETH_PTYPE_CANFD 0x000D /* CANFD: CAN flexible data rate*/
66 #define NET_ETH_PTYPE_EAPOL 0x888e
67 #define NET_ETH_PTYPE_ECAT 0x88a4
68 #define NET_ETH_PTYPE_HDLC 0x0019 /* HDLC frames (like in PPP) */
69 #define NET_ETH_PTYPE_IEEE802154 0x00F6 /* from linux/if_ether.h: IEEE802.15.4 frame */
70 #define NET_ETH_PTYPE_IP 0x0800
71 #define NET_ETH_PTYPE_IPV6 0x86dd
72 #define NET_ETH_PTYPE_LLDP 0x88cc
73 #define NET_ETH_PTYPE_PTP 0x88f7
74 #define NET_ETH_PTYPE_TSN 0x22f0 /* TSN (IEEE 1722) packet */
75 #define NET_ETH_PTYPE_VLAN 0x8100
76 /* zephyr-keep-sorted-stop */
77
78 /* zephyr-keep-sorted-start re(^#define) */
79 #if !defined(ETH_P_8021Q)
80 #define ETH_P_8021Q NET_ETH_PTYPE_VLAN
81 #endif
82 #if !defined(ETH_P_ALL)
83 #define ETH_P_ALL NET_ETH_PTYPE_ALL
84 #endif
85 #if !defined(ETH_P_ARP)
86 #define ETH_P_ARP NET_ETH_PTYPE_ARP
87 #endif
88 #if !defined(ETH_P_CAN)
89 #define ETH_P_CAN NET_ETH_PTYPE_CAN
90 #endif
91 #if !defined(ETH_P_CANFD)
92 #define ETH_P_CANFD NET_ETH_PTYPE_CANFD
93 #endif
94 #if !defined(ETH_P_EAPOL)
95 #define ETH_P_EAPOL NET_ETH_PTYPE_EAPOL
96 #endif
97 #if !defined(ETH_P_ECAT)
98 #define ETH_P_ECAT NET_ETH_PTYPE_ECAT
99 #endif
100 #if !defined(ETH_P_HDLC)
101 #define ETH_P_HDLC NET_ETH_PTYPE_HDLC
102 #endif
103 #if !defined(ETH_P_IEEE802154)
104 #define ETH_P_IEEE802154 NET_ETH_PTYPE_IEEE802154
105 #endif
106 #if !defined(ETH_P_IP)
107 #define ETH_P_IP NET_ETH_PTYPE_IP
108 #endif
109 #if !defined(ETH_P_IPV6)
110 #define ETH_P_IPV6 NET_ETH_PTYPE_IPV6
111 #endif
112 #if !defined(ETH_P_TSN)
113 #define ETH_P_TSN NET_ETH_PTYPE_TSN
114 #endif
115 /* zephyr-keep-sorted-stop */
116
117 /** @endcond */
118
119 #define NET_ETH_MINIMAL_FRAME_SIZE 60 /**< Minimum Ethernet frame size */
120 #define NET_ETH_MTU 1500 /**< Ethernet MTU size */
121
122 /** @cond INTERNAL_HIDDEN */
123
124 #if defined(CONFIG_NET_VLAN)
125 #define _NET_ETH_MAX_HDR_SIZE (sizeof(struct net_eth_vlan_hdr))
126 #else
127 #define _NET_ETH_MAX_HDR_SIZE (sizeof(struct net_eth_hdr))
128 #endif
129
130 #define _NET_ETH_MAX_FRAME_SIZE (NET_ETH_MTU + _NET_ETH_MAX_HDR_SIZE)
131 /*
132 * Extend the max frame size for DSA (KSZ8794) by one byte (to 1519) to
133 * store tail tag.
134 */
135 #if defined(CONFIG_NET_DSA)
136 #define NET_ETH_MAX_FRAME_SIZE (_NET_ETH_MAX_FRAME_SIZE + DSA_TAG_SIZE)
137 #define NET_ETH_MAX_HDR_SIZE (_NET_ETH_MAX_HDR_SIZE + DSA_TAG_SIZE)
138 #else
139 #define NET_ETH_MAX_FRAME_SIZE (_NET_ETH_MAX_FRAME_SIZE)
140 #define NET_ETH_MAX_HDR_SIZE (_NET_ETH_MAX_HDR_SIZE)
141 #endif
142
143 #define NET_ETH_VLAN_HDR_SIZE 4
144
145 /** @endcond */
146
147 /** @brief Ethernet hardware capabilities */
148 enum ethernet_hw_caps {
149 /** TX Checksum offloading supported for all of IPv4, UDP, TCP */
150 ETHERNET_HW_TX_CHKSUM_OFFLOAD = BIT(0),
151
152 /** RX Checksum offloading supported for all of IPv4, UDP, TCP */
153 ETHERNET_HW_RX_CHKSUM_OFFLOAD = BIT(1),
154
155 /** VLAN supported */
156 ETHERNET_HW_VLAN = BIT(2),
157
158 /** Enabling/disabling auto negotiation supported */
159 ETHERNET_AUTO_NEGOTIATION_SET = BIT(3),
160
161 /** 10 Mbits link supported */
162 ETHERNET_LINK_10BASE_T = BIT(4),
163
164 /** 100 Mbits link supported */
165 ETHERNET_LINK_100BASE_T = BIT(5),
166
167 /** 1 Gbits link supported */
168 ETHERNET_LINK_1000BASE_T = BIT(6),
169
170 /** Changing duplex (half/full) supported */
171 ETHERNET_DUPLEX_SET = BIT(7),
172
173 /** IEEE 802.1AS (gPTP) clock supported */
174 ETHERNET_PTP = BIT(8),
175
176 /** IEEE 802.1Qav (credit-based shaping) supported */
177 ETHERNET_QAV = BIT(9),
178
179 /** Promiscuous mode supported */
180 ETHERNET_PROMISC_MODE = BIT(10),
181
182 /** Priority queues available */
183 ETHERNET_PRIORITY_QUEUES = BIT(11),
184
185 /** MAC address filtering supported */
186 ETHERNET_HW_FILTERING = BIT(12),
187
188 /** Link Layer Discovery Protocol supported */
189 ETHERNET_LLDP = BIT(13),
190
191 /** VLAN Tag stripping */
192 ETHERNET_HW_VLAN_TAG_STRIP = BIT(14),
193
194 /** DSA switch slave port */
195 ETHERNET_DSA_SLAVE_PORT = BIT(15),
196
197 /** DSA switch master port */
198 ETHERNET_DSA_MASTER_PORT = BIT(16),
199
200 /** IEEE 802.1Qbv (scheduled traffic) supported */
201 ETHERNET_QBV = BIT(17),
202
203 /** IEEE 802.1Qbu (frame preemption) supported */
204 ETHERNET_QBU = BIT(18),
205
206 /** TXTIME supported */
207 ETHERNET_TXTIME = BIT(19),
208
209 /** TX-Injection supported */
210 ETHERNET_TXINJECTION_MODE = BIT(20),
211
212 /** 2.5 Gbits link supported */
213 ETHERNET_LINK_2500BASE_T = BIT(21),
214
215 /** 5 Gbits link supported */
216 ETHERNET_LINK_5000BASE_T = BIT(22),
217 };
218
219 /** @cond INTERNAL_HIDDEN */
220
221 enum ethernet_config_type {
222 ETHERNET_CONFIG_TYPE_AUTO_NEG,
223 ETHERNET_CONFIG_TYPE_LINK,
224 ETHERNET_CONFIG_TYPE_DUPLEX,
225 ETHERNET_CONFIG_TYPE_MAC_ADDRESS,
226 ETHERNET_CONFIG_TYPE_QAV_PARAM,
227 ETHERNET_CONFIG_TYPE_QBV_PARAM,
228 ETHERNET_CONFIG_TYPE_QBU_PARAM,
229 ETHERNET_CONFIG_TYPE_TXTIME_PARAM,
230 ETHERNET_CONFIG_TYPE_PROMISC_MODE,
231 ETHERNET_CONFIG_TYPE_PRIORITY_QUEUES_NUM,
232 ETHERNET_CONFIG_TYPE_FILTER,
233 ETHERNET_CONFIG_TYPE_PORTS_NUM,
234 ETHERNET_CONFIG_TYPE_T1S_PARAM,
235 ETHERNET_CONFIG_TYPE_TXINJECTION_MODE,
236 ETHERNET_CONFIG_TYPE_RX_CHECKSUM_SUPPORT,
237 ETHERNET_CONFIG_TYPE_TX_CHECKSUM_SUPPORT,
238 ETHERNET_CONFIG_TYPE_EXTRA_TX_PKT_HEADROOM,
239 };
240
241 enum ethernet_qav_param_type {
242 ETHERNET_QAV_PARAM_TYPE_DELTA_BANDWIDTH,
243 ETHERNET_QAV_PARAM_TYPE_IDLE_SLOPE,
244 ETHERNET_QAV_PARAM_TYPE_OPER_IDLE_SLOPE,
245 ETHERNET_QAV_PARAM_TYPE_TRAFFIC_CLASS,
246 ETHERNET_QAV_PARAM_TYPE_STATUS,
247 };
248
249 enum ethernet_t1s_param_type {
250 ETHERNET_T1S_PARAM_TYPE_PLCA_CONFIG,
251 };
252
253 /** @endcond */
254
255 /** Ethernet T1S specific parameters */
256 struct ethernet_t1s_param {
257 /** Type of T1S parameter */
258 enum ethernet_t1s_param_type type;
259 union {
260 /**
261 * PLCA is the Physical Layer (PHY) Collision
262 * Avoidance technique employed with multidrop
263 * 10Base-T1S standard.
264 *
265 * The PLCA parameters are described in standard [1]
266 * as registers in memory map 4 (MMS = 4) (point 9.6).
267 *
268 * IDVER (PLCA ID Version)
269 * CTRL0 (PLCA Control 0)
270 * CTRL1 (PLCA Control 1)
271 * STATUS (PLCA Status)
272 * TOTMR (PLCA TO Control)
273 * BURST (PLCA Burst Control)
274 *
275 * Those registers are implemented by each OA TC6
276 * compliant vendor (like for e.g. LAN865x - e.g. [2]).
277 *
278 * Documents:
279 * [1] - "OPEN Alliance 10BASE-T1x MAC-PHY Serial
280 * Interface" (ver. 1.1)
281 * [2] - "DS60001734C" - LAN865x data sheet
282 */
283 struct {
284 /** T1S PLCA enabled */
285 bool enable;
286 /** T1S PLCA node id range: 0 to 254 */
287 uint8_t node_id;
288 /** T1S PLCA node count range: 1 to 255 */
289 uint8_t node_count;
290 /** T1S PLCA burst count range: 0x0 to 0xFF */
291 uint8_t burst_count;
292 /** T1S PLCA burst timer */
293 uint8_t burst_timer;
294 /** T1S PLCA TO value */
295 uint8_t to_timer;
296 } plca;
297 };
298 };
299
300 /** Ethernet Qav specific parameters */
301 struct ethernet_qav_param {
302 /** ID of the priority queue to use */
303 int queue_id;
304 /** Type of Qav parameter */
305 enum ethernet_qav_param_type type;
306 union {
307 /** True if Qav is enabled for queue */
308 bool enabled;
309 /** Delta Bandwidth (percentage of bandwidth) */
310 unsigned int delta_bandwidth;
311 /** Idle Slope (bits per second) */
312 unsigned int idle_slope;
313 /** Oper Idle Slope (bits per second) */
314 unsigned int oper_idle_slope;
315 /** Traffic class the queue is bound to */
316 unsigned int traffic_class;
317 };
318 };
319
320 /** @cond INTERNAL_HIDDEN */
321
322 enum ethernet_qbv_param_type {
323 ETHERNET_QBV_PARAM_TYPE_STATUS,
324 ETHERNET_QBV_PARAM_TYPE_GATE_CONTROL_LIST,
325 ETHERNET_QBV_PARAM_TYPE_GATE_CONTROL_LIST_LEN,
326 ETHERNET_QBV_PARAM_TYPE_TIME,
327 };
328
329 enum ethernet_qbv_state_type {
330 ETHERNET_QBV_STATE_TYPE_ADMIN,
331 ETHERNET_QBV_STATE_TYPE_OPER,
332 };
333
334 enum ethernet_gate_state_operation {
335 ETHERNET_SET_GATE_STATE,
336 ETHERNET_SET_AND_HOLD_MAC_STATE,
337 ETHERNET_SET_AND_RELEASE_MAC_STATE,
338 };
339
340 /** @endcond */
341
342 /** Ethernet Qbv specific parameters */
343 struct ethernet_qbv_param {
344 /** Port id */
345 int port_id;
346 /** Type of Qbv parameter */
347 enum ethernet_qbv_param_type type;
348 /** What state (Admin/Oper) parameters are these */
349 enum ethernet_qbv_state_type state;
350 union {
351 /** True if Qbv is enabled or not */
352 bool enabled;
353
354 /** Gate control information */
355 struct {
356 /** True = open, False = closed */
357 bool gate_status[NET_TC_TX_COUNT];
358
359 /** GateState operation */
360 enum ethernet_gate_state_operation operation;
361
362 /** Time interval ticks (nanoseconds) */
363 uint32_t time_interval;
364
365 /** Gate control list row */
366 uint16_t row;
367 } gate_control;
368
369 /** Number of entries in gate control list */
370 uint32_t gate_control_list_len;
371
372 /**
373 * The time values are set in one go when type is set to
374 * ETHERNET_QBV_PARAM_TYPE_TIME
375 */
376 struct {
377 /** Base time */
378 struct net_ptp_extended_time base_time;
379
380 /** Cycle time */
381 struct net_ptp_time cycle_time;
382
383 /** Extension time (nanoseconds) */
384 uint32_t extension_time;
385 };
386 };
387 };
388
389 /** @cond INTERNAL_HIDDEN */
390
391 enum ethernet_qbu_param_type {
392 ETHERNET_QBU_PARAM_TYPE_STATUS,
393 ETHERNET_QBU_PARAM_TYPE_RELEASE_ADVANCE,
394 ETHERNET_QBU_PARAM_TYPE_HOLD_ADVANCE,
395 ETHERNET_QBU_PARAM_TYPE_PREEMPTION_STATUS_TABLE,
396
397 /* Some preemption settings are from Qbr spec. */
398 ETHERNET_QBR_PARAM_TYPE_LINK_PARTNER_STATUS,
399 ETHERNET_QBR_PARAM_TYPE_ADDITIONAL_FRAGMENT_SIZE,
400 };
401
402 enum ethernet_qbu_preempt_status {
403 ETHERNET_QBU_STATUS_EXPRESS,
404 ETHERNET_QBU_STATUS_PREEMPTABLE
405 } __packed;
406
407 /** @endcond */
408
409 /** Ethernet Qbu specific parameters */
410 struct ethernet_qbu_param {
411 /** Port id */
412 int port_id;
413 /** Type of Qbu parameter */
414 enum ethernet_qbu_param_type type;
415 union {
416 /** Hold advance (nanoseconds) */
417 uint32_t hold_advance;
418
419 /** Release advance (nanoseconds) */
420 uint32_t release_advance;
421
422 /** sequence of framePreemptionAdminStatus values */
423 enum ethernet_qbu_preempt_status
424 frame_preempt_statuses[NET_TC_TX_COUNT];
425
426 /** True if Qbu is enabled or not */
427 bool enabled;
428
429 /** Link partner status (from Qbr) */
430 bool link_partner_status;
431
432 /**
433 * Additional fragment size (from Qbr). The minimum non-final
434 * fragment size is (additional_fragment_size + 1) * 64 octets
435 */
436 uint8_t additional_fragment_size : 2;
437 };
438 };
439
440 /** @cond INTERNAL_HIDDEN */
441
442 enum ethernet_filter_type {
443 ETHERNET_FILTER_TYPE_SRC_MAC_ADDRESS,
444 ETHERNET_FILTER_TYPE_DST_MAC_ADDRESS,
445 };
446
447 /** @endcond */
448
449 /** Types of Ethernet L2 */
450 enum ethernet_if_types {
451 /** IEEE 802.3 Ethernet (default) */
452 L2_ETH_IF_TYPE_ETHERNET,
453
454 /** IEEE 802.11 Wi-Fi*/
455 L2_ETH_IF_TYPE_WIFI,
456 } __packed;
457
458 /** Ethernet filter description */
459 struct ethernet_filter {
460 /** Type of filter */
461 enum ethernet_filter_type type;
462 /** MAC address to filter */
463 struct net_eth_addr mac_address;
464 /** Set (true) or unset (false) the filter */
465 bool set;
466 };
467
468 /** @cond INTERNAL_HIDDEN */
469
470 enum ethernet_txtime_param_type {
471 ETHERNET_TXTIME_PARAM_TYPE_ENABLE_QUEUES,
472 };
473
474 /** @endcond */
475
476 /** Ethernet TXTIME specific parameters */
477 struct ethernet_txtime_param {
478 /** Type of TXTIME parameter */
479 enum ethernet_txtime_param_type type;
480 /** Queue number for configuring TXTIME */
481 int queue_id;
482 /** Enable or disable TXTIME per queue */
483 bool enable_txtime;
484 };
485
486 /** Protocols that are supported by checksum offloading */
487 enum ethernet_checksum_support {
488 /** Device does not support any L3/L4 checksum offloading */
489 ETHERNET_CHECKSUM_SUPPORT_NONE = NET_IF_CHECKSUM_NONE_BIT,
490 /** Device supports checksum offloading for the IPv4 header */
491 ETHERNET_CHECKSUM_SUPPORT_IPV4_HEADER = NET_IF_CHECKSUM_IPV4_HEADER_BIT,
492 /** Device supports checksum offloading for ICMPv4 payload (implies IPv4 header) */
493 ETHERNET_CHECKSUM_SUPPORT_IPV4_ICMP = NET_IF_CHECKSUM_IPV4_ICMP_BIT,
494 /** Device supports checksum offloading for the IPv6 header */
495 ETHERNET_CHECKSUM_SUPPORT_IPV6_HEADER = NET_IF_CHECKSUM_IPV6_HEADER_BIT,
496 /** Device supports checksum offloading for ICMPv6 payload (implies IPv6 header) */
497 ETHERNET_CHECKSUM_SUPPORT_IPV6_ICMP = NET_IF_CHECKSUM_IPV6_ICMP_BIT,
498 /** Device supports TCP checksum offloading for all supported IP protocols */
499 ETHERNET_CHECKSUM_SUPPORT_TCP = NET_IF_CHECKSUM_TCP_BIT,
500 /** Device supports UDP checksum offloading for all supported IP protocols */
501 ETHERNET_CHECKSUM_SUPPORT_UDP = NET_IF_CHECKSUM_UDP_BIT,
502 };
503
504 /** @cond INTERNAL_HIDDEN */
505
506 struct ethernet_config {
507 union {
508 bool auto_negotiation;
509 bool full_duplex;
510 bool promisc_mode;
511 bool txinjection_mode;
512
513 struct {
514 bool link_10bt;
515 bool link_100bt;
516 bool link_1000bt;
517 } l;
518
519 struct net_eth_addr mac_address;
520
521 struct ethernet_t1s_param t1s_param;
522 struct ethernet_qav_param qav_param;
523 struct ethernet_qbv_param qbv_param;
524 struct ethernet_qbu_param qbu_param;
525 struct ethernet_txtime_param txtime_param;
526
527 int priority_queues_num;
528 int ports_num;
529
530 enum ethernet_checksum_support chksum_support;
531
532 struct ethernet_filter filter;
533
534 uint16_t extra_tx_pkt_headroom;
535 };
536 };
537
538 /** @endcond */
539
540 /** Ethernet L2 API operations. */
541 struct ethernet_api {
542 /**
543 * The net_if_api must be placed in first position in this
544 * struct so that we are compatible with network interface API.
545 */
546 struct net_if_api iface_api;
547
548 /** Collect optional ethernet specific statistics. This pointer
549 * should be set by driver if statistics needs to be collected
550 * for that driver.
551 */
552 #if defined(CONFIG_NET_STATISTICS_ETHERNET)
553 struct net_stats_eth *(*get_stats)(const struct device *dev);
554 #endif
555
556 /** Start the device */
557 int (*start)(const struct device *dev);
558
559 /** Stop the device */
560 int (*stop)(const struct device *dev);
561
562 /** Get the device capabilities */
563 enum ethernet_hw_caps (*get_capabilities)(const struct device *dev);
564
565 /** Set specific hardware configuration */
566 int (*set_config)(const struct device *dev,
567 enum ethernet_config_type type,
568 const struct ethernet_config *config);
569
570 /** Get hardware specific configuration */
571 int (*get_config)(const struct device *dev,
572 enum ethernet_config_type type,
573 struct ethernet_config *config);
574
575 /** The IP stack will call this function when a VLAN tag is enabled
576 * or disabled. If enable is set to true, then the VLAN tag was added,
577 * if it is false then the tag was removed. The driver can utilize
578 * this information if needed.
579 */
580 #if defined(CONFIG_NET_VLAN)
581 int (*vlan_setup)(const struct device *dev, struct net_if *iface,
582 uint16_t tag, bool enable);
583 #endif /* CONFIG_NET_VLAN */
584
585 /** Return ptp_clock device that is tied to this ethernet device */
586 #if defined(CONFIG_PTP_CLOCK)
587 const struct device *(*get_ptp_clock)(const struct device *dev);
588 #endif /* CONFIG_PTP_CLOCK */
589
590 /** Return PHY device that is tied to this ethernet device */
591 const struct device *(*get_phy)(const struct device *dev);
592
593 /** Send a network packet */
594 int (*send)(const struct device *dev, struct net_pkt *pkt);
595 };
596
597 /** @cond INTERNAL_HIDDEN */
598
599 /* Make sure that the network interface API is properly setup inside
600 * Ethernet API struct (it is the first one).
601 */
602 BUILD_ASSERT(offsetof(struct ethernet_api, iface_api) == 0);
603
604 struct net_eth_hdr {
605 struct net_eth_addr dst;
606 struct net_eth_addr src;
607 uint16_t type;
608 } __packed;
609
610 struct ethernet_vlan {
611 /** Network interface that has VLAN enabled */
612 struct net_if *iface;
613
614 /** VLAN tag */
615 uint16_t tag;
616 };
617
618 #if defined(CONFIG_NET_VLAN_COUNT)
619 #define NET_VLAN_MAX_COUNT CONFIG_NET_VLAN_COUNT
620 #else
621 #define NET_VLAN_MAX_COUNT 0
622 #endif
623
624 /** @endcond */
625
626 /** Ethernet LLDP specific parameters */
627 struct ethernet_lldp {
628 /** Used for track timers */
629 sys_snode_t node;
630
631 /** LLDP Data Unit mandatory TLVs for the interface. */
632 const struct net_lldpdu *lldpdu;
633
634 /** LLDP Data Unit optional TLVs for the interface */
635 const uint8_t *optional_du;
636
637 /** Length of the optional Data Unit TLVs */
638 size_t optional_len;
639
640 /** Network interface that has LLDP supported. */
641 struct net_if *iface;
642
643 /** LLDP TX timer start time */
644 int64_t tx_timer_start;
645
646 /** LLDP TX timeout */
647 uint32_t tx_timer_timeout;
648
649 /** LLDP RX callback function */
650 net_lldp_recv_cb_t cb;
651 };
652
653 /** @cond INTERNAL_HIDDEN */
654
655 enum ethernet_flags {
656 ETH_CARRIER_UP,
657 };
658
659 /** Ethernet L2 context that is needed for VLAN */
660 struct ethernet_context {
661 /** Flags representing ethernet state, which are accessed from multiple
662 * threads.
663 */
664 atomic_t flags;
665
666 #if defined(CONFIG_NET_ETHERNET_BRIDGE)
667 struct net_if *bridge;
668 #endif
669
670 /** Carrier ON/OFF handler worker. This is used to create
671 * network interface UP/DOWN event when ethernet L2 driver
672 * notices carrier ON/OFF situation. We must not create another
673 * network management event from inside management handler thus
674 * we use worker thread to trigger the UP/DOWN event.
675 */
676 struct k_work carrier_work;
677
678 /** Network interface. */
679 struct net_if *iface;
680
681 #if defined(CONFIG_NET_LLDP)
682 #if NET_VLAN_MAX_COUNT > 0
683 #define NET_LLDP_MAX_COUNT NET_VLAN_MAX_COUNT
684 #else
685 #define NET_LLDP_MAX_COUNT 1
686 #endif /* NET_VLAN_MAX_COUNT > 0 */
687
688 /** LLDP specific parameters */
689 struct ethernet_lldp lldp[NET_LLDP_MAX_COUNT];
690 #endif
691
692 /**
693 * This tells what L2 features does ethernet support.
694 */
695 enum net_l2_flags ethernet_l2_flags;
696
697 #if defined(CONFIG_NET_L2_PTP)
698 /** The PTP port number for this network device. We need to store the
699 * port number here so that we do not need to fetch it for every
700 * incoming PTP packet.
701 */
702 int port;
703 #endif
704
705 #if defined(CONFIG_NET_DSA)
706 /** DSA RX callback function - for custom processing - like e.g.
707 * redirecting packets when MAC address is caught
708 */
709 dsa_net_recv_cb_t dsa_recv_cb;
710
711 /** Switch physical port number */
712 uint8_t dsa_port_idx;
713
714 /** DSA context pointer */
715 struct dsa_context *dsa_ctx;
716
717 /** Send a network packet via DSA master port */
718 dsa_send_t dsa_send;
719 #endif
720
721 /** Is network carrier up */
722 bool is_net_carrier_up : 1;
723
724 /** Is this context already initialized */
725 bool is_init : 1;
726
727 /** Types of Ethernet network interfaces */
728 enum ethernet_if_types eth_if_type;
729 };
730
731 /**
732 * @brief Initialize Ethernet L2 stack for a given interface
733 *
734 * @param iface A valid pointer to a network interface
735 */
736 void ethernet_init(struct net_if *iface);
737
738 #define ETHERNET_L2_CTX_TYPE struct ethernet_context
739
740 /* Separate header for VLAN as some of device interfaces might not
741 * support VLAN.
742 */
743 struct net_eth_vlan_hdr {
744 struct net_eth_addr dst;
745 struct net_eth_addr src;
746 struct {
747 uint16_t tpid; /* tag protocol id */
748 uint16_t tci; /* tag control info */
749 } vlan;
750 uint16_t type;
751 } __packed;
752
753 /** @endcond */
754
755 /**
756 * @brief Check if the Ethernet MAC address is a broadcast address.
757 *
758 * @param addr A valid pointer to a Ethernet MAC address.
759 *
760 * @return true if address is a broadcast address, false if not
761 */
net_eth_is_addr_broadcast(struct net_eth_addr * addr)762 static inline bool net_eth_is_addr_broadcast(struct net_eth_addr *addr)
763 {
764 if (addr->addr[0] == 0xff &&
765 addr->addr[1] == 0xff &&
766 addr->addr[2] == 0xff &&
767 addr->addr[3] == 0xff &&
768 addr->addr[4] == 0xff &&
769 addr->addr[5] == 0xff) {
770 return true;
771 }
772
773 return false;
774 }
775
776 /**
777 * @brief Check if the Ethernet MAC address is a all zeroes address.
778 *
779 * @param addr A valid pointer to an Ethernet MAC address.
780 *
781 * @return true if address is an all zeroes address, false if not
782 */
net_eth_is_addr_all_zeroes(struct net_eth_addr * addr)783 static inline bool net_eth_is_addr_all_zeroes(struct net_eth_addr *addr)
784 {
785 if (addr->addr[0] == 0x00 &&
786 addr->addr[1] == 0x00 &&
787 addr->addr[2] == 0x00 &&
788 addr->addr[3] == 0x00 &&
789 addr->addr[4] == 0x00 &&
790 addr->addr[5] == 0x00) {
791 return true;
792 }
793
794 return false;
795 }
796
797 /**
798 * @brief Check if the Ethernet MAC address is unspecified.
799 *
800 * @param addr A valid pointer to a Ethernet MAC address.
801 *
802 * @return true if address is unspecified, false if not
803 */
net_eth_is_addr_unspecified(struct net_eth_addr * addr)804 static inline bool net_eth_is_addr_unspecified(struct net_eth_addr *addr)
805 {
806 if (addr->addr[0] == 0x00 &&
807 addr->addr[1] == 0x00 &&
808 addr->addr[2] == 0x00 &&
809 addr->addr[3] == 0x00 &&
810 addr->addr[4] == 0x00 &&
811 addr->addr[5] == 0x00) {
812 return true;
813 }
814
815 return false;
816 }
817
818 /**
819 * @brief Check if the Ethernet MAC address is a multicast address.
820 *
821 * @param addr A valid pointer to a Ethernet MAC address.
822 *
823 * @return true if address is a multicast address, false if not
824 */
net_eth_is_addr_multicast(struct net_eth_addr * addr)825 static inline bool net_eth_is_addr_multicast(struct net_eth_addr *addr)
826 {
827 #if defined(CONFIG_NET_IPV6)
828 if (addr->addr[0] == 0x33 &&
829 addr->addr[1] == 0x33) {
830 return true;
831 }
832 #endif
833
834 #if defined(CONFIG_NET_IPV4)
835 if (addr->addr[0] == 0x01 &&
836 addr->addr[1] == 0x00 &&
837 addr->addr[2] == 0x5e) {
838 return true;
839 }
840 #endif
841
842 return false;
843 }
844
845 /**
846 * @brief Check if the Ethernet MAC address is a group address.
847 *
848 * @param addr A valid pointer to a Ethernet MAC address.
849 *
850 * @return true if address is a group address, false if not
851 */
net_eth_is_addr_group(struct net_eth_addr * addr)852 static inline bool net_eth_is_addr_group(struct net_eth_addr *addr)
853 {
854 return addr->addr[0] & 0x01;
855 }
856
857 /**
858 * @brief Check if the Ethernet MAC address is valid.
859 *
860 * @param addr A valid pointer to a Ethernet MAC address.
861 *
862 * @return true if address is valid, false if not
863 */
net_eth_is_addr_valid(struct net_eth_addr * addr)864 static inline bool net_eth_is_addr_valid(struct net_eth_addr *addr)
865 {
866 return !net_eth_is_addr_unspecified(addr) && !net_eth_is_addr_group(addr);
867 }
868
869 /**
870 * @brief Check if the Ethernet MAC address is a LLDP multicast address.
871 *
872 * @param addr A valid pointer to a Ethernet MAC address.
873 *
874 * @return true if address is a LLDP multicast address, false if not
875 */
net_eth_is_addr_lldp_multicast(struct net_eth_addr * addr)876 static inline bool net_eth_is_addr_lldp_multicast(struct net_eth_addr *addr)
877 {
878 #if defined(CONFIG_NET_GPTP) || defined(CONFIG_NET_LLDP)
879 if (addr->addr[0] == 0x01 &&
880 addr->addr[1] == 0x80 &&
881 addr->addr[2] == 0xc2 &&
882 addr->addr[3] == 0x00 &&
883 addr->addr[4] == 0x00 &&
884 addr->addr[5] == 0x0e) {
885 return true;
886 }
887 #else
888 ARG_UNUSED(addr);
889 #endif
890
891 return false;
892 }
893
894 /**
895 * @brief Check if the Ethernet MAC address is a PTP multicast address.
896 *
897 * @param addr A valid pointer to a Ethernet MAC address.
898 *
899 * @return true if address is a PTP multicast address, false if not
900 */
net_eth_is_addr_ptp_multicast(struct net_eth_addr * addr)901 static inline bool net_eth_is_addr_ptp_multicast(struct net_eth_addr *addr)
902 {
903 #if defined(CONFIG_NET_GPTP)
904 if (addr->addr[0] == 0x01 &&
905 addr->addr[1] == 0x1b &&
906 addr->addr[2] == 0x19 &&
907 addr->addr[3] == 0x00 &&
908 addr->addr[4] == 0x00 &&
909 addr->addr[5] == 0x00) {
910 return true;
911 }
912 #else
913 ARG_UNUSED(addr);
914 #endif
915
916 return false;
917 }
918
919 /**
920 * @brief Return Ethernet broadcast address.
921 *
922 * @return Ethernet broadcast address.
923 */
924 const struct net_eth_addr *net_eth_broadcast_addr(void);
925
926 /**
927 * @brief Convert IPv4 multicast address to Ethernet address.
928 *
929 * @param ipv4_addr IPv4 multicast address
930 * @param mac_addr Output buffer for Ethernet address
931 */
932 void net_eth_ipv4_mcast_to_mac_addr(const struct in_addr *ipv4_addr,
933 struct net_eth_addr *mac_addr);
934
935 /**
936 * @brief Convert IPv6 multicast address to Ethernet address.
937 *
938 * @param ipv6_addr IPv6 multicast address
939 * @param mac_addr Output buffer for Ethernet address
940 */
941 void net_eth_ipv6_mcast_to_mac_addr(const struct in6_addr *ipv6_addr,
942 struct net_eth_addr *mac_addr);
943
944 /**
945 * @brief Return ethernet device hardware capability information.
946 *
947 * @param iface Network interface
948 *
949 * @return Hardware capabilities
950 */
951 static inline
net_eth_get_hw_capabilities(struct net_if * iface)952 enum ethernet_hw_caps net_eth_get_hw_capabilities(struct net_if *iface)
953 {
954 const struct device *dev = net_if_get_device(iface);
955 const struct ethernet_api *api = (struct ethernet_api *)dev->api;
956
957 if (!api || !api->get_capabilities) {
958 return (enum ethernet_hw_caps)0;
959 }
960
961 return api->get_capabilities(dev);
962 }
963
964 /**
965 * @brief Return ethernet device hardware configuration information.
966 *
967 * @param iface Network interface
968 * @param type configuration type
969 * @param config Ethernet configuration
970 *
971 * @return 0 if ok, <0 if error
972 */
973 static inline
net_eth_get_hw_config(struct net_if * iface,enum ethernet_config_type type,struct ethernet_config * config)974 int net_eth_get_hw_config(struct net_if *iface, enum ethernet_config_type type,
975 struct ethernet_config *config)
976 {
977 const struct ethernet_api *eth =
978 (struct ethernet_api *)net_if_get_device(iface)->api;
979
980 if (!eth->get_config) {
981 return -ENOTSUP;
982 }
983
984 return eth->get_config(net_if_get_device(iface), type, config);
985 }
986
987
988 /**
989 * @brief Add VLAN tag to the interface.
990 *
991 * @param iface Interface to use.
992 * @param tag VLAN tag to add
993 *
994 * @return 0 if ok, <0 if error
995 */
996 #if defined(CONFIG_NET_VLAN) && NET_VLAN_MAX_COUNT > 0
997 int net_eth_vlan_enable(struct net_if *iface, uint16_t tag);
998 #else
net_eth_vlan_enable(struct net_if * iface,uint16_t tag)999 static inline int net_eth_vlan_enable(struct net_if *iface, uint16_t tag)
1000 {
1001 ARG_UNUSED(iface);
1002 ARG_UNUSED(tag);
1003
1004 return -EINVAL;
1005 }
1006 #endif
1007
1008 /**
1009 * @brief Remove VLAN tag from the interface.
1010 *
1011 * @param iface Interface to use.
1012 * @param tag VLAN tag to remove
1013 *
1014 * @return 0 if ok, <0 if error
1015 */
1016 #if defined(CONFIG_NET_VLAN) && NET_VLAN_MAX_COUNT > 0
1017 int net_eth_vlan_disable(struct net_if *iface, uint16_t tag);
1018 #else
net_eth_vlan_disable(struct net_if * iface,uint16_t tag)1019 static inline int net_eth_vlan_disable(struct net_if *iface, uint16_t tag)
1020 {
1021 ARG_UNUSED(iface);
1022 ARG_UNUSED(tag);
1023
1024 return -EINVAL;
1025 }
1026 #endif
1027
1028 /**
1029 * @brief Return VLAN tag specified to network interface.
1030 *
1031 * Note that the interface parameter must be the VLAN interface,
1032 * and not the Ethernet one.
1033 *
1034 * @param iface VLAN network interface.
1035 *
1036 * @return VLAN tag for this interface or NET_VLAN_TAG_UNSPEC if VLAN
1037 * is not configured for that interface.
1038 */
1039 #if defined(CONFIG_NET_VLAN) && NET_VLAN_MAX_COUNT > 0
1040 uint16_t net_eth_get_vlan_tag(struct net_if *iface);
1041 #else
net_eth_get_vlan_tag(struct net_if * iface)1042 static inline uint16_t net_eth_get_vlan_tag(struct net_if *iface)
1043 {
1044 ARG_UNUSED(iface);
1045
1046 return NET_VLAN_TAG_UNSPEC;
1047 }
1048 #endif
1049
1050 /**
1051 * @brief Return network interface related to this VLAN tag
1052 *
1053 * @param iface Main network interface (not the VLAN one).
1054 * @param tag VLAN tag
1055 *
1056 * @return Network interface related to this tag or NULL if no such interface
1057 * exists.
1058 */
1059 #if defined(CONFIG_NET_VLAN)
1060 struct net_if *net_eth_get_vlan_iface(struct net_if *iface, uint16_t tag);
1061 #else
1062 static inline
net_eth_get_vlan_iface(struct net_if * iface,uint16_t tag)1063 struct net_if *net_eth_get_vlan_iface(struct net_if *iface, uint16_t tag)
1064 {
1065 ARG_UNUSED(iface);
1066 ARG_UNUSED(tag);
1067
1068 return NULL;
1069 }
1070 #endif
1071
1072 /**
1073 * @brief Return main network interface that is attached to this VLAN tag.
1074 *
1075 * @param iface VLAN network interface. This is used to get the
1076 * pointer to ethernet L2 context
1077 *
1078 * @return Network interface related to this tag or NULL if no such interface
1079 * exists.
1080 */
1081 #if defined(CONFIG_NET_VLAN) && NET_VLAN_MAX_COUNT > 0
1082 struct net_if *net_eth_get_vlan_main(struct net_if *iface);
1083 #else
1084 static inline
net_eth_get_vlan_main(struct net_if * iface)1085 struct net_if *net_eth_get_vlan_main(struct net_if *iface)
1086 {
1087 ARG_UNUSED(iface);
1088
1089 return NULL;
1090 }
1091 #endif
1092
1093 /**
1094 * @brief Check if there are any VLAN interfaces enabled to this specific
1095 * Ethernet network interface.
1096 *
1097 * Note that the iface must be the actual Ethernet interface and not the
1098 * virtual VLAN interface.
1099 *
1100 * @param ctx Ethernet context
1101 * @param iface Ethernet network interface
1102 *
1103 * @return True if there are enabled VLANs for this network interface,
1104 * false if not.
1105 */
1106 #if defined(CONFIG_NET_VLAN)
1107 bool net_eth_is_vlan_enabled(struct ethernet_context *ctx,
1108 struct net_if *iface);
1109 #else
net_eth_is_vlan_enabled(struct ethernet_context * ctx,struct net_if * iface)1110 static inline bool net_eth_is_vlan_enabled(struct ethernet_context *ctx,
1111 struct net_if *iface)
1112 {
1113 ARG_UNUSED(ctx);
1114 ARG_UNUSED(iface);
1115
1116 return false;
1117 }
1118 #endif
1119
1120 /**
1121 * @brief Get VLAN status for a given network interface (enabled or not).
1122 *
1123 * @param iface Network interface
1124 *
1125 * @return True if VLAN is enabled for this network interface, false if not.
1126 */
1127 #if defined(CONFIG_NET_VLAN) && NET_VLAN_MAX_COUNT > 0
1128 bool net_eth_get_vlan_status(struct net_if *iface);
1129 #else
net_eth_get_vlan_status(struct net_if * iface)1130 static inline bool net_eth_get_vlan_status(struct net_if *iface)
1131 {
1132 ARG_UNUSED(iface);
1133
1134 return false;
1135 }
1136 #endif
1137
1138 /**
1139 * @brief Check if the given interface is a VLAN interface.
1140 *
1141 * @param iface Network interface
1142 *
1143 * @return True if this network interface is VLAN one, false if not.
1144 */
1145 #if defined(CONFIG_NET_VLAN) && NET_VLAN_MAX_COUNT > 0
1146 bool net_eth_is_vlan_interface(struct net_if *iface);
1147 #else
net_eth_is_vlan_interface(struct net_if * iface)1148 static inline bool net_eth_is_vlan_interface(struct net_if *iface)
1149 {
1150 ARG_UNUSED(iface);
1151
1152 return false;
1153 }
1154 #endif
1155
1156 /** @cond INTERNAL_HIDDEN */
1157
1158 #if !defined(CONFIG_ETH_DRIVER_RAW_MODE)
1159
1160 #define Z_ETH_NET_DEVICE_INIT_INSTANCE(node_id, dev_id, name, instance, \
1161 init_fn, pm, data, config, prio, \
1162 api, mtu) \
1163 Z_NET_DEVICE_INIT_INSTANCE(node_id, dev_id, name, instance, \
1164 init_fn, pm, data, config, prio, \
1165 api, ETHERNET_L2, \
1166 NET_L2_GET_CTX_TYPE(ETHERNET_L2), mtu)
1167
1168 #else /* CONFIG_ETH_DRIVER_RAW_MODE */
1169
1170 #define Z_ETH_NET_DEVICE_INIT_INSTANCE(node_id, dev_id, name, instance, \
1171 init_fn, pm, data, config, prio, \
1172 api, mtu) \
1173 Z_DEVICE_STATE_DEFINE(dev_id); \
1174 Z_DEVICE_DEFINE(node_id, dev_id, name, init_fn, NULL, \
1175 Z_DEVICE_DT_FLAGS(node_id), pm, data, \
1176 config, POST_KERNEL, prio, api, \
1177 &Z_DEVICE_STATE_NAME(dev_id));
1178
1179 #endif /* CONFIG_ETH_DRIVER_RAW_MODE */
1180
1181 #define Z_ETH_NET_DEVICE_INIT(node_id, dev_id, name, init_fn, pm, data, \
1182 config, prio, api, mtu) \
1183 Z_ETH_NET_DEVICE_INIT_INSTANCE(node_id, dev_id, name, 0, \
1184 init_fn, pm, data, config, prio, \
1185 api, mtu)
1186
1187 /** @endcond */
1188
1189 /**
1190 * @brief Create an Ethernet network interface and bind it to network device.
1191 *
1192 * @param dev_id Network device id.
1193 * @param name The name this instance of the driver exposes to
1194 * the system.
1195 * @param init_fn Address to the init function of the driver.
1196 * @param pm Reference to struct pm_device associated with the device.
1197 * (optional).
1198 * @param data Pointer to the device's private data.
1199 * @param config The address to the structure containing the
1200 * configuration information for this instance of the driver.
1201 * @param prio The initialization level at which configuration occurs.
1202 * @param api Provides an initial pointer to the API function struct
1203 * used by the driver. Can be NULL.
1204 * @param mtu Maximum transfer unit in bytes for this network interface.
1205 */
1206 #define ETH_NET_DEVICE_INIT(dev_id, name, init_fn, pm, data, config, \
1207 prio, api, mtu) \
1208 Z_ETH_NET_DEVICE_INIT(DT_INVALID_NODE, dev_id, name, init_fn, \
1209 pm, data, config, prio, api, mtu)
1210
1211 /**
1212 * @brief Create multiple Ethernet network interfaces and bind them to network
1213 * devices.
1214 * If your network device needs more than one instance of a network interface,
1215 * use this macro below and provide a different instance suffix each time
1216 * (0, 1, 2, ... or a, b, c ... whatever works for you)
1217 *
1218 * @param dev_id Network device id.
1219 * @param name The name this instance of the driver exposes to
1220 * the system.
1221 * @param instance Instance identifier.
1222 * @param init_fn Address to the init function of the driver.
1223 * @param pm Reference to struct pm_device associated with the device.
1224 * (optional).
1225 * @param data Pointer to the device's private data.
1226 * @param config The address to the structure containing the
1227 * configuration information for this instance of the driver.
1228 * @param prio The initialization level at which configuration occurs.
1229 * @param api Provides an initial pointer to the API function struct
1230 * used by the driver. Can be NULL.
1231 * @param mtu Maximum transfer unit in bytes for this network interface.
1232 */
1233 #define ETH_NET_DEVICE_INIT_INSTANCE(dev_id, name, instance, init_fn, \
1234 pm, data, config, prio, api, mtu) \
1235 Z_ETH_NET_DEVICE_INIT_INSTANCE(DT_INVALID_NODE, dev_id, name, \
1236 instance, init_fn, pm, data, \
1237 config, prio, api, mtu)
1238
1239 /**
1240 * @brief Like ETH_NET_DEVICE_INIT but taking metadata from a devicetree.
1241 * Create an Ethernet network interface and bind it to network device.
1242 *
1243 * @param node_id The devicetree node identifier.
1244 * @param init_fn Address to the init function of the driver.
1245 * @param pm Reference to struct pm_device associated with the device.
1246 * (optional).
1247 * @param data Pointer to the device's private data.
1248 * @param config The address to the structure containing the
1249 * configuration information for this instance of the driver.
1250 * @param prio The initialization level at which configuration occurs.
1251 * @param api Provides an initial pointer to the API function struct
1252 * used by the driver. Can be NULL.
1253 * @param mtu Maximum transfer unit in bytes for this network interface.
1254 */
1255 #define ETH_NET_DEVICE_DT_DEFINE(node_id, init_fn, pm, data, config, \
1256 prio, api, mtu) \
1257 Z_ETH_NET_DEVICE_INIT(node_id, Z_DEVICE_DT_DEV_ID(node_id), \
1258 DEVICE_DT_NAME(node_id), init_fn, pm, \
1259 data, config, prio, api, mtu)
1260
1261 /**
1262 * @brief Like ETH_NET_DEVICE_DT_DEFINE for an instance of a DT_DRV_COMPAT
1263 * compatible
1264 *
1265 * @param inst instance number. This is replaced by
1266 * <tt>DT_DRV_COMPAT(inst)</tt> in the call to ETH_NET_DEVICE_DT_DEFINE.
1267 *
1268 * @param ... other parameters as expected by ETH_NET_DEVICE_DT_DEFINE.
1269 */
1270 #define ETH_NET_DEVICE_DT_INST_DEFINE(inst, ...) \
1271 ETH_NET_DEVICE_DT_DEFINE(DT_DRV_INST(inst), __VA_ARGS__)
1272
1273 /**
1274 * @brief Ethernet L3 protocol register macro.
1275 *
1276 * @param name Name of the L3 protocol.
1277 * @param ptype Ethernet protocol type.
1278 * @param handler Handler function for this protocol type.
1279 */
1280 #define ETH_NET_L3_REGISTER(name, ptype, handler) \
1281 NET_L3_REGISTER(&NET_L2_GET_NAME(ETHERNET), name, ptype, handler)
1282
1283 /**
1284 * @brief Inform ethernet L2 driver that ethernet carrier is detected.
1285 * This happens when cable is connected.
1286 *
1287 * @param iface Network interface
1288 */
1289 void net_eth_carrier_on(struct net_if *iface);
1290
1291 /**
1292 * @brief Inform ethernet L2 driver that ethernet carrier was lost.
1293 * This happens when cable is disconnected.
1294 *
1295 * @param iface Network interface
1296 */
1297 void net_eth_carrier_off(struct net_if *iface);
1298
1299 /**
1300 * @brief Set promiscuous mode either ON or OFF.
1301 *
1302 * @param iface Network interface
1303 *
1304 * @param enable on (true) or off (false)
1305 *
1306 * @return 0 if mode set or unset was successful, <0 otherwise.
1307 */
1308 int net_eth_promisc_mode(struct net_if *iface, bool enable);
1309
1310 /**
1311 * @brief Set TX-Injection mode either ON or OFF.
1312 *
1313 * @param iface Network interface
1314 *
1315 * @param enable on (true) or off (false)
1316 *
1317 * @return 0 if mode set or unset was successful, <0 otherwise.
1318 */
1319 int net_eth_txinjection_mode(struct net_if *iface, bool enable);
1320
1321 /**
1322 * @brief Set or unset HW filtering for MAC address @p mac.
1323 *
1324 * @param iface Network interface
1325 * @param mac Pointer to an ethernet MAC address
1326 * @param type Filter type, either source or destination
1327 * @param enable Set (true) or unset (false)
1328 *
1329 * @return 0 if filter set or unset was successful, <0 otherwise.
1330 */
1331 int net_eth_mac_filter(struct net_if *iface, struct net_eth_addr *mac,
1332 enum ethernet_filter_type type, bool enable);
1333
1334 /**
1335 * @brief Return the PHY device that is tied to this ethernet network interface.
1336 *
1337 * @param iface Network interface
1338 *
1339 * @return Pointer to PHY device if found, NULL if not found.
1340 */
1341 const struct device *net_eth_get_phy(struct net_if *iface);
1342
1343 /**
1344 * @brief Return PTP clock that is tied to this ethernet network interface.
1345 *
1346 * @param iface Network interface
1347 *
1348 * @return Pointer to PTP clock if found, NULL if not found or if this
1349 * ethernet interface does not support PTP.
1350 */
1351 #if defined(CONFIG_PTP_CLOCK)
1352 const struct device *net_eth_get_ptp_clock(struct net_if *iface);
1353 #else
net_eth_get_ptp_clock(struct net_if * iface)1354 static inline const struct device *net_eth_get_ptp_clock(struct net_if *iface)
1355 {
1356 ARG_UNUSED(iface);
1357
1358 return NULL;
1359 }
1360 #endif
1361
1362 /**
1363 * @brief Return PTP clock that is tied to this ethernet network interface
1364 * index.
1365 *
1366 * @param index Network interface index
1367 *
1368 * @return Pointer to PTP clock if found, NULL if not found or if this
1369 * ethernet interface index does not support PTP.
1370 */
1371 __syscall const struct device *net_eth_get_ptp_clock_by_index(int index);
1372
1373 /**
1374 * @brief Return PTP port number attached to this interface.
1375 *
1376 * @param iface Network interface
1377 *
1378 * @return Port number, no such port if < 0
1379 */
1380 #if defined(CONFIG_NET_L2_PTP)
1381 int net_eth_get_ptp_port(struct net_if *iface);
1382 #else
net_eth_get_ptp_port(struct net_if * iface)1383 static inline int net_eth_get_ptp_port(struct net_if *iface)
1384 {
1385 ARG_UNUSED(iface);
1386
1387 return -ENODEV;
1388 }
1389 #endif /* CONFIG_NET_L2_PTP */
1390
1391 /**
1392 * @brief Set PTP port number attached to this interface.
1393 *
1394 * @param iface Network interface
1395 * @param port Port number to set
1396 */
1397 #if defined(CONFIG_NET_L2_PTP)
1398 void net_eth_set_ptp_port(struct net_if *iface, int port);
1399 #else
net_eth_set_ptp_port(struct net_if * iface,int port)1400 static inline void net_eth_set_ptp_port(struct net_if *iface, int port)
1401 {
1402 ARG_UNUSED(iface);
1403 ARG_UNUSED(port);
1404 }
1405 #endif /* CONFIG_NET_L2_PTP */
1406
1407 /**
1408 * @brief Check if the Ethernet L2 network interface can perform Wi-Fi.
1409 *
1410 * @param iface Pointer to network interface
1411 *
1412 * @return True if interface supports Wi-Fi, False otherwise.
1413 */
net_eth_type_is_wifi(struct net_if * iface)1414 static inline bool net_eth_type_is_wifi(struct net_if *iface)
1415 {
1416 const struct ethernet_context *ctx = (struct ethernet_context *)
1417 net_if_l2_data(iface);
1418
1419 return ctx->eth_if_type == L2_ETH_IF_TYPE_WIFI;
1420 }
1421
1422 /**
1423 * @}
1424 */
1425
1426 #ifdef __cplusplus
1427 }
1428 #endif
1429
1430 #include <zephyr/syscalls/ethernet.h>
1431
1432 #endif /* ZEPHYR_INCLUDE_NET_ETHERNET_H_ */
1433