lagopus_result_t
ofp_features_capabilities_convert(uint64_t ds_capabilities,
                                  uint32_t *features_capabilities) {
  lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES;
  size_t i;

  if (features_capabilities != NULL) {
    /* set capabilities. */
    *features_capabilities = 0;
    for (i = 0; i < capabilities_size; i++) {
      features_reply_features_capability_set(
          ds_capabilities, i,
          features_capabilities);
    }
    ret = LAGOPUS_RESULT_OK;
  } else {
    ret = LAGOPUS_RESULT_INVALID_ARGS;
  }

  return ret;
}
static lagopus_result_t
features_reply_features_get(struct channel *channel,
                            struct ofp_switch_features *features) {
  lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES;
  datastore_bridge_info_t info;
  size_t i;

  /* set ids/reserved. */
  features->datapath_id = channel_dpid_get(channel);
  features->auxiliary_id = channel_auxiliary_id_get(channel);
  features->reserved = 0;

  if ((ret = ofp_bridgeq_mgr_info_get(features->datapath_id,
                                      &info)) !=
      LAGOPUS_RESULT_OK) {
    lagopus_msg_warning("FAILED (%s).\n",
                        lagopus_error_get_string(ret));
    goto done;
  }

  /* set max. */
  features->n_buffers = info.max_buffered_packets;
  features->n_tables = info.max_tables;

  /* set capabilities. */
  features->capabilities = 0;
  for (i = 0; i < capabilities_size; i++) {
    if ((ret = features_reply_features_capability_set(
            info.capabilities,
            i,
            &features->capabilities)) != LAGOPUS_RESULT_OK) {
      lagopus_msg_warning("FAILED (%s).\n",
                          lagopus_error_get_string(ret));
      goto done;
    }
  }

done:
  return ret;
}