Loading system/gd/cert/matchers.py +5 −3 Original line number Diff line number Diff line Loading @@ -71,8 +71,8 @@ class L2capMatchers(object): return lambda packet: L2capMatchers._is_matching_supervisory_frame(packet, req_seq, f, s, p) @staticmethod def IFrame(tx_seq=None, payload=None): return lambda packet: L2capMatchers._is_matching_information_frame(packet, tx_seq, payload) def IFrame(tx_seq=None, payload=None, f=None): return lambda packet: L2capMatchers._is_matching_information_frame(packet, tx_seq, payload, f) @staticmethod def Data(payload): Loading Loading @@ -123,7 +123,7 @@ class L2capMatchers(object): return l2cap_packets.EnhancedSupervisoryFrameView(standard_frame) @staticmethod def _is_matching_information_frame(packet, tx_seq, payload): def _is_matching_information_frame(packet, tx_seq, payload, f): frame = L2capMatchers._information_frame(packet) if frame is None: return False Loading @@ -131,6 +131,8 @@ class L2capMatchers(object): return False if payload is not None and frame.GetPayload().GetBytes() != payload: return False if f is not None and frame.GetF() != f: return False return True @staticmethod Loading system/gd/l2cap/classic/cert/l2cap_test.py +51 −0 Original line number Diff line number Diff line Loading @@ -610,6 +610,57 @@ class L2capTest(GdFacadeOnlyBaseTestClass): L2capMatchers.IFrame(tx_seq=0, payload=b'abc'), L2capMatchers.IFrame(tx_seq=1, payload=b'abc')).inOrder() def test_respond_to_srej_p_set(self): """ L2CAP/ERM/BV-14-C [Respond to S-Frame [SREJ] POLL Bit Set] """ self._setup_link_from_cert() self.cert_l2cap.turn_on_ertm(tx_window_size=3, max_transmit=2) (dut_channel, cert_channel) = self._open_channel( scid=0x41, psm=0x33, use_ertm=True) for _ in range(4): dut_channel.send(b'abc') assertThat(cert_channel).emits( L2capMatchers.IFrame(tx_seq=0, payload=b'abc'), L2capMatchers.IFrame(tx_seq=1, payload=b'abc'), L2capMatchers.IFrame(tx_seq=2, payload=b'abc')).inOrder() cert_channel.send_s_frame( req_seq=1, p=Poll.POLL, s=SupervisoryFunction.SELECT_REJECT) assertThat(cert_channel).emits( L2capMatchers.IFrame( tx_seq=1, payload=b'abc', f=Final.POLL_RESPONSE), L2capMatchers.IFrame(tx_seq=3, payload=b'abc')).inOrder() def test_respond_to_srej_p_clear(self): """ L2CAP/ERM/BV-15-C [Respond to S-Frame [SREJ] POLL Bit Clear] """ self._setup_link_from_cert() self.cert_l2cap.turn_on_ertm(tx_window_size=3, max_transmit=2) (dut_channel, cert_channel) = self._open_channel( scid=0x41, psm=0x33, use_ertm=True) for _ in range(4): dut_channel.send(b'abc') assertThat(cert_channel).emits( L2capMatchers.IFrame(tx_seq=0, payload=b'abc'), L2capMatchers.IFrame(tx_seq=1, payload=b'abc'), L2capMatchers.IFrame(tx_seq=2, payload=b'abc')).inOrder() cert_channel.send_s_frame( req_seq=1, s=SupervisoryFunction.SELECT_REJECT) assertThat(cert_channel).emits( L2capMatchers.IFrame(tx_seq=1, payload=b'abc', f=Final.NOT_SET)) cert_channel.send_s_frame( req_seq=3, s=SupervisoryFunction.RECEIVER_READY) assertThat(cert_channel).emits( L2capMatchers.IFrame(tx_seq=3, payload=b'abc', f=Final.NOT_SET)) def test_receive_s_frame_rr_final_bit_set(self): """ L2CAP/ERM/BV-18-C [Receive S-Frame [RR] Final Bit = 1] Loading system/gd/l2cap/internal/enhanced_retransmission_mode_channel_data_controller.cc +1 −0 Original line number Diff line number Diff line Loading @@ -411,6 +411,7 @@ struct ErtmController::impl { remote_busy_ = false; pass_to_tx(req_seq, f); retransmit_requested_i_frame(req_seq, p); send_pending_i_frames(); if (p_bit_outstanding()) { srej_actioned_ = true; srej_save_req_seq_ = req_seq; Loading Loading
system/gd/cert/matchers.py +5 −3 Original line number Diff line number Diff line Loading @@ -71,8 +71,8 @@ class L2capMatchers(object): return lambda packet: L2capMatchers._is_matching_supervisory_frame(packet, req_seq, f, s, p) @staticmethod def IFrame(tx_seq=None, payload=None): return lambda packet: L2capMatchers._is_matching_information_frame(packet, tx_seq, payload) def IFrame(tx_seq=None, payload=None, f=None): return lambda packet: L2capMatchers._is_matching_information_frame(packet, tx_seq, payload, f) @staticmethod def Data(payload): Loading Loading @@ -123,7 +123,7 @@ class L2capMatchers(object): return l2cap_packets.EnhancedSupervisoryFrameView(standard_frame) @staticmethod def _is_matching_information_frame(packet, tx_seq, payload): def _is_matching_information_frame(packet, tx_seq, payload, f): frame = L2capMatchers._information_frame(packet) if frame is None: return False Loading @@ -131,6 +131,8 @@ class L2capMatchers(object): return False if payload is not None and frame.GetPayload().GetBytes() != payload: return False if f is not None and frame.GetF() != f: return False return True @staticmethod Loading
system/gd/l2cap/classic/cert/l2cap_test.py +51 −0 Original line number Diff line number Diff line Loading @@ -610,6 +610,57 @@ class L2capTest(GdFacadeOnlyBaseTestClass): L2capMatchers.IFrame(tx_seq=0, payload=b'abc'), L2capMatchers.IFrame(tx_seq=1, payload=b'abc')).inOrder() def test_respond_to_srej_p_set(self): """ L2CAP/ERM/BV-14-C [Respond to S-Frame [SREJ] POLL Bit Set] """ self._setup_link_from_cert() self.cert_l2cap.turn_on_ertm(tx_window_size=3, max_transmit=2) (dut_channel, cert_channel) = self._open_channel( scid=0x41, psm=0x33, use_ertm=True) for _ in range(4): dut_channel.send(b'abc') assertThat(cert_channel).emits( L2capMatchers.IFrame(tx_seq=0, payload=b'abc'), L2capMatchers.IFrame(tx_seq=1, payload=b'abc'), L2capMatchers.IFrame(tx_seq=2, payload=b'abc')).inOrder() cert_channel.send_s_frame( req_seq=1, p=Poll.POLL, s=SupervisoryFunction.SELECT_REJECT) assertThat(cert_channel).emits( L2capMatchers.IFrame( tx_seq=1, payload=b'abc', f=Final.POLL_RESPONSE), L2capMatchers.IFrame(tx_seq=3, payload=b'abc')).inOrder() def test_respond_to_srej_p_clear(self): """ L2CAP/ERM/BV-15-C [Respond to S-Frame [SREJ] POLL Bit Clear] """ self._setup_link_from_cert() self.cert_l2cap.turn_on_ertm(tx_window_size=3, max_transmit=2) (dut_channel, cert_channel) = self._open_channel( scid=0x41, psm=0x33, use_ertm=True) for _ in range(4): dut_channel.send(b'abc') assertThat(cert_channel).emits( L2capMatchers.IFrame(tx_seq=0, payload=b'abc'), L2capMatchers.IFrame(tx_seq=1, payload=b'abc'), L2capMatchers.IFrame(tx_seq=2, payload=b'abc')).inOrder() cert_channel.send_s_frame( req_seq=1, s=SupervisoryFunction.SELECT_REJECT) assertThat(cert_channel).emits( L2capMatchers.IFrame(tx_seq=1, payload=b'abc', f=Final.NOT_SET)) cert_channel.send_s_frame( req_seq=3, s=SupervisoryFunction.RECEIVER_READY) assertThat(cert_channel).emits( L2capMatchers.IFrame(tx_seq=3, payload=b'abc', f=Final.NOT_SET)) def test_receive_s_frame_rr_final_bit_set(self): """ L2CAP/ERM/BV-18-C [Receive S-Frame [RR] Final Bit = 1] Loading
system/gd/l2cap/internal/enhanced_retransmission_mode_channel_data_controller.cc +1 −0 Original line number Diff line number Diff line Loading @@ -411,6 +411,7 @@ struct ErtmController::impl { remote_busy_ = false; pass_to_tx(req_seq, f); retransmit_requested_i_frame(req_seq, p); send_pending_i_frames(); if (p_bit_outstanding()) { srej_actioned_ = true; srej_save_req_seq_ = req_seq; Loading