亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? message.cpp

?? 基于Nuleus操作系統和s3c4510的編寫的EFC。已經包含了該EFC的設計說明。這是個實際產品的代碼
?? CPP
?? 第 1 頁 / 共 5 頁
字號:

///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2003, Ulink Telecom Equipment Co., Ltd. All rights reserved.
//
// File:
//
//    Message.cpp
//
// Abstract:
//
//    implementation of the CMessage class.
//
// History:
//
//    V1.0	2002-12-17	Alex Duan	Original version.
//    V1.1	2003-07-25	Alex Duan	Add session for every connection
//    V1.2	2003-09-01	Alex Duan	Fixed the Receive's bug: overflow possibly.
//    V1.3	2003-10-29	Alex Duan	Add UARTSETTING for two uart ports
//    V1.4	2003-11-12	Alex Duan	Replace >>/<< with OnSaveData/OnLoadData
//	  V1.5  2004-01-29  Lianxi Zhu  Save Level when user modified password
//									Do not modify Level when user logout
//	  V1.6  2006-09-11	Bozhong Xu  Rename SendHdlc to SendToHdlc
//									Rename SendConsole to SendToConsole
//									Rename SendHdlcQueue to PutMsgToHdlcQueue
//									Rename GetHdlcQueue to GetMsgFromHdlcQueue
//									Rename GetIsCurSocket to GetSocketIndex
//									Rename GetUsableRes to GetUserIndex
//									Modified IsLocalCmd implementation
//									Modified RemoCommandTask implementation
//									Add virtual function DisposeRemoteCmd 
///////////////////////////////////////////////////////////////////////////////
#ifdef __EFC_MASTER // Added by xbz

#include "efc.h"

#include "Message.h"
#include "APPCORE.H"
#include "FlashFile.h"
#include "AsyInterface.h"
#include "SynInterface.h"
#include "LanInterface.h"
#include "OptInterface.h"
#include "fal.h"
#include "tftpdefc.h"
#include "tftpextc.h"
#include "xyModem.h"

extern "C" 
{
	// the following two functions are used to reset (defined in init.s)
	void INT_Initialize(void); // restart from current code of DRAM
	void Reset_Handler(void); // restart from code of FLASH
}

///////////////////////////////////////////////////////////////////////////////
// CMessage

IMPLEMENT_DYNAMIC(CMessage, CRTObject)

///////////////////////////////////////////////////////////////////////////////
// System Limits : this limits only used in Message
#define LIUPORTCOUNT_MAX	8
#define BOARDCOUNT_MAX		16

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
UINT SESSION::nTimeout = 0;
CMessage::CMessage()
{	
	m_pcdDevice = GetApp()->GetDevice();
	m_pceEventLog = GetApp()->GetEventLog();
	m_pcuUser = GetApp()->GetUser();
	m_pcqQueueRece = NULL;
	m_pcqQueueSend = NULL;
	memset(m_muUsers, 0, sizeof(m_muUsers));
	
	//add by bella yu 2004/08/23
//	m_bModerm_r = FALSE;
//	m_bModerm_t = FALSE;	
//	InitModermStru();	
//	m_bConsole = TRUE;
//	m_bUpbackApp = FALSE;
	m_pBuff.dwSize = 0;
	m_pBuff.puBuff = NULL;
	m_pBuff.bEnd = FALSE;
	// default uart setting
	for (int i = 0; i < 2; i++)
	{
		m_usUart[i].uPort      = i;
		m_usUart[i].dwBaudRate = 9600;
		m_usUart[i].uDataBits  = 8;
		m_usUart[i].uParity    = 0;
		m_usUart[i].uStopBits  = 1;
	}

	ASSERT(m_pcdDevice);
	ASSERT(m_pceEventLog);
	ASSERT(m_pcuUser);

	SetSectionString("Message");
	
	m_dwLength = 0;
	m_bModemUsing = FALSE;
}

CMessage::~CMessage()
{
}

