Exemplo n.º 1
0
static lagopus_result_t
ofp_role_generation_id_check_wrap(struct channel **channels,
                                  struct ofp_header *xid_headers) {
  bool rt;
  uint64_t dpid = 0xabc;
  (void) channels;
  (void) xid_headers;

  /* new generation_id. */
  rt = ofp_role_generation_id_check(dpid, OFPCR_ROLE_SLAVE, 0x10);
  TEST_ASSERT_EQUAL_MESSAGE(true, rt,
                            "ofp_role_generation_id_check error.");

  /* same generation_id. */
  rt = ofp_role_generation_id_check(dpid, OFPCR_ROLE_SLAVE, 0x10);
  TEST_ASSERT_EQUAL_MESSAGE(true, rt,
                            "ofp_role_generation_id_check error.");

  /* small generation_id. */
  rt = ofp_role_generation_id_check(dpid, OFPCR_ROLE_SLAVE, 0x0f);
  TEST_ASSERT_EQUAL_MESSAGE(false, rt,
                            "ofp_role_generation_id_check error.");

  /* role is OFPCR_ROLE_EQUAL (small generation_id). */
  rt = ofp_role_generation_id_check(dpid, OFPCR_ROLE_EQUAL, 0x0f);
  TEST_ASSERT_EQUAL_MESSAGE(true, rt,
                            "ofp_role_generation_id_check error.");

  /* same small generation_id. */
  rt = ofp_role_generation_id_check(dpid, OFPCR_ROLE_SLAVE, 0x0f);
  TEST_ASSERT_EQUAL_MESSAGE(false, rt,
                            "ofp_role_generation_id_check error.");

  /* large generation_id. */
  rt = ofp_role_generation_id_check(dpid, OFPCR_ROLE_SLAVE, 0x11);
  TEST_ASSERT_EQUAL_MESSAGE(true, rt,
                            "ofp_role_generation_id_check error.");

  /* minus generation_id. */
  rt = ofp_role_generation_id_check(dpid, OFPCR_ROLE_SLAVE, 0xfffffffffffffffe);
  TEST_ASSERT_EQUAL_MESSAGE(false, rt,
                            "ofp_role_generation_id_check error.");

  return LAGOPUS_RESULT_OK;
}
Exemplo n.º 2
0
lagopus_result_t
ofp_role_request_handle(struct channel *channel,
                        struct pbuf *pbuf,
                        struct ofp_header *xid_header,
                        struct ofp_error *error) {
  lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES;
  struct ofp_role_request role_request;
  struct ofp_role_request modified_role_request;
  struct pbuf *send_pbuf = NULL;
  uint64_t dpid;

  if (channel != NULL && pbuf != NULL &&
      xid_header != NULL && error != NULL) {
    /* Parse packet. */
    ret = ofp_role_request_decode(pbuf, &role_request);

    if (ret == LAGOPUS_RESULT_OK) {
      /* dump trace. */
      role_request_trace(&role_request);

      ret = role_check(role_request.role, error);

      if (ret == LAGOPUS_RESULT_OK) {
        dpid = channel_dpid_get(channel);
        if (ofp_role_generation_id_check(dpid, role_request.role,
                                         role_request.generation_id) == true) {
          /* copy role request. */
          modified_role_request = role_request;
          ret = ofp_role_channel_update(channel,
                                        &modified_role_request,
                                        dpid);
          if (ret == LAGOPUS_RESULT_OK) {
            /* Reply send.*/
            ret = ofp_role_reply_create(channel, &send_pbuf,
                                        xid_header, &modified_role_request);
            if (ret == LAGOPUS_RESULT_OK) {
              channel_send_packet(channel, send_pbuf);
            } else {
              lagopus_msg_warning("FAILED (%s).\n",
                                  lagopus_error_get_string(ret));
            }
          } else {
            lagopus_msg_warning("FAILED (%s).\n",
                                lagopus_error_get_string(ret));
          }
        } else {
          lagopus_msg_warning("bad generation_id.\n");
          ofp_error_set(error, OFPET_ROLE_REQUEST_FAILED, OFPRRFC_STALE);
          ret = LAGOPUS_RESULT_OFP_ERROR;
        }

        if (ret != LAGOPUS_RESULT_OK && send_pbuf != NULL) {
          channel_pbuf_list_unget(channel, send_pbuf);
        }
      }
    } else {
      lagopus_msg_warning("FAILED (%s).\n", lagopus_error_get_string(ret));
      ofp_error_set(error, OFPET_BAD_REQUEST, OFPBRC_BAD_LEN);
      ret = LAGOPUS_RESULT_OFP_ERROR;
    }
  } else {
    ret = LAGOPUS_RESULT_INVALID_ARGS;
  }

  return ret;
}