static int usb_net_handle_datain(USBNetState *s, USBPacket *p)

{

    int ret = USB_RET_NAK;



    if (s->in_ptr > s->in_len) {

        s->in_ptr = s->in_len = 0;

        ret = USB_RET_NAK;

        return ret;

    }

    if (!s->in_len) {

        ret = USB_RET_NAK;

        return ret;

    }

    ret = s->in_len - s->in_ptr;

    if (ret > p->iov.size) {

        ret = p->iov.size;

    }

    usb_packet_copy(p, &s->in_buf[s->in_ptr], ret);

    s->in_ptr += ret;

    if (s->in_ptr >= s->in_len &&

                    (is_rndis(s) || (s->in_len & (64 - 1)) || !ret)) {

        /* no short packet necessary */

        s->in_ptr = s->in_len = 0;

    }



#ifdef TRAFFIC_DEBUG

    fprintf(stderr, "usbnet: data in len %zu return %d", p->iov.size, ret);

    iov_hexdump(p->iov.iov, p->iov.niov, stderr, "usbnet", ret);

#endif



    return ret;

}

static int usb_net_handle_datain(USBNetState *s, USBPacket *p)

{

    int ret = USB_RET_NAK;



    if (s->in_ptr > s->in_len) {

        s->in_ptr = s->in_len = 0;

        ret = USB_RET_NAK;

        return ret;

    }

    if (!s->in_len) {

        ret = USB_RET_NAK;

        return ret;

    }

    ret = s->in_len - s->in_ptr;

    if (ret > p->iov.size) {

        ret = p->iov.size;

    }

    usb_packet_copy(p, &s->in_buf[s->in_ptr], ret);

    s->in_ptr += ret;

    if (s->in_ptr >= s->in_len &&

                    (is_rndis(s) || (s->in_len & (64 - 1)) || !ret)) {

        

        s->in_ptr = s->in_len = 0;

    }



#ifdef TRAFFIC_DEBUG

    fprintf(stderr, "usbnet: data in len %zu return %d", p->iov.size, ret);

    iov_hexdump(p->iov.iov, p->iov.niov, stderr, "usbnet", ret);

#endif



    return ret;

}

static int FUNC_0(USBNetState *VAR_0, USBPacket *VAR_1)

{

    int VAR_2 = USB_RET_NAK;



    if (VAR_0->in_ptr > VAR_0->in_len) {

        VAR_0->in_ptr = VAR_0->in_len = 0;

        VAR_2 = USB_RET_NAK;

        return VAR_2;

    }

    if (!VAR_0->in_len) {

        VAR_2 = USB_RET_NAK;

        return VAR_2;

    }

    VAR_2 = VAR_0->in_len - VAR_0->in_ptr;

    if (VAR_2 > VAR_1->iov.size) {

        VAR_2 = VAR_1->iov.size;

    }

    usb_packet_copy(VAR_1, &VAR_0->in_buf[VAR_0->in_ptr], VAR_2);

    VAR_0->in_ptr += VAR_2;

    if (VAR_0->in_ptr >= VAR_0->in_len &&

                    (is_rndis(VAR_0) || (VAR_0->in_len & (64 - 1)) || !VAR_2)) {

        

        VAR_0->in_ptr = VAR_0->in_len = 0;

    }



#ifdef TRAFFIC_DEBUG

    fprintf(stderr, "usbnet: data in len %zu return %d", VAR_1->iov.size, VAR_2);

    iov_hexdump(VAR_1->iov.iov, VAR_1->iov.niov, stderr, "usbnet", VAR_2);

#endif



    return VAR_2;

}

static int FUNC_0(USBNetState *VAR_0, USBPacket *VAR_1)
{ int VAR_2 = USB_RET_NAK; if (VAR_0->in_ptr > VAR_0->in_len) { VAR_0->in_ptr = VAR_0->in_len = 0; VAR_2 = USB_RET_NAK; return VAR_2; } if (!VAR_0->in_len) { VAR_2 = USB_RET_NAK; return VAR_2; } VAR_2 = VAR_0->in_len - VAR_0->in_ptr; if (VAR_2 > VAR_1->iov.size) { VAR_2 = VAR_1->iov.size; } usb_packet_copy(VAR_1, &VAR_0->in_buf[VAR_0->in_ptr], VAR_2); VAR_0->in_ptr += VAR_2; if (VAR_0->in_ptr >= VAR_0->in_len &&
(is_rndis(VAR_0) || (VAR_0->in_len & (64 - 1)) || !VAR_2)) { VAR_0->in_ptr = VAR_0->in_len = 0; } #ifdef TRAFFIC_DEBUG
fprintf(stderr, "usbnet: data in len %zu return %d", VAR_1->iov.size, VAR_2); iov_hexdump(VAR_1->iov.iov, VAR_1->iov.niov, stderr, "usbnet", VAR_2); #endif
return VAR_2; }