msg: Make msg_pre_send() and msg_post_recv() symmetrical
Since commit 7fe69e7ba0
management
messages are dropped in some cases because the tlv_count isn't 1.
Further analysis shows that this is the case when the message is
forwarded in clock_forward_mgmt_msg(). This is because msg_post_recv()
will append TLVs and - in the forwarding case - there is already one TLV
in the list, which results in tlv_count being 2 and thus dropped in
subsequent code.
msg_post_recv() is intended to be the cleanup code for msg_pre_send()
which is called earlier. Therefore, make msg_post_recv() and
msg_pre_send() symmetrical and cleanup the tlv_list and tlv_count.
Signed-off-by: Michael Walle <michael@walle.cc>
master
parent
f977a653e0
commit
427f1b3981
18
msg.c
18
msg.c
|
@ -174,6 +174,16 @@ static struct tlv_extra *msg_tlv_prepare(struct ptp_message *msg, int length)
|
||||||
return extra;
|
return extra;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void msg_tlv_recycle(struct ptp_message *msg)
|
||||||
|
{
|
||||||
|
struct tlv_extra *extra;
|
||||||
|
|
||||||
|
while ((extra = TAILQ_FIRST(&msg->tlv_list)) != NULL) {
|
||||||
|
TAILQ_REMOVE(&msg->tlv_list, extra, list);
|
||||||
|
tlv_extra_recycle(extra);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void port_id_post_recv(struct PortIdentity *pid)
|
static void port_id_post_recv(struct PortIdentity *pid)
|
||||||
{
|
{
|
||||||
pid->portNumber = ntohs(pid->portNumber);
|
pid->portNumber = ntohs(pid->portNumber);
|
||||||
|
@ -235,6 +245,7 @@ static void suffix_pre_send(struct ptp_message *msg)
|
||||||
tlv->type = htons(tlv->type);
|
tlv->type = htons(tlv->type);
|
||||||
tlv->length = htons(tlv->length);
|
tlv->length = htons(tlv->length);
|
||||||
}
|
}
|
||||||
|
msg_tlv_recycle(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void timestamp_post_recv(struct ptp_message *m, struct Timestamp *ts)
|
static void timestamp_post_recv(struct ptp_message *m, struct Timestamp *ts)
|
||||||
|
@ -561,18 +572,13 @@ void msg_print(struct ptp_message *m, FILE *fp)
|
||||||
|
|
||||||
void msg_put(struct ptp_message *m)
|
void msg_put(struct ptp_message *m)
|
||||||
{
|
{
|
||||||
struct tlv_extra *extra;
|
|
||||||
|
|
||||||
m->refcnt--;
|
m->refcnt--;
|
||||||
if (m->refcnt) {
|
if (m->refcnt) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
pool_stats.count++;
|
pool_stats.count++;
|
||||||
pool_debug("recycle", m);
|
pool_debug("recycle", m);
|
||||||
while ((extra = TAILQ_FIRST(&m->tlv_list)) != NULL) {
|
msg_tlv_recycle(m);
|
||||||
TAILQ_REMOVE(&m->tlv_list, extra, list);
|
|
||||||
tlv_extra_recycle(extra);
|
|
||||||
}
|
|
||||||
TAILQ_INSERT_HEAD(&msg_pool, m, list);
|
TAILQ_INSERT_HEAD(&msg_pool, m, list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue