/* Add a new bridge. */ lagopus_result_t bridge_add(struct bridge_list *bridge_list, const char *name, uint64_t dpid) { struct bridge *bridge; /* Find bridge. */ bridge = bridge_lookup(bridge_list, name); if (bridge != NULL) { return LAGOPUS_RESULT_ALREADY_EXISTS; } /* Allocate a new bridge. */ bridge = bridge_alloc(name); if (bridge == NULL) { return LAGOPUS_RESULT_NO_MEMORY; } /* If given dpid is zero, generate random dpid value. */ if (dpid == 0) { dpid = bridge_dpid_generate(); } bridge->dpid = dpid; flowdb_wrlock(NULL); TAILQ_INSERT_TAIL(bridge_list, bridge, entry); flowdb_wrunlock(NULL); lagopus_msg_info("Bridge %s dpid:%0" PRIx64 " is added\n", name, dpid); return LAGOPUS_RESULT_OK; }
static void *bridge_clone(struct rtnl_link *link, void *data) { struct bridge_data *bd; if ((bd = bridge_alloc(link))) memcpy(bd, data, sizeof(*bd)); return bd; }
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; }