+bool receive_sptps_record(void *handle, uint8_t type, const void *data, uint16_t len) {
+ assert(handle);
+ assert(!data || len);
+
+ node_t *from = handle;
+ meshlink_handle_t *mesh = from->mesh;
+
+ if(type == SPTPS_HANDSHAKE) {
+ if(!from->status.validkey) {
+ logger(mesh, MESHLINK_INFO, "SPTPS key exchange with %s successful", from->name);
+ from->status.validkey = true;
+ from->status.waitingforkey = false;
+
+ if(from->utcp) {
+ utcp_reset_timers(from->utcp);
+ }
+ }
+
+ return true;
+ }
+
+ if(len > MTU) {
+ logger(mesh, MESHLINK_ERROR, "Packet from %s larger than maximum supported size (%d > %d)", from->name, len, MTU);
+ return false;
+ }
+
+ vpn_packet_t inpkt;
+
+ if(type == PKT_PROBE) {
+ inpkt.len = len;
+ inpkt.probe = true;
+ memcpy(inpkt.data, data, len);
+ mtu_probe_h(mesh, from, &inpkt, len);
+ return true;
+ } else {
+ inpkt.probe = false;
+ }
+
+ if(type & ~(PKT_COMPRESSED)) {
+ logger(mesh, MESHLINK_ERROR, "Unexpected SPTPS record type %d len %d from %s", type, len, from->name);
+ return false;
+ }
+
+ if(type & PKT_COMPRESSED) {
+ logger(mesh, MESHLINK_ERROR, "Error while decompressing packet from %s", from->name);
+ return false;
+ }