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; }
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; }