Zephyr API Documentation 4.2.99
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
ethernet.h
Go to the documentation of this file.
1
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>
27#include <zephyr/net/ptp_time.h>
28
29#if defined(CONFIG_NET_DSA_DEPRECATED)
30#include <zephyr/net/dsa.h>
31#endif
32
33#if defined(CONFIG_NET_ETHERNET_BRIDGE)
35#endif
36
37#ifdef __cplusplus
38extern "C" {
39#endif
40
49
50#define NET_ETH_ADDR_LEN 6U
51
56
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
118
119#define NET_ETH_MINIMAL_FRAME_SIZE 60
120#define NET_ETH_MTU 1500
121
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#if defined(CONFIG_DSA_TAG_SIZE)
133#define DSA_TAG_SIZE CONFIG_DSA_TAG_SIZE
134#else
135#define DSA_TAG_SIZE 0
136#endif
137
138#define NET_ETH_MAX_FRAME_SIZE (_NET_ETH_MAX_FRAME_SIZE + DSA_TAG_SIZE)
139#define NET_ETH_MAX_HDR_SIZE (_NET_ETH_MAX_HDR_SIZE + DSA_TAG_SIZE)
140
141#define NET_ETH_VLAN_HDR_SIZE 4
142
144
210
212
213#if !defined(CONFIG_NET_DSA_DEPRECATED)
214enum dsa_port_type {
215 NON_DSA_PORT,
216 DSA_CONDUIT_PORT,
217 DSA_USER_PORT,
218 DSA_CPU_PORT,
219 DSA_PORT,
220};
221#endif
222
223enum ethernet_config_type {
224 ETHERNET_CONFIG_TYPE_MAC_ADDRESS,
225 ETHERNET_CONFIG_TYPE_QAV_PARAM,
226 ETHERNET_CONFIG_TYPE_QBV_PARAM,
227 ETHERNET_CONFIG_TYPE_QBU_PARAM,
228 ETHERNET_CONFIG_TYPE_TXTIME_PARAM,
229 ETHERNET_CONFIG_TYPE_PROMISC_MODE,
230 ETHERNET_CONFIG_TYPE_PRIORITY_QUEUES_NUM,
231 ETHERNET_CONFIG_TYPE_FILTER,
232 ETHERNET_CONFIG_TYPE_PORTS_NUM,
233 ETHERNET_CONFIG_TYPE_T1S_PARAM,
234 ETHERNET_CONFIG_TYPE_TXINJECTION_MODE,
235 ETHERNET_CONFIG_TYPE_RX_CHECKSUM_SUPPORT,
236 ETHERNET_CONFIG_TYPE_TX_CHECKSUM_SUPPORT,
237 ETHERNET_CONFIG_TYPE_EXTRA_TX_PKT_HEADROOM,
238};
239
240enum ethernet_qav_param_type {
241 ETHERNET_QAV_PARAM_TYPE_DELTA_BANDWIDTH,
242 ETHERNET_QAV_PARAM_TYPE_IDLE_SLOPE,
243 ETHERNET_QAV_PARAM_TYPE_OPER_IDLE_SLOPE,
244 ETHERNET_QAV_PARAM_TYPE_TRAFFIC_CLASS,
245 ETHERNET_QAV_PARAM_TYPE_STATUS,
246};
247
248enum ethernet_t1s_param_type {
249 ETHERNET_T1S_PARAM_TYPE_PLCA_CONFIG,
250};
251
253
257 enum ethernet_t1s_param_type type;
258 union {
282 struct {
284 bool enable;
296 };
297};
298
304 enum ethernet_qav_param_type type;
305 union {
309 unsigned int delta_bandwidth;
311 unsigned int idle_slope;
313 unsigned int oper_idle_slope;
315 unsigned int traffic_class;
316 };
317};
318
320
321enum ethernet_qbv_param_type {
322 ETHERNET_QBV_PARAM_TYPE_STATUS,
323 ETHERNET_QBV_PARAM_TYPE_GATE_CONTROL_LIST,
324 ETHERNET_QBV_PARAM_TYPE_GATE_CONTROL_LIST_LEN,
325 ETHERNET_QBV_PARAM_TYPE_TIME,
326};
327
328enum ethernet_qbv_state_type {
329 ETHERNET_QBV_STATE_TYPE_ADMIN,
330 ETHERNET_QBV_STATE_TYPE_OPER,
331};
332
333enum ethernet_gate_state_operation {
334 ETHERNET_SET_GATE_STATE,
335 ETHERNET_SET_AND_HOLD_MAC_STATE,
336 ETHERNET_SET_AND_RELEASE_MAC_STATE,
337};
338
340
346 enum ethernet_qbv_param_type type;
348 enum ethernet_qbv_state_type state;
349 union {
352
354 struct {
356 bool gate_status[NET_TC_TX_COUNT];
357
359 enum ethernet_gate_state_operation operation;
360
363
367
370
375 struct {
378
381
384 };
385 };
386};
387
389
390enum ethernet_qbu_param_type {
391 ETHERNET_QBU_PARAM_TYPE_STATUS,
392 ETHERNET_QBU_PARAM_TYPE_RELEASE_ADVANCE,
393 ETHERNET_QBU_PARAM_TYPE_HOLD_ADVANCE,
394 ETHERNET_QBU_PARAM_TYPE_PREEMPTION_STATUS_TABLE,
395
396 /* Some preemption settings are from Qbr spec. */
397 ETHERNET_QBR_PARAM_TYPE_LINK_PARTNER_STATUS,
398 ETHERNET_QBR_PARAM_TYPE_ADDITIONAL_FRAGMENT_SIZE,
399};
400
401enum ethernet_qbu_preempt_status {
402 ETHERNET_QBU_STATUS_EXPRESS,
403 ETHERNET_QBU_STATUS_PREEMPTABLE
404} __packed;
405
407
413 enum ethernet_qbu_param_type type;
414 union {
417
420
422 enum ethernet_qbu_preempt_status
423 frame_preempt_statuses[NET_TC_TX_COUNT];
424
427
430
436 };
437};
438
440
441enum ethernet_filter_type {
442 ETHERNET_FILTER_TYPE_SRC_MAC_ADDRESS,
443 ETHERNET_FILTER_TYPE_DST_MAC_ADDRESS,
444};
445
447
456
460 enum ethernet_filter_type type;
464 bool set;
465};
466
468
469enum ethernet_txtime_param_type {
470 ETHERNET_TXTIME_PARAM_TYPE_ENABLE_QUEUES,
471};
472
474
478 enum ethernet_txtime_param_type type;
483};
484
488 ETHERNET_CHECKSUM_SUPPORT_NONE = NET_IF_CHECKSUM_NONE_BIT,
490 ETHERNET_CHECKSUM_SUPPORT_IPV4_HEADER = NET_IF_CHECKSUM_IPV4_HEADER_BIT,
492 ETHERNET_CHECKSUM_SUPPORT_IPV4_ICMP = NET_IF_CHECKSUM_IPV4_ICMP_BIT,
494 ETHERNET_CHECKSUM_SUPPORT_IPV6_HEADER = NET_IF_CHECKSUM_IPV6_HEADER_BIT,
496 ETHERNET_CHECKSUM_SUPPORT_IPV6_ICMP = NET_IF_CHECKSUM_IPV6_ICMP_BIT,
498 ETHERNET_CHECKSUM_SUPPORT_TCP = NET_IF_CHECKSUM_TCP_BIT,
500 ETHERNET_CHECKSUM_SUPPORT_UDP = NET_IF_CHECKSUM_UDP_BIT,
501};
502
504
505struct ethernet_config {
506 union {
507 bool promisc_mode;
508 bool txinjection_mode;
509
510 struct net_eth_addr mac_address;
511
512 struct ethernet_t1s_param t1s_param;
513 struct ethernet_qav_param qav_param;
514 struct ethernet_qbv_param qbv_param;
515 struct ethernet_qbu_param qbu_param;
516 struct ethernet_txtime_param txtime_param;
517
518 int priority_queues_num;
519 int ports_num;
520
521 enum ethernet_checksum_support chksum_support;
522
523 struct ethernet_filter filter;
524
525 uint16_t extra_tx_pkt_headroom;
526 };
527};
528
530
537 struct net_if_api iface_api;
538
543#if defined(CONFIG_NET_STATISTICS_ETHERNET)
544 struct net_stats_eth *(*get_stats)(const struct device *dev);
545#endif
546
548 int (*start)(const struct device *dev);
549
551 int (*stop)(const struct device *dev);
552
554 enum ethernet_hw_caps (*get_capabilities)(const struct device *dev);
555
557 int (*set_config)(const struct device *dev,
558 enum ethernet_config_type type,
559 const struct ethernet_config *config);
560
562 int (*get_config)(const struct device *dev,
563 enum ethernet_config_type type,
564 struct ethernet_config *config);
565
571#if defined(CONFIG_NET_VLAN)
572 int (*vlan_setup)(const struct device *dev, struct net_if *iface,
573 uint16_t tag, bool enable);
574#endif /* CONFIG_NET_VLAN */
575
577#if defined(CONFIG_PTP_CLOCK)
578 const struct device *(*get_ptp_clock)(const struct device *dev);
579#endif /* CONFIG_PTP_CLOCK */
580
582 const struct device *(*get_phy)(const struct device *dev);
583
585 int (*send)(const struct device *dev, struct net_pkt *pkt);
586};
587
589
590/* Make sure that the network interface API is properly setup inside
591 * Ethernet API struct (it is the first one).
592 */
593BUILD_ASSERT(offsetof(struct ethernet_api, iface_api) == 0);
594
595struct net_eth_hdr {
596 struct net_eth_addr dst;
597 struct net_eth_addr src;
598 uint16_t type;
599} __packed;
600
601struct ethernet_vlan {
603 struct net_if *iface;
604
606 uint16_t tag;
607};
608
609#if defined(CONFIG_NET_VLAN_COUNT)
610#define NET_VLAN_MAX_COUNT CONFIG_NET_VLAN_COUNT
611#else
612#define NET_VLAN_MAX_COUNT 0
613#endif
614
616
643
645
646enum ethernet_flags {
647 ETH_CARRIER_UP,
648};
649
651struct ethernet_context {
656
657#if defined(CONFIG_NET_ETHERNET_BRIDGE)
658 struct net_if *bridge;
659#endif
660
667 struct k_work carrier_work;
668
670 struct net_if *iface;
671
672#if defined(CONFIG_NET_LLDP)
673#if NET_VLAN_MAX_COUNT > 0
674#define NET_LLDP_MAX_COUNT NET_VLAN_MAX_COUNT
675#else
676#define NET_LLDP_MAX_COUNT 1
677#endif /* NET_VLAN_MAX_COUNT > 0 */
678
680 struct ethernet_lldp lldp[NET_LLDP_MAX_COUNT];
681#endif
682
686 enum net_l2_flags ethernet_l2_flags;
687
688#if defined(CONFIG_NET_L2_PTP)
693 int port;
694#endif
695
696#if defined(CONFIG_NET_DSA_DEPRECATED)
700 dsa_net_recv_cb_t dsa_recv_cb;
701
703 uint8_t dsa_port_idx;
704
706 struct dsa_context *dsa_ctx;
707
709 dsa_send_t dsa_send;
710
711#elif defined(CONFIG_NET_DSA)
713 enum dsa_port_type dsa_port;
714
716 void *dsa_switch_ctx;
717#endif
718
720 bool is_net_carrier_up : 1;
721
723 bool is_init : 1;
724
726 enum ethernet_if_types eth_if_type;
727};
728
734void ethernet_init(struct net_if *iface);
735
736#define ETHERNET_L2_CTX_TYPE struct ethernet_context
737
738/* Separate header for VLAN as some of device interfaces might not
739 * support VLAN.
740 */
741struct net_eth_vlan_hdr {
742 struct net_eth_addr dst;
743 struct net_eth_addr src;
744 struct {
745 uint16_t tpid; /* tag protocol id */
746 uint16_t tci; /* tag control info */
747 } vlan;
748 uint16_t type;
749} __packed;
750
752
760static inline bool net_eth_is_addr_broadcast(struct net_eth_addr *addr)
761{
762 if (addr->addr[0] == 0xff &&
763 addr->addr[1] == 0xff &&
764 addr->addr[2] == 0xff &&
765 addr->addr[3] == 0xff &&
766 addr->addr[4] == 0xff &&
767 addr->addr[5] == 0xff) {
768 return true;
769 }
770
771 return false;
772}
773
781static inline bool net_eth_is_addr_all_zeroes(struct net_eth_addr *addr)
782{
783 if (addr->addr[0] == 0x00 &&
784 addr->addr[1] == 0x00 &&
785 addr->addr[2] == 0x00 &&
786 addr->addr[3] == 0x00 &&
787 addr->addr[4] == 0x00 &&
788 addr->addr[5] == 0x00) {
789 return true;
790 }
791
792 return false;
793}
794
802static inline bool net_eth_is_addr_unspecified(struct net_eth_addr *addr)
803{
804 if (addr->addr[0] == 0x00 &&
805 addr->addr[1] == 0x00 &&
806 addr->addr[2] == 0x00 &&
807 addr->addr[3] == 0x00 &&
808 addr->addr[4] == 0x00 &&
809 addr->addr[5] == 0x00) {
810 return true;
811 }
812
813 return false;
814}
815
823static inline bool net_eth_is_addr_multicast(struct net_eth_addr *addr)
824{
825#if defined(CONFIG_NET_IPV6)
826 if (addr->addr[0] == 0x33 &&
827 addr->addr[1] == 0x33) {
828 return true;
829 }
830#endif
831
832#if defined(CONFIG_NET_IPV4)
833 if (addr->addr[0] == 0x01 &&
834 addr->addr[1] == 0x00 &&
835 addr->addr[2] == 0x5e) {
836 return true;
837 }
838#endif
839
840 return false;
841}
842
850static inline bool net_eth_is_addr_group(struct net_eth_addr *addr)
851{
852 return addr->addr[0] & 0x01;
853}
854
862static inline bool net_eth_is_addr_valid(struct net_eth_addr *addr)
863{
865}
866
874static inline bool net_eth_is_addr_lldp_multicast(struct net_eth_addr *addr)
875{
876#if defined(CONFIG_NET_GPTP) || defined(CONFIG_NET_LLDP)
877 if (addr->addr[0] == 0x01 &&
878 addr->addr[1] == 0x80 &&
879 addr->addr[2] == 0xc2 &&
880 addr->addr[3] == 0x00 &&
881 addr->addr[4] == 0x00 &&
882 addr->addr[5] == 0x0e) {
883 return true;
884 }
885#else
886 ARG_UNUSED(addr);
887#endif
888
889 return false;
890}
891
899static inline bool net_eth_is_addr_ptp_multicast(struct net_eth_addr *addr)
900{
901#if defined(CONFIG_NET_GPTP)
902 if (addr->addr[0] == 0x01 &&
903 addr->addr[1] == 0x1b &&
904 addr->addr[2] == 0x19 &&
905 addr->addr[3] == 0x00 &&
906 addr->addr[4] == 0x00 &&
907 addr->addr[5] == 0x00) {
908 return true;
909 }
910#else
911 ARG_UNUSED(addr);
912#endif
913
914 return false;
915}
916
923
930void net_eth_ipv4_mcast_to_mac_addr(const struct in_addr *ipv4_addr,
931 struct net_eth_addr *mac_addr);
932
939void net_eth_ipv6_mcast_to_mac_addr(const struct in6_addr *ipv6_addr,
940 struct net_eth_addr *mac_addr);
941
949static inline
951{
952 const struct device *dev = net_if_get_device(iface);
953 const struct ethernet_api *api = (struct ethernet_api *)dev->api;
954 enum ethernet_hw_caps caps = (enum ethernet_hw_caps)0;
955#if defined(CONFIG_NET_DSA) && !defined(CONFIG_NET_DSA_DEPRECATED)
956 struct ethernet_context *eth_ctx = net_if_l2_data(iface);
957
958 if (eth_ctx->dsa_port == DSA_CONDUIT_PORT) {
960 } else if (eth_ctx->dsa_port == DSA_USER_PORT) {
962 }
963#endif
964 if (api == NULL || api->get_capabilities == NULL) {
965 return caps;
966 }
967
968 return (enum ethernet_hw_caps)(caps | api->get_capabilities(dev));
969}
970
980static inline
981int net_eth_get_hw_config(struct net_if *iface, enum ethernet_config_type type,
982 struct ethernet_config *config)
983{
984 const struct ethernet_api *eth =
985 (struct ethernet_api *)net_if_get_device(iface)->api;
986
987 if (!eth->get_config) {
988 return -ENOTSUP;
989 }
990
991 return eth->get_config(net_if_get_device(iface), type, config);
992}
993
994
1003#if defined(CONFIG_NET_VLAN) && NET_VLAN_MAX_COUNT > 0
1004int net_eth_vlan_enable(struct net_if *iface, uint16_t tag);
1005#else
1006static inline int net_eth_vlan_enable(struct net_if *iface, uint16_t tag)
1007{
1008 ARG_UNUSED(iface);
1009 ARG_UNUSED(tag);
1010
1011 return -EINVAL;
1012}
1013#endif
1014
1023#if defined(CONFIG_NET_VLAN) && NET_VLAN_MAX_COUNT > 0
1024int net_eth_vlan_disable(struct net_if *iface, uint16_t tag);
1025#else
1026static inline int net_eth_vlan_disable(struct net_if *iface, uint16_t tag)
1027{
1028 ARG_UNUSED(iface);
1029 ARG_UNUSED(tag);
1030
1031 return -EINVAL;
1032}
1033#endif
1034
1046#if defined(CONFIG_NET_VLAN) && NET_VLAN_MAX_COUNT > 0
1047uint16_t net_eth_get_vlan_tag(struct net_if *iface);
1048#else
1049static inline uint16_t net_eth_get_vlan_tag(struct net_if *iface)
1050{
1051 ARG_UNUSED(iface);
1052
1053 return NET_VLAN_TAG_UNSPEC;
1054}
1055#endif
1056
1066#if defined(CONFIG_NET_VLAN)
1067struct net_if *net_eth_get_vlan_iface(struct net_if *iface, uint16_t tag);
1068#else
1069static inline
1071{
1072 ARG_UNUSED(iface);
1073 ARG_UNUSED(tag);
1074
1075 return NULL;
1076}
1077#endif
1078
1088#if defined(CONFIG_NET_VLAN) && NET_VLAN_MAX_COUNT > 0
1089struct net_if *net_eth_get_vlan_main(struct net_if *iface);
1090#else
1091static inline
1093{
1094 ARG_UNUSED(iface);
1095
1096 return NULL;
1097}
1098#endif
1099
1113#if defined(CONFIG_NET_VLAN)
1114bool net_eth_is_vlan_enabled(struct ethernet_context *ctx,
1115 struct net_if *iface);
1116#else
1117static inline bool net_eth_is_vlan_enabled(struct ethernet_context *ctx,
1118 struct net_if *iface)
1119{
1120 ARG_UNUSED(ctx);
1121 ARG_UNUSED(iface);
1122
1123 return false;
1124}
1125#endif
1126
1134#if defined(CONFIG_NET_VLAN) && NET_VLAN_MAX_COUNT > 0
1135bool net_eth_get_vlan_status(struct net_if *iface);
1136#else
1137static inline bool net_eth_get_vlan_status(struct net_if *iface)
1138{
1139 ARG_UNUSED(iface);
1140
1141 return false;
1142}
1143#endif
1144
1152#if defined(CONFIG_NET_VLAN) && NET_VLAN_MAX_COUNT > 0
1153bool net_eth_is_vlan_interface(struct net_if *iface);
1154#else
1155static inline bool net_eth_is_vlan_interface(struct net_if *iface)
1156{
1157 ARG_UNUSED(iface);
1158
1159 return false;
1160}
1161#endif
1162
1164
1165#if !defined(CONFIG_ETH_DRIVER_RAW_MODE)
1166
1167#define Z_ETH_NET_DEVICE_INIT_INSTANCE(node_id, dev_id, name, instance, \
1168 init_fn, pm, data, config, prio, \
1169 api, mtu) \
1170 Z_NET_DEVICE_INIT_INSTANCE(node_id, dev_id, name, instance, \
1171 init_fn, pm, data, config, prio, \
1172 api, ETHERNET_L2, \
1173 NET_L2_GET_CTX_TYPE(ETHERNET_L2), mtu)
1174
1175#else /* CONFIG_ETH_DRIVER_RAW_MODE */
1176
1177#define Z_ETH_NET_DEVICE_INIT_INSTANCE(node_id, dev_id, name, instance, \
1178 init_fn, pm, data, config, prio, \
1179 api, mtu) \
1180 Z_DEVICE_STATE_DEFINE(dev_id); \
1181 Z_DEVICE_DEFINE(node_id, dev_id, name, init_fn, NULL, \
1182 Z_DEVICE_DT_FLAGS(node_id), pm, data, \
1183 config, POST_KERNEL, prio, api, \
1184 &Z_DEVICE_STATE_NAME(dev_id));
1185
1186#endif /* CONFIG_ETH_DRIVER_RAW_MODE */
1187
1188#define Z_ETH_NET_DEVICE_INIT(node_id, dev_id, name, init_fn, pm, data, \
1189 config, prio, api, mtu) \
1190 Z_ETH_NET_DEVICE_INIT_INSTANCE(node_id, dev_id, name, 0, \
1191 init_fn, pm, data, config, prio, \
1192 api, mtu)
1193
1195
1213#define ETH_NET_DEVICE_INIT(dev_id, name, init_fn, pm, data, config, \
1214 prio, api, mtu) \
1215 Z_ETH_NET_DEVICE_INIT(DT_INVALID_NODE, dev_id, name, init_fn, \
1216 pm, data, config, prio, api, mtu)
1217
1240#define ETH_NET_DEVICE_INIT_INSTANCE(dev_id, name, instance, init_fn, \
1241 pm, data, config, prio, api, mtu) \
1242 Z_ETH_NET_DEVICE_INIT_INSTANCE(DT_INVALID_NODE, dev_id, name, \
1243 instance, init_fn, pm, data, \
1244 config, prio, api, mtu)
1245
1262#define ETH_NET_DEVICE_DT_DEFINE(node_id, init_fn, pm, data, config, \
1263 prio, api, mtu) \
1264 Z_ETH_NET_DEVICE_INIT(node_id, Z_DEVICE_DT_DEV_ID(node_id), \
1265 DEVICE_DT_NAME(node_id), init_fn, pm, \
1266 data, config, prio, api, mtu)
1267
1277#define ETH_NET_DEVICE_DT_INST_DEFINE(inst, ...) \
1278 ETH_NET_DEVICE_DT_DEFINE(DT_DRV_INST(inst), __VA_ARGS__)
1279
1287#define ETH_NET_L3_REGISTER(name, ptype, handler) \
1288 NET_L3_REGISTER(&NET_L2_GET_NAME(ETHERNET), name, ptype, handler)
1289
1296void net_eth_carrier_on(struct net_if *iface);
1297
1304void net_eth_carrier_off(struct net_if *iface);
1305
1315int net_eth_promisc_mode(struct net_if *iface, bool enable);
1316
1326int net_eth_txinjection_mode(struct net_if *iface, bool enable);
1327
1338int net_eth_mac_filter(struct net_if *iface, struct net_eth_addr *mac,
1339 enum ethernet_filter_type type, bool enable);
1340
1348const struct device *net_eth_get_phy(struct net_if *iface);
1349
1358#if defined(CONFIG_PTP_CLOCK)
1359const struct device *net_eth_get_ptp_clock(struct net_if *iface);
1360#else
1361static inline const struct device *net_eth_get_ptp_clock(struct net_if *iface)
1362{
1363 ARG_UNUSED(iface);
1364
1365 return NULL;
1366}
1367#endif
1368
1378__syscall const struct device *net_eth_get_ptp_clock_by_index(int index);
1379
1387#if defined(CONFIG_NET_L2_PTP)
1388int net_eth_get_ptp_port(struct net_if *iface);
1389#else
1390static inline int net_eth_get_ptp_port(struct net_if *iface)
1391{
1392 ARG_UNUSED(iface);
1393
1394 return -ENODEV;
1395}
1396#endif /* CONFIG_NET_L2_PTP */
1397
1404#if defined(CONFIG_NET_L2_PTP)
1405void net_eth_set_ptp_port(struct net_if *iface, int port);
1406#else
1407static inline void net_eth_set_ptp_port(struct net_if *iface, int port)
1408{
1409 ARG_UNUSED(iface);
1410 ARG_UNUSED(port);
1411}
1412#endif /* CONFIG_NET_L2_PTP */
1413
1421static inline bool net_eth_type_is_wifi(struct net_if *iface)
1422{
1423 const struct ethernet_context *ctx = (struct ethernet_context *)
1424 net_if_l2_data(iface);
1425
1426 return ctx->eth_if_type == L2_ETH_IF_TYPE_WIFI;
1427}
1428
1432
1433#ifdef __cplusplus
1434}
1435#endif
1436
1437#include <zephyr/syscalls/ethernet.h>
1438
1439#endif /* ZEPHYR_INCLUDE_NET_ETHERNET_H_ */
long atomic_t
Definition atomic_types.h:15
DSA definitions and handlers.
Ethernet Bridge public header file.
VLAN specific definitions.
enum net_verdict(* dsa_net_recv_cb_t)(struct net_if *iface, struct net_pkt *pkt)
DSA (MGMT) Receive packet callback.
Definition dsa.h:70
int(* dsa_send_t)(const struct device *dev, struct net_pkt *pkt)
Pointer to master interface send function.
Definition dsa.h:96
static struct net_if * net_eth_get_vlan_main(struct net_if *iface)
Return main network interface that is attached to this VLAN tag.
Definition ethernet.h:1092
static int net_eth_get_hw_config(struct net_if *iface, enum ethernet_config_type type, struct ethernet_config *config)
Return ethernet device hardware configuration information.
Definition ethernet.h:981
ethernet_if_types
Types of Ethernet L2.
Definition ethernet.h:449
static void net_eth_set_ptp_port(struct net_if *iface, int port)
Set PTP port number attached to this interface.
Definition ethernet.h:1407
static int net_eth_vlan_enable(struct net_if *iface, uint16_t tag)
Add VLAN tag to the interface.
Definition ethernet.h:1006
static bool net_eth_is_addr_all_zeroes(struct net_eth_addr *addr)
Check if the Ethernet MAC address is a all zeroes address.
Definition ethernet.h:781
static bool net_eth_is_addr_multicast(struct net_eth_addr *addr)
Check if the Ethernet MAC address is a multicast address.
Definition ethernet.h:823
static int net_eth_get_ptp_port(struct net_if *iface)
Return PTP port number attached to this interface.
Definition ethernet.h:1390
static const struct device * net_eth_get_ptp_clock(struct net_if *iface)
Return PTP clock that is tied to this ethernet network interface.
Definition ethernet.h:1361
#define NET_ETH_ADDR_LEN
Ethernet MAC address length.
Definition ethernet.h:50
int net_eth_promisc_mode(struct net_if *iface, bool enable)
Set promiscuous mode either ON or OFF.
void net_eth_carrier_off(struct net_if *iface)
Inform ethernet L2 driver that ethernet carrier was lost.
static uint16_t net_eth_get_vlan_tag(struct net_if *iface)
Return VLAN tag specified to network interface.
Definition ethernet.h:1049
static bool net_eth_type_is_wifi(struct net_if *iface)
Check if the Ethernet L2 network interface can perform Wi-Fi.
Definition ethernet.h:1421
const struct device * net_eth_get_phy(struct net_if *iface)
Return the PHY device that is tied to this ethernet network interface.
static bool net_eth_is_addr_broadcast(struct net_eth_addr *addr)
Check if the Ethernet MAC address is a broadcast address.
Definition ethernet.h:760
static bool net_eth_get_vlan_status(struct net_if *iface)
Get VLAN status for a given network interface (enabled or not).
Definition ethernet.h:1137
static bool net_eth_is_addr_group(struct net_eth_addr *addr)
Check if the Ethernet MAC address is a group address.
Definition ethernet.h:850
const struct device * net_eth_get_ptp_clock_by_index(int index)
Return PTP clock that is tied to this ethernet network interface index.
static bool net_eth_is_addr_unspecified(struct net_eth_addr *addr)
Check if the Ethernet MAC address is unspecified.
Definition ethernet.h:802
static bool net_eth_is_vlan_interface(struct net_if *iface)
Check if the given interface is a VLAN interface.
Definition ethernet.h:1155
ethernet_hw_caps
Ethernet hardware capabilities.
Definition ethernet.h:146
int net_eth_mac_filter(struct net_if *iface, struct net_eth_addr *mac, enum ethernet_filter_type type, bool enable)
Set or unset HW filtering for MAC address mac.
void net_eth_ipv6_mcast_to_mac_addr(const struct in6_addr *ipv6_addr, struct net_eth_addr *mac_addr)
Convert IPv6 multicast address to Ethernet address.
static enum ethernet_hw_caps net_eth_get_hw_capabilities(struct net_if *iface)
Return ethernet device hardware capability information.
Definition ethernet.h:950
static int net_eth_vlan_disable(struct net_if *iface, uint16_t tag)
Remove VLAN tag from the interface.
Definition ethernet.h:1026
void net_eth_carrier_on(struct net_if *iface)
Inform ethernet L2 driver that ethernet carrier is detected.
ethernet_checksum_support
Protocols that are supported by checksum offloading.
Definition ethernet.h:486
static bool net_eth_is_vlan_enabled(struct ethernet_context *ctx, struct net_if *iface)
Check if there are any VLAN interfaces enabled to this specific Ethernet network interface.
Definition ethernet.h:1117
static struct net_if * net_eth_get_vlan_iface(struct net_if *iface, uint16_t tag)
Return network interface related to this VLAN tag.
Definition ethernet.h:1070
void net_eth_ipv4_mcast_to_mac_addr(const struct in_addr *ipv4_addr, struct net_eth_addr *mac_addr)
Convert IPv4 multicast address to Ethernet address.
const struct net_eth_addr * net_eth_broadcast_addr(void)
Return Ethernet broadcast address.
static bool net_eth_is_addr_lldp_multicast(struct net_eth_addr *addr)
Check if the Ethernet MAC address is a LLDP multicast address.
Definition ethernet.h:874
static bool net_eth_is_addr_ptp_multicast(struct net_eth_addr *addr)
Check if the Ethernet MAC address is a PTP multicast address.
Definition ethernet.h:899
static bool net_eth_is_addr_valid(struct net_eth_addr *addr)
Check if the Ethernet MAC address is valid.
Definition ethernet.h:862
int net_eth_txinjection_mode(struct net_if *iface, bool enable)
Set TX-Injection mode either ON or OFF.
@ L2_ETH_IF_TYPE_ETHERNET
IEEE 802.3 Ethernet (default)
Definition ethernet.h:451
@ L2_ETH_IF_TYPE_WIFI
IEEE 802.11 Wi-Fi.
Definition ethernet.h:454
@ ETHERNET_HW_VLAN
VLAN supported.
Definition ethernet.h:154
@ ETHERNET_DSA_USER_PORT
DSA switch user port.
Definition ethernet.h:193
@ ETHERNET_PRIORITY_QUEUES
Priority queues available.
Definition ethernet.h:181
@ ETHERNET_HW_VLAN_TAG_STRIP
VLAN Tag stripping.
Definition ethernet.h:190
@ ETHERNET_LINK_100BASE
100 Mbits link supported
Definition ethernet.h:160
@ ETHERNET_DSA_CONDUIT_PORT
DSA switch conduit port.
Definition ethernet.h:196
@ ETHERNET_LINK_10BASE
10 Mbits link supported
Definition ethernet.h:157
@ ETHERNET_HW_FILTERING
MAC address filtering supported.
Definition ethernet.h:184
@ ETHERNET_LINK_1000BASE
1 Gbits link supported
Definition ethernet.h:163
@ ETHERNET_PTP
IEEE 802.1AS (gPTP) clock supported.
Definition ethernet.h:172
@ ETHERNET_QBU
IEEE 802.1Qbu (frame preemption) supported.
Definition ethernet.h:202
@ ETHERNET_TXINJECTION_MODE
TX-Injection supported.
Definition ethernet.h:208
@ ETHERNET_QAV
IEEE 802.1Qav (credit-based shaping) supported.
Definition ethernet.h:175
@ ETHERNET_HW_RX_CHKSUM_OFFLOAD
RX Checksum offloading supported for all of IPv4, UDP, TCP.
Definition ethernet.h:151
@ ETHERNET_LLDP
Link Layer Discovery Protocol supported.
Definition ethernet.h:187
@ ETHERNET_LINK_5000BASE
5 Gbits link supported
Definition ethernet.h:169
@ ETHERNET_TXTIME
TXTIME supported.
Definition ethernet.h:205
@ ETHERNET_QBV
IEEE 802.1Qbv (scheduled traffic) supported.
Definition ethernet.h:199
@ ETHERNET_PROMISC_MODE
Promiscuous mode supported.
Definition ethernet.h:178
@ ETHERNET_HW_TX_CHKSUM_OFFLOAD
TX Checksum offloading supported for all of IPv4, UDP, TCP.
Definition ethernet.h:148
@ ETHERNET_LINK_2500BASE
2.5 Gbits link supported
Definition ethernet.h:166
@ ETHERNET_CHECKSUM_SUPPORT_UDP
Device supports UDP checksum offloading for all supported IP protocols.
Definition ethernet.h:500
@ ETHERNET_CHECKSUM_SUPPORT_TCP
Device supports TCP checksum offloading for all supported IP protocols.
Definition ethernet.h:498
@ ETHERNET_CHECKSUM_SUPPORT_IPV6_HEADER
Device supports checksum offloading for the IPv6 header.
Definition ethernet.h:494
@ ETHERNET_CHECKSUM_SUPPORT_IPV4_ICMP
Device supports checksum offloading for ICMPv4 payload (implies IPv4 header)
Definition ethernet.h:492
@ ETHERNET_CHECKSUM_SUPPORT_IPV4_HEADER
Device supports checksum offloading for the IPv4 header.
Definition ethernet.h:490
@ ETHERNET_CHECKSUM_SUPPORT_NONE
Device does not support any L3/L4 checksum offloading.
Definition ethernet.h:488
@ ETHERNET_CHECKSUM_SUPPORT_IPV6_ICMP
Device supports checksum offloading for ICMPv6 payload (implies IPv6 header)
Definition ethernet.h:496
enum net_verdict(* net_lldp_recv_cb_t)(struct net_if *iface, struct net_pkt *pkt)
LLDP Receive packet callback.
Definition lldp.h:215
static void * net_if_l2_data(struct net_if *iface)
Get a pointer to the interface L2 private data.
Definition net_if.h:1034
static const struct device * net_if_get_device(struct net_if *iface)
Get an network interface's device.
Definition net_if.h:1050
net_l2_flags
L2 flags.
Definition net_l2.h:37
struct _snode sys_snode_t
Single-linked list node structure.
Definition slist.h:39
#define BIT(n)
Unsigned integer with bit position n set (signed in assembly language).
Definition util_macro.h:44
#define EINVAL
Invalid argument.
Definition errno.h:60
#define ENOTSUP
Unsupported value.
Definition errno.h:114
#define ENODEV
No such device.
Definition errno.h:57
#define NET_VLAN_TAG_UNSPEC
Unspecified VLAN tag value.
Definition ethernet_vlan.h:32
#define NULL
Definition iar_missing_defs.h:20
#define BUILD_ASSERT(EXPR, MSG...)
Definition llvm.h:51
Public kernel APIs.
LLDP definitions and handler.
Public API for network interface.
IPv6 and IPv4 definitions.
Network packet buffer descriptor API.
flags
Definition parser.h:97
Public functions for the Precision Time Protocol time specification.
__UINT32_TYPE__ uint32_t
Definition stdint.h:90
__UINT8_TYPE__ uint8_t
Definition stdint.h:88
__UINT16_TYPE__ uint16_t
Definition stdint.h:89
__INT64_TYPE__ int64_t
Definition stdint.h:75
Runtime device structure (in ROM) per driver instance.
Definition device.h:510
const void * api
Address of the API structure exposed by the device instance.
Definition device.h:516
Ethernet L2 API operations.
Definition ethernet.h:532
struct net_if_api iface_api
The net_if_api must be placed in first position in this struct so that we are compatible with network...
Definition ethernet.h:537
int(* start)(const struct device *dev)
Collect optional ethernet specific statistics.
Definition ethernet.h:548
int(* get_config)(const struct device *dev, enum ethernet_config_type type, struct ethernet_config *config)
Get hardware specific configuration.
Definition ethernet.h:562
int(* stop)(const struct device *dev)
Stop the device.
Definition ethernet.h:551
enum ethernet_hw_caps(* get_capabilities)(const struct device *dev)
Get the device capabilities.
Definition ethernet.h:554
int(* send)(const struct device *dev, struct net_pkt *pkt)
Send a network packet.
Definition ethernet.h:585
int(* set_config)(const struct device *dev, enum ethernet_config_type type, const struct ethernet_config *config)
Set specific hardware configuration.
Definition ethernet.h:557
Ethernet filter description.
Definition ethernet.h:458
struct net_eth_addr mac_address
MAC address to filter.
Definition ethernet.h:462
bool set
Set (true) or unset (false) the filter.
Definition ethernet.h:464
enum ethernet_filter_type type
Type of filter.
Definition ethernet.h:460
Ethernet LLDP specific parameters.
Definition ethernet.h:618
const uint8_t * optional_du
LLDP Data Unit optional TLVs for the interface.
Definition ethernet.h:626
sys_snode_t node
Used for track timers.
Definition ethernet.h:620
net_lldp_recv_cb_t cb
LLDP RX callback function.
Definition ethernet.h:641
size_t optional_len
Length of the optional Data Unit TLVs.
Definition ethernet.h:629
struct net_if * iface
Network interface that has LLDP supported.
Definition ethernet.h:632
const struct net_lldpdu * lldpdu
LLDP Data Unit mandatory TLVs for the interface.
Definition ethernet.h:623
uint32_t tx_timer_timeout
LLDP TX timeout.
Definition ethernet.h:638
int64_t tx_timer_start
LLDP TX timer start time.
Definition ethernet.h:635
Ethernet Qav specific parameters.
Definition ethernet.h:300
bool enabled
True if Qav is enabled for queue.
Definition ethernet.h:307
unsigned int oper_idle_slope
Oper Idle Slope (bits per second)
Definition ethernet.h:313
enum ethernet_qav_param_type type
Type of Qav parameter.
Definition ethernet.h:304
unsigned int traffic_class
Traffic class the queue is bound to.
Definition ethernet.h:315
int queue_id
ID of the priority queue to use.
Definition ethernet.h:302
unsigned int idle_slope
Idle Slope (bits per second)
Definition ethernet.h:311
unsigned int delta_bandwidth
Delta Bandwidth (percentage of bandwidth)
Definition ethernet.h:309
Ethernet Qbu specific parameters.
Definition ethernet.h:409
enum ethernet_qbu_preempt_status frame_preempt_statuses[NET_TC_TX_COUNT]
sequence of framePreemptionAdminStatus values
Definition ethernet.h:422
uint32_t release_advance
Release advance (nanoseconds)
Definition ethernet.h:419
enum ethernet_qbu_param_type type
Type of Qbu parameter.
Definition ethernet.h:413
uint32_t hold_advance
Hold advance (nanoseconds)
Definition ethernet.h:416
bool enabled
True if Qbu is enabled or not.
Definition ethernet.h:426
bool link_partner_status
Link partner status (from Qbr)
Definition ethernet.h:429
int port_id
Port id.
Definition ethernet.h:411
uint8_t additional_fragment_size
Additional fragment size (from Qbr).
Definition ethernet.h:435
Ethernet Qbv specific parameters.
Definition ethernet.h:342
int port_id
Port id.
Definition ethernet.h:344
bool enabled
True if Qbv is enabled or not.
Definition ethernet.h:351
enum ethernet_qbv_param_type type
Type of Qbv parameter.
Definition ethernet.h:346
uint16_t row
Gate control list row.
Definition ethernet.h:365
enum ethernet_qbv_state_type state
What state (Admin/Oper) parameters are these.
Definition ethernet.h:348
bool gate_status[NET_TC_TX_COUNT]
True = open, False = closed.
Definition ethernet.h:356
struct net_ptp_extended_time base_time
Base time.
Definition ethernet.h:377
uint32_t extension_time
Extension time (nanoseconds)
Definition ethernet.h:383
enum ethernet_gate_state_operation operation
GateState operation.
Definition ethernet.h:359
struct ethernet_qbv_param::@121175361150174144233316376176000350036121201324::@102147251204031207263025171335370313217251102106 gate_control
Gate control information.
uint32_t time_interval
Time interval ticks (nanoseconds)
Definition ethernet.h:362
struct net_ptp_time cycle_time
Cycle time.
Definition ethernet.h:380
uint32_t gate_control_list_len
Number of entries in gate control list.
Definition ethernet.h:369
Ethernet T1S specific parameters.
Definition ethernet.h:255
uint8_t burst_count
T1S PLCA burst count range: 0x0 to 0xFF.
Definition ethernet.h:290
struct ethernet_t1s_param::@045104211027030365347006377040354240151366265336::@055246010323023270273151373302031315361103011354 plca
PLCA is the Physical Layer (PHY) Collision Avoidance technique employed with multidrop 10Base-T1S sta...
uint8_t node_count
T1S PLCA node count range: 1 to 255.
Definition ethernet.h:288
uint8_t to_timer
T1S PLCA TO value.
Definition ethernet.h:294
uint8_t burst_timer
T1S PLCA burst timer.
Definition ethernet.h:292
uint8_t node_id
T1S PLCA node id range: 0 to 254.
Definition ethernet.h:286
enum ethernet_t1s_param_type type
Type of T1S parameter.
Definition ethernet.h:257
bool enable
T1S PLCA enabled.
Definition ethernet.h:284
Ethernet TXTIME specific parameters.
Definition ethernet.h:476
bool enable_txtime
Enable or disable TXTIME per queue.
Definition ethernet.h:482
int queue_id
Queue number for configuring TXTIME.
Definition ethernet.h:480
enum ethernet_txtime_param_type type
Type of TXTIME parameter.
Definition ethernet.h:478
IPv6 address struct.
Definition net_ip.h:143
IPv4 address struct.
Definition net_ip.h:155
Ethernet address.
Definition ethernet.h:53
uint8_t addr[6U]
Buffer storing the address.
Definition ethernet.h:54
Network Interface structure.
Definition net_if.h:726
LLDP Data Unit (LLDPDU) shall contain the following ordered TLVs as stated in "8.2 LLDPDU format" fro...
Definition lldp.h:169
Network packet.
Definition net_pkt.h:91
Generalized Precision Time Protocol Extended Timestamp format.
Definition ptp_time.h:154
(Generalized) Precision Time Protocol Timestamp format.
Definition ptp_time.h:111
All Ethernet specific statistics.
Definition net_stats.h:625
Misc utilities.