Originator BA会话建立流程
ba_ori_session_start
└─ ba_ori_session_setup
└─ ba_resrc_ori_prep
├─ ba_alloc_ori_entry
└─ RTMPSetTimer (→ ba_ori_session_setup_timeout)
ba_ori_session_setup_timeout (定时器回调)
└─ MlmeEnqueueWithWdev → 发送ADDBA请求
收到ADDBA响应后:
peer_addba_rsp_action
└─ ba_resrc_ori_add
├─ RTMP_ADD_BA_SESSION_TO_ASIC
└─ RTMPSetTimer (可选)
Recipient BA会话建立流程
peer_addba_req_action
├─ cal_rec_ba_wsize
├─ ba_resrc_rec_add
│ ├─ ba_alloc_rec_entry
│ ├─ ba_refresh_reordering_mpdus (清空已有队列)
│ └─ RTMP_ADD_BA_SESSION_TO_ASIC
└─ mlme_send_addba_resp (发送ADDBA响应)
接收数据重排序流程
ba_reorder
├─ amsdu_sanity (检查AMSDU连续性)
├─ ba_flush_reordering_timeout_mpdus (超时刷新)
├─ 根据序列号判断:
│ ├─ SEQ_STEPONE → indicate_rx_pkt (直接上交)
│ ├─ 重复或旧包 → RELEASE_NDIS_PACKET (丢弃)
│ ├─ 窗口内乱序 → ba_enqueue_reordering_packet
│ └─ 超过窗口 → ba_indicate... + goto ba_reorder_check
└─ 更新状态
ba_enqueue_reordering_packet
├─ ba_mpdu_blk_alloc
├─ convert_reordering_packet_to_preAMSDU_or_802_3_packet
└─ ba_reordering_mpdu_insertsorted
ba_indicate_reordering_mpdus_in_order
└─ announce_ba_reorder_pkt → 上交上层
BA会话拆除
ba_ori_session_tear_down
└─ ba_resrc_ori_del
├─ RTMP_DEL_BA_SESSION_FROM_ASIC
└─ ba_free_ori_entry
ba_rec_session_tear_down
└─ ba_resrc_rec_del
├─ RTMP_DEL_BA_SESSION_FROM_ASIC
├─ ba_free_rec_entry
└─ ba_refresh_reordering_mpdus (清空队列)
peer_delba_action
├─ (Initiator=ORIGINATOR) → ba_rec_session_tear_down
└─ (Initiator=RECIPIENT) → ba_ori_session_tear_down