# Copyright 2023 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License.
from dataclasses import dataclass import hci_packets as hci import link_layer_packets as ll import unittest from hci_packets import ErrorCode from py.bluetooth import Address from py.controller import ControllerTest
@dataclass class TestRound:
req_all_phys: int
req_tx_phys: int
req_rx_phys: int
phy_ltpref_c_to_p: int
phy_ltpref_p_to_c: int
# Prelude: Establish an ACL connection as central with the IUT.
controller.send_cmd(
hci.LeSetAdvertisingParameters(
advertising_interval_min=0x200,
advertising_interval_max=0x200,
advertising_type=hci.AdvertisingType.ADV_IND,
own_address_type=hci.OwnAddressType.PUBLIC_DEVICE_ADDRESS,
advertising_channel_map=0x7,
advertising_filter_policy=hci.AdvertisingFilterPolicy.ALL_DEVICES))
# 1. Upper Tester sends an HCI_LE_Set_PHY command to the IUT with the payload defined in the # HCI_LE_Set_PHY section of Table 4.66 and PHY_options set to 0x0000.
controller.send_cmd(
hci.LeSetPhy(connection_handle=connection_handle,
all_phys_no_transmit_preference=(req_all_phys & 0x1) != 0,
all_phys_no_receive_preference=(req_all_phys & 0x2) != 0,
tx_phys=req_tx_phys,
rx_phys=req_rx_phys,
phy_options=hci.PhyOptions.NO_PREFERENCE))
# 2. The Upper Tester receives an HCI_Command_Status event from the IUT in response. If any bits # set in TX_PHYS or RX_PHYS correspond to unsupported PHYs, the Status shall be set to # “Unsupported Feature or Parameter Value (0x11)”. If the IUT does not support Asymmetric # Connections, when ALL_PHYS is 0x00 and TX_PHYS does not equal RX_PHYS, the Status # shall be set to “Unsupported Feature or Parameter Value (0x11)”. Otherwise. the Status shall be # set to zero.
await self.expect_evt(
hci.LeSetPhyStatus(status=ErrorCode.SUCCESS, num_hci_command_packets=1))
# 3. If the IUT does NOT initiate a PHY change, proceed to step 9 if the Status in step 2 was set to # zero, or proceed to the next round if the Status in step 2 was set to a non-zero value.
if (req_all_phys & 0x1) != 0:
req_tx_phys = 0x7 if (req_all_phys & 0x2) != 0:
req_rx_phys = 0x7
# 4. The Lower Tester receives an LL_PHY_REQ control PDU from the IUT with at least one bit in # each field (TX_PHYS, RX_PHYS) set. The Lower Tester responds with an # LL_PHY_UPDATE_IND PDU with the values defined in the “Lower Tester preference” section of # Table 4.66 bitwise ANDed against the value sent by the IUT in the LL_PHY_REQ PDU.
await self.expect_ll(
ll.LlPhyReq(source_address=controller.address,
destination_address=peer_address,
tx_phys=req_tx_phys,
rx_phys=req_rx_phys))
# 5. Lower Tester receives a packet from the IUT acknowledging the LL_PHY_UPDATE_IND.
# 6. Lower Tester sends empty DATA packets to the IUT, receiving acknowledgements until the event # count matches the Instant indicated in the LL_PHY_UPDATE_IND packet.
# 7. At the Instant of the PHY change, start maintaining the connection with the new PHY(s) selected # by the LL_PHY_UPDATE_IND PDU (or no change, if no change was specified in the # LL_PHY_UPDATE_IND PDU).
# 8. Lower Tester sends empty DATA packets to the IUT, receiving acknowledgements. If PHY has # changed, the Lower Tester shall use the new PHY.
# 9. If the command was accepted in step 2 or at least one of the PHY fields in the # LL_PHY_UPDATE_IND PDU was non-zero, the Upper Tester receives an # LE_PHY_Update_Complete event from the IUT with a payload consistent with the PHY(s) # indicated in the LL_PHY_UPDATE_IND PDU (or the prior PHY, in cases where a field in the # LL_PHY_UPDATE_IND PDU was zero or the LL_PHY_UPDATE_IND PDU was not sent). # Otherwise the Upper Tester receives no event.
await self.expect_evt(
hci.LePhyUpdateComplete(connection_handle=connection_handle,
status=ErrorCode.SUCCESS,
tx_phy=phy_from_mask(next_phy_p_to_c),
rx_phy=phy_from_mask(next_phy_c_to_p)))
return (next_phy_c_to_p, next_phy_p_to_c)
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.10 Sekunden
(vorverarbeitet am 2026-06-27)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.