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

📄 capi.c

📁 linux和2410结合开发 用他可以生成2410所需的zImage文件
💻 C
📖 第 1 页 / 共 3 页
字号:
/* $Id: capi.c,v 1.1.4.1 2001/11/20 14:19:34 kai Exp $ * * ISDN lowlevel-module for the IBM ISDN-S0 Active 2000. * CAPI encoder/decoder * * Author       Fritz Elfert * Copyright    by Fritz Elfert      <fritz@isdn4linux.de> *  * This software may be used and distributed according to the terms * of the GNU General Public License, incorporated herein by reference. * * Thanks to Friedemann Baitinger and IBM Germany * */#define __NO_VERSION__#include "act2000.h"#include "capi.h"static actcapi_msgdsc valid_msg[] = {	{{ 0x86, 0x02}, "DATA_B3_IND"},       /* DATA_B3_IND/CONF must be first because of speed!!! */	{{ 0x86, 0x01}, "DATA_B3_CONF"},	{{ 0x02, 0x01}, "CONNECT_CONF"},	{{ 0x02, 0x02}, "CONNECT_IND"},	{{ 0x09, 0x01}, "CONNECT_INFO_CONF"},	{{ 0x03, 0x02}, "CONNECT_ACTIVE_IND"},	{{ 0x04, 0x01}, "DISCONNECT_CONF"},	{{ 0x04, 0x02}, "DISCONNECT_IND"},	{{ 0x05, 0x01}, "LISTEN_CONF"},	{{ 0x06, 0x01}, "GET_PARAMS_CONF"},	{{ 0x07, 0x01}, "INFO_CONF"},	{{ 0x07, 0x02}, "INFO_IND"},	{{ 0x08, 0x01}, "DATA_CONF"},	{{ 0x08, 0x02}, "DATA_IND"},	{{ 0x40, 0x01}, "SELECT_B2_PROTOCOL_CONF"},	{{ 0x80, 0x01}, "SELECT_B3_PROTOCOL_CONF"},	{{ 0x81, 0x01}, "LISTEN_B3_CONF"},	{{ 0x82, 0x01}, "CONNECT_B3_CONF"},	{{ 0x82, 0x02}, "CONNECT_B3_IND"},	{{ 0x83, 0x02}, "CONNECT_B3_ACTIVE_IND"},	{{ 0x84, 0x01}, "DISCONNECT_B3_CONF"},	{{ 0x84, 0x02}, "DISCONNECT_B3_IND"},	{{ 0x85, 0x01}, "GET_B3_PARAMS_CONF"},	{{ 0x01, 0x01}, "RESET_B3_CONF"},	{{ 0x01, 0x02}, "RESET_B3_IND"},	/* {{ 0x87, 0x02, "HANDSET_IND"}, not implemented */	{{ 0xff, 0x01}, "MANUFACTURER_CONF"},	{{ 0xff, 0x02}, "MANUFACTURER_IND"},#ifdef DEBUG_MSG	/* Requests */	{{ 0x01, 0x00}, "RESET_B3_REQ"},	{{ 0x02, 0x00}, "CONNECT_REQ"},	{{ 0x04, 0x00}, "DISCONNECT_REQ"},	{{ 0x05, 0x00}, "LISTEN_REQ"},	{{ 0x06, 0x00}, "GET_PARAMS_REQ"},	{{ 0x07, 0x00}, "INFO_REQ"},	{{ 0x08, 0x00}, "DATA_REQ"},	{{ 0x09, 0x00}, "CONNECT_INFO_REQ"},	{{ 0x40, 0x00}, "SELECT_B2_PROTOCOL_REQ"},	{{ 0x80, 0x00}, "SELECT_B3_PROTOCOL_REQ"},	{{ 0x81, 0x00}, "LISTEN_B3_REQ"},	{{ 0x82, 0x00}, "CONNECT_B3_REQ"},	{{ 0x84, 0x00}, "DISCONNECT_B3_REQ"},	{{ 0x85, 0x00}, "GET_B3_PARAMS_REQ"},	{{ 0x86, 0x00}, "DATA_B3_REQ"},	{{ 0xff, 0x00}, "MANUFACTURER_REQ"},	/* Responses */	{{ 0x01, 0x03}, "RESET_B3_RESP"},		{{ 0x02, 0x03}, "CONNECT_RESP"},		{{ 0x03, 0x03}, "CONNECT_ACTIVE_RESP"},		{{ 0x04, 0x03}, "DISCONNECT_RESP"},		{{ 0x07, 0x03}, "INFO_RESP"},		{{ 0x08, 0x03}, "DATA_RESP"},		{{ 0x82, 0x03}, "CONNECT_B3_RESP"},		{{ 0x83, 0x03}, "CONNECT_B3_ACTIVE_RESP"},		{{ 0x84, 0x03}, "DISCONNECT_B3_RESP"},	{{ 0x86, 0x03}, "DATA_B3_RESP"},	{{ 0xff, 0x03}, "MANUFACTURER_RESP"},#endif	{{ 0x00, 0x00}, NULL},};#define num_valid_msg (sizeof(valid_msg)/sizeof(actcapi_msgdsc))#define num_valid_imsg 27 /* MANUFACTURER_IND *//* * Check for a valid incoming CAPI message. * Return: *   0 = Invalid message *   1 = Valid message, no B-Channel-data *   2 = Valid message, B-Channel-data */intactcapi_chkhdr(act2000_card * card, actcapi_msghdr *hdr){	int i;	if (hdr->applicationID != 1)		return 0;	if (hdr->len < 9)		return 0;	for (i = 0; i < num_valid_imsg; i++)		if ((hdr->cmd.cmd == valid_msg[i].cmd.cmd) &&		    (hdr->cmd.subcmd == valid_msg[i].cmd.subcmd)) {			return (i?1:2);		}	return 0;}#define ACTCAPI_MKHDR(l, c, s) { \	skb = alloc_skb(l + 8, GFP_ATOMIC); \	if (skb) { \	        m = (actcapi_msg *)skb_put(skb, l + 8); \		m->hdr.len = l + 8; \		m->hdr.applicationID = 1; \	        m->hdr.cmd.cmd = c; \	        m->hdr.cmd.subcmd = s; \	        m->hdr.msgnum = actcapi_nextsmsg(card); \	} else m = NULL;\}#define ACTCAPI_CHKSKB if (!skb) { \	printk(KERN_WARNING "actcapi: alloc_skb failed\n"); \	return; \}#define ACTCAPI_QUEUE_TX { \	actcapi_debug_msg(skb, 1); \	skb_queue_tail(&card->sndq, skb); \	act2000_schedule_tx(card); \}intactcapi_listen_req(act2000_card *card){	__u16 eazmask = 0;	int i;	actcapi_msg *m;	struct sk_buff *skb;	for (i = 0; i < ACT2000_BCH; i++)		eazmask |= card->bch[i].eazmask;	ACTCAPI_MKHDR(9, 0x05, 0x00);        if (!skb) {                printk(KERN_WARNING "actcapi: alloc_skb failed\n");                return -ENOMEM;        }	m->msg.listen_req.controller = 0;	m->msg.listen_req.infomask = 0x3f; /* All information */	m->msg.listen_req.eazmask = eazmask;	m->msg.listen_req.simask = (eazmask)?0x86:0; /* All SI's  */	ACTCAPI_QUEUE_TX;        return 0;}intactcapi_connect_req(act2000_card *card, act2000_chan *chan, char *phone,		    char eaz, int si1, int si2){	actcapi_msg *m;	struct sk_buff *skb;	ACTCAPI_MKHDR((11 + strlen(phone)), 0x02, 0x00);	if (!skb) {                printk(KERN_WARNING "actcapi: alloc_skb failed\n");		chan->fsm_state = ACT2000_STATE_NULL;		return -ENOMEM;	}	m->msg.connect_req.controller = 0;	m->msg.connect_req.bchan = 0x83;	m->msg.connect_req.infomask = 0x3f;	m->msg.connect_req.si1 = si1;	m->msg.connect_req.si2 = si2;	m->msg.connect_req.eaz = eaz?eaz:'0';	m->msg.connect_req.addr.len = strlen(phone) + 1;	m->msg.connect_req.addr.tnp = 0x81;	memcpy(m->msg.connect_req.addr.num, phone, strlen(phone));	chan->callref = m->hdr.msgnum;	ACTCAPI_QUEUE_TX;	return 0;}static voidactcapi_connect_b3_req(act2000_card *card, act2000_chan *chan){	actcapi_msg *m;	struct sk_buff *skb;	ACTCAPI_MKHDR(17, 0x82, 0x00);	ACTCAPI_CHKSKB;	m->msg.connect_b3_req.plci = chan->plci;	memset(&m->msg.connect_b3_req.ncpi, 0,	       sizeof(m->msg.connect_b3_req.ncpi));	m->msg.connect_b3_req.ncpi.len = 13;	m->msg.connect_b3_req.ncpi.modulo = 8;	ACTCAPI_QUEUE_TX;}/* * Set net type (1TR6) or (EDSS1) */intactcapi_manufacturer_req_net(act2000_card *card){	actcapi_msg *m;	struct sk_buff *skb;	ACTCAPI_MKHDR(5, 0xff, 0x00);        if (!skb) {                printk(KERN_WARNING "actcapi: alloc_skb failed\n");                return -ENOMEM;        }	m->msg.manufacturer_req_net.manuf_msg = 0x11;	m->msg.manufacturer_req_net.controller = 1;	m->msg.manufacturer_req_net.nettype = (card->ptype == ISDN_PTYPE_EURO)?1:0;	ACTCAPI_QUEUE_TX;	printk(KERN_INFO "act2000 %s: D-channel protocol now %s\n",	       card->interface.id, (card->ptype == ISDN_PTYPE_EURO)?"euro":"1tr6");	card->interface.features &=		~(ISDN_FEATURE_P_UNKNOWN | ISDN_FEATURE_P_EURO | ISDN_FEATURE_P_1TR6);	card->interface.features |=		((card->ptype == ISDN_PTYPE_EURO)?ISDN_FEATURE_P_EURO:ISDN_FEATURE_P_1TR6);        return 0;}/* * Switch V.42 on or off */intactcapi_manufacturer_req_v42(act2000_card *card, ulong arg){	actcapi_msg *m;	struct sk_buff *skb;	ACTCAPI_MKHDR(8, 0xff, 0x00);        if (!skb) {                printk(KERN_WARNING "actcapi: alloc_skb failed\n");                return -ENOMEM;        }	m->msg.manufacturer_req_v42.manuf_msg = 0x10;	m->msg.manufacturer_req_v42.controller = 0;	m->msg.manufacturer_req_v42.v42control = (arg?1:0);	ACTCAPI_QUEUE_TX;        return 0;}/* * Set error-handler */intactcapi_manufacturer_req_errh(act2000_card *card){	actcapi_msg *m;	struct sk_buff *skb;	ACTCAPI_MKHDR(4, 0xff, 0x00);        if (!skb) {                printk(KERN_WARNING "actcapi: alloc_skb failed\n");                return -ENOMEM;        }	m->msg.manufacturer_req_err.manuf_msg = 0x03;	m->msg.manufacturer_req_err.controller = 0;	ACTCAPI_QUEUE_TX;        return 0;}/* * Set MSN-Mapping. */intactcapi_manufacturer_req_msn(act2000_card *card){	msn_entry *p = card->msn_list;	actcapi_msg *m;	struct sk_buff *skb;	int len;	while (p) {		int i;		len = strlen(p->msn);		for (i = 0; i < 2; i++) {			ACTCAPI_MKHDR(6 + len, 0xff, 0x00);			if (!skb) {				printk(KERN_WARNING "actcapi: alloc_skb failed\n");				return -ENOMEM;			}			m->msg.manufacturer_req_msn.manuf_msg = 0x13 + i;			m->msg.manufacturer_req_msn.controller = 0;			m->msg.manufacturer_req_msn.msnmap.eaz = p->eaz;			m->msg.manufacturer_req_msn.msnmap.len = len;			memcpy(m->msg.manufacturer_req_msn.msnmap.msn, p->msn, len);			ACTCAPI_QUEUE_TX;		}		p = p->next;	}        return 0;}voidactcapi_select_b2_protocol_req(act2000_card *card, act2000_chan *chan){	actcapi_msg *m;	struct sk_buff *skb;	ACTCAPI_MKHDR(10, 0x40, 0x00);	ACTCAPI_CHKSKB;	m->msg.select_b2_protocol_req.plci = chan->plci;	memset(&m->msg.select_b2_protocol_req.dlpd, 0,	       sizeof(m->msg.select_b2_protocol_req.dlpd));	m->msg.select_b2_protocol_req.dlpd.len = 6;	switch (chan->l2prot) {		case ISDN_PROTO_L2_TRANS:			m->msg.select_b2_protocol_req.protocol = 0x03;			m->msg.select_b2_protocol_req.dlpd.dlen = 4000;			break;		case ISDN_PROTO_L2_HDLC:			m->msg.select_b2_protocol_req.protocol = 0x02;			m->msg.select_b2_protocol_req.dlpd.dlen = 4000;			break;		case ISDN_PROTO_L2_X75I:		case ISDN_PROTO_L2_X75UI:		case ISDN_PROTO_L2_X75BUI:			m->msg.select_b2_protocol_req.protocol = 0x01;			m->msg.select_b2_protocol_req.dlpd.dlen = 4000;			m->msg.select_b2_protocol_req.dlpd.laa = 3;			m->msg.select_b2_protocol_req.dlpd.lab = 1;			m->msg.select_b2_protocol_req.dlpd.win = 7;			m->msg.select_b2_protocol_req.dlpd.modulo = 8;			break;	}	ACTCAPI_QUEUE_TX;}static voidactcapi_select_b3_protocol_req(act2000_card *card, act2000_chan *chan){	actcapi_msg *m;	struct sk_buff *skb;	ACTCAPI_MKHDR(17, 0x80, 0x00);	ACTCAPI_CHKSKB;	m->msg.select_b3_protocol_req.plci = chan->plci;	memset(&m->msg.select_b3_protocol_req.ncpd, 0,	       sizeof(m->msg.select_b3_protocol_req.ncpd));	switch (chan->l3prot) {		case ISDN_PROTO_L3_TRANS:			m->msg.select_b3_protocol_req.protocol = 0x04;			m->msg.select_b3_protocol_req.ncpd.len = 13;			m->msg.select_b3_protocol_req.ncpd.modulo = 8;			break;	}	ACTCAPI_QUEUE_TX;}static voidactcapi_listen_b3_req(act2000_card *card, act2000_chan *chan){	actcapi_msg *m;	struct sk_buff *skb;	ACTCAPI_MKHDR(2, 0x81, 0x00);	ACTCAPI_CHKSKB;	m->msg.listen_b3_req.plci = chan->plci;	ACTCAPI_QUEUE_TX;}static voidactcapi_disconnect_req(act2000_card *card, act2000_chan *chan){	actcapi_msg *m;	struct sk_buff *skb;	ACTCAPI_MKHDR(3, 0x04, 0x00);	ACTCAPI_CHKSKB;	m->msg.disconnect_req.plci = chan->plci;	m->msg.disconnect_req.cause = 0;	ACTCAPI_QUEUE_TX;}voidactcapi_disconnect_b3_req(act2000_card *card, act2000_chan *chan){	actcapi_msg *m;	struct sk_buff *skb;	ACTCAPI_MKHDR(17, 0x84, 0x00);	ACTCAPI_CHKSKB;	m->msg.disconnect_b3_req.ncci = chan->ncci;	memset(&m->msg.disconnect_b3_req.ncpi, 0,	       sizeof(m->msg.disconnect_b3_req.ncpi));	m->msg.disconnect_b3_req.ncpi.len = 13;	m->msg.disconnect_b3_req.ncpi.modulo = 8;

⌨️ 快捷键说明

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