15size_t tpkt_build(uint8_t *buf,
size_t cap,
const uint8_t *payload,
size_t payload_len)
17 if (!buf || (payload_len && !payload))
19 size_t total = TPKT_HEADER_SIZE + payload_len;
20 if (total > 0xFFFF || total > cap)
22 buf[0] = TPKT_VERSION;
24 buf[2] = (uint8_t)(total >> 8);
25 buf[3] = (uint8_t)(total & 0xFF);
27 memcpy(buf + TPKT_HEADER_SIZE, payload, payload_len);
31bool tpkt_parse(
const uint8_t *buf,
size_t len,
const uint8_t **payload,
size_t *payload_len,
size_t *consumed)
33 if (!buf || len < TPKT_HEADER_SIZE)
35 if (buf[0] != TPKT_VERSION)
37 size_t total = ((size_t)buf[2] << 8) | buf[3];
38 if (total < TPKT_HEADER_SIZE || total > len)
41 *payload = buf + TPKT_HEADER_SIZE;
43 *payload_len = total - TPKT_HEADER_SIZE;
49size_t cotp_build_dt(uint8_t *buf,
size_t cap,
const uint8_t *data,
size_t data_len,
bool eot)
51 if (!buf || (data_len && !data))
53 size_t total = COTP_DT_HEADER_LEN + data_len;
56 buf[0] = COTP_DT_HEADER_LEN - 1;
58 buf[2] = (uint8_t)(eot ? COTP_EOT : 0);
60 memcpy(buf + COTP_DT_HEADER_LEN, data, data_len);
64size_t cotp_build_cr(uint8_t *buf,
size_t cap, uint16_t src_ref, uint8_t tpdu_size_code,
const uint8_t *extra_params,
67 if (!buf || (extra_len && !extra_params))
70 size_t after_li = 1 + 2 + 2 + 1 + 3 + extra_len;
71 size_t total = 1 + after_li;
72 if (after_li > 0xFF || total > cap)
75 buf[p++] = (uint8_t)after_li;
79 buf[p++] = (uint8_t)(src_ref >> 8);
80 buf[p++] = (uint8_t)(src_ref & 0xFF);
82 buf[p++] = COTP_PARAM_TPDU_SIZE;
84 buf[p++] = tpdu_size_code;
87 memcpy(buf + p, extra_params, extra_len);
93bool cotp_parse(
const uint8_t *buf,
size_t len, CotpHeader *out)
95 if (!buf || !out || len < 2)
98 size_t header = (size_t)li + 1;
99 if (header > len || li < 1)
102 out->code = (uint8_t)(buf[1] & 0xF0);
109 if (out->code == COTP_DT)
113 out->eot = (buf[2] & COTP_EOT) != 0;
114 out->data = buf + header;
115 out->data_len = len - header;
118 if (out->code == COTP_CR || out->code == COTP_CC)
122 out->dst_ref = (uint16_t)((buf[2] << 8) | buf[3]);
123 out->src_ref = (uint16_t)((buf[4] << 8) | buf[5]);
TPKT (RFC 1006) + COTP / ISO 8073 X.224 class-0 frame codec (DETWS_ENABLE_COTP) - zero-heap "ISO tran...