⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 q931.c

📁 Q921的LINUX下的驱动源码
💻 C
📖 第 1 页 / 共 5 页
字号:
	}	pri_error(pri, "!! No channel map, no channel, and no ds1?  What am I supposed to identify?\n");	return -1;}static FUNC_DUMP(dump_channel_id){	int pos=0;	int x;	int res = 0;	static const char*	msg_chan_sel[] = {		"No channel selected", "B1 channel", "B2 channel","Any channel selected" 		"No channel selected", "As indicated in following octets", "Reserved","Any channel selected"	};	pri_message(pri, "%c Channel ID (len=%2d) [ Ext: %d  IntID: %s  %s  Spare: %d  %s  Dchan: %d\n",		prefix, len, (ie->data[0] & 0x80) ? 1 : 0, (ie->data[0] & 0x40) ? "Explicit" : "Implicit",		(ie->data[0] & 0x20) ? "PRI" : "Other", (ie->data[0] & 0x10) ? 1 : 0,		(ie->data[0] & 0x08) ? "Exclusive" : "Preferred",  (ie->data[0] & 0x04) ? 1 : 0);	pri_message(pri, "%c                        ChanSel: %s\n",		prefix, msg_chan_sel[(ie->data[0] & 0x3) + ((ie->data[0]>>3) & 0x4)]);	pos++;	len--;	if (ie->data[0] &  0x40) {		/* Explicitly defined DS1 */		pri_message(pri, "%c                       Ext: %d  DS1 Identifier: %d  \n", prefix, (ie->data[pos] & 0x80) >> 7, ie->data[pos] & 0x7f);		pos++;	} else {		/* Implicitly defined DS1 */	}	if (pos+2 < len) {		/* Still more information here */		pri_message(pri, "%c                       Ext: %d  Coding: %d  %s Specified  Channel Type: %d\n",				prefix, (ie->data[pos] & 0x80) >> 7, (ie->data[pos] & 60) >> 5, 				(ie->data[pos] & 0x10) ? "Slot Map" : "Number", ie->data[pos] & 0x0f);		if (!(ie->data[pos] & 0x10)) {			/* Number specified */			pos++;			pri_message(pri, "%c                       Ext: %d  Channel: %d ]\n", prefix, (ie->data[pos] & 0x80) >> 7, 				(ie->data[pos]) & 0x7f);		} else {			pos++;			/* Map specified */			for (x=0;x<3;x++) {				res <<= 8;				res |= ie->data[pos++];			}			pri_message(pri, "%c                       Map: %s ]\n", prefix, binary(res, 24));		}	} else pri_message(pri, "                         ]\n");				}static char *ri2str(int ri){	static struct msgtype ris[] = {		{ 0, "Indicated Channel" },		{ 6, "Single DS1 Facility" },		{ 7, "All DS1 Facilities" },	};	return code2str(ri, ris, sizeof(ris) / sizeof(ris[0]));}static FUNC_DUMP(dump_restart_indicator){	pri_message(pri, "%c Restart Indentifier (len=%2d) [ Ext: %d  Spare: %d  Resetting %s (%d) ]\n", 		prefix, len, (ie->data[0] & 0x80) >> 7, (ie->data[0] & 0x78) >> 3, ri2str(ie->data[0] & 0x7), ie->data[0] & 0x7);}static FUNC_RECV(receive_restart_indicator){	/* Pretty simple */	call->ri = ie->data[0] & 0x7;	return 0;}static FUNC_SEND(transmit_restart_indicator){	/* Pretty simple */	switch(call->ri) {	case 0:	case 6:	case 7:		ie->data[0] = 0x80 | (call->ri & 0x7);		break;	case 5:		/* Switch compatibility */		ie->data[0] = 0xA0 | (call->ri & 0x7);		break;	default:		pri_error(pri, "!! Invalid restart indicator value %d\n", call->ri);		return-1;	}	return 3;}static char *redirection_reason2str(int mode){	static struct msgtype modes[] = {		{ PRI_REDIR_UNKNOWN, "Unknown" },		{ PRI_REDIR_FORWARD_ON_BUSY, "Forwarded on busy" },		{ PRI_REDIR_FORWARD_ON_NO_REPLY, "Forwarded on no reply" },		{ PRI_REDIR_DEFLECTION, "Call deflected" },		{ PRI_REDIR_DTE_OUT_OF_ORDER, "Called DTE out of order" },		{ PRI_REDIR_FORWARDED_BY_DTE, "Forwarded by called DTE" },		{ PRI_REDIR_UNCONDITIONAL, "Forwarded unconditionally" },	};	return code2str(mode, modes, sizeof(modes) / sizeof(modes[0]));}static char *cap2str(int mode){	static struct msgtype modes[] = {		{ PRI_TRANS_CAP_SPEECH, "Speech" },		{ PRI_TRANS_CAP_DIGITAL, "Unrestricted digital information" },		{ PRI_TRANS_CAP_RESTRICTED_DIGITAL, "Restricted digital information" },		{ PRI_TRANS_CAP_3_1K_AUDIO, "3.1kHz audio" },		{ PRI_TRANS_CAP_DIGITAL_W_TONES, "Unrestricted digital information with tones/announcements" },		{ PRI_TRANS_CAP_VIDEO, "Video" },		{ PRI_TRANS_CAP_AUDIO_4ESS, "3.1khz audio (4ESS)" },	};	return code2str(mode, modes, sizeof(modes) / sizeof(modes[0]));}static char *mode2str(int mode){	static struct msgtype modes[] = {		{ TRANS_MODE_64_CIRCUIT, "64kbps, circuit-mode" },		{ TRANS_MODE_2x64_CIRCUIT, "2x64kbps, circuit-mode" },		{ TRANS_MODE_384_CIRCUIT, "384kbps, circuit-mode" },		{ TRANS_MODE_1536_CIRCUIT, "1536kbps, circuit-mode" },		{ TRANS_MODE_1920_CIRCUIT, "1920kbps, circuit-mode" },		{ TRANS_MODE_MULTIRATE, "Multirate (Nx64kbps)" },		{ TRANS_MODE_PACKET, "Packet Mode" },	};	return code2str(mode, modes, sizeof(modes) / sizeof(modes[0]));}static char *l12str(int proto){	static struct msgtype protos[] = {		{ PRI_LAYER_1_ITU_RATE_ADAPT, "ITU Rate Adaption" },		{ PRI_LAYER_1_ULAW, "u-Law" },		{ PRI_LAYER_1_ALAW, "A-Law" },		{ PRI_LAYER_1_G721, "G.721 ADPCM" },		{ PRI_LAYER_1_G722_G725, "G.722/G.725 7kHz Audio" },		{ PRI_LAYER_1_G7XX_384K, "G.7xx 384k Video" },		{ PRI_LAYER_1_NON_ITU_ADAPT, "Non-ITU Rate Adaption" },		{ PRI_LAYER_1_V120_RATE_ADAPT, "V.120 Rate Adaption" },		{ PRI_LAYER_1_X31_RATE_ADAPT, "X.31 Rate Adaption" },	};	return code2str(proto, protos, sizeof(protos) / sizeof(protos[0]));}static char *ra2str(int proto){	static struct msgtype protos[] = {		{ RATE_ADAPT_56K, "from 56kbps" },	};	return code2str(proto, protos, sizeof(protos) / sizeof(protos[0]));}static char *l22str(int proto){	static struct msgtype protos[] = {		{ LAYER_2_LAPB, "LAPB" },	};	return code2str(proto, protos, sizeof(protos) / sizeof(protos[0]));}static char *l32str(int proto){	static struct msgtype protos[] = {		{ LAYER_3_X25, "X.25" },	};	return code2str(proto, protos, sizeof(protos) / sizeof(protos[0]));}static FUNC_DUMP(dump_bearer_capability){	int pos=2;	pri_message(pri, "%c Bearer Capability (len=%2d) [ Ext: %d  Q.931 Std: %d  Info transfer capability: %s (%d)\n",		prefix, len, (ie->data[0] & 0x80 ) >> 7, (ie->data[0] & 0x60) >> 5, cap2str(ie->data[0] & 0x1f), (ie->data[0] & 0x1f));	pri_message(pri, "%c                              Ext: %d  Trans mode/rate: %s (%d)\n", prefix, (ie->data[1] & 0x80) >> 7, mode2str(ie->data[1] & 0x7f), ie->data[1] & 0x7f);	if ((ie->data[1] & 0x7f) == 0x18) {	    pri_message(pri, "%c                              Ext: %d  Transfer rate multiplier: %d x 64\n", prefix, (ie->data[2] & 0x80) >> 7, ie->data[2] & 0x7f);		pos++;	}	/* Stop here if no more */	if (pos >= len)		return;	if ((ie->data[1] & 0x7f) != TRANS_MODE_PACKET) {		/* Look for octets 5 and 5.a if present */		pri_message(pri, "%c                              Ext: %d  User information layer 1: %s (%d)\n", prefix, (ie->data[pos] >> 7), l12str(ie->data[pos] & 0x7f), ie->data[pos] & 0x7f);		if ((ie->data[pos] & 0x7f) == PRI_LAYER_1_ITU_RATE_ADAPT)			pri_message(pri, "%c                                Ext: %d  Rate adaptatation: %s (%d)\n", prefix, ie->data[pos] >> 7, ra2str(ie->data[pos] & 0x7f), ie->data[pos] & 0x7f);		pos++;	} else {		/* Look for octets 6 and 7 but not 5 and 5.a */		pri_message(pri, "%c                              Ext: %d  User information layer 2: %s (%d)\n", prefix, ie->data[pos] >> 7, l22str(ie->data[pos] & 0x7f), ie->data[pos] & 0x7f);		pos++;		pri_message(pri, "%c                              Ext: %d  User information layer 3: %s (%d)\n", prefix, ie->data[pos] >> 7, l32str(ie->data[pos] & 0x7f), ie->data[pos] & 0x7f);		pos++;	}}static FUNC_RECV(receive_bearer_capability){	int pos=2;	if (ie->data[0] & 0x60) {		pri_error(pri, "!! non-standard Q.931 standard field\n");		return -1;	}	call->transcapability = ie->data[0] & 0x1f;	call->transmoderate = ie->data[1] & 0x7f;	if (call->transmoderate == PRI_TRANS_CAP_AUDIO_4ESS)		call->transmoderate = PRI_TRANS_CAP_3_1K_AUDIO;	if (call->transmoderate != TRANS_MODE_PACKET) {		call->userl1 = ie->data[pos] & 0x7f;		if (call->userl1 == PRI_LAYER_1_ITU_RATE_ADAPT) {			call->rateadaption = ie->data[++pos] & 0x7f;		}		pos++;	} else {		/* Get 6 and 7 */		call->userl2 = ie->data[pos++] & 0x7f;		call->userl3 = ie->data[pos] & 0x7f;	}	return 0;}static FUNC_SEND(transmit_bearer_capability){	int tc;	/* We are ready to transmit single IE only */		if(order > 1)		return 0;	tc = call->transcapability;	if (pri->subchannel) {		/* Bearer capability is *hard coded* in GR-303 */		ie->data[0] = 0x88;		ie->data[1] = 0x90;		return 4;	}		if (call->justsignalling) {		ie->data[0] = 0xa8;		ie->data[1] = 0x80;		return 4;	}		if (pri->switchtype == PRI_SWITCH_ATT4ESS) {		/* 4ESS uses a different trans capability for 3.1khz audio */		if (tc == PRI_TRANS_CAP_3_1K_AUDIO)			tc = PRI_TRANS_CAP_AUDIO_4ESS;	}	ie->data[0] = 0x80 | tc;	ie->data[1] = call->transmoderate | 0x80;	if ((tc & PRI_TRANS_CAP_DIGITAL)&&(pri->switchtype == PRI_SWITCH_EUROISDN_E1)) {		/* Apparently EuroISDN switches don't seem to like user layer 2/3 */		return 4;	}	if (call->transmoderate != TRANS_MODE_PACKET) {		/* If you have an AT&T 4ESS, you don't send any more info */		if ((pri->switchtype != PRI_SWITCH_ATT4ESS) && (call->userl1 > -1)) {			ie->data[2] = call->userl1 | 0x80; /* XXX Ext bit? XXX */			if (call->userl1 == PRI_LAYER_1_ITU_RATE_ADAPT) {				ie->data[3] = call->rateadaption | 0x80;				return 6;			}			return 5;		} else			return 4;	} else {		ie->data[2] = 0x80 | call->userl2;		ie->data[3] = 0x80 | call->userl3;		return 6;	}}char *pri_plan2str(int plan){	static struct msgtype plans[] = {		{ PRI_INTERNATIONAL_ISDN, "International number in ISDN" },		{ PRI_NATIONAL_ISDN, "National number in ISDN" },		{ PRI_LOCAL_ISDN, "Local number in ISDN" },		{ PRI_PRIVATE, "Private numbering plan" },		{ PRI_UNKNOWN, "Unknown numbering plan" },	};	return code2str(plan, plans, sizeof(plans) / sizeof(plans[0]));}static char *npi2str(int plan){	static struct msgtype plans[] = {		{ PRI_NPI_UNKNOWN, "Unknown Number Plan" },		{ PRI_NPI_E163_E164, "ISDN/Telephony Numbering Plan (E.164/E.163)" },		{ PRI_NPI_X121, "Data Numbering Plan (X.121)" },		{ PRI_NPI_F69, "Telex Numbering Plan (F.69)" },		{ PRI_NPI_NATIONAL, "National Standard Numbering Plan" },		{ PRI_NPI_PRIVATE, "Private Numbering Plan" },		{ PRI_NPI_RESERVED, "Reserved Number Plan" },	};	return code2str(plan, plans, sizeof(plans) / sizeof(plans[0]));}static char *ton2str(int plan){	static struct msgtype plans[] = {		{ PRI_TON_UNKNOWN, "Unknown Number Type" },		{ PRI_TON_INTERNATIONAL, "International Number" },		{ PRI_TON_NATIONAL, "National Number" },		{ PRI_TON_NET_SPECIFIC, "Network Specific Number" },		{ PRI_TON_SUBSCRIBER, "Subscriber Number" },		{ PRI_TON_ABBREVIATED, "Abbreviated number" },		{ PRI_TON_RESERVED, "Reserved Number" },	};	return code2str(plan, plans, sizeof(plans) / sizeof(plans[0]));}static char *subaddrtype2str(int plan){	static struct msgtype plans[] = {		{ 0, "NSAP (X.213/ISO 8348 AD2)" },		{ 2, "User Specified" },	};	return code2str(plan, plans, sizeof(plans) / sizeof(plans[0]));}char *pri_pres2str(int pres){	static struct msgtype press[] = {		{ PRES_ALLOWED_USER_NUMBER_NOT_SCREENED, "Presentation permitted, user number not screened" },		{ PRES_ALLOWED_USER_NUMBER_PASSED_SCREEN, "Presentation permitted, user number passed network screening" },		{ PRES_ALLOWED_USER_NUMBER_FAILED_SCREEN, "Presentation permitted, user number failed network screening" },		{ PRES_ALLOWED_NETWORK_NUMBER, "Presentation allowed of network provided number" },		{ PRES_PROHIB_USER_NUMBER_NOT_SCREENED, "Presentation prohibited, user number not screened" },		{ PRES_PROHIB_USER_NUMBER_PASSED_SCREEN, "Presentation prohibited, user number passed network screening" },		{ PRES_PROHIB_USER_NUMBER_FAILED_SCREEN, "Presentation prohibited, user number failed network screening" },		{ PRES_PROHIB_NETWORK_NUMBER, "Presentation prohibited of network provided number" },		{ PRES_NUMBER_NOT_AVAILABLE, "Number not available" },	};	return code2str(pres, press, sizeof(press) / sizeof(press[0]));}static void q931_get_number(unsigned char *num, int maxlen, unsigned char *src, int len){	if ((len < 0) || (len > maxlen - 1)) {		num[0] = 0;		return;	}	memcpy(num, src, len);	num[len] = 0;}static FUNC_DUMP(dump_called_party_number){	unsigned char cnum[256];	q931_get_number(cnum, sizeof(cnum), ie->data + 1, len - 3);	pri_message(pri, "%c Called Number (len=%2d) [ Ext: %d  TON: %s (%d)  NPI: %s (%d)  '%s' ]\n",		prefix, len, ie->data[0] >> 7, ton2str((ie->data[0] >> 4) & 0x07), (ie->data[0] >> 4) & 0x07, npi2str(ie->data[0] & 0x0f), ie->data[0] & 0x0f, cnum);}static FUNC_DUMP(dump_called_party_subaddr){	unsigned char cnum[256];	q931_get_number(cnum, sizeof(cnum), ie->data + 1, len - 3);	pri_message(pri, "%c Called Sub-Address (len=%2d) [ Ext: %d  Type: %s (%d)  O: %d  '%s' ]\n",		prefix, len, ie->data[0] >> 7,		subaddrtype2str((ie->data[0] & 0x70) >> 4), (ie->data[0] & 0x70) >> 4,		(ie->data[0] & 0x08) >> 3, cnum);}static FUNC_DUMP(dump_calling_party_number){	unsigned char cnum[256];	if (ie->data[0] & 0x80)		q931_get_number(cnum, sizeof(cnum), ie->data + 1, len - 3);	else		q931_get_number(cnum, sizeof(cnum), ie->data + 2, len - 4);	pri_message(pri, "%c Calling Number (len=%2d) [ Ext: %d  TON: %s (%d)  NPI: %s (%d)\n", prefix, len, ie->data[0] >> 7, ton2str((ie->data[0] >> 4) & 0x07), (ie->data[0] >> 4) & 0x07, npi2str(ie->data[0] & 0x0f), ie->data[0] & 0x0f);	if (ie->data[0] & 0x80)		pri_message(pri, "%c                           Presentation: %s (%d)  '%s' ]\n", prefix, pri_pres2str(0), 0, cnum);	else		pri_message(pri, "%c                           Presentation: %s (%d)  '%s' ]\n", prefix, pri_pres2str(ie->data[1] & 0x7f), ie->data[1] & 0x7f, cnum);}static FUNC_DUMP(dump_calling_party_subaddr){	unsigned char cnum[256];	q931_get_number(cnum, sizeof(cnum), ie->data + 1, len - 3);	pri_message(pri, "%c Calling Sub-Address (len=%2d) [ Ext: %d  Type: %s (%d)  O: %d  '%s' ]\n",		prefix, len, ie->data[0] >> 7,		subaddrtype2str((ie->data[0] & 0x70) >> 4), (ie->data[0] & 0x70) >> 4,		(ie->data[0] & 0x08) >> 3, cnum);}static FUNC_DUMP(dump_redirecting_number){	unsigned char cnum[256];	int i = 0;	/* To follow Q.931 (4.5.1), we must search for start of octet 4 by	   walking through all bytes until one with ext bit (8) set to 1 */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -