Example #1
0
/*---------------------------------------------------------------------*/
void
dup_link(struct Brick *brick, Linker_Intf *linker)
{
	TRACE_BRICK_FUNC_START();
	int i, j, rc;
	engine *eng;
	linkdata *dupdata;
	int div_type = (linker->type == LINKER_DUP) ? COPY : SHARE;
	
	dupdata = (linkdata *)brick->private_data;
	eng = engine_find(brick->eng->name);
	/* sanity engine check */
	if (eng == NULL) {
		TRACE_LOG("Can't find engine with name: %s\n",
			  brick->eng->name);
		TRACE_BRICK_FUNC_END();
		return;
	}
	
	/* if engine is already running, then don't connect bricks */
	if (eng->run == 1) {
		TRACE_LOG("Can't open channel"
			  "engine %s is already running\n",
			  eng->name);
		TRACE_BRICK_FUNC_END();
		return;	      
	}

	if (eng->FIRST_BRICK(esrc)->brick == NULL) {
		strcpy(dupdata->ifname, (char *)linker->input_link[0]);
		dupdata->count = linker->output_count;
		eng->FIRST_BRICK(esrc)->brick = brick;
		eng->mark_for_copy = 1;
		dupdata->external_links = calloc(dupdata->count,
						 sizeof(void *));
		if (dupdata->external_links == NULL) {
			TRACE_LOG("Can't allocate external link contexts "
				  "for duplicator\n");
			TRACE_BRICK_FUNC_END();
			return;
		}
	}

	for (j = 0; j < linker->input_count; j++) { 
		for (i = 0; i < linker->output_count; i++) {
			rc = eng->iom.create_external_link((char *)linker->input_link[j],
							   (char *)linker->output_link[i],
							   div_type, eng->FIRST_BRICK(esrc));
			if (rc == -1) {
				TRACE_LOG("Failed to open channel %s\n",
					  linker->output_link[i]);
				TRACE_BRICK_FUNC_END();
				return;
			}
		}
	}

	TRACE_BRICK_FUNC_END();
}
Example #2
0
/*---------------------------------------------------------------------*/
char *
filter_getid()
{
	TRACE_BRICK_FUNC_START();
	static char *name = "Filter";
	return name;
	TRACE_BRICK_FUNC_END();
}
Example #3
0
/*---------------------------------------------------------------------*/
char *
dup_getid()
{
	TRACE_BRICK_FUNC_START();
	static char *name = "Duplicator";
	return name;
	TRACE_BRICK_FUNC_END();
}
Example #4
0
/*---------------------------------------------------------------------*/
char *
merge_getid()
{
	TRACE_BRICK_FUNC_START();
	static char *name = "Merge";
	return name;
	TRACE_BRICK_FUNC_END();
}
Example #5
0
/*---------------------------------------------------------------------*/
int32_t
merge_init(Brick *brick, Linker_Intf *li)
{
	TRACE_BRICK_FUNC_START();
	brick->private_data = NULL;
	li->type = SHARE;
	TRACE_LOG("Adding brick merge to the engine\n");
	TRACE_BRICK_FUNC_END();
	return 1;
}
Example #6
0
/*---------------------------------------------------------------------*/
void
filter_deinit(Brick *brick)
{
	TRACE_BRICK_FUNC_START();
	if (brick->private_data != NULL) {
		free(brick->private_data);
		brick->private_data = NULL;
	}
	free(brick);
	TRACE_BRICK_FUNC_END();
}
Example #7
0
/*---------------------------------------------------------------------*/
BITMAP
merge_process(Brick *brick, unsigned char *buf)
{
	TRACE_BRICK_FUNC_START();
	BITMAP b;

	/* straight in... and straight out */
	INIT_BITMAP(b);
	SET_BIT(b, 0);
	TRACE_BRICK_FUNC_END();
	return b;
	UNUSED(brick);
	UNUSED(buf);
}
Example #8
0
/*---------------------------------------------------------------------*/
int32_t
filter_init(Brick *brick, Linker_Intf *li)
{
	TRACE_BRICK_FUNC_START();
	brick->private_data = calloc(1, sizeof(FilterContext));
	if (brick->private_data == NULL) {
		TRACE_LOG("Can't create private context "
			  "for filter\n");
		TRACE_BRICK_FUNC_END();
		return -1;
	}
	li->type = SHARE;
	TRACE_BRICK_FUNC_END();
	return 1;
}
Example #9
0
/*---------------------------------------------------------------------*/
int32_t
dup_init(Brick *brick, Linker_Intf *li)
{
	TRACE_BRICK_FUNC_START();
	brick->private_data = calloc(1, sizeof(linkdata));
	if (brick->private_data == NULL) {
		TRACE_LOG("Can't create private context "
			  "for duplicator\n");
		TRACE_BRICK_FUNC_END();
		return -1;
	}
	li->type = COPY;
	TRACE_BRICK_FUNC_END();
	return 1;
}
Example #10
0
/**
 * XXX - Under construction. This function only forwards packets
 * based on packet header data for the time being...
 */
