+ receive_udppacket(mesh, n, pkt);
+}
+
+void handle_incoming_vpn_data(event_loop_t *loop, void *data, int flags) {
+ (void)flags;
+ meshlink_handle_t *mesh = loop->data;
+ listen_socket_t *ls = data;
+
+#ifdef HAVE_RECVMMSG
+ struct mmsgs *mmsgs = mesh->in_mmsgs;
+ int count = recvmmsg(ls->udp.fd, mmsgs->hdrs, MAX_MMSG, 0, NULL);
+
+ if(count <= 0 || count > MAX_MMSG) {
+ if(!sockwouldblock(sockerrno)) {
+ logger(mesh, MESHLINK_ERROR, "Receiving packets failed: %s", sockstrerror(sockerrno));
+ }
+
+ return;
+ }
+
+ for(int i = 0; i < count; i++) {
+ mmsgs->pkts[i].len = mmsgs->hdrs[i].msg_len;
+ handle_one_incoming(mesh, ls, &mmsgs->pkts[i], &mmsgs->addrs[i]);
+ mmsgs->hdrs[i].msg_hdr.msg_namelen = sizeof(mmsgs->addrs[i]);
+ }
+
+#else
+ vpn_packet_t pkt;
+ sockaddr_t from;
+ socklen_t fromlen = sizeof(from);
+ memset(&from, 0, sizeof(from));
+
+ ssize_t len = recvfrom(ls->udp.fd, pkt.data, MAXSIZE, 0, &from.sa, &fromlen);
+
+ if(len <= 0 || len > MAXSIZE) {
+ if(!sockwouldblock(sockerrno)) {
+ logger(mesh, MESHLINK_ERROR, "Receiving packet failed: %s", sockstrerror(sockerrno));
+ }
+
+ return;
+ }
+
+ pkt.len = len;
+ handle_one_incoming(mesh, ls, &pkt, &from);
+#endif