mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2026-02-15 22:05:28 -05:00
64 lines
2 KiB
C
64 lines
2 KiB
C
/* AVB support */
|
|
/* SPDX-FileCopyrightText: Copyright © 2025 Kebag-Logic */
|
|
/* SPDX-FileCopyrightText: Copyright © 2025 Alex Malki <alexandre.malki@kebag-logic.com> */
|
|
/* SPDX-License-Identifier: MIT */
|
|
|
|
#include "../aecp-aem-state.h"
|
|
#include "../descriptors.h"
|
|
#include "cmd-resp-helpers.h"
|
|
#include "cmd-resp-types.h"
|
|
|
|
#include "cmd-available.h"
|
|
|
|
/* ENTITY AVAILABLE according to the locking state */
|
|
#define AECP_AEM_AVAIL_ENTITY_ACQUIRED (1<<0)
|
|
#define AECP_AEM_AVAIL_ENTITY_LOCKED (1<<1)
|
|
#define AECP_AEM_AVAIL_SUBENTITY_ACQUIRED (1<<2)
|
|
#define AECP_AEM_AVAIL_SUBENTITY_LOCKED (1<<3)
|
|
|
|
int handle_cmd_entity_available_milan_v12(struct aecp *aecp, int64_t now, const void *m,
|
|
int len)
|
|
{
|
|
uint8_t buf[512];
|
|
|
|
/* Commnand received specific */
|
|
struct server *server = aecp->server;
|
|
const struct avb_ethernet_header *h = m;
|
|
struct avb_ethernet_header *h_reply;
|
|
const struct avb_packet_aecp_aem *p = SPA_PTROFF(h, sizeof(*h), void);
|
|
|
|
/* Reply specific */
|
|
struct avb_packet_aecp_aem *p_reply;
|
|
struct avb_packet_aecp_aem_available *avail_reply;
|
|
|
|
/* Entity specific */
|
|
struct descriptor *desc;
|
|
struct aecp_aem_entity_milan_state *entity_state;
|
|
struct aecp_aem_lock_state *lock;
|
|
|
|
desc = server_find_descriptor(server, AVB_AEM_DESC_ENTITY, 0);
|
|
if (desc == NULL) {
|
|
return reply_status(aecp,
|
|
AVB_AECP_AEM_STATUS_NO_SUCH_DESCRIPTOR, p, len);
|
|
}
|
|
|
|
entity_state = desc->ptr;
|
|
lock = &entity_state->lock_state;
|
|
|
|
/* Forge the response for the entity that is locking the device */
|
|
memcpy(buf, m, len);
|
|
h_reply = (struct avb_ethernet_header *) buf;
|
|
p_reply = SPA_PTROFF(h_reply, sizeof(*h_reply), void);
|
|
avail_reply = (struct avb_packet_aecp_aem_available*)p_reply->payload;
|
|
|
|
avail_reply->acquired_controller_guid = 0;
|
|
|
|
if ((lock->base_info.expire_timeout < now) || !lock->is_locked) {
|
|
avail_reply->flags = 0;
|
|
} else if (lock->is_locked) {
|
|
avail_reply->lock_controller_guid = htobe64(lock->locked_id);
|
|
avail_reply->flags = htonl(AECP_AEM_AVAIL_ENTITY_LOCKED);
|
|
}
|
|
|
|
return reply_success(aecp, buf, len);
|
|
}
|