tlv: Implement a memory pool for TLV descriptors.
Signed-off-by: Richard Cochran <richardcochran@gmail.com>master
parent
d432cdc52a
commit
c8d9d05e7a
3
msg.c
3
msg.c
|
@ -213,6 +213,9 @@ void msg_cleanup(void)
|
|||
{
|
||||
struct message_storage *s;
|
||||
struct ptp_message *m;
|
||||
|
||||
tlv_extra_cleanup();
|
||||
|
||||
while ((m = TAILQ_FIRST(&msg_pool)) != NULL) {
|
||||
TAILQ_REMOVE(&msg_pool, m, list);
|
||||
s = container_of(m, struct message_storage, msg);
|
||||
|
|
32
tlv.c
32
tlv.c
|
@ -18,6 +18,7 @@
|
|||
*/
|
||||
#include <arpa/inet.h>
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "port.h"
|
||||
|
@ -29,6 +30,9 @@
|
|||
|
||||
uint8_t ieee8021_id[3] = { IEEE_802_1_COMMITTEE };
|
||||
|
||||
static TAILQ_HEAD(tlv_pool, tlv_extra) tlv_pool =
|
||||
TAILQ_HEAD_INITIALIZER(tlv_pool);
|
||||
|
||||
static void scaled_ns_n2h(ScaledNs *sns)
|
||||
{
|
||||
sns->nanoseconds_msb = ntohs(sns->nanoseconds_msb);
|
||||
|
@ -412,6 +416,34 @@ static void org_pre_send(struct organization_tlv *org)
|
|||
}
|
||||
}
|
||||
|
||||
struct tlv_extra *tlv_extra_alloc(void)
|
||||
{
|
||||
struct tlv_extra *extra = TAILQ_FIRST(&tlv_pool);
|
||||
|
||||
if (extra) {
|
||||
TAILQ_REMOVE(&tlv_pool, extra, list);
|
||||
} else {
|
||||
extra = calloc(1, sizeof(*extra));
|
||||
}
|
||||
return extra;
|
||||
}
|
||||
|
||||
void tlv_extra_cleanup(void)
|
||||
{
|
||||
struct tlv_extra *extra;
|
||||
|
||||
while ((extra = TAILQ_FIRST(&tlv_pool)) != NULL) {
|
||||
TAILQ_REMOVE(&tlv_pool, extra, list);
|
||||
free(extra);
|
||||
}
|
||||
}
|
||||
|
||||
void tlv_extra_recycle(struct tlv_extra *extra)
|
||||
{
|
||||
memset(extra, 0, sizeof(*extra));
|
||||
TAILQ_INSERT_HEAD(&tlv_pool, extra, list);
|
||||
}
|
||||
|
||||
int tlv_post_recv(struct TLV *tlv, struct tlv_extra *extra)
|
||||
{
|
||||
int result = 0;
|
||||
|
|
21
tlv.h
21
tlv.h
|
@ -20,6 +20,8 @@
|
|||
#ifndef HAVE_TLV_H
|
||||
#define HAVE_TLV_H
|
||||
|
||||
#include <sys/queue.h>
|
||||
|
||||
#include "ddt.h"
|
||||
#include "ds.h"
|
||||
|
||||
|
@ -228,11 +230,30 @@ struct mgmt_clock_description {
|
|||
};
|
||||
|
||||
struct tlv_extra {
|
||||
TAILQ_ENTRY(tlv_extra) list;
|
||||
struct TLV *tlv;
|
||||
union {
|
||||
struct mgmt_clock_description cd;
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
* Allocates a new tlv_extra structure.
|
||||
* @return Pointer to a new structure on success or NULL otherwise.
|
||||
*/
|
||||
struct tlv_extra *tlv_extra_alloc(void);
|
||||
|
||||
/**
|
||||
* Release all of the memory in the tlv_extra cache.
|
||||
*/
|
||||
void tlv_extra_cleanup(void);
|
||||
|
||||
/**
|
||||
* Frees a tlv_extra structure.
|
||||
* @param extra Pointer to the structure to free.
|
||||
*/
|
||||
void tlv_extra_recycle(struct tlv_extra *extra);
|
||||
|
||||
/**
|
||||
* Converts recognized value sub-fields into host byte order.
|
||||
* @param tlv Pointer to a Type Length Value field.
|
||||
|
|
Loading…
Reference in New Issue