/*
net_packet.c -- Handles in- and outgoing VPN packets
- Copyright (C) 1998-2002 Ivo Timmermans <itimmermans@bigfoot.com>,
- 2000-2002 Guus Sliepen <guus@sliepen.warande.net>
+ Copyright (C) 1998-2002 Ivo Timmermans <ivo@o2w.nl>,
+ 2000-2002 Guus Sliepen <guus@sliepen.eu.org>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- $Id: net_packet.c,v 1.1.2.11 2002/03/18 22:47:20 guus Exp $
+ $Id: net_packet.c,v 1.1.2.21 2002/09/09 19:39:58 guus Exp $
*/
#include "config.h"
#include <fcntl.h>
#include <netdb.h>
#include <netinet/in.h>
-#ifdef HAVE_LINUX
+#ifdef HAVE_NETINET_IN_SYSTM_H
+ #include <netinet/in_systm.h>
+#endif
+#ifdef HAVE_NETINET_IP_H
#include <netinet/ip.h>
+#endif
+#ifdef HAVE_NETINET_TCP_H
#include <netinet/tcp.h>
#endif
#include <stdio.h>
#include <openssl/pem.h>
#include <openssl/hmac.h>
-#ifndef HAVE_RAND_PSEUDO_BYTES
-#define RAND_pseudo_bytes RAND_bytes
-#endif
-
#include <zlib.h>
#include <utils.h>
long int complen = MTU + 12;
EVP_CIPHER_CTX ctx;
char hmac[EVP_MAX_MD_SIZE];
-cp
+ cp();
/* Check the message authentication code */
if(myself->digest && myself->maclength)
}
receive_packet(n, inpkt);
-cp
+ cp();
}
void receive_tcppacket(connection_t *c, char *buffer, int len)
{
vpn_packet_t outpkt;
-cp
+ cp();
outpkt.len = len;
memcpy(outpkt.data, buffer, len);
receive_packet(c->node, &outpkt);
-cp
+ cp();
}
void receive_packet(node_t *n, vpn_packet_t *packet)
{
-cp
+ cp();
if(debug_lvl >= DEBUG_TRAFFIC)
syslog(LOG_DEBUG, _("Received packet of %d bytes from %s (%s)"), packet->len, n->name, n->hostname);
route_incoming(n, packet);
-cp
+ cp();
}
void send_udppacket(node_t *n, vpn_packet_t *inpkt)
static int priority = 0;
int origpriority;
int sock;
-cp
+ cp();
/* Make sure we have a valid key */
if(!n->status.validkey)
list_insert_tail(n->queue, copy);
+ if(n->queue->count > MAXQUEUELENGTH)
+ list_delete_head(n->queue);
+
if(!n->status.waitingforkey)
send_req_key(n->nexthop->connection, myself, n);
+ n->status.waitingforkey = 1;
+
return;
}
}
inpkt->len = origlen;
-cp
+ cp();
}
/*
void send_packet(node_t *n, vpn_packet_t *packet)
{
node_t *via;
-cp
+ cp();
if(debug_lvl >= DEBUG_TRAFFIC)
syslog(LOG_ERR, _("Sending packet of %d bytes to %s (%s)"),
packet->len, n->name, n->hostname);
{
avl_node_t *node;
connection_t *c;
-cp
+ cp();
if(debug_lvl >= DEBUG_TRAFFIC)
syslog(LOG_INFO, _("Broadcasting packet of %d bytes from %s (%s)"),
packet->len, from->name, from->hostname);
if(c->status.active && c->status.mst && c != from->nexthop->connection)
send_packet(c->node, packet);
}
-cp
+ cp();
}
void flush_queue(node_t *n)
{
list_node_t *node, *next;
-cp
+ cp();
if(debug_lvl >= DEBUG_TRAFFIC)
syslog(LOG_INFO, _("Flushing queue for %s (%s)"), n->name, n->hostname);
send_udppacket(n, (vpn_packet_t *)node->data);
list_delete_node(n->queue, node);
}
-cp
+ cp();
}
void handle_incoming_vpn_data(int sock)
sockaddr_t from;
socklen_t fromlen = sizeof(from);
node_t *n;
-cp
+ cp();
if(getsockopt(sock, SOL_SOCKET, SO_ERROR, &x, &l) < 0)
{
syslog(LOG_ERR, _("This is a bug: %s:%d: %d:%s"),
return;
}
- if((pkt.len = recvfrom(sock, (char *)&pkt.seqno, MAXSIZE, 0, &from.sa, &fromlen)) <= 0)
+ pkt.len = recvfrom(sock, (char *)&pkt.seqno, MAXSIZE, 0, &from.sa, &fromlen);
+
+ if(pkt.len <= 0)
{
syslog(LOG_ERR, _("Receiving packet failed: %s"), strerror(errno));
return;
n->connection->last_ping_time = now;
receive_udppacket(n, &pkt);
-cp
+ cp();
}
-