66 lines
3.2 KiB
Markdown
66 lines
3.2 KiB
Markdown
# MAX2771 raw Ethernet protocol
|
|
|
|
This protocol is Ethernet Layer 2 only. It has no IP, ARP, DHCP, ICMP, UDP, or TCP component.
|
|
|
|
## Ethernet envelope
|
|
|
|
| Item | Value |
|
|
|---|---|
|
|
| Preamble | seven bytes `55` |
|
|
| SFD | `D5` |
|
|
| Destination | `FF:FF:FF:FF:FF:FF` |
|
|
| Source | `02:27:71:00:00:01` |
|
|
| EtherType | `0x88B5`, most-significant byte first |
|
|
| Maximum Ethernet payload | 1500 bytes |
|
|
| VLAN / jumbo frames | not used |
|
|
| FCS | reflected Ethernet CRC-32, inverted, least-significant byte first |
|
|
| IFG | at least 12 byte times |
|
|
|
|
The CRC is initialized to `0xFFFFFFFF`, updated LSB-first over destination MAC through the final payload or pad byte with reflected polynomial `0xEDB88320`, then inverted. Preamble and SFD are not part of the CRC. Linux NICs normally remove preamble, SFD, and FCS before an `AF_PACKET` application receives the frame.
|
|
|
|
## Custom payload header
|
|
|
|
All multibyte header fields use network byte order. The fixed header is exactly 32 bytes.
|
|
|
|
| Offset | Size | Field | Encoding |
|
|
|---:|---:|---|---|
|
|
| 0 | 4 | magic | ASCII `MX27` (`4D 58 32 37`) |
|
|
| 4 | 1 | version | `1` |
|
|
| 5 | 1 | flags | described below |
|
|
| 6 | 2 | header length | `0x0020` |
|
|
| 8 | 4 | data-frame sequence | unsigned, wraps modulo 2^32 |
|
|
| 12 | 8 | first sample index | unsigned absolute RF sample index |
|
|
| 20 | 2 | sample count | number of real 4-bit samples in this frame |
|
|
| 22 | 1 | bits per sample | `4` |
|
|
| 23 | 1 | packing format | `1` for earlier sample in high nibble |
|
|
| 24 | 4 | dropped sample count | cumulative FPGA count, low 32 bits |
|
|
| 28 | 4 | reserved | zero |
|
|
|
|
Flags are:
|
|
|
|
| Bit | Meaning |
|
|
|---:|---|
|
|
| 0 | FIFO overflow/input loss occurred since the previous reported packet |
|
|
| 1 | first data packet after FPGA reset |
|
|
| 2 | first data packet after the PHY reports a resolved 1000BASE-T full-duplex link |
|
|
| 7:3 | zero |
|
|
|
|
Normal frames contain a 32-byte custom header and 1468 data bytes: exactly 2936 samples. Sequence increments once per transmitted data frame. A sample with index `N` followed by `N+1` is contiguous regardless of nibble values.
|
|
|
|
## Packing
|
|
|
|
For samples `S0, S1, S2, S3`, each limited to four bits, data bytes are:
|
|
|
|
```text
|
|
byte 0 = {S0[3:0], S1[3:0]}
|
|
byte 1 = {S2[3:0], S3[3:0]}
|
|
```
|
|
|
|
There is no sign extension, I/Q interpretation, bit reversal, or numeric conversion. An exceptional overflow boundary can close a short frame. If its sample count is odd, the unused low nibble of the final frame byte is zero and is not a sample. The host parser uses `sample_count`, so it never writes that pad nibble.
|
|
|
|
## Loss semantics
|
|
|
|
Each FIFO entry carries its absolute 64-bit input sample index. The packetizer compares adjacent entries. If a full-FIFO interval creates an index discontinuity, it closes the pre-gap packet as an exceptional partial frame and begins the next packet at the first post-gap index. This makes the missing interval visible to the host. It never silently crosses a gap inside a packet.
|
|
|
|
Packet-sequence gaps indicate frames lost after the FPGA MAC. Sample-index gaps indicate missing sample time, whether due to an FPGA overflow or a lost Ethernet frame. The cumulative drop field distinguishes FPGA-side input loss. The receiver extends the low-32-bit drop count across wraps while it is running.
|