pxremap.c revision f0c792e78a8bf77c28c7814441e514bea7c5362b
/** -*- indent-tabs-mode: nil; -*-
*
* This file contains functions pertinent to magic address remapping.
*
* We want to expose host's loopback interfaces to the guest by
* for example proxy interface is 10.0.2.1, we redirect traffic to
* 10.0.2.2 to host's 127.0.0.1 loopback. If need be, we may extend
* this to provide additional mappings, e.g. 127.0.1.1 loopback
* address is used on Ubuntu 12.10+ for NetworkManager's dnsmasq.
*
* Ditto for IPv6, except that IPv6 only has one loopback address.
*/
#include "winutils.h"
#include "pxremap.h"
#include "proxy.h"
#include <string.h>
/**
* Check if "dst" is an IPv4 address that proxy remaps to host's
* loopback.
*/
static int
{
size_t i;
return 0;
}
return 0;
}
/* XXX: TODO: check netif is a proxying netif! */
}
return 1;
}
}
return 0;
}
#if ARP_PROXY
/**
* Hook function for etharp_arp_input() - returns true to cause proxy
* ARP reply to be generated for "dst".
*/
int
{
}
#endif /* ARP_PROXY */
/**
* Hook function for ip_forward() - returns true to divert packets to
* "dst" to proxy (instead of forwarding them via "netif" or dropping).
*/
int
{
}
/**
* Mapping from local network to loopback for outbound connections.
*
* Copy "src" to "dst" with ip_addr_set(dst, src), but if "src" is a
* local network address that maps host's loopback address, copy
* loopback address to "dst".
*/
int
{
return PXREMAP_MAPPED;
}
}
}
/* not remapped, just copy src */
return PXREMAP_ASIS;
}
/**
* Mapping from loopback to local network for inbound (port-forwarded)
* connections.
*
* Copy "src" to "dst" with ip_addr_set(dst, src), but if "src" is a
* host's loopback address, copy local network address that maps it to
* "dst".
*/
int
{
unsigned int i;
return PXREMAP_ASIS;
}
return PXREMAP_FAILED;
}
#if 0 /* ?TODO: with multiple interfaces we need to consider fwspec::dst */
return PXREMAP_FAILED;
}
#else
netif = netif_list;
#endif
return PXREMAP_MAPPED;
}
}
return PXREMAP_FAILED;
}
static int
{
int i;
/* XXX: TODO: check netif is a proxying netif! */
for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; ++i) {
{
{
return 1;
}
}
}
return 0;
}
/**
* Hook function for nd6_input() - returns true to cause proxy NA
* reply to be generated for "dst".
*/
int
{
}
/**
* Hook function for ip6_forward() - returns true to divert packets to
* "dst" to proxy (instead of forwarding them via "netif" or dropping).
*/
int
{
}
/**
* Mapping from local network to loopback for outbound connections.
*
* Copy "src" to "dst" with ip6_addr_set(dst, src), but if "src" is a
* local network address that maps host's loopback address, copy IPv6
* loopback address to "dst".
*/
int
{
int i;
continue;
}
for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; ++i) {
{
{
return PXREMAP_MAPPED;
}
}
}
}
/* not remapped, just copy src */
return PXREMAP_ASIS;
}
/**
* Mapping from loopback to local network for inbound (port-forwarded)
* connections.
*
* Copy "src" to "dst" with ip6_addr_set(dst, src), but if "src" is a
* host's loopback address, copy local network address that maps it to
* "dst".
*/
int
{
int i;
return PXREMAP_ASIS;
}
#if 0 /* ?TODO: with multiple interfaces we need to consider fwspec::dst */
return PXREMAP_FAILED;
}
#else
netif = netif_list;
#endif
for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; ++i) {
{
return PXREMAP_MAPPED;
}
}
return PXREMAP_FAILED;
}