blob: 5f1b4ab18332c65d81941e9a759608d45b5e73a4 [file] [log] [blame]
#ifndef LIBSLIRP_H
#define LIBSLIRP_H
#include "qemu-common.h"
struct Slirp;
typedef struct Slirp Slirp;
Slirp *slirp_init(int restricted, bool in_enabled, struct in_addr vnetwork,
struct in_addr vnetmask, struct in_addr vhost,
bool in6_enabled,
struct in6_addr vprefix_addr6, uint8_t vprefix_len,
struct in6_addr vhost6, const char *vhostname,
const char *tftp_path, const char *bootfile,
struct in_addr vdhcp_start, struct in_addr vnameserver,
struct in6_addr vnameserver6, const char **vdnssearch,
void *opaque);
void slirp_cleanup(Slirp *slirp);
/* Setup custom DNS servers to be used. |dns_servers| is an array of
* |num_dns_servers| IPv4 host addresses for DNS servers to be used
* when translating guest IPv4 DNS addresses (typically from 10.0.2.3
* to 10.0.2.(3 + num_dns_servers - 1). */
void slirp_init_custom_dns_servers(Slirp *slirp,
const struct sockaddr_storage *dns_servers,
int num_dns_servers);
/* Check whether |guest_ip| is the IPv4 address of a guest DNS server.
* If that's the case, set |*host_ip| to the corresponding host DNS server
* address and return 0. Otherwise, leave |host_ip| untouched and
* return -1 */
int slirp_translate_guest_dns(Slirp *slirp,
const struct sockaddr_in *guest_ip,
struct sockaddr_in *host_ip);
/* Same for IPv6 addresses */
int slirp_translate_guest_dns6(Slirp *slirp,
const struct sockaddr_in6 *guest_ip6,
struct sockaddr_in6 *host_ip6);
void slirp_pollfds_fill(GArray *pollfds, uint32_t *timeout);
void slirp_pollfds_poll(GArray *pollfds, int select_error);
void slirp_input(Slirp *slirp, const uint8_t *pkt, int pkt_len);
/* you must provide the following functions: */
void slirp_output(void *opaque, const uint8_t *pkt, int pkt_len);
int slirp_add_hostfwd(Slirp *slirp, int is_udp,
struct in_addr host_addr, int host_port,
struct in_addr guest_addr, int guest_port);
int slirp_remove_hostfwd(Slirp *slirp, int is_udp,
struct in_addr host_addr, int host_port);
int slirp_add_exec(Slirp *slirp, int do_pty, const void *args,
struct in_addr *guest_addr, int guest_port);
void slirp_connection_info(Slirp *slirp, Monitor *mon);
void slirp_socket_recv(Slirp *slirp, struct in_addr guest_addr,
int guest_port, const uint8_t *buf, int size);
size_t slirp_socket_can_recv(Slirp *slirp, struct in_addr guest_addr,
int guest_port);
#endif