int refresh_ip_table(void) { int err; // Hold the iface table mutex while updating it platform_mutex_acquire(&iface_table_mutex); // Get all IPs for local interfaces iface_table_len = MAX_IP_COUNT; err = platform_iface_ip_table(iface_ip_table, &iface_table_len); if (err != 0) { platform_mutex_release(&iface_table_mutex); printf("Failed to get interface IP table\n"); return -1; } else { platform_mutex_release(&iface_table_mutex); return 0; } }
void platform_client_release(void) { platform_mutex_release(&client_mutex); }
int relay_loop(void) { char buffer[MDNS_MTU]; struct sockaddr_in src_addr, dst_addr, last_client_addr = { 0 }; int byte_count; int src_length; unsigned int i; struct mdns_header *header = (struct mdns_header*)buffer; memset(&dst_addr, 0, sizeof(dst_addr)); dst_addr.sin_family = AF_INET; dst_addr.sin_port = htons(MDNS_PORT); dst_addr.sin_addr.S_un.S_addr = htonl(MDNS_ADDR); for (;;) { // Read a MDNS packet src_length = sizeof(src_addr); byte_count = recvfrom(mdns_socket, buffer, sizeof(buffer), 0, (struct sockaddr*)&src_addr, &src_length); if (byte_count <= 0) { printf("Failed to receive packet (Error: %d)\n", platform_last_error()); return -1; } // Real MDNS is 5353 -> 5353 if (src_addr.sin_port == htons(MDNS_PORT)) { // Acquire the mutex to protect the iface table platform_mutex_acquire(&iface_table_mutex); // Check if the source is a local link for (i = 0; i < iface_table_len; i++) { if (src_addr.sin_addr.S_un.S_addr == iface_ip_table[i]) { // This needs to go to the client dst_addr = last_client_addr; break; } } // If it came in from the multicast group // and it's not from a local source, it's other // multicast traffic which we ignore. if (i == iface_table_len) { platform_mutex_release(&iface_table_mutex); continue; } else { platform_mutex_release(&iface_table_mutex); } } else { // This looks like it came from the other relay dst_addr.sin_addr.S_un.S_addr = htonl(MDNS_ADDR); dst_addr.sin_port = htons(MDNS_PORT); // Remember the source for next time if (last_client_addr.sin_addr.S_un.S_addr != src_addr.sin_addr.S_un.S_addr || last_client_addr.sin_port != src_addr.sin_port) { last_client_addr = src_addr; printf("Relaying MDNS traffic to %s:%d\n", inet_ntoa(src_addr.sin_addr), htons(src_addr.sin_port)); } } byte_count = sendto(mdns_socket, buffer, byte_count, 0, (struct sockaddr*)&dst_addr, sizeof(dst_addr)); if (byte_count <= 0) { printf("Failed to send packet (Error: %d)\n", platform_last_error()); return -1; } } }