Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
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;
}