return true;
}
+bool send_error(meshlink_handle_t *mesh, connection_t *c, request_error_t err, const char *message) {
+ send_request(mesh, c, NULL, "%d %d %s", ERROR, err, message);
+ flush_meta(mesh, c);
+ return false;
+}
+
bool error_h(meshlink_handle_t *mesh, connection_t *c, const char *request) {
assert(request);
assert(*request);
logger(mesh, MESHLINK_INFO, "Error message from %s: %d: %s", c->name, err, errorstring);
+ switch(err) {
+ case BLACKLISTED:
+ if(mesh->blacklisted_cb) {
+ mesh->blacklisted_cb(mesh, (meshlink_node_t *)lookup_node(mesh, c->name));
+ }
+ }
+
return false;
}
// This should never happen with MeshLink.
return false;
}
+
+bool send_raw_packet(meshlink_handle_t *mesh, connection_t *c, const vpn_packet_t *packet) {
+ size_t hdrsize = sizeof(meshlink_packethdr_t);
+ assert(packet->len >= hdrsize);
+ return send_request(mesh, c, NULL, "%d", PACKET) && send_meta(mesh, c, (const char *)packet->data + hdrsize, packet->len - hdrsize);
+}
+
+bool raw_packet_h(meshlink_handle_t *mesh, connection_t *c, const char *request) {
+ (void)mesh;
+ (void)request;
+ c->status.raw_packet = true;
+ return true;
+}