mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-04 13:30:12 -05:00
avb: clean up some packets
Listen to all messages. We don't seem to receive TSN messages from our local host it seems. Reply with not-implemented for an AEM_COMMANDS. Implement some mode ADP messages.
This commit is contained in:
parent
07a4c5032e
commit
287e8cfe51
8 changed files with 414 additions and 157 deletions
|
|
@ -47,7 +47,7 @@
|
|||
|
||||
#define server_emit(s,m,v,...) spa_hook_list_call(&s->listener_list, struct server_events, m, v, ##__VA_ARGS__)
|
||||
#define server_emit_destroy(s) server_emit(s, destroy, 0)
|
||||
#define server_emit_message(s,n,m,l) server_emit(s, message, 0, n, m, l)
|
||||
#define server_emit_message(s,n,mc,m,l) server_emit(s, message, 0, n, mc, m, l)
|
||||
#define server_emit_periodic(s,n) server_emit(s, periodic, 0, n)
|
||||
#define server_emit_command(s,n,c,a) server_emit(s, command, 0, n, c, a)
|
||||
|
||||
|
|
@ -66,37 +66,55 @@ static void on_socket_data(void *data, int fd, uint32_t mask)
|
|||
|
||||
if (mask & SPA_IO_IN) {
|
||||
int len, count;
|
||||
struct sockaddr_ll sll;
|
||||
uint8_t buffer[2048];
|
||||
socklen_t sl;
|
||||
|
||||
sl = sizeof(sll);
|
||||
len = recvfrom(fd, buffer, sizeof(buffer), 0,
|
||||
(struct sockaddr *)&sll, &sl);
|
||||
|
||||
if (sll.sll_protocol != htons(ETH_P_TSN))
|
||||
return;
|
||||
|
||||
len = read(fd, buffer, sizeof(buffer));
|
||||
if (len < 0) {
|
||||
pw_log_warn("got error: %m");
|
||||
pw_log_warn("got recv error: %m");
|
||||
}
|
||||
else if (len < (int)sizeof(struct avbtp_packet_common)) {
|
||||
else if (len < (int)sizeof(struct avbtp_packet_header)) {
|
||||
pw_log_warn("short packet received (%d < %d)", len,
|
||||
(int)sizeof(struct avbtp_packet_common));
|
||||
(int)sizeof(struct avbtp_packet_header));
|
||||
} else {
|
||||
clock_gettime(CLOCK_REALTIME, &now);
|
||||
server_emit_message(server, SPA_TIMESPEC_TO_NSEC(&now),
|
||||
buffer, len);
|
||||
sll.sll_addr, buffer, len);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int avbtp_server_send_packet(struct server *server, void *data, size_t size)
|
||||
int avbtp_server_send_packet(struct server *server, const uint8_t dest[6], void *data, size_t size)
|
||||
{
|
||||
struct sockaddr_ll sll;
|
||||
uint8_t dest[ETH_ALEN] = { 0x91, 0xe0, 0xf0, 0x01, 0x00, 0x00 };
|
||||
int res = 0;
|
||||
|
||||
spa_zero(sll);
|
||||
sll.sll_family = AF_PACKET;
|
||||
sll.sll_protocol = htons(ETH_P_TSN);
|
||||
sll.sll_ifindex = server->ifindex;
|
||||
sll.sll_ifindex = server->ifindex;
|
||||
sll.sll_halen = ETH_ALEN;
|
||||
memcpy(sll.sll_addr, dest, ETH_ALEN);
|
||||
|
||||
return sendto(server->source->fd, data, size, 0,
|
||||
(struct sockaddr *)&sll, sizeof(sll));
|
||||
if ((res = sendto(server->source->fd, data, size, 0,
|
||||
(struct sockaddr *)&sll, sizeof(sll))) < 0) {
|
||||
res = -errno;
|
||||
pw_log_warn("got send error: %m");
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
int avbtp_server_broadcast_packet(struct server *server, void *data, size_t size)
|
||||
{
|
||||
static const uint8_t dest[6] = { 0x91, 0xe0, 0xf0, 0x01, 0x00, 0x00 };
|
||||
return avbtp_server_send_packet(server, dest, data, size);
|
||||
}
|
||||
|
||||
static int setup_socket(struct server *server)
|
||||
|
|
@ -108,7 +126,7 @@ static int setup_socket(struct server *server)
|
|||
struct sockaddr_ll sll;
|
||||
struct timespec value, interval;
|
||||
|
||||
fd = socket(AF_PACKET, SOCK_DGRAM|SOCK_NONBLOCK, htons(ETH_P_TSN));
|
||||
fd = socket(AF_PACKET, SOCK_DGRAM|SOCK_NONBLOCK, htons(ETH_P_ALL));
|
||||
if (fd < 0) {
|
||||
pw_log_error("socket() failed: %m");
|
||||
return -errno;
|
||||
|
|
@ -141,11 +159,21 @@ static int setup_socket(struct server *server)
|
|||
(uint64_t)server->mac_addr[4] << 8 |
|
||||
(uint64_t)server->mac_addr[5];
|
||||
|
||||
pw_log_info("%lx", server->entity_id);
|
||||
pw_log_info("%lx %d", server->entity_id, server->ifindex);
|
||||
|
||||
spa_zero(mreq);
|
||||
mreq.mr_ifindex = server->ifindex;
|
||||
mreq.mr_type = PACKET_MR_PROMISC;
|
||||
if (setsockopt(fd, SOL_PACKET, PACKET_ADD_MEMBERSHIP,
|
||||
&mreq, sizeof(mreq)) < 0) {
|
||||
res = -errno;
|
||||
pw_log_error("setsockopt(ADD_MEMBERSHIP) failed: %m");
|
||||
goto error_close;
|
||||
}
|
||||
|
||||
spa_zero(sll);
|
||||
sll.sll_family = AF_PACKET;
|
||||
sll.sll_protocol = htons(ETH_P_TSN);
|
||||
sll.sll_protocol = htons(ETH_P_ALL);
|
||||
sll.sll_ifindex = server->ifindex;
|
||||
if (bind(fd, (struct sockaddr *) &sll, sizeof(sll)) < 0) {
|
||||
res = -errno;
|
||||
|
|
@ -153,16 +181,6 @@ static int setup_socket(struct server *server)
|
|||
goto error_close;
|
||||
}
|
||||
|
||||
spa_zero(mreq);
|
||||
mreq.mr_ifindex = server->ifindex;
|
||||
mreq.mr_type = PACKET_MR_ALLMULTI;
|
||||
if (setsockopt(fd, SOL_PACKET, PACKET_ADD_MEMBERSHIP,
|
||||
&mreq, sizeof(struct packet_mreq)) < 0) {
|
||||
res = -errno;
|
||||
pw_log_error("setsockopt(ADD_MEMBERSHIP) failed: %m");
|
||||
goto error_close;
|
||||
}
|
||||
|
||||
server->source = pw_loop_add_io(impl->loop, fd, SPA_IO_IN, true, on_socket_data, server);
|
||||
if (server->source == NULL) {
|
||||
res = -errno;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue