milan-avb: msrp/acmp: talker failed can be handled now

This commit is contained in:
hackerman-kl 2026-04-12 13:14:58 +02:00 committed by Wim Taymans
parent f5e97f0f6b
commit 5b06b5457a
6 changed files with 88 additions and 60 deletions

View file

@ -1124,54 +1124,6 @@ int handle_fsm_prb_w_resp2_tmr_no_resp_evt(struct acmp *acmp,
return 0;
}
/** Milan v1.2 5.5.3.5.24 */
int handle_fsm_prb_w_resp2_rcv_bind_rx_cmd_evt(struct acmp *acmp,
struct aecp_aem_stream_input_state_milan_v12 *stream, const void *m,
size_t len, uint64_t now)
{
return handle_fsm_prb_w_resp_rcv_bind_rx_cmd_evt(acmp, stream, m, len, now);
}
/** Milan v1.2 5.5.3.5.25 */
int handle_fsm_prb_w_resp2_rcv_probe_tx_resp_evt(struct acmp *acmp,
struct aecp_aem_stream_input_state_milan_v12 *stream, const void *m,
size_t len, uint64_t now)
{
return handle_fsm_prb_w_resp_rcv_probe_tx_resp_evt(acmp, stream, m, len, now);
}
/** Milan v1.2 5.5.3.5.26 */
int handle_fsm_prb_w_resp2_rcv_get_rx_state_evt(struct acmp *acmp,
struct aecp_aem_stream_input_state_milan_v12 *stream, const void *m,
size_t len, uint64_t now)
{
return handle_fsm_prb_w_resp_rcv_get_rx_state_evt(acmp, stream, m, len, now);
}
/** Milan v1.2 5.5.3.5.27 */
int handle_fsm_prb_w_resp2_rcv_unbind_rx_cmd_evt(struct acmp *acmp,
struct aecp_aem_stream_input_state_milan_v12 *stream, const void *m,
size_t len, uint64_t now)
{
return handle_fsm_prb_w_resp_rcv_unbind_rx_cmd_evt(acmp, stream, m, len, now);
}
/** Milan v1.2 5.5.3.5.28 */
int handle_fsm_prb_w_resp2_evt_tk_discovered_evt(struct acmp *acmp,
struct aecp_aem_stream_input_state_milan_v12 *stream, const void *m,
size_t len, uint64_t now)
{
return handle_fsm_prb_w_resp_evt_tk_discovered_evt(acmp, stream, m, len, now);
}
/** Milan v1.2 5.5.3.5.29 */
int handle_fsm_prb_w_resp2_evt_tk_departed_evt(struct acmp *acmp,
struct aecp_aem_stream_input_state_milan_v12 *stream, const void *m,
size_t len, uint64_t now)
{
return handle_fsm_prb_w_resp_evt_tk_departed_evt(acmp, stream, m, len, now);
}
/** Milan v1.2 5.5.3.5.30 */
int handle_fsm_prb_w_retry_tmr_retry_evt(struct acmp *acmp,
struct aecp_aem_stream_input_state_milan_v12 *stream, const void *m,
@ -1765,6 +1717,19 @@ int handle_fsm_settled_rsv_ok_evt_tk_unregistered_evt(struct acmp *acmp,
return 0;
}
/** Milan v1.2 5.5.3 — TK_REGISTERED in SETTLED_RSV_OK.
* Fired via acmp_generic_srp_failed_evt_lt_handler_milan_v12 when the SRP
* reservation is lost (handle_evt_tk_registration_failed reuses TK_REGISTERED
* per design; no separate TK_REGISTRATION_FAILED event exists).
* Transition back to SETTLED_NO_RSV so the reservation can be re-established. */
static int handle_fsm_settled_rsv_ok_evt_tk_registered_evt(struct acmp *acmp,
struct aecp_aem_stream_input_state_milan_v12 *stream, const void *m,
size_t len, uint64_t now)
{
stream->acmp_status.fsm_acmp_state = FSM_ACMP_STATE_MILAN_V12_SETTLED_NO_RSV;
return 0;
}
static const struct listener_fsm_cmd listener_unbound[FSM_ACMP_EVT_MILAN_V12_MAX] = {
/* Milan v1.2, Sec. 5.5.3.5.3 */
[FSM_ACMP_EVT_MILAN_V12_RCV_BIND_RX_CMD] = {
@ -1836,22 +1801,22 @@ static const struct listener_fsm_cmd listener_prb_w_resp2[FSM_ACMP_EVT_MILAN_V12
.state_handler = handle_fsm_prb_w_resp2_tmr_no_resp_evt},
[FSM_ACMP_EVT_MILAN_V12_RCV_BIND_RX_CMD]{
.state_handler = handle_fsm_prb_w_resp2_rcv_bind_rx_cmd_evt},
.state_handler = handle_fsm_prb_w_resp_rcv_bind_rx_cmd_evt},
[FSM_ACMP_EVT_MILAN_V12_RCV_PROBE_TX_RESP]{
.state_handler = handle_fsm_prb_w_resp2_rcv_probe_tx_resp_evt},
.state_handler = handle_fsm_prb_w_resp_rcv_probe_tx_resp_evt},
[FSM_ACMP_EVT_MILAN_V12_RCV_GET_RX_STATE]{
.state_handler = handle_fsm_prb_w_resp2_rcv_get_rx_state_evt},
.state_handler = handle_fsm_prb_w_resp_rcv_get_rx_state_evt},
[FSM_ACMP_EVT_MILAN_V12_RCV_UNBIND_RX_CMD]{
.state_handler = handle_fsm_prb_w_resp2_rcv_unbind_rx_cmd_evt},
.state_handler = handle_fsm_prb_w_resp_rcv_unbind_rx_cmd_evt},
[FSM_ACMP_EVT_MILAN_V12_TK_DISCOVERED]{
.state_handler = handle_fsm_prb_w_resp2_evt_tk_discovered_evt},
.state_handler = handle_fsm_prb_w_resp_evt_tk_discovered_evt},
[FSM_ACMP_EVT_MILAN_V12_TK_DEPARTED]{
.state_handler = handle_fsm_prb_w_resp2_evt_tk_departed_evt},
.state_handler = handle_fsm_prb_w_resp_evt_tk_departed_evt},
};
static const struct listener_fsm_cmd listener_prb_w_retry[FSM_ACMP_EVT_MILAN_V12_MAX] = {
@ -1914,6 +1879,9 @@ static const struct listener_fsm_cmd listener_settled_rsv_ok[FSM_ACMP_EVT_MILAN_
[FSM_ACMP_EVT_MILAN_V12_TK_DEPARTED]{
.state_handler = handle_fsm_settled_rsv_ok_evt_tk_departed_evt},
[FSM_ACMP_EVT_MILAN_V12_TK_REGISTERED]{
.state_handler = handle_fsm_settled_rsv_ok_evt_tk_registered_evt},
[FSM_ACMP_EVT_MILAN_V12_TK_UNREGISTERED]{
.state_handler = handle_fsm_settled_rsv_ok_evt_tk_unregistered_evt},
};
@ -2002,6 +1970,31 @@ static int acmp_generic_srp_evt_lt_handler_milan_v12(struct acmp *acmp,
return cmd->state_handler(acmp, si_state, NULL, 0, now);
}
static int acmp_generic_srp_failed_evt_lt_handler_milan_v12(struct acmp *acmp,
struct avb_msrp_attribute *msrp_attr,
enum fsm_acmp_evt_milan_v12 event, uint64_t now)
{
struct stream_common *sc;
struct aecp_aem_stream_input_state *stream_in;
struct aecp_aem_stream_input_state_milan_v12 *si_state;
const struct listener_fsm_cmd *cmd;
sc = SPA_CONTAINER_OF(msrp_attr, struct stream_common, tfstream_attr);
stream_in = SPA_CONTAINER_OF(sc, struct aecp_aem_stream_input_state, common);
si_state = SPA_CONTAINER_OF(stream_in,
struct aecp_aem_stream_input_state_milan_v12, stream_in_sta);
cmd = &cmd_listeners_states[si_state->acmp_status.fsm_acmp_state][event];
if (!cmd->state_handler) {
pw_log_warn("No handler: STATE:%s EVT:%s - ignoring",
fsm_acmp_state_milan_v12_str[si_state->acmp_status.fsm_acmp_state],
fsm_acmp_evt_milan_v12_str[event]);
return 0;
}
return cmd->state_handler(acmp, si_state, NULL, 0, now);
}
static int acmp_generic_adp_evt_lt_handler_milan_v12(struct acmp *acmp,
uint64_t entity_id, enum fsm_acmp_evt_milan_v12 event, uint64_t now)
{
@ -2011,14 +2004,16 @@ static int acmp_generic_adp_evt_lt_handler_milan_v12(struct acmp *acmp,
uint16_t desc_type = AVB_AEM_DESC_STREAM_INPUT;
int rc = 0;
(void)entity_id;
for (uint16_t desc_index = 0; desc_index < UINT16_MAX; desc_index++) {
desc = server_find_descriptor(acmp->server, desc_type, desc_index);
if (desc == NULL)
break;
si_state = (struct aecp_aem_stream_input_state_milan_v12 *)desc->ptr;
if (si_state->acmp_status.common.saved_bindings.talker_guid != entity_id)
continue;
cmd = &cmd_listeners_states[si_state->acmp_status.fsm_acmp_state][event];
if (!cmd->state_handler) {
pw_log_warn("No handler: STATE:%s EVT:%s - ignoring",
@ -2104,6 +2099,13 @@ int handle_evt_tk_unregistered_milan_v12(struct acmp *acmp,
FSM_ACMP_EVT_MILAN_V12_TK_UNREGISTERED, now);
}
int handle_evt_tk_registration_failed_milan_v12(struct acmp *acmp,
struct avb_msrp_attribute *msrp_attr, uint64_t now)
{
return acmp_generic_srp_failed_evt_lt_handler_milan_v12(acmp, msrp_attr,
FSM_ACMP_EVT_MILAN_V12_TK_REGISTERED, now);
}
int handle_probe_tx_command_milan_v12(struct acmp *acmp, uint64_t now,
const void *m, int len)
{

View file

@ -60,10 +60,8 @@ int handle_evt_tk_registered_milan_v12(struct acmp *acmp,
int handle_evt_tk_unregistered_milan_v12(struct acmp *acmp,
struct avb_msrp_attribute *msrp_attr, uint64_t now);
int acmp_tmr_no_resp_milan_v12(struct acmp *acmp, uint64_t now);
int acmp_tmr_retry_milan_v12(struct acmp *acmp, uint64_t now);
int acmp_tmr_delay_milan_v12(struct acmp *acmp, uint64_t now);
int acmp_tmr_no_tk_milan_v12(struct acmp *acmp, uint64_t now);
int handle_evt_tk_registration_failed_milan_v12(struct acmp *acmp,
struct avb_msrp_attribute *msrp_attr, uint64_t now);
int handle_acmp_cli_cmd_milan_v12(struct acmp *acmp, const char *args, FILE *out);