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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? wdbslippktdrv.c

?? vxworks的完整的源代碼
?? C
字號:
/* wdbSlipPktDrv.c - a serial line packetizer for the WDB agent *//* Copyright 1994-2001 Wind River Systems, Inc. *//*modification history--------------------01g,18oct01,jhw  Fixed documentation build errors.01f,18sep01,jhw  Fixed compiler warnings from gnu -pedantic option.		 Added Copyright.01e,16jan98,dbt  modified overflow test in wdbCharRcv() (SPR #8625).01d,14oct95,jdi  doc: cleanup.01c,26sep95,ms   docs01b,15jun95,ms	 updated for new serial device interface01a,02dec94,ms   written.*//*DESCRIPTIONThis is a lightweight SLIP driver that interfaces with the WDB agentsUDP/IP interpreter.  It is the lightweight equivalent of the VxWorksSLIP netif driver, and uses the same protocol to assemble serialcharacters into IP datagrams (namely the SLIP protocol).SLIP is a simple protocol that uses four token charactersto delimit each packet:    - FRAME_END (0300)    - FRAME_ESC (0333)    - FRAME_TRANS_END (0334)    - FRAME_TRANS_ESC (0335)The END character denotes the end of an IP packet.  The ESC character is usedwith TRANS_END and TRANS_ESC to circumvent potential occurrences of END or ESCwithin a packet.  If the END character is to be embedded, SLIP sends"ESC TRANS_END" to avoid confusion between a SLIP-specific END and actualdata whose value is END.  If the ESC character is to be embedded, thenSLIP sends "ESC TRANS_ESC" to avoid confusion.  (Note that the SLIP ESC isnot the same as the ASCII ESC.)On the receiving side of the connection, SLIP uses the opposite actions todecode the SLIP packets.  Whenever an END character is received, SLIPassumes a full packet has been received and sends on.This driver has an MTU of 1006 bytes.  If the host is using a real SLIPdriver with a smaller MTU, then you will need to lower the definitionof WDB_MTU in configAll.h so that the host and target MTU match.If you are not using a SLIP driver on the host, but instead are usingthe target server's wdbserial backend to connect to the agent, then you do notneed to worry about incompatabilities between the host and target MTUs.INTERNALThe END character is also sent at the begining of a packet. Althoughthis is not part of the SLIP spec, it helps remove any "noise characters"that may have accumulated.Only a single input packet can arrive at a time. Once that packet hasarrived, the input buffer is marked "locked", and any furthercharacters received are dropped.  When the buffer is finally readby the agent, then it is marked "unlocked" again.*/#include "string.h"#include "errno.h"#include "sioLib.h"#include "intLib.h"#include "wdb/wdbMbufLib.h"#include "drv/wdb/wdbSlipPktDrv.h"#if 0/* * SLMTU is now a hard limit on input packet size. * SLMTU must be <= MCLBYTES - sizeof(struct ifnet *). */#define SLMTU           1006    /* be compatible with BSD 4.3 SLIP */#endif/* SLIP protocol characters */#define FRAME_END          (char)0300	/* Frame End */#define FRAME_ESCAPE       (char)0333	/* Frame Esc */#define TRANS_FRAME_END    (char)0334	/* transposed frame end */#define TRANS_FRAME_ESCAPE (char)0335	/* transposed frame esc *//* states of the input/ouput buffers (bitwise or'ed together) */#define STATE_BUSY	1	/* I/O is being performed */#define STATE_ESC	2	/* in the middle of a SLIP escape seq */#define STATE_START	4	/* output just started *//* some handy macros */#define RESET_INPUT(pPktDev)	{pPktDev->inBufPtr = pPktDev->inBufBase; \				 pPktDev->inputState = 0;}/* forward declarations */static STATUS	wdbCharRcv (void *pPktDev, char thisChar);static STATUS	wdbCharTx  (void *pPktDev, char *thisChar);static STATUS	wdbPktPoll (void *pPktDev);static STATUS	wdbPktTx   (void *pPktDev, struct mbuf *pMbuf);static void	wdbPktFree (void *pPktDev);static STATUS	wdbPktModeSet (void *pPktDev, uint_t newMode);static STATUS	mbufChainCharGet (struct mbuf *, int, char *);static void	mbufChainFree	 (struct mbuf *);/******************************************************************************** wdbPktResetOutput - reset the output packet state machine*/ static void wdbPktResetOutput    (    WDB_SLIP_PKT_DEV * pPktDev    )    {    struct mbuf * pMbuf;    pPktDev->outputIx	 = 0;    pPktDev->outputState = 0;    while (pPktDev->pMbuf != NULL)	{	pMbuf = pPktDev->pMbuf->m_act;	mbufChainFree (pPktDev->pMbuf);	pPktDev->pMbuf = pMbuf;	}    }/******************************************************************************** wdbSlipPktDevInit - initialize a SLIP packet device for a WDB agent** This routine initializes a SLIP packet device on one of the BSP's* serial channels.  It is typically called from usrWdb.c when the WDB* agent's lightweight SLIP communication path is selected.** RETURNS: N/A*/void wdbSlipPktDevInit    (    WDB_SLIP_PKT_DEV *pPktDev,	/* SLIP packetizer device */    SIO_CHAN *	pSioChan,	/* underlying serial channel */    void	(*stackRcv)()	/* callback when a packet arrives */    )    {    pPktDev->wdbDrvIf.mode	= WDB_COMM_MODE_POLL | WDB_COMM_MODE_INT;    pPktDev->wdbDrvIf.mtu	= SLMTU;    pPktDev->wdbDrvIf.stackRcv	= stackRcv;    pPktDev->wdbDrvIf.devId	= (WDB_SLIP_PKT_DEV *)pPktDev;    pPktDev->wdbDrvIf.pollRtn	= wdbPktPoll;    pPktDev->wdbDrvIf.pktTxRtn	 = wdbPktTx;    pPktDev->wdbDrvIf.modeSetRtn = wdbPktModeSet;    pPktDev->pSioChan		 = pSioChan;    pPktDev->inBufEnd	= pPktDev->inBufBase + SLMTU;    pPktDev->pMbuf	= 0;    sioCallbackInstall (pSioChan, SIO_CALLBACK_GET_TX_CHAR,			(FUNCPTR) wdbCharTx, (void *)pPktDev);    sioCallbackInstall (pSioChan, SIO_CALLBACK_PUT_RCV_CHAR,			(FUNCPTR) wdbCharRcv, (void *)pPktDev);    wdbPktModeSet (pPktDev, WDB_COMM_MODE_INT);    }/******************************************************************************** wdbCharRcv - input a character** This routine is called by the driver's input ISR (or poll routine) to* give the next character for the input packet.* If this is the "FRAME_END" character, then a whole packet has arrived,* and we call the "pktRcvRtn" routine to hand off the packet.** RETURNS: OK, or ERROR if input is locked or the input buffer overflows.*/static STATUS wdbCharRcv    (    void *	pDev,    char 	thisChar    )    {    WDB_SLIP_PKT_DEV	* pPktDev = (WDB_SLIP_PKT_DEV *)pDev;    /* input buffer already in use by another packet - just return */    if (pPktDev->inputState & STATE_BUSY)	{	return (ERROR);	}    switch (thisChar)	{	case FRAME_END:	    /* don't process zero byte packets */	    if (pPktDev->inBufPtr == pPktDev->inBufBase)		{		RESET_INPUT(pPktDev);		return (OK);		}	    else			/* hand off the packet */		{		/* grab an mbuf and use it as a cluster pointer */		struct mbuf * pMbuf = wdbMbufAlloc();		if (pMbuf == NULL)		    {		    RESET_INPUT(pPktDev);		    return (ERROR);		    }		wdbMbufClusterInit (pMbuf, pPktDev->inBufBase,				pPktDev->inBufPtr - pPktDev->inBufBase,				(int (*)())wdbPktFree, (int)pPktDev);		pPktDev->inputState |= STATE_BUSY;		(*pPktDev->wdbDrvIf.stackRcv) (pMbuf);		return (OK);		}	case FRAME_ESCAPE:	    pPktDev->inputState |= STATE_ESC;	    return (OK);	default:	    if (pPktDev->inputState & STATE_ESC)		{		pPktDev->inputState &= (~STATE_ESC);		switch (thisChar)		    {		    case TRANS_FRAME_ESCAPE:			thisChar = FRAME_ESCAPE;			break;		    case TRANS_FRAME_END:			thisChar = FRAME_END;			break;		    default:			return (ERROR);		    }		}	    /* If overflow, reset the input buffer */	    if (pPktDev->inBufPtr >= pPktDev->inBufEnd)		{		RESET_INPUT(pPktDev);		return (ERROR);		}	    /* put the character in the input buffer */	    *pPktDev->inBufPtr = thisChar;	    pPktDev->inBufPtr++;	    break;	}    return (OK);    }/******************************************************************************** wdbCharTx - transmit a character** This routine is called by a driver's output ISR to get the next character* for transmition.** RETURNS: OK, or ERROR if there are no more characters in the buffer.*/static STATUS wdbCharTx    (    void *	pDev,    caddr_t	thisChar    )    {    WDB_SLIP_PKT_DEV * pPktDev = (WDB_SLIP_PKT_DEV *)pDev;    /* Return ERROR if there are no characters left to output */    if (!(pPktDev->outputState & STATE_BUSY))	{	return (ERROR);	}    /* transmit a FRAME_END at the end of a packet */    if (mbufChainCharGet (pPktDev->pMbuf, pPktDev->outputIx, thisChar) == ERROR)	{	struct mbuf * pNextMbuf = pPktDev->pMbuf->m_act;	*thisChar = FRAME_END;			/* output end-of-frame */	mbufChainFree (pPktDev->pMbuf);		/* free the mbuf chain */	pPktDev->pMbuf = pNextMbuf;		/* queue up the next chain */	pPktDev->outputIx = 0;	pPktDev->outputState = STATE_START | STATE_BUSY;	if (pNextMbuf == NULL)			/* reset if no more packets */	    wdbPktResetOutput(pPktDev);	}    /* transmit a FRAME_END at the start of a packet */    else if (pPktDev->outputState & STATE_START)	{	*thisChar = FRAME_END;	pPktDev->outputState &= ~STATE_START;	}    /* transpose the character if we are in the middle of an escape sequence */    else if (pPktDev->outputState & STATE_ESC)	{	pPktDev->outputState &= (~STATE_ESC);	switch (*thisChar)	    {	    case FRAME_END:		*thisChar = TRANS_FRAME_END;		break;	    case FRAME_ESCAPE:		*thisChar = TRANS_FRAME_ESCAPE;		break;	    default:			/* this can't happen! */		wdbPktResetOutput (pPktDev);		return (ERROR);		}	pPktDev->outputIx++;	}    /* else output the next character in the buffer */    else switch (*thisChar)	{	case FRAME_END:	case FRAME_ESCAPE:	    *thisChar = FRAME_ESCAPE;	    pPktDev->outputState |= STATE_ESC;	    break;	default:	    pPktDev->outputIx++;	    break;	}    return (OK);    }/******************************************************************************** wdbPktTx - transmit a packet** This routine can only be called by the WDB agent.** RETURNS: OK, or ERROR if a packet is currently being transmitted, or* the packet is too large to send.*/static STATUS wdbPktTx    (    void *	pDev,    struct mbuf * pMbuf    )    {    WDB_SLIP_PKT_DEV *pPktDev = pDev;    int 	lockKey;    /* if we are in polled mode, transmit the packet in a loop */    if (pPktDev->mode == WDB_COMM_MODE_POLL)	{	char thisChar;	pPktDev->outputState = STATE_BUSY | STATE_START;	pPktDev->pMbuf	     = pMbuf;	pPktDev->outputIx    = 0;	while (wdbCharTx (pPktDev, &thisChar) != ERROR)	    {	    while (sioPollOutput (pPktDev->pSioChan, thisChar) == EAGAIN)		;	    }	return (OK);	}    lockKey = intLock();    /* if no mbufs are queued for output, queue this one and start trasnmit */    if (pPktDev->pMbuf == NULL)	{	pPktDev->outputState = STATE_BUSY | STATE_START;	pPktDev->pMbuf	     = pMbuf;	pPktDev->outputIx    = 0;	sioTxStartup (pPktDev->pSioChan);	intUnlock (lockKey);	return (OK);	}    /* queue up to one packet - no more */    if (pPktDev->pMbuf->m_act == NULL)	{	pPktDev->pMbuf->m_act = pMbuf;	intUnlock (lockKey);	return (OK);	}    intUnlock (lockKey);    mbufChainFree (pMbuf);    return (ERROR);    }/******************************************************************************** wdbPktFree - free the input buffer** This routine is called after the agent has read in the packet to indicate* that the input buffer can be used again to receive a new packet.*/static void wdbPktFree    (    void *	pDev    )    {    WDB_SLIP_PKT_DEV *	pPktDev = pDev;    RESET_INPUT(pPktDev);    }/******************************************************************************** wdbPktModeSet - set the communications mode to INT or POLL*/static STATUS wdbPktModeSet    (    void *	pDev,    uint_t	newMode    )    {    u_int	  sioMode;    WDB_SLIP_PKT_DEV * pPktDev = pDev;    RESET_INPUT  (pPktDev);    wdbPktResetOutput (pPktDev);    if (newMode == WDB_COMM_MODE_INT)	sioMode = SIO_MODE_INT;    else if (newMode == WDB_COMM_MODE_POLL)	sioMode = SIO_MODE_POLL;    else	return (ERROR);    if (sioIoctl (pPktDev->pSioChan, SIO_MODE_SET, (void *)sioMode) == OK)	{	pPktDev->mode = newMode;	return (OK);	}    return (ERROR);    }/******************************************************************************** wdbPktPoll - poll for a packet** RETURNS: OK if a character has arrived; otherwise ERROR.*/ static STATUS wdbPktPoll    (    void *	pDev    )    {    char	thisChar;    WDB_SLIP_PKT_DEV * pPktDev = pDev;    if (sioPollInput (pPktDev->pSioChan, &thisChar) == OK)	{	wdbCharRcv ((void *)pPktDev, thisChar);	return (OK);	}    return (ERROR);    }/******************************************************************************** mbufChainFree - free a chain of mbufs*/ static void mbufChainFree    (    struct mbuf *	pMbuf		/* mbuf chain to free */    )    {    struct mbuf * pNextMbuf;    while (pMbuf != NULL)	{	pNextMbuf = pMbuf->m_next;	wdbMbufFree (pMbuf);	pMbuf = pNextMbuf;	}    }/******************************************************************************** mbufChainCharGet - get a character from an mbuf chain** This routine makes a chain of mbufs apprear as a contingurous block* of memory, and fetches character number <charNum>.** RETURNS: OK, or ERROR if the <charNum> is outside the buffer range.*/ static STATUS mbufChainCharGet    (    struct mbuf * pMbuf,		/* mbuf chain */    int		  charNum,		/* character index */    char *	  pChar			/* where to put character */    )    {    int bytesRead = 0;    struct mbuf * pThisMbuf;    if (charNum < 0)	return (ERROR);    for (pThisMbuf = pMbuf; pThisMbuf != NULL; pThisMbuf = pThisMbuf->m_next)	{	if (bytesRead + pThisMbuf->m_len > charNum)	    {	    *pChar = *(mtod (pThisMbuf, char *) + charNum - bytesRead);	    return (OK);	    }	bytesRead += pThisMbuf->m_len;	}    return (ERROR);    }

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
午夜精品福利一区二区三区av| 欧美一区二区播放| 欧美日韩一区在线| 国产午夜精品美女毛片视频| 午夜久久电影网| 777久久久精品| 日本欧美一区二区三区乱码| 欧美一区二区人人喊爽| 亚洲成人精品一区| 欧美美女一区二区| 婷婷一区二区三区| 91精品国产高清一区二区三区蜜臀| 亚洲第一精品在线| 精品视频在线免费看| 国产一区视频导航| 日韩美女视频在线| 国产高清视频一区| 久久久久久久国产精品影院| 国产在线播放一区| 国产精品久久久久久久岛一牛影视| 丁香一区二区三区| 亚洲日本丝袜连裤袜办公室| 欧美亚洲国产一区二区三区| 亚洲第一久久影院| 欧美精品一区二区三区在线播放 | 国产精品初高中害羞小美女文| 看国产成人h片视频| 国产亚洲一区二区三区四区 | 中文字幕一区二区三区视频| av在线播放成人| 一区二区三区成人| 欧美电影在哪看比较好| 久久国产成人午夜av影院| 国产亚洲欧洲一区高清在线观看| 不卡欧美aaaaa| 一区二区三区成人| 精品av久久707| 99久久精品情趣| 日韩黄色一级片| 欧美激情中文字幕一区二区| 色菇凉天天综合网| 久久精品噜噜噜成人88aⅴ| 国产三级久久久| 在线精品视频免费观看| 久久精品国产网站| 亚洲日本青草视频在线怡红院| 欧美麻豆精品久久久久久| 国产精品一线二线三线| 一区二区三区精密机械公司| 91福利视频久久久久| 国产一区二区在线观看视频| 亚洲一区二区三区四区在线观看 | 亚洲一区在线观看免费观看电影高清| 91精品免费在线| 不卡高清视频专区| 日韩电影在线观看电影| 亚洲欧洲精品天堂一级| 欧美日韩精品一区二区三区| 国产精品综合一区二区| 亚洲va韩国va欧美va| 中文字幕一区二区三| 日韩一区二区在线观看视频 | 久草在线在线精品观看| 一区二区三区在线视频免费| 91精品国产福利在线观看 | 亚洲精品久久嫩草网站秘色| 精品国产不卡一区二区三区| 欧美色综合久久| av在线不卡电影| 国产精品影视在线观看| 美女视频黄频大全不卡视频在线播放| 亚洲免费观看高清完整版在线观看熊 | 欧美一区二区精品久久911| 国产精品亚洲综合一区在线观看| 亚洲妇女屁股眼交7| 国产精品视频一二三| 欧美精品一区二| 在线播放/欧美激情| 日本道精品一区二区三区| 美女诱惑一区二区| 一区二区三区中文字幕精品精品 | 国产成都精品91一区二区三| 日产国产高清一区二区三区| 亚洲精品日韩综合观看成人91| 日本一区二区三区dvd视频在线| 欧美一区二区三区喷汁尤物| 欧洲一区二区三区免费视频| 99精品视频在线观看| 国产精品一区二区果冻传媒| 麻豆免费精品视频| 蜜臀va亚洲va欧美va天堂| 亚洲一区二区三区四区在线| 国产精品久久久久久久久快鸭 | 亚洲午夜视频在线观看| 中文字幕欧美日本乱码一线二线| 26uuu国产日韩综合| 日韩精品专区在线影院重磅| 欧美性视频一区二区三区| 成人精品免费网站| 成人av电影免费观看| 成人网在线播放| 成人激情电影免费在线观看| 成人丝袜高跟foot| 波多野结衣亚洲| 99v久久综合狠狠综合久久| 99re免费视频精品全部| 色哟哟国产精品| 91久久精品网| 欧美另类高清zo欧美| 91麻豆精品91久久久久同性| 精品国产制服丝袜高跟| 国产清纯美女被跳蛋高潮一区二区久久w | 日本aⅴ免费视频一区二区三区| 天堂在线亚洲视频| 开心九九激情九九欧美日韩精美视频电影| 免费在线观看一区| 国产乱子轮精品视频| 成人免费观看视频| 成人永久免费视频| 波多野结衣精品在线| 欧美日韩免费电影| 精品福利一区二区三区免费视频| www国产精品av| 国产精品久久久久久久岛一牛影视 | 久久久久久9999| 中文字幕一区二区三区在线观看| 亚洲色图视频网站| 日韩成人午夜电影| 国产精品亚洲第一区在线暖暖韩国| 国产福利一区在线| 欧美日韩一级片在线观看| 久久男人中文字幕资源站| 亚洲欧洲一区二区在线播放| 天天免费综合色| 国产成人av影院| 欧美性受极品xxxx喷水| 久久免费看少妇高潮| 亚洲综合一二三区| 国产精品正在播放| 欧美久久一二区| 欧美日韩aaa| 亚洲欧美区自拍先锋| 日韩精品乱码av一区二区| 大胆欧美人体老妇| 日韩欧美一级精品久久| 亚洲欧洲日韩av| 国产一区二区主播在线| 欧美又粗又大又爽| 久久精品亚洲麻豆av一区二区| 国产亚洲欧美日韩在线一区| 日韩毛片精品高清免费| 国产白丝精品91爽爽久久| 欧美精品亚洲一区二区在线播放| 亚洲国产激情av| 日本网站在线观看一区二区三区| 成人激情小说网站| 精品国产伦一区二区三区观看方式| 亚洲乱码中文字幕综合| 精油按摩中文字幕久久| 欧美日韩午夜在线视频| 国产亚洲1区2区3区| 久久精品免费观看| 777奇米四色成人影色区| 亚洲嫩草精品久久| 国产电影一区在线| 久久日韩粉嫩一区二区三区| 亚洲不卡av一区二区三区| aaa欧美大片| 国产亚洲一区字幕| 久久机这里只有精品| 91激情在线视频| 国产精品久久99| 国产99久久久久久免费看农村| 精品捆绑美女sm三区| 亚洲成人免费看| 欧美性感一类影片在线播放| 亚洲天堂福利av| 成人午夜碰碰视频| 国产欧美视频一区二区| 日韩成人av影视| 欧美综合欧美视频| 玉足女爽爽91| 91美女福利视频| 成人欧美一区二区三区1314| 从欧美一区二区三区| 久久九九99视频| 韩国欧美国产1区| 久久夜色精品一区| 久久国产麻豆精品| 2014亚洲片线观看视频免费| 韩国理伦片一区二区三区在线播放| 日韩午夜小视频| 看片的网站亚洲| 久久色.com| 成人国产在线观看| 久久久久国产精品人| 国模冰冰炮一区二区| 中文字幕av在线一区二区三区| 高清不卡一区二区| 亚洲欧洲精品一区二区三区|