// 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 TOOLS_NETPROTOCOL_NETPROTOCOL_H_
#define TOOLS_NETPROTOCOL_NETPROTOCOL_H_

#include <arpa/inet.h>
#include <getopt.h>
#include <stdbool.h>
#include <stdint.h>
#include <zircon/boot/netboot.h>

#define MAXSIZE 1024

#define TFTP_DEFAULT_BLOCK_SZ 1024
#define TFTP_DEFAULT_WINDOW_SZ 256

typedef struct {
  struct nbmsg_t hdr;
  uint8_t data[MAXSIZE];
} msg;

typedef enum device_state {
  UNKNOWN,
  OFFLINE,
  DEVICE,
  BOOTLOADER,
} device_state_t;

typedef struct device_info {
  char nodename[MAX_NODENAME_LENGTH];
  char inet6_addr_s[INET6_ADDRSTRLEN];
  struct sockaddr_in6 inet6_addr;
  device_state_t state;
  uint32_t bootloader_version;
  uint16_t bootloader_port;
} device_info_t;

extern uint16_t tftp_block_size, tftp_window_size;

// Handle netboot command line options.
int netboot_handle_getopt(int argc, char* const* argv);
int netboot_handle_custom_getopt(int argc, char* const* argv, const struct option* custom_opts,
                                 bool (*opt_callback)(int ch, int argc, char* const* argv));
void netboot_usage(bool show_tftp_opts);

// Returns whether discovery should continue or not.
typedef bool (*on_device_cb)(device_info_t* device, void* cookie);
int netboot_discover(unsigned port, const char* ifname, on_device_cb callback, void* cookie);

int netboot_open(const char* hostname, const char* ifname, struct sockaddr_in6* addr,
                 bool make_connection);

#endif  // TOOLS_NETPROTOCOL_NETPROTOCOL_H_
