--- gvpe/src/connection.C 2008/08/07 16:34:21 1.67 +++ gvpe/src/connection.C 2008/08/07 17:54:26 1.69 @@ -1,22 +1,32 @@ /* connection.C -- manage a single connection - Copyright (C) 2003-2005 Marc Lehmann + Copyright (C) 2003-2008 Marc Lehmann This file is part of GVPE. - GVPE is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with gvpe; if not, write to the Free Software - Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + GVPE is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 3 of the License, or (at your + option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, see . + + Additional permission under GNU GPL version 3 section 7 + + If you modify this Program, or any covered work, by linking or + combining it with the OpenSSL project's OpenSSL library (or a modified + version of that library), containing parts covered by the terms of the + OpenSSL or SSLeay licenses, the licensors of this Program grant you + additional permission to convey the resulting work. Corresponding + Source for a non-source form of such a combination shall include the + source code for the parts of OpenSSL used as well as that of the + covered work. */ #include "config.h" @@ -795,6 +805,8 @@ return; } + last_establish_attempt = ev_now (); + ev::tstamp retry_int = ev::tstamp (retry_cnt & 3 ? (retry_cnt & 3) + 1 : 1 << (retry_cnt >> 2)); @@ -827,7 +839,7 @@ } } - retry_int *= slow ? 8. : 0.7; + retry_int *= slow ? 8. : 0.9; if (retry_int < conf->max_retry) retry_cnt++; @@ -907,16 +919,24 @@ } void -connection::inject_data_packet (tap_packet *pkt, bool broadcast/*TODO DDD*/) +connection::post_inject_queue () +{ + // force a connection every now and when when packets are sent (max 1/s) + if (ev_now () - last_establish_attempt >= 0.95) // arbitrary + establish_connection.stop (); + + establish_connection (); +} + +void +connection::inject_data_packet (tap_packet *pkt) { if (ictx && octx) send_data_packet (pkt); else { - if (!broadcast) - data_queue.put (new tap_packet (*pkt)); - - establish_connection (); + data_queue.put (new tap_packet (*pkt)); + post_inject_queue (); } } @@ -927,8 +947,7 @@ else { vpn_queue.put ((vpn_packet *)new data_packet (*(data_packet *)pkt)); - - establish_connection (); + post_inject_queue (); } } @@ -1317,8 +1336,8 @@ keepalive .set (this); establish_connection.set (this); + last_establish_attempt = 0.; octx = ictx = 0; - retry_cnt = 0; if (!conf->protocols) // make sure some protocol is enabled conf->protocols = PROT_UDPv4; @@ -1327,11 +1346,7 @@ // queue a dummy packet to force an initial connection attempt if (connectmode != conf_node::C_ALWAYS && connectmode != conf_node::C_DISABLED) - { - net_packet *p = new net_packet; - p->len = 0; - vpn_queue.put (p); - } + vpn_queue.put (new net_packet); reset_connection (); }