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

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

?? q921.c

?? Q.931/Q.921 source code compiles
?? C
?? 第 1 頁 / 共 3 頁
字號:
/* * libpri: An implementation of Primary Rate ISDN * * Written by Mark Spencer <markster@digium.com> * * Copyright (C) 2001-2005, Digium, Inc. * All Rights Reserved. *//* * See http://www.asterisk.org for more information about * the Asterisk project. Please do not directly contact * any of the maintainers of this project for assistance; * the project provides a web site, mailing lists and IRC * channels for your use. * * This program is free software, distributed under the terms of * the GNU General Public License Version 2 as published by the * Free Software Foundation. See the LICENSE file included with * this program for more details. * * In addition, when this program is distributed with Asterisk in * any form that would qualify as a 'combined work' or as a * 'derivative work' (but not mere aggregation), you can redistribute * and/or modify the combination under the terms of the license * provided with that copy of Asterisk, instead of the license * terms granted here. */#include <stdio.h>#include <string.h>#include <stdlib.h>#include <unistd.h>#include <errno.h>#include "compat.h"#include "libpri.h"#include "pri_internal.h"#include "pri_q921.h" #include "pri_q931.h"/* * Define RANDOM_DROPS To randomly drop packets in order to simulate loss for testing * retransmission functionality *//*#define RANDOM_DROPS*/#define Q921_INIT(pri, hf) do { \	memset(&(hf),0,sizeof(hf)); \	(hf).h.sapi = (pri)->sapi; \	(hf).h.ea1 = 0; \	(hf).h.ea2 = 1; \	(hf).h.tei = (pri)->tei; \} while(0)static void reschedule_t203(struct pri *pri);static void reschedule_t200(struct pri *pri);static void q921_restart(struct pri *pri, int now);static void q921_tei_release_and_reacquire(struct pri *master);static void q921_discard_retransmissions(struct pri *pri){	struct q921_frame *f, *p;	f = pri->txqueue;	while(f) {		p = f;		f = f->next;		/* Free frame */		free(p);	}	pri->txqueue = NULL;}static int q921_transmit(struct pri *pri, q921_h *h, int len) {	int res;	if (pri->master)		pri = pri->master;#ifdef RANDOM_DROPS   if (!(random() % 3)) {         pri_message(pri, " === Dropping Packet ===\n");         return 0;   }#endif   #ifdef LIBPRI_COUNTERS	pri->q921_txcount++;      #endif	/* Just send it raw */	if (pri->debug & (PRI_DEBUG_Q921_DUMP | PRI_DEBUG_Q921_RAW))		q921_dump(pri, h, len, pri->debug & PRI_DEBUG_Q921_RAW, 1);	/* Write an extra two bytes for the FCS */	res = pri->write_func ? pri->write_func(pri, h, len + 2) : 0;	if (res != (len + 2)) {		pri_error(pri, "Short write: %d/%d (%s)\n", res, len + 2, strerror(errno));		return -1;	}	return 0;}static void q921_send_tei(struct pri *pri, int message, int ri, int ai, int iscommand){	q921_u *f;	if (!(f = calloc(1, sizeof(*f) + 5)))		return;	Q921_INIT(pri, *f);	f->h.c_r = (pri->localtype == PRI_NETWORK) ? iscommand : !iscommand;	f->ft = Q921_FRAMETYPE_U;	f->data[0] = 0x0f;	/* Management entity */	f->data[1] = (ri >> 8) & 0xff;	f->data[2] = ri & 0xff;	f->data[3] = message;	f->data[4] = (ai << 1) | 1;	if (pri->debug & PRI_DEBUG_Q921_STATE)		pri_message(pri, "Sending TEI management message %d, TEI=%d\n", message, ai);	q921_transmit(pri, (q921_h *)f, 8);	free(f);}static void q921_tei_request(void *vpri){	struct pri *pri = (struct pri *)vpri;	if (pri->subchannel) {		pri_error(pri, "Cannot request TEI while its already assigned\n");		return;	}	pri->n202_counter++;#if 0	if (pri->n202_counter > pri->timers[PRI_TIMER_N202]) {		pri_error(pri, "Unable to assign TEI from network\n");		return;	}#endif	pri->ri = random() % 65535;	q921_send_tei(pri, Q921_TEI_IDENTITY_REQUEST, pri->ri, Q921_TEI_GROUP, 1);	if (pri->t202_timer)		pri_schedule_del(pri, pri->t202_timer);	pri->t202_timer = pri_schedule_event(pri, pri->timers[PRI_TIMER_T202], q921_tei_request, pri);}static void q921_send_ua(struct pri *pri, int pfbit){	q921_h h;	Q921_INIT(pri, h);	h.u.m3 = 3;		/* M3 = 3 */	h.u.m2 = 0;		/* M2 = 0 */	h.u.p_f = pfbit;	/* Final bit on */	h.u.ft = Q921_FRAMETYPE_U;	switch(pri->localtype) {	case PRI_NETWORK:		h.h.c_r = 0;		break;	case PRI_CPE:		h.h.c_r = 1;		break;	default:		pri_error(pri, "Don't know how to U/A on a type %d node\n", pri->localtype);		return;	}	if (pri->debug & (PRI_DEBUG_Q921_STATE | PRI_DEBUG_Q921_DUMP))		pri_message(pri, "Sending Unnumbered Acknowledgement\n");	q921_transmit(pri, &h, 3);}static void q921_send_sabme_now(void *vpri);static void q921_send_sabme(void *vpri, int now){	struct pri *pri = vpri;	q921_h h;	pri_schedule_del(pri, pri->sabme_timer);	pri->sabme_timer = 0;	pri->sabme_timer = pri_schedule_event(pri, pri->timers[PRI_TIMER_T200], q921_send_sabme_now, pri);	if (!now)		return;	Q921_INIT(pri, h);	h.u.m3 = 3;	/* M3 = 3 */	h.u.m2 = 3;	/* M2 = 3 */	h.u.p_f = 1;	/* Poll bit set */	h.u.ft = Q921_FRAMETYPE_U;	switch(pri->localtype) {	case PRI_NETWORK:		h.h.c_r = 1;		break;	case PRI_CPE:		h.h.c_r = 0;		break;	default:		pri_error(pri, "Don't know how to U/A on a type %d node\n", pri->localtype);		return;	}	if (pri->bri && (pri->state == Q921_AWAITING_ESTABLISH)) {		if (pri->sabme_count >= pri->timers[PRI_TIMER_N200]) {			pri_schedule_del(pri, pri->sabme_timer);			pri->sabme_timer = 0;			q921_tei_release_and_reacquire(pri->master);		} else {			pri->sabme_count++;		}	}	if (pri->debug & (PRI_DEBUG_Q921_STATE | PRI_DEBUG_Q921_DUMP))		pri_message(pri, "Sending Set Asynchronous Balanced Mode Extended\n");	q921_transmit(pri, &h, 3);	if (pri->debug & PRI_DEBUG_Q921_STATE && pri->q921_state != Q921_AWAITING_ESTABLISH)		pri_message(pri, DBGHEAD "q921_state now is Q921_AWAITING_ESTABLISH\n", DBGINFO);	pri->q921_state = Q921_AWAITING_ESTABLISH;}static void q921_send_sabme_now(void *vpri){	q921_send_sabme(vpri, 1);}static int q921_ack_packet(struct pri *pri, int num){	struct q921_frame *f, *prev = NULL;	f = pri->txqueue;	while(f) {		if (f->h.n_s == num) {			/* Cancel each packet as necessary */			/* That's our packet */			if (prev)				prev->next = f->next;			else				pri->txqueue = f->next;			if (pri->debug & PRI_DEBUG_Q921_DUMP)				pri_message(pri, "-- ACKing packet %d, new txqueue is %d (-1 means empty)\n", f->h.n_s, pri->txqueue ? pri->txqueue->h.n_s : -1);			/* Update v_a */			pri->v_a = num;			free(f);			/* Reset retransmission counter if we actually acked something */			pri->retrans = 0;			/* Decrement window size */			pri->windowlen--;			return 1;		}		prev = f;		f = f->next;	}	return 0;}static void t203_expire(void *);static void t200_expire(void *);static pri_event *q921_dchannel_down(struct pri *pri);static void reschedule_t200(struct pri *pri){	if (pri->debug & PRI_DEBUG_Q921_DUMP)		pri_message(pri, "-- Restarting T200 timer\n");	if (pri->t200_timer)		pri_schedule_del(pri, pri->t200_timer);	pri->t200_timer = pri_schedule_event(pri, pri->timers[PRI_TIMER_T200], t200_expire, pri);}static void reschedule_t203(struct pri *pri){	if (pri->debug & PRI_DEBUG_Q921_DUMP)		pri_message(pri, "-- Restarting T203 timer\n");	if (pri->t203_timer) 		pri_schedule_del(pri, pri->t203_timer);	pri->t203_timer = pri_schedule_event(pri, pri->timers[PRI_TIMER_T203], t203_expire, pri);}static pri_event *q921_ack_rx(struct pri *pri, int ack, int send_untransmitted_frames){	int x;	int cnt=0;	pri_event *ev;	struct q921_frame *f;	/* Make sure the ACK was within our window */	for (x=pri->v_a; (x != pri->v_s) && (x != ack); Q921_INC(x));	if (x != ack) {		/* ACK was outside of our window --- ignore */		pri_error(pri, "ACK received for '%d' outside of window of '%d' to '%d', restarting\n", ack, pri->v_a, pri->v_s);		ev = q921_dchannel_down(pri);		q921_start(pri, 1);		pri->schedev = 1;		return ev;	}	/* Cancel each packet as necessary */	if (pri->debug & PRI_DEBUG_Q921_DUMP)		pri_message(pri, "-- ACKing all packets from %d to (but not including) %d\n", pri->v_a, ack);	for (x=pri->v_a; x != ack; Q921_INC(x)) 		cnt += q921_ack_packet(pri, x);		if (!pri->txqueue) {		if (pri->debug & PRI_DEBUG_Q921_DUMP)			pri_message(pri, "-- Since there was nothing left, stopping T200 counter\n");		/* Something was ACK'd.  Stop T200 counter */		if (pri->t200_timer) {			pri_schedule_del(pri, pri->t200_timer);			pri->t200_timer = 0;		}	}	if (pri->t203_timer) {		if (pri->debug & PRI_DEBUG_Q921_DUMP)			pri_message(pri, "-- Stopping T203 counter since we got an ACK\n");		pri_schedule_del(pri, pri->t203_timer);		pri->t203_timer = 0;	}	if (pri->txqueue) {		/* Something left to transmit, Start the T200 counter again if we stopped it */		if (!pri->busy && send_untransmitted_frames) {			pri->retrans = 0;			/* Search for something to send */			f = pri->txqueue;			while(f && (pri->windowlen < pri->window)) {				if (!f->transmitted) {					/* Send it now... */					if (pri->debug & PRI_DEBUG_Q921_DUMP)						pri_message(pri, "-- Finally transmitting %d, since window opened up (%d)\n", f->h.n_s, pri->windowlen);					f->transmitted++;					pri->windowlen++;					f->h.n_r = pri->v_r;					f->h.p_f = 0;					q921_transmit(pri, (q921_h *)(&f->h), f->len);				}				f = f->next;			}		}		if (pri->debug & PRI_DEBUG_Q921_DUMP)			pri_message(pri, "-- Waiting for acknowledge, restarting T200 counter\n");				reschedule_t200(pri);	} else {		if (pri->debug & PRI_DEBUG_Q921_DUMP)			pri_message(pri, "-- Nothing left, starting T203 counter\n");		/* Nothing to transmit, start the T203 counter instead */		pri->t203_timer = pri_schedule_event(pri, pri->timers[PRI_TIMER_T203], t203_expire, pri);	}	return NULL;}static void q921_reject(struct pri *pri, int pf){	q921_h h;	Q921_INIT(pri, h);	h.s.x0 = 0;	/* Always 0 */	h.s.ss = 2;	/* Reject */	h.s.ft = 1;	/* Frametype (01) */	h.s.n_r = pri->v_r;	/* Where to start retransmission */	h.s.p_f = pf;		switch(pri->localtype) {	case PRI_NETWORK:		h.h.c_r = 0;		break;	case PRI_CPE:		h.h.c_r = 1;		break;	default:		pri_error(pri, "Don't know how to U/A on a type %d node\n", pri->localtype);		return;	}	if (pri->debug & PRI_DEBUG_Q921_DUMP)		pri_message(pri, "Sending Reject (%d)\n", pri->v_r);	pri->sentrej = 1;	q921_transmit(pri, &h, 4);}static void q921_rr(struct pri *pri, int pbit, int cmd) {	q921_h h;	Q921_INIT(pri, h);	h.s.x0 = 0;	/* Always 0 */	h.s.ss = 0; /* Receive Ready */	h.s.ft = 1;	/* Frametype (01) */	h.s.n_r = pri->v_r;	/* N/R */	h.s.p_f = pbit;		/* Poll/Final set appropriately */	switch(pri->localtype) {	case PRI_NETWORK:		if (cmd)			h.h.c_r = 1;		else			h.h.c_r = 0;		break;	case PRI_CPE:		if (cmd)			h.h.c_r = 0;		else			h.h.c_r = 1;		break;	default:		pri_error(pri, "Don't know how to U/A on a type %d node\n", pri->localtype);		return;	}	pri->v_na = pri->v_r;	/* Make a note that we've already acked this */	if (pri->debug & PRI_DEBUG_Q921_DUMP)		pri_message(pri, "Sending Receiver Ready (%d)\n", pri->v_r);	q921_transmit(pri, &h, 4);}static void t200_expire(void *vpri){	struct pri *pri = vpri;	q921_frame *f, *lastframe=NULL;	if (pri->txqueue) {		/* Retransmit first packet in the queue, setting the poll bit */		if (pri->debug & PRI_DEBUG_Q921_DUMP)			pri_message(pri, "-- T200 counter expired, What to do...\n");		pri->solicitfbit = 1;		/* Up to three retransmissions */		if (pri->retrans < pri->timers[PRI_TIMER_N200]) {			pri->retrans++;			/* Reschedule t200_timer */			if (pri->debug & PRI_DEBUG_Q921_DUMP)				pri_message(pri, "-- Retransmitting %d bytes\n", pri->txqueue->len);			if (pri->busy) 				q921_rr(pri, 1, 1);			else {				if (!pri->txqueue->transmitted) 					pri_error(pri, "!! Not good - head of queue has not been transmitted yet\n");				/*Actually we need to retransmit the last transmitted packet, setting the poll bit */				for (f=pri->txqueue; f; f = f->next) {					if (f->transmitted)						lastframe = f;				}				if (lastframe) {					/* Force Poll bit */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品色呦呦| 91麻豆国产自产在线观看| av激情综合网| 中文字幕乱码一区二区免费| 日本不卡一二三| 欧美日韩国产区一| 亚洲免费资源在线播放| 成人国产电影网| 中文字幕在线观看不卡| 国产成人精品亚洲午夜麻豆| 日韩久久免费av| 日本va欧美va欧美va精品| 国产精品天干天干在线综合| 制服丝袜在线91| 九一九一国产精品| 欧美一区二区三区系列电影| 日韩电影一区二区三区四区| 欧美日韩综合一区| 三级一区在线视频先锋| 制服丝袜在线91| 91麻豆产精品久久久久久| 久久国产精品99久久人人澡| 国产欧美日韩三级| 99久久精品一区二区| 亚洲伊人伊色伊影伊综合网| 在线精品国精品国产尤物884a| 亚洲韩国精品一区| 91麻豆精品91久久久久久清纯| 色综合中文综合网| 日韩欧美的一区| 欧美日韩国产高清一区二区三区 | 欧美成人欧美edvon| 国产一区在线精品| 国产精品久久午夜夜伦鲁鲁| 欧美日韩一区三区四区| 色综合天天综合在线视频| 成人h动漫精品一区二| 国产成人免费网站| 国产福利精品一区二区| 国产一区二区三区蝌蚪| 狠狠网亚洲精品| 一区二区三区精品视频在线| 69堂国产成人免费视频| 欧美优质美女网站| 三级不卡在线观看| 亚洲午夜精品在线| 亚洲网友自拍偷拍| 婷婷国产在线综合| 中文字幕欧美国产| 欧美激情综合网| 国产精品久久免费看| 国产精品久久毛片av大全日韩| 国产精品视频一区二区三区不卡| 国产日韩欧美在线一区| 日本一区二区动态图| 亚洲丝袜精品丝袜在线| 337p日本欧洲亚洲大胆色噜噜| www.99精品| 色婷婷精品久久二区二区蜜臂av| 久久精品国产亚洲aⅴ| 激情综合网激情| 成人国产视频在线观看| 91黄视频在线观看| 国产福利一区二区三区视频在线| 成人精品电影在线观看| 色婷婷综合激情| 日韩欧美一二三四区| 国产欧美1区2区3区| 亚洲美女电影在线| 婷婷夜色潮精品综合在线| 激情另类小说区图片区视频区| 国产盗摄视频一区二区三区| 成人a级免费电影| 欧美日韩大陆一区二区| 日韩免费视频一区二区| 亚洲国产精品高清| 午夜久久久久久久久久一区二区| 免费久久精品视频| 99久久精品费精品国产一区二区 | 欧美一区二区三区在线视频| 久久精品在这里| 久久香蕉国产线看观看99| 国产精品久久午夜夜伦鲁鲁| 日日摸夜夜添夜夜添亚洲女人| 国产精品一线二线三线精华| 国产一区二区三区四区五区美女| 99国产麻豆精品| 日韩一区二区视频| 欧美成人女星排名| 一区二区高清在线| 国产成人综合在线| 欧美一级片免费看| 亚洲精品ww久久久久久p站| 亚洲男帅同性gay1069| 日本人妖一区二区| 一本色道亚洲精品aⅴ| 精品国产伦一区二区三区观看方式| 91精品国产91久久综合桃花| 国产精品蜜臀在线观看| 久久99精品视频| 欧美日韩一级片网站| 国产精品视频在线看| 日本不卡一区二区三区高清视频| 97超碰欧美中文字幕| 久久这里只有精品6| 轻轻草成人在线| 91精品办公室少妇高潮对白| 久久免费视频色| 亚洲日本丝袜连裤袜办公室| 麻豆精品久久精品色综合| 国产美女视频一区| 欧美精品乱人伦久久久久久| 欧美r级在线观看| 亚洲国产精品自拍| 色嗨嗨av一区二区三区| 国产欧美va欧美不卡在线| 国产在线视频精品一区| 欧美日韩免费电影| 亚洲男同性视频| www.久久精品| 亚洲国产精品av| 粉嫩嫩av羞羞动漫久久久 | 欧美成人三级电影在线| 婷婷久久综合九色国产成人 | 在线一区二区视频| 成人免费视频在线观看| 成人永久看片免费视频天堂| 色婷婷激情综合| 一区免费观看视频| youjizz国产精品| 国产精品欧美久久久久一区二区| 韩国av一区二区三区在线观看| 日韩欧美一级二级| 九九九久久久精品| 精品福利在线导航| 国产一区二区毛片| www久久久久| 国产福利一区二区三区视频在线 | 欧美亚洲国产bt| 亚洲一区在线播放| 欧美色涩在线第一页| 午夜电影一区二区| 日韩欧美一区中文| 久久机这里只有精品| 日韩一卡二卡三卡| 激情文学综合网| 国产性做久久久久久| 成人美女视频在线观看| 成人欧美一区二区三区| 色婷婷av一区| 婷婷成人综合网| 亚洲精品一区二区三区精华液| 国产乱人伦精品一区二区在线观看| 国产日韩欧美制服另类| www.日韩在线| 午夜影院在线观看欧美| 99久久er热在这里只有精品15 | 久久国产精品99精品国产| 亚洲精品一区二区三区香蕉| 懂色av中文一区二区三区| 国产精品不卡在线| 欧洲色大大久久| 奇米综合一区二区三区精品视频| 欧美精品一区在线观看| www.av精品| 日韩激情av在线| 国产偷国产偷精品高清尤物 | 亚洲大片在线观看| 欧美成人伊人久久综合网| 国产成人av影院| 亚洲愉拍自拍另类高清精品| 精品日产卡一卡二卡麻豆| 国产精品一区专区| 亚洲愉拍自拍另类高清精品| 日韩一级视频免费观看在线| 国产v综合v亚洲欧| 亚洲国产日韩精品| 久久久亚洲综合| 欧美日韩一区二区在线视频| 精品一区免费av| 曰韩精品一区二区| 久久久久久久久久电影| 欧美午夜精品电影| 国产大陆精品国产| 日韩成人av影视| 亚洲欧美区自拍先锋| 欧美大度的电影原声| 91在线视频网址| 久久精品国产在热久久| 一区二区三区四区五区视频在线观看| 日韩一区二区电影网| 91看片淫黄大片一级| 激情久久久久久久久久久久久久久久| 亚洲视频一二三| 久久精品视频网| 日韩亚洲欧美综合| 91久久线看在观草草青青| 韩国女主播成人在线| 亚洲国产va精品久久久不卡综合| 国产日韩欧美一区二区三区乱码|