struct ast_bridge *bridge_stasis_new(uint32_t capabilities, unsigned int flags, const char *name, const char *id) { void *bridge; bridge = bridge_alloc(sizeof(struct ast_bridge), &bridge_stasis_v_table); bridge = bridge_base_init(bridge, capabilities, flags, "Stasis", name, id); bridge = bridge_register(bridge); return bridge; }
struct ast_bridge *bridge_parking_new(struct parking_lot *bridge_lot) { void *bridge; bridge = bridge_alloc(sizeof(struct ast_bridge_parking), &ast_bridge_parking_v_table); bridge = bridge_base_init(bridge, AST_BRIDGE_CAPABILITY_HOLDING, AST_BRIDGE_FLAG_MERGE_INHIBIT_TO | AST_BRIDGE_FLAG_MERGE_INHIBIT_FROM | AST_BRIDGE_FLAG_SWAP_INHIBIT_FROM, "Parking", bridge_lot->name, NULL); bridge = ast_bridge_parking_init(bridge, bridge_lot); bridge = bridge_register(bridge); return bridge; }
lagopus_result_t ofp_bridgeq_mgr_bridge_register(uint64_t dpid) { lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES; struct ofp_bridge *ofp_bridge = NULL; struct ofp_bridgeq *bridgeq; lagopus_msg_debug(1, "called. (dpid: %"PRIu64")\n", dpid); if (bridgeq_table != NULL) { /* check not exists */ ret = lagopus_hashmap_find(&bridgeq_table, (void *)dpid, (void **)&bridgeq); if (ret == LAGOPUS_RESULT_NOT_FOUND) { /* allocate bridgeq */ if ((bridgeq = (struct ofp_bridgeq *)malloc(sizeof(struct ofp_bridgeq))) == NULL) { ret = LAGOPUS_RESULT_NO_MEMORY; } else if ((ret = ofp_bridge_create(&ofp_bridge, dpid)) != LAGOPUS_RESULT_OK) { lagopus_perror(ret); free(bridgeq); } else { /* init bridgeq */ bridgeq->ofp_bridge = ofp_bridge; bridgeq->refs = 1; bridgeq->lock = NULL; memset(bridgeq->polls, 0, sizeof(bridgeq->polls)); memset(bridgeq->dp_polls, 0, sizeof(bridgeq->dp_polls)); if ((ret = lagopus_mutex_create(&(bridgeq->lock))) != LAGOPUS_RESULT_OK) { /* create lock */ lagopus_perror(ret); ofp_bridgeq_free(bridgeq, true); } else if ((ret = lagopus_qmuxer_poll_create( &(bridgeq->polls[EVENTQ_POLL]), ofp_bridge->eventq, LAGOPUS_QMUXER_POLL_READABLE)) != LAGOPUS_RESULT_OK) { /* create eventq poll */ lagopus_perror(ret); ofp_bridgeq_free(bridgeq, true); } else if ((ret = lagopus_qmuxer_poll_create( &(bridgeq->polls[DATAQ_POLL]), ofp_bridge->dataq, LAGOPUS_QMUXER_POLL_READABLE)) != LAGOPUS_RESULT_OK) { /* create dataq poll */ lagopus_perror(ret); ofp_bridgeq_free(bridgeq, true); #ifdef OFPH_POLL_WRITING } else if ((ret = lagopus_qmuxer_poll_create( &(bridgeq->polls[EVENT_DATAQ_POLL]), ofp_bridge->event_dataq, LAGOPUS_QMUXER_POLL_WRITABLE)) != LAGOPUS_RESULT_OK) { /* create event_dataq poll */ lagopus_perror(ret); ofp_bridgeq_free(bridgeq, true); #endif /* OFPH_POLL_WRITING */ } else if ((ret = lagopus_qmuxer_poll_create( &(bridgeq->dp_polls[EVENT_DATAQ_DP_POLL]), ofp_bridge->event_dataq, LAGOPUS_QMUXER_POLL_READABLE)) != LAGOPUS_RESULT_OK) { /* create dataq poll for DataPlen */ lagopus_perror(ret); ofp_bridgeq_free(bridgeq, true); } else { /* succeeded all create. */ /* register. */ if ((ret = bridge_register(dpid, bridgeq)) != LAGOPUS_RESULT_OK) { lagopus_perror(ret); ofp_bridgeq_free(bridgeq, true); } else { /* update array. */ ret = bridgeq_mgr_map_to_array(); if (ret != LAGOPUS_RESULT_OK) { lagopus_perror(ret); (void) bridge_unregister(dpid, true); } } } } } else if (ret == LAGOPUS_RESULT_OK) { ret = LAGOPUS_RESULT_ALREADY_EXISTS; } } else { ret = LAGOPUS_RESULT_INVALID_OBJECT; lagopus_msg_warning("bridgeq_table is NULL.\n"); } return ret; }