Beispiel #1
0
lagopus_result_t
ofp_role_channel_update(struct channel *channel,
                        struct ofp_role_request *role_request,
                        uint64_t dpid) {
  lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES;
  uint32_t current_role;

  if (channel != NULL && role_request != NULL) {
    current_role = channel_role_get(channel);
    /* Not change. */
    if (role_request->role == current_role ||
        role_request->role == OFPCR_ROLE_NOCHANGE) {
      lagopus_msg_debug(1, "Role not change (%u).\n",
                        role_request->role);
      role_request->role = current_role;
      ret = LAGOPUS_RESULT_OK;
    } else {
      if (current_role == OFPCR_ROLE_MASTER) {
        /* every other master controller to slave. */
        channel_mgr_dpid_iterate(dpid, change_master2slave, NULL);
      }
      channel_role_set(channel, role_request->role);
      ret = LAGOPUS_RESULT_OK;
    }
  } else {
    ret = LAGOPUS_RESULT_INVALID_ARGS;
  }

  return ret;
}
Beispiel #2
0
lagopus_result_t
ofp_role_channel_write(struct pbuf *pbuf, uint64_t dpid,
                       uint8_t type, uint8_t reason) {
  lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES;

  if (pbuf != NULL) {
    struct role_write_vars v;

    v.type = type;
    v.reason = reason;
    v.pbuf = pbuf;
    v.ret = LAGOPUS_RESULT_ANY_FAILURES;

    channel_mgr_dpid_iterate(dpid, ofp_role_write, (void *) &v);

    ret = v.ret;
  } else {
    ret = LAGOPUS_RESULT_INVALID_ARGS;
  }

  if (ret == LAGOPUS_RESULT_OK && pbuf != NULL) {
    /* move getp to putp. */
    pbuf_getp_set(pbuf, pbuf_putp_get(pbuf));
  }

  return ret;
}
Beispiel #3
0
lagopus_result_t
channel_mgr_channel_lookup_by_channel_id(uint64_t dpid,
    uint64_t channel_id, struct channel **chan) {
  lagopus_result_t ret;
  struct channel_id_vars v;

  v.channel_id = channel_id;
  v.channel = NULL;

  channel_mgr_dpid_iterate(dpid, channel_id_eq, &v);
  if (v.channel == NULL) {
    ret = LAGOPUS_RESULT_NOT_FOUND;
  } else {
    ret = LAGOPUS_RESULT_OK;
  }
  *chan = v.channel;

  return ret;
}
Beispiel #4
0
lagopus_result_t
ofp_role_channel_write(struct pbuf *pbuf, uint64_t dpid,
                       uint8_t type, uint8_t reason) {
  lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES;

  if (pbuf != NULL) {
    struct role_write_vars v;

    v.type = type;
    v.reason = reason;
    v.pbuf = pbuf;
    v.ret = LAGOPUS_RESULT_ANY_FAILURES;

    ret = channel_mgr_dpid_iterate(dpid, ofp_role_write, (void *) &v);

    if (ret != LAGOPUS_RESULT_OK) {
      if (ret == LAGOPUS_RESULT_NOT_OPERATIONAL ||
          ret == LAGOPUS_RESULT_NOT_FOUND) {
        lagopus_msg_info("Channel is not alive, drop asynchronous message(%s)\n",
                         ofp_type_str(v.type));
        /* Not send packet. */
        ret = LAGOPUS_RESULT_OK;
      } else {
        ret = v.ret;
      }
    }
  } else {
    ret = LAGOPUS_RESULT_INVALID_ARGS;
  }

  if (ret == LAGOPUS_RESULT_OK && pbuf != NULL) {
    /* move getp to putp. */
    pbuf_getp_set(pbuf, pbuf_putp_get(pbuf));
  }

  return ret;
}
Beispiel #5
0
void
test_channel_tcp(void) {
  int sock4, sock6;
  socklen_t size;
  struct sockaddr_in sin;
  lagopus_ip_address_t *addr4 = NULL;
  lagopus_ip_address_t *addr6 = NULL;
  struct channel_list  *chan_list ;
  struct channel *chan4, *chan6, *chan = NULL;
  lagopus_result_t ret;
  int cnt;

  printf("test_channel_tcp in\n");
  channel_mgr_initialize();
  ret = channel_mgr_channels_lookup_by_dpid(dpid, &chan_list );
  TEST_ASSERT_EQUAL(LAGOPUS_RESULT_NOT_FOUND, ret);
  TEST_ASSERT_EQUAL(NULL, chan_list );

  ret = lagopus_ip_address_create("127.0.0.1", true, &addr4);
  TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret);
  ret = lagopus_ip_address_create("::1", false, &addr6);
  TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret);

  ret = channel_mgr_channel_add(bridge_name, dpid, addr4);
  TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret);
  ret = channel_mgr_channel_add(bridge_name, dpid, addr6);
  TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret);

  ret = channel_mgr_channel_add(bridge_name, dpid, addr4);
  TEST_ASSERT_EQUAL(LAGOPUS_RESULT_ALREADY_EXISTS, ret);
  ret = channel_mgr_channel_lookup(bridge_name, addr4, &chan4);
  TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret);
  TEST_ASSERT_EQUAL(0, channel_id_get(chan4));
  ret = channel_port_set(chan4, 10022);
  TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret);
  ret = channel_local_port_set(chan4, 20022);
  TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret);
  ret = channel_local_addr_set(chan4, addr4);
  TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret);

  ret = channel_mgr_channel_add(bridge_name, dpid, addr6);
  TEST_ASSERT_EQUAL(LAGOPUS_RESULT_ALREADY_EXISTS, ret);
  ret = channel_mgr_channel_lookup(bridge_name, addr6, &chan6);
  TEST_ASSERT_EQUAL(1, channel_id_get(chan6));
  TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret);
  ret = channel_port_set(chan6, 10023);
  TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret);
  ret = channel_local_port_set(chan6, 20023);
  TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret);
  ret = channel_local_addr_set(chan6, addr6);
  TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret);
  ret = channel_mgr_channel_lookup_by_channel_id(dpid, 1, &chan);
  TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret);
  TEST_ASSERT_NOT_EQUAL(NULL, chan);

  ret = channel_mgr_channel_lookup_by_channel_id(dpid, 9999, &chan);
  TEST_ASSERT_EQUAL(LAGOPUS_RESULT_NOT_FOUND, ret);
  TEST_ASSERT_EQUAL(NULL, chan);

  cnt = 0;
  ret = channel_mgr_channels_lookup_by_dpid(dpid, &chan_list );
  TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret);
  ret = channel_list_iterate(chan_list , channel_count, &cnt);
  TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret);
  TEST_ASSERT_EQUAL(2, cnt);

  cnt = 0;
  ret = channel_mgr_dpid_iterate(dpid, channel_count, &cnt);
  TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret);
  TEST_ASSERT_EQUAL(2, cnt);

  run = true;
  size = sizeof(sin);
  printf("accept in\n");
  sock4 = accept(s4, (struct sockaddr *)&sin, &size);
  TEST_ASSERT_NOT_EQUAL(-1, sock4);

  sock6 = accept(s6, (struct sockaddr *)&sin, &size);
  TEST_ASSERT_NOT_EQUAL(-1, sock6);


  ret = channel_mgr_channel_lookup(bridge_name, addr4, &chan4);
  TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret);

  channel_refs_get(chan4);

  ret = channel_mgr_channel_delete(bridge_name, addr4);
  TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret);

  channel_refs_put(chan4);
  ret = channel_mgr_channel_delete(bridge_name, addr4);

  TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret);

  ret = channel_mgr_channel_lookup(bridge_name, addr4, &chan4);
  TEST_ASSERT_EQUAL(LAGOPUS_RESULT_NOT_FOUND, ret);

  ret = channel_mgr_channel_delete(bridge_name, addr6);
  TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret);
  ret = channel_mgr_channel_lookup(bridge_name, addr6, &chan6);
  TEST_ASSERT_EQUAL(LAGOPUS_RESULT_NOT_FOUND, ret);

  TEST_ASSERT_FALSE(channel_mgr_has_alive_channel_by_dpid(dpid));

  ret = channel_mgr_event_upcall();
  TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret);

  lagopus_ip_address_destroy(addr4);
  lagopus_ip_address_destroy(addr6);
  close(sock4);
  close(sock6);
}