6#if DETWS_ENABLE_IFACE_BRIDGE
24 s_bridge.rules[i].used =
false;
28bool bridge_add(
const BridgeRule *rule)
32 if (bridge_find(rule->listen_port, rule->proto))
36 if (!s_bridge.rules[i].used)
38 s_bridge.rules[i] = *rule;
39 s_bridge.rules[i].used =
true;
47bool bridge_map(
const char *ip, uint16_t port, BridgeProto proto,
const BridgeTarget *target)
52 memset(&r, 0,
sizeof(r));
59 return bridge_add(&r);
62const BridgeRule *bridge_find(uint16_t port, BridgeProto proto)
65 if (s_bridge.rules[i].used && s_bridge.rules[i].listen_port == port && s_bridge.rules[i].proto == proto)
66 return &s_bridge.rules[i];
72 return s_bridge.count;
75size_t bridge_txn_parse(
const uint8_t *buf,
size_t len, uint16_t *write_len, uint16_t *read_len,
76 const uint8_t **write_data)
78 if (!buf || len < (
size_t)DETWS_BRIDGE_TXN_HDR)
80 uint16_t wl = (uint16_t)(((uint16_t)buf[0] << 8) | buf[1]);
81 uint16_t rl = (uint16_t)(((uint16_t)buf[2] << 8) | buf[3]);
82 if (len < (
size_t)DETWS_BRIDGE_TXN_HDR + wl)
89 *write_data = buf + DETWS_BRIDGE_TXN_HDR;
90 return (
size_t)DETWS_BRIDGE_TXN_HDR + wl;
93size_t bridge_txn_build(uint8_t *out,
size_t cap,
const uint8_t *write_data, uint16_t write_len, uint16_t read_len)
95 size_t need = (size_t)DETWS_BRIDGE_TXN_HDR + write_len;
96 if (!out || cap < need)
98 out[0] = (uint8_t)(write_len >> 8);
99 out[1] = (uint8_t)write_len;
100 out[2] = (uint8_t)(read_len >> 8);
101 out[3] = (uint8_t)read_len;
102 if (write_len && write_data)
103 memcpy(out + DETWS_BRIDGE_TXN_HDR, write_data, write_len);
#define DETWS_BRIDGE_MAX_RULES
Max concurrent address:port -> bus rules (services/iface_bridge).
User-defined address:port -> hardware-bus translation (DETWS_ENABLE_IFACE_BRIDGE).
bool det_ip_parse(const char *s, DetIp *out)
Parse an IPv4 or IPv6 textual address (RFC 4291 §2.2) into out.
@ DET_IP_NONE
empty / unparsed