Zephyr API Documentation 4.0.0
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
ethernet.h
Go to the documentation of this file.
1
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)
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
50#define NET_ETH_ADDR_LEN 6U
56
59#define NET_ETH_HDR(pkt) ((struct net_eth_hdr *)net_pkt_data(pkt))
60
61#define NET_ETH_PTYPE_CAN 0x000C /* CAN: Controller Area Network */
62#define NET_ETH_PTYPE_CANFD 0x000D /* CANFD: CAN flexible data rate*/
63#define NET_ETH_PTYPE_HDLC 0x0019 /* HDLC frames (like in PPP) */
64#define NET_ETH_PTYPE_ARP 0x0806
65#define NET_ETH_PTYPE_IP 0x0800
66#define NET_ETH_PTYPE_TSN 0x22f0 /* TSN (IEEE 1722) packet */
67#define NET_ETH_PTYPE_IPV6 0x86dd
68#define NET_ETH_PTYPE_VLAN 0x8100
69#define NET_ETH_PTYPE_PTP 0x88f7
70#define NET_ETH_PTYPE_LLDP 0x88cc
71#define NET_ETH_PTYPE_ALL 0x0003 /* from linux/if_ether.h */
72#define NET_ETH_PTYPE_ECAT 0x88a4
73#define NET_ETH_PTYPE_EAPOL 0x888e
74#define NET_ETH_PTYPE_IEEE802154 0x00F6 /* from linux/if_ether.h: IEEE802.15.4 frame */
75
76#if !defined(ETH_P_ALL)
77#define ETH_P_ALL NET_ETH_PTYPE_ALL
78#endif
79#if !defined(ETH_P_IP)
80#define ETH_P_IP NET_ETH_PTYPE_IP
81#endif
82#if !defined(ETH_P_ARP)
83#define ETH_P_ARP NET_ETH_PTYPE_ARP
84#endif
85#if !defined(ETH_P_IPV6)
86#define ETH_P_IPV6 NET_ETH_PTYPE_IPV6
87#endif
88#if !defined(ETH_P_8021Q)
89#define ETH_P_8021Q NET_ETH_PTYPE_VLAN
90#endif
91#if !defined(ETH_P_TSN)
92#define ETH_P_TSN NET_ETH_PTYPE_TSN
93#endif
94#if !defined(ETH_P_ECAT)
95#define ETH_P_ECAT NET_ETH_PTYPE_ECAT
96#endif
97#if !defined(ETH_P_EAPOL)
98#define ETH_P_EAPOL NET_ETH_PTYPE_EAPOL
99#endif
100#if !defined(ETH_P_IEEE802154)
101#define ETH_P_IEEE802154 NET_ETH_PTYPE_IEEE802154
102#endif
103#if !defined(ETH_P_CAN)
104#define ETH_P_CAN NET_ETH_PTYPE_CAN
105#endif
106#if !defined(ETH_P_CANFD)
107#define ETH_P_CANFD NET_ETH_PTYPE_CANFD
108#endif
109#if !defined(ETH_P_HDLC)
110#define ETH_P_HDLC NET_ETH_PTYPE_HDLC
111#endif
112
115#define NET_ETH_MINIMAL_FRAME_SIZE 60
116#define NET_ETH_MTU 1500
120#if defined(CONFIG_NET_VLAN)
121#define _NET_ETH_MAX_HDR_SIZE (sizeof(struct net_eth_vlan_hdr))
122#else
123#define _NET_ETH_MAX_HDR_SIZE (sizeof(struct net_eth_hdr))
124#endif
125
126#define _NET_ETH_MAX_FRAME_SIZE (NET_ETH_MTU + _NET_ETH_MAX_HDR_SIZE)
127/*
128 * Extend the max frame size for DSA (KSZ8794) by one byte (to 1519) to
129 * store tail tag.
130 */
131#if defined(CONFIG_NET_DSA)
132#define NET_ETH_MAX_FRAME_SIZE (_NET_ETH_MAX_FRAME_SIZE + DSA_TAG_SIZE)
133#define NET_ETH_MAX_HDR_SIZE (_NET_ETH_MAX_HDR_SIZE + DSA_TAG_SIZE)
134#else
135#define NET_ETH_MAX_FRAME_SIZE (_NET_ETH_MAX_FRAME_SIZE)
136#define NET_ETH_MAX_HDR_SIZE (_NET_ETH_MAX_HDR_SIZE)
137#endif
138
139#define NET_ETH_VLAN_HDR_SIZE 4
140
214
217enum ethernet_config_type {
218 ETHERNET_CONFIG_TYPE_AUTO_NEG,
219 ETHERNET_CONFIG_TYPE_LINK,
220 ETHERNET_CONFIG_TYPE_DUPLEX,
221 ETHERNET_CONFIG_TYPE_MAC_ADDRESS,
222 ETHERNET_CONFIG_TYPE_QAV_PARAM,
223 ETHERNET_CONFIG_TYPE_QBV_PARAM,
224 ETHERNET_CONFIG_TYPE_QBU_PARAM,
225 ETHERNET_CONFIG_TYPE_TXTIME_PARAM,
226 ETHERNET_CONFIG_TYPE_PROMISC_MODE,
227 ETHERNET_CONFIG_TYPE_PRIORITY_QUEUES_NUM,
228 ETHERNET_CONFIG_TYPE_FILTER,
229 ETHERNET_CONFIG_TYPE_PORTS_NUM,
230 ETHERNET_CONFIG_TYPE_T1S_PARAM,
231 ETHERNET_CONFIG_TYPE_TXINJECTION_MODE,
232 ETHERNET_CONFIG_TYPE_RX_CHECKSUM_SUPPORT,
233 ETHERNET_CONFIG_TYPE_TX_CHECKSUM_SUPPORT
234};
235
236enum ethernet_qav_param_type {
237 ETHERNET_QAV_PARAM_TYPE_DELTA_BANDWIDTH,
238 ETHERNET_QAV_PARAM_TYPE_IDLE_SLOPE,
239 ETHERNET_QAV_PARAM_TYPE_OPER_IDLE_SLOPE,
240 ETHERNET_QAV_PARAM_TYPE_TRAFFIC_CLASS,
241 ETHERNET_QAV_PARAM_TYPE_STATUS,
242};
243
244enum ethernet_t1s_param_type {
245 ETHERNET_T1S_PARAM_TYPE_PLCA_CONFIG,
246};
247
253 enum ethernet_t1s_param_type type;
254 union {
278 struct {
280 bool enable;
292 };
293};
294
300 enum ethernet_qav_param_type type;
301 union {
305 unsigned int delta_bandwidth;
307 unsigned int idle_slope;
309 unsigned int oper_idle_slope;
311 unsigned int traffic_class;
312 };
313};
314
317enum ethernet_qbv_param_type {
318 ETHERNET_QBV_PARAM_TYPE_STATUS,
319 ETHERNET_QBV_PARAM_TYPE_GATE_CONTROL_LIST,
320 ETHERNET_QBV_PARAM_TYPE_GATE_CONTROL_LIST_LEN,
321 ETHERNET_QBV_PARAM_TYPE_TIME,
322};
323
324enum ethernet_qbv_state_type {
325 ETHERNET_QBV_STATE_TYPE_ADMIN,
326 ETHERNET_QBV_STATE_TYPE_OPER,
327};
328
329enum ethernet_gate_state_operation {
330 ETHERNET_SET_GATE_STATE,
331 ETHERNET_SET_AND_HOLD_MAC_STATE,
332 ETHERNET_SET_AND_RELEASE_MAC_STATE,
333};
334
342 enum ethernet_qbv_param_type type;
344 enum ethernet_qbv_state_type state;
345 union {
348
350 struct {
352 bool gate_status[NET_TC_TX_COUNT];
353
355 enum ethernet_gate_state_operation operation;
356
359
363
366
371 struct {
374
377
380 };
381 };
382};
383
386enum ethernet_qbu_param_type {
387 ETHERNET_QBU_PARAM_TYPE_STATUS,
388 ETHERNET_QBU_PARAM_TYPE_RELEASE_ADVANCE,
389 ETHERNET_QBU_PARAM_TYPE_HOLD_ADVANCE,
390 ETHERNET_QBU_PARAM_TYPE_PREEMPTION_STATUS_TABLE,
391
392 /* Some preemption settings are from Qbr spec. */
393 ETHERNET_QBR_PARAM_TYPE_LINK_PARTNER_STATUS,
394 ETHERNET_QBR_PARAM_TYPE_ADDITIONAL_FRAGMENT_SIZE,
395};
396
397enum ethernet_qbu_preempt_status {
398 ETHERNET_QBU_STATUS_EXPRESS,
399 ETHERNET_QBU_STATUS_PREEMPTABLE
400} __packed;
401
409 enum ethernet_qbu_param_type type;
410 union {
413
416
418 enum ethernet_qbu_preempt_status
419 frame_preempt_statuses[NET_TC_TX_COUNT];
420
423
426
432 };
433};
434
437enum ethernet_filter_type {
438 ETHERNET_FILTER_TYPE_SRC_MAC_ADDRESS,
439 ETHERNET_FILTER_TYPE_DST_MAC_ADDRESS,
440};
441
452
456 enum ethernet_filter_type type;
460 bool set;
461};
462
465enum ethernet_txtime_param_type {
466 ETHERNET_TXTIME_PARAM_TYPE_ENABLE_QUEUES,
467};
468
474 enum ethernet_txtime_param_type type;
479};
480
484 ETHERNET_CHECKSUM_SUPPORT_NONE = NET_IF_CHECKSUM_NONE_BIT,
486 ETHERNET_CHECKSUM_SUPPORT_IPV4_HEADER = NET_IF_CHECKSUM_IPV4_HEADER_BIT,
488 ETHERNET_CHECKSUM_SUPPORT_IPV4_ICMP = NET_IF_CHECKSUM_IPV4_ICMP_BIT,
490 ETHERNET_CHECKSUM_SUPPORT_IPV6_HEADER = NET_IF_CHECKSUM_IPV6_HEADER_BIT,
492 ETHERNET_CHECKSUM_SUPPORT_IPV6_ICMP = NET_IF_CHECKSUM_IPV6_ICMP_BIT,
494 ETHERNET_CHECKSUM_SUPPORT_TCP = NET_IF_CHECKSUM_TCP_BIT,
496 ETHERNET_CHECKSUM_SUPPORT_UDP = NET_IF_CHECKSUM_UDP_BIT,
497};
498
501struct ethernet_config {
502 union {
503 bool auto_negotiation;
504 bool full_duplex;
505 bool promisc_mode;
506 bool txinjection_mode;
507
508 struct {
509 bool link_10bt;
510 bool link_100bt;
511 bool link_1000bt;
512 } l;
513
514 struct net_eth_addr mac_address;
515
516 struct ethernet_t1s_param t1s_param;
517 struct ethernet_qav_param qav_param;
518 struct ethernet_qbv_param qbv_param;
519 struct ethernet_qbu_param qbu_param;
520 struct ethernet_txtime_param txtime_param;
521
522 int priority_queues_num;
523 int ports_num;
524
525 enum ethernet_checksum_support chksum_support;
526
527 struct ethernet_filter filter;
528 };
529};
530
539 struct net_if_api iface_api;
540
545#if defined(CONFIG_NET_STATISTICS_ETHERNET)
546 struct net_stats_eth *(*get_stats)(const struct device *dev);
547#endif
548
550 int (*start)(const struct device *dev);
551
553 int (*stop)(const struct device *dev);
554
556 enum ethernet_hw_caps (*get_capabilities)(const struct device *dev);
557
559 int (*set_config)(const struct device *dev,
560 enum ethernet_config_type type,
561 const struct ethernet_config *config);
562
564 int (*get_config)(const struct device *dev,
565 enum ethernet_config_type type,
566 struct ethernet_config *config);
567
573#if defined(CONFIG_NET_VLAN)
574 int (*vlan_setup)(const struct device *dev, struct net_if *iface,
575 uint16_t tag, bool enable);
576#endif /* CONFIG_NET_VLAN */
577
579#if defined(CONFIG_PTP_CLOCK)
580 const struct device *(*get_ptp_clock)(const struct device *dev);
581#endif /* CONFIG_PTP_CLOCK */
582
584 const struct device *(*get_phy)(const struct device *dev);
585
587 int (*send)(const struct device *dev, struct net_pkt *pkt);
588};
589
592/* Make sure that the network interface API is properly setup inside
593 * Ethernet API struct (it is the first one).
594 */
595BUILD_ASSERT(offsetof(struct ethernet_api, iface_api) == 0);
596
597struct net_eth_hdr {
598 struct net_eth_addr dst;
599 struct net_eth_addr src;
600 uint16_t type;
601} __packed;
602
603struct ethernet_vlan {
605 struct net_if *iface;
606
608 uint16_t tag;
609};
610
611#if defined(CONFIG_NET_VLAN_COUNT)
612#define NET_VLAN_MAX_COUNT CONFIG_NET_VLAN_COUNT
613#else
614/* Even thou there are no VLAN support, the minimum count must be set to 1.
615 */
616#define NET_VLAN_MAX_COUNT 1
617#endif
618
647
650enum ethernet_flags {
651 ETH_CARRIER_UP,
652};
653
655struct ethernet_context {
660
661#if defined(CONFIG_NET_ETHERNET_BRIDGE)
662 struct net_if *bridge;
663#endif
664
671 struct k_work carrier_work;
672
674 struct net_if *iface;
675
676#if defined(CONFIG_NET_LLDP)
677 struct ethernet_lldp lldp[NET_VLAN_MAX_COUNT];
678#endif
679
683 enum net_l2_flags ethernet_l2_flags;
684
685#if defined(CONFIG_NET_L2_PTP)
690 int port;
691#endif
692
693#if defined(CONFIG_NET_DSA)
697 dsa_net_recv_cb_t dsa_recv_cb;
698
700 uint8_t dsa_port_idx;
701
703 struct dsa_context *dsa_ctx;
704
706 dsa_send_t dsa_send;
707#endif
708
710 bool is_net_carrier_up : 1;
711
713 bool is_init : 1;
714
716 enum ethernet_if_types eth_if_type;
717};
718
724void ethernet_init(struct net_if *iface);
725
726#define ETHERNET_L2_CTX_TYPE struct ethernet_context
727
728/* Separate header for VLAN as some of device interfaces might not
729 * support VLAN.
730 */
731struct net_eth_vlan_hdr {
732 struct net_eth_addr dst;
733 struct net_eth_addr src;
734 struct {
735 uint16_t tpid; /* tag protocol id */
736 uint16_t tci; /* tag control info */
737 } vlan;
738 uint16_t type;
739} __packed;
740
750static inline bool net_eth_is_addr_broadcast(struct net_eth_addr *addr)
751{
752 if (addr->addr[0] == 0xff &&
753 addr->addr[1] == 0xff &&
754 addr->addr[2] == 0xff &&
755 addr->addr[3] == 0xff &&
756 addr->addr[4] == 0xff &&
757 addr->addr[5] == 0xff) {
758 return true;
759 }
760
761 return false;
762}
763
771static inline bool net_eth_is_addr_all_zeroes(struct net_eth_addr *addr)
772{
773 if (addr->addr[0] == 0x00 &&
774 addr->addr[1] == 0x00 &&
775 addr->addr[2] == 0x00 &&
776 addr->addr[3] == 0x00 &&
777 addr->addr[4] == 0x00 &&
778 addr->addr[5] == 0x00) {
779 return true;
780 }
781
782 return false;
783}
784
792static inline bool net_eth_is_addr_unspecified(struct net_eth_addr *addr)
793{
794 if (addr->addr[0] == 0x00 &&
795 addr->addr[1] == 0x00 &&
796 addr->addr[2] == 0x00 &&
797 addr->addr[3] == 0x00 &&
798 addr->addr[4] == 0x00 &&
799 addr->addr[5] == 0x00) {
800 return true;
801 }
802
803 return false;
804}
805
813static inline bool net_eth_is_addr_multicast(struct net_eth_addr *addr)
814{
815#if defined(CONFIG_NET_IPV6)
816 if (addr->addr[0] == 0x33 &&
817 addr->addr[1] == 0x33) {
818 return true;
819 }
820#endif
821
822#if defined(CONFIG_NET_IPV4)
823 if (addr->addr[0] == 0x01 &&
824 addr->addr[1] == 0x00 &&
825 addr->addr[2] == 0x5e) {
826 return true;
827 }
828#endif
829
830 return false;
831}
832
840static inline bool net_eth_is_addr_group(struct net_eth_addr *addr)
841{
842 return addr->addr[0] & 0x01;
843}
844
852static inline bool net_eth_is_addr_valid(struct net_eth_addr *addr)
853{
855}
856
864static inline bool net_eth_is_addr_lldp_multicast(struct net_eth_addr *addr)
865{
866#if defined(CONFIG_NET_GPTP) || defined(CONFIG_NET_LLDP)
867 if (addr->addr[0] == 0x01 &&
868 addr->addr[1] == 0x80 &&
869 addr->addr[2] == 0xc2 &&
870 addr->addr[3] == 0x00 &&
871 addr->addr[4] == 0x00 &&
872 addr->addr[5] == 0x0e) {
873 return true;
874 }
875#else
876 ARG_UNUSED(addr);
877#endif
878
879 return false;
880}
881
889static inline bool net_eth_is_addr_ptp_multicast(struct net_eth_addr *addr)
890{
891#if defined(CONFIG_NET_GPTP)
892 if (addr->addr[0] == 0x01 &&
893 addr->addr[1] == 0x1b &&
894 addr->addr[2] == 0x19 &&
895 addr->addr[3] == 0x00 &&
896 addr->addr[4] == 0x00 &&
897 addr->addr[5] == 0x00) {
898 return true;
899 }
900#else
901 ARG_UNUSED(addr);
902#endif
903
904 return false;
905}
906
913
920void net_eth_ipv4_mcast_to_mac_addr(const struct in_addr *ipv4_addr,
921 struct net_eth_addr *mac_addr);
922
929void net_eth_ipv6_mcast_to_mac_addr(const struct in6_addr *ipv6_addr,
930 struct net_eth_addr *mac_addr);
931
939static inline
941{
942 const struct device *dev = net_if_get_device(iface);
943 const struct ethernet_api *api = (struct ethernet_api *)dev->api;
944
945 if (!api || !api->get_capabilities) {
946 return (enum ethernet_hw_caps)0;
947 }
948
949 return api->get_capabilities(dev);
950}
951
961static inline
962int net_eth_get_hw_config(struct net_if *iface, enum ethernet_config_type type,
963 struct ethernet_config *config)
964{
965 const struct ethernet_api *eth =
966 (struct ethernet_api *)net_if_get_device(iface)->api;
967
968 if (!eth->get_config) {
969 return -ENOTSUP;
970 }
971
972 return eth->get_config(net_if_get_device(iface), type, config);
973}
974
975
984#if defined(CONFIG_NET_VLAN)
985int net_eth_vlan_enable(struct net_if *iface, uint16_t tag);
986#else
987static inline int net_eth_vlan_enable(struct net_if *iface, uint16_t tag)
988{
989 ARG_UNUSED(iface);
990 ARG_UNUSED(tag);
991
992 return -EINVAL;
993}
994#endif
995
1004#if defined(CONFIG_NET_VLAN)
1005int net_eth_vlan_disable(struct net_if *iface, uint16_t tag);
1006#else
1007static inline int net_eth_vlan_disable(struct net_if *iface, uint16_t tag)
1008{
1009 ARG_UNUSED(iface);
1010 ARG_UNUSED(tag);
1011
1012 return -EINVAL;
1013}
1014#endif
1015
1027#if defined(CONFIG_NET_VLAN)
1028uint16_t net_eth_get_vlan_tag(struct net_if *iface);
1029#else
1030static inline uint16_t net_eth_get_vlan_tag(struct net_if *iface)
1031{
1032 ARG_UNUSED(iface);
1033
1034 return NET_VLAN_TAG_UNSPEC;
1035}
1036#endif
1037
1047#if defined(CONFIG_NET_VLAN)
1048struct net_if *net_eth_get_vlan_iface(struct net_if *iface, uint16_t tag);
1049#else
1050static inline
1052{
1053 ARG_UNUSED(iface);
1054 ARG_UNUSED(tag);
1055
1056 return NULL;
1057}
1058#endif
1059
1069#if defined(CONFIG_NET_VLAN)
1070struct net_if *net_eth_get_vlan_main(struct net_if *iface);
1071#else
1072static inline
1074{
1075 ARG_UNUSED(iface);
1076
1077 return NULL;
1078}
1079#endif
1080
1094#if defined(CONFIG_NET_VLAN)
1095bool net_eth_is_vlan_enabled(struct ethernet_context *ctx,
1096 struct net_if *iface);
1097#else
1098static inline bool net_eth_is_vlan_enabled(struct ethernet_context *ctx,
1099 struct net_if *iface)
1100{
1101 ARG_UNUSED(ctx);
1102 ARG_UNUSED(iface);
1103
1104 return false;
1105}
1106#endif
1107
1115#if defined(CONFIG_NET_VLAN)
1116bool net_eth_get_vlan_status(struct net_if *iface);
1117#else
1118static inline bool net_eth_get_vlan_status(struct net_if *iface)
1119{
1120 ARG_UNUSED(iface);
1121
1122 return false;
1123}
1124#endif
1125
1133#if defined(CONFIG_NET_VLAN)
1134bool net_eth_is_vlan_interface(struct net_if *iface);
1135#else
1136static inline bool net_eth_is_vlan_interface(struct net_if *iface)
1137{
1138 ARG_UNUSED(iface);
1139
1140 return false;
1141}
1142#endif
1143
1146#if !defined(CONFIG_ETH_DRIVER_RAW_MODE)
1147
1148#define Z_ETH_NET_DEVICE_INIT_INSTANCE(node_id, dev_id, name, instance, \
1149 init_fn, pm, data, config, prio, \
1150 api, mtu) \
1151 Z_NET_DEVICE_INIT_INSTANCE(node_id, dev_id, name, instance, \
1152 init_fn, pm, data, config, prio, \
1153 api, ETHERNET_L2, \
1154 NET_L2_GET_CTX_TYPE(ETHERNET_L2), mtu)
1155
1156#else /* CONFIG_ETH_DRIVER_RAW_MODE */
1157
1158#define Z_ETH_NET_DEVICE_INIT_INSTANCE(node_id, dev_id, name, instance, \
1159 init_fn, pm, data, config, prio, \
1160 api, mtu) \
1161 Z_DEVICE_STATE_DEFINE(dev_id); \
1162 Z_DEVICE_DEFINE(node_id, dev_id, name, init_fn, pm, data, \
1163 config, POST_KERNEL, prio, api, \
1164 &Z_DEVICE_STATE_NAME(dev_id));
1165
1166#endif /* CONFIG_ETH_DRIVER_RAW_MODE */
1167
1168#define Z_ETH_NET_DEVICE_INIT(node_id, dev_id, name, init_fn, pm, data, \
1169 config, prio, api, mtu) \
1170 Z_ETH_NET_DEVICE_INIT_INSTANCE(node_id, dev_id, name, 0, \
1171 init_fn, pm, data, config, prio, \
1172 api, mtu)
1173
1193#define ETH_NET_DEVICE_INIT(dev_id, name, init_fn, pm, data, config, \
1194 prio, api, mtu) \
1195 Z_ETH_NET_DEVICE_INIT(DT_INVALID_NODE, dev_id, name, init_fn, \
1196 pm, data, config, prio, api, mtu)
1197
1220#define ETH_NET_DEVICE_INIT_INSTANCE(dev_id, name, instance, init_fn, \
1221 pm, data, config, prio, api, mtu) \
1222 Z_ETH_NET_DEVICE_INIT_INSTANCE(DT_INVALID_NODE, dev_id, name, \
1223 instance, init_fn, pm, data, \
1224 config, prio, api, mtu)
1225
1242#define ETH_NET_DEVICE_DT_DEFINE(node_id, init_fn, pm, data, config, \
1243 prio, api, mtu) \
1244 Z_ETH_NET_DEVICE_INIT(node_id, Z_DEVICE_DT_DEV_ID(node_id), \
1245 DEVICE_DT_NAME(node_id), init_fn, pm, \
1246 data, config, prio, api, mtu)
1247
1257#define ETH_NET_DEVICE_DT_INST_DEFINE(inst, ...) \
1258 ETH_NET_DEVICE_DT_DEFINE(DT_DRV_INST(inst), __VA_ARGS__)
1259
1266void net_eth_carrier_on(struct net_if *iface);
1267
1274void net_eth_carrier_off(struct net_if *iface);
1275
1285int net_eth_promisc_mode(struct net_if *iface, bool enable);
1286
1296int net_eth_txinjection_mode(struct net_if *iface, bool enable);
1297
1308int net_eth_mac_filter(struct net_if *iface, struct net_eth_addr *mac,
1309 enum ethernet_filter_type type, bool enable);
1310
1318const struct device *net_eth_get_phy(struct net_if *iface);
1319
1328#if defined(CONFIG_PTP_CLOCK)
1329const struct device *net_eth_get_ptp_clock(struct net_if *iface);
1330#else
1331static inline const struct device *net_eth_get_ptp_clock(struct net_if *iface)
1332{
1333 ARG_UNUSED(iface);
1334
1335 return NULL;
1336}
1337#endif
1338
1348__syscall const struct device *net_eth_get_ptp_clock_by_index(int index);
1349
1357#if defined(CONFIG_NET_L2_PTP)
1358int net_eth_get_ptp_port(struct net_if *iface);
1359#else
1360static inline int net_eth_get_ptp_port(struct net_if *iface)
1361{
1362 ARG_UNUSED(iface);
1363
1364 return -ENODEV;
1365}
1366#endif /* CONFIG_NET_L2_PTP */
1367
1374#if defined(CONFIG_NET_L2_PTP)
1375void net_eth_set_ptp_port(struct net_if *iface, int port);
1376#else
1377static inline void net_eth_set_ptp_port(struct net_if *iface, int port)
1378{
1379 ARG_UNUSED(iface);
1380 ARG_UNUSED(port);
1381}
1382#endif /* CONFIG_NET_L2_PTP */
1383
1391static inline bool net_eth_type_is_wifi(struct net_if *iface)
1392{
1393 const struct ethernet_context *ctx = (struct ethernet_context *)
1394 net_if_l2_data(iface);
1395
1396 return ctx->eth_if_type == L2_ETH_IF_TYPE_WIFI;
1397}
1398
1403#ifdef __cplusplus
1404}
1405#endif
1406
1407#include <zephyr/syscalls/ethernet.h>
1408
1409#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:74
int(* dsa_send_t)(const struct device *dev, struct net_pkt *pkt)
Pointer to master interface send function.
Definition dsa.h:100
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:1073
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:962
ethernet_if_types
Types of Ethernet L2.
Definition ethernet.h:445
static void net_eth_set_ptp_port(struct net_if *iface, int port)
Set PTP port number attached to this interface.
Definition ethernet.h:1377
static int net_eth_vlan_enable(struct net_if *iface, uint16_t tag)
Add VLAN tag to the interface.
Definition ethernet.h:987
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:771
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:813
static int net_eth_get_ptp_port(struct net_if *iface)
Return PTP port number attached to this interface.
Definition ethernet.h:1360
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:1331
#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:1030
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:1391
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:750
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:1118
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:840
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:792
static bool net_eth_is_vlan_interface(struct net_if *iface)
Check if the given interface is a VLAN interface.
Definition ethernet.h:1136
ethernet_hw_caps
Ethernet hardware capabilities.
Definition ethernet.h:144
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:940
static int net_eth_vlan_disable(struct net_if *iface, uint16_t tag)
Remove VLAN tag from the interface.
Definition ethernet.h:1007
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:482
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:1098
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:1051
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:864
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:889
static bool net_eth_is_addr_valid(struct net_eth_addr *addr)
Check if the Ethernet MAC address is valid.
Definition ethernet.h:852
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:447
@ L2_ETH_IF_TYPE_WIFI
IEEE 802.11 Wi-Fi.
Definition ethernet.h:450
@ ETHERNET_HW_VLAN
VLAN supported.
Definition ethernet.h:152
@ ETHERNET_PRIORITY_QUEUES
Priority queues available.
Definition ethernet.h:179
@ ETHERNET_DUPLEX_SET
Changing duplex (half/full) supported.
Definition ethernet.h:167
@ ETHERNET_HW_VLAN_TAG_STRIP
VLAN Tag stripping.
Definition ethernet.h:188
@ ETHERNET_LINK_10BASE_T
10 Mbits link supported
Definition ethernet.h:158
@ ETHERNET_HW_FILTERING
MAC address filtering supported.
Definition ethernet.h:182
@ ETHERNET_PTP
IEEE 802.1AS (gPTP) clock supported.
Definition ethernet.h:170
@ ETHERNET_LINK_2500BASE_T
2.5 Gbits link supported
Definition ethernet.h:209
@ ETHERNET_QBU
IEEE 802.1Qbu (frame preemption) supported.
Definition ethernet.h:200
@ ETHERNET_LINK_100BASE_T
100 Mbits link supported
Definition ethernet.h:161
@ ETHERNET_DSA_MASTER_PORT
DSA switch master port.
Definition ethernet.h:194
@ ETHERNET_DSA_SLAVE_PORT
DSA switch slave port.
Definition ethernet.h:191
@ ETHERNET_TXINJECTION_MODE
TX-Injection supported.
Definition ethernet.h:206
@ ETHERNET_QAV
IEEE 802.1Qav (credit-based shaping) supported.
Definition ethernet.h:173
@ ETHERNET_HW_RX_CHKSUM_OFFLOAD
RX Checksum offloading supported for all of IPv4, UDP, TCP.
Definition ethernet.h:149
@ ETHERNET_LINK_1000BASE_T
1 Gbits link supported
Definition ethernet.h:164
@ ETHERNET_LLDP
Link Layer Discovery Protocol supported.
Definition ethernet.h:185
@ ETHERNET_AUTO_NEGOTIATION_SET
Enabling/disabling auto negotiation supported.
Definition ethernet.h:155
@ ETHERNET_LINK_5000BASE_T
5 Gbits link supported
Definition ethernet.h:212
@ ETHERNET_TXTIME
TXTIME supported.
Definition ethernet.h:203
@ ETHERNET_QBV
IEEE 802.1Qbv (scheduled traffic) supported.
Definition ethernet.h:197
@ ETHERNET_PROMISC_MODE
Promiscuous mode supported.
Definition ethernet.h:176
@ ETHERNET_HW_TX_CHKSUM_OFFLOAD
TX Checksum offloading supported for all of IPv4, UDP, TCP.
Definition ethernet.h:146
@ ETHERNET_CHECKSUM_SUPPORT_UDP
Device supports UDP checksum offloading for all supported IP protocols.
Definition ethernet.h:496
@ ETHERNET_CHECKSUM_SUPPORT_TCP
Device supports TCP checksum offloading for all supported IP protocols.
Definition ethernet.h:494
@ ETHERNET_CHECKSUM_SUPPORT_IPV6_HEADER
Device supports checksum offloading for the IPv6 header.
Definition ethernet.h:490
@ ETHERNET_CHECKSUM_SUPPORT_IPV4_ICMP
Device supports checksum offloading for ICMPv4 payload (implies IPv4 header)
Definition ethernet.h:488
@ ETHERNET_CHECKSUM_SUPPORT_IPV4_HEADER
Device supports checksum offloading for the IPv4 header.
Definition ethernet.h:486
@ ETHERNET_CHECKSUM_SUPPORT_NONE
Device does not support any L3/L4 checksum offloading.
Definition ethernet.h:484
@ ETHERNET_CHECKSUM_SUPPORT_IPV6_ICMP
Device supports checksum offloading for ICMPv6 payload (implies IPv6 header)
Definition ethernet.h:492
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:929
static const struct device * net_if_get_device(struct net_if *iface)
Get an network interface's device.
Definition net_if.h:944
net_l2_flags
L2 flags.
Definition net_l2.h:36
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
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:96
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:412
const void * api
Address of the API structure exposed by the device instance.
Definition device.h:418
Ethernet L2 API operations.
Definition ethernet.h:534
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:539
int(* start)(const struct device *dev)
Collect optional ethernet specific statistics.
Definition ethernet.h:550
int(* get_config)(const struct device *dev, enum ethernet_config_type type, struct ethernet_config *config)
Get hardware specific configuration.
Definition ethernet.h:564
int(* stop)(const struct device *dev)
Stop the device.
Definition ethernet.h:553
enum ethernet_hw_caps(* get_capabilities)(const struct device *dev)
Get the device capabilities.
Definition ethernet.h:556
int(* send)(const struct device *dev, struct net_pkt *pkt)
Send a network packet.
Definition ethernet.h:587
int(* set_config)(const struct device *dev, enum ethernet_config_type type, const struct ethernet_config *config)
Set specific hardware configuration.
Definition ethernet.h:559
Ethernet filter description.
Definition ethernet.h:454
struct net_eth_addr mac_address
MAC address to filter.
Definition ethernet.h:458
bool set
Set (true) or unset (false) the filter.
Definition ethernet.h:460
enum ethernet_filter_type type
Type of filter.
Definition ethernet.h:456
Ethernet LLDP specific parameters.
Definition ethernet.h:622
const uint8_t * optional_du
LLDP Data Unit optional TLVs for the interface.
Definition ethernet.h:630
sys_snode_t node
Used for track timers.
Definition ethernet.h:624
net_lldp_recv_cb_t cb
LLDP RX callback function.
Definition ethernet.h:645
size_t optional_len
Length of the optional Data Unit TLVs.
Definition ethernet.h:633
struct net_if * iface
Network interface that has LLDP supported.
Definition ethernet.h:636
const struct net_lldpdu * lldpdu
LLDP Data Unit mandatory TLVs for the interface.
Definition ethernet.h:627
uint32_t tx_timer_timeout
LLDP TX timeout.
Definition ethernet.h:642
int64_t tx_timer_start
LLDP TX timer start time.
Definition ethernet.h:639
Ethernet Qav specific parameters.
Definition ethernet.h:296
bool enabled
True if Qav is enabled for queue.
Definition ethernet.h:303
unsigned int oper_idle_slope
Oper Idle Slope (bits per second)
Definition ethernet.h:309
enum ethernet_qav_param_type type
Type of Qav parameter.
Definition ethernet.h:300
unsigned int traffic_class
Traffic class the queue is bound to.
Definition ethernet.h:311
int queue_id
ID of the priority queue to use.
Definition ethernet.h:298
unsigned int idle_slope
Idle Slope (bits per second)
Definition ethernet.h:307
unsigned int delta_bandwidth
Delta Bandwidth (percentage of bandwidth)
Definition ethernet.h:305
Ethernet Qbu specific parameters.
Definition ethernet.h:405
enum ethernet_qbu_preempt_status frame_preempt_statuses[NET_TC_TX_COUNT]
sequence of framePreemptionAdminStatus values
Definition ethernet.h:418
uint32_t release_advance
Release advance (nanoseconds)
Definition ethernet.h:415
enum ethernet_qbu_param_type type
Type of Qbu parameter.
Definition ethernet.h:409
uint32_t hold_advance
Hold advance (nanoseconds)
Definition ethernet.h:412
bool enabled
True if Qbu is enabled or not.
Definition ethernet.h:422
bool link_partner_status
Link partner status (from Qbr)
Definition ethernet.h:425
int port_id
Port id.
Definition ethernet.h:407
uint8_t additional_fragment_size
Additional fragment size (from Qbr).
Definition ethernet.h:431
Ethernet Qbv specific parameters.
Definition ethernet.h:338
int port_id
Port id.
Definition ethernet.h:340
bool enabled
True if Qbv is enabled or not.
Definition ethernet.h:347
enum ethernet_qbv_param_type type
Type of Qbv parameter.
Definition ethernet.h:342
uint16_t row
Gate control list row.
Definition ethernet.h:361
enum ethernet_qbv_state_type state
What state (Admin/Oper) parameters are these.
Definition ethernet.h:344
struct ethernet_qbv_param::@346::@348 gate_control
Gate control information.
bool gate_status[NET_TC_TX_COUNT]
True = open, False = closed.
Definition ethernet.h:352
struct net_ptp_extended_time base_time
Base time.
Definition ethernet.h:373
uint32_t extension_time
Extension time (nanoseconds)
Definition ethernet.h:379
enum ethernet_gate_state_operation operation
GateState operation.
Definition ethernet.h:355
uint32_t time_interval
Time interval ticks (nanoseconds)
Definition ethernet.h:358
struct net_ptp_time cycle_time
Cycle time.
Definition ethernet.h:376
uint32_t gate_control_list_len
Number of entries in gate control list.
Definition ethernet.h:365
Ethernet T1S specific parameters.
Definition ethernet.h:251
uint8_t burst_count
T1S PLCA burst count range: 0x0 to 0xFF.
Definition ethernet.h:286
struct ethernet_t1s_param::@341::@343 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:284
uint8_t to_timer
T1S PLCA TO value.
Definition ethernet.h:290
uint8_t burst_timer
T1S PLCA burst timer.
Definition ethernet.h:288
uint8_t node_id
T1S PLCA node id range: 0 to 254.
Definition ethernet.h:282
enum ethernet_t1s_param_type type
Type of T1S parameter.
Definition ethernet.h:253
bool enable
T1S PLCA enabled.
Definition ethernet.h:280
Ethernet TXTIME specific parameters.
Definition ethernet.h:472
bool enable_txtime
Enable or disable TXTIME per queue.
Definition ethernet.h:478
int queue_id
Queue number for configuring TXTIME.
Definition ethernet.h:476
enum ethernet_txtime_param_type type
Type of TXTIME parameter.
Definition ethernet.h:474
IPv6 address struct.
Definition net_ip.h:142
IPv4 address struct.
Definition net_ip.h:154
A structure used to submit work.
Definition kernel.h:3957
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:680
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:544
Misc utilities.