Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

USB: Remote NDIS USB Ethernet support #4999

Merged
merged 14 commits into from Jan 17, 2018
Merged

Conversation

finikorg
Copy link
Collaborator

Add RNDIS protocol, WIP.

@finikorg
Copy link
Collaborator Author

@loicpoulain

@loicpoulain
Copy link
Collaborator

General notes since I have EEM in the pipe as well:

  • We systematically use an extra buffer to send data to usb, usually linerarization in a ep buffer. Maybe we could avoid this by making usb subsystem handling net_buf directly.
  • In my case I need to send multi-packet in a same transfer which does work today with stm32 driver only, we should align both driver. e.g. sending a packet greater than ep packet size is split in multiple packets but sent during the same usb transfer, this improves throughput and reduces latency. Don't know if RNDIS support/request this btw.

Copy link
Collaborator

@tbursztyka tbursztyka left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tiny comments. Overall looks fine to me

}

len = sys_le32_to_cpu(hdr->len);

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you can remove that empty line, your if condition is testing the previous assignment.

/*
* Calculate additional offset since payload_offset is calculated
* from the start of itself ;)
*/
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ouch this comment in the middle of the if condition makes it hard to read. move it before the if

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This comment is related to part of the "if" condition, if I move it before we would not know where it relates to.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You could explain the whole if then. It's quite ugly to cut the condition in the middle

}
}

struct tlv {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

declare that structure at the beginning of the file.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok

}

static int rndis_class_handler(struct usb_setup_packet *setup, s32_t *len,
u8_t **data)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

wrong indent here it seems.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks OK in text editor

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ok so it's github messing up again.

*/
queue_encapsulated_cmd(*data, *len);
} else if (setup->bRequest == CDC_GET_ENC_RSP &&
REQTYPE_GET_DIR(setup->bmRequestType) == REQTYPE_DIR_TO_HOST) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same

try_write(CONFIG_RNDIS_IN_EP_ADDR, zero,
sizeof(zero));
}
}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you could move this code block to its own function.

@@ -65,6 +65,8 @@
* for ACM devices
* @note PSTN120.pdf, 6.3, Table 13
*/
#define CDC_SEND_ENC_CMD 0x00
#define CDC_GET_ENC_RSP 0x01
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is github messing up the order of the commits again? I guess this commit comes before adding RNDIS

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, it comes before.

@@ -78,4 +78,41 @@ config USB_DEVICE_NETWORK_ECM_MAC

endif # USB_DEVICE_NETWORK_ECM

if USB_DEVICE_NETWORK_RNDIS
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Merge that patch with "usb: rndis: Add Remote NDIS protocol handling"

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK

@finikorg finikorg changed the title USB: WIP: Remote NDIS USB Ethernet support USB: Remote NDIS USB Ethernet support Nov 16, 2017
u32_t rx_no_buf;

atomic_t notify_count;
} rndis = {
Copy link
Collaborator

@lpereira lpereira Nov 17, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there any possibility this struct can be accessed from different contexts, such as different threads or an interrupt context? notify_count being an atomic_t makes me think that this is the case. If so, this must be protected.

.skip_bytes = 0,
};

static u8_t manufacturer[] = { 't', 'e', 's', 't' };
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is "test" an acceptable hardcoded value? Can this be marked as const as well, since I don't see anything modifying it?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is my left-overs from the old code base, now we use special CONFIG_USB_DEVICE_MANUFACTURER, I will fix it.

* Calculate additional offset since payload_offset is calculated
* from the start of itself ;)
*/
(u8_t *)&hdr->payload_offset - (u8_t *)hdr) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If I'm understanding correctly, payload_offset came directly from the wire and it has not been properly validated. This could lead to problems if the header is malformed, maliciously or not.

Also, the type of a pointer difference is ptrdiff_t, a signed integral type; len is an unsigned integral type; will this work in all occasions?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

