rfe2636157 - Permit a delayed UDP connection to overcome unpredictable

NAT ports.
This commit is contained in:
mtbishop
2009-03-29 10:08:41 +00:00
parent cb03b8fa9a
commit 66658236a7
12 changed files with 7897 additions and 12 deletions

View File

@@ -17,7 +17,7 @@
*/
/*
* $Id: udp_proto.c,v 1.10.2.2 2008/01/07 22:36:19 mtbishop Exp $
* $Id: udp_proto.c,v 1.10.2.3 2009/03/29 10:09:13 mtbishop Exp $
*/
#include "config.h"
@@ -56,12 +56,16 @@
#include "vtun.h"
#include "lib.h"
extern int is_rmt_fd_connected;
/* Functions to read/write UDP frames. */
int udp_write(int fd, char *buf, int len)
{
register char *ptr;
register int wlen;
if (!is_rmt_fd_connected) return 0;
ptr = buf - sizeof(short);
*((unsigned short *)ptr) = htons(len);
@@ -86,7 +90,25 @@ int udp_read(int fd, char *buf)
unsigned short hdr, flen;
struct iovec iv[2];
register int rlen;
struct sockaddr_in from;
socklen_t fromlen = sizeof(struct sockaddr);
/* Late connect (NAT hack enabled) */
if (!is_rmt_fd_connected) {
while( 1 ){
if( (rlen = recvfrom(fd,buf,2,MSG_PEEK,(struct sockaddr *)&from,&fromlen)) < 0 ){
if( errno == EAGAIN || errno == EINTR ) continue;
else return rlen;
}
else break;
}
if( connect(fd,(struct sockaddr *)&from,fromlen) ){
vtun_syslog(LOG_ERR,"Can't connect socket");
return -1;
}
is_rmt_fd_connected = 1;
}
/* Read frame */
iv[0].iov_len = sizeof(short);
iv[0].iov_base = (char *) &hdr;