r17667@tombo: nickm | 2008-08-07 15:13:30 -0400

Make the TransPort input code handle IPv6 addresses, I hope.  This code may not compile.  Possibly fix bug 796.


svn:r16459
This commit is contained in:
Nick Mathewson 2008-08-07 19:13:39 +00:00
parent d9601c65e0
commit 48848537bc

View File

@ -1692,9 +1692,9 @@ connection_ap_get_original_destination(edge_connection_t *conn,
{ {
#ifdef TRANS_NETFILTER #ifdef TRANS_NETFILTER
/* Linux 2.4+ */ /* Linux 2.4+ */
struct sockaddr_in orig_dst; struct sockaddr_storage orig_dst;
socklen_t orig_dst_len = sizeof(orig_dst); socklen_t orig_dst_len = sizeof(orig_dst);
char tmpbuf[INET_NTOA_BUF_LEN]; tor_addr_t addr;
if (getsockopt(conn->_base.s, SOL_IP, SO_ORIGINAL_DST, if (getsockopt(conn->_base.s, SOL_IP, SO_ORIGINAL_DST,
(struct sockaddr*)&orig_dst, &orig_dst_len) < 0) { (struct sockaddr*)&orig_dst, &orig_dst_len) < 0) {
@ -1703,16 +1703,17 @@ connection_ap_get_original_destination(edge_connection_t *conn,
return -1; return -1;
} }
tor_inet_ntoa(&orig_dst.sin_addr, tmpbuf, sizeof(tmpbuf)); tor_addr_from_sockaddr(&addr, (struct sockaddr*)&orig_dst, &req->port);
strlcpy(req->address, tmpbuf, sizeof(req->address)); tor_addr_to_str(req->address, &addr, sizeof(req->address), 0);
req->port = ntohs(orig_dst.sin_port);
return 0; return 0;
#elif defined(TRANS_PF) #elif defined(TRANS_PF)
struct sockaddr_in proxy_addr; struct sockaddr_storage proxy_addr;
socklen_t proxy_addr_len = sizeof(proxy_addr); socklen_t proxy_addr_len = sizeof(proxy_addr);
struct sockaddr *proxy_sa = (struct sockaddr*) &proxy_addr;
char tmpbuf[INET_NTOA_BUF_LEN]; char tmpbuf[INET_NTOA_BUF_LEN];
struct pfioc_natlook pnl; struct pfioc_natlook pnl;
tor_addr_t addr;
int pf = -1; int pf = -1;
if (getsockname(conn->_base.s, (struct sockaddr*)&proxy_addr, if (getsockname(conn->_base.s, (struct sockaddr*)&proxy_addr,
@ -1724,13 +1725,28 @@ connection_ap_get_original_destination(edge_connection_t *conn,
} }
memset(&pnl, 0, sizeof(pnl)); memset(&pnl, 0, sizeof(pnl));
pnl.af = AF_INET;
pnl.proto = IPPROTO_TCP; pnl.proto = IPPROTO_TCP;
pnl.direction = PF_OUT; pnl.direction = PF_OUT;
pnl.saddr.v4.s_addr = htonl(conn->_base.addr); if (proxy_sa->sa_family == AF_INET) {
struct sockaddr_in *sin = (struct sockaddr_in *)proxy_sa;
pnl.af = AF_INET;
pnl.saddr.v4.s_addr = tor_addr_to_ipv4n(conn->_base.addr);
pnl.sport = htons(conn->_base.port); pnl.sport = htons(conn->_base.port);
pnl.daddr.v4.s_addr = proxy_addr.sin_addr.s_addr; pnl.daddr.v4.s_addr = sin->sin_addr.s_addr;
pnl.dport = proxy_addr.sin_port; pnl.dport = sin->sin_port;
} else if (proxy_sa->sa_family == AF_INET6) {
struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)proxy_sa;
pnl.af = AF_INET6;
memcpy(&pnl.saddr.v6, tor_addr_to_in6(conn->_base.addr),
sizeof(struct in6_addr));
pnl.sport = htons(conn->_base.port);
memcpy(&pnl.daddr.v6, &sin6->sin6_addr, siszeof(struct in6_addr));
pnl.dport = sin6->sin6_port;
} else {
log_warn(LD_NET, "getsockname() gave an unexpected address family (%d)",
(int)proxy_sa->sa_family);
return -1;
}
pf = get_pf_socket(); pf = get_pf_socket();
if (pf<0) if (pf<0)
@ -1741,8 +1757,16 @@ connection_ap_get_original_destination(edge_connection_t *conn,
return -1; return -1;
} }
tor_inet_ntoa(&pnl.rdaddr.v4, tmpbuf, sizeof(tmpbuf)); if (pnl->af == AF_INET) {
strlcpy(req->address, tmpbuf, sizeof(req->address)); tor_addr_from_ipv4n(&addr, &pnl.rdaddr.v4);
} else if (pnl->af == AF_INET6) {
tor_addr_from_ipv6_bytes(&addr, &pnl.rdaddr.v6.s6_addr);
} else {
tor_fragile_assert();
return -1;
}
tor_addr_to_sring(req->address, &addr, sizeof(req->address), 0);
req->port = ntohs(pnl.rdport); req->port = ntohs(pnl.rdport);
return 0; return 0;