diff options
| author | Isaikin Roman <[email protected]> | 2023-08-20 07:42:54 +0200 |
|---|---|---|
| committer | Isaikin Roman <[email protected]> | 2023-08-20 07:42:54 +0200 |
| commit | 17e9a8ebe13a254417d323b0f634d18eb81caa3d (patch) | |
| tree | 1fb7218d8f68ef97937eee75e8cfe79bb3d04b99 /embassy-usb | |
| parent | 6babd5752e439b234151104d8d20bae32e41d714 (diff) | |
Fix hardcoded buffer length in USB NCM causing broken link on USB 2.0.
Diffstat (limited to 'embassy-usb')
| -rw-r--r-- | embassy-usb/src/class/cdc_ncm/mod.rs | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/embassy-usb/src/class/cdc_ncm/mod.rs b/embassy-usb/src/class/cdc_ncm/mod.rs index fcfa0bfcd..830e9b768 100644 --- a/embassy-usb/src/class/cdc_ncm/mod.rs +++ b/embassy-usb/src/class/cdc_ncm/mod.rs | |||
| @@ -248,6 +248,8 @@ pub struct CdcNcmClass<'d, D: Driver<'d>> { | |||
| 248 | write_ep: D::EndpointIn, | 248 | write_ep: D::EndpointIn, |
| 249 | 249 | ||
| 250 | _control: &'d ControlShared, | 250 | _control: &'d ControlShared, |
| 251 | |||
| 252 | max_packet_size: usize, | ||
| 251 | } | 253 | } |
| 252 | 254 | ||
| 253 | impl<'d, D: Driver<'d>> CdcNcmClass<'d, D> { | 255 | impl<'d, D: Driver<'d>> CdcNcmClass<'d, D> { |
| @@ -338,6 +340,7 @@ impl<'d, D: Driver<'d>> CdcNcmClass<'d, D> { | |||
| 338 | read_ep, | 340 | read_ep, |
| 339 | write_ep, | 341 | write_ep, |
| 340 | _control: &state.shared, | 342 | _control: &state.shared, |
| 343 | max_packet_size: max_packet_size as usize, | ||
| 341 | } | 344 | } |
| 342 | } | 345 | } |
| 343 | 346 | ||
| @@ -349,6 +352,7 @@ impl<'d, D: Driver<'d>> CdcNcmClass<'d, D> { | |||
| 349 | Sender { | 352 | Sender { |
| 350 | write_ep: self.write_ep, | 353 | write_ep: self.write_ep, |
| 351 | seq: 0, | 354 | seq: 0, |
| 355 | max_packet_size: self.max_packet_size, | ||
| 352 | }, | 356 | }, |
| 353 | Receiver { | 357 | Receiver { |
| 354 | data_if: self.data_if, | 358 | data_if: self.data_if, |
| @@ -365,6 +369,7 @@ impl<'d, D: Driver<'d>> CdcNcmClass<'d, D> { | |||
| 365 | pub struct Sender<'d, D: Driver<'d>> { | 369 | pub struct Sender<'d, D: Driver<'d>> { |
| 366 | write_ep: D::EndpointIn, | 370 | write_ep: D::EndpointIn, |
| 367 | seq: u16, | 371 | seq: u16, |
| 372 | max_packet_size: usize, | ||
| 368 | } | 373 | } |
| 369 | 374 | ||
| 370 | impl<'d, D: Driver<'d>> Sender<'d, D> { | 375 | impl<'d, D: Driver<'d>> Sender<'d, D> { |
| @@ -375,8 +380,8 @@ impl<'d, D: Driver<'d>> Sender<'d, D> { | |||
| 375 | let seq = self.seq; | 380 | let seq = self.seq; |
| 376 | self.seq = self.seq.wrapping_add(1); | 381 | self.seq = self.seq.wrapping_add(1); |
| 377 | 382 | ||
| 378 | const MAX_PACKET_SIZE: usize = 64; // TODO unhardcode | ||
| 379 | const OUT_HEADER_LEN: usize = 28; | 383 | const OUT_HEADER_LEN: usize = 28; |
| 384 | const ABS_MAX_PACKET_SIZE: usize = 512; | ||
| 380 | 385 | ||
| 381 | let header = NtbOutHeader { | 386 | let header = NtbOutHeader { |
| 382 | nth_sig: SIG_NTH, | 387 | nth_sig: SIG_NTH, |
| @@ -395,27 +400,27 @@ impl<'d, D: Driver<'d>> Sender<'d, D> { | |||
| 395 | }; | 400 | }; |
| 396 | 401 | ||
| 397 | // Build first packet on a buffer, send next packets straight from `data`. | 402 | // Build first packet on a buffer, send next packets straight from `data`. |
| 398 | let mut buf = [0; MAX_PACKET_SIZE]; | 403 | let mut buf = [0; ABS_MAX_PACKET_SIZE]; |
| 399 | let n = byteify(&mut buf, header); | 404 | let n = byteify(&mut buf, header); |
| 400 | assert_eq!(n.len(), OUT_HEADER_LEN); | 405 | assert_eq!(n.len(), OUT_HEADER_LEN); |
| 401 | 406 | ||
| 402 | if OUT_HEADER_LEN + data.len() < MAX_PACKET_SIZE { | 407 | if OUT_HEADER_LEN + data.len() < self.max_packet_size { |
| 403 | // First packet is not full, just send it. | 408 | // First packet is not full, just send it. |
| 404 | // No need to send ZLP because it's short for sure. | 409 | // No need to send ZLP because it's short for sure. |
| 405 | buf[OUT_HEADER_LEN..][..data.len()].copy_from_slice(data); | 410 | buf[OUT_HEADER_LEN..][..data.len()].copy_from_slice(data); |
| 406 | self.write_ep.write(&buf[..OUT_HEADER_LEN + data.len()]).await?; | 411 | self.write_ep.write(&buf[..OUT_HEADER_LEN + data.len()]).await?; |
| 407 | } else { | 412 | } else { |
| 408 | let (d1, d2) = data.split_at(MAX_PACKET_SIZE - OUT_HEADER_LEN); | 413 | let (d1, d2) = data.split_at(self.max_packet_size - OUT_HEADER_LEN); |
| 409 | 414 | ||
| 410 | buf[OUT_HEADER_LEN..].copy_from_slice(d1); | 415 | buf[OUT_HEADER_LEN..self.max_packet_size].copy_from_slice(d1); |
| 411 | self.write_ep.write(&buf).await?; | 416 | self.write_ep.write(&buf[..self.max_packet_size]).await?; |
| 412 | 417 | ||
| 413 | for chunk in d2.chunks(MAX_PACKET_SIZE) { | 418 | for chunk in d2.chunks(self.max_packet_size) { |
| 414 | self.write_ep.write(&chunk).await?; | 419 | self.write_ep.write(&chunk).await?; |
| 415 | } | 420 | } |
| 416 | 421 | ||
| 417 | // Send ZLP if needed. | 422 | // Send ZLP if needed. |
| 418 | if d2.len() % MAX_PACKET_SIZE == 0 { | 423 | if d2.len() % self.max_packet_size == 0 { |
| 419 | self.write_ep.write(&[]).await?; | 424 | self.write_ep.write(&[]).await?; |
| 420 | } | 425 | } |
| 421 | } | 426 | } |
