diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 4a13ca959..a3e79ec6e 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -47,3 +47,11 @@ jobs: - uses: actions/checkout@v4 - name: Run Tests nightly run: ./ci.sh test nightly + + test-build-16bit: + runs-on: ubuntu-22.04 + continue-on-error: true + steps: + - uses: actions/checkout@v4 + - name: Build for target with 16 bit pointer + run: ./ci.sh build_16bit diff --git a/ci.sh b/ci.sh index 109047719..eb9235f7e 100755 --- a/ci.sh +++ b/ci.sh @@ -82,6 +82,16 @@ clippy() { cargo +$MSRV clippy --tests --examples -- -D warnings } +build_16bit() { + rustup toolchain install nightly + rustup +nightly component add rust-src + + TARGET_WITH_16BIT_POINTER=msp430-none-elf + for features in ${FEATURES_CHECK[@]}; do + cargo +nightly build -Z build-std=core,alloc --target $TARGET_WITH_16BIT_POINTER --no-default-features --features=$features + done +} + coverage() { for features in ${FEATURES_TEST[@]}; do cargo llvm-cov --no-report --no-default-features --features "$features" @@ -121,6 +131,10 @@ if [[ $1 == "clippy" || $1 == "all" ]]; then clippy fi +if [[ $1 == "build_16bit" || $1 == "all" ]]; then + build_16bit +fi + if [[ $1 == "coverage" || $1 == "all" ]]; then coverage fi diff --git a/src/socket/tcp.rs b/src/socket/tcp.rs index f944875ad..b02d15653 100644 --- a/src/socket/tcp.rs +++ b/src/socket/tcp.rs @@ -510,6 +510,7 @@ impl<'a> Socket<'a> { // [...] the above constraints imply that 2 * the max window size must be less // than 2**31 [...] Thus, the shift count must be limited to 14 (which allows // windows of 2**30 = 1 Gbyte). + #[cfg(not(target_pointer_width = "16"))] // Prevent overflow if rx_capacity > (1 << 30) { panic!("receiving buffer too large, cannot exceed 1 GiB") } @@ -676,10 +677,7 @@ impl<'a> Socket<'a> { /// Used in internal calculations as well as packet generation. #[inline] fn scaled_window(&self) -> u16 { - cmp::min( - self.rx_buffer.window() >> self.remote_win_shift as usize, - (1 << 16) - 1, - ) as u16 + u16::try_from(self.rx_buffer.window() >> self.remote_win_shift).unwrap_or(u16::MAX) } /// Return the last window field value, including scaling according to RFC 1323. @@ -2334,7 +2332,7 @@ impl<'a> Socket<'a> { State::SynSent | State::SynReceived => { repr.control = TcpControl::Syn; // window len must NOT be scaled in SYNs. - repr.window_len = self.rx_buffer.window().min((1 << 16) - 1) as u16; + repr.window_len = u16::try_from(self.rx_buffer.window()).unwrap_or(u16::MAX); if self.state == State::SynSent { repr.ack_number = None; repr.window_scale = Some(self.remote_win_shift);