/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <nos/transport.h>

#include <errno.h>
#include <stdarg.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>

#include <application.h>

#include "crc16.h"

/* Note: evaluates expressions multiple times */
#define MIN(a, b) (((a) < (b)) ? (a) : (b))

#define DEBUG_LOG 0
#define VERBOSE_LOG 0

#ifdef ANDROID
/* Logging for Android */
#define LOG_TAG "libnos_transport"
#include <android-base/endian.h>
#include <log/log.h>
#include <sys/types.h>

#define NLOGE(...) ALOGE(__VA_ARGS__)
#define NLOGW(...) ALOGW(__VA_ARGS__)
#define NLOGD(...) ALOGD(__VA_ARGS__)
#define NLOGV(...) ALOGV(__VA_ARGS__)

extern int usleep (uint32_t usec);

#else
/* Logging for other platforms */
#include <stdio.h>

#define NLOGE(...) do { fprintf(stderr, __VA_ARGS__); \
  fprintf(stderr, "\n"); } while (0)
#define NLOGW(...) do { printf(__VA_ARGS__); \
  printf("\n"); } while (0)
#define NLOGD(...) do { if (DEBUG_LOG) { \
  printf(__VA_ARGS__); printf("\n"); } } while (0)
#define NLOGV(...) do { if (VERBOSE_LOG) { \
  printf(__VA_ARGS__); printf("\n"); } } while (0)

#endif

/*
 * If Citadel is rebooting it will take a while to become responsive again. We
 * expect a reboot to take around 100ms but we'll keep trying for 300ms to leave
 * plenty of margin.
 */
#define RETRY_COUNT 240
#define RETRY_WAIT_TIME_US 5000

/* In case of CRC error, try to retransmit */
#define CRC_RETRY_COUNT 5

/* How long to poll before giving up */
#define POLL_LIMIT_SECONDS 60

struct transport_context {
  const struct nos_device *dev;
  uint8_t app_id;
  uint16_t params;
  const uint8_t *args;
  uint32_t arg_len;
  uint8_t *reply;
  uint32_t *reply_len;
};

/*
 * Read a datagram from the device, correctly handling retries.
 */
static int nos_device_read(const struct nos_device *dev, uint32_t command,
                           void *buf, uint32_t len) {
  int retries = RETRY_COUNT;
  while (retries--) {
    int err = dev->ops.read(dev->ctx, command, buf, len);

    if (err == -EAGAIN) {
      /* Linux driver returns EAGAIN error if Citadel chip is asleep.
       * Give to the chip a little bit of time to awake and retry reading
       * status again. */
      usleep(RETRY_WAIT_TIME_US);
      continue;
    }

    if (err) {
      NLOGE("Failed to read: %s", strerror(-err));
    }
    return -err;
  }

  return ETIMEDOUT;
}

/*
 * Write a datagram to the device, correctly handling retries.
 */
static int nos_device_write(const struct nos_device *dev, uint32_t command,
                            const void *buf, uint32_t len) {
  int retries = RETRY_COUNT;
  while (retries--) {
    int err = dev->ops.write(dev->ctx, command, buf, len);

    if (err == -EAGAIN) {
      /* Linux driver returns EAGAIN error if Citadel chip is asleep.
       * Give to the chip a little bit of time to awake and retry reading
       * status again. */
      usleep(RETRY_WAIT_TIME_US);
      continue;
    }

    if (err) {
      NLOGE("Failed to write: %s", strerror(-err));
    }
    return -err;
  }

  return ETIMEDOUT;
}

/*
 * Get the status regardless of protocol version. All fields not passed by the
 * slave are set to 0 so the caller must check the version before interpretting
 * them.
 *
 * Returns non-zero on error.
 */
static int get_status(const struct transport_context *ctx,
                      struct transport_status *out) {
  union {
    struct transport_status status;
    uint8_t data[STATUS_MAX_LENGTH];
  } st;
  int retries = CRC_RETRY_COUNT;
  while (retries--) {
    /* Get the status from the device */
    const uint32_t command = CMD_ID(ctx->app_id) | CMD_IS_READ | CMD_TRANSPORT;
    if (nos_device_read(ctx->dev, command, &st, STATUS_MAX_LENGTH) != 0) {
      NLOGE("Failed to read app %d status", ctx->app_id);
      return -1;
    }

    /* All unset fields will be 0. */
    memset(out, 0, sizeof(*out));

    /* Examine v0 fields */
    out->status = le32toh(st.status.status);
    out->reply_len = le16toh(st.status.reply_len);

    /* Identify v0 as length will be an invalid value */
    const uint16_t length = le16toh(st.status.length);
    if (length < STATUS_MIN_LENGTH || length > STATUS_MAX_LENGTH) {
      out->version = TRANSPORT_V0;
      return 0;
    }

    /* Examine v1 fields */
    out->length = length;
    out->version = le16toh(st.status.version);
    out->flags = le16toh(st.status.flags);
    out->crc = le16toh(st.status.crc);
    out->reply_crc = le16toh(st.status.reply_crc);

    /* Calculate the CRC of the status message */
    st.status.crc = 0;
    const uint16_t our_crc = crc16(&st.status, length);

    /* Check the CRC, if it fails we will retry */
    if (out->crc != our_crc) {
      NLOGW("App %d status CRC mismatch: theirs=%04x ours=%04x",
            ctx->app_id, out->crc, our_crc);
      continue;
    }

    /* Identify and examine v2+ fields here */

    return 0;
  }

  NLOGE("Unable to get valid checksum on app %d status", ctx->app_id);
  return -1;
}

/*
 * Try and reset the protocol state on Citadel for a new transaction.
 */
static int clear_status(const struct transport_context *ctx) {
  const uint32_t command = CMD_ID(ctx->app_id) | CMD_TRANSPORT;
  if (nos_device_write(ctx->dev, command, NULL, 0) != 0) {
    NLOGE("Failed to clear app %d status", ctx->app_id);
    return -1;
  }
  return 0;
}

/*
 * Ensure that the app is in an idle state ready to handle the transaction.
 */
static uint32_t make_ready(const struct transport_context *ctx) {
  struct transport_status status;

  if (get_status(ctx, &status) != 0) {
    NLOGE("Failed to inspect app %d", ctx->app_id);
    return APP_ERROR_IO;
  }
  NLOGD("App %d inspection status=0x%08x reply_len=%d protocol=%d flags=0x%04x",
        ctx->app_id, status.status, status.reply_len, status.version, status.flags);

  /* If it's already idle then we're ready to proceed */
  if (status.status == APP_STATUS_IDLE) {
    if (status.version != TRANSPORT_V0
        && (status.flags & STATUS_FLAG_WORKING)) {
      /* The app is still working when we don't expect it to be. We won't be
       * able to clear the state so might need to force a reset to recover. */
      NLOGE("App %d is still working", ctx->app_id);
      return APP_ERROR_BUSY;
    }
    return APP_SUCCESS;
  }

  /* Try clearing the status */
  NLOGD("Clearing previous app %d status", ctx->app_id);
  if (clear_status(ctx) != 0) {
    NLOGE("Failed to force app %d to idle status", ctx->app_id);
    return APP_ERROR_IO;
  }

  /* Check again */
  if (get_status(ctx, &status) != 0) {
    NLOGE("Failed to get app %d's cleared status", ctx->app_id);
    return APP_ERROR_IO;
  }
  NLOGD("Cleared app %d status=0x%08x reply_len=%d flags=0x%04x",
        ctx->app_id, status.status, status.reply_len, status.flags);

  /* It's ignoring us and is still not ready, so it's broken */
  if (status.status != APP_STATUS_IDLE) {
    NLOGE("App %d is not responding", ctx->app_id);
    return APP_ERROR_IO;
  }

  return APP_SUCCESS;
}

/*
 * Split request into datagrams and send command to have app process it.
 */
