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 {