/*---------------------------------------------------------------------*/ 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(); }
/*---------------------------------------------------------------------*/ 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; }
/*---------------------------------------------------------------------*/ 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; }
/*---------------------------------------------------------------------*/ char * filter_getid() { TRACE_BRICK_FUNC_START(); static char *name = "Filter"; return name; TRACE_BRICK_FUNC_END(); }
/*---------------------------------------------------------------------*/ char * dup_getid() { TRACE_BRICK_FUNC_START(); static char *name = "Duplicator"; return name; TRACE_BRICK_FUNC_END(); }
/*---------------------------------------------------------------------*/ char * merge_getid() { TRACE_BRICK_FUNC_START(); static char *name = "Merge"; return name; TRACE_BRICK_FUNC_END(); }
/*---------------------------------------------------------------------*/ 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; }
/*---------------------------------------------------------------------*/ 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(); }
/*---------------------------------------------------------------------*/ 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); }
/** * 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; }
/*---------------------------------------------------------------------*/ 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; }
/** * 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(); }