/* * Copyright (C) James R. Leu 2000 * jleu@mindspring.com * * This software is covered under the LGPL, for more * info check out http://www.gnu.org/copyleft/lgpl.html */ #include "ldp_struct.h" #include "ldp_assert.h" #include "ldp_msg.h" #include "ldp_nortel.h" #include "ldp_pdu.h" #include "ldp_keepalive.h" #include "ldp_session.h" #include "ldp_pdu_setup.h" #include "ldp_socket_impl.h" #include "ldp_timer_impl.h" #include "ldp_lock_impl.h" #include "ldp_trace_impl.h" void ldp_keepalive_timeout_callback(ldp_timer_handle timer,void* extra, ldp_cfg_handle g) { ldp_session* s = (ldp_session*)extra; LDP_TRACE_LOG(g->user_data,LDP_TRACE_STATE_ALL,LDP_TRACE_FLAG_TIMER, "Keepalive Timeout fired: session(%d)\n",s->index); ldp_lock_get(g->global_lock); ldp_session_shutdown(g,s,0); LDP_REFCNT_RELEASE(s,ldp_session_delete); ldp_lock_release(g->global_lock); } void ldp_keepalive_send_callback(ldp_timer_handle timer,void* extra, ldp_cfg_handle g) { ldp_session* s = (ldp_session*)extra; LDP_TRACE_LOG(g->user_data,LDP_TRACE_STATE_ALL,LDP_TRACE_FLAG_TIMER, "Keepalive Send fired: session(%d)\n",s->index); ldp_lock_get(g->global_lock); ldp_keepalive_send(g,s); ldp_lock_release(g->global_lock); } ldp_msg* ldp_keepalive_create(uint32_t msgid) { ldp_msg* msg = NULL; msg = ldp_msg_create(MPLS_KEEPAL_MSGTYPE,msgid); return msg; } ldp_return_enum ldp_keepalive_set_message_id(ldp_msg* msg,uint32_t msgid) { mplsLdpKeepAlMsg_t *keep = (mplsLdpKeepAlMsg_t*)msg; if(keep != NULL) { setBaseMsgId(&(keep->baseMsg),msgid); return LDP_SUCCESS; } return LDP_FAILURE; } ldp_return_enum ldp_keepalive_send(ldp_global* g,ldp_session* s) { ldp_entity* e = NULL; int duration = 0; LDP_ASSERT(s != NULL && (e = s->entity) != NULL); if(s->keepalive == NULL) { if((s->keepalive = ldp_keepalive_create(g->message_identifier++)) == NULL) { LDP_TRACE_LOG(g->user_data,LDP_TRACE_STATE_ALL,LDP_TRACE_FLAG_ERROR, "ldp_keepalive_send: error creating keepalve\n"); return LDP_FAILURE; } } else { ldp_keepalive_set_message_id(s->keepalive,g->message_identifier++); } if(ldp_timer_handle_verify(g->timer_handle,s->keepalive_recv_timer) == LDP_FALSE) { LDP_REFCNT_HOLD(s); s->keepalive_recv_timer = ldp_timer_create(g->timer_handle,LDP_SEC, s->oper_keepalive,(void*)s,g,ldp_keepalive_timeout_callback); if(ldp_timer_handle_verify(g->timer_handle,s->keepalive_recv_timer) == LDP_FALSE) { LDP_REFCNT_RELEASE(s,ldp_session_delete); LDP_TRACE_LOG(g->user_data,LDP_TRACE_STATE_ALL,LDP_TRACE_FLAG_ERROR, "ldp_keepalive_send: error creating timer\n"); return LDP_FAILURE; } ldp_timer_start(g->timer_handle,s->keepalive_recv_timer,LDP_ONESHOT); } if(ldp_timer_handle_verify(g->timer_handle,s->keepalive_send_timer) == LDP_FALSE) { duration = e->keepalive_interval; LDP_REFCNT_HOLD(s); s->keepalive_send_timer = ldp_timer_create(g->timer_handle,LDP_SEC, duration,(void*)s,g,ldp_keepalive_send_callback); if(ldp_timer_handle_verify(g->timer_handle,s->keepalive_send_timer) == LDP_FALSE) { LDP_REFCNT_RELEASE(s,ldp_session_delete); LDP_TRACE_LOG(g->user_data,LDP_TRACE_STATE_ALL,LDP_TRACE_FLAG_ERROR, "ldp_keepalive_send: error creating timer\n"); return LDP_FAILURE; } ldp_timer_start(g->timer_handle,s->keepalive_send_timer,LDP_REOCCURRING); } LDP_TRACE_LOG(g->user_data,LDP_TRACE_STATE_SEND,LDP_TRACE_FLAG_PERIODIC, "Keepalive Send: session(%d)\n",s->index); ldp_msg_send_tcp(g,s,s->keepalive); return LDP_SUCCESS; } ldp_return_enum ldp_keepalive_process(ldp_global* g,ldp_session* s,ldp_msg* msg) { LDP_ASSERT(0); return LDP_FAILURE; }