示例#1
0
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);
}
示例#3
0
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;
		}
	}
}