projects
/
tinc
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Small fixes to allow correct compilation under FreeBSD (tested with 4.3)
[tinc]
/
src
/
net.c
diff --git
a/src/net.c
b/src/net.c
index
ce1d5e9
..
b0d3cd1
100644
(file)
--- a/
src/net.c
+++ b/
src/net.c
@@
-17,7
+17,7
@@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- $Id: net.c,v 1.35.4.10
4 2001/05/04 18:45:02
guus Exp $
+ $Id: net.c,v 1.35.4.10
9 2001/05/28 08:21:43
guus Exp $
*/
#include "config.h"
*/
#include "config.h"
@@
-26,8
+26,10
@@
#include <fcntl.h>
#include <netdb.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <netdb.h>
#include <netinet/in.h>
-#include <netinet/ip.h>
-#include <netinet/tcp.h>
+#ifndef HAVE_FREEBSD
+ #include <netinet/ip.h>
+ #include <netinet/tcp.h>
+#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@
-134,12
+136,12
@@
cp
/* Encrypt the packet. */
/* Encrypt the packet. */
-
outpkt.len = inpkt->len
;
+
RAND_bytes(inpkt->salt, sizeof(inpkt->salt))
;
EVP_EncryptInit(&ctx, cl->cipher_pkttype, cl->cipher_pktkey, cl->cipher_pktkey + cl->cipher_pkttype->key_len);
EVP_EncryptInit(&ctx, cl->cipher_pkttype, cl->cipher_pktkey, cl->cipher_pktkey + cl->cipher_pkttype->key_len);
- EVP_EncryptUpdate(&ctx, outpkt.
data, &outlen, inpkt->data, inpkt->len
);
- EVP_EncryptFinal(&ctx, outpkt.
data
+ outlen, &outpad);
- outlen += outpad
+ 2
;
+ EVP_EncryptUpdate(&ctx, outpkt.
salt, &outlen, inpkt->salt, inpkt->len + sizeof(inpkt->salt)
);
+ EVP_EncryptFinal(&ctx, outpkt.
salt
+ outlen, &outpad);
+ outlen += outpad;
total_socket_out += outlen;
total_socket_out += outlen;
@@
-147,7
+149,7
@@
cp
to.sin_addr.s_addr = htonl(cl->address);
to.sin_port = htons(cl->port);
to.sin_addr.s_addr = htonl(cl->address);
to.sin_port = htons(cl->port);
- if((sendto(myself->socket, (char *)
&(outpkt.len)
, outlen, 0, (const struct sockaddr *)&to, tolen)) < 0)
+ if((sendto(myself->socket, (char *)
outpkt.salt
, outlen, 0, (const struct sockaddr *)&to, tolen)) < 0)
{
syslog(LOG_ERR, _("Error sending packet to %s (%s): %m"),
cl->name, cl->hostname);
{
syslog(LOG_ERR, _("Error sending packet to %s (%s): %m"),
cl->name, cl->hostname);
@@
-172,14
+174,24
@@
void receive_udppacket(connection_t *cl, vpn_packet_t *inpkt)
int outlen, outpad;
EVP_CIPHER_CTX ctx;
cp
int outlen, outpad;
EVP_CIPHER_CTX ctx;
cp
- outpkt.len = inpkt->len;
-
/* Decrypt the packet */
EVP_DecryptInit(&ctx, myself->cipher_pkttype, myself->cipher_pktkey, myself->cipher_pktkey + myself->cipher_pkttype->key_len);
/* Decrypt the packet */
EVP_DecryptInit(&ctx, myself->cipher_pkttype, myself->cipher_pktkey, myself->cipher_pktkey + myself->cipher_pkttype->key_len);
- EVP_DecryptUpdate(&ctx, outpkt.
data, &outlen, inpkt->data, inpkt->len + 8
);
- EVP_DecryptFinal(&ctx, outpkt.
data
+ outlen, &outpad);
+ EVP_DecryptUpdate(&ctx, outpkt.
salt, &outlen, inpkt->salt, inpkt->len
);
+ EVP_DecryptFinal(&ctx, outpkt.
salt
+ outlen, &outpad);
outlen += outpad;
outlen += outpad;
+ outpkt.len = outlen - sizeof(outpkt.salt);
+
+ receive_packet(cl, &outpkt);
+cp
+}
+
+void receive_tcppacket(connection_t *cl, char *buffer, int len)
+{
+ vpn_packet_t outpkt;
+cp
+ outpkt.len = len;
+ memcpy(outpkt.data, buffer, len);
receive_packet(cl, &outpkt);
cp
receive_packet(cl, &outpkt);
cp
@@
-204,7
+216,7
@@
cp
if(write(tap_fd, packet->data - 2, packet->len + 2) < 0)
syslog(LOG_ERR, _("Can't write to ethertap device: %m"));
else
if(write(tap_fd, packet->data - 2, packet->len + 2) < 0)
syslog(LOG_ERR, _("Can't write to ethertap device: %m"));
else
- total_tap_out += packet->len
+ 2
;
+ total_tap_out += packet->len;
}
cp
}
}
cp
}
@@
-286,7
+298,7
@@
cp
{
#ifdef HAVE_LINUX
# ifdef HAVE_TUNTAP
{
#ifdef HAVE_LINUX
# ifdef HAVE_TUNTAP
- tapfname = "/dev/
misc/
net/tun";
+ tapfname = "/dev/net/tun";
# else
tapfname = "/dev/tap0";
# endif
# else
tapfname = "/dev/tap0";
# endif
@@
-373,6
+385,7
@@
cp
option = 1;
setsockopt(nfd, SOL_SOCKET, SO_REUSEADDR, &option, sizeof(option));
setsockopt(nfd, SOL_SOCKET, SO_KEEPALIVE, &option, sizeof(option));
option = 1;
setsockopt(nfd, SOL_SOCKET, SO_REUSEADDR, &option, sizeof(option));
setsockopt(nfd, SOL_SOCKET, SO_KEEPALIVE, &option, sizeof(option));
+#ifndef HAVE_FREEBSD
setsockopt(nfd, SOL_TCP, TCP_NODELAY, &option, sizeof(option));
option = IPTOS_LOWDELAY;
setsockopt(nfd, SOL_TCP, TCP_NODELAY, &option, sizeof(option));
option = IPTOS_LOWDELAY;
@@
-387,6
+400,7
@@
cp
return -1;
}
}
return -1;
}
}
+#endif
memset(&a, 0, sizeof(a));
a.sin_family = AF_INET;
memset(&a, 0, sizeof(a));
a.sin_family = AF_INET;
@@
-501,11
+515,12
@@
cp
option = 1;
setsockopt(cl->meta_socket, SOL_SOCKET, SO_KEEPALIVE, &option, sizeof(option));
option = 1;
setsockopt(cl->meta_socket, SOL_SOCKET, SO_KEEPALIVE, &option, sizeof(option));
+#ifndef HAVE_FREEBSD
setsockopt(cl->meta_socket, SOL_TCP, TCP_NODELAY, &option, sizeof(option));
option = IPTOS_LOWDELAY;
setsockopt(cl->meta_socket, SOL_IP, IP_TOS, &option, sizeof(option));
setsockopt(cl->meta_socket, SOL_TCP, TCP_NODELAY, &option, sizeof(option));
option = IPTOS_LOWDELAY;
setsockopt(cl->meta_socket, SOL_IP, IP_TOS, &option, sizeof(option));
-
+#endif
/* Connect */
a.sin_family = AF_INET;
/* Connect */
a.sin_family = AF_INET;
@@
-576,7
+591,7
@@
cp
return -1;
}
return -1;
}
- ncn->address = ntohl(*((ip_t*)(h->h_addr_list[0])));
+ ncn->address = ntohl(*((ip
v4
_t*)(h->h_addr_list[0])));
ncn->hostname = hostlookup(htonl(ncn->address));
if(setup_outgoing_meta_socket(ncn) < 0)
ncn->hostname = hostlookup(htonl(ncn->address));
if(setup_outgoing_meta_socket(ncn) < 0)
@@
-806,7
+821,7
@@
cp
myself->cipher_pktkeylength = myself->cipher_pkttype->key_len + myself->cipher_pkttype->iv_len;
myself->cipher_pktkey = (char *)xmalloc(myself->cipher_pktkeylength);
myself->cipher_pktkeylength = myself->cipher_pkttype->key_len + myself->cipher_pkttype->iv_len;
myself->cipher_pktkey = (char *)xmalloc(myself->cipher_pktkeylength);
- RAND_bytes(myself->cipher_pktkey, myself->cipher_pktkeylength);
+ RAND_
pseudo_
bytes(myself->cipher_pktkey, myself->cipher_pktkeylength);
if(!(cfg = get_config_val(config, config_keyexpire)))
keylifetime = 3600;
if(!(cfg = get_config_val(config, config_keyexpire)))
keylifetime = 3600;
@@
-849,11
+864,13
@@
cp
cfg = get_config_val(upstreamcfg, config_connectto);
if(!cfg)
cfg = get_config_val(upstreamcfg, config_connectto);
if(!cfg)
- if(upstreamcfg == config)
{
{
- /* No upstream IP given, we're listen only. */
- signal(SIGALRM, SIG_IGN);
- return;
+ if(upstreamcfg == config)
+ {
+ /* No upstream IP given, we're listen only. */
+ signal(SIGALRM, SIG_IGN);
+ return;
+ }
}
else
{
}
else
{
@@
-1046,7
+1063,6
@@
void handle_incoming_vpn_data(void)
{
vpn_packet_t pkt;
int x, l = sizeof(x);
{
vpn_packet_t pkt;
int x, l = sizeof(x);
- int lenin;
struct sockaddr_in from;
socklen_t fromlen = sizeof(from);
connection_t *cl;
struct sockaddr_in from;
socklen_t fromlen = sizeof(from);
connection_t *cl;
@@
-1063,7
+1079,7
@@
cp
return;
}
return;
}
- if((
lenin = recvfrom(myself->socket, (char *) &(pkt.len)
, MTU, 0, (struct sockaddr *)&from, &fromlen)) <= 0)
+ if((
pkt.len = recvfrom(myself->socket, (char *) pkt.salt
, MTU, 0, (struct sockaddr *)&from, &fromlen)) <= 0)
{
syslog(LOG_ERR, _("Receiving packet failed: %m"));
return;
{
syslog(LOG_ERR, _("Receiving packet failed: %m"));
return;
@@
-1077,6
+1093,8
@@
cp
return;
}
return;
}
+ cl->last_ping_time = time(NULL);
+
receive_udppacket(cl, &pkt);
cp
}
receive_udppacket(cl, &pkt);
cp
}
@@
-1149,7
+1167,7
@@
cp
syslog(LOG_NOTICE, _("Trying to re-establish outgoing connection in 5 seconds"));
}
syslog(LOG_NOTICE, _("Trying to re-establish outgoing connection in 5 seconds"));
}
- /*
In
activate */
+ /*
De
activate */
cl->status.active = 0;
cp
cl->status.active = 0;
cp
@@
-1288,7
+1306,7
@@
cp
vp.len = lenin - 2;
}
vp.len = lenin - 2;
}
- total_tap_in +=
leni
n;
+ total_tap_in +=
vp.le
n;
if(lenin < 32)
{
if(lenin < 32)
{