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) 70 #define TEMU_ETH_PREAMBLE_LENGTH_MASK (0xf << 6) 71 #define TEMU_ETH_PREAMBLE_LENGTH_SHIFT 6 92 void (*
up)(
void *Dev);
97 void (*
setMAC)(
void *Dev, uint64_t MAC);
99 #define TEMU_MAC_IFACE_TYPE "temu::MACIface" 104 temu_EthernetIfaceRef
108 temu_EthernetIfaceRef
111 void (*
up)(
void *Dev);
122 #define TEMU_PHY_IFACE_TYPE "temu::PHYIface" 126 #define TEMU_ETH_100BASE_T4 (1 << (15 - 8)) 127 #define TEMU_ETH_100BASE_X_FD (1 << (14 - 8)) 128 #define TEMU_ETH_100BASE_X_HD (1 << (13 - 8)) 129 #define TEMU_ETH_10BASE_FD (1 << (12 - 8)) 130 #define TEMU_ETH_10BASE_HD (1 << (11 - 8)) 131 #define TEMU_ETH_100BASE_T2_FD (1 << (10 - 8)) 132 #define TEMU_ETH_100BASE_T2_HD (1 << (9 - 8)) 135 #define TEMU_ETH_1000BASE_X_FD (1 << 15) 136 #define TEMU_ETH_1000BASE_X_HD (1 << 14) 137 #define TEMU_ETH_1000BASE_T_FD (1 << 13) 138 #define TEMU_ETH_1000BASE_T_HD (1 << 12) 145 temu_PHYIfaceRef Dev);
147 temu_PHYIfaceRef Dev);
151 void (*
addMAC)(
void *Obj, temu_PHYIfaceRef Dev, uint64_t MAC);
152 void (*
removeMAC)(
void *Obj, temu_PHYIfaceRef Dev, uint64_t MAC);
163 #define TEMU_ETHERNET_IFACE_TYPE "temu::EthernetIface" 178 int32_t (*readReg)(
void *Obj,
unsigned PHY_ID, uint16_t Addr);
179 int (*writeReg)(
void *Obj,
unsigned PHY_ID, uint16_t Addr, uint16_t Value);
181 #define TEMU_MDIO_IFACE_TYPE "temu::MDIOIface" 184 #define TEMU_ETH_MIN_PAYLOAD 46 185 #define TEMU_ETH_MAX_PAYLOAD 1500 186 #define TEMU_ETH_LAYER1_HEADER_LENGTH (7 + 1 + 12 + 2) 187 #define TEMU_ETH_LAYER2_HEADER_LENGTH (6 + 6 + 2) 188 #define TEMU_ETH_CRC_LENGTH 4 189 #define TEMU_ETH_INTERPACKET_GAP 12 190 #define TEMU_ETH_PAYLOAD_OFFSET (6 + 6 + 2) 191 #define TEMU_ETH_MAX_FRAME_LENGTH 1518 192 #define TEMU_ETH_802_1Q_TAG_BYTES 4 193 #define TEMU_ETH_802_1Q_MAX_FRAME_LENGTH 1522 198 #define TEMU_ETHTYPE_IPV4 0x0800 199 #define TEMU_ETHTYPE_ARP 0x0806 200 #define TEMU_ETHTYPE_WAKE_ON_LAN 0x0842 201 #define TEMU_ETHTYPE_SRP 0x22ea 202 #define TEMU_ETHTYPE_RARP 0x8035 203 #define TEMU_ETHTYPE_802_1Q 0x8100 204 #define TEMU_ETHTYPE_IPV6 0x86dd 205 #define TEMU_ETHTYPE_PTP 0x88f7 206 #define TEMU_ETHTYPE_TTE_CTRL 0x891d 209 #define TEMU_ETH_IPV4_VERS_IHL_OFFSET (TEMU_ETH_PAYLOAD_OFFSET + 0) 210 #define TEMU_ETH_IPV4_DSCP_ECN_OFFSET (TEMU_ETH_PAYLOAD_OFFSET + 1) 211 #define TEMU_ETH_IPV4_TOTAL_LENGTH_OFFSET (TEMU_ETH_PAYLOAD_OFFSET + 2) 212 #define TEMU_ETH_IPV4_FRAGMENTATION_INFO_OFFSET (TEMU_ETH_PAYLOAD_OFFSET + 6) 213 #define TEMU_ETH_IPV4_TTL_OFFSET (TEMU_ETH_PAYLOAD_OFFSET + 8) 214 #define TEMU_ETH_IPV4_PROTOCOL_OFFSET (TEMU_ETH_PAYLOAD_OFFSET + 9) 215 #define TEMU_ETH_IPV4_CRC_OFFSET (TEMU_ETH_PAYLOAD_OFFSET + 10) 216 #define TEMU_ETH_IPV4_SRC_IP_OFFSET (TEMU_ETH_PAYLOAD_OFFSET + 12) 217 #define TEMU_ETH_IPV4_DST_IP_OFFSET (TEMU_ETH_PAYLOAD_OFFSET + 16) 219 #define TEMU_IP_PROT_TCP 0x06 220 #define TEMU_IP_PROT_UDP 0x11 223 #define TEMU_TCP_CRC_OFFSET 16 224 #define TEMU_UDP_CRC_OFFSET 6 226 static inline uint64_t
232 for (
int i = 0; i < 6; ++i) {
239 static inline uint64_t
245 for (
int i = 6; i < 12; ++i) {
257 static inline uint16_t
263 for (
int i = 12; i < 14; ++i) {
283 uint16_t TagStart = 0;
286 for (
int i = 12; i < 14; ++i) {
294 static inline uint16_t
300 static inline uint16_t
313 static inline const uint8_t *
321 static inline const uint16_t
328 #define ETH_BCAST_ADDR UINT64_C(0xffffffffffff) 333 uint64_t MAC = temu_ethGetDestMAC(Frame);
353 #define ETH_ETHERTYPE_MIN 1536 355 #define ETH_CRC_MAGIC 0xC704DD7B 356 #define ETH_CRC_POLY_NORM 0x04C11DB7 357 #define ETH_CRC_POLY_REV 0xEDB88320 358 #define ETH_CRC_POLY_REV_RECIP 0x82608EDB 360 #define ETH_CRC_POLY_LE 0xedb88320 361 #define ETH_CRC_POLY_BE 0x04c11db6 int(* send)(void *Obj, temu_EthFrame *Frame)
Definition: Ethernet.h:161
void(* connected)(void *Dev, temu_EthernetIfaceRef Link)
Definition: Ethernet.h:102
#define TEMU_ETH_802_1Q_TAG_BYTES
Definition: Ethernet.h:192
void(* connected)(void *Dev)
Definition: Ethernet.h:88
TEMU_API uint32_t temu_buffLen(const temu_Buff *B)
uint32_t Flags
Flags used for error injection.
Definition: Ethernet.h:74
int(* send)(void *Dev, temu_EthFrame *Frame)
Definition: Ethernet.h:114
#define TEMU_ETH_CRC_LENGTH
Definition: Ethernet.h:188
Definition: Ethernet.h:173
Definition: Ethernet.h:73
void(* disconnected)(void *Dev)
Definition: Ethernet.h:90
Definition: Ethernet.h:101
Definition: Ethernet.h:143
TEMU_IFACE_REFERENCE_TYPE(temu_MAC)
uint32_t(* autoNegotiate)(void *Obj, uint32_t Caps)
Definition: Ethernet.h:119
void(* up)(void *Dev)
Definition: Ethernet.h:92
temu_Buff Data
ETH frame data.
Definition: Ethernet.h:75
uint8_t Sfd
Start frame delimiter, normally 0xab.
Definition: Ethernet.h:77
void(* removeMAC)(void *Obj, temu_PHYIfaceRef Dev, uint64_t MAC)
Definition: Ethernet.h:152
void(* autoNegotiateDone)(void *Obj, uint32_t Caps)
Definition: Ethernet.h:120
TEMU_API const uint8_t * temu_buffReadableData(const temu_Buff *B)
void(* disconnected)(void *Dev, temu_EthernetIfaceRef Link)
Definition: Ethernet.h:106
void(* setMAC)(void *Dev, uint64_t MAC)
Definition: Ethernet.h:97
#define TEMU_ETHTYPE_802_1Q
Definition: Ethernet.h:203
int(* receive)(void *Dev, temu_EthFrame *Frame)
Definition: Ethernet.h:115
uint64_t(* getMAC)(void *Dev)
Definition: Ethernet.h:96
void(* setPromiscuous)(void *Obj, temu_PHYIfaceRef Dev, int PromiscuousMode)
Definition: Ethernet.h:153
Definition: Ethernet.h:87
void(* down)(void *Dev)
Definition: Ethernet.h:112
void(* addMAC)(void *Obj, temu_PHYIfaceRef Dev, uint64_t MAC)
Definition: Ethernet.h:151
void(* up)(void *Dev)
Definition: Ethernet.h:111
int(* receive)(void *Dev, temu_EthFrame *Frame)
Definition: Ethernet.h:95
#define TEMU_ETH_PAYLOAD_OFFSET
Definition: Ethernet.h:190
#define ETH_BCAST_ADDR
Definition: Ethernet.h:328
void(* connect)(void *Obj, temu_PHYIfaceRef Dev)
Definition: Ethernet.h:144
void(* down)(void *Dev)
Definition: Ethernet.h:93
uint32_t(* autoNegotiate)(void *Obj, uint32_t Caps)
Definition: Ethernet.h:157
void(* disconnect)(void *Obj, temu_PHYIfaceRef Dev)
Definition: Ethernet.h:146