Part of TI's mqtt
Dependents: mqtt_V1 cc3100_Test_mqtt_CM3
server_util.cpp
- Committer:
- dflet
- Date:
- 2015-06-06
- Revision:
- 0:547251f42a60
File content as of revision 0:547251f42a60:
/******************************************************************************
*
* Copyright (C) 2014 Texas Instruments Incorporated
*
* All rights reserved. Property of Texas Instruments Incorporated.
* Restricted rights to use, duplicate or disclose this code are
* granted through contract.
*
* The program may not be used without the written permission of
* Texas Instruments Incorporated or against the terms and conditions
* stipulated in the agreement under which this program has been supplied,
* and under no circumstances can it be used with non-TI connectivity device.
*
******************************************************************************/
#include "server_util.h"
namespace mbed_mqtt {
static uint16_t msg_id = 0xFFFF;
static inline uint16_t assign_new_msg_id()
{
return msg_id += 2;
}
uint16_t mqp_new_id_server(void)
{
return assign_new_msg_id();
}
static void my_pkt_free(struct mqtt_packet *mqp)
{
my_free((void*) mqp);
}
/*----------------------------------------------------------------------------
* Try to prevent fragmentation by consistently allocating a fixed memory size
*----------------------------------------------------------------------------
*/
#ifndef CFG_SR_MAX_MQP_TX_LEN
#define MQP_SERVER_TX_LEN 1024
#else
#define MQP_SERVER_TX_LEN CFG_SR_MAX_MQP_TX_LEN
#endif
/*------------------ Fixed memory configuration ends -----------------------*/
static struct mqtt_packet *server_mqp_alloc(uint8_t msg_type, uint32_t buf_sz, uint8_t offset)
{
uint32_t mqp_sz = sizeof(struct mqtt_packet);
struct mqtt_packet *mqp = NULL;
buf_sz += offset;
if((mqp_sz + buf_sz) > MQP_SERVER_TX_LEN) {
USR_INFO("S: fatal, buf alloc len > MQP_SERVER_TX_LEN\n\r");
return NULL;
}
mqp = (mqtt_packet*)my_malloc(MQP_SERVER_TX_LEN);
if(NULL != mqp) {
mqp_init(mqp, offset);
mqp->msg_type = msg_type;
mqp->maxlen = buf_sz;
mqp->buffer = (uint8_t*)mqp + mqp_sz;
mqp->free = my_pkt_free;
} else {
USR_INFO("S: fatal, failed to alloc Server MQP\n\r");
}
return mqp;
}
struct mqtt_packet *mqp_server_alloc(uint8_t msg_type, uint32_t buf_sz)
{
return server_mqp_alloc(msg_type, buf_sz, MAX_FH_LEN);
}
struct mqtt_packet *mqp_server_copy(const struct mqtt_packet *mqp)
{
struct mqtt_packet *cpy = server_mqp_alloc(mqp->msg_type,
mqp->maxlen, 0);
if(NULL != cpy) {
uint8_t *buffer = cpy->buffer;
/* Copy to overwrite everything in 'cpy' from source 'mqp' */
buf_wr_nbytes((uint8_t*)cpy, (uint8_t*)mqp, sizeof(struct mqtt_packet));
cpy->buffer = buffer; /* Restore buffer and copy */
buf_wr_nbytes(cpy->buffer, mqp->buffer, mqp->maxlen);
}
return cpy;
}
int32_t (*util_dbg_prn)(const char *fmt, ...) = NULL;
bool util_prn_aux = false;
static void (*lockin_mutex)(void*) = NULL;
static void (*unlock_mutex)(void*) = NULL;
static void *mutex_hnd = NULL;
void util_mutex_lockin(void)
{
if(lockin_mutex)
lockin_mutex(mutex_hnd);
return;
}
void util_mutex_unlock(void)
{
if(unlock_mutex)
unlock_mutex(mutex_hnd);
return;
}
void util_params_set(int32_t (*dbg_prn)(const char *fmt, ...),
void *mutex,
void (*mutex_lockin)(void*),
void (*mutex_unlock)(void*))
{
util_dbg_prn = dbg_prn;
mutex_hnd = mutex;
lockin_mutex = mutex_lockin;
unlock_mutex = mutex_unlock;
return;
}
}//namespace mbed_mqtt {