Beispiel #1
0
Datei: udp.c Projekt: 5kg/kvmtool
static void *uip_udp_socket_thread(void *p)
{
	struct epoll_event events[UIP_UDP_MAX_EVENTS];
	struct uip_udp_socket *sk;
	struct uip_info *info;
	struct uip_buf *buf;
	int payload_len;
	u8 *payload;
	int nfds;
	int i;

	kvm__set_thread_name("uip-udp");

	info = p;

	do {
		payload = malloc(UIP_MAX_UDP_PAYLOAD);
	} while (!payload);

	while (1) {
		nfds = epoll_wait(info->udp_epollfd, events, UIP_UDP_MAX_EVENTS, -1);

		if (nfds == -1)
			continue;

		for (i = 0; i < nfds; i++) {

			sk = events[i].data.ptr;
			payload_len = recvfrom(sk->fd, payload, UIP_MAX_UDP_PAYLOAD, 0, NULL, NULL);
			if (payload_len < 0)
				continue;

			/*
			 * Get free buffer to send data to guest
			 */
			buf = uip_buf_get_free(info);

			uip_udp_make_pkg(info, sk, buf, payload, payload_len);

			/*
			 * Send data received from socket to guest
			 */
			uip_buf_set_used(info, buf);
		}
	}

	free(payload);
	pthread_exit(NULL);
	return NULL;
}
Beispiel #2
0
int uip_tx_do_ipv4_udp_dhcp(struct uip_tx_arg *arg)
{
	struct uip_udp_socket sk;
	struct uip_dhcp *dhcp;
	struct uip_info *info;
	struct uip_buf *buf;
	u8 reply_msg_type;

	dhcp = (struct uip_dhcp *)arg->eth;

	if (uip_dhcp_is_discovery(dhcp))
		reply_msg_type = UIP_DHCP_OFFER;
	else if (uip_dhcp_is_request(dhcp))
		reply_msg_type = UIP_DHCP_ACK;
	else
		return -1;

	buf = uip_buf_clone(arg);
	info = arg->info;

	/*
	 * Cook DHCP pkg
	 */
	uip_dhcp_make_pkg(info, &sk, buf, reply_msg_type);

	/*
	 * Cook UDP pkg
	 */
	uip_udp_make_pkg(info, &sk, buf, NULL, UIP_DHCP_MAX_PAYLOAD_LEN);

	/*
	 * Send data received from socket to guest
	 */
	uip_buf_set_used(info, buf);

	return 0;
}