Beispiel #1
0
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;
		}
	}
}
Beispiel #2
0
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;
		}
	}
}