Esempio n. 1
0
lagopus_result_t
check_packet_parse_with_dequeue_expect_error(ofp_handler_proc_t handler_proc,
    const char packet[],
    void **get,
    const struct ofp_error *expected_error) {
  lagopus_result_t res = LAGOPUS_RESULT_ANY_FAILURES;
  struct channel *channel = create_data_channel();
  struct ofp_header xid_header;
  struct ofp_bridge *ofpb = NULL;
  struct pbuf *pbuf;
  struct ofp_error error;
  struct ofp_bridgeq *bridgeq;
  if (get == NULL) {
    return LAGOPUS_RESULT_INVALID_ARGS;
  }
  /* start ofp_handler */
  if (s_start_ofp_handler() == false) {
    goto done;
  }
  /* register ofp_bridge */
  res = ofp_bridgeq_mgr_bridge_register(channel_dpid_get(channel));
  if (res == LAGOPUS_RESULT_OK) {
    res = ofp_bridgeq_mgr_bridge_lookup(channel_dpid_get(channel), &bridgeq);
    if (res == LAGOPUS_RESULT_OK) {
      ofpb = ofp_bridgeq_mgr_bridge_get(bridgeq);
      ofp_bridgeq_mgr_bridgeq_free(bridgeq);
    } else {
      TEST_FAIL_MESSAGE("handler_test_utils.c: "
                        "ofp_bridgeq_mgr_bridge_get error.");
    }
  } else {
    lagopus_perror(res);
    TEST_FAIL_MESSAGE("handler_test_utils.c: register error.");
    goto done;
  }
  /* create packet */
  create_packet(packet, &pbuf);
  /* parse header */
  if (ofp_header_decode_sneak_test(pbuf, &xid_header) != LAGOPUS_RESULT_OK) {
    TEST_FAIL_MESSAGE("handler_test_utils.c: cannot decode header\n");
    return LAGOPUS_RESULT_OFP_ERROR;
  }
  /* call func & check */
  res = (handler_proc)(channel, pbuf, &xid_header, &error);
  if (res == LAGOPUS_RESULT_OK) {
    res = lagopus_bbq_get(&ofpb->event_dataq, get, void *, TIMEOUT);
    TEST_ASSERT_EQUAL_MESSAGE(LAGOPUS_RESULT_OK, res,
                              "handler_test_utils.c: lagopus_bbq_get error.");
  } else if (res == LAGOPUS_RESULT_OFP_ERROR) {
Esempio n. 2
0
void
test_ofp_bridgeq_mgr_bridge_register_orver_length(void) {
  lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES;
  int data_num = MAX_BRIDGES;
  struct {
    uint64_t dpid;
    char name[20];
  } bridges[MAX_BRIDGES + 1];
  datastore_bridge_info_t info = {0};
  datastore_bridge_queue_info_t q_info =
      {1000LL, 1000LL, 1000LL, 1000LL, 1000LL, 1000LL};
  int i;

  /* create data. */
  for (i = 0; i < data_num + 1; i++) {
    bridges[i].dpid = (uint64_t) (i + 1);
    snprintf(bridges[i].name, sizeof(bridges[i].name), "test_bridge%d", i);
  }

  /* register bridge. */
  for (i = 0; i < data_num; i++) {
    ret = ofp_bridgeq_mgr_bridge_register(bridges[i].dpid,
                                          bridges[i].name,
                                          &info,
                                          &q_info);
    TEST_ASSERT_EQUAL_MESSAGE(LAGOPUS_RESULT_OK, ret,
                              "ofp_bridgeq_mgr_bridge_registererror.");
  }

  ret = ofp_bridgeq_mgr_bridge_register(bridges[data_num].dpid,
                                        bridges[data_num].name,
                                        &info,
                                        &q_info);
  TEST_ASSERT_EQUAL_MESSAGE(LAGOPUS_RESULT_ITERATION_HALTED, ret,
                            "ofp_bridgeq_mgr_bridge_register(orver length) error.");
}
struct channel *
create_data_channel(void) {
  static uint8_t cnt;
  char buf[256];
  struct channel *channel;
  lagopus_session_t session;
  struct addrunion addr;
  uint64_t dpid = 0xabc;

  if (s_is_init == false) {
    s_is_init = true;

    /* init dataplane. */
    TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, dp_api_init());

    /* interface. */
    s_interface_info.type = DATASTORE_INTERFACE_TYPE_ETHERNET_RAWSOCK;
    s_interface_info.eth_rawsock.port_number = 0;
    s_interface_info.eth_dpdk_phy.device = strdup("eth0");
    if (s_interface_info.eth_dpdk_phy.device == NULL) {
      TEST_FAIL_MESSAGE("device is NULL.");
    }
    TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK,
                      dp_interface_create(interface_name));
    dp_interface_info_set(interface_name, &s_interface_info);

    /* port. */
    TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK,
                      dp_port_create(port_name));
    TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK,
                      dp_port_interface_set(port_name, interface_name));

    /* bridge. */
    ofp_bridgeq_mgr_initialize(NULL);
    s_bridge_info.dpid = dpid;
    s_bridge_info.fail_mode = DATASTORE_BRIDGE_FAIL_MODE_SECURE;
    s_bridge_info.max_buffered_packets = UINT32_MAX;
    s_bridge_info.max_ports = UINT16_MAX;
    s_bridge_info.max_tables = UINT8_MAX;
    s_bridge_info.max_flows = UINT32_MAX;
    s_bridge_info.capabilities = UINT64_MAX;
    s_bridge_info.action_types = UINT64_MAX;
    s_bridge_info.instruction_types = UINT64_MAX;
    s_bridge_info.reserved_port_types = UINT64_MAX;
    s_bridge_info.group_types = UINT64_MAX;
    s_bridge_info.group_capabilities = UINT64_MAX;
    TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK,
                      dp_bridge_create(bridge_name, &s_bridge_info));
    TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK,
                      dp_bridge_port_set(bridge_name, port_name, 0));
    TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK,
                      ofp_bridgeq_mgr_bridge_register(
                          dpid,
                          bridge_name,
                          &s_bridge_info,
                          &s_queue_info));
    channel_mgr_initialize();
  }

  snprintf(buf, sizeof(buf), "127.0.0.%u", cnt++);//XXX
  addrunion_ipv4_set(&addr, buf);
  channel_mgr_channel_add(bridge_name, dpid, &addr);
  channel_mgr_channel_lookup(bridge_name, &addr, &channel);


  session = channel_session_get(channel);
  session_write_set(session, s_write_tcp);
  session_sockfd_set(session, 3);

  channel_version_set(channel, 0x04);
  channel_xid_set(channel, s_xid);

  return channel;
}
Esempio n. 4
0
void
test_ofp_bridgeq_mgr_bridge(void) {
  lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES;
  uint64_t dpid = 0x01;
  const char *bridge_name = "test_bridge01";
  char *test_bridge_name = NULL;
  struct ofp_bridgeq *bridgeq = NULL;
  lagopus_qmuxer_poll_t poll = NULL;
  datastore_bridge_info_t info =
      {1LL, 2LL, 3LL, 4LL, 5LL,
       6LL, 7LL, 8LL, 9LL, 10LL,
       11LL, 12LL};
  datastore_bridge_info_t test_info;
  datastore_bridge_queue_info_t q_info =
      {1000LL, 1000LL, 1000LL, 1000LL, 1000LL, 1000LL};

  /* register bridge. */
  ret = ofp_bridgeq_mgr_bridge_register(dpid, bridge_name, &info, &q_info);
  TEST_ASSERT_EQUAL_MESSAGE(LAGOPUS_RESULT_OK, ret,
                            "ofp_bridgeq_mgr_bridge_register error.");

  /* register same bridge. */
  ret = ofp_bridgeq_mgr_bridge_register(dpid, bridge_name, &info, &q_info);
  TEST_ASSERT_EQUAL_MESSAGE(LAGOPUS_RESULT_ALREADY_EXISTS, ret,
                            "ofp_bridgeq_mgr_bridge_register(same bridge) error.");

  /* lookup. */
  ret = ofp_bridgeq_mgr_bridge_lookup(dpid, &bridgeq);
  TEST_ASSERT_EQUAL_MESSAGE(LAGOPUS_RESULT_OK, ret,
                            "ofp_bridgeq_mgr_bridge_lookup error.");
  TEST_ASSERT_NOT_EQUAL_MESSAGE(NULL, bridgeq,
                                "bridgeq error.");

  /* get bridge name. */
  ret = ofp_bridgeq_mgr_name_get(dpid, &test_bridge_name);
  TEST_ASSERT_EQUAL_MESSAGE(LAGOPUS_RESULT_OK, ret,
                            "ofp_bridgeq_mgr_name_get error.");
  TEST_ASSERT_EQUAL_MESSAGE(0, strcmp(bridge_name, test_bridge_name),
                            "bad bridge name.");
  free(test_bridge_name);
  test_bridge_name = NULL;

  /* get bridge name (not found). */
  ret = ofp_bridgeq_mgr_name_get(0x999, &test_bridge_name);
  TEST_ASSERT_EQUAL_MESSAGE(LAGOPUS_RESULT_NOT_FOUND, ret,
                            "ofp_bridgeq_mgr_name_get error.");
  TEST_ASSERT_EQUAL_MESSAGE(NULL, test_bridge_name,
                            "bad bridge name.");

  /* get bridge info. */
  ret = ofp_bridgeq_mgr_info_get(dpid, &test_info);
  TEST_ASSERT_EQUAL_MESSAGE(LAGOPUS_RESULT_OK, ret,
                            "ofp_bridgeq_mgr_info_get error.");
  TEST_ASSERT_EQUAL_MESSAGE(1, ((info.dpid == test_info.dpid) &&
                                (info.fail_mode == test_info.fail_mode) &&
                                (info.max_buffered_packets ==
                                 test_info.max_buffered_packets) &&
                                (info.max_ports == test_info.max_ports) &&
                                (info.max_tables == test_info.max_tables) &&
                                (info.max_flows == test_info.max_flows) &&
                                (info.capabilities == test_info.capabilities) &&
                                (info.action_types == test_info.action_types) &&
                                (info.instruction_types ==
                                 test_info.instruction_types) &&
                                (info.reserved_port_types ==
                                 test_info.reserved_port_types) &&
                                (info.group_types == test_info.group_types) &&
                                (info.group_capabilities ==
                                 test_info.group_capabilities)),
                            "bad bridge info.");

  /* get bridge info (not found). */
  ret = ofp_bridgeq_mgr_info_get(0x999, &test_info);
  TEST_ASSERT_EQUAL_MESSAGE(LAGOPUS_RESULT_NOT_FOUND, ret,
                            "ofp_bridgeq_mgr_info_get error.");

  /* check getter. */
  poll = NULL;
  poll = ofp_bridgeq_mgr_eventq_poll_get(bridgeq);
  TEST_ASSERT_NOT_EQUAL_MESSAGE(NULL, poll,
                                "ofp_bridgeq_mgr_eventq_poll_get error.");
  poll = NULL;
  poll = ofp_bridgeq_mgr_dataq_poll_get(bridgeq);
  TEST_ASSERT_NOT_EQUAL_MESSAGE(NULL, poll,
                                "ofp_bridgeq_mgr_dataq_poll_get error.");

  /* decrement refs. */
  ofp_bridgeq_mgr_bridgeq_free(bridgeq);

  /* unregister bridge. */
  ret = ofp_bridgeq_mgr_bridge_unregister(dpid);
  TEST_ASSERT_EQUAL_MESSAGE(LAGOPUS_RESULT_OK, ret,
                            "ofp_bridgeq_mgr_bridge_unregister error.");

  /* lookup. */
  bridgeq = NULL;
  ret = ofp_bridgeq_mgr_bridge_lookup(dpid, &bridgeq);
  TEST_ASSERT_EQUAL_MESSAGE(LAGOPUS_RESULT_NOT_FOUND, ret,
                            "ofp_bridgeq_mgr_bridge_lookup error.");
}
Esempio n. 5
0
void
test_ofp_bridgeq_mgr_bridgeqs_to_array_unregister(void) {
  lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES;
  uint64_t i, j, delete_target = 1;
  uint64_t data_num = MAX_LENGTH;
  struct {
    uint64_t dpid;
    const char *name;
    bool b;
  } bridges[MAX_LENGTH] = {
    {0x01, "test_bridge01", false},
    {0x02, "test_bridge02", false},
    {0x03, "test_bridge02", false}
  };
  struct ofp_bridgeq *bridgeqs[MAX_BRIDGES];
  struct ofp_bridge *bridge;
  uint64_t poll_count = 0;
  uint64_t bridgeq_count = 0;
  lagopus_qmuxer_poll_t *polls =
    (lagopus_qmuxer_poll_t *) calloc(MAX_LENGTH * MAX_BRIDGE_POLLS,
                                     sizeof(lagopus_qmuxer_poll_t));
  lagopus_qmuxer_poll_t *dp_polls =
    (lagopus_qmuxer_poll_t *) calloc(MAX_LENGTH * MAX_BRIDGE_DP_POLLS,
                                     sizeof(lagopus_qmuxer_poll_t));
  datastore_bridge_info_t info = {0};
  datastore_bridge_queue_info_t q_info =
      {1000LL, 1000LL, 1000LL, 1000LL, 1000LL, 1000LL};

  /* register bridge. */
  for (i = 0; i < data_num; i++) {
    ret = ofp_bridgeq_mgr_bridge_register(bridges[i].dpid,
                                          bridges[i].name,
                                          &info,
                                          &q_info);
    TEST_ASSERT_EQUAL_MESSAGE(LAGOPUS_RESULT_OK, ret,
                              "ofp_bridgeq_mgr_bridge_register error.");
  }

  ret = ofp_bridgeq_mgr_bridgeqs_to_array(bridgeqs, &bridgeq_count, MAX_LENGTH);

  /* delete entry. */
  bridge = ofp_bridgeq_mgr_bridge_get(bridgeqs[delete_target]);
  ofp_bridgeq_mgr_bridge_unregister(bridge->dpid);

  TEST_ASSERT_EQUAL_MESSAGE(LAGOPUS_RESULT_OK, ret,
                            "ofp_bridgeq_mgr_bridgeqs_to_array(normal) error.");
  TEST_ASSERT_EQUAL_MESSAGE(MAX_LENGTH, bridgeq_count,
                            "index error.");

  for (i = 0; i < data_num; i++) {
    for (j = 0; j < data_num; j++) {
      bridge = ofp_bridgeq_mgr_bridge_get(bridgeqs[i]);
      if (bridge->dpid == bridges[j].dpid) {
        /* check duplicate. */
        if (bridges[j].b == false) {
          bridges[j].b = true;
        } else {
          TEST_FAIL_MESSAGE("duplicate error.");
        }
      }
    }
  }
  /* check dpid. */
  for (i = 0; i < data_num; i++) {
    TEST_ASSERT_EQUAL_MESSAGE(true, bridges[i].b,
                              "dpid error.");
  }

  /* test ofp_bridgeq_mgr_polls_get() */
  poll_count = 0;
  ret = ofp_bridgeq_mgr_polls_get(polls, bridgeqs,
                                  &poll_count, data_num);
  TEST_ASSERT_EQUAL_MESSAGE(LAGOPUS_RESULT_OK, ret,
                            "ofp_bridgeq_mgr_polls_get(normal) error.");
  TEST_ASSERT_EQUAL_MESSAGE(data_num * MAX_BRIDGE_POLLS, poll_count,
                            "poll_count error.");
  for (i = 0; i < data_num * MAX_BRIDGE_POLLS; i++) {
    TEST_ASSERT_NOT_EQUAL_MESSAGE(NULL,
                                  polls[i],
                                  "polls error.");
  }

  /* test ofp_bridgeq_mgr_dp_polls_get() */
  poll_count = 0;
  ret = ofp_bridgeq_mgr_dp_polls_get(dp_polls, bridgeqs,
                                     &poll_count, data_num);
  TEST_ASSERT_EQUAL_MESSAGE(LAGOPUS_RESULT_OK, ret,
                            "ofp_bridgeq_mgr_dp_polls_get(normal) error.");
  TEST_ASSERT_EQUAL_MESSAGE(data_num * MAX_BRIDGE_DP_POLLS, poll_count,
                            "poll_count(DP) error.");
  for (i = 0; i < data_num * MAX_BRIDGE_DP_POLLS; i++) {
    TEST_ASSERT_NOT_EQUAL_MESSAGE(NULL,
                                  dp_polls[i],
                                  "polls error.");
  }

  /* test ofp_bridgeq_mgr_bridgeqs_free. */
  /* Call func.*/
  ofp_bridgeq_mgr_bridgeqs_free(bridgeqs, bridgeq_count);

  free(polls);
  free(dp_polls);
}