9 #ifndef TEMU_ETHERNET_H
10 #define TEMU_ETHERNET_H
63 #define TEMU_ETH_CRC_ERR 1
65 #define TEMU_ETH_ETH_CRC_NOT_SET (1 << 1)
66 #define TEMU_ETH_IP_CRC_NOT_SET (1 << 2)
67 #define TEMU_ETH_UDP_CRC_NOT_SET (1 << 3)
68 #define TEMU_ETH_TCP_CRC_NOT_SET (1 << 4)
69 #define TEMU_ETH_NON_STANDARD_PREAMBLE (1 << 5)
90 void (*
up)(
void *Dev);
95 void (*
setMAC)(
void *Dev, uint64_t MAC);
97 #define TEMU_MAC_IFACE_TYPE "temu::MACIface"
102 temu_EthernetIfaceRef
106 temu_EthernetIfaceRef
109 void (*
up)(
void *Dev);
120 #define TEMU_PHY_IFACE_TYPE "temu::PHYIface"
124 #define TEMU_ETH_100BASE_T4 (1 << (15 - 8))
125 #define TEMU_ETH_100BASE_X_FD (1 << (14 - 8))
126 #define TEMU_ETH_100BASE_X_HD (1 << (13 - 8))
127 #define TEMU_ETH_10BASE_FD (1 << (12 - 8))
128 #define TEMU_ETH_10BASE_HD (1 << (11 - 8))
129 #define TEMU_ETH_100BASE_T2_FD (1 << (10 - 8))
130 #define TEMU_ETH_100BASE_T2_HD (1 << (9 - 8))
133 #define TEMU_ETH_1000BASE_X_FD (1 << 15)
134 #define TEMU_ETH_1000BASE_X_HD (1 << 14)
135 #define TEMU_ETH_1000BASE_T_FD (1 << 13)
136 #define TEMU_ETH_1000BASE_T_HD (1 << 12)
143 temu_PHYIfaceRef Dev);
145 temu_PHYIfaceRef Dev);
149 void (*
addMAC)(
void *Obj, temu_PHYIfaceRef Dev, uint64_t MAC);
150 void (*
removeMAC)(
void *Obj, temu_PHYIfaceRef Dev, uint64_t MAC);
161 #define TEMU_ETHERNET_IFACE_TYPE "temu::EthernetIface"
176 int32_t (*readReg)(
void *Obj,
unsigned PHY_ID, uint16_t Addr);
177 int (*writeReg)(
void *Obj,
unsigned PHY_ID, uint16_t Addr, uint16_t Value);
179 #define TEMU_MDIO_IFACE_TYPE "temu::MDIOIface"
182 #define TEMU_ETH_MIN_PAYLOAD 46
183 #define TEMU_ETH_MAX_PAYLOAD 1500
184 #define TEMU_ETH_LAYER1_HEADER_LENGTH (7 + 1 + 12 + 2)
185 #define TEMU_ETH_LAYER2_HEADER_LENGTH (6 + 6 + 2)
186 #define TEMU_ETH_CRC_LENGTH 4
187 #define TEMU_ETH_INTERPACKET_GAP 12
188 #define TEMU_ETH_PAYLOAD_OFFSET (6 + 6 + 2)
189 #define TEMU_ETH_MAX_FRAME_LENGTH 1518
190 #define TEMU_ETH_802_1Q_MAX_FRAME_LENGTH 1522
195 #define TEMU_ETHTYPE_IPV4 0x0800
196 #define TEMU_ETHTYPE_ARP 0x0806
197 #define TEMU_ETHTYPE_WAKE_ON_LAN 0x0842
198 #define TEMU_ETHTYPE_SRP 0x22ea
199 #define TEMU_ETHTYPE_RARP 0x8035
200 #define TEMU_ETHTYPE_802_1Q 0x8100
201 #define TEMU_ETHTYPE_IPV6 0x86dd
202 #define TEMU_ETHTYPE_PTP 0x88f7
203 #define TEMU_ETHTYPE_TTE_CTRL 0x891d
206 #define TEMU_ETH_IPV4_VERS_IHL_OFFSET (TEMU_ETH_PAYLOAD_OFFSET + 0)
207 #define TEMU_ETH_IPV4_DSCP_ECN_OFFSET (TEMU_ETH_PAYLOAD_OFFSET + 1)
208 #define TEMU_ETH_IPV4_TOTAL_LENGTH_OFFSET (TEMU_ETH_PAYLOAD_OFFSET + 2)
209 #define TEMU_ETH_IPV4_FRAGMENTATION_INFO_OFFSET (TEMU_ETH_PAYLOAD_OFFSET + 6)
210 #define TEMU_ETH_IPV4_TTL_OFFSET (TEMU_ETH_PAYLOAD_OFFSET + 8)
211 #define TEMU_ETH_IPV4_PROTOCOL_OFFSET (TEMU_ETH_PAYLOAD_OFFSET + 9)
212 #define TEMU_ETH_IPV4_CRC_OFFSET (TEMU_ETH_PAYLOAD_OFFSET + 10)
213 #define TEMU_ETH_IPV4_SRC_IP_OFFSET (TEMU_ETH_PAYLOAD_OFFSET + 12)
214 #define TEMU_ETH_IPV4_DST_IP_OFFSET (TEMU_ETH_PAYLOAD_OFFSET + 16)
216 #define TEMU_IP_PROT_TCP 0x06
217 #define TEMU_IP_PROT_UDP 0x11
220 #define TEMU_TCP_CRC_OFFSET 16
221 #define TEMU_UDP_CRC_OFFSET 6
223 static inline uint64_t
229 for (
int i = 0; i < 6; ++i) {
236 static inline uint64_t
242 for (
int i = 6; i < 12; ++i) {
249 static inline uint16_t
262 static inline const uint8_t *
270 static inline const uint16_t
282 static inline uint16_t
288 for (
int i = 12; i < 14; ++i) {
295 #define ETH_BCAST_ADDR UINT64_C(0xffffffffffff)
300 uint64_t MAC = temu_ethGetDestMAC(Frame);
320 #define ETH_ETHERTYPE_MIN 1536
322 #define ETH_CRC_MAGIC 0xC704DD7B
323 #define ETH_CRC_POLY_NORM 0x04C11DB7
324 #define ETH_CRC_POLY_REV 0xEDB88320
325 #define ETH_CRC_POLY_REV_RECIP 0x82608EDB
327 #define ETH_CRC_POLY_LE 0xedb88320
328 #define ETH_CRC_POLY_BE 0x04c11db6
#define TEMU_ETH_PAYLOAD_OFFSET
uint8_t Sfd
Start frame delimiter, normally 0xab.
void(* disconnected)(void *Dev)
TEMU_API const uint8_t * temu_buffReadableData(const temu_Buff *B)
int(* send)(void *Dev, temu_EthFrame *Frame)
void(* removeMAC)(void *Obj, temu_PHYIfaceRef Dev, uint64_t MAC)
void(* disconnected)(void *Dev, temu_EthernetIfaceRef Link)
void(* setMAC)(void *Dev, uint64_t MAC)
int(* receive)(void *Dev, temu_EthFrame *Frame)
void(* autoNegotiateDone)(void *Obj, uint32_t Caps)
uint32_t Flags
Flags used for error injection.
void(* addMAC)(void *Obj, temu_PHYIfaceRef Dev, uint64_t MAC)
uint64_t(* getMAC)(void *Dev)
void(* disconnect)(void *Obj, temu_PHYIfaceRef Dev)
int(* receive)(void *Dev, temu_EthFrame *Frame)
#define TEMU_IFACE_REFERENCE_TYPE(N)
void(* connected)(void *Dev, temu_EthernetIfaceRef Link)
void(* connected)(void *Dev)
TEMU_API uint32_t temu_buffLen(const temu_Buff *B)
#define TEMU_ETH_CRC_LENGTH
uint32_t(* autoNegotiate)(void *Obj, uint32_t Caps)
int(* send)(void *Obj, temu_EthFrame *Frame)
void(* connect)(void *Obj, temu_PHYIfaceRef Dev)
void(* setPromiscuous)(void *Obj, temu_PHYIfaceRef Dev, int PromiscuousMode)
temu_Buff Data
ETH frame data.
uint32_t(* autoNegotiate)(void *Obj, uint32_t Caps)