mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	avb: handle command errors better
Ignore unknown commands. Set the right reply message type for unsupported methods.
This commit is contained in:
		
							parent
							
								
									fa9fcbe964
								
							
						
					
					
						commit
						a34417eed0
					
				
					 1 changed files with 10 additions and 14 deletions
				
			
		| 
						 | 
					@ -99,13 +99,14 @@ struct msg_info {
 | 
				
			||||||
	int (*handle) (struct acmp *acmp, uint64_t now, const void *m, int len);
 | 
						int (*handle) (struct acmp *acmp, uint64_t now, const void *m, int len);
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int reply_not_supported(struct acmp *acmp, const void *m, int len)
 | 
					static int reply_not_supported(struct acmp *acmp, uint8_t type, const void *m, int len)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct server *server = acmp->server;
 | 
						struct server *server = acmp->server;
 | 
				
			||||||
	uint8_t buf[len];
 | 
						uint8_t buf[len];
 | 
				
			||||||
	struct avb_packet_acmp *reply = (struct avb_packet_acmp*)buf;
 | 
						struct avb_packet_acmp *reply = (struct avb_packet_acmp*)buf;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	memcpy(reply, m, len);
 | 
						memcpy(reply, m, len);
 | 
				
			||||||
 | 
						AVB_PACKET_ACMP_SET_MESSAGE_TYPE(reply, type);
 | 
				
			||||||
	AVB_PACKET_ACMP_SET_STATUS(reply, AVB_ACMP_STATUS_NOT_SUPPORTED);
 | 
						AVB_PACKET_ACMP_SET_STATUS(reply, AVB_ACMP_STATUS_NOT_SUPPORTED);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return avb_server_send_packet(server, reply->hdr.eth.src,
 | 
						return avb_server_send_packet(server, reply->hdr.eth.src,
 | 
				
			||||||
| 
						 | 
					@ -288,7 +289,7 @@ static int handle_connect_rx_command(struct acmp *acmp, uint64_t now, const void
 | 
				
			||||||
			AVB_TSN_ETH, cmd, len);
 | 
								AVB_TSN_ETH, cmd, len);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int handle_connect_rx_response(struct acmp *acmp, uint64_t now, const void *m, int len)
 | 
					static int handle_ignore(struct acmp *acmp, uint64_t now, const void *m, int len)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -314,26 +315,21 @@ static int handle_disconnect_rx_command(struct acmp *acmp, uint64_t now, const v
 | 
				
			||||||
			AVB_TSN_ETH, cmd, len);
 | 
								AVB_TSN_ETH, cmd, len);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int handle_disconnect_rx_response(struct acmp *acmp, uint64_t now, const void *p, int len)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	return 0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static const struct msg_info msg_info[] = {
 | 
					static const struct msg_info msg_info[] = {
 | 
				
			||||||
	{ AVB_ACMP_MESSAGE_TYPE_CONNECT_TX_COMMAND, "connect-tx-command", handle_connect_tx_command, },
 | 
						{ AVB_ACMP_MESSAGE_TYPE_CONNECT_TX_COMMAND, "connect-tx-command", handle_connect_tx_command, },
 | 
				
			||||||
	{ AVB_ACMP_MESSAGE_TYPE_CONNECT_TX_RESPONSE, "connect-tx-response", handle_connect_tx_response, },
 | 
						{ AVB_ACMP_MESSAGE_TYPE_CONNECT_TX_RESPONSE, "connect-tx-response", handle_connect_tx_response, },
 | 
				
			||||||
	{ AVB_ACMP_MESSAGE_TYPE_DISCONNECT_TX_COMMAND, "disconnect-tx-command", handle_disconnect_tx_command, },
 | 
						{ AVB_ACMP_MESSAGE_TYPE_DISCONNECT_TX_COMMAND, "disconnect-tx-command", handle_disconnect_tx_command, },
 | 
				
			||||||
	{ AVB_ACMP_MESSAGE_TYPE_DISCONNECT_TX_RESPONSE, "disconnect-tx-response", handle_disconnect_tx_response, },
 | 
						{ AVB_ACMP_MESSAGE_TYPE_DISCONNECT_TX_RESPONSE, "disconnect-tx-response", handle_disconnect_tx_response, },
 | 
				
			||||||
	{ AVB_ACMP_MESSAGE_TYPE_GET_TX_STATE_COMMAND, "get-tx-state-command", NULL, },
 | 
						{ AVB_ACMP_MESSAGE_TYPE_GET_TX_STATE_COMMAND, "get-tx-state-command", NULL, },
 | 
				
			||||||
	{ AVB_ACMP_MESSAGE_TYPE_GET_TX_STATE_RESPONSE, "get-tx-state-response", NULL, },
 | 
						{ AVB_ACMP_MESSAGE_TYPE_GET_TX_STATE_RESPONSE, "get-tx-state-response", handle_ignore, },
 | 
				
			||||||
	{ AVB_ACMP_MESSAGE_TYPE_CONNECT_RX_COMMAND, "connect-rx-command", handle_connect_rx_command, },
 | 
						{ AVB_ACMP_MESSAGE_TYPE_CONNECT_RX_COMMAND, "connect-rx-command", handle_connect_rx_command, },
 | 
				
			||||||
	{ AVB_ACMP_MESSAGE_TYPE_CONNECT_RX_RESPONSE, "connect-rx-response", handle_connect_rx_response, },
 | 
						{ AVB_ACMP_MESSAGE_TYPE_CONNECT_RX_RESPONSE, "connect-rx-response", handle_ignore, },
 | 
				
			||||||
	{ AVB_ACMP_MESSAGE_TYPE_DISCONNECT_RX_COMMAND, "disconnect-rx-command", handle_disconnect_rx_command, },
 | 
						{ AVB_ACMP_MESSAGE_TYPE_DISCONNECT_RX_COMMAND, "disconnect-rx-command", handle_disconnect_rx_command, },
 | 
				
			||||||
	{ AVB_ACMP_MESSAGE_TYPE_DISCONNECT_RX_RESPONSE, "disconnect-rx-response", handle_disconnect_rx_response, },
 | 
						{ AVB_ACMP_MESSAGE_TYPE_DISCONNECT_RX_RESPONSE, "disconnect-rx-response", handle_ignore, },
 | 
				
			||||||
	{ AVB_ACMP_MESSAGE_TYPE_GET_RX_STATE_COMMAND, "get-rx-state-command", NULL, },
 | 
						{ AVB_ACMP_MESSAGE_TYPE_GET_RX_STATE_COMMAND, "get-rx-state-command", NULL, },
 | 
				
			||||||
	{ AVB_ACMP_MESSAGE_TYPE_GET_RX_STATE_RESPONSE, "get-rx-state-response", NULL, },
 | 
						{ AVB_ACMP_MESSAGE_TYPE_GET_RX_STATE_RESPONSE, "get-rx-state-response", handle_ignore, },
 | 
				
			||||||
	{ AVB_ACMP_MESSAGE_TYPE_GET_TX_CONNECTION_COMMAND, "get-tx-connection-command", NULL, },
 | 
						{ AVB_ACMP_MESSAGE_TYPE_GET_TX_CONNECTION_COMMAND, "get-tx-connection-command", NULL, },
 | 
				
			||||||
	{ AVB_ACMP_MESSAGE_TYPE_GET_TX_CONNECTION_RESPONSE, "get-tx-connection-response", NULL, },
 | 
						{ AVB_ACMP_MESSAGE_TYPE_GET_TX_CONNECTION_RESPONSE, "get-tx-connection-response", handle_ignore, },
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline const struct msg_info *find_msg_info(uint16_t type, const char *name)
 | 
					static inline const struct msg_info *find_msg_info(uint16_t type, const char *name)
 | 
				
			||||||
| 
						 | 
					@ -368,12 +364,12 @@ static int acmp_message(void *data, uint64_t now, const void *message, int len)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	info = find_msg_info(message_type, NULL);
 | 
						info = find_msg_info(message_type, NULL);
 | 
				
			||||||
	if (info == NULL)
 | 
						if (info == NULL)
 | 
				
			||||||
		return reply_not_supported(acmp, p, len);
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pw_log_info("got ACMP message %s", info->name);
 | 
						pw_log_info("got ACMP message %s", info->name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (info->handle == NULL)
 | 
						if (info->handle == NULL)
 | 
				
			||||||
		return reply_not_supported(acmp, p, len);
 | 
							return reply_not_supported(acmp, message_type | 1, p, len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return info->handle(acmp, now, p, len);
 | 
						return info->handle(acmp, now, p, len);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue