6#if PC_ENABLE_IFACE_BRIDGE
21void pc_iface_bridge_clear()
25 s_bridge.rules[i].used =
false;
30bool pc_iface_bridge_add(
const BridgeRule *rule)
36 if (pc_iface_bridge_find(rule->listen_port, rule->proto))
42 if (!s_bridge.rules[i].used)
44 s_bridge.rules[i] = *rule;
45 s_bridge.rules[i].used =
true;
53bool pc_iface_bridge_map(
const char *ip, uint16_t port, BridgeProto proto,
const BridgeTarget *target)
60 memset(&r, 0,
sizeof(r));
69 return pc_iface_bridge_add(&r);
72const BridgeRule *pc_iface_bridge_find(uint16_t port, BridgeProto proto)
76 if (s_bridge.rules[i].used && s_bridge.rules[i].listen_port == port && s_bridge.rules[i].proto == proto)
78 return &s_bridge.rules[i];
84uint8_t pc_iface_bridge_count()
86 return s_bridge.count;
89size_t pc_iface_bridge_txn_parse(
const uint8_t *buf,
size_t len, uint16_t *write_len, uint16_t *read_len,
90 const uint8_t **write_data)
92 if (!buf || len < (
size_t)PC_BRIDGE_TXN_HDR)
96 uint16_t wl = (uint16_t)(((uint16_t)buf[0] << 8) | buf[1]);
97 uint16_t rl = (uint16_t)(((uint16_t)buf[2] << 8) | buf[3]);
98 if (len < (
size_t)PC_BRIDGE_TXN_HDR + wl)
112 *write_data = buf + PC_BRIDGE_TXN_HDR;
114 return (
size_t)PC_BRIDGE_TXN_HDR + wl;
117size_t pc_iface_bridge_txn_build(uint8_t *out,
size_t cap,
const uint8_t *write_data, uint16_t write_len,
120 size_t need = (size_t)PC_BRIDGE_TXN_HDR + write_len;
121 if (!out || cap < need)
125 out[0] = (uint8_t)(write_len >> 8);
126 out[1] = (uint8_t)write_len;
127 out[2] = (uint8_t)(read_len >> 8);
128 out[3] = (uint8_t)read_len;
129 if (write_len && write_data)
131 memcpy(out + PC_BRIDGE_TXN_HDR, write_data, write_len);
User-defined address:port -> hardware-bus translation (PC_ENABLE_IFACE_BRIDGE).
bool pc_ip_parse(const char *s, pc_ip *out)
Parse an IPv4 or IPv6 textual address (RFC 4291 ยง2.2) into out.
@ PC_IP_NONE
empty / unparsed
#define PC_BRIDGE_MAX_RULES
Max concurrent address:port -> bus rules (services/net/iface_bridge).