// Copyright 2016 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef SYSROOT_ZIRCON_BOOT_NETBOOT_H_
#define SYSROOT_ZIRCON_BOOT_NETBOOT_H_

#include <limits.h>
#include <stddef.h>
#include <stdint.h>
#include <zircon/types.h>

// clang-format off

#define BOOTLOADER_VERSION "0.7.22"

#define NB_MAGIC              0xAA774217
#define NB_DEBUGLOG_MAGIC     0xAEAE1123

#define NB_SERVER_PORT        33330
#define NB_ADVERT_PORT        33331
#define NB_CMD_PORT_START     33332
#define NB_CMD_PORT_END       33339
#define NB_TFTP_OUTGOING_PORT 33340
#define NB_TFTP_INCOMING_PORT 33341


#define NB_COMMAND           1   // arg=0, data=command
#define NB_SEND_FILE         2   // arg=size, data=filename
#define NB_DATA              3   // arg=offset, data=data
#define NB_BOOT              4   // arg=0
#define NB_QUERY             5   // arg=0, data=hostname (or "*")
#define NB_SHELL_CMD         6   // arg=0, data=command string
#define NB_OPEN              7   // arg=O_RDONLY|O_WRONLY, data=filename
#define NB_READ              8   // arg=blocknum
#define NB_WRITE             9   // arg=blocknum, data=data
#define NB_CLOSE             10  // arg=0
#define NB_LAST_DATA         11  // arg=offset, data=data
#define NB_REBOOT            12  // arg=0
#define NB_GET_ADVERT        13  // arg=0

#define NB_ACK                0 // arg=0 or -err, NB_READ: data=data
#define NB_FILE_RECEIVED      0x70000001 // arg=size

#define NB_ADVERTISE          0x77777777

#define NB_ERROR              0x80000000
#define NB_ERROR_BAD_CMD      0x80000001
#define NB_ERROR_BAD_PARAM    0x80000002
#define NB_ERROR_TOO_LARGE    0x80000003
#define NB_ERROR_BAD_FILE     0x80000004

#define NB_VERSION_1_0  0x0001000
#define NB_VERSION_1_1  0x0001010
#define NB_VERSION_1_2  0x0001020
#define NB_VERSION_1_3  0x0001030
#define NB_VERSION_CURRENT NB_VERSION_1_3

#define NB_FILENAME_PREFIX "<<netboot>>"
#define NB_KERNEL_FILENAME NB_FILENAME_PREFIX "kernel.bin"
#define NB_CMDLINE_FILENAME NB_FILENAME_PREFIX "cmdline"

