#ifndef TRUNNEL_NETINFO_H
#define TRUNNEL_NETINFO_H
#include <stdint.h>
#include "trunnel.h"
#define NETINFO_ADDR_TYPE_IPV4 4
#define NETINFO_ADDR_TYPE_IPV6 6
#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_NETINFO_ADDR)
struct netinfo_addr_st {
uint8_t addr_type;
uint8_t len;
uint32_t addr_ipv4;
uint8_t addr_ipv6[16];
uint8_t trunnel_error_code_;
};
#endif
typedef struct netinfo_addr_st netinfo_addr_t;
#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_NETINFO_CELL)
struct netinfo_cell_st {
uint32_t timestamp;
struct netinfo_addr_st *other_addr;
uint8_t n_my_addrs;
TRUNNEL_DYNARRAY_HEAD(, struct netinfo_addr_st *) my_addrs;
uint8_t trunnel_error_code_;
};
#endif
typedef struct netinfo_cell_st netinfo_cell_t;
netinfo_addr_t *netinfo_addr_new(void);
void netinfo_addr_free(netinfo_addr_t *victim);
ssize_t netinfo_addr_parse(netinfo_addr_t **output, const uint8_t *input, const size_t len_in);
ssize_t netinfo_addr_encoded_len(const netinfo_addr_t *obj);
ssize_t netinfo_addr_encode(uint8_t *output, size_t avail, const netinfo_addr_t *input);
const char *netinfo_addr_check(const netinfo_addr_t *obj);
int netinfo_addr_clear_errors(netinfo_addr_t *obj);
uint8_t netinfo_addr_get_addr_type(const netinfo_addr_t *inp);
int netinfo_addr_set_addr_type(netinfo_addr_t *inp, uint8_t val);
uint8_t netinfo_addr_get_len(const netinfo_addr_t *inp);
int netinfo_addr_set_len(netinfo_addr_t *inp, uint8_t val);
uint32_t netinfo_addr_get_addr_ipv4(const netinfo_addr_t *inp);
int netinfo_addr_set_addr_ipv4(netinfo_addr_t *inp, uint32_t val);
size_t netinfo_addr_getlen_addr_ipv6(const netinfo_addr_t *inp);
uint8_t netinfo_addr_get_addr_ipv6(netinfo_addr_t *inp, size_t idx);
uint8_t netinfo_addr_getconst_addr_ipv6(const netinfo_addr_t *inp, size_t idx);
int netinfo_addr_set_addr_ipv6(netinfo_addr_t *inp, size_t idx, uint8_t elt);
uint8_t * netinfo_addr_getarray_addr_ipv6(netinfo_addr_t *inp);
const uint8_t * netinfo_addr_getconstarray_addr_ipv6(const netinfo_addr_t *inp);
netinfo_cell_t *netinfo_cell_new(void);
void netinfo_cell_free(netinfo_cell_t *victim);
ssize_t netinfo_cell_parse(netinfo_cell_t **output, const uint8_t *input, const size_t len_in);
ssize_t netinfo_cell_encoded_len(const netinfo_cell_t *obj);
ssize_t netinfo_cell_encode(uint8_t *output, size_t avail, const netinfo_cell_t *input);
const char *netinfo_cell_check(const netinfo_cell_t *obj);
int netinfo_cell_clear_errors(netinfo_cell_t *obj);
uint32_t netinfo_cell_get_timestamp(const netinfo_cell_t *inp);
int netinfo_cell_set_timestamp(netinfo_cell_t *inp, uint32_t val);
struct netinfo_addr_st * netinfo_cell_get_other_addr(netinfo_cell_t *inp);
const struct netinfo_addr_st * netinfo_cell_getconst_other_addr(const netinfo_cell_t *inp);
int netinfo_cell_set_other_addr(netinfo_cell_t *inp, struct netinfo_addr_st *val);
int netinfo_cell_set0_other_addr(netinfo_cell_t *inp, struct netinfo_addr_st *val);
uint8_t netinfo_cell_get_n_my_addrs(const netinfo_cell_t *inp);
int netinfo_cell_set_n_my_addrs(netinfo_cell_t *inp, uint8_t val);
size_t netinfo_cell_getlen_my_addrs(const netinfo_cell_t *inp);
struct netinfo_addr_st * netinfo_cell_get_my_addrs(netinfo_cell_t *inp, size_t idx);
const struct netinfo_addr_st * netinfo_cell_getconst_my_addrs(const netinfo_cell_t *inp, size_t idx);
int netinfo_cell_set_my_addrs(netinfo_cell_t *inp, size_t idx, struct netinfo_addr_st * elt);
int netinfo_cell_set0_my_addrs(netinfo_cell_t *inp, size_t idx, struct netinfo_addr_st * elt);
int netinfo_cell_add_my_addrs(netinfo_cell_t *inp, struct netinfo_addr_st * elt);
struct netinfo_addr_st * * netinfo_cell_getarray_my_addrs(netinfo_cell_t *inp);
const struct netinfo_addr_st * const * netinfo_cell_getconstarray_my_addrs(const netinfo_cell_t *inp);
int netinfo_cell_setlen_my_addrs(netinfo_cell_t *inp, size_t newlen);
#endif