#ifndef SLIRP_PROXY_H
#define SLIRP_PROXY_H

/* Type of a structure holding the interface to TCP proxy to be used
 * with the SLIRP stack. */
typedef struct SlirpProxyOps SlirpProxyOps;

/* Type of a function that is invoked when the proxy connection
 * attempt has completed. On success, |fd| will be >= 0 and the
 * descriptor for the active socket to use, |af| will be either
 * AF_INET or AF_INET6. On failure |fd| will be negative.
 * |connect_opaque| is the user-provided pointer that was passed
 * to slirp_proxy_try_connect().
 */
typedef void (SlirpProxyConnectFunc)(void* connect_opaque, int fd, int af);

/* Global SLIRP pointer to the proxy. If not-NULL, its methods will be
 * used to try to proxify TCP connections. */
extern const struct SlirpProxyOps *slirp_proxy;

/* A structure used to model the interface for any proxy implementation.
 * The default version will always return false in its |try_connect|
 * method. */
struct SlirpProxyOps {
    /* Initiate a proxy connection to address |addr|. |connect_func| is the
    * function that will be called to report the state of the connection,
    * and |connect_opaque| will be its first parameter, and used to
    * uniquely identify the connection (it should not be NULL).
    * Returns false if this address cannot be proxifed, in which case
    * a normal connection attempt should be performed. Return true
    * otherwise. */
    bool (*try_connect)(const struct sockaddr_storage *addr,
                        SlirpProxyConnectFunc *connect_func,
                        void *connect_opaque);

    /* Remove a proxy connection that was previously started with
    * a call to try_connect(). |connect_opaque| should be the same parameter
    * as the one passed to the function. */
    void (*remove)(void *connect_opaque);
};

#endif /* SLIRP_PROXY_H */
