8 #ifndef TEMU_ETHERNET_H
9 #define TEMU_ETHERNET_H
62 #define TEMU_ETH_CRC_ERR 1
64 #define TEMU_ETH_ETH_CRC_NOT_SET (1 << 1)
65 #define TEMU_ETH_IP_CRC_NOT_SET (1 << 2)
66 #define TEMU_ETH_UDP_CRC_NOT_SET (1 << 3)
67 #define TEMU_ETH_TCP_CRC_NOT_SET (1 << 4)
77 void (*connected)(
void *Dev);
78 void (*disconnected)(
void *Dev);
79 void (*up)(
void *Dev);
80 void (*down)(
void *Dev);
83 uint64_t (*getMAC)(
void *Dev);
84 void (*setMAC)(
void *Dev, uint64_t MAC);
86 #define TEMU_MAC_IFACE_TYPE "temu::MACIface"
90 void (*connected)(
void *Dev);
91 void (*disconnected)(
void *Dev);
92 void (*up)(
void *Dev);
93 void (*down)(
void *Dev);
98 #define TEMU_PHY_IFACE_TYPE "temu::PHYIface"
105 void (*connect)(
void *Obj, temu_PHYIfaceRef Dev);
106 void (*disconnect)(
void *Obj, temu_PHYIfaceRef Dev);
110 void (*addMAC)(
void *Obj, temu_PHYIfaceRef Dev, uint64_t MAC);
111 void (*removeMAC)(
void *Obj, temu_PHYIfaceRef Dev, uint64_t MAC);
112 void (*setPromiscuous)(
void *Obj, temu_PHYIfaceRef Dev,
113 int PromiscuousMode);
115 uint16_t (*autoNegotiate)(
void *Obj, uint16_t Caps);
121 #define TEMU_ETHERNET_IFACE_TYPE "temu::EthernetIface"
137 int32_t (*readReg)(
void *Obj,
unsigned PHY_ID, uint16_t Addr);
138 int (*writeReg)(
void *Obj,
unsigned PHY_ID, uint16_t Addr, uint16_t Value);
140 #define TEMU_MDIO_IFACE_TYPE "temu::MDIOIface"
143 #define TEMU_ETH_MIN_PAYLOAD 46
144 #define TEMU_ETH_MAX_PAYLOAD 1500
145 #define TEMU_ETH_LAYER1_HEADER_LENGTH (7+1+12+2)
146 #define TEMU_ETH_LAYER2_HEADER_LENGTH (6 + 6 + 2)
147 #define TEMU_ETH_CRC_LENGTH 4
148 #define TEMU_ETH_INTERPACKET_GAP 12
149 #define TEMU_ETH_PAYLOAD_OFFSET (6 + 6 + 2)
150 #define TEMU_ETH_MAX_FRAME_LENGTH 1518
151 #define TEMU_ETH_802_1Q_MAX_FRAME_LENGTH 1522
157 #define TEMU_ETHTYPE_IPV4 0x0800
158 #define TEMU_ETHTYPE_ARP 0x0806
159 #define TEMU_ETHTYPE_WAKE_ON_LAN 0x0842
160 #define TEMU_ETHTYPE_SRP 0x22ea
161 #define TEMU_ETHTYPE_RARP 0x8035
162 #define TEMU_ETHTYPE_802_1Q 0x8100
163 #define TEMU_ETHTYPE_IPV6 0x86dd
164 #define TEMU_ETHTYPE_PTP 0x88f7
165 #define TEMU_ETHTYPE_TTE_CTRL 0x891d
168 #define TEMU_ETH_IPV4_VERS_IHL_OFFSET (TEMU_ETH_PAYLOAD_OFFSET + 0)
169 #define TEMU_ETH_IPV4_DSCP_ECN_OFFSET (TEMU_ETH_PAYLOAD_OFFSET + 1)
170 #define TEMU_ETH_IPV4_TOTAL_LENGTH_OFFSET (TEMU_ETH_PAYLOAD_OFFSET + 2)
171 #define TEMU_ETH_IPV4_FRAGMENTATION_INFO_OFFSET (TEMU_ETH_PAYLOAD_OFFSET + 6)
172 #define TEMU_ETH_IPV4_TTL_OFFSET (TEMU_ETH_PAYLOAD_OFFSET + 8)
173 #define TEMU_ETH_IPV4_PROTOCOL_OFFSET (TEMU_ETH_PAYLOAD_OFFSET + 9)
174 #define TEMU_ETH_IPV4_CRC_OFFSET (TEMU_ETH_PAYLOAD_OFFSET + 10)
175 #define TEMU_ETH_IPV4_SRC_IP_OFFSET (TEMU_ETH_PAYLOAD_OFFSET + 12)
176 #define TEMU_ETH_IPV4_DST_IP_OFFSET (TEMU_ETH_PAYLOAD_OFFSET + 16)
178 #define TEMU_IP_PROT_TCP 0x06
179 #define TEMU_IP_PROT_UDP 0x11
182 #define TEMU_TCP_CRC_OFFSET 16
183 #define TEMU_UDP_CRC_OFFSET 6
185 static inline uint64_t
191 for (
int i = 0 ; i < 6 ; ++i) {
198 static inline uint64_t
204 for (
int i = 6 ; i < 12 ; ++i) {
211 static inline uint16_t
224 static inline const uint8_t*
232 static inline const uint16_t
243 static inline uint16_t
249 for (
int i = 12 ; i < 14 ; ++i) {
256 #define ETH_BCAST_ADDR UINT64_C(0xffffffffffff)
261 uint64_t MAC = temu_ethGetDestMAC(Frame);
275 if (Data[0] & 1)
return 1;
280 #define ETH_ETHERTYPE_MIN 1536
283 #define ETH_CRC_MAGIC 0xC704DD7B
284 #define ETH_CRC_POLY_NORM 0x04C11DB7
285 #define ETH_CRC_POLY_REV 0xEDB88320
286 #define ETH_CRC_POLY_REV_RECIP 0x82608EDB
288 #define ETH_CRC_POLY_LE 0xedb88320
289 #define ETH_CRC_POLY_BE 0x04c11db6
#define TEMU_ETH_PAYLOAD_OFFSET
TEMU_API const uint8_t * temu_buffReadableData(const temu_Buff *B)
uint32_t Flags
Flags used for error injection.
#define TEMU_IFACE_REFERENCE_TYPE(N)
TEMU_API uint32_t temu_buffLen(const temu_Buff *B)
#define TEMU_ETH_CRC_LENGTH
temu_Buff Data
ETH frame data.