#define NB_IMAGE_PREFIX "<<image>>"
#define NB_FVM_HOST_FILENAME "sparse.fvm"
#define NB_FVM_FILENAME NB_IMAGE_PREFIX NB_FVM_HOST_FILENAME
#define NB_BOOTLOADER_HOST_FILENAME "bootloader.img"
#define NB_BOOTLOADER_FILENAME NB_IMAGE_PREFIX NB_BOOTLOADER_HOST_FILENAME
// Firmware images are slightly different, as they have an optional type suffix:
//   firmware_     <- type = "" (the default)
//   firmware_foo  <- type = "foo"
#define NB_FIRMWARE_HOST_FILENAME_PREFIX "firmware_"
#define NB_FIRMWARE_FILENAME_PREFIX NB_IMAGE_PREFIX NB_FIRMWARE_HOST_FILENAME_PREFIX
#define NB_FIRMWAREA_HOST_FILENAME_PREFIX "firmwarea_"
#define NB_FIRMWAREA_FILENAME_PREFIX NB_IMAGE_PREFIX NB_FIRMWAREA_HOST_FILENAME_PREFIX
#define NB_FIRMWAREB_HOST_FILENAME_PREFIX "firmwareb_"
#define NB_FIRMWAREB_FILENAME_PREFIX NB_IMAGE_PREFIX NB_FIRMWAREB_HOST_FILENAME_PREFIX
#define NB_FIRMWARER_HOST_FILENAME_PREFIX "firmwarer_"
#define NB_FIRMWARER_FILENAME_PREFIX NB_IMAGE_PREFIX NB_FIRMWARER_HOST_FILENAME_PREFIX
#define NB_ZIRCONA_HOST_FILENAME "zircona.img"
#define NB_ZIRCONA_FILENAME NB_IMAGE_PREFIX NB_ZIRCONA_HOST_FILENAME
#define NB_ZIRCONB_HOST_FILENAME "zirconb.img"
#define NB_ZIRCONB_FILENAME NB_IMAGE_PREFIX NB_ZIRCONB_HOST_FILENAME
#define NB_ZIRCONR_HOST_FILENAME "zirconr.img"
#define NB_ZIRCONR_FILENAME NB_IMAGE_PREFIX NB_ZIRCONR_HOST_FILENAME
#define NB_VBMETAA_HOST_FILENAME "vbmetaa.img"
#define NB_VBMETAA_FILENAME NB_IMAGE_PREFIX NB_VBMETAA_HOST_FILENAME
#define NB_VBMETAB_HOST_FILENAME "vbmetab.img"
#define NB_VBMETAB_FILENAME NB_IMAGE_PREFIX NB_VBMETAB_HOST_FILENAME
#define NB_VBMETAR_HOST_FILENAME "vbmetar.img"
#define NB_VBMETAR_FILENAME NB_IMAGE_PREFIX NB_VBMETAR_HOST_FILENAME
#define NB_SSHAUTH_HOST_FILENAME "authorized_keys"
#define NB_SSHAUTH_FILENAME NB_IMAGE_PREFIX NB_SSHAUTH_HOST_FILENAME
#define NB_BOARD_NAME_HOST_FILENAME "board_name"
#define NB_BOARD_NAME_FILENAME NB_IMAGE_PREFIX NB_BOARD_NAME_HOST_FILENAME
#define NB_BOARD_REVISION_HOST_FILENAME "board_revision"
#define NB_BOARD_REVISION_FILENAME NB_IMAGE_PREFIX NB_BOARD_REVISION_HOST_FILENAME
#define NB_BOARD_INFO_HOST_FILENAME "board_info"
#define NB_BOARD_INFO_FILENAME NB_IMAGE_PREFIX NB_BOARD_INFO_HOST_FILENAME
#define NB_INIT_PARTITION_TABLES_HOST_FILENAME "init_partition_tables"
#define NB_INIT_PARTITION_TABLES_FILENAME NB_IMAGE_PREFIX NB_INIT_PARTITION_TABLES_HOST_FILENAME
#define NB_WIPE_PARTITION_TABLES_HOST_FILENAME "wipe_partition_tables"
#define NB_WIPE_PARTITION_TABLES_FILENAME NB_IMAGE_PREFIX NB_WIPE_PARTITION_TABLES_HOST_FILENAME

// Should match paver FIDL definition.
// Length does not include the '\0' terminator, so when allocating a character
// buffer to hold the type use (NB_FIRMWARE_TYPE_MAX_LENGTH  + 1).
#define NB_FIRMWARE_TYPE_MAX_LENGTH 256

typedef struct board_info {
  char board_name[ZX_MAX_NAME_LEN];
  uint32_t board_revision;
  uint8_t mac_address[6];
  uint8_t _padding[2];
} board_info_t;

#define NB_PATH_MAX 4096

typedef struct modify_partition_table_info {
  // Path of block device to initialize or wipe.
  char block_device_path[NB_PATH_MAX + 1];
} modify_partition_table_info_t;

typedef struct nbmsg_t {
    uint32_t magic;
    uint32_t cookie;
    uint32_t cmd;
    uint32_t arg;
    uint8_t  data[0];
} nbmsg;

typedef struct nbfile_t {
    uint8_t* data;
    size_t size; // max size of buffer
    size_t offset; // write pointer
} nbfile;

int netboot_init(const char* nodename, uint32_t namegen);
const char* netboot_nodename(void);
int netboot_poll(void);
void netboot_close(void);

// Ask for a buffer suitable to put the file /name/ in
// Return NULL to indicate /name/ is not wanted.
nbfile* netboot_get_buffer(const char* name, size_t size);

#define DEBUGLOG_PORT         33337
#define DEBUGLOG_ACK_PORT     33338

#define MAX_LOG_DATA 1216
#define MAX_NODENAME_LENGTH 64

typedef struct logpacket {
    uint32_t magic;
    uint32_t seqno;
    char nodename[MAX_NODENAME_LENGTH];
    char data[MAX_LOG_DATA];
} logpacket_t;

#endif  // SYSROOT_ZIRCON_BOOT_NETBOOT_H_