static uint32_t send_command(const struct transport_context *ctx) {
  const uint8_t *args = ctx->args;
  uint16_t arg_len = ctx->arg_len;
  uint16_t crc;

  NLOGD("Send app %d command data (%d bytes)", ctx->app_id, arg_len);
  uint32_t command = CMD_ID(ctx->app_id) | CMD_IS_DATA | CMD_TRANSPORT;
  /* This always sends at least 1 packet to support the v0 protocol */
  do {
    /*
     * We can't send more per datagram than the device can accept. For Citadel
     * using the TPM Wait protocol on SPS, this is a constant. For other buses
     * it may not be, but this is what we support here. Due to peculiarities of
     * Citadel's SPS hardware, our protocol requires that we specify the length
     * of what we're about to send in the params field of each Write.
     */
    const uint16_t ulen = MIN(arg_len, MAX_DEVICE_TRANSFER);
    CMD_SET_PARAM(command, ulen);

    NLOGV("Write app %d command 0x%08x, bytes %d", ctx->app_id, command, ulen);
    if (nos_device_write(ctx->dev, command, args, ulen) != 0) {
      NLOGE("Failed to send datagram to app %d", ctx->app_id);
      return APP_ERROR_IO;
    }

    /* Any further Writes needed to send all the args must set the MORE bit */
    command |= CMD_MORE_TO_COME;
    args += ulen;
    arg_len -= ulen;
  } while (arg_len);

  /* Finally, send the "go" command */
  command = CMD_ID(ctx->app_id) | CMD_PARAM(ctx->params);

  /*
   * The outgoing crc covers:
   *
   *   1. the (16-bit) length of args
   *   2. the args buffer (if any)
   *   3. the (32-bit) "go" command
   *   4. the command info with crc set to 0
   */
  struct transport_command_info command_info = {
    .length = sizeof(command_info),
    .version = htole16(TRANSPORT_V1),
    .crc = 0,
    .reply_len_hint = ctx->reply_len ? htole16(*ctx->reply_len) : 0,
  };
  arg_len = ctx->arg_len;
  crc = crc16(&arg_len, sizeof(arg_len));
  crc = crc16_update(ctx->args, ctx->arg_len, crc);
  crc = crc16_update(&command, sizeof(command), crc);
  crc = crc16_update(&command_info, sizeof(command_info), crc);
  command_info.crc = htole16(crc);

  /* Tell the app to handle the request while also sending the command_info
   * which will be ignored by the v0 protocol. */
  NLOGD("Send app %d go command 0x%08x", ctx->app_id, command);
  if (0 != nos_device_write(ctx->dev, command, &command_info, sizeof(command_info))) {
    NLOGE("Failed to send command datagram to app %d", ctx->app_id);
    return APP_ERROR_IO;
  }

  return APP_SUCCESS;
}

static bool timespec_before(const struct timespec *lhs, const struct timespec *rhs) {
  if (lhs->tv_sec == rhs->tv_sec) {
    return lhs->tv_nsec < rhs->tv_nsec;
  } else {
    return lhs->tv_sec < rhs->tv_sec;
  }
}

/*
 * Keep polling until the app says it is done.
 */
static uint32_t poll_until_done(const struct transport_context *ctx,
                                struct transport_status *status) {
  uint32_t poll_count = 0;

  /* Start the timer */
  struct timespec now;
  struct timespec abort_at;
  if (clock_gettime(CLOCK_MONOTONIC, &now) != 0) {
    NLOGE("clock_gettime() failing: %s", strerror(errno));
    return APP_ERROR_IO;
  }
  abort_at.tv_sec = now.tv_sec + POLL_LIMIT_SECONDS;
  abort_at.tv_nsec = now.tv_nsec;

  NLOGD("Polling app %d", ctx->app_id);
  do {
    /* Poll the status */
    if (get_status(ctx, status) != 0) {
      return APP_ERROR_IO;
    }
    poll_count++;
    /* Log at higher priority every 16 polls */
    if ((poll_count & (16 - 1)) == 0) {
      NLOGD("App %d poll=%d status=0x%08x reply_len=%d flags=0x%04x",
            ctx->app_id, poll_count, status->status, status->reply_len, status->flags);
    } else {
      NLOGV("App %d poll=%d status=0x%08x reply_len=%d flags=0x%04x",
            ctx->app_id, poll_count, status->status, status->reply_len, status->flags);
    }

    /* Check whether the app is done */
    if (status->status & APP_STATUS_DONE) {
      NLOGD("App %d polled=%d status=0x%08x reply_len=%d flags=0x%04x",
            ctx->app_id, poll_count, status->status, status->reply_len, status->flags);
      return APP_STATUS_CODE(status->status);
    }

    /* Check that the app is still working on it */
    if (status->version != TRANSPORT_V0
        && !(status->flags & STATUS_FLAG_WORKING)) {
      /* The slave has stopped working without being done so it's misbehaving */
      NLOGE("App %d just stopped working", ctx->app_id);
      return APP_ERROR_INTERNAL;
    }
    if (clock_gettime(CLOCK_MONOTONIC, &now) != 0) {
      NLOGE("clock_gettime() failing: %s", strerror(errno));
      return APP_ERROR_IO;
    }
  } while (timespec_before(&now, &abort_at));

  NLOGE("App %d not done after polling %d times in %d seconds",
        ctx->app_id, poll_count, POLL_LIMIT_SECONDS);
  return APP_ERROR_TIMEOUT;
}

/*
 * Reconstruct the reply data from datagram stream.
 */
static uint32_t receive_reply(const struct transport_context *ctx,
                              const struct transport_status *status) {
  int retries = CRC_RETRY_COUNT;
  while (retries--) {
    NLOGD("Read app %d reply data (%d bytes)", ctx->app_id, status->reply_len);

    uint32_t command = CMD_ID(ctx->app_id) | CMD_IS_READ | CMD_TRANSPORT | CMD_IS_DATA;
    uint8_t *reply = ctx->reply;
    uint16_t left = MIN(*ctx->reply_len, status->reply_len);
    uint16_t got = 0;
    uint16_t crc = 0;
    while (left) {
      /* We can't read more per datagram than the device can send */
      const uint16_t gimme = MIN(left, MAX_DEVICE_TRANSFER);
      NLOGV("Read app %d command=0x%08x, bytes=%d", ctx->app_id, command, gimme);
      if (nos_device_read(ctx->dev, command, reply, gimme) != 0) {
        NLOGE("Failed to receive datagram from app %d", ctx->app_id);
        return APP_ERROR_IO;
      }

      /* Any further Reads should set the MORE bit. This only works if Nugget
       * OS sends back CRCs, but that's the only time we'd retry anyway. */
      command |= CMD_MORE_TO_COME;

      crc = crc16_update(reply, gimme, crc);
      reply += gimme;
      left -= gimme;
      got += gimme;
    }
    /* got it all */
    *ctx->reply_len = got;

    /* v0 protocol doesn't support CRC so hopefully it's ok */
    if (status->version == TRANSPORT_V0) return APP_SUCCESS;

    if (crc == status->reply_crc) return APP_SUCCESS;
    NLOGW("App %d reply CRC mismatch: theirs=%04x ours=%04x", ctx->app_id, status->reply_crc, crc);
  }

  NLOGE("Unable to get valid checksum on app %d reply data", ctx->app_id);
  return APP_ERROR_IO;
}

/*
 * Driver for the master of the transport protocol.
 */
uint32_t nos_call_application(const struct nos_device *dev,
                              uint8_t app_id, uint16_t params,
                              const uint8_t *args, uint32_t arg_len,
                              uint8_t *reply, uint32_t *reply_len)
{
  uint32_t res;
  const struct transport_context ctx = {
    .dev = dev,
    .app_id = app_id,
    .params = params,
    .args = args,
    .arg_len = arg_len,
    .reply = reply,
    .reply_len = reply_len,
  };

  if ((ctx.arg_len && !ctx.args) ||
      (ctx.reply_len && *ctx.reply_len && !ctx.reply)) {
    NLOGE("Invalid args to %s()", __func__);
    return APP_ERROR_IO;
  }

  NLOGD("Calling App %d with params 0x%04x", app_id, params);

  struct transport_status status;
  uint32_t status_code;
  int retries = CRC_RETRY_COUNT;
  while (retries--) {
    /* Wake up and wait for Citadel to be ready */
    res = make_ready(&ctx);
    if (res) return res;

    /* Tell the app what to do */
    res = send_command(&ctx);
    if (res) return res;

    /* Wait until the app has finished */
    status_code = poll_until_done(&ctx, &status);

    /* Citadel chip complained we sent it a count different from what we claimed
     * or more than it can accept but this should not happen. Give to the chip a
     * little bit of time and retry calling again. */
    if (status_code == APP_ERROR_TOO_MUCH) {
      NLOGD("App %d returning 0x%x, give a retry(%d/%d)",
            app_id, status_code, retries, CRC_RETRY_COUNT);
      usleep(RETRY_WAIT_TIME_US);
      continue;
    }
    if (status_code != APP_ERROR_CHECKSUM) break;
    NLOGW("App %d request checksum error", app_id);
  }
  if (status_code == APP_ERROR_CHECKSUM) {
    NLOGE("App %d request checksum failed too many times", app_id);
    status_code = APP_ERROR_IO;
  }

  /* Get the reply, but only if the app produced data and the caller wants it */
  if (ctx.reply && ctx.reply_len && *ctx.reply_len && status.reply_len) {
    res = receive_reply(&ctx, &status);
    if (res) return res;
  } else if (reply_len) {
    *reply_len = 0;
  }

  NLOGV("Clear app %d reply for the next caller", app_id);
  /* This should work, but isn't completely fatal if it doesn't because the
   * next call will try again. */
  (void)clear_status(&ctx);

  NLOGD("App %d returning 0x%x", app_id, status_code);
  return status_code;
}
