void Pro_Link_Recv_Hook(ProHeader *header) { ProHeader *p2header; static ACK_Session_Tab * ack_session = Get_ACK_Session_Tab(); static CMD_Session_Tab * cmd_session = Get_CMD_Session_Tab(); //TODO: parse the protocol data stream here if(header->is_ack == 1) { if(header->session_id == 1) { if(cmd_session[1].usage_flag == 1 && cmd_session[1].ack_callback) { cmd_session[1].ack_callback(header); Get_Memory_Lock(); Free_CMD_Session(&cmd_session[1]); Free_Memory_Lock(); } } else if(header->session_id > 1 && header->session_id < 32) { if(cmd_session[header->session_id].usage_flag == 1) { Get_Memory_Lock(); p2header = (ProHeader*)cmd_session[header->session_id].mmu->pmem; if(p2header->session_id == header->session_id && p2header->sequence_number == header->sequence_number) { //printf("%s:Recv Session %d ACK\n",__func__,p2header->session_id); Call_APP_Func = cmd_session[header->session_id].ack_callback; Free_CMD_Session(&cmd_session[header->session_id]); Free_Memory_Lock(); if(Call_APP_Func) { Call_APP_Func(header); } } else { Free_Memory_Lock(); } } } } else { //TODO,is a request package switch(header->session_id) { case 0: Pro_Request_Interface(header); break; case 1: default: if(ack_session[header->session_id - 1].session_status == ACK_SESSION_PROCESS) { printf("%s,This session is waiting for App ack:" "session id=%d,seq_num=%d\n",__func__, header->session_id,header->sequence_number); } else if(ack_session[header->session_id - 1].session_status == ACK_SESSION_IDLE) { if(header->session_id > 1) { ack_session[header->session_id - 1].session_status = ACK_SESSION_PROCESS; } Pro_Request_Interface(header); } else if(ack_session[header->session_id - 1].session_status == ACK_SESSION_USING) { Get_Memory_Lock(); p2header = (ProHeader *)ack_session[header->session_id - 1].mmu->pmem; if(p2header->sequence_number == header->sequence_number) { printf("%s:repeat ACK to remote,session id=%d,seq_num=%d\n", __func__,header->session_id,header->sequence_number); Send_Pro_Data(ack_session[header->session_id - 1].mmu->pmem); Free_Memory_Lock(); } else { printf("%s:same session,but new seq_num pkg,session id=%d," "pre seq_num=%d,""cur seq_num=%d\n",__func__, header->session_id,p2header->sequence_number, header->sequence_number); ack_session[header->session_id - 1].session_status = ACK_SESSION_PROCESS; Free_Memory_Lock(); Pro_Request_Interface(header); } } break; } } }
void Pro_Link_Recv_Hook(ProHeader *header) { unsigned char i; ProHeader *p2header; Ack_Session_Queue *p2acksession; //TODO: parse the protocol data stream here if(header->is_ack == 1) { if(header->session_id == 1) { printf("%s:Recv Session 1 ACK\n",__func__); if(Send_Session_Common_Tab.usage_flag == 1 && Send_Session_Common_Tab.ack_callback) { Send_Session_Common_Tab.ack_callback(header); } } else if(header->session_id > 1 && header->session_id < 32) { pthread_mutex_lock(&send_lock); for(i = 0 ; i < SESSION_AND_MEM_COUNT ; i ++) { if(Send_Session_Tab[i].usage_flag == 1) { p2header = (ProHeader*)Send_Session_Tab[i].mmu->start_addr; if(p2header->session_id == header->session_id && p2header->sequence_number == header->sequence_number) { printf("%s:Recv Session %d ACK\n",__func__,p2header->session_id); Send_Session_Tab[i].ack_callback(header); Free_Send_Session(&Send_Session_Tab[i]); break; } } } pthread_mutex_unlock(&send_lock); } } else { //TODO,is a request package switch(header->session_id) { case 0: Pro_Request_Interface(header); break; case 1: default: p2acksession = Search_Ack_Session(header->session_id); if(p2acksession) { if(p2acksession->session_status == ACK_SESSION_PROCESS) { printf("%s,This session is waiting for App ack:" "session id=%d,seq_num=%d\n",__func__, header->session_id,header->sequence_number); } else if(p2acksession->session_status == ACK_SESSION_IDLE) { if(header->session_id > 1) { p2acksession->session_status = ACK_SESSION_PROCESS; } Pro_Request_Interface(header); } else if(p2acksession->session_status == ACK_SESSION_USING) { p2header = (ProHeader *)p2acksession->mmu->start_addr; if(p2header->sequence_number == header->sequence_number) { printf("%s:repeat ACK to remote,session id=%d,seq_num=%d\n", __func__,header->session_id,header->sequence_number); pthread_mutex_lock(&send_lock); Send_Pro_Data((unsigned char*)p2acksession->mmu->start_addr); pthread_mutex_unlock(&send_lock); } else { printf("%s:same session,but new seq_num pkg,session id=%d," "pre seq_num=%d,""cur seq_num=%d\n",__func__, header->session_id,p2header->sequence_number, header->sequence_number); p2acksession->session_status = ACK_SESSION_PROCESS; Pro_Request_Interface(header); } } } break; } } }