static BITMAP
filter_dummy(Brick *brick, unsigned char *buf)
{
	TRACE_BRICK_FUNC_START();
	linkdata *lnd = (linkdata *)(&brick->lnd);
	BITMAP b;

	INIT_BITMAP(b);
	uint key = pkt_hdr_hash(buf, 4, lnd->level) 
		% lnd->count;
	SET_BIT(b, key);
	
	TRACE_BRICK_FUNC_END();

	return b;
}
Example #11
0
/*---------------------------------------------------------------------*/
BITMAP
dup_process(Brick *brick, unsigned char *buf)
{
	TRACE_BRICK_FUNC_START();
	linkdata *lnd = brick->private_data;
	BITMAP b;
	int i;

	INIT_BITMAP(b);
	for (i = 0; i < lnd->count; i++) {
		SET_BIT(b, i);
	}
	
	TRACE_BRICK_FUNC_END();
	UNUSED(buf);
	return b;
}
Example #12
0
/**
 * This brick needs a customized link function since it needs to push
 * packets from multiple ifaces
 */
void
merge_link(struct Brick *from, PktEngine_Intf *pe, Linker_Intf *linker)
{
	TRACE_BRICK_FUNC_START();
	int i, j, k, rc;
	engine *eng;
	linkdata *lbd;
	int div_type = (linker->type == LINKER_DUP) ? COPY : SHARE;
	
	lbd = (linkdata *)(&from->lnd);
	eng = engine_find(from->eng->name);
	/* sanity engine check */
	if (eng == NULL) {
		TRACE_LOG("Can't find engine with name: %s\n",
			  from->eng->name);
		TRACE_BRICK_FUNC_END();
		return;
	}
	/* if engine is already running, then don't connect bricks */
	if (eng->run == 1) {
		TRACE_LOG("Can't open channel"
			  "engine %s is already running\n",
			  eng->name);
		TRACE_BRICK_FUNC_END();
		return;	      
	}

	if (eng->esrc == NULL) {
		strcpy(lbd->ifname, (char *)linker->input_link[0]);
		lbd->count = linker->output_count;
		for (i = 0; i < linker->input_count; i++) {
			/* link the source(s) with the packet engine */
			pktengine_link_iface((uint8_t *)eng->name, 
					     (uint8_t *)linker->input_link[i], 
					     pe->batch, pe->qid);
			TRACE_LOG("Linking %s with link %s with batch size: %d and qid: %d\n",
				  eng->name, linker->input_link[i], pe->batch, pe->qid);
		}
		for (k = 0; k < (int)eng->no_of_sources; k++)
			eng->esrc[k]->brick = from;
		lbd->external_links = calloc(lbd->count,
						sizeof(void *));
		if (lbd->external_links == NULL) {
			TRACE_LOG("Can't allocate external link contexts "
				  "for load balancer\n");
			TRACE_BRICK_FUNC_END();
			return;
		}
	}

	for (j = 0; j < linker->input_count; j++) {
		for (i = 0; i < linker->output_count; i++) {
			rc = eng->iom.create_external_link((char *)linker->input_link[0],
							   (char *)linker->output_link[i],
							   div_type, eng->esrc[j]);
			if (rc == -1) {
				TRACE_LOG("Failed to open channel %s\n",
					  linker->output_link[i]);
				TRACE_BRICK_FUNC_END();
				return;
			}
		}
	}      
	TRACE_BRICK_FUNC_END();
}