Denis,

I think I see the bug:

/*
 * Should we ping the remote?
 */
static inline void
check_ping_send (struct context *c)
{
  void check_ping_send_dowork (struct context *c);
  if (c->options.ping_send_timeout
      && !c->c2.to_link.len
      && event_timeout_trigger (&c->c2.ping_send_interval,
                                &c->c2.timeval))
    check_ping_send_dowork (c);
}

if c->c2.to_link.len is nonzero (which happens if the outgoing TCP/UDP buffer
is already full) then event_timeout_trigger is not called, meaning that
c->c2.timeval (the earliest wakeup) is not updated.  The solution is probably
to pass the boolean !c->c2.to_link.len as another parm to
event_timeout_trigger so that it can still update c->c2.timeval even if the
outgoing buffer is full.  I will fix in b3.

Thanks for noticing the bug and for coding the instrumentation to isolate it.

James


James Yonan <j...@yonan.net> said:

> Denis,
> 
> That looks like a possible bug in the coarse timer update logic.  The coarse
> timer deals with events scheduled at a resolution denoted by an integer number
> of seconds, such as pings.  A timeout of one year is used as kind of
> "effectively infinite" time interval.  If you see this large timeout, it means
> that the ping event is losing its place in the coarse timer event queue --
> probably a bug.
> 
> James
> 
> Denis Vlasenko <v...@port.imtp.ilyichevsk.odessa.ua> said:
> 
> > I was puzzled why sometimes openvpn ceases to generate
> > '--ping 30' packets. I instrumented it a bit,
> > here is a pseudo-patch:
> > 
> > errlevel.h:
> > +#define D_PING               LOGLEV(4, 0, 0)         /* show --ping
packets */
> > ....
> > -#define D_INTERVAL           LOGLEV(8, 70, M_DEBUG)  /* show interval.h
> debugging info */
> > +#define D_INTERVAL           LOGLEV(4, 70, M_DEBUG)  /* show interval.h
> debugging info */
> > 
> > ping-inline.h: (check_ping_send now will explain why it do not send pings)
> > static inline void
> > check_ping_send (struct context *c)
> > {
> >   void check_ping_send_dowork (struct context *c);
> >   if (!c->options.ping_send_timeout) { msg (D_PING, "PING:
> !c->options.ping_send_timeout"); return; }
> >   if (c->c2.to_link.len) { msg (D_PING, "PING: c->c2.to_link.len <> 0");
> return; }
> >   if (!event_timeout_trigger (&c->c2.ping_send_interval, &c->c2.timeval))
> >     { msg (D_PING, "PING:
> !event_timeout_trigger(%ld,%ld)",(long)(c->c2.ping_send_interval.last),
> (long)c->c2.timeval.tv_sec); return; }
> >     check_ping_send_dowork (c);
> > }
> > 
> > ping.c:check_ping_send_dowork (struct context *c): (log pings)
> > ...
> >    encrypt_sign (c, true);
> > +  msg (D_PING, "PING: SENT");
> > }
> > 
> > forward.c:void single_select (struct context *c): (log large select 
> > timeouts)
> > ...
> >   /*
> >    * Wait for something to happen.
> >    */
> >   c->c2.select_status = 1;      /* this will be our return "status" if
> select doesn't get called */
> >   if (!c->sig->signal_received && !SOCKET_READ_RESIDUAL (c->c2.link_socket))
> >     {
> >       if (check_debug_level (D_SELECT))
> >         show_select_status (c);
> > 
> > +     if(((unsigned long)c->c2.timeval.tv_sec) >= 28) { //vda
> > +       msg(D_PING, "PING: select timeout=%ld", (long)c->c2.timeval.tv_sec);
> > +     }
> >       c->c2.select_status = SELECT (&c->c2.event_wait, &c->c2.timeval);
> >       check_status (c->c2.select_status, "select", NULL, NULL);
> >     }
> > 
> > 
> > With --ping 30, select shall _never_ have timeout>30 secs, right?
> > 
> > I was lucky. Bug struck me soon after I restarted openvpn.
> > Here is the full log:
> > 
> > Fri May 28 22:59:11 2004 Current Parameter Settings:
> > Fri May 28 22:59:11 2004   config = '[UNDEF]'
> > Fri May 28 22:59:11 2004   mode = 0
> > Fri May 28 22:59:11 2004   persist_config = DISABLED
> > Fri May 28 22:59:11 2004   persist_mode = 1
> > Fri May 28 22:59:11 2004   show_ciphers = DISABLED
> > Fri May 28 22:59:11 2004   show_digests = DISABLED
> > Fri May 28 22:59:11 2004   genkey = DISABLED
> > Fri May 28 22:59:11 2004   askpass = DISABLED
> > Fri May 28 22:59:11 2004   show_tls_ciphers = DISABLED
> > Fri May 28 22:59:11 2004   proto = 0
> > Fri May 28 22:59:11 2004   local = '1.1.4.1'
> > Fri May 28 22:59:11 2004   remote_list[0] = {'1.1.4.2', 8002}
> > Fri May 28 22:59:11 2004   remote_random = DISABLED
> > Fri May 28 22:59:11 2004   local_port = 8002
> > Fri May 28 22:59:11 2004   remote_port = 8002
> > Fri May 28 22:59:11 2004   remote_float = DISABLED
> > Fri May 28 22:59:11 2004   ipchange = '[UNDEF]'
> > Fri May 28 22:59:11 2004   bind_local = ENABLED
> > Fri May 28 22:59:11 2004   dev = 'tun'
> > Fri May 28 22:59:11 2004   dev_type = '[UNDEF]'
> > Fri May 28 22:59:11 2004   dev_node = '[UNDEF]'
> > Fri May 28 22:59:11 2004   tun_ipv6 = DISABLED
> > Fri May 28 22:59:11 2004   ifconfig_local = '1.1.5.1'
> > Fri May 28 22:59:11 2004   ifconfig_remote_netmask = '1.1.5.2'
> > Fri May 28 22:59:11 2004   ifconfig_noexec = DISABLED
> > Fri May 28 22:59:11 2004   ifconfig_nowarn = DISABLED
> > Fri May 28 22:59:11 2004   shaper = 0
> > Fri May 28 22:59:11 2004   tun_mtu = 1434
> > Fri May 28 22:59:11 2004   tun_mtu_defined = ENABLED
> > Fri May 28 22:59:11 2004   link_mtu = 1500
> > Fri May 28 22:59:11 2004   link_mtu_defined = DISABLED
> > Fri May 28 22:59:11 2004   tun_mtu_extra = 0
> > Fri May 28 22:59:11 2004   tun_mtu_extra_defined = DISABLED
> > Fri May 28 22:59:11 2004   fragment = 0
> > Fri May 28 22:59:11 2004   mtu_discover_type = -1
> > Fri May 28 22:59:11 2004   mtu_test = 0
> > Fri May 28 22:59:11 2004   mlock = DISABLED
> > Fri May 28 22:59:11 2004   inactivity_timeout = 0
> > Fri May 28 22:59:11 2004   ping_send_timeout = 30
> > Fri May 28 22:59:11 2004   ping_rec_timeout = 0
> > Fri May 28 22:59:11 2004   ping_rec_timeout_action = 0
> > Fri May 28 22:59:11 2004   ping_timer_remote = DISABLED
> > Fri May 28 22:59:11 2004   persist_tun = DISABLED
> > Fri May 28 22:59:11 2004   persist_local_ip = DISABLED
> > Fri May 28 22:59:11 2004   persist_remote_ip = DISABLED
> > Fri May 28 22:59:11 2004   persist_key = DISABLED
> > Fri May 28 22:59:11 2004   mssfix = 1450
> > Fri May 28 22:59:11 2004   passtos = DISABLED
> > Fri May 28 22:59:11 2004   resolve_retry_seconds = 0
> > Fri May 28 22:59:11 2004   connect_retry_seconds = 5
> > Fri May 28 22:59:11 2004   username = '[UNDEF]'
> > Fri May 28 22:59:11 2004   groupname = '[UNDEF]'
> > Fri May 28 22:59:11 2004   chroot_dir = '[UNDEF]'
> > Fri May 28 22:59:11 2004   cd_dir = '[UNDEF]'
> > Fri May 28 22:59:11 2004   writepid = '[UNDEF]'
> > Fri May 28 22:59:11 2004   up_script = '[UNDEF]'
> > Fri May 28 22:59:11 2004   down_script = '[UNDEF]'
> > Fri May 28 22:59:11 2004   up_restart = DISABLED
> > Fri May 28 22:59:11 2004   daemon = DISABLED
> > Fri May 28 22:59:11 2004   inetd = 0
> > Fri May 28 22:59:11 2004   log = DISABLED
> > Fri May 28 22:59:11 2004   nice = 0
> > Fri May 28 22:59:11 2004   verbosity = 4
> > Fri May 28 22:59:11 2004   mute = 0
> > Fri May 28 22:59:11 2004   gremlin = DISABLED
> > Fri May 28 22:59:11 2004   occ = ENABLED
> > Fri May 28 22:59:11 2004   rcvbuf = 65536
> > Fri May 28 22:59:11 2004   sndbuf = 65536
> > Fri May 28 22:59:11 2004   http_proxy_server = '[UNDEF]'
> > Fri May 28 22:59:11 2004   http_proxy_port = 0
> > Fri May 28 22:59:11 2004   http_proxy_auth_method = '[UNDEF]'
> > Fri May 28 22:59:11 2004   http_proxy_auth_file = '[UNDEF]'
> > Fri May 28 22:59:11 2004   http_proxy_retry = DISABLED
> > Fri May 28 22:59:11 2004   socks_proxy_server = '[UNDEF]'
> > Fri May 28 22:59:11 2004   socks_proxy_port = 0
> > Fri May 28 22:59:11 2004   socks_proxy_retry = DISABLED
> > Fri May 28 22:59:11 2004   comp_lzo = DISABLED
> > Fri May 28 22:59:11 2004   comp_lzo_adaptive = ENABLED
> > Fri May 28 22:59:11 2004   route_script = '[UNDEF]'
> > Fri May 28 22:59:11 2004   route_default_gateway = '[UNDEF]'
> > Fri May 28 22:59:11 2004   route_noexec = DISABLED
> > Fri May 28 22:59:11 2004   route_delay = 0
> > Fri May 28 22:59:11 2004   route_delay_defined = DISABLED
> > Fri May 28 22:59:11 2004   shared_secret_file =
'/.local/var/service/ovpn-1/key'
> > Fri May 28 22:59:11 2004   key_direction = 0
> > Fri May 28 22:59:11 2004   ciphername_defined = ENABLED
> > Fri May 28 22:59:11 2004   ciphername = 'BF-CBC'
> > Fri May 28 22:59:11 2004   authname_defined = ENABLED
> > Fri May 28 22:59:11 2004   authname = 'SHA1'
> > Fri May 28 22:59:11 2004   keysize = 0
> > Fri May 28 22:59:11 2004   replay = ENABLED
> > Fri May 28 22:59:11 2004   replay_window = 64
> > Fri May 28 22:59:11 2004   replay_time = 15
> > Fri May 28 22:59:11 2004   packet_id_file = '[UNDEF]'
> > Fri May 28 22:59:11 2004   use_iv = ENABLED
> > Fri May 28 22:59:11 2004   test_crypto = DISABLED
> > Fri May 28 22:59:11 2004   tls_server = DISABLED
> > Fri May 28 22:59:11 2004   tls_client = DISABLED
> > Fri May 28 22:59:11 2004   key_method = 2
> > Fri May 28 22:59:11 2004   ca_file = '[UNDEF]'
> > Fri May 28 22:59:11 2004   dh_file = '[UNDEF]'
> > Fri May 28 22:59:11 2004   cert_file = '[UNDEF]'
> > Fri May 28 22:59:11 2004   priv_key_file = '[UNDEF]'
> > Fri May 28 22:59:11 2004   cipher_list = '[UNDEF]'
> > Fri May 28 22:59:11 2004   tls_verify = '[UNDEF]'
> > Fri May 28 22:59:11 2004   tls_remote = '[UNDEF]'
> > Fri May 28 22:59:11 2004   crl_file = '[UNDEF]'
> > Fri May 28 22:59:11 2004   tls_timeout = 2
> > Fri May 28 22:59:11 2004   renegotiate_bytes = 0
> > Fri May 28 22:59:11 2004   renegotiate_packets = 0
> > Fri May 28 22:59:11 2004   renegotiate_seconds = 3600
> > Fri May 28 22:59:11 2004   handshake_window = 60
> > Fri May 28 22:59:11 2004   transition_window = 3600
> > Fri May 28 22:59:11 2004   single_session = DISABLED
> > Fri May 28 22:59:11 2004   tls_auth_file = '[UNDEF]'
> > Fri May 28 22:59:11 2004   pull = DISABLED
> > Fri May 28 22:59:11 2004   ifconfig_pool_defined = DISABLED
> > Fri May 28 22:59:11 2004   ifconfig_pool_start = 0.0.0.0
> > Fri May 28 22:59:11 2004   ifconfig_pool_end = 0.0.0.0
> > Fri May 28 22:59:11 2004   n_bcast_buf = 256
> > Fri May 28 22:59:11 2004   real_hash_size = 256
> > Fri May 28 22:59:11 2004   virtual_hash_size = 256
> > Fri May 28 22:59:11 2004   client_connect_script = '[UNDEF]'
> > Fri May 28 22:59:11 2004   client_disconnect_script = '[UNDEF]'
> > Fri May 28 22:59:11 2004   client_config_dir = '[UNDEF]'
> > Fri May 28 22:59:11 2004   tmp_dir = '[UNDEF]'
> > Fri May 28 22:59:11 2004   push_ifconfig_defined = DISABLED
> > Fri May 28 22:59:11 2004   push_ifconfig_local = 0.0.0.0
> > Fri May 28 22:59:11 2004   push_ifconfig_remote_netmask = 0.0.0.0
> > Fri May 28 22:59:11 2004   enable_c2c = DISABLED
> > Fri May 28 22:59:11 2004   cf_max = 0
> > Fri May 28 22:59:11 2004   cf_per = 0
> > Fri May 28 22:59:11 2004 OpenVPN 2.0_beta1 i386-pc-linux-gnu [SSL] [LZO]
> built on May 28 2004
> > Fri May 28 22:59:11 2004 Static Encrypt: Cipher 'BF-CBC' initialized with
> 128 bit key
> > Fri May 28 22:59:11 2004 Static Encrypt: Using 160 bit message hash 'SHA1'
> for HMAC authentication
> > Fri May 28 22:59:11 2004 Static Decrypt: Cipher 'BF-CBC' initialized with
> 128 bit key
> > Fri May 28 22:59:11 2004 Static Decrypt: Using 160 bit message hash 'SHA1'
> for HMAC authentication
> > Fri May 28 22:59:11 2004 WARNING: normally if you use --mssfix and/or
> --fragment, you should also set --tun-mtu 1500 (currently it is 1434)
> > Fri May 28 22:59:11 2004 TUN/TAP device tun0 opened
> > Fri May 28 22:59:11 2004 TUN/TAP TX queue length set to 100
> > Fri May 28 22:59:11 2004 /bin/ifconfig tun0 1.1.5.1 pointopoint 1.1.5.2
mtu 1434
> > Fri May 28 22:59:11 2004 Data Channel MTU parms [ L:1478 D:1450 EF:44 EB:0
> ET:0 EL:0 ]
> > Fri May 28 22:59:11 2004 Local Options String: 'V3,dev-type tun,link-mtu
> 1478,tun-mtu 1434,proto UDPv4,ifconfig 1.1.5.2 1.1.5.1,cipher BF-CBC,
> > Fri May 28 22:59:11 2004 Expected Remote Options String: 'V3,dev-type
> tun,link-mtu 1478,tun-mtu 1434,proto UDPv4,ifconfig 1.1.5.1 1.1.5.2,ciph
> > Fri May 28 22:59:11 2004 Local Options hash (VER=V3): '5194cd41'
> > Fri May 28 22:59:11 2004 Expected Remote Options hash (VER=V3): 'e341fa03'
> > Fri May 28 22:59:11 2004 Socket Buffers: R=[110592->131072] 
> > S=[110592->131072]
> > Fri May 28 22:59:11 2004 UDPv4 link local (bound): 1.1.4.1:8002
> > Fri May 28 22:59:11 2004 UDPv4 link remote: 1.1.4.2:8002
> > Fri May 28 22:59:11 2004 EVENT event_timeout_wakeup (2/2)
> > Fri May 28 22:59:11 2004 EVENT event_timeout_trigger (30)
> > Fri May 28 22:59:11 2004 PING: SENT
> > Fri May 28 22:59:11 2004 TIMER: coarse timer wakeup 2 seconds
> > Fri May 28 22:59:11 2004 RANDOM USEC=670225
> > Fri May 28 22:59:11 2004 write UDPv4 []: Network is unreachable (code=101)
> > Fri May 28 22:59:12 2004 write UDPv4 []: Network is unreachable (code=101)
> > Fri May 28 22:59:12 2004 write UDPv4 []: Network is unreachable (code=101)
> > Fri May 28 22:59:12 2004 write UDPv4 []: Network is unreachable (code=101)
> > Fri May 28 22:59:13 2004 EVENT event_timeout_trigger (2)
> > Fri May 28 22:59:13 2004 EVENT event_timeout_wakeup (2/2)
> > Fri May 28 22:59:13 2004 PING: c->c2.to_link.len <> 0
> > Fri May 28 22:59:13 2004 TIMER: coarse timer wakeup 2 seconds
> > Fri May 28 22:59:13 2004 write UDPv4 []: Network is unreachable (code=101)
> > Fri May 28 22:59:15 2004 EVENT event_timeout_trigger (2)
> > Fri May 28 22:59:15 2004 EVENT event_timeout_wakeup (2/2)
> > Fri May 28 22:59:15 2004 PING: c->c2.to_link.len <> 0
> > Fri May 28 22:59:15 2004 TIMER: coarse timer wakeup 2 seconds
> > Fri May 28 22:59:15 2004 Peer Connection Initiated with 1.1.4.2:8002
> > Fri May 28 22:59:18 2004 EVENT event_timeout_trigger (2)
> > Fri May 28 22:59:18 2004 EVENT event_timeout_wakeup (2/2)
> > Fri May 28 22:59:18 2004 PING: !event_timeout_trigger(1085774355,2)
> > Fri May 28 22:59:18 2004 TIMER: coarse timer wakeup 2 seconds
> > Fri May 28 22:59:21 2004 EVENT event_timeout_trigger (10)
> > Fri May 28 22:59:21 2004 EVENT event_timeout_wakeup (10/10)
> > Fri May 28 22:59:21 2004 PING: !event_timeout_trigger(1085774355,10)
> > Fri May 28 22:59:21 2004 TIMER: coarse timer wakeup 10 seconds
> > Fri May 28 22:59:21 2004 RANDOM USEC=682209
> > Fri May 28 22:59:32 2004 EVENT event_timeout_wakeup (27/30)
> > Fri May 28 22:59:32 2004 PING: !event_timeout_trigger(1085774369,27)
> > Fri May 28 22:59:32 2004 TIMER: coarse timer wakeup 27 seconds
> > Fri May 28 22:59:32 2004 RANDOM USEC=168112
> > Fri May 28 22:59:43 2004 RANDOM USEC=310535
> > Fri May 28 22:59:53 2004 RANDOM USEC=567338
> > Fri May 28 22:59:59 2004 PING: c->c2.to_link.len <> 0
> > Fri May 28 22:59:59 2004 TIMER: coarse timer wakeup 31536000 seconds
> > Fri May 28 22:59:59 2004 PING: select timeout=31536000
> > Fri May 28 22:59:59 2004 PING: select timeout=31536000
> > Fri May 28 22:59:59 2004 PING: select timeout=31536000
> > Fri May 28 22:59:59 2004 PING: select timeout=31536000
> > Fri May 28 22:59:59 2004 PING: select timeout=31536000
> > Fri May 28 22:59:59 2004 PING: select timeout=31536000
> > Fri May 28 22:59:59 2004 PING: select timeout=31536000
> > Fri May 28 22:59:59 2004 PING: select timeout=31536000
> > Fri May 28 22:59:59 2004 PING: select timeout=31536000
> > Fri May 28 22:59:59 2004 PING: select timeout=31536000
> > Fri May 28 23:00:04 2004 RANDOM USEC=262969
> > Fri May 28 23:00:04 2004 PING: select timeout=31535995
> > Fri May 28 23:00:04 2004 PING: select timeout=31535995
> > Fri May 28 23:00:04 2004 PING: select timeout=31535995
> > Fri May 28 23:00:04 2004 PING: select timeout=31535995
> > Fri May 28 23:00:10 2004 PING: select timeout=31535989
> > Fri May 28 23:00:10 2004 PING: select timeout=31535989
> > Fri May 28 23:00:10 2004 PING: select timeout=31535989
> > Fri May 28 23:00:10 2004 PING: select timeout=31535989
> > Fri May 28 23:00:10 2004 PING: select timeout=31535989
> > Fri May 28 23:00:10 2004 PING: select timeout=31535989
> > Fri May 28 23:00:10 2004 PING: select timeout=31535989
> > Fri May 28 23:00:10 2004 PING: select timeout=31535989
> > Fri May 28 23:00:10 2004 PING: select timeout=31535989
> > Fri May 28 23:00:10 2004 PING: select timeout=31535989
> > Fri May 28 23:00:14 2004 RANDOM USEC=111391
> > Fri May 28 23:00:14 2004 PING: select timeout=31535985
> > Fri May 28 23:00:14 2004 PING: select timeout=31535985
> > Fri May 28 23:00:14 2004 PING: select timeout=31535985
> > Fri May 28 23:00:14 2004 PING: select timeout=31535985
> > 
> > and so on. openvpn will abstain from sending pings now
> > for eaxctly 365 days (I think :). Further log contains
> > records of two kinds only:
> > 
> > Fri May 28 23:24:36 2004 RANDOM USEC=565465 (random)
> >     and
> > Fri May 28 23:24:36 2004 PING: select timeout=31534523 (counting down)
> > 
> > Here is how I start openvpn:
> > 
> > openvpn \
> >     --secret key \
> >     --dev tun \
> >     --proto udp \
> >     --port 8002 \
> >     --local 1.1.4.1 \
> >     --remote 1.1.4.2 \
> >     --ifconfig 1.1.5.1 1.1.5.2 \
> >     --tun-mtu 1434 \
> >     --ping 30 \
> >     --verb 4 \
> > 
> > NB: I run ntp (strata=3) on this box.
> > --
> > vda
> > 
> > 
> > 
> > -------------------------------------------------------
> > This SF.Net email is sponsored by: Oracle 10g
> > Get certified on the hottest thing ever to hit the market... Oracle 10g. 
> > Take an Oracle 10g class now, and we'll give you the exam FREE.
> > http://ads.osdn.com/?ad_id=3149&alloc_id=8166&op=click
> > _______________________________________________
> > Openvpn-devel mailing list
> > Openvpn-devel@lists.sourceforge.net
> > https://lists.sourceforge.net/lists/listinfo/openvpn-devel
> > 
> 
> 
> 
> -- 
> 
> 
> 
> 
> 
> -------------------------------------------------------
> This SF.Net email is sponsored by: Oracle 10g
> Get certified on the hottest thing ever to hit the market... Oracle 10g. 
> Take an Oracle 10g class now, and we'll give you the exam FREE.
> http://ads.osdn.com/?ad_id=3149&alloc_id=8166&op=click
> _______________________________________________
> Openvpn-devel mailing list
> Openvpn-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/openvpn-devel
> 



-- 




Reply via email to