#ifndef _LIBSLIRP_H
#define _LIBSLIRP_H

#include "slirp.h"

#include "android/utils/sockets.h"

#include <stdint.h>
#include <stdio.h>
#ifdef _WIN32
#  ifndef WIN32_LEAN_AND_MEAN
#    define WIN32_LEAN_AND_MEAN
#  endif
#  define socket_close  winsock2_socket_close3
#  include <winsock2.h>
#  undef socket_close
#else
#  include <sys/select.h>
#endif

#ifdef __cplusplus
extern "C" {
#endif

struct mbuf;

void slirp_init(int restricted, const char *special_ip);

void slirp_select_fill(int *pnfds,
                       fd_set *readfds, fd_set *writefds, fd_set *xfds);

void slirp_select_poll(fd_set *readfds, fd_set *writefds, fd_set *xfds);

void slirp_input(const uint8_t *pkt, int pkt_len);

/* you must provide the following functions: */
int slirp_can_output(void);
void slirp_output(const uint8_t *pkt, int pkt_len);

/* ---------------------------------------------------*/
/* User mode network stack restrictions */
void slirp_drop_udp();
void slirp_drop_tcp();
void slirp_add_allow(unsigned long dst_addr, int dst_lport,
                     int dst_hport, u_int8_t proto);
void slirp_drop_log_fd(FILE* fd);

/** Get the drop log fd */
FILE* get_slirp_drop_log_fd(void);
int slirp_should_drop(unsigned long dst_addr,
                      int dst_port,
                      u_int8_t proto);
int slirp_drop_log(const char* format, ...);

/* for network forwards */
void slirp_add_net_forward(unsigned long dest_ip, unsigned long dest_mask,
                           int dest_lport, int dest_hport,
                           unsigned long redirect_ip, int redirect_port);

int slirp_should_net_forward(unsigned long remote_ip, int remote_port,
                             unsigned long *redirect_ip, int *redirect_port);
/* ---------------------------------------------------*/

/**
 * Additional network stack modifications, aiming to detect and log
 * any network activity initiated by any binary outisde the context of
 * the running browser.
 */

void slirp_dns_log_fd(FILE* fd);
/** Get the dns log fd */
FILE* get_slirp_dns_log_fd(void);
/** Logs the DNS name in DNS query issued by the VM. */
int slirp_log_dns(struct mbuf* m, int dropped);
/** IP packet dump of DNS queris and responses. */
int slirp_dump_dns(struct mbuf* m);
/** Sets an upper limit for the number of allowed DNS requests from
 * the VM.
 */
void slirp_set_max_dns_conns(int max_dns_conns);
/* Returns the max number of allowed DNS requests.*/
int slirp_get_max_dns_conns();

/**
 * Modifications for implementing "-net-forward-tcp2sink' option.
 */

void slirp_forward_dropped_tcp2sink(unsigned long sink_ip,  int sink_port);
int slirp_should_forward_dropped_tcp2sink();
unsigned long slirp_get_tcp_sink_ip();
int slirp_get_tcp_sink_port();




/* ---------------------------------------------------*/

void slirp_redir_loop(void (*func)(void *opaque, int is_udp,
                                   const SockAddress *laddr,
                                   const SockAddress *faddr),
                     void *opaque);
int slirp_redir_rm(int is_udp, int host_port);
int slirp_redir(int is_udp, int host_port,
                uint32_t guest_addr, int guest_port);

int slirp_unredir(int is_udp, int host_port);

int slirp_init_dns_servers(const char* servers);
int slirp_add_exec(int do_pty, const void *args, int addr_low_byte,
                   int guest_port);

extern const char *tftp_prefix;
extern char slirp_hostname[33];
extern const char *bootp_filename;

void slirp_stats(void);
void slirp_socket_recv(int addr_low_byte, int guest_port, const uint8_t *buf,
		int size);
size_t slirp_socket_can_recv(int addr_low_byte, int guest_port);

#ifdef __cplusplus
}
#endif

#endif
