msg: Introduce a method to copy a message.
The transparent clock will want to have two copies of certain messages, one for forwarding and one for internal use (in the BMCA and for syntonization). This patch add a function that duplicates a given message, including all of the attached TLVs. Signed-off-by: Richard Cochran <richardcochran@gmail.com>master
parent
1f65c3745c
commit
51b540875f
34
msg.c
34
msg.c
|
@ -295,6 +295,40 @@ void msg_cleanup(void)
|
|||
}
|
||||
}
|
||||
|
||||
struct ptp_message *msg_duplicate(struct ptp_message *msg, int cnt)
|
||||
{
|
||||
struct ptp_message *dup;
|
||||
int err;
|
||||
|
||||
dup = msg_allocate();
|
||||
if (!dup) {
|
||||
return NULL;
|
||||
}
|
||||
memcpy(dup, msg, sizeof(*dup));
|
||||
dup->refcnt = 1;
|
||||
TAILQ_INIT(&dup->tlv_list);
|
||||
dup->tlv_count = 0;
|
||||
|
||||
err = msg_post_recv(dup, cnt);
|
||||
if (err) {
|
||||
switch (err) {
|
||||
case -EBADMSG:
|
||||
pr_err("msg_duplicate: bad message");
|
||||
break;
|
||||
case -ETIME:
|
||||
pr_err("msg_duplicate: received %s without timestamp",
|
||||
msg_type_string(msg_type(msg)));
|
||||
break;
|
||||
case -EPROTO:
|
||||
pr_debug("msg_duplicate: ignoring message");
|
||||
break;
|
||||
}
|
||||
msg_put(dup);
|
||||
return NULL;
|
||||
}
|
||||
return dup;
|
||||
}
|
||||
|
||||
void msg_get(struct ptp_message *m)
|
||||
{
|
||||
m->refcnt++;
|
||||
|
|
20
msg.h
20
msg.h
|
@ -316,6 +316,26 @@ struct ptp_message *msg_allocate(void);
|
|||
*/
|
||||
void msg_cleanup(void);
|
||||
|
||||
/**
|
||||
* Duplicate a message instance.
|
||||
*
|
||||
* This function accepts a message in network byte order and returns a
|
||||
* duplicate in host byte.
|
||||
*
|
||||
* Messages are reference counted, and newly allocated messages have a
|
||||
* reference count of one. Allocated messages are freed using the
|
||||
* function @ref msg_put().
|
||||
*
|
||||
* @param msg A message obtained using @ref msg_allocate().
|
||||
* The passed message must be in network byte order, not
|
||||
* having been passed to @ref msg_post_recv().
|
||||
*
|
||||
* @return Pointer to a message on success, NULL otherwise.
|
||||
* The returned message will be in host byte order, having
|
||||
* been passed to @ref msg_post_recv().
|
||||
*/
|
||||
struct ptp_message *msg_duplicate(struct ptp_message *msg, int cnt);
|
||||
|
||||
/**
|
||||
* Obtain a reference to a message, increasing its reference count by one.
|
||||
* @param m A message obtained using @ref msg_allocate().
|
||||
|
|
Loading…
Reference in New Issue