void t_phone_user::timeout(t_phone_timer timer) { switch (timer) { case PTMR_REGISTRATION: id_registration = 0; // Registration expired. Re-register. if (is_registered || last_reg_failed) { // Re-register if no register is pending if (!r_register) { registration(REG_REGISTER, true, registration_time); } } break; case PTMR_NAT_KEEPALIVE: id_nat_keepalive = 0; // Send a new NAT keepalive packet if (use_nat_keepalive) { send_nat_keepalive(); phone->start_timer(PTMR_NAT_KEEPALIVE, this); } break; case PTMR_TCP_PING: id_tcp_ping = 0; // Send a TCP ping; if (user_config->get_persistent_tcp()) { send_tcp_ping(); phone->start_timer(PTMR_TCP_PING, this); } break; default: assert(false); } }
void t_phone_user::sync_nat_keepalive(void) { if (user_config->get_enable_nat_keepalive() && !id_nat_keepalive) { send_nat_keepalive(); phone->start_timer(PTMR_NAT_KEEPALIVE, this); } }
void *sender_loop(void *arg) { t_event *event; t_event_network *ev_network; unsigned long local_ipaddr; bool quit = false; while (!quit) { event = evq_sender->pop(); switch(event->get_type()) { case EV_NETWORK: ev_network = dynamic_cast<t_event_network *>(event); local_ipaddr = get_src_ip4_address_for_dst(ev_network->dst_addr); if (local_ipaddr == 0) { log_file->write_header("::sender_loop", LOG_NORMAL, LOG_CRITICAL); log_file->write_raw("Cannot get source IP address for destination: "); log_file->write_raw(h_ip2str(ev_network->dst_addr)); log_file->write_endl(); log_file->write_footer(); evq_trans_mgr->push_failure(FAIL_TRANSPORT, ev_network->get_msg()->hdr_via.via_list.front().branch, ev_network->get_msg()->hdr_cseq.method); break; } if (!ev_network->get_msg()->local_ip_check()) { log_file->write_report("Local IP check failed", "::sender_loop", LOG_NORMAL, LOG_CRITICAL); break; } if (ev_network->transport == "udp") { send_sip_udp(event); } else if (ev_network->transport == "tcp") { send_sip_tcp(event); } else { log_file->write_header("::sender_loop", LOG_NORMAL, LOG_WARNING); log_file->write_raw("Received unsupported transport: "); log_file->write_raw(ev_network->transport); log_file->write_endl(); log_file->write_footer(); } break; case EV_STUN_REQUEST: send_stun(event); break; case EV_NAT_KEEPALIVE: send_nat_keepalive(event); break; case EV_TCP_PING: send_tcp_ping(event); break; case EV_QUIT: quit = true; break; default: assert(false); } MEMMAN_DELETE(event); delete event; } return NULL; }