NO! This is offset of the payload_offset field from the start of the structure hdr.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The header is created in rndis_hdr_add() when sending packets, which is fine (it's correctly sent over the wire for the peer). However, this function is called right after receiving a command from USB -- and could be malformed. This value must be validated since it's treated like a pointer.

(Consider also that's undefined behavior in C to create a pointer outside of a valid memory region; one exception is to create a pointer value one element past the last on arrays.)

{

if (!k_fifo_is_empty(&rndis_tx_queue)) {
#if 0
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please remove commented-out code

struct tlv {
u32_t type;
u32_t len;
u8_t data[0];
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we need to support very old GCC compilers? Might be better to just declare data as u8_t data[], that is standard C99.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ok

enum {
UNINITIALIZED,
INITIALIZED,
} state;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will there be another state? Can this be a bool initialized instead?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

at the moment I have 2 states, maybe there will be more in the future

static K_THREAD_STACK_DEFINE(cmd_stack, 1024);
static struct k_thread cmd_thread_data;

static struct __rndis {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This struct can be better packed by reorganizing its members so that there are no holes due to alignment.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am not sure we need to organize members of the structures by alignment rather then by logical order.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree with @lpereira here, we should align structs for minimizing memory consumption. The ordering of items might look funny but that is not very relevant. You could add more comments into this struct to explain more what the various integers like net_filter, ep_in, ep_notify are in this struct.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually I will remove most of fields since we have now new interface for netusb.


SYS_LOG_DBG("EP 0x%x status %d len %u", ep, ep_status, len);

usb_read(ep, buffer, len, NULL);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there any possibility of len being larger than CONFIG_RNDIS_BULK_EP_MPS?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It shouldn't but I have added check and limit read to MPS.

hdr_offset = sizeof(struct rndis_payload_packet);
}

ret = net_pkt_append_all(rndis.in_pkt, len - hdr_offset,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • hdr_offset should be declared as an u32_t to avoid converting it from u8_t here
  • attributing to it the result of the sizeof() operator will truncate size_t to u8_t (as the code is written now); is this OK?
  • Can len be smaller than hdr_offset in a way that the unsigned subtraction will lead to overflow?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have changed hdr_offset to u32_t though it cannot be so large since this is offset inside 64 bytes array.
hdr_offset is not zero if we get a new packet which starts with header of this offset size. In parse_rndis_header() we already have a check
if (buf_len < sizeof(*hdr)) {
SYS_LOG_ERR("Too small packet len %u", buf_len);
return -EINVAL;
}

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

net_pkt_append_all() can still be called if rndis.in_pkt is 0, so len must be checked here as well.

}

ret = net_pkt_append_all(rndis.in_pkt, len - hdr_offset,
buffer + hdr_offset, K_FOREVER);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is buffer + hdr_offset guaranteed to be within the boundaries of buffer?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, hdr_offset is not zero only for new packet with header

rsp->max_packets = sys_cpu_to_le32(1);
rsp->max_transfer_size = sys_cpu_to_le32(rndis.mtu +
sizeof(struct net_eth_hdr) +
44 + 22);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What are these magic numbers?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed

break;
case RNDIS_OBJECT_ID_GEN_MAX_TOTAL_SIZE:
SYS_LOG_DBG("RNDIS_OBJECT_ID_GEN_MAX_TOTAL_SIZE");
net_buf_add_le32(buf, 1558);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is this magic value?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

static u8_t *rndis_hdr_add(u8_t *buf, u32_t len)
{
struct rndis_payload_packet *hdr = (void *)buf;
u8_t offset = (u8_t *)&hdr->payload_offset - (u8_t *)hdr;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Beware of casting ptrdiff_t to u8_t.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please use either ptrdiff_t here or at the very least u32_t. There's no reason to truncate a size to u8_t: even if the payload offset will never be larger than 255 bytes, this will generate code to convert from 8-bit to 32-bit wide registers. Due to stack alignment it's even possible that using u32_t won't even use more memory.


static int rndis_send(struct net_pkt *pkt)
{
u8_t buf[1500], *p; /* FIXME */
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't 1500 be a named constant that's used also by the rndis struct?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed, I am planning also to refactor send() function similar to ECM one.

net_pkt_ll_reserve(pkt) + pkt->frags->len);
p += net_pkt_ll_reserve(pkt) + pkt->frags->len;

for (frag = pkt->frags->frags; frag; frag = frag->frags) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A chain of fragments can easily overflow buf here.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks like something that still needs to be addressed.

@lpereira
Copy link
Collaborator

I haven't finished reviewing this, but I'm sure I'll find more things if I keep poking around. Please review validation, pointer arithmetic, and type truncation (specially when pointer arithmetic is used; you may want to build with -Wconversion to catch these errors).


usb_read(ep, buffer, len, NULL);

/* We already keep frame keeping with len, warn here about
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this comment would need to be rephrased.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed

@finikorg
Copy link
Collaborator Author

I addresses most of the comments, still need to address couple of issues, @lpereira how can I pass now with cmake -W parameters? I tried "cd outdir/ && make -Wconversion", no warnings ;)

* Calculate additional offset since payload_offset is calculated
* from the start of itself ;)
*/
(u8_t *)&hdr->payload_offset - (u8_t *)hdr) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The header is created in rndis_hdr_add() when sending packets, which is fine (it's correctly sent over the wire for the peer). However, this function is called right after receiving a command from USB -- and could be malformed. This value must be validated since it's treated like a pointer.

(Consider also that's undefined behavior in C to create a pointer outside of a valid memory region; one exception is to create a pointer value one element past the last on arrays.)

hdr_offset = sizeof(struct rndis_payload_packet);
}

ret = net_pkt_append_all(rndis.in_pkt, len - hdr_offset,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

net_pkt_append_all() can still be called if rndis.in_pkt is 0, so len must be checked here as well.

static u8_t *rndis_hdr_add(u8_t *buf, u32_t len)
{
struct rndis_payload_packet *hdr = (void *)buf;
u8_t offset = (u8_t *)&hdr->payload_offset - (u8_t *)hdr;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please use either ptrdiff_t here or at the very least u32_t. There's no reason to truncate a size to u8_t: even if the payload offset will never be larger than 255 bytes, this will generate code to convert from 8-bit to 32-bit wide registers. Due to stack alignment it's even possible that using u32_t won't even use more memory.

net_pkt_ll_reserve(pkt) + pkt->frags->len);
p += net_pkt_ll_reserve(pkt) + pkt->frags->len;

for (frag = pkt->frags->frags; frag; frag = frag->frags) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks like something that still needs to be addressed.

return buf + sizeof(*hdr);
}

static u8_t buf[RNDIS_GEN_MAX_TOTAL_SIZE]; /* FIXME */
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

buf is not a good name for a global variable; it's in fact very easy to shadow it locally. Please be more specific: send_buffer is preferable.

Also, is there a possibility that two threads will call rndis_send()?

In addition: what's that FIXME comment is referring to?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

About "(u8_t *)&hdr->payload_offset - (u8_t *)hdr)" construction: those are pointers to struct hdr, they should not be validated!
Now for some reason I cannot reply to all github comments separately. So how net_pkt_append_all() can be called if in_pkt == NULL?
For other comments I am rewriting send() function so those issues would be fixed.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I also have a check:
if (buf_len < sizeof(*hdr)) {
SYS_LOG_ERR("Too small packet len %u", buf_len);
return -EINVAL;
}

@lpereira
Copy link
Collaborator

BTW, you should be able to pass CFLAGS as environment variables to CMake: CFLAGS="-Wconversion -Wall -Wextra -Werror" cmake ...

@finikorg
Copy link
Collaborator Author

finikorg commented Nov 21, 2017

Updated rndis_send() function and other fixes

@galak galak added the area: USB Universal Serial Bus label Dec 6, 2017
@finikorg
Copy link
Collaborator Author

finikorg commented Jan 8, 2018

@lpereira have you had time to review the changes?

*/
if (len < sys_le32_to_cpu(hdr->payload_offset) +
sys_le32_to_cpu(hdr->payload_len) +
(u8_t *)&hdr->payload_offset - (u8_t *)hdr) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To calculate this expression ((u8_t *)&hdr->payload_offset - (u8_t *)hdr), it's better to use offsetof(), as it's performed in compile time.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I will use this macro

* Calculate additional offset since payload_offset is calculated
* from the start of itself ;)
*/
if (len < sys_le32_to_cpu(hdr->payload_offset) +
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would there be any issue if payload_offset + payload_len - offsetof(header, payload_offset) overflowed? Unsigned overflow would mean that this would wrap around, creating a value that is smaller than len.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We get from this function only len, of course USB device could put anything to any field and we cannot always verify it, so in a case packet is broken it would be dropped by network interface.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@lpereira what do you think?

@codecov-io
Copy link

codecov-io commented Jan 15, 2018

Codecov Report

Merging #4999 into master will not change coverage.
The diff coverage is n/a.

Impacted file tree graph

@@          Coverage Diff           @@
##           master   #4999   +/-   ##
======================================
  Coverage    51.3%   51.3%           
======================================
  Files         441     441           
  Lines       42259   42259           
  Branches     8061    8061           
======================================
  Hits        21680   21680           
  Misses      20060   20060           
  Partials      519     519

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 5f5e163...77ebc2b. Read the comment docs.

Remove old unneeded debug statements.

Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
Making configuration files useful.

Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
At the moment CONFIG_SYS_LOG_USB_LEVEL name does not specify that this
is log level for the Device Stack. Make it clear renaming to the
proper name.

Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
Change hardcoded value to configuration defined.

Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
Add missing CDC definitions for RNDIS.

Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
Add init() callback needed for RNDIS and maybe others functions.

Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
Add needed descriptors for USB Remote NDIS Ethernet Network.

Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
Add implementation of Microsoft Remote NDIS USB Ethernet protocol.

Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
Set default value for RNDIS.

Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
Windows works better with this option.

Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
Add configuration for zperf sample allowing to build USB dongle with
zperf for testing.

Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
Adding Networking USB Device Debug level allows to fine-tune
logging.

Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
Add check for rndis_set_handle() packet.

Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
Use macro offsetof() for calculating offset inside structure.

Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
@lpereira
Copy link
Collaborator

I'm approving the changes to move this forward; there might be other issues lingering around, though.

@nashif nashif merged commit ca9c3ad into zephyrproject-rtos:master Jan 17, 2018
@finikorg finikorg deleted the rndis branch February 15, 2018 08:22
@jli157
Copy link
Contributor

jli157 commented May 25, 2020

@finikorg How have you done the tests on Windows? I found the latest Windows 10 has problem to support the device with this driver enabled. I can't manually set the IP address on the host side(Windows 10 always reports "it can't save the IP configs"). Should I report an issue for it given that the RNDIS driver is supposed to be well supported by Windows?

@finikorg
Copy link
Collaborator Author

@jli157 was working in Windows when I used it last time, depending on Windows version there might be issues of selecting right driver, IIRC "Compatible RNDIS adapter, etc". With MS OS Descriptors driver should be selected automatically.

@jli157
Copy link
Contributor

jli157 commented May 26, 2020

@jli157 was working in Windows when I used it last time, depending on Windows version there might be issues of selecting right driver, IIRC "Compatible RNDIS adapter, etc". With MS OS Descriptors driver should be selected automatically.

Windows 10 seems not to be able to find the driver automatically. I have to manually update it to either "compatible RNDIS adapter" or "USB RNDIS Adapter". However, the IP address on the host can't be changed on either one.

Did you mean to enable this one USB_DEVICE_OS_DESC so that Windows can choose the driver automatically?

@jli157
Copy link
Contributor

jli157 commented Jun 8, 2020

While using the driver with Ubuntu 18.04, I often found lots of errors like below:

[00:00:21.063,568] <err> usb_rndis: Not enough pkt buffers, len 118, skip 54
[00:00:21.073,822] <wrn> usb_rndis: Skip 54 bytes out of remaining 54 bytes
[00:00:21.084,014] <err> usb_rndis: Not enough pkt buffers, len 615, skip 551
[00:00:21.094,360] <wrn> usb_rndis: Skip 64 bytes out of remaining 551 bytes
[00:00:21.104,614] <wrn> usb_rndis: Skip 64 bytes out of remaining 487 bytes

And these:

[00:04:01.442,443] <err> usb_rndis: Error parsing RNDIS header
[00:04:01.451,477] <err> usb_rndis: Wrong data packet type 0x785bc0ef
[00:04:01.460,937] <err> usb_rndis: Error parsing RNDIS header
[00:04:01.469,909] <err> usb_rndis: Too small packet len 21
[00:04:01.478,515] <err> usb_rndis: Error parsing RNDIS header
[00:04:15.355,102] <err> usb_rndis: Error writing data to pkt: 0x2001f30c
[00:04:15.365,081] <err> usb_rndis: Wrong data packet type 0x11ff0040
[00:04:15.374,572] <err> usb_rndis: Error parsing RNDIS header

Any suggestions to fix these issues, increasing the RX buffer size?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area: USB Universal Serial Bus
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

9 participants