///////////////////////////////////////////////////////////////////////////////
// Parameters:
//		mRecv	[in]MESSAGE object received.
// Return Value:
//		TRUE if the message requires local disposing, other FALSE.
// Remarks:
//		Does the command require local disposing?
BOOL CMessage::IsLocalCmd(const MESSAGE &mRecv) const
{// Modified by Bozhong Xu in 2007.5.17
	ADDR aLocalAddr;
	ASSERT(m_pcdDevice);
	m_pcdDevice->GetAddr(aLocalAddr);

	return ((mRecv.aDesAddr == aLocalAddr) 
		|| (mRecv.aDesAddr == mRecv.aSrcAddr) 
		|| (mRecv.uCmdID == CMD_MSGMODE));
}
///////////////////////////////////////////////////////////////////////////////
// Parameters:
//		
// Return Value:
//		TRUE : send to console
//		FALSE: send to HDLC 
// Remarks:
//		
BOOL CMessage::IsReturnCmd(const MESSAGE &mSend) const
{
	BOOL bRetVal = FALSE;
//	ADDR aLocalAddr;
//	ASSERT(m_pcdDevice);
//	m_pcdDevice->GetAddr(aLocalAddr);
//	if (mSend.uCmdID == CMD_MSGMODE || mSend.aDesAddr == aLocalAddr)
//		bRetVal = TRUE;
	if (mSend.aDesAddr == mSend.aSrcAddr)
		bRetVal = TRUE;
	return bRetVal;
}
///////////////////////////////////////////////////////////////////////////////
// Parameters:
//		uByte	The value to be received.
//		rfFlag	Receiving flag
//		mRecv	Received MESSAGE object.
// Return Values:
//		TRUE if a full message has been received, otherwise FALSE.
// Remarks:
//		Receive one byte data.
BOOL CMessage::Receive(BYTE uByte, SRecvFlag &rfFlag, MESSAGE &mRecv)
{
	BOOL bRetVal = FALSE;
	BYTE *arByte = (BYTE*)&mRecv;

	if (rfFlag.nCount >= MESSAGE_HEADER_SIZE)
	{// The MESSAGE_HEADER has been received.
		WORD nNewLen = MAKEWORD(mRecv.uLength, mRecv.uPacket);
		if (rfFlag.nCount == MESSAGE_HEADER_SIZE)
		{
			// Allocate memory for the data_field and check_sum of the message
			ASSERT(MESSAGE_FRAME_SIZE <= nNewLen && nNewLen <= WORD_MAX);
			if (mRecv.puData != NULL)
			{
				delete[] mRecv.puData;
				mRecv.puData = NULL;
			}
//			if (nNewLen > MESSAGE_FRAME_SIZE)
//			{// New length includes checksum and a byte of redundancy used when
			 //   rfFlag.nCount == nNewLen but uByte != EOM.
				mRecv.puData = new BYTE[nNewLen - MESSAGE_HEADER_SIZE + 1];
				ASSERT(mRecv.puData);
//			}

		}
		else if (rfFlag.nCount > nNewLen) 
		{// overflow
			rfFlag.bStarted = FALSE;
			rfFlag.bPrevSOM = FALSE;
			rfFlag.nCount	= 0;
		}
		arByte = mRecv.puData - MESSAGE_HEADER_SIZE;
	}
	if (uByte == SOM)
	{
		if (rfFlag.bStarted)
		{// has started
			if (rfFlag.bPrevSOM)
			{
				arByte[rfFlag.nCount++] = uByte;
				rfFlag.bPrevSOM = FALSE;
			}
			else
			{
				rfFlag.bPrevSOM = TRUE;
			}
		}
		else
		{
			rfFlag.bStarted = TRUE;
			rfFlag.bPrevSOM = FALSE;
			rfFlag.nCount	= 0;
		}
	}
	else if (rfFlag.bPrevSOM && uByte == EOM)
	{
		mRecv.uCheckSum = arByte[rfFlag.nCount - 1];
		rfFlag.bStarted = FALSE;
		rfFlag.bPrevSOM = FALSE;
		rfFlag.nCount	= 0;
		bRetVal			= TRUE;
	}
	else
	{
		///////////////////////////////////////////////////////////////////////
		// new start_flag
		if (rfFlag.bPrevSOM) 
		{
			rfFlag.bStarted = FALSE; // Modified from TRUE by xbz in 2007.7.4
			rfFlag.bPrevSOM = FALSE;
			rfFlag.nCount	= 0;
		}
		///////////////////////////////////////////////////////////////////////
		
		if (rfFlag.bStarted)
		{
			arByte[rfFlag.nCount++] = uByte;
		}
	}
	return bRetVal;
}

///////////////////////////////////////////////////////////////////////////////
// Parameters:
//		mSend	[in]Hold a frame of MESSAGE to be sent.
// Remarks:
//		Send a frame of message from uart
#define uart_PutByte(ch)	uart4510_PutByte(0, ch, TRUE)
void CMessage::UartSend(const MESSAGE &mSend) const
{
	int i;
	BYTE *pByte = (BYTE*)&mSend;
	
	VERIFY(uart_PutByte(SOM));
	for (i = 0; i < MESSAGE_HEADER_SIZE; i++)
	{
		if (*pByte == SOM)
		{
			VERIFY(uart_PutByte(SOM));
		}
		VERIFY(uart_PutByte(*pByte));
		pByte++;
	}
	for (i = 0; i < mSend.GetDataLength(); i++)
	{
		if (mSend.puData[i] == SOM)
		{
			VERIFY(uart_PutByte(SOM));
		}
		VERIFY(uart_PutByte(mSend.puData[i]));
	}
	if (mSend.uCheckSum == SOM)
	{
		VERIFY(uart_PutByte(SOM));
	}
	VERIFY(uart_PutByte(mSend.uCheckSum));
	VERIFY(uart_PutByte(SOM));
	VERIFY(uart_PutByte(EOM));
}

///////////////////////////////////////////////////////////////////////////////
// Parameters:
//		mSend	[in]Hold a frame of MESSAGE to be sent.
//		sockfd	Socket descriptor.
// Remarks:
//		Send a frame of message from net
#define net_PutByte(pch)	NU_Send(sockfd, (char*)(pch), 1, 0)
void CMessage::NetSend(const MESSAGE &mSend, int sockfd) const
{
	UINT i;
	BYTE *pByte = (BYTE*)&mSend;
	BYTE uSOM = SOM;
	BYTE uEOM = EOM;

	VERIFY(net_PutByte(&uSOM) == 1);
	for (i = 0; i < MESSAGE_HEADER_SIZE; i++)
	{
		if (*pByte == SOM)
		{
			VERIFY(net_PutByte(&uSOM) == 1);
		}
		VERIFY(net_PutByte(pByte) == 1);
		pByte++;
	}
	for (i = 0; i < mSend.GetDataLength(); i++)
	{
		if (mSend.puData[i] == SOM)
		{
			VERIFY(net_PutByte(&uSOM) == 1);
		}
		VERIFY(net_PutByte(&mSend.puData[i]) == 1);
	}
	if (mSend.uCheckSum == SOM)
	{
		VERIFY(net_PutByte(&uSOM) == 1);
	}
	VERIFY(net_PutByte(&mSend.uCheckSum) == 1);
	VERIFY(net_PutByte(&uSOM) == 1);
	VERIFY(net_PutByte(&uEOM) == 1);
}

