Merged
Conversation
macOS errors have the high bit set
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Rationale for the IN transfer buffer size error:
This requirement has actually been in the documentation since v0.1.0 with this intention, just not enforced until now. It's a requirement for WinUSB RAW_IO, which nusb now always enables for IN endpoints on Windows because WinUSB has mediocre performance without it. Since Windows was returning an error in this case, I extended the check to all platforms for consistency and to eliminate the need to handle overflow errors.
You should think of an IN transfer of
nbytes to be a request forn / max_packet_sizepackets, ending early after any short packet. It doesn't make sense to request less than a packet, and because the device, not the host, controls how large the packet is, the host needs to have space to receive it.Users were incorrectly assuming it worked like
Read::read()where you could use any size buffer and the remaining data would be kept for the next call, but what actually happens on Linux is that you get an overflow error and the remaining data is lost. nusb was returning confusing errors because the intention was that it shouldn't see an overflow error if the transfers are the expected size. This check makes it fail quickly if used like that. I'm adding EndpointRead / EndpointWrite for those who want the read() semantics.