Example #1
0
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;
}
Example #2
0
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;
}
Example #3
0
/* 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;
}
Example #4
0
void *mempool_zalloc(struct mempool *mp)
{
	void *ret = mempool_malloc(mp);

	if (mp && ret) {
		memset(ret, 0, mp->entity_size);
	}

	return ret;
}
Example #5
0
/* 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;
}
Example #6
0
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;
}
Example #7
0
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;
}