InfiniBand Test Specification  1.0.38
Public Member Functions | Protected Member Functions | List of all members
C09_027_02

Inherits C09_027.

Public Member Functions

 C09_027_02 ()
 
boolean execute () throws TestException
 

Protected Member Functions

boolean initialize () throws TestException
 
BigInteger sendFetch (final long psn) throws TestException
 
void sendReadRequests (final long psn) throws TestException
 

Detailed Description

9.5.0.1 V1C09-027 RELIABLE SERVICE TRANSACTION ORDERING

Abstract: This test verifies the ordering rules for Reliable Service requests from an HCA.

Coverage: v1c09-027

Topology Configuration: SimpleLink: Tester=Transport Tester; Width=1X, 4X, or 12X; DUT=xCA DUT Qualifiers: All HCAs must support RDMA operations in addition to Send and Receive functionality. Atomic operations are optional. However, if the HCA supports Atomic operations, it must fully support all of the related compliance items. Notes: For reliable services on an HCA, all acknowledge packets shall be strongly ordered, e.g. all previous RDMA Read responses and all Atomic responses shall be injected into the fabric before subsequent RDMA Send, RDMA Write responses, RDMA Read responses and Atomic operation responses. The first five parts of this test send a series of RDMA Read requests followed by an RDMA Send Only, and RDMA Write Only or an Atomic request to verify that the responses are returned in strict order. The final parts begin with Atomic operations which are then followed by other types to ensure ordering. The test implementer may choose to verify that the Atomic operations are performed correctly. However, the essence of this test is to verify that all acknowledge packets are strongly ordered, i.e. to verify the expected PSN.

Test Case Description

◆ C09_027_02()

9.5.0.1.2 V1C09-027 RC RDMA Write Only after RDMA Read

Assertions: V1c09-027#02

Notes:

  • The TT (as requester) will transmit a RC RDMA Write Only request after a series of RDMA Read requests. The ordering of the responses from the DUT (as responder) (PSN) should be the same as the ordering of the requests.
  • Variable COUNTER of type Integer
  • Variable CC as structure of type ChannelContext_t
  • Variable READWQE as structure of type RcReadDut_t
  • Variable WRITEWQE as structure of type RcWriteDut_t
  • Variables PACKET_IN, PACKET_OUT as structure of type PacketType_t
  • Variable COMPLETE as structure of type PollDut_t

Developer: Llolsten Kaonga

Test Procedure

◆ execute()

boolean execute ( ) throws TestException

Test Procedure:

  1. Register memory region for receiving remote packets

  2. Post one receive request for each expected packet from DUT

    see Send Read Requests

  3. Transmit an RDMA Write Only Packet

    • PACKET_OUT.HeaderMask = LOCAL | WRITE_ONLY
    • PACKET_OUT.BTH_OpCode = RC_WRITE_ONLY
    • CC.TT_TxReqPSN = Mod( CC.Start_PSN + 6, 24)
    • PACKET_OUT.BTH_AckReq = 1
    • PACKET_OUT.RETH_vaddr = DUT buffer address
    • PACKET_OUT.RETH_rkey = DUT rkey
    • PACKET_OUT.RETH_dmaLength = PMTU
    • TransportTxPacket( CC, PACKET_OUT )

  4. Wait for RDMA Read data, RDMA Read data Only, RDMA Write Only ACK

    • Remark: We expect the following packet order
    • 1 RDMA Read data first
    • 3 RDMA Read data middle
    • 1 RDMA Read data last
    • 1 RDMA Read data only
    • 1 ACK for RDMA Write Only

  5. Receive first packet
    • Verify that PACKET_IN.BTH_Opcode = RC_READ_FIRST and PACKET_IN.BTH_PSN = CC.Start_PSN
  6. For COUNTER = 1; COUNTER < 4; COUNTER++
    • - Receive next packet
    • - Verify that PACKET_IN.BTH_Opcode = RC_READ_MID and PACKET_IN.BTH_PSN = CC.START_PSN + COUNTER
  7. END Loop
  8. Receive next packet
    • Verify that PACKET_IN.BTH_Opcode = RC_READ_LAST and PACKET_IN_BTH_PSN = CC.START_PSN + 4
  9. Receive next packet
    • Verify that PACKET_IN.BTH_Opcode = RC_READ_ONLY and PACKET_IN_BTH_PSN = CC.START_PSN + 5
  10. Receive next packet

    • Verify that PACKET_IN.AETH_SYNDROME & ACK_MASK = ACK (response to RDMA Write_Only) and PACKET_IN.BTH_PSN = CC.START_PSN + 6

  11. CloseRcChannel( CC )

    • Remark: Flush unacknowledged WQE.

◆ initialize()

boolean initialize ( ) throws TestException
protectedinherited

Initialization:

  1. OpenRcChannel( CC ) // (reliable connection)

◆ sendFetch()

BigInteger sendFetch ( final long  psn) throws TestException
protectedinherited

Send Fetch/Add for retrieving remote data

  • PACKET_OUT.HeaderMask = LOCAL | FETCH_ADD
  • PACKET_OUT.BTH_OpCode = ATOMIC_FETCH_ADD
  • CC.TT_TxReqPSN = Mod( CC.Start_PSN, 2^24)
  • PACKET_OUT.BTH_AckReq = 1
  • PACKET_OUT.Atomic_vaddr = DUT buffer address
  • PACKET_OUT.Atomic_rkey = DUT rkey
  • PACKET_OUT.Atomic_SWAP_ADD = 0
  • TransportTxPacket( CC, PACKET_OUT )

Receive Atomic FetchAdd ACK packet

  • PACKET_IN.BTH_OpCode = RC_ATOMIC_ACK
  • CC.TT_RxReqPSN = Mod( CC.Start_PSN, 2^24)
  • PACKET_IN.AETH_Syndrome = ACK
  • TransportRxPacket( CC, PACKET_IN)
  • Verify ( PACKET_IN.AETH_Syndrome & ACK_MASK == ACK )
  • COMPARE = PACKET_IN.AtomicAck_ETH_OrigRemDt

◆ sendReadRequests()

void sendReadRequests ( final long  psn) throws TestException
protectedinherited

Send Read Requests

  1. Transmit 1 RDMA Read Request WQE from TT at size (5 * PMTU). The response message from DUT will contain 5 packets.

  2. Transmit RDMA Read Request Packet

    • PACKET_OUT.HeaderMask = LOCAL | RDMA_READ_REQ
    • PACKET_OUT.BTH_OpCode = RDMA_READ_REQ
    • CC.TT_TxReqPSN = Mod( CC.Start_PSN + 0, 2^24)
    • PACKET_OUT.BTH_AckReq = 1
    • PACKET_OUT.RETH_vaddr = DUT buffer address
    • PACKET_OUT.RETH_rkey = DUT rkey
    • PACKET_OUT.RETH_dmaLength = PMTU * 5
    • TransportTxPacket( CC, PACKET_OUT )

  3. Transmit a second RDMA Read Request Packet of size PMTU

    • PACKET_OUT.HeaderMask = LOCAL | RDMA_READ_REQ
    • PACKET_OUT.BTH_OpCode = RDMA_READ_REQ
    • CC.TT_TxReqPSN = Mod( CC.Start_PSN + 5, 2^24)
    • PACKET_OUT.BTH_AckReq = 1
    • PACKET_OUT.RETH_vaddr = DUT buffer address
    • PACKET_OUT.RETH_rkey = DUT rkey
    • PACKET_OUT.RETH_dmaLength = PMTU * 1
    • TransportTxPacket( CC, PACKET_OUT )


The documentation for this class was generated from the following file: