16size_t pc_eth_build(
const uint8_t *dst,
const uint8_t *src, uint16_t ethertype,
const uint8_t *payload,
17 size_t payload_len, uint8_t *out,
size_t cap)
19 if (!dst || !src || !out || (payload_len && !payload))
23 size_t n = RawL2::ETH_HDR_LEN + payload_len;
28 memcpy(out, dst, RawL2::ETH_ALEN);
29 memcpy(out + RawL2::ETH_ALEN, src, RawL2::ETH_ALEN);
30 out[12] = (uint8_t)(ethertype >> 8);
31 out[13] = (uint8_t)ethertype;
34 memcpy(out + RawL2::ETH_HDR_LEN, payload, payload_len);
39size_t pc_eth_build_vlan(
const uint8_t *dst,
const uint8_t *src, uint8_t pcp,
bool dei, uint16_t vid,
40 uint16_t ethertype,
const uint8_t *payload,
size_t payload_len, uint8_t *out,
size_t cap)
42 if (!dst || !src || !out || (payload_len && !payload))
46 size_t n = RawL2::ETH_VLAN_HDR_LEN + payload_len;
51 memcpy(out, dst, RawL2::ETH_ALEN);
52 memcpy(out + RawL2::ETH_ALEN, src, RawL2::ETH_ALEN);
53 out[12] = (uint8_t)(RawL2::ETH_TPID_8021Q >> 8);
54 out[13] = (uint8_t)RawL2::ETH_TPID_8021Q;
55 uint16_t tci = (uint16_t)(((pcp & 0x7) << 13) | ((dei ? 1 : 0) << 12) | (vid & 0x0FFF));
56 out[14] = (uint8_t)(tci >> 8);
57 out[15] = (uint8_t)tci;
58 out[16] = (uint8_t)(ethertype >> 8);
59 out[17] = (uint8_t)ethertype;
62 memcpy(out + RawL2::ETH_VLAN_HDR_LEN, payload, payload_len);
67bool pc_eth_parse(
const uint8_t *frame,
size_t len, EthFrame *out)
69 if (!frame || !out || len < RawL2::ETH_HDR_LEN)
74 out->src = frame + RawL2::ETH_ALEN;
75 uint16_t et = (uint16_t)((frame[12] << 8) | frame[13]);
76 if (et == RawL2::ETH_TPID_8021Q)
78 if (len < RawL2::ETH_VLAN_HDR_LEN)
82 uint16_t tci = (uint16_t)((frame[14] << 8) | frame[15]);
84 out->pcp = (uint8_t)((tci >> 13) & 0x7);
85 out->vid = (uint16_t)(tci & 0x0FFF);
86 out->ethertype = (uint16_t)((frame[16] << 8) | frame[17]);
87 out->payload = frame + RawL2::ETH_VLAN_HDR_LEN;
88 out->payload_len = len - RawL2::ETH_VLAN_HDR_LEN;
96 out->payload = frame + RawL2::ETH_HDR_LEN;
97 out->payload_len = len - RawL2::ETH_HDR_LEN;
102uint32_t pc_eth_fcs(
const uint8_t *bytes,
size_t len)
Parameterized CRC engine - one source of truth for every cyclic redundancy check.
constexpr pc_crc_params PC_CRC32_ISO_HDLC
CRC-32/ISO-HDLC (zlib / PKZIP / Ethernet). check = 0xCBF43926.
uint32_t pc_crc(const pc_crc_params *p, const uint8_t *data, size_t len)
One-shot CRC of len octets at data.
Raw Layer-2 Ethernet frame codec (PC_ENABLE_RAWL2).