* Asias He <[email protected]> wrote:
> +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_eth *eth2;
> + struct uip_udp *udp2;
> + struct uip_buf *buf;
> + struct uip_ip *ip2;
> + u8 *payload;
> + int nfds;
> + int ret;
> + int i;
> +
> + 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;
> + ret = recvfrom(sk->fd, payload, UIP_MAX_UDP_PAYLOAD, 0,
> NULL, NULL);
> + if (ret < 0)
> + continue;
> +
> + /*
> + * Get free buffer to send data to guest
> + */
> + buf = uip_buf_get_free(info);
> +
> + /*
> + * Cook a ethernet frame
> + */
> + udp2 = (struct uip_udp *)(buf->eth);
> + eth2 = (struct uip_eth *)buf->eth;
> + ip2 = (struct uip_ip *)(buf->eth);
> +
> + eth2->src = info->host_mac;
> + eth2->dst = info->guest_mac;
> + eth2->type = htons(UIP_ETH_P_IP);
> +
> + ip2->vhl = UIP_IP_VER_4 | UIP_IP_HDR_LEN;
> + ip2->tos = 0;
> + ip2->id = 0;
> + ip2->flgfrag = 0;
> + ip2->ttl = UIP_IP_TTL;
> + ip2->proto = UIP_IP_P_UDP;
> + ip2->csum = 0;
> + ip2->sip = sk->dip;
> + ip2->dip = sk->sip;
> +
> + udp2->sport = sk->dport;
> + udp2->dport = sk->sport;
> + udp2->len = htons(ret + uip_udp_hdrlen(udp2));
> + udp2->csum = 0;
> +
> + memcpy(udp2->payload, payload, ret);
> +
> + ip2->len = udp2->len + htons(uip_ip_hdrlen(ip2));
> + ip2->csum = uip_csum_ip(ip2);
> + udp2->csum = uip_csum_udp(udp2);
> +
> + /*
> + * virtio_net_hdr
> + */
> + buf->vnet_len = sizeof(struct virtio_net_hdr);
> + memset(buf->vnet, 0, buf->vnet_len);
> +
> + buf->eth_len = ntohs(ip2->len) +
> uip_eth_hdrlen(&ip2->eth);
> +
> + /*
> + * Send data received from socket to guest
> + */
> + uip_buf_set_used(info, buf);
> + }
> + }
> +
> + free(payload);
> + pthread_exit(NULL);
> + return NULL;
> +}
This function is way too large, please split out the meat of it into
a separate helper inline.
Thanks,
Ingo
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html