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

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

?? lapb.c

?? uCLinux下的一個TCP/IP協議棧源碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* Link Access Procedures Balanced (LAPB), the upper sublayer of
 * AX.25 Level 2.
 */
#include "global.h"
#include "mbuf.h"
#include "timer.h"
#include "ax25.h"
#include "lapb.h"
#include "ip.h"
#include "netrom.h"

static void handleit(struct ax25_cb *axp,int pid,struct mbuf **bp);
static void procdata(struct ax25_cb *axp,struct mbuf **bp);
static int ackours(struct ax25_cb *axp,uint16 n);
static void clr_ex(struct ax25_cb *axp);
static void enq_resp(struct ax25_cb *axp);
static void inv_rex(struct ax25_cb *axp);

/* Process incoming frames */
int
lapb_input(
struct ax25_cb *axp,		/* Link control structure */
int cmdrsp,			/* Command/response flag */
struct mbuf **bpp		/* Rest of frame, starting with ctl */
){
	int control;
	int class;		/* General class (I/S/U) of frame */
	uint16 type;		/* Specific type (I/RR/RNR/etc) of frame */
	char pf;		/* extracted poll/final bit */
	char poll = 0;
	char final = 0;
	uint16 nr;		/* ACK number of incoming frame */
	uint16 ns;		/* Seq number of incoming frame */
	uint16 tmp;

	if(bpp == NULL || *bpp == NULL || axp == NULL){
		free_p(bpp);
		return -1;
	}

	/* Extract the various parts of the control field for easy use */
	if((control = PULLCHAR(bpp)) == -1){
		free_p(bpp);	/* Probably not necessary */
		return -1;
	}
	type = ftype(control);
	class = type & 0x3;
	pf = control & PF;
	/* Check for polls and finals */
	if(pf){
		switch(cmdrsp){
		case LAPB_COMMAND:
			poll = YES;
			break;
		case LAPB_RESPONSE:
			final = YES;
			break;
		}
	}
	/* Extract sequence numbers, if present */
	switch(class){
	case I:
	case I+2:
		ns = (control >> 1) & MMASK;
	case S:	/* Note fall-thru */
		nr = (control >> 5) & MMASK;
		break;
	}
	/* This section follows the SDL diagrams by K3NA fairly closely */
	switch(axp->state){
	case LAPB_DISCONNECTED:
		switch(type){
		case SABM:	/* Initialize or reset link */
			sendctl(axp,LAPB_RESPONSE,UA|pf);	/* Always accept */
			clr_ex(axp);
			axp->unack = axp->vr = axp->vs = 0;
			lapbstate(axp,LAPB_CONNECTED);/* Resets state counters */
			axp->srt = Axirtt;
			axp->mdev = 0;
			set_timer(&axp->t1,2*axp->srt);
			start_timer(&axp->t3);
			break;
		case DM:	/* Ignore to avoid infinite loops */
			break;
		default:	/* All others get DM */
			if(poll)
				sendctl(axp,LAPB_RESPONSE,DM|pf);
			break;
		}
		break;
	case LAPB_SETUP:
		switch(type){
		case SABM:	/* Simultaneous open */
			sendctl(axp,LAPB_RESPONSE,UA|pf);
			break;
		case DISC:
			sendctl(axp,LAPB_RESPONSE,DM|pf);
			break;
		case UA:	/* Connection accepted */
			/* Note: xmit queue not cleared */
			stop_timer(&axp->t1);
			start_timer(&axp->t3);
			axp->unack = axp->vr = axp->vs = 0;
			lapbstate(axp,LAPB_CONNECTED);
			break;			
		case DM:	/* Connection refused */
			free_q(&axp->txq);
			stop_timer(&axp->t1);
			axp->reason = LB_DM;
			lapbstate(axp,LAPB_DISCONNECTED);
			break;
		default:	/* All other frames ignored */
			break;
		}
		break;
	case LAPB_DISCPENDING:
		switch(type){
		case SABM:
			sendctl(axp,LAPB_RESPONSE,DM|pf);
			break;
		case DISC:
			sendctl(axp,LAPB_RESPONSE,UA|pf);
			break;
		case UA:
		case DM:
			stop_timer(&axp->t1);
			lapbstate(axp,LAPB_DISCONNECTED);
			break;
		default:	/* Respond with DM only to command polls */
			if(poll)
				sendctl(axp,LAPB_RESPONSE,DM|pf);
			break;
		}
		break;
	case LAPB_CONNECTED:
		switch(type){
		case SABM:
			sendctl(axp,LAPB_RESPONSE,UA|pf);
			clr_ex(axp);
			free_q(&axp->txq);
			stop_timer(&axp->t1);
			start_timer(&axp->t3);
			axp->unack = axp->vr = axp->vs = 0;
			lapbstate(axp,LAPB_CONNECTED); /* Purge queues */
			break;
		case DISC:
			free_q(&axp->txq);
			sendctl(axp,LAPB_RESPONSE,UA|pf);
			stop_timer(&axp->t1);
			stop_timer(&axp->t3);
			axp->reason = LB_NORMAL;
			lapbstate(axp,LAPB_DISCONNECTED);
			break;
		case DM:
			axp->reason = LB_DM;
			lapbstate(axp,LAPB_DISCONNECTED);
			break;
		case UA:
			est_link(axp);
			lapbstate(axp,LAPB_SETUP);	/* Re-establish */	
			break;			
		case FRMR:
			est_link(axp);
			lapbstate(axp,LAPB_SETUP);	/* Re-establish link */
			break;
		case RR:
		case RNR:
			axp->flags.remotebusy = (control == RNR) ? YES : NO;
			if(poll)
				enq_resp(axp);
			ackours(axp,nr);
			break;
		case REJ:
			axp->flags.remotebusy = NO;
			if(poll)
				enq_resp(axp);
			ackours(axp,nr);
			stop_timer(&axp->t1);
			start_timer(&axp->t3);
			/* This may or may not actually invoke transmission,
			 * depending on whether this REJ was caused by
			 * our losing his prior ACK.
			 */
			inv_rex(axp);
			break;	
		case I:
			ackours(axp,nr); /** == -1) */
			if(len_p(axp->rxq) >= axp->window){
				/* Too bad he didn't listen to us; he'll
				 * have to resend the frame later. This
				 * drastic action is necessary to avoid
				 * deadlock.
				 */
				if(poll)
					sendctl(axp,LAPB_RESPONSE,RNR|pf);
				free_p(bpp);
				break;
			}
			/* Reject or ignore I-frames with receive sequence number errors */
			if(ns != axp->vr){
				if(axp->proto == V1 || !axp->flags.rejsent){
					axp->flags.rejsent = YES;
					sendctl(axp,LAPB_RESPONSE,REJ | pf);
				} else if(poll)
					enq_resp(axp);
				axp->response = 0;
				break;
			}
			axp->flags.rejsent = NO;
			axp->vr = (axp->vr+1) & MMASK;
			tmp = len_p(axp->rxq) >= axp->window ? RNR : RR;
			if(poll){
				sendctl(axp,LAPB_RESPONSE,tmp|PF);
			} else {
				axp->response = tmp;
			}
			procdata(axp,bpp);
			break;
		default:	/* All others ignored */
			break;
		}
		break;
	case LAPB_RECOVERY:
		switch(type){
		case SABM:
			sendctl(axp,LAPB_RESPONSE,UA|pf);
			clr_ex(axp);
			stop_timer(&axp->t1);
			start_timer(&axp->t3);
			axp->unack = axp->vr = axp->vs = 0;
			lapbstate(axp,LAPB_CONNECTED); /* Purge queues */
			break;
		case DISC:
			free_q(&axp->txq);
			sendctl(axp,LAPB_RESPONSE,UA|pf);
			stop_timer(&axp->t1);
			stop_timer(&axp->t3);
			axp->response = UA;
			axp->reason = LB_NORMAL;
			lapbstate(axp,LAPB_DISCONNECTED);
			break;
		case DM:
			axp->reason = LB_DM;
			lapbstate(axp,LAPB_DISCONNECTED);
			break;
		case UA:
			est_link(axp);
			lapbstate(axp,LAPB_SETUP);	/* Re-establish */	
			break;
		case FRMR:
			est_link(axp);
			lapbstate(axp,LAPB_SETUP);	/* Re-establish link */
			break;
		case RR:
		case RNR:
			axp->flags.remotebusy = (control == RNR) ? YES : NO;
			if(axp->proto == V1 || final){
				stop_timer(&axp->t1);
				ackours(axp,nr);
				if(axp->unack != 0){
					inv_rex(axp);
				} else {
					start_timer(&axp->t3);
					lapbstate(axp,LAPB_CONNECTED);
				}
			} else {
				if(poll)
					enq_resp(axp);
				ackours(axp,nr);
				/* Keep timer running even if all frames
				 * were acked, since we must see a Final
				 */
				if(!run_timer(&axp->t1))
					start_timer(&axp->t1);
			}
			break;
		case REJ:
			axp->flags.remotebusy = NO;
			/* Don't insist on a Final response from the old proto */
			if(axp->proto == V1 || final){
				stop_timer(&axp->t1);
				ackours(axp,nr);
				if(axp->unack != 0){
					inv_rex(axp);
				} else {
					start_timer(&axp->t3);
					lapbstate(axp,LAPB_CONNECTED);
				}
			} else {
				if(poll)
					enq_resp(axp);
				ackours(axp,nr);
				if(axp->unack != 0){
					/* This is certain to trigger output */
					inv_rex(axp);
				}
				/* A REJ that acks everything but doesn't
				 * have the F bit set can cause a deadlock.
				 * So make sure the timer is running.
				 */
				if(!run_timer(&axp->t1))
					start_timer(&axp->t1);
			}
			break;
		case I:
			ackours(axp,nr); /** == -1) */
			/* Make sure timer is running, since an I frame
			 * cannot satisfy a poll
			 */
			if(!run_timer(&axp->t1))
				start_timer(&axp->t1);
			if(len_p(axp->rxq) >= axp->window){
				/* Too bad he didn't listen to us; he'll
				 * have to resend the frame later. This
				 * drastic action is necessary to avoid
				 * memory deadlock.
				 */
				sendctl(axp,LAPB_RESPONSE,RNR | pf);
				free_p(bpp);
				break;
			}
			/* Reject or ignore I-frames with receive sequence number errors */
			if(ns != axp->vr){
				if(axp->proto == V1 || !axp->flags.rejsent){
					axp->flags.rejsent = YES;
					sendctl(axp,LAPB_RESPONSE,REJ | pf);
				} else if(poll)
					enq_resp(axp);

				axp->response = 0;
				break;
			}
			axp->flags.rejsent = NO;
			axp->vr = (axp->vr+1) & MMASK;
			tmp = len_p(axp->rxq) >= axp->window ? RNR : RR;
			if(poll){
				sendctl(axp,LAPB_RESPONSE,tmp|PF);
			} else {
				axp->response = tmp;
			}
			procdata(axp,bpp);
			break;
		default:
			break;		/* Ignored */
		}
		break;
	}
	free_p(bpp);	/* In case anything's left */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产一区二区视频在线| 久久国产人妖系列| 国产三级欧美三级日产三级99| 欧美日韩亚洲综合在线 欧美亚洲特黄一级 | 蜜乳av一区二区三区| 爽好久久久欧美精品| 日韩电影在线免费观看| 奇米888四色在线精品| 蜜臀a∨国产成人精品| 国产中文一区二区三区| 国产成人高清在线| 91婷婷韩国欧美一区二区| 一本大道久久a久久综合| 日本韩国欧美三级| 欧美美女一区二区在线观看| 日韩午夜在线观看视频| 精品日韩欧美在线| 亚洲国产高清不卡| 亚洲精品视频观看| 免费看日韩精品| 国产成人免费网站| 欧美综合在线视频| 26uuu国产在线精品一区二区| 国产日韩欧美电影| 一区二区在线观看av| 蜜臀91精品一区二区三区| 国产精品91一区二区| 日本乱人伦aⅴ精品| 91精品欧美福利在线观看| 欧美经典三级视频一区二区三区| 曰韩精品一区二区| 久久国产精品色婷婷| 色综合色综合色综合 | 视频一区二区三区在线| 国产一区二区电影| 欧美日韩在线免费视频| 欧美极品少妇xxxxⅹ高跟鞋| 天天av天天翘天天综合网| 国产成人在线观看| 日韩一区二区三| 亚洲私人黄色宅男| 国产精品亚洲视频| 欧美一区二区在线看| 亚洲人成小说网站色在线| 国产尤物一区二区| 欧美精品vⅰdeose4hd| 亚洲天堂成人在线观看| 国产一区欧美一区| 日韩一区和二区| 亚洲乱码一区二区三区在线观看| 国产一区二区主播在线| 欧美日本在线一区| 一区二区成人在线视频| 成人18精品视频| 久久精品一二三| 精品中文字幕一区二区| 欧美精品久久天天躁| 亚洲精品成人天堂一二三| 成人一区在线观看| 国产亚洲欧美中文| 久久激情五月激情| 日韩视频123| 久久国产婷婷国产香蕉| 91精品国产日韩91久久久久久| 亚洲色图在线视频| 99久久精品国产导航| 国产精品免费网站在线观看| 国产主播一区二区三区| 久久久久久久网| 国产一区欧美一区| 久久婷婷色综合| 国产米奇在线777精品观看| 日韩一区二区三区在线视频| 日本欧洲一区二区| 日韩视频免费观看高清完整版| 午夜欧美在线一二页| 91麻豆精品国产91久久久更新时间| 亚洲午夜私人影院| 制服丝袜日韩国产| 毛片av一区二区三区| 精品国产露脸精彩对白| 极品瑜伽女神91| 欧美激情一区在线| 色一区在线观看| 丝袜诱惑亚洲看片| 日韩免费一区二区三区在线播放| 看片的网站亚洲| 国产亚洲欧美色| 91婷婷韩国欧美一区二区| 亚洲自拍偷拍网站| 日韩欧美国产综合| 国产精华液一区二区三区| 国产精品超碰97尤物18| 在线精品国精品国产尤物884a| 亚洲电影一级黄| 日韩欧美一区在线观看| 国产超碰在线一区| 亚洲一区在线观看免费| 91精选在线观看| 国产宾馆实践打屁股91| 亚洲一区在线看| 久久亚洲一级片| 色噜噜偷拍精品综合在线| 日本特黄久久久高潮| 久久久久久久av麻豆果冻| 色婷婷精品大视频在线蜜桃视频| 午夜日韩在线电影| 国产精品美女视频| 欧美丰满美乳xxx高潮www| 国产精品一区二区三区乱码| 亚洲一区二区高清| 久久久亚洲午夜电影| 欧美三级电影一区| 岛国精品在线播放| 蜜臀av性久久久久蜜臀aⅴ流畅| 国产精品区一区二区三区| 欧美日韩视频在线一区二区| 高潮精品一区videoshd| 日韩中文字幕91| 中文字幕一区二区在线观看| 日韩一区二区三区av| 色噜噜久久综合| 岛国精品在线观看| 久久黄色级2电影| 午夜久久久久久久久| 国产精品对白交换视频| 精品日韩在线观看| 欧美精品日韩综合在线| 色婷婷一区二区| 不卡的电视剧免费网站有什么| 久久97超碰色| 日韩av在线免费观看不卡| 国产精品国产三级国产aⅴ中文 | 99re亚洲国产精品| 国产一区二区电影| 国产主播一区二区| 奇米四色…亚洲| 日韩高清欧美激情| 亚洲一区二区五区| 一区二区日韩av| 综合久久久久久| 国产精品久久久久久久蜜臀| 久久久久国产一区二区三区四区| 91精品国产综合久久精品图片 | 欧美美女网站色| 欧美亚洲高清一区| 91福利视频在线| 在线观看91视频| 欧美亚洲日本一区| 欧美日韩在线直播| 5月丁香婷婷综合| 91精品国产乱码久久蜜臀| 欧美一区二视频| 精品国产三级电影在线观看| 欧美不卡一区二区三区四区| 日韩免费视频一区二区| 精品国产露脸精彩对白| 26uuu色噜噜精品一区| 国产无一区二区| 国产精品福利一区| 亚洲综合在线视频| 亚洲高清在线视频| 日本亚洲天堂网| 国产原创一区二区| 91香蕉视频污在线| 欧美日韩一区二区电影| 欧美www视频| 国产色产综合色产在线视频| 中文字幕一区二区在线观看| 亚洲一区国产视频| 久久99国产精品久久| 国产白丝网站精品污在线入口| av在线综合网| 欧美精品精品一区| 欧美极品xxx| 亚洲福利电影网| 国产福利一区在线观看| 色婷婷香蕉在线一区二区| 91精品免费在线| 国产精品国产馆在线真实露脸 | 日韩午夜激情电影| 国产精品青草久久| 日韩**一区毛片| 成人免费看的视频| 欧美精品亚洲一区二区在线播放| 久久亚洲捆绑美女| 亚洲韩国精品一区| 风间由美性色一区二区三区| 在线观看日产精品| 国产欧美一区在线| 三级亚洲高清视频| 94-欧美-setu| ww亚洲ww在线观看国产| 一区二区三区精品视频在线| 国内精品写真在线观看| 欧洲亚洲精品在线| 国产偷国产偷亚洲高清人白洁| 亚洲成人免费av| av电影天堂一区二区在线观看| 欧美变态tickle挠乳网站|