void *m_ext_get(struct vmm_mbuf *m, u32 size, enum vmm_mbuf_alloc_types how) { void *buf; u32 slab; struct mempool *mp = NULL; if (VMM_MBUF_ALLOC_DMA == how) { buf = vmm_dma_malloc(size); if (!buf) { return NULL; } m->m_flags |= M_EXT_DMA; MEXTADD(m, buf, size, ext_dma_free, NULL); } else { for (slab = 0; slab < EPOOL_SLAB_COUNT; slab++) { if (size <= epool_slab_buf_size(slab)) { mp = mbpctrl.epool_slabs[slab]; break; } } if (mp && (buf = mempool_malloc(mp))) { m->m_flags |= M_EXT_POOL; MEXTADD(m, buf, size, ext_pool_free, mp); } else if ((buf = vmm_malloc(size))) { m->m_flags |= M_EXT_HEAP; MEXTADD(m, buf, size, ext_heap_free, NULL); } else { return NULL; } } return m->m_extbuf; }
static int plugin_deal(const struct data_transit *dtts, const int thread_num) { if(!dtts){ return YT_FAILED; } struct webqq_record *webqq_rec = NULL; webqq_rec = (struct webqq_record*)((dtts->deal_record)->record); //连接关闭或超时存储 if(dtts->session_status == SESSION_STATUS_CLOSE || dtts->session_status == SESSION_STATUS_TIMEOUT){ //超时了或关闭连接了,服务端响应还没来也不管了 plugin_done(webqq_rec); (dtts->deal_record)->record = NULL; (dtts->deal_record)->record_destory_flag = RECORD_CAN_DESTORY; return YT_SUCCESSFUL; } //判断是否是该插件的数据包 if(webqq_rec) { if (webqq_rec->plugin_ds.plugin_type != PLUGIN_TYPE_IM_WEBQQ) { return YT_FAILED; } } else { webqq_rec = (struct webqq_record*)mempool_malloc(sizeof(struct webqq_record)); if(!webqq_rec){ log_write(LOG_ERROR, "webqq_rec malloc() error\n"); return YT_FAILED; } webqq_rec->plugin_ds.plugin_type = PLUGIN_TYPE_IM_WEBQQ; (dtts->deal_record)->record = webqq_rec; } //webqq客户端数据 if((dtts->pkt_info).client_or_server == FROM_CLIENT_DATA){ if(plugin_deal_client(dtts, webqq_rec, thread_num) == YT_FAILED) { return YT_FAILED; } return YT_SUCCESSFUL; } //webqq服务器端数据 if((dtts->pkt_info).client_or_server == FROM_SERVER_DATA){ if(plugin_deal_server(dtts, webqq_rec, thread_num) == YT_FAILED) { return YT_FAILED; } return YT_SUCCESSFUL; } return YT_FAILED; }
/* mempool_calloc(void * memory, size_t nmemb, size_t size) {{{ */ void * mempool_calloc(void * memory, size_t nmemb, size_t size) { void * mem; mem = mempool_malloc(memory, nmemb * size); if (mem != NULL) { memset(mem, 0, nmemb * size); } return mem; }
void *mempool_zalloc(struct mempool *mp) { void *ret = mempool_malloc(mp); if (mp && ret) { memset(ret, 0, mp->entity_size); } return ret; }
/* mempool_strndup(void * memory, uchar * key, size_t len) {{{ */ uchar * mempool_strndup(void * memory, uchar * key, size_t len) { uchar * mem; mem = mempool_malloc(memory, len + 1); if (mem == NULL) { return NULL; } memcpy(mem, key, len); *(mem+len) = '\0'; return mem; }
static int plugin_deal(const struct data_transit *dtts, const int thread_num) { if(!dtts){ return YT_FAILED; } struct bilin_record *bilin_rec = NULL; bilin_rec = (struct bilin_record*)((dtts->deal_record)->record); //连接关闭或超时存储 if(dtts->session_status == SESSION_STATUS_CLOSE || dtts->session_status == SESSION_STATUS_TIMEOUT){ //超时了或关闭连接了,服务端响应还没来也不管了 plugin_done(bilin_rec); (dtts->deal_record)->record = NULL; (dtts->deal_record)->record_destory_flag = RECORD_CAN_DESTORY; return YT_SUCCESSFUL; } //判断是否是bbs处理后的后续杂包 if(bilin_rec && bilin_rec->plugin_ds.plugin_type == PLUGIN_TYPE_BBS) { return YT_FAILED; } //bilin客户端数据 if((dtts->pkt_info).client_or_server == FROM_CLIENT_DATA){ plugin_done(bilin_rec); (dtts->deal_record)->record = NULL; bilin_rec = (struct bilin_record*)mempool_malloc(sizeof(struct bilin_record)); if(!bilin_rec){ log_write(LOG_ERROR, "bilin_rec malloc() error\n"); return YT_FAILED; } (dtts->deal_record)->record = bilin_rec; if(plugin_deal_client(dtts, bilin_rec, thread_num) == YT_FAILED) { return YT_FAILED; } return YT_SUCCESSFUL; } return YT_FAILED; }
void *m_ext_get(struct vmm_mbuf *m, u32 size, int how) { void *buf; u32 slab; struct mempool *mp; mp = NULL; for (slab = 0; slab < EPOOL_SLAB_COUNT; slab++) { if (size <= epool_slab_buf_size(slab)) { mp = mbpctrl.epool_slabs[slab]; break; } } if (mp && (buf = mempool_malloc(mp))) { MEXTADD(m, buf, size, ext_pool_free, mp); } else if ((buf = vmm_malloc(size))) { MEXTADD(m, buf, size, NULL, NULL); } return m->m_extbuf; }