On 07/01/2011 07:46 PM, Ingo Molnar wrote:
> 
> * 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.

Will do. Thanks.

-- 
Best Regards,
Asias He
--
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

Reply via email to