 |
TEMU
4.4
The Terma Emulator
|
Go to the documentation of this file.
9 #ifndef TEMU_ETHERNET_H
10 #define TEMU_ETHERNET_H
12 #include "temu-c/Support/Bitmanip.h"
13 #include "temu-c/Support/Buffer.h"
14 #include "temu-c/Support/Objsys.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
83 TEMU_IFACE_REFERENCE_TYPE(temu_MAC);
84 TEMU_IFACE_REFERENCE_TYPE(temu_PHY);
85 TEMU_IFACE_REFERENCE_TYPE(temu_Ethernet);
92 void (*
up)(
void *Dev);
95 int (*
receive)(
void *Dev, temu_EthFrame *Frame);
96 uint64_t (*getMAC)(
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);
114 int (*
send)(
void *Dev, temu_EthFrame *Frame);
115 int (*
receive)(
void *Dev, temu_EthFrame *Frame);
119 uint32_t (*autoNegotiate)(
void *Obj, uint32_t Caps);
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);
157 uint32_t (*autoNegotiate)(
void *Obj, uint32_t Caps);
161 int (*
send)(
void *Obj, temu_EthFrame *Frame);
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"
182 TEMU_IFACE_REFERENCE_TYPE(temu_MDIO);
187 void (*
addDelay)(temu_Object *link, temu_Object *device, temu_Object *delay,
190 #define TEMU_ETH_DELAY_IFACE_TYPE "temu::EthDelayIface"
192 #define TEMU_ETH_MIN_PAYLOAD 46
193 #define TEMU_ETH_MAX_PAYLOAD 1500
194 #define TEMU_ETH_LAYER1_HEADER_LENGTH (7
+ 1
+ 12
+ 2
)
195 #define TEMU_ETH_LAYER2_HEADER_LENGTH (6
+ 6
+ 2
)
196 #define TEMU_ETH_CRC_LENGTH 4
197 #define TEMU_ETH_INTERPACKET_GAP 12
198 #define TEMU_ETH_PAYLOAD_OFFSET (6
+ 6
+ 2
)
199 #define TEMU_ETH_MAX_FRAME_LENGTH 1518
200 #define TEMU_ETH_802_1Q_TAG_BYTES 4
201 #define TEMU_ETH_802_1Q_MAX_FRAME_LENGTH 1522
206 #define TEMU_ETHTYPE_IPV4 0x0800
207 #define TEMU_ETHTYPE_ARP 0x0806
208 #define TEMU_ETHTYPE_WAKE_ON_LAN 0x0842
209 #define TEMU_ETHTYPE_SRP 0x22ea
210 #define TEMU_ETHTYPE_RARP 0x8035
211 #define TEMU_ETHTYPE_802_1Q 0x8100
212 #define TEMU_ETHTYPE_IPV6 0x86dd
213 #define TEMU_ETHTYPE_PTP 0x88f7
214 #define TEMU_ETHTYPE_TTE_CTRL 0x891d
227 #define TEMU_IP_PROT_TCP 0x06
228 #define TEMU_IP_PROT_UDP 0x11
231 #define TEMU_TCP_CRC_OFFSET 16
232 #define TEMU_UDP_CRC_OFFSET 6
234 static inline uint64_t
235 temu_ethGetDestMAC(temu_EthFrame *Frame)
238 const uint8_t *Data = temu_buffReadableData(&Frame->Data);
240 for (
int i = 0; i < 6; ++i) {
247 static inline uint64_t
248 temu_ethGetSourceMAC(temu_EthFrame *Frame)
251 const uint8_t *Data = temu_buffReadableData(&Frame->Data);
253 for (
int i = 6; i < 12; ++i) {
265 static inline uint16_t
266 temu_ethGetEthTypeSizeField(temu_EthFrame *Frame)
269 const uint8_t *Data = temu_buffReadableData(&Frame->Data);
271 for (
int i = 12; i < 14; ++i) {
289 temu_ethIs8021Q(temu_EthFrame *Frame)
291 uint16_t TagStart = 0;
292 const uint8_t *Data = temu_buffReadableData(&Frame->Data);
294 for (
int i = 12; i < 14; ++i) {
302 static inline uint16_t
303 temu_eth8021QTagBytes(temu_EthFrame *Frame)
308 static inline uint16_t
309 temu_ethGetLength(temu_EthFrame *Frame)
313 return temu_buffLen(&Frame->Data);
321 static inline const uint8_t *
322 temu_ethGetPayload(temu_EthFrame *Frame)
324 const uint8_t *Data = temu_buffReadableData(&Frame->Data);
329 static inline const uint16_t
330 temu_ethGetPayloadAndPaddingSize(temu_EthFrame *Frame)
336 #define ETH_BCAST_ADDR UINT64_C
(0xffffffffffff
)
339 temu_ethIsBroadcastFrame(temu_EthFrame *Frame)
341 uint64_t MAC = temu_ethGetDestMAC(Frame);
351 temu_ethIsMulticastFrame(temu_EthFrame *Frame)
353 const uint8_t *Data = temu_buffReadableData(&Frame->Data);
361 #define ETH_ETHERTYPE_MIN 1536
363 #define ETH_CRC_MAGIC 0xC704DD7B
364 #define ETH_CRC_POLY_NORM 0x04C11DB7
365 #define ETH_CRC_POLY_REV 0xEDB88320
366 #define ETH_CRC_POLY_REV_RECIP 0x82608EDB
368 #define ETH_CRC_POLY_LE 0xedb88320
369 #define ETH_CRC_POLY_BE 0x04c11db6
#define TEMU_ETHTYPE_802_1Q
Definition: Ethernet.h:211
void(* removeMAC)(void *Obj, temu_PHYIfaceRef Dev, uint64_t MAC)
Definition: Ethernet.h:152
#define TEMU_ETH_PAYLOAD_OFFSET
Definition: Ethernet.h:198
int(* send)(void *Obj, temu_EthFrame *Frame)
Definition: Ethernet.h:161
void(* disconnected)(void *Dev, temu_EthernetIfaceRef Link)
Definition: Ethernet.h:106
void(* connected)(void *Dev, temu_EthernetIfaceRef Link)
Definition: Ethernet.h:102
temu_Buff Data
ETH frame data.
Definition: Ethernet.h:75
void(* up)(void *Dev)
Definition: Ethernet.h:92
Definition: Ethernet.h:186
struct temu_PHYIface temu_PHYIface
Definition: Ethernet.h:80
void(* down)(void *Dev)
Definition: Ethernet.h:112
void(* autoNegotiateDone)(void *Obj, uint32_t Caps)
Definition: Ethernet.h:120
int(* writeReg)(void *Obj, unsigned PHY_ID, uint16_t Addr, uint16_t Value)
Definition: Ethernet.h:179
int(* receive)(void *Dev, temu_EthFrame *Frame)
Definition: Ethernet.h:95
void(* setMAC)(void *Dev, uint64_t MAC)
Definition: Ethernet.h:97
#define ETH_BCAST_ADDR
Definition: Ethernet.h:336
uint32_t Flags
Flags used for error injection.
Definition: Ethernet.h:74
void(* setPromiscuous)(void *Obj, temu_PHYIfaceRef Dev, int PromiscuousMode)
Definition: Ethernet.h:153
uint8_t Preamble[15]
Preamble bits, normally 0x[aa aa aa aa aa aa aa].
Definition: Ethernet.h:76
uint8_t Sfd
Start frame delimiter, normally 0xab.
Definition: Ethernet.h:77
void(* addDelay)(temu_Object *link, temu_Object *device, temu_Object *delay, double seconds)
Definition: Ethernet.h:187
#define TEMU_ETH_CRC_LENGTH
Definition: Ethernet.h:196
void(* addMAC)(void *Obj, temu_PHYIfaceRef Dev, uint64_t MAC)
Definition: Ethernet.h:151
struct temu_MACIface temu_MACIface
Definition: Ethernet.h:81
#define TEMU_ETH_802_1Q_TAG_BYTES
Definition: Ethernet.h:200
void(* connected)(void *Dev)
Definition: Ethernet.h:88
int(* send)(void *Dev, temu_EthFrame *Frame)
Definition: Ethernet.h:114
struct temu_EthernetIface temu_EthernetIface
Definition: Ethernet.h:82
void(* up)(void *Dev)
Definition: Ethernet.h:111
void(* disconnect)(void *Obj, temu_PHYIfaceRef Dev)
Definition: Ethernet.h:146
void(* connect)(void *Obj, temu_PHYIfaceRef Dev)
Definition: Ethernet.h:144
void(* down)(void *Dev)
Definition: Ethernet.h:93
void(* disconnected)(void *Dev)
Definition: Ethernet.h:90
int(* receive)(void *Dev, temu_EthFrame *Frame)
Definition: Ethernet.h:115