mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2026-04-30 06:46:49 -04:00
Merge branch '5017_fixing_module_avb_potential_memory_issue' into 'master'
5017 fixing module avb potential memory issue See merge request pipewire/pipewire!2806
This commit is contained in:
commit
eb600f6cb2
8 changed files with 91 additions and 32 deletions
|
|
@ -33,36 +33,24 @@ int handle_cmd_deregister_unsol_notif_milan_v12(struct aecp *aecp, int64_t now,
|
||||||
entity_state = (struct aecp_aem_entity_milan_state *) desc->ptr;
|
entity_state = (struct aecp_aem_entity_milan_state *) desc->ptr;
|
||||||
unsol = entity_state->unsol_notif_state;
|
unsol = entity_state->unsol_notif_state;
|
||||||
|
|
||||||
/** First check if the controller was already registered */
|
/** Clear the slot matching this controller, if any */
|
||||||
for (index = 0; index < ctrler_max; index++) {
|
for (index = 0; index < ctrler_max; index++) {
|
||||||
uint64_t ctrl_eid = unsol[index].ctrler_entity_id;
|
uint64_t ctrl_eid = unsol[index].ctrler_entity_id;
|
||||||
bool ctrler_reged = unsol[index].is_registered;
|
bool ctrler_reged = unsol[index].is_registered;
|
||||||
|
|
||||||
if ((ctrl_eid == controller_id) && ctrler_reged) {
|
if ((ctrl_eid == controller_id) && ctrler_reged) {
|
||||||
pw_log_debug("controller 0x%"PRIx64", already registered",
|
unsol[index].is_registered = false;
|
||||||
|
unsol[index].ctrler_entity_id = 0;
|
||||||
|
unsol[index].next_seq_id = 0;
|
||||||
|
unsol[index].port_id = 0;
|
||||||
|
memset(unsol[index].ctrler_mac_addr, 0,
|
||||||
|
sizeof(unsol[index].ctrler_mac_addr));
|
||||||
|
pw_log_info("Unsol deregistration for 0x%"PRIx64,
|
||||||
controller_id);
|
controller_id);
|
||||||
return reply_success(aecp, m, len);
|
return reply_success(aecp, m, len);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** When one slot is in the array is available use it */
|
pw_log_debug("controller 0x%"PRIx64" was not registered", controller_id);
|
||||||
for (index = 0; index < ctrler_max; index++) {
|
|
||||||
if (!unsol[index].is_registered) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Reach the maximum controller allocated */
|
|
||||||
if (index == ctrler_max) {
|
|
||||||
return reply_no_resources(aecp, m, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
unsol[index].ctrler_entity_id = controller_id;
|
|
||||||
memcpy(unsol[index].ctrler_mac_addr, h->src, sizeof(h->src));
|
|
||||||
unsol[index].is_registered = true;
|
|
||||||
unsol[index].port_id = 0;
|
|
||||||
unsol[index].next_seq_id = 0;
|
|
||||||
|
|
||||||
pw_log_info("Unsol registration for 0x%"PRIx64, controller_id);
|
|
||||||
return reply_success(aecp, m, len);
|
return reply_success(aecp, m, len);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
/* SPDX-FileCopyrightText: Copyright © 2025 Alexandre Malki <alexandre.malki@kebag-logic.com> */
|
/* SPDX-FileCopyrightText: Copyright © 2025 Alexandre Malki <alexandre.malki@kebag-logic.com> */
|
||||||
/* SPDX-License-Identifier: MIT */
|
/* SPDX-License-Identifier: MIT */
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
|
@ -23,6 +24,9 @@ static int reply_invalid_clock_source(struct aecp *aecp,
|
||||||
struct avb_packet_aecp_aem *p = SPA_PTROFF(h, sizeof(*h), void);
|
struct avb_packet_aecp_aem *p = SPA_PTROFF(h, sizeof(*h), void);
|
||||||
struct avb_packet_aecp_aem_setget_clock_source *sclk_source;
|
struct avb_packet_aecp_aem_setget_clock_source *sclk_source;
|
||||||
|
|
||||||
|
if (len < 0 || (size_t)len > sizeof(buf))
|
||||||
|
return reply_status(aecp, AVB_AECP_AEM_STATUS_BAD_ARGUMENTS, m, len);
|
||||||
|
|
||||||
memcpy(buf, m, len);
|
memcpy(buf, m, len);
|
||||||
sclk_source =
|
sclk_source =
|
||||||
(struct avb_packet_aecp_aem_setget_clock_source *) p->payload;
|
(struct avb_packet_aecp_aem_setget_clock_source *) p->payload;
|
||||||
|
|
@ -41,6 +45,9 @@ static int handle_unsol_set_clock_source(struct aecp *aecp, struct descriptor *d
|
||||||
struct aecp_aem_base_info bi = { 0 };
|
struct aecp_aem_base_info bi = { 0 };
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
|
if (len < 0 || (size_t)len > sizeof(buf))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
memcpy(buf, m, len);
|
memcpy(buf, m, len);
|
||||||
bi.controller_entity_id = htobe64(ctrler_id);
|
bi.controller_entity_id = htobe64(ctrler_id);
|
||||||
bi.expire_timeout = INT64_MAX;
|
bi.expire_timeout = INT64_MAX;
|
||||||
|
|
@ -67,12 +74,15 @@ int handle_cmd_get_clock_source_milan_v12(struct aecp *aecp, int64_t now,
|
||||||
uint16_t desc_index;
|
uint16_t desc_index;
|
||||||
uint16_t desc_type;
|
uint16_t desc_type;
|
||||||
|
|
||||||
|
if (len < 0 || (size_t)len > sizeof(buf))
|
||||||
|
return reply_status(aecp, AVB_AECP_AEM_STATUS_BAD_ARGUMENTS, m, len);
|
||||||
|
|
||||||
memcpy(buf, m, len);
|
memcpy(buf, m, len);
|
||||||
sclk_source =
|
sclk_source =
|
||||||
(struct avb_packet_aecp_aem_setget_clock_source *) p->payload;
|
(struct avb_packet_aecp_aem_setget_clock_source *) p->payload;
|
||||||
|
|
||||||
desc_index = htons(sclk_source->descriptor_id);
|
desc_type = ntohs(sclk_source->descriptor_type);
|
||||||
desc_type = htons(sclk_source->descriptor_id);
|
desc_index = ntohs(sclk_source->descriptor_id);
|
||||||
|
|
||||||
desc = server_find_descriptor(aecp->server, desc_type, desc_index);
|
desc = server_find_descriptor(aecp->server, desc_type, desc_index);
|
||||||
if (desc == NULL)
|
if (desc == NULL)
|
||||||
|
|
@ -84,8 +94,7 @@ int handle_cmd_get_clock_source_milan_v12(struct aecp *aecp, int64_t now,
|
||||||
/** Descriptors always keep the network endianness */
|
/** Descriptors always keep the network endianness */
|
||||||
sclk_source->clock_source_index = dclk_domain->clock_source_index;
|
sclk_source->clock_source_index = dclk_domain->clock_source_index;
|
||||||
|
|
||||||
len = sizeof(*p) + sizeof(*sclk_source) + sizeof(*h);
|
return reply_success(aecp, buf, len);
|
||||||
return reply_success(aecp, m, len);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
/* SPDX-FileCopyrightText: Copyright © 2026 Alexandre Malki <alexandre.malki@kebag-logic.com> */
|
/* SPDX-FileCopyrightText: Copyright © 2026 Alexandre Malki <alexandre.malki@kebag-logic.com> */
|
||||||
/* SPDX-License-Identifier: MIT */
|
/* SPDX-License-Identifier: MIT */
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
@ -44,6 +45,9 @@ static int send_unsol_control_milan_v12(struct aecp *aecp,
|
||||||
struct aecp_aem_base_info info = { 0 };
|
struct aecp_aem_base_info info = { 0 };
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
|
|
||||||
|
if (len > sizeof(unsol_buf))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
memcpy(unsol_buf, m, len);
|
memcpy(unsol_buf, m, len);
|
||||||
/* Prepare a template packet */
|
/* Prepare a template packet */
|
||||||
info.controller_entity_id = htobe64(ctrler_id);
|
info.controller_entity_id = htobe64(ctrler_id);
|
||||||
|
|
@ -78,7 +82,13 @@ static int reply_control_badargs(struct aecp *aecp, const void *m, int len,
|
||||||
m, len);
|
m, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (len < 0 || (size_t)len > sizeof(buf))
|
||||||
|
return reply_status(aecp, AVB_AECP_AEM_STATUS_BAD_ARGUMENTS,
|
||||||
|
m, len);
|
||||||
|
|
||||||
memcpy(buf, m, len);
|
memcpy(buf, m, len);
|
||||||
|
if (pkt_size > len)
|
||||||
|
memset(buf + len, 0, pkt_size - len);
|
||||||
ae_reply = (struct avb_packet_aecp_aem_setget_control *)p_reply->payload;
|
ae_reply = (struct avb_packet_aecp_aem_setget_control *)p_reply->payload;
|
||||||
|
|
||||||
control_copy_payload(format, ae_reply->payload, type_sz, count);
|
control_copy_payload(format, ae_reply->payload, type_sz, count);
|
||||||
|
|
@ -102,12 +112,19 @@ static int handle_cmd_get_control_identify(struct aecp *aecp, struct descriptor
|
||||||
ctrl_desc = desc->ptr;
|
ctrl_desc = desc->ptr;
|
||||||
desc_formats = ctrl_desc->value_format;
|
desc_formats = ctrl_desc->value_format;
|
||||||
|
|
||||||
|
if (len < 0 || (size_t)len > sizeof(buf))
|
||||||
|
return reply_status(aecp, AVB_AECP_AEM_STATUS_BAD_ARGUMENTS,
|
||||||
|
m, len);
|
||||||
|
|
||||||
memcpy(buf, m, len);
|
memcpy(buf, m, len);
|
||||||
ae_reply = (struct avb_packet_aecp_aem_setget_control *)p_reply->payload;
|
ae_reply = (struct avb_packet_aecp_aem_setget_control *)p_reply->payload;
|
||||||
|
|
||||||
// Idenfity only has one value element
|
// Idenfity only has one value element
|
||||||
pkt_size = sizeof(*h) + sizeof(*p_reply)+ CONTROL_LINEAR_UINT8_SIZE;
|
pkt_size = sizeof(*h) + sizeof(*p_reply)+ CONTROL_LINEAR_UINT8_SIZE;
|
||||||
|
|
||||||
|
if (pkt_size > len)
|
||||||
|
memset(buf + len, 0, pkt_size - len);
|
||||||
|
|
||||||
control_copy_payload(desc_formats, ae_reply->payload,
|
control_copy_payload(desc_formats, ae_reply->payload,
|
||||||
CONTROL_LINEAR_UINT8_SIZE, 1);
|
CONTROL_LINEAR_UINT8_SIZE, 1);
|
||||||
|
|
||||||
|
|
@ -133,6 +150,11 @@ static int handle_cmd_set_control_identify(struct aecp *aecp, struct descriptor
|
||||||
old_value_format = desc_formats;
|
old_value_format = desc_formats;
|
||||||
value_req = (uint8_t *)control->payload;
|
value_req = (uint8_t *)control->payload;
|
||||||
|
|
||||||
|
if (len < 0 || (size_t)len < sizeof(*h) + sizeof(*p) +
|
||||||
|
sizeof(*control) + CONTROL_LINEAR_UINT8_SIZE)
|
||||||
|
return reply_status(aecp, AVB_AECP_AEM_STATUS_BAD_ARGUMENTS,
|
||||||
|
m, len);
|
||||||
|
|
||||||
if (*value_req == desc_formats->current_value) {
|
if (*value_req == desc_formats->current_value) {
|
||||||
return reply_success(aecp, m, len);
|
return reply_success(aecp, m, len);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
/* SPDX-FileCopyrightText: Copyright © 2025 Alexandre Malki <alexandre.malki@kebag-logic.com> */
|
/* SPDX-FileCopyrightText: Copyright © 2025 Alexandre Malki <alexandre.malki@kebag-logic.com> */
|
||||||
/* SPDX-License-Identifier: MIT */
|
/* SPDX-License-Identifier: MIT */
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
|
|
@ -73,6 +74,9 @@ static int send_unsol_name(struct aecp *aecp,
|
||||||
uint8_t unsol_buf[512];
|
uint8_t unsol_buf[512];
|
||||||
struct aecp_aem_base_info info = { 0 };
|
struct aecp_aem_base_info info = { 0 };
|
||||||
|
|
||||||
|
if (len < 0 || (size_t)len > sizeof(unsol_buf))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
memcpy(unsol_buf, msg, len);
|
memcpy(unsol_buf, msg, len);
|
||||||
info.controller_entity_id = htobe64(p->aecp.controller_guid);
|
info.controller_entity_id = htobe64(p->aecp.controller_guid);
|
||||||
info.expire_timeout = INT64_MAX;
|
info.expire_timeout = INT64_MAX;
|
||||||
|
|
@ -98,6 +102,12 @@ int handle_cmd_get_name_common(struct aecp *aecp, int64_t now,
|
||||||
struct descriptor *desc;
|
struct descriptor *desc;
|
||||||
uint16_t desc_type, desc_id, name_index;
|
uint16_t desc_type, desc_id, name_index;
|
||||||
char *name_ptr;
|
char *name_ptr;
|
||||||
|
size_t reply_len;
|
||||||
|
|
||||||
|
if (len < 0 || (size_t)len > sizeof(buf) ||
|
||||||
|
(size_t)len < sizeof(*h) + sizeof(*p) + sizeof(*cmd))
|
||||||
|
return reply_status(aecp,
|
||||||
|
AVB_AECP_AEM_STATUS_BAD_ARGUMENTS, m, len);
|
||||||
|
|
||||||
cmd = (const struct avb_packet_aecp_aem_setget_name *)p->payload;
|
cmd = (const struct avb_packet_aecp_aem_setget_name *)p->payload;
|
||||||
desc_type = ntohs(cmd->descriptor_type);
|
desc_type = ntohs(cmd->descriptor_type);
|
||||||
|
|
@ -114,7 +124,9 @@ int handle_cmd_get_name_common(struct aecp *aecp, int64_t now,
|
||||||
return reply_status(aecp,
|
return reply_status(aecp,
|
||||||
AVB_AECP_AEM_STATUS_BAD_ARGUMENTS, m, len);
|
AVB_AECP_AEM_STATUS_BAD_ARGUMENTS, m, len);
|
||||||
|
|
||||||
memcpy(buf, m, len);
|
reply_len = sizeof(*h) + sizeof(*p) + sizeof(*cmd);
|
||||||
|
|
||||||
|
memcpy(buf, m, reply_len);
|
||||||
h_reply = (struct avb_ethernet_header *)buf;
|
h_reply = (struct avb_ethernet_header *)buf;
|
||||||
p_reply = SPA_PTROFF(h_reply, sizeof(*h_reply), void);
|
p_reply = SPA_PTROFF(h_reply, sizeof(*h_reply), void);
|
||||||
reply = (struct avb_packet_aecp_aem_setget_name *)p_reply->payload;
|
reply = (struct avb_packet_aecp_aem_setget_name *)p_reply->payload;
|
||||||
|
|
@ -126,7 +138,7 @@ int handle_cmd_get_name_common(struct aecp *aecp, int64_t now,
|
||||||
*/
|
*/
|
||||||
memcpy(reply->name, name_ptr, 64);
|
memcpy(reply->name, name_ptr, 64);
|
||||||
|
|
||||||
return reply_success(aecp, buf, len);
|
return reply_success(aecp, buf, reply_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -162,6 +174,10 @@ int handle_cmd_set_name_common(struct aecp *aecp, int64_t now,
|
||||||
return reply_status(aecp,
|
return reply_status(aecp,
|
||||||
AVB_AECP_AEM_STATUS_BAD_ARGUMENTS, m, len);
|
AVB_AECP_AEM_STATUS_BAD_ARGUMENTS, m, len);
|
||||||
|
|
||||||
|
if (len < 0 || (size_t)len < sizeof(*h) + sizeof(*p) + sizeof(*cmd))
|
||||||
|
return reply_status(aecp,
|
||||||
|
AVB_AECP_AEM_STATUS_BAD_ARGUMENTS, m, len);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* IEEE 1722.1-2021: 7.4.17.1: The name does not contain a trailing NULL
|
* IEEE 1722.1-2021: 7.4.17.1: The name does not contain a trailing NULL
|
||||||
* but if the name is less than 64 bytes in length then it is zero
|
* but if the name is less than 64 bytes in length then it is zero
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@
|
||||||
#ifndef __AVB_AECP_AEM_HELPERS_H__
|
#ifndef __AVB_AECP_AEM_HELPERS_H__
|
||||||
#define __AVB_AECP_AEM_HELPERS_H__
|
#define __AVB_AECP_AEM_HELPERS_H__
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
|
@ -21,6 +22,11 @@ static inline int reply_status(struct aecp *aecp, int status, const void *m, int
|
||||||
struct avb_ethernet_header *h = (void*)buf;
|
struct avb_ethernet_header *h = (void*)buf;
|
||||||
struct avb_packet_aecp_header *reply = SPA_PTROFF(h, sizeof(*h), void);
|
struct avb_packet_aecp_header *reply = SPA_PTROFF(h, sizeof(*h), void);
|
||||||
|
|
||||||
|
if (len < 0 || (size_t)len > sizeof(buf)) {
|
||||||
|
pw_log_warn("reply_status: invalid len %d", len);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
memcpy(buf, m, len);
|
memcpy(buf, m, len);
|
||||||
|
|
||||||
pw_log_debug("status 0x%x\n", status);
|
pw_log_debug("status 0x%x\n", status);
|
||||||
|
|
|
||||||
|
|
@ -111,6 +111,9 @@ static void reply_unsol_notifications_prepare(struct aecp *aecp,
|
||||||
|
|
||||||
/* Here the value of 12 is the delta between the target_entity_id and
|
/* Here the value of 12 is the delta between the target_entity_id and
|
||||||
start of the AECP message specific data. */
|
start of the AECP message specific data. */
|
||||||
|
if (len < sizeof(*h) + sizeof(*p))
|
||||||
|
ctrl_data_length = AVB_PACKET_CONTROL_DATA_OFFSET;
|
||||||
|
else
|
||||||
ctrl_data_length = len - (sizeof(*h) + sizeof(*p))
|
ctrl_data_length = len - (sizeof(*h) + sizeof(*p))
|
||||||
+ AVB_PACKET_CONTROL_DATA_OFFSET;
|
+ AVB_PACKET_CONTROL_DATA_OFFSET;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -100,11 +100,17 @@ static int handle_read_descriptor_common(struct aecp *aecp, int64_t now, const v
|
||||||
if (desc == NULL)
|
if (desc == NULL)
|
||||||
return reply_status(aecp, AVB_AECP_AEM_STATUS_NO_SUCH_DESCRIPTOR, m, len);
|
return reply_status(aecp, AVB_AECP_AEM_STATUS_NO_SUCH_DESCRIPTOR, m, len);
|
||||||
|
|
||||||
memcpy(buf, m, len);
|
if (len < 0 || (size_t)len > sizeof(buf))
|
||||||
|
return reply_status(aecp, AVB_AECP_AEM_STATUS_BAD_ARGUMENTS, m, len);
|
||||||
|
|
||||||
psize = sizeof(*rd);
|
psize = sizeof(*rd);
|
||||||
size = sizeof(*h) + sizeof(*reply) + psize;
|
size = sizeof(*h) + sizeof(*reply) + psize;
|
||||||
|
|
||||||
|
if (desc->size > sizeof(buf) || size > sizeof(buf) - desc->size)
|
||||||
|
return reply_status(aecp, AVB_AECP_AEM_STATUS_NO_RESOURCES, m, len);
|
||||||
|
|
||||||
|
memcpy(buf, m, len);
|
||||||
|
|
||||||
memcpy(buf + size, desc->ptr, desc->size);
|
memcpy(buf + size, desc->ptr, desc->size);
|
||||||
size += desc->size;
|
size += desc->size;
|
||||||
psize += desc->size;
|
psize += desc->size;
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@
|
||||||
/* SPDX-FileCopyrightText: Copyright © 2022 Wim Taymans */
|
/* SPDX-FileCopyrightText: Copyright © 2022 Wim Taymans */
|
||||||
/* SPDX-License-Identifier: MIT */
|
/* SPDX-License-Identifier: MIT */
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
#include <spa/utils/json.h>
|
#include <spa/utils/json.h>
|
||||||
#include <spa/debug/mem.h>
|
#include <spa/debug/mem.h>
|
||||||
|
|
||||||
|
|
@ -22,10 +24,13 @@ struct msg_info {
|
||||||
static int reply_not_implemented(struct aecp *aecp, const void *p, int len)
|
static int reply_not_implemented(struct aecp *aecp, const void *p, int len)
|
||||||
{
|
{
|
||||||
struct server *server = aecp->server;
|
struct server *server = aecp->server;
|
||||||
uint8_t buf[len];
|
uint8_t buf[AVB_PACKET_MILAN_DEFAULT_MTU];
|
||||||
struct avb_ethernet_header *h = (void*)buf;
|
struct avb_ethernet_header *h = (void*)buf;
|
||||||
struct avb_packet_aecp_header *reply = SPA_PTROFF(h, sizeof(*h), void);
|
struct avb_packet_aecp_header *reply = SPA_PTROFF(h, sizeof(*h), void);
|
||||||
|
|
||||||
|
if (len < 0 || (size_t)len > sizeof(buf))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
memcpy(h, p, len);
|
memcpy(h, p, len);
|
||||||
AVB_PACKET_AECP_SET_STATUS(reply, AVB_AECP_STATUS_NOT_IMPLEMENTED);
|
AVB_PACKET_AECP_SET_STATUS(reply, AVB_AECP_STATUS_NOT_IMPLEMENTED);
|
||||||
|
|
||||||
|
|
@ -64,6 +69,10 @@ static int aecp_message(void *data, uint64_t now, const void *message, int len)
|
||||||
const struct msg_info *info;
|
const struct msg_info *info;
|
||||||
int message_type;
|
int message_type;
|
||||||
|
|
||||||
|
if (len < 0 ||
|
||||||
|
(size_t)len < sizeof(*h) + sizeof(*p) ||
|
||||||
|
(size_t)len > AVB_PACKET_MILAN_DEFAULT_MTU)
|
||||||
|
return 0;
|
||||||
if (ntohs(h->type) != AVB_TSN_ETH)
|
if (ntohs(h->type) != AVB_TSN_ETH)
|
||||||
return 0;
|
return 0;
|
||||||
if (memcmp(h->dest, mac, 6) != 0 &&
|
if (memcmp(h->dest, mac, 6) != 0 &&
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue