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

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

?? hdlc_fr.c

?? 一個2.4.21版本的嵌入式linux內核
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* * Generic HDLC support routines for Linux * Frame Relay support * * Copyright (C) 1999 - 2001 Krzysztof Halasa <khc@pm.waw.pl> * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. */#include <linux/config.h>#include <linux/module.h>#include <linux/kernel.h>#include <linux/slab.h>#include <linux/poll.h>#include <linux/errno.h>#include <linux/if_arp.h>#include <linux/init.h>#include <linux/skbuff.h>#include <linux/pkt_sched.h>#include <linux/inetdevice.h>#include <linux/lapb.h>#include <linux/rtnetlink.h>#include <linux/hdlc.h>__inline__ pvc_device* find_pvc(hdlc_device *hdlc, u16 dlci){	pvc_device *pvc=hdlc->state.fr.first_pvc;		while (pvc) {		if (netdev_dlci(&pvc->netdev) == dlci)			return pvc;		pvc = pvc->next;	}	return NULL;}__inline__ u16 status_to_dlci(hdlc_device *hdlc, u8 *status,			      int *active, int *new){	*new = (status[2] & 0x08);	*active = (!*new && (status[2] & 0x02));	return ((status[0] & 0x3F)<<4) | ((status[1] & 0x78)>>3);}__inline__ void dlci_to_status(hdlc_device *hdlc, u16 dlci, u8 *status,			       int active, int new){	status[0] = (dlci>>4) & 0x3F;	status[1] = ((dlci<<3) & 0x78) | 0x80;	status[2] = 0x80;	if (new)		status[2] |= 0x08;	else if (active)		status[2] |= 0x02;}static int fr_hard_header(struct sk_buff *skb, struct net_device *dev,			  u16 type, void *daddr, void *saddr, unsigned int len){	u16 head_len;	if (!daddr)		daddr = dev->broadcast;#ifdef CONFIG_HDLC_DEBUG_HARD_HEADER	printk(KERN_DEBUG "%s: fr_hard_header called\n", dev->name);#endif	switch(type) {	case ETH_P_IP:		head_len = 4;		skb_push(skb, head_len);		skb->data[3] = NLPID_IP;		break;	case ETH_P_IPV6:		head_len = 4;		skb_push(skb, head_len);		skb->data[3] = NLPID_IPV6;		break;	case LMI_PROTO:		head_len = 4;		skb_push(skb, head_len);		skb->data[3] = LMI_PROTO;		break;	default:		head_len = 10;		skb_push(skb, head_len);		skb->data[3] = FR_PAD;		skb->data[4] = NLPID_SNAP;		skb->data[5] = FR_PAD;		skb->data[6] = FR_PAD;		skb->data[7] = FR_PAD;		skb->data[8] = type>>8;		skb->data[9] = (u8)type;	}	memcpy(skb->data, daddr, 2);	skb->data[2] = FR_UI;	return head_len;}static int pvc_open(struct net_device *dev){	pvc_device *pvc = dev_to_pvc(dev);	if ((hdlc_to_dev(pvc->master)->flags & IFF_UP) == 0)		return -EIO;  /* Master must be UP in order to activate PVC */	if (pvc->master->state.fr.settings.lmi != LMI_NONE)		pvc->state.active = 0;	else		pvc->state.active = 1;	pvc->state.new = 0;	pvc->master->state.fr.changed = 1;	return 0;}static int pvc_close(struct net_device *dev){	pvc_device *pvc = dev_to_pvc(dev);	pvc->state.active = pvc->state.new = 0;	pvc->master->state.fr.changed = 1;	return 0;}static int pvc_xmit(struct sk_buff *skb, struct net_device *dev){	pvc_device *pvc = dev_to_pvc(dev);	if (pvc->state.active) {		skb->dev = hdlc_to_dev(pvc->master);		pvc->stats.tx_bytes += skb->len;		pvc->stats.tx_packets++;		if (pvc->state.fecn)			pvc->stats.tx_compressed++; /* TX Congestion counter */		dev_queue_xmit(skb);	} else {		pvc->stats.tx_dropped++;		dev_kfree_skb(skb);	}	return 0;}static struct net_device_stats *pvc_get_stats(struct net_device *dev){	pvc_device *pvc = dev_to_pvc(dev);	return &pvc->stats;}static int pvc_change_mtu(struct net_device *dev, int new_mtu){	if ((new_mtu < 68) || (new_mtu > HDLC_MAX_MTU))		return -EINVAL;	dev->mtu = new_mtu;	return 0;}static inline void fr_log_dlci_active(pvc_device *pvc){	printk(KERN_INFO "%s: %sactive%s\n", pvc_to_name(pvc),	       pvc->state.active ? "" : "in",	       pvc->state.new ? " new" : "");}static inline u8 fr_lmi_nextseq(u8 x){	x++;	return x ? x : 1;}static void fr_lmi_send(hdlc_device *hdlc, int fullrep){	struct sk_buff *skb;	pvc_device *pvc = hdlc->state.fr.first_pvc;	int len = (hdlc->state.fr.settings.lmi == LMI_ANSI) ? LMI_ANSI_LENGTH		: LMI_LENGTH;	int stat_len = 3;	u8 *data;	int i = 0;	if (hdlc->state.fr.settings.dce && fullrep) {		len += hdlc->state.fr.pvc_count * (2 + stat_len);		if (len > HDLC_MAX_MTU) {			printk(KERN_WARNING "%s: Too many PVCs while sending "			       "LMI full report\n", hdlc_to_name(hdlc));			return;		}	}	skb = dev_alloc_skb(len);	if (!skb) {		printk(KERN_WARNING "%s: Memory squeeze on fr_lmi_send()\n",			       hdlc_to_name(hdlc));		return;	}	memset(skb->data, 0, len);	skb_reserve(skb, 4);	fr_hard_header(skb, hdlc_to_dev(hdlc), LMI_PROTO, NULL, NULL, 0);	data = skb->tail;	data[i++] = LMI_CALLREF;	data[i++] = hdlc->state.fr.settings.dce		? LMI_STATUS : LMI_STATUS_ENQUIRY;	if (hdlc->state.fr.settings.lmi == LMI_ANSI)		data[i++] = LMI_ANSI_LOCKSHIFT;	data[i++] = (hdlc->state.fr.settings.lmi == LMI_CCITT)		? LMI_CCITT_REPTYPE : LMI_REPTYPE;	data[i++] = LMI_REPT_LEN;	data[i++] = fullrep ? LMI_FULLREP : LMI_INTEGRITY;	data[i++] = (hdlc->state.fr.settings.lmi == LMI_CCITT)		? LMI_CCITT_ALIVE : LMI_ALIVE;	data[i++] = LMI_INTEG_LEN;	data[i++] = hdlc->state.fr.txseq =fr_lmi_nextseq(hdlc->state.fr.txseq);	data[i++] = hdlc->state.fr.rxseq;	if (hdlc->state.fr.settings.dce && fullrep) {		while (pvc) {			data[i++] = (hdlc->state.fr.settings.lmi == LMI_CCITT)				? LMI_CCITT_PVCSTAT : LMI_PVCSTAT;			data[i++] = stat_len;			if (hdlc->state.fr.reliable &&			    (pvc->netdev.flags & IFF_UP) &&			    !pvc->state.active &&			    !pvc->state.new) {				pvc->state.new = 1;				fr_log_dlci_active(pvc);			}			dlci_to_status(hdlc, netdev_dlci(&pvc->netdev),				       data + i,				       pvc->state.active, pvc->state.new);			i += stat_len;			pvc = pvc->next;		}	}	skb_put(skb, i);	skb->priority = TC_PRIO_CONTROL;	skb->dev = hdlc_to_dev(hdlc);	dev_queue_xmit(skb);}static void fr_timer(unsigned long arg){	hdlc_device *hdlc = (hdlc_device*)arg;	int i, cnt = 0, reliable;	u32 list;	if (hdlc->state.fr.settings.dce)		reliable = (jiffies - hdlc->state.fr.last_poll <			    hdlc->state.fr.settings.t392 * HZ);	else {		hdlc->state.fr.last_errors <<= 1; /* Shift the list */		if (hdlc->state.fr.request) {			if (hdlc->state.fr.reliable)				printk(KERN_INFO "%s: No LMI status reply "				       "received\n", hdlc_to_name(hdlc));			hdlc->state.fr.last_errors |= 1;		}		list = hdlc->state.fr.last_errors;		for (i = 0; i < hdlc->state.fr.settings.n393; i++, list >>= 1)			cnt += (list & 1);	/* errors count */		reliable = (cnt < hdlc->state.fr.settings.n392);	}	if (hdlc->state.fr.reliable != reliable) {		pvc_device *pvc = hdlc->state.fr.first_pvc;		hdlc->state.fr.reliable = reliable;		printk(KERN_INFO "%s: Link %sreliable\n", hdlc_to_name(hdlc),		       reliable ? "" : "un");		if (reliable) {			hdlc->state.fr.n391cnt = 0; /* Request full status */			hdlc->state.fr.changed = 1;		} else {			while (pvc) {	/* Deactivate all PVCs */				pvc->state.new = pvc->state.active = 0;				pvc = pvc->next;			}		}	}	if (hdlc->state.fr.settings.dce)		hdlc->state.fr.timer.expires = jiffies +			hdlc->state.fr.settings.t392 * HZ;	else {		if (hdlc->state.fr.n391cnt)			hdlc->state.fr.n391cnt--;		fr_lmi_send(hdlc, hdlc->state.fr.n391cnt == 0);		hdlc->state.fr.request = 1;		hdlc->state.fr.timer.expires = jiffies +			hdlc->state.fr.settings.t391 * HZ;	}	hdlc->state.fr.timer.function = fr_timer;	hdlc->state.fr.timer.data = arg;	add_timer(&hdlc->state.fr.timer);}static int fr_lmi_recv(hdlc_device *hdlc, struct sk_buff *skb){	int stat_len;	pvc_device *pvc;	int reptype = -1, error;	u8 rxseq, txseq;	int i;	if (skb->len < ((hdlc->state.fr.settings.lmi == LMI_ANSI)			? LMI_ANSI_LENGTH : LMI_LENGTH)) {		printk(KERN_INFO "%s: Short LMI frame\n", hdlc_to_name(hdlc));		return 1;	}	if (skb->data[5] != (!hdlc->state.fr.settings.dce ?			     LMI_STATUS : LMI_STATUS_ENQUIRY)) {		printk(KERN_INFO "%s: LMI msgtype=%x, Not LMI status %s\n",		       hdlc_to_name(hdlc), skb->data[2],		       hdlc->state.fr.settings.dce ? "enquiry" : "reply");		return 1;	}	i = (hdlc->state.fr.settings.lmi == LMI_ANSI) ? 7 : 6;	if (skb->data[i] !=	    ((hdlc->state.fr.settings.lmi == LMI_CCITT)	     ? LMI_CCITT_REPTYPE : LMI_REPTYPE)) {		printk(KERN_INFO "%s: Not a report type=%x\n",		       hdlc_to_name(hdlc), skb->data[i]);		return 1;	}	i++;	i++;				/* Skip length field */	reptype = skb->data[i++];	if (skb->data[i]!=	    ((hdlc->state.fr.settings.lmi == LMI_CCITT)	     ? LMI_CCITT_ALIVE : LMI_ALIVE)) {		printk(KERN_INFO "%s: Unsupported status element=%x\n",		       hdlc_to_name(hdlc), skb->data[i]);		return 1;	}	i++;	i++;			/* Skip length field */	hdlc->state.fr.rxseq = skb->data[i++]; /* TX sequence from peer */	rxseq = skb->data[i++];	/* Should confirm our sequence */	txseq = hdlc->state.fr.txseq;	if (hdlc->state.fr.settings.dce) {		if (reptype != LMI_FULLREP && reptype != LMI_INTEGRITY) {			printk(KERN_INFO "%s: Unsupported report type=%x\n",			       hdlc_to_name(hdlc), reptype);			return 1;		}	}	error = 0;	if (!hdlc->state.fr.reliable)		error = 1;	if (rxseq == 0 || rxseq != txseq) {		hdlc->state.fr.n391cnt = 0; /* Ask for full report next time */		error = 1;	}	if (hdlc->state.fr.settings.dce) {		if (hdlc->state.fr.fullrep_sent && !error) {/* Stop sending full report - the last one has been confirmed by DTE */			hdlc->state.fr.fullrep_sent = 0;			pvc = hdlc->state.fr.first_pvc;			while (pvc) {				if (pvc->state.new) {					pvc->state.new = 0;					pvc->state.active = 1;					fr_log_dlci_active(pvc);/* Tell DTE that new PVC is now active */					hdlc->state.fr.changed = 1;				}				pvc = pvc->next;			}		}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产亚洲精品7777| 久久精品国产网站| 亚洲欧美日韩系列| 一区二区成人在线视频| 亚洲一区二区四区蜜桃| 天堂一区二区在线| 美国三级日本三级久久99| 精品写真视频在线观看 | 欧美日韩另类一区| 色88888久久久久久影院野外| 欧美羞羞免费网站| 717成人午夜免费福利电影| 偷拍与自拍一区| 久久99精品久久久久久国产越南 | 亚洲欧美日韩国产手机在线 | 欧美高清一级片在线| 欧美日产国产精品| 精品国产成人系列| 国产精品美女久久久久久久久 | 亚洲成a人片在线不卡一二三区| 日本少妇一区二区| 国产成人一区在线| 91国偷自产一区二区三区观看| 日韩一区二区三免费高清| 久久精品人人爽人人爽| 亚洲一区二区av在线| 老司机精品视频导航| av一区二区三区| 日韩片之四级片| 久久嫩草精品久久久久| 一区二区三区在线影院| 极品少妇xxxx偷拍精品少妇| 97久久精品人人做人人爽 | 日韩理论电影院| 日韩av不卡在线观看| av在线综合网| 欧美一区二区在线免费播放| 国产精品视频一二三| 日本在线不卡一区| 91污片在线观看| 日韩一区二区精品| 亚洲男人的天堂一区二区| 久久精品国产99国产| 欧美性xxxxxx少妇| 日韩精品一区二区三区视频播放 | 亚洲大片免费看| 韩国av一区二区三区在线观看| 在线视频一区二区三| 91精品国产综合久久精品| 自拍偷拍亚洲综合| 九九九久久久精品| 欧美日精品一区视频| 国产欧美日韩亚州综合| 免费欧美日韩国产三级电影| 一本到三区不卡视频| 日韩一区二区精品在线观看| 亚洲午夜精品久久久久久久久| 国产激情偷乱视频一区二区三区| 欧美丰满美乳xxx高潮www| 亚洲色图另类专区| 成人免费观看av| 精品卡一卡二卡三卡四在线| 午夜欧美电影在线观看| 91国产丝袜在线播放| 国产精品色在线| 国产呦萝稀缺另类资源| 日韩欧美在线一区二区三区| 一区二区三区国产精华| www.亚洲激情.com| 国产亚洲综合在线| 狠狠色狠狠色综合| 日韩欧美激情四射| 男人的天堂久久精品| 3d成人h动漫网站入口| 日本不卡一二三区黄网| 日韩欧美在线一区二区三区| 精品在线免费观看| 久久久久国产一区二区三区四区 | 国产成人免费高清| 国产精品污网站| 99精品国产视频| 亚洲一区中文在线| 91精品国产麻豆| 久久激情五月激情| 久久精品亚洲麻豆av一区二区| 高清在线成人网| 日产欧产美韩系列久久99| 91麻豆精品国产91久久久更新时间 | 九九在线精品视频| 国产亚洲一本大道中文在线| 成人免费av资源| 一区二区在线电影| 91精品国产综合久久香蕉麻豆| 久久99精品国产.久久久久| 久久久精品tv| 日本精品一区二区三区高清| 天天综合天天做天天综合| 欧美v日韩v国产v| 不卡的电影网站| 亚洲五码中文字幕| 日韩一级完整毛片| 精品一区二区成人精品| 中文字幕视频一区| 欧美欧美欧美欧美| 国产在线精品一区二区不卡了| 国产精品欧美一区二区三区| 日本精品一级二级| 久久丁香综合五月国产三级网站| 国产日韩欧美精品在线| 欧美综合一区二区| 久久精品国产色蜜蜜麻豆| 中文字幕一区二区在线观看| 欧美人妖巨大在线| 国产一区二区三区在线观看精品| 亚洲日本乱码在线观看| 日韩亚洲电影在线| 99国产欧美另类久久久精品| 欧美aaa在线| 成人免费一区二区三区在线观看| 91精品一区二区三区在线观看| 成人做爰69片免费看网站| 午夜一区二区三区在线观看| 国产欧美一区二区精品性色超碰| 日本精品一级二级| 国产在线不卡一卡二卡三卡四卡| 亚洲少妇最新在线视频| 日韩精品一区在线观看| 在线欧美日韩精品| 国产成人日日夜夜| 日韩—二三区免费观看av| 国产精品乱码人人做人人爱| 91麻豆精品国产91久久久使用方法| 成人国产精品免费观看动漫| 麻豆免费精品视频| 一区二区三区视频在线看| 国产清纯美女被跳蛋高潮一区二区久久w| 欧美性生活大片视频| 国产99一区视频免费| 蜜桃av一区二区| 一区二区久久久| 国产精品伦一区| 日韩欧美国产成人一区二区| 欧美综合色免费| 99久久国产综合精品女不卡| 韩日av一区二区| 日韩高清欧美激情| 亚洲黄色小说网站| 国产精品午夜春色av| 2020国产精品自拍| 日韩色视频在线观看| 欧美精品久久99| 91国产成人在线| 91免费观看在线| 成人免费视频免费观看| 激情深爱一区二区| 日本va欧美va精品| 午夜视频一区二区三区| 一区二区三区自拍| 亚洲日本va午夜在线电影| 欧美激情在线看| 久久久精品国产免大香伊| 欧美tickling挠脚心丨vk| 91精品国产品国语在线不卡| 欧美日韩成人综合| 欧美三级日韩三级| 欧美图区在线视频| 日本精品一级二级| 91国在线观看| 欧洲一区在线电影| 在线欧美小视频| 欧美午夜精品一区| 欧美中文字幕亚洲一区二区va在线| 99视频一区二区| 91色porny在线视频| jlzzjlzz亚洲日本少妇| www.欧美日韩国产在线| www.av精品| 色综合久久中文字幕综合网 | 国产精品久久久一区麻豆最新章节| 久久久精品一品道一区| 久久久噜噜噜久久人人看| 久久久噜噜噜久久中文字幕色伊伊| 久久午夜电影网| 久久久久久久综合| 久久久久久久电影| 国产视频一区在线播放| 国产视频911| 国产精品美女久久久久aⅴ国产馆| 欧美极品美女视频| 日韩一区日韩二区| 亚洲美女一区二区三区| 一个色在线综合| 亚洲福利视频一区二区| 日韩av网站在线观看| 精品一区二区三区视频在线观看| 久久91精品久久久久久秒播| 国产成人综合网站| 波多野洁衣一区| 欧美曰成人黄网| 欧美一区二区三区在线观看视频 |