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

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

?? sch_atm.c

?? ARM 嵌入式 系統(tǒng) 設(shè)計(jì)與實(shí)例開(kāi)發(fā) 實(shí)驗(yàn)教材 二源碼
?? C
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
}static void atm_tc_walk(struct Qdisc *sch,struct qdisc_walker *walker){	struct atm_qdisc_data *p = PRIV(sch);	struct atm_flow_data *flow;	DPRINTK("atm_tc_walk(sch %p,[qdisc %p],walker %p)\n",sch,p,walker);	if (walker->stop) return;	for (flow = p->flows; flow; flow = flow->next) {		if (walker->count >= walker->skip)			if (walker->fn(sch,(unsigned long) flow,walker) < 0) {				walker->stop = 1;				break;			}		walker->count++;	}}static struct tcf_proto **atm_tc_find_tcf(struct Qdisc *sch,unsigned long cl){	struct atm_qdisc_data *p = PRIV(sch);	struct atm_flow_data *flow = (struct atm_flow_data *) cl;	DPRINTK("atm_tc_find_tcf(sch %p,[qdisc %p],flow %p)\n",sch,p,flow);        return flow ? &flow->filter_list : &p->link.filter_list;}/* --------------------------- Qdisc operations ---------------------------- */static int atm_tc_enqueue(struct sk_buff *skb,struct Qdisc *sch){	struct atm_qdisc_data *p = PRIV(sch);	struct atm_flow_data *flow = NULL ; /* @@@ */	struct tcf_result res;	int result;	int ret = NET_XMIT_POLICED;	D2PRINTK("atm_tc_enqueue(skb %p,sch %p,[qdisc %p])\n",skb,sch,p);	result = TC_POLICE_OK; /* be nice to gcc */	if (TC_H_MAJ(skb->priority) != sch->handle ||	    !(flow = (struct atm_flow_data *) atm_tc_get(sch,skb->priority)))		for (flow = p->flows; flow; flow = flow->next)			if (flow->filter_list) {				result = tc_classify(skb,flow->filter_list,				    &res);				if (result < 0) continue;				flow = (struct atm_flow_data *) res.class;				if (!flow) flow = lookup_flow(sch,res.classid);				break;			}	if (!flow) flow = &p->link;	else {		if (flow->vcc)			ATM_SKB(skb)->atm_options = flow->vcc->atm_options;			/*@@@ looks good ... but it's not supposed to work :-)*/#ifdef CONFIG_NET_CLS_POLICE		switch (result) {			case TC_POLICE_SHOT:				kfree_skb(skb);				break;			case TC_POLICE_RECLASSIFY:				if (flow->excess) flow = flow->excess;				else {					ATM_SKB(skb)->atm_options |=					    ATM_ATMOPT_CLP;					break;				}				/* fall through */			case TC_POLICE_OK:				/* fall through */			default:				break;		}#endif	}	if (#ifdef CONFIG_NET_CLS_POLICE	    result == TC_POLICE_SHOT ||#endif	    (ret = flow->q->enqueue(skb,flow->q)) != 0) {		sch->stats.drops++;		if (flow) flow->stats.drops++;		return ret;	}	sch->stats.bytes += skb->len;	sch->stats.packets++;	flow->stats.bytes += skb->len;	flow->stats.packets++;	/*	 * Okay, this may seem weird. We pretend we've dropped the packet if	 * it goes via ATM. The reason for this is that the outer qdisc	 * expects to be able to q->dequeue the packet later on if we return	 * success at this place. Also, sch->q.qdisc needs to reflect whether	 * there is a packet egligible for dequeuing or not. Note that the	 * statistics of the outer qdisc are necessarily wrong because of all	 * this. There's currently no correct solution for this.	 */	if (flow == &p->link) {		sch->q.qlen++;		return 0;	}	tasklet_schedule(&p->task);	return NET_XMIT_BYPASS;}/* * Dequeue packets and send them over ATM. Note that we quite deliberately * avoid checking net_device's flow control here, simply because sch_atm * uses its own channels, which have nothing to do with any CLIP/LANE/or * non-ATM interfaces. */static void sch_atm_dequeue(unsigned long data){	struct Qdisc *sch = (struct Qdisc *) data;	struct atm_qdisc_data *p = PRIV(sch);	struct atm_flow_data *flow;	struct sk_buff *skb;	D2PRINTK("sch_atm_dequeue(sch %p,[qdisc %p])\n",sch,p);	for (flow = p->link.next; flow; flow = flow->next)		/*		 * If traffic is properly shaped, this won't generate nasty		 * little bursts. Otherwise, it may ... (but that's okay)		 */		while ((skb = flow->q->dequeue(flow->q))) {			if (!atm_may_send(flow->vcc,skb->truesize)) {				(void) flow->q->ops->requeue(skb,flow->q);				break;			}			D2PRINTK("atm_tc_deqeueue: sending on class %p\n",flow);			/* remove any LL header somebody else has attached */			skb_pull(skb,(char *) skb->nh.iph-(char *) skb->data);			if (skb_headroom(skb) < flow->hdr_len) {				struct sk_buff *new;				new = skb_realloc_headroom(skb,flow->hdr_len);				dev_kfree_skb(skb);				if (!new) continue;				skb = new;			}			D2PRINTK("sch_atm_dequeue: ip %p, data %p\n",			    skb->nh.iph,skb->data);			ATM_SKB(skb)->vcc = flow->vcc;			memcpy(skb_push(skb,flow->hdr_len),flow->hdr,			    flow->hdr_len);			atomic_add(skb->truesize,&flow->vcc->tx_inuse);			ATM_SKB(skb)->iovcnt = 0;			/* atm.atm_options are already set by atm_tc_enqueue */			(void) flow->vcc->send(flow->vcc,skb);		}}static struct sk_buff *atm_tc_dequeue(struct Qdisc *sch){	struct atm_qdisc_data *p = PRIV(sch);	struct sk_buff *skb;	D2PRINTK("atm_tc_dequeue(sch %p,[qdisc %p])\n",sch,p);	tasklet_schedule(&p->task);	skb = p->link.q->dequeue(p->link.q);	if (skb) sch->q.qlen--;	return skb;}static int atm_tc_requeue(struct sk_buff *skb,struct Qdisc *sch){	struct atm_qdisc_data *p = PRIV(sch);	int ret;	D2PRINTK("atm_tc_requeue(skb %p,sch %p,[qdisc %p])\n",skb,sch,p);	ret = p->link.q->ops->requeue(skb,p->link.q);	if (!ret) sch->q.qlen++;	else {		sch->stats.drops++;		p->link.stats.drops++;	}	return ret;}static int atm_tc_drop(struct Qdisc *sch){	struct atm_qdisc_data *p = PRIV(sch);	struct atm_flow_data *flow;	DPRINTK("atm_tc_drop(sch %p,[qdisc %p])\n",sch,p);	for (flow = p->flows; flow; flow = flow->next)		if (flow->q->ops->drop && flow->q->ops->drop(flow->q))			return 1;	return 0;}static int atm_tc_init(struct Qdisc *sch,struct rtattr *opt){	struct atm_qdisc_data *p = PRIV(sch);	DPRINTK("atm_tc_init(sch %p,[qdisc %p],opt %p)\n",sch,p,opt);	memset(p,0,sizeof(*p));	p->flows = &p->link;	if(!(p->link.q = qdisc_create_dflt(sch->dev,&pfifo_qdisc_ops)))		p->link.q = &noop_qdisc;	DPRINTK("atm_tc_init: link (%p) qdisc %p\n",&p->link,p->link.q);	p->link.filter_list = NULL;	p->link.vcc = NULL;	p->link.sock = NULL;	p->link.classid = sch->handle;	p->link.ref = 1;	p->link.next = NULL;	tasklet_init(&p->task,sch_atm_dequeue,(unsigned long) sch);	MOD_INC_USE_COUNT;	return 0;}static void atm_tc_reset(struct Qdisc *sch){	struct atm_qdisc_data *p = PRIV(sch);	struct atm_flow_data *flow;	DPRINTK("atm_tc_reset(sch %p,[qdisc %p])\n",sch,p);	for (flow = p->flows; flow; flow = flow->next) qdisc_reset(flow->q);	sch->q.qlen = 0;}static void atm_tc_destroy(struct Qdisc *sch){	struct atm_qdisc_data *p = PRIV(sch);	struct atm_flow_data *flow;	DPRINTK("atm_tc_destroy(sch %p,[qdisc %p])\n",sch,p);	/* races ? */	while ((flow = p->flows)) {		destroy_filters(flow);		if (flow->ref > 1)			printk(KERN_ERR "atm_destroy: %p->ref = %d\n",flow,			    flow->ref);		atm_tc_put(sch,(unsigned long) flow);		if (p->flows == flow) {			printk(KERN_ERR "atm_destroy: putting flow %p didn't "			    "kill it\n",flow);			p->flows = flow->next; /* brute force */			break;		}	}	tasklet_kill(&p->task);	MOD_DEC_USE_COUNT;}static int atm_tc_dump_class(struct Qdisc *sch, unsigned long cl,    struct sk_buff *skb, struct tcmsg *tcm){	struct atm_qdisc_data *p = PRIV(sch);	struct atm_flow_data *flow = (struct atm_flow_data *) cl;	unsigned char *b = skb->tail;	struct rtattr *rta;	DPRINTK("atm_tc_dump_class(sch %p,[qdisc %p],flow %p,skb %p,tcm %p)\n",	    sch,p,flow,skb,tcm);	if (!find_flow(p,flow)) return -EINVAL;	tcm->tcm_handle = flow->classid;	rta = (struct rtattr *) b;	RTA_PUT(skb,TCA_OPTIONS,0,NULL);	RTA_PUT(skb,TCA_ATM_HDR,flow->hdr_len,flow->hdr);	if (flow->vcc) {		struct sockaddr_atmpvc pvc;		int state;		pvc.sap_family = AF_ATMPVC;		pvc.sap_addr.itf = flow->vcc->dev ? flow->vcc->dev->number : -1;		pvc.sap_addr.vpi = flow->vcc->vpi;		pvc.sap_addr.vci = flow->vcc->vci;		RTA_PUT(skb,TCA_ATM_ADDR,sizeof(pvc),&pvc);		state = ATM_VF2VS(flow->vcc->flags);		RTA_PUT(skb,TCA_ATM_STATE,sizeof(state),&state);	}	if (flow->excess)		RTA_PUT(skb,TCA_ATM_EXCESS,sizeof(u32),&flow->classid);	else {		static u32 zero = 0;		RTA_PUT(skb,TCA_ATM_EXCESS,sizeof(zero),&zero);	}	rta->rta_len = skb->tail-b;	return skb->len;rtattr_failure:	skb_trim(skb,b-skb->data);	return -1;}static int atm_tc_dump(struct Qdisc *sch, struct sk_buff *skb){	return 0;}static struct Qdisc_class_ops atm_class_ops ={	atm_tc_graft,			/* graft */	atm_tc_leaf,			/* leaf */	atm_tc_get,			/* get */	atm_tc_put,			/* put */	atm_tc_change,			/* change */	atm_tc_delete,			/* delete */	atm_tc_walk,			/* walk */	atm_tc_find_tcf,		/* tcf_chain */	atm_tc_bind_filter,		/* bind_tcf */	atm_tc_put,			/* unbind_tcf */	atm_tc_dump_class,		/* dump */};struct Qdisc_ops atm_qdisc_ops ={	NULL,				/* next */	&atm_class_ops,			/* cl_ops */	"atm",	sizeof(struct atm_qdisc_data),	atm_tc_enqueue,			/* enqueue */	atm_tc_dequeue,			/* dequeue */	atm_tc_requeue,			/* requeue */	atm_tc_drop,			/* drop */	atm_tc_init,			/* init */	atm_tc_reset,			/* reset */	atm_tc_destroy,			/* destroy */	NULL,				/* change */	atm_tc_dump			/* dump */};#ifdef MODULEint init_module(void){	return register_qdisc(&atm_qdisc_ops);}void cleanup_module(void) {	unregister_qdisc(&atm_qdisc_ops);}#endif

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
石原莉奈一区二区三区在线观看| 亚洲欧美激情视频在线观看一区二区三区| 国产91综合一区在线观看| 激情综合亚洲精品| 亚洲人成网站影音先锋播放| 精品少妇一区二区三区视频免付费| 日本久久电影网| 国产成人三级在线观看| 蜜桃视频免费观看一区| 一区二区激情视频| 中文字幕精品三区| 精品精品国产高清a毛片牛牛| 在线视频你懂得一区| 福利一区二区在线| 久久精工是国产品牌吗| 亚洲www啪成人一区二区麻豆| 中文字幕一区二区三区av| 久久久久久97三级| 日韩欧美自拍偷拍| 7777精品伊人久久久大香线蕉完整版 | 日韩午夜在线观看| 在线免费精品视频| 91日韩一区二区三区| 成人免费毛片片v| 国产在线一区观看| 久久91精品久久久久久秒播| 视频一区二区中文字幕| 亚洲一区二区精品视频| 亚洲欧美日本韩国| 亚洲欧洲日韩av| 国产精品无码永久免费888| 久久你懂得1024| 26uuu欧美| 欧美刺激午夜性久久久久久久| 欧美另类z0zxhd电影| 欧美午夜影院一区| 欧美手机在线视频| 欧美日韩一二三| 欧美日本在线观看| 欧美日韩国产美| 91精品国产综合久久精品app| 欧美丝袜丝nylons| 制服丝袜中文字幕一区| 欧美一区二区视频观看视频| 欧美一级高清片在线观看| 欧美一区欧美二区| 精品国产人成亚洲区| 91精品国产91久久久久久一区二区| 中文一区一区三区高中清不卡| 91在线精品一区二区三区| 成人av网址在线| 成人精品鲁一区一区二区| 国产成人av一区二区| av在线不卡网| 91久久免费观看| 欧美日韩免费高清一区色橹橹| 欧美卡1卡2卡| 日韩欧美黄色影院| 久久精品在这里| 日韩一区在线播放| 一区二区三区欧美视频| 水蜜桃久久夜色精品一区的特点| 午夜久久久影院| 美女视频一区在线观看| 国产高清亚洲一区| 91理论电影在线观看| 在线观看亚洲a| 日韩视频免费观看高清完整版在线观看| 精品人伦一区二区色婷婷| 欧美国产一区二区| 亚洲综合色丁香婷婷六月图片| 日韩不卡一区二区| 国产传媒一区在线| 91福利资源站| 日韩欧美一级二级三级久久久| 91麻豆精品国产自产在线| 精品少妇一区二区三区视频免付费 | 91福利在线免费观看| 日韩视频中午一区| 国产精品传媒入口麻豆| 日本在线不卡视频一二三区| 国产精品一区免费在线观看| 91久久精品网| 2021久久国产精品不只是精品| 中文字幕一区二区三区在线不卡| 午夜欧美视频在线观看| 国产91丝袜在线观看| 欧美日韩一区精品| 日本一区二区三级电影在线观看| 一区二区三区四区亚洲| 国产一区二区电影| 欧美日韩视频专区在线播放| 中文字幕成人在线观看| 日韩va亚洲va欧美va久久| 91在线丨porny丨国产| 91精品国产麻豆国产自产在线 | 成人免费在线视频| 蜜桃一区二区三区四区| 色婷婷久久一区二区三区麻豆| 欧美videofree性高清杂交| 亚洲另类在线视频| 成人在线视频首页| 欧美一区二区精品久久911| 亚洲欧美日韩一区二区三区在线观看 | 日韩欧美色综合网站| 亚洲色图.com| 国产成人综合在线播放| 91精品免费观看| 亚洲一区二区三区在线| 成人h精品动漫一区二区三区| 日韩欧美色电影| 婷婷国产在线综合| 一本色道久久综合亚洲精品按摩| 国产日产欧美精品一区二区三区| 日韩av中文字幕一区二区三区| 在线观看亚洲一区| 亚洲女同女同女同女同女同69| 国产91高潮流白浆在线麻豆| 亚洲精品一区二区三区蜜桃下载| 免费亚洲电影在线| 欧美日韩在线观看一区二区| 亚洲精品少妇30p| 99久久夜色精品国产网站| 久久精品一区二区| 国产精品中文有码| 2024国产精品| 久久电影国产免费久久电影| 欧美喷水一区二区| 五月天一区二区三区| 色94色欧美sute亚洲线路二| 亚洲精品一二三四区| 色综合色狠狠天天综合色| 亚洲欧美电影院| 色偷偷久久人人79超碰人人澡| 亚洲乱码日产精品bd| 色偷偷一区二区三区| 亚洲一区二区三区国产| 欧美在线小视频| 丝袜亚洲精品中文字幕一区| 6080午夜不卡| 奇米精品一区二区三区在线观看一 | 亚洲愉拍自拍另类高清精品| 色狠狠一区二区三区香蕉| 亚洲精品伦理在线| 欧美日韩一区二区三区四区五区| 香蕉乱码成人久久天堂爱免费| 欧美日韩亚洲综合一区| 水野朝阳av一区二区三区| 日韩亚洲欧美综合| 韩日欧美一区二区三区| 久久久久久亚洲综合| 不卡高清视频专区| 一级女性全黄久久生活片免费| 欧美日韩精品系列| 久久激五月天综合精品| 国产清纯白嫩初高生在线观看91| 成人sese在线| 亚洲动漫第一页| 91精品福利在线一区二区三区 | 99久久免费视频.com| 亚洲午夜久久久久久久久电影网| 欧美日韩国产综合久久| 国内精品第一页| 亚洲色图视频网站| 91麻豆精品国产自产在线| 国产一区二区精品久久91| 亚洲人成亚洲人成在线观看图片| 欧美日韩国产电影| 国产二区国产一区在线观看| 亚洲色图20p| 日韩欧美不卡在线观看视频| 成人av电影在线网| 日韩极品在线观看| 中文字幕欧美激情一区| 欧美日本国产视频| 东方aⅴ免费观看久久av| 亚洲一区二区在线视频| 欧美精品一区二区三区蜜臀| 91浏览器打开| 美国三级日本三级久久99| 日韩毛片高清在线播放| 欧美一区二区久久| 色综合夜色一区| 国精产品一区一区三区mba桃花| 日韩美女视频一区| 精品99一区二区三区| 99精品热视频| 国内精品免费**视频| 亚洲制服丝袜在线| 亚洲国产精品成人久久综合一区| 欧美日韩中文一区| 丁香五精品蜜臀久久久久99网站| 亚洲成人一区在线| 国产精品久久毛片a| 欧美大片拔萝卜| 在线观看av一区二区| 成人免费电影视频| 久久国产免费看| 日韩制服丝袜av| 一区二区三区在线视频播放|