// Dispose one frame of message
BOOL CMessage::DisposeCmd(SESSION &session)
{
	MESSAGE &mSend = session.mSend; // MESSAGE to be sent.
	MESSAGE &mRecv = session.mRecv;	// MESSAGE been received.

	ASSERT(m_pcdDevice);
	m_pcdDevice->GetAddr(mSend.aSrcAddr);

	if (!IsLocalCmd(mRecv) && mRecv.uCmdID != CMD_TFTP)	//	zlx 2004.12.24
	{// the command don't require local dispose.
		PutMsgToHdlcQueue(mRecv, mRecv.uLength);	
		session.FreeMessage();
		return FALSE;
	}

	session.nIdleTime = 0;	// Clear idle time counter

	// Set default value
	mSend.uCmdID  = mRecv.uCmdID;
	mSend.aDesAddr= mRecv.aSrcAddr;
	mSend.uSubCmd = mRecv.uSubCmd | CMD_RETURN;
	mSend.uPacket = mRecv.uPacket;
	mSend.SetLength(MESSAGE_FRAME_SIZE);

	
	if (GetApp()->IsDistributedSystem())
	{
		if (DispatchDeviceCmd(session, 0xFE))
		{	// creat event
			if (SUBCMD_WRITE && session.mRecv.uCmdID != CMD_MSGMODE)
			{
				if(session.mRecv.uCmdID == CMD_LOGIN && !session.bLogin)
				{
					
				}
				else
				{
					BYTE auParam[] = {session.uLevel, session.mRecv.uCmdID, session.mRecv.uSubCmd};
					GetApp()->AddEvent(EVENT_CMD_WRITE, auParam, sizeof(auParam));
				}
			}
		}
		session.FreeMessage();
		return TRUE;
	}

	BOOL bDisposed = DispatchSuperCmd(session);
	if (!bDisposed)
	{// normal commands
		if (session.bLogin || (mRecv.aDesAddr != mRecv.aSrcAddr))
		{
			if(mRecv.uCmdID == CMD_TFTP && mRecv.aDesAddr != mRecv.aSrcAddr)
			{
				bDisposed = DispatchSpecialCmd(session);
				if(!bDisposed)
				{	//	don't reply
					return TRUE;
				}
			}
			else
			{
				bDisposed = DispatchNormalCmd(session);
			}
			if (!bDisposed)
			{
				mSend.SetErrorCmd(CMD_BAD_COMMAND);
			}
		}
		else
		{
			mSend.SetErrorCmd(CMD_ACCESS_DENIED);
		}
	}
	if (bDisposed)
	{// Event log
		if (SUBCMD_WRITE && mRecv.uCmdID != CMD_MSGMODE)
		{
			if(mRecv.uCmdID == CMD_LOGIN && !session.bLogin)
			{
				
			}
			else
			{
				BYTE auParam[] = {session.uLevel, mRecv.uCmdID, mRecv.uSubCmd};
				GetApp()->AddEvent(EVENT_CMD_WRITE, auParam, sizeof(auParam));
			}
		}
	}

	// it is a transfering command
	if (!IsReturnCmd(mSend) && mSend.uCmdID != CMD_TFTP)
	{
		mSend.uSubCmd |= 0x40;
		if(mSend.uCmdID != CMD_TEST)
		{
			mSend.uLength--;
		}
		PutMsgToHdlcQueue(mSend, mSend.uLength);
		session.FreeMessage();
		return TRUE;	
	}

	mSend.uCheckSum = mSend.CheckSum();	
	
	(session.nID == -1) ? UartSend(mSend) : NetSend(mSend, session.nID);
	session.FreeMessage();
	return TRUE;
}

// dispatch and dispose super command. a super command is the command which does
//   not need to login.
BOOL CMessage::DispatchSuperCmd(SESSION &session)
{
	BOOL bRetVal = TRUE;
	switch (session.mRecv.uCmdID) 
	{ // 
	case CMD_MSGMODE:		OnMsgMode(session);		break;
	case CMD_LOGIN:			OnLogin(session);		break;
	case CMD_LOGOUT:		OnLogout(session);		break;
	case CMD_RLOGIN:		OnRlogin(session);		break;
	case CMD_RLOGOUT:		OnRlogout(session);		break;
	case CMD_SYS_CONFIG:	OnSysConfig(session);	break;
	case CMD_USER_CONFIG:	OnUserConfig(session);	break;
	case CMD_MSG_VERSION:	OnMsgVersion(session);	break;
	case CMD_NET_STATUS:	OnNetStatus(session);	break; 
	default:				bRetVal = FALSE;		break;
	}
	return bRetVal;
}

// dispatch and dispose normal command. (after login)
// uSlavePort: 
BOOL CMessage::DispatchNormalCmd(SESSION &session)
{
	BOOL bRetVal = TRUE;
	switch (session.mRecv.uCmdID) 
	{
	case CMD_SYS_TIME:		OnSysTime(session);			break;
	case CMD_EVENT:			OnEvent(session);			break;
	case CMD_HOST:			OnHost(session);			break;
	case CMD_FACTORY_CONF:	OnFactoryConf(session);		break;
	case CMD_LOGTIME:		OnLogTime(session);			break;
	case CMD_LOOPBACK_TIME:	OnLoopbackTime(session);	break;
	case CMD_X:				OnX(session);				break;
	case CMD_MASTER_STATION:OnMaster(session);			break;//add by bella yu 2004/11/5
	case CMD_RESET:			OnReset(session);			break;
	case CMD_MAJOR_MINOR:	OnMajorMinor(session);		break;
	case CMD_MINOR_UPGRADE:	OnMinorUpgrade(session);	break;
	case CMD_ALARM:			OnAlarm(session);			break;
	case CMD_PCMCRC:		OnPcmCrc(session);			break;
	case CMD_LOOPBACK:		OnLoopback(session);		break;
	case CMD_LIUSYNCMODE:	OnLiuSyncMode(session);		break;
	case CMD_LOADDEF:		OnLoadDef(session);			break;
	case CMD_TEST:			OnTest(session);			break;
	case CMD_TCPIP:			OnTcpip(session);			break;
	case CMD_MAC_ADDRESS:	OnMacAddress(session);		break;
	case CMD_VERSION:		OnSoftWareVersion(session);	break;
	case CMD_SAVE:			OnSaveFlash(session);		break;
	case CMD_CLEAR:			OnEventClear(session);		break;
	case CMD_PASSWORD:		OnPassword(session);		break;
	case CMD_TFTP:			OnTftp(session);			break;
	case CMD_AUTOREPORT:    OnAutoReportConfig(session);break;	//add by bella yu 2004/11/5										break;
	default:				bRetVal = FALSE;						break;
	}
	return bRetVal;
}

// Dispose command received from RS485 or HDLC
//
// pSession: pointer to current session
// pMsgQueue: pointer to current message queue
BOOL CMessage::DisposeRemoteCmd(SESSION *pSession, MsgQueue *pMsgQueue)
{
	if (GetApp()->IsDistributedSystem())
	{				
		if (pSession->mRecv.uCmdID == CMD_TFTP)
		{
			m_dwLength = pMsgQueue->dwMsgLength;
			DisposeCmd(*pSession);
		}
		else
		{
			DispatchDeviceCmd(*pSession, pMsgQueue->uSlavePort);
		}
		pSession->FreeMessage();
	}
	else // If it is not a distributed system, we received a command from remote host
	{				

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久国产精品韩国三级视频| 欧美日韩一区二区在线观看视频 | 五月婷婷久久丁香| 国产美女精品在线| 欧美无砖砖区免费| 久久精品一区二区| 麻豆一区二区三| 欧美视频一区二区三区| 国产精品女主播av| 国产成人在线视频网址| 欧美一卡二卡三卡| 亚洲午夜久久久久久久久电影网 | 日韩三级在线免费观看| 亚洲免费视频中文字幕| 大美女一区二区三区| 久久青草欧美一区二区三区| 亚洲国产视频一区| 在线免费视频一区二区| 国产精品对白交换视频| 国产.欧美.日韩| 精品91自产拍在线观看一区| 香蕉久久夜色精品国产使用方法 | 天堂久久一区二区三区| 在线亚洲欧美专区二区| 亚洲三级久久久| av不卡免费在线观看| 国产日韩成人精品| 国产美女视频91| 久久嫩草精品久久久精品| 狠狠色丁香久久婷婷综| 精品国偷自产国产一区| 精品一区二区久久| 日韩精品一区二区三区视频| 免费在线观看一区二区三区| 日韩欧美黄色影院| 久久成人麻豆午夜电影| 欧美成人三级电影在线| 青青草97国产精品免费观看无弹窗版| 777午夜精品免费视频| 天堂av在线一区| 日韩精品一区二区三区视频在线观看| 黑人巨大精品欧美一区| 一区二区三区久久| 欧美三级欧美一级| 久久国产三级精品| 久久久久久久电影| 91丨porny丨首页| 亚洲一级电影视频| 欧美不卡在线视频| 不卡的电影网站| 亚洲不卡在线观看| 久久亚洲欧美国产精品乐播| 成人精品免费看| 依依成人综合视频| 日韩一卡二卡三卡四卡| 国产福利91精品| 亚洲欧美日韩久久精品| 在线成人午夜影院| 国产精品一区久久久久| 亚洲色欲色欲www在线观看| 日本道在线观看一区二区| 日本va欧美va精品| 中文字幕一区二区在线观看| 欧美主播一区二区三区美女| 久久er99精品| 亚洲免费观看高清完整版在线| 欧美色区777第一页| 国产在线一区二区综合免费视频| 国产精品传媒入口麻豆| 欧美日韩国产经典色站一区二区三区| 黄色成人免费在线| 亚洲主播在线观看| 国产精品免费久久久久| 777奇米成人网| 91一区在线观看| 国产一区二区美女诱惑| 亚洲午夜久久久久中文字幕久| 久久久久久久综合| 666欧美在线视频| 97se亚洲国产综合自在线观| 久久国产精品露脸对白| 亚洲一二三四久久| 国产精品久久久久一区| 51午夜精品国产| 99久久国产综合色|国产精品| 麻豆91免费观看| 成人精品免费视频| 日本美女一区二区| 亚洲精品久久7777| 国产精品国产三级国产aⅴ入口 | 成人网在线免费视频| 日韩av电影免费观看高清完整版在线观看| 中文天堂在线一区| 久久久.com| 日韩欧美专区在线| 欧美精品在线一区二区三区| 91在线国产观看| 成人国产精品免费观看| 国产在线播放一区二区三区| 午夜精品一区二区三区三上悠亚| 国产精品人妖ts系列视频 | 欧美丰满美乳xxx高潮www| 99视频一区二区三区| 国产精品一区二区久激情瑜伽| 日日欢夜夜爽一区| 日韩精品一二三| 午夜精品影院在线观看| 亚洲一区在线视频观看| 亚洲免费在线观看视频| 国产精品福利在线播放| 中文字幕不卡一区| 国产精品久久久久久久久久久免费看 | 久久99蜜桃精品| 日韩av网站在线观看| 香蕉久久一区二区不卡无毒影院| 亚洲伊人色欲综合网| 亚洲一区二区高清| 亚洲国产综合色| 波多野结衣视频一区| 粉嫩av一区二区三区粉嫩 | 中文字幕国产精品一区二区| 久久久亚洲精品石原莉奈| 久久婷婷成人综合色| 久久美女艺术照精彩视频福利播放 | 国产精品天天摸av网| 国产精品久久久久一区二区三区 | 蜜臀av一区二区| 国内精品免费在线观看| 国产麻豆91精品| 99久久婷婷国产精品综合| 波多野结衣亚洲一区| 在线一区二区三区做爰视频网站| 欧洲一区在线电影| 日韩欧美国产1| 中文字幕精品一区二区精品绿巨人 | 国产偷国产偷精品高清尤物| 国产精品不卡在线观看| 亚洲电影一级片| 精品无码三级在线观看视频| 国产凹凸在线观看一区二区| 91免费版在线| 日韩一区二区三区精品视频| 精品国产免费久久| 亚洲免费观看高清在线观看| 亚洲国产三级在线| 国产精品亚洲成人| 在线观看不卡视频| 日韩欧美一区在线| 国产精品成人在线观看| 99国产一区二区三精品乱码| 欧美疯狂做受xxxx富婆| 国产精品情趣视频| 日本特黄久久久高潮| 成人综合日日夜夜| 91精品国产综合久久久久久久久久| 精品电影一区二区三区| 亚洲欧美乱综合| 黄色成人免费在线| 欧美日韩黄视频| 欧美激情一区二区三区不卡| 午夜伊人狠狠久久| 成人av电影在线| 日韩欧美一卡二卡| 亚洲国产成人高清精品| 国产成人综合网站| 欧美一级久久久久久久大片| 1区2区3区国产精品| 国内久久婷婷综合| 欧美色成人综合| 亚洲色图20p| 国产精品一区二区在线看| 欧美精品欧美精品系列| 成人免费一区二区三区在线观看| 另类欧美日韩国产在线| 欧美色综合久久| 国产精品福利电影一区二区三区四区 | av电影一区二区| 久久久久久久综合色一本| 日韩精品一区二区三区三区免费| 色丁香久综合在线久综合在线观看| 制服丝袜av成人在线看| 亚洲黄色小说网站| 国产麻豆精品在线| 91精品久久久久久蜜臀| 亚洲一区在线电影| 成人av网在线| 日本高清不卡一区| 日本欧美在线看| 久久婷婷久久一区二区三区| 成人av电影观看| 亚洲电影你懂得| 精品国产一区二区三区忘忧草| 国产精品一卡二| 一区二区三区中文在线观看| 欧美情侣在线播放| 国产精品一区二区久激情瑜伽| 亚洲视频小说图片| 91精品国产色综合久久不卡电影| 久久狠狠亚洲综合| 一区二区三区中文字幕在线观看|