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

📄 sdla_ppp.c

📁 内核linux2.4.20,可跟rtlinux3.2打补丁 组成实时linux系统,编译内核
💻 C
📖 第 1 页 / 共 5 页
字号:
	int err;	memset(&mb->cmd, 0, sizeof(ppp_cmd_t));	mb->cmd.command = PPP_READ_CODE_VERSION;	err = sdla_exec(mb) ? mb->cmd.result : CMD_TIMEOUT;	if (err != CMD_OK) 		ppp_error(card, err, mb);	else if (str) {		int len = mb->cmd.length;		memcpy(str, mb->data, len);		str[len] = '\0';	}	return err;}/*=========================================================================== * Set Out-Bound Authentication.*/static int ppp_set_outbnd_auth (sdla_t *card, ppp_private_area_t *ppp_priv_area){	ppp_mbox_t *mb = card->mbox;	int err;	memset(&mb->cmd, 0, sizeof(ppp_cmd_t));	memset(&mb->data, 0, (strlen(ppp_priv_area->userid) + 					strlen(ppp_priv_area->passwd) + 2 ) );	memcpy(mb->data, ppp_priv_area->userid, strlen(ppp_priv_area->userid));	memcpy((mb->data + strlen(ppp_priv_area->userid) + 1), 		ppp_priv_area->passwd, strlen(ppp_priv_area->passwd));			mb->cmd.length  = strlen(ppp_priv_area->userid) + 					strlen(ppp_priv_area->passwd) + 2 ;		mb->cmd.command = PPP_SET_OUTBOUND_AUTH;	err = sdla_exec(mb) ? mb->cmd.result : CMD_TIMEOUT;	if (err != CMD_OK)		ppp_error(card, err, mb);	return err;}/*=========================================================================== * Set In-Bound Authentication.*/static int ppp_set_inbnd_auth (sdla_t *card, ppp_private_area_t *ppp_priv_area){	ppp_mbox_t *mb = card->mbox;	int err, i;	char* user_tokens[32];	char* pass_tokens[32];	int userids, passwds;	int add_ptr;	memset(&mb->cmd, 0, sizeof(ppp_cmd_t));	memset(&mb->data, 0, 1008);	memcpy(mb->data, ppp_priv_area->sysname, 						strlen(ppp_priv_area->sysname));		/* Parse the userid string and the password string and build a string	   to copy it to the data area of the command structure.   The string	   will look like "SYS_NAME<NULL>USER1<NULL>PASS1<NULL>USER2<NULL>PASS2	   ....<NULL> " 	 */	userids = tokenize( ppp_priv_area->userid, user_tokens);	passwds = tokenize( ppp_priv_area->passwd, pass_tokens);		if (userids != passwds){		printk(KERN_INFO "%s: Number of passwords does not equal the number of user ids\n", card->devname);		return 1;		}	add_ptr = strlen(ppp_priv_area->sysname) + 1;	for (i=0; i<userids; i++){		memcpy((mb->data + add_ptr), user_tokens[i], 							strlen(user_tokens[i]));		memcpy((mb->data + add_ptr + strlen(user_tokens[i]) + 1), 					pass_tokens[i], strlen(pass_tokens[i]));		add_ptr = add_ptr + strlen(user_tokens[i]) + 1 + 						strlen(pass_tokens[i]) + 1;	}	mb->cmd.length  = add_ptr + 1;	mb->cmd.command = PPP_SET_INBOUND_AUTH;	err = sdla_exec(mb) ? mb->cmd.result : CMD_TIMEOUT;	if (err != CMD_OK)		ppp_error(card, err, mb);	return err;}/*============================================================================ * Tokenize string. *      Parse a string of the following syntax: *              <arg1>,<arg2>,... *      and fill array of tokens with pointers to string elements. * */static int tokenize (char *str, char **tokens){        int cnt = 0;        tokens[0] = strtok(str, "/");        while (tokens[cnt] && (cnt < 32 - 1))        {                tokens[cnt] = strstrip(tokens[cnt], " \t");                tokens[++cnt] = strtok(NULL, "/");        }	return cnt;}/*============================================================================ * Strip leading and trailing spaces off the string str. */static char* strstrip (char *str, char* s){        char *eos = str + strlen(str);          /* -> end of string */        while (*str && strchr(s, *str))                ++str                           /* strip leading spaces */        ;        while ((eos > str) && strchr(s, *(eos - 1)))                --eos                           /* strip trailing spaces */        ;        *eos = '\0';        return str;}/*============================================================================ * Configure PPP firmware. */static int ppp_configure(sdla_t *card, void *data){	ppp_mbox_t *mb = card->mbox;	int data_len = sizeof(ppp508_conf_t); 	int err;	memset(&mb->cmd, 0, sizeof(ppp_cmd_t));	memcpy(mb->data, data, data_len);	mb->cmd.length  = data_len;	mb->cmd.command = PPP_SET_CONFIG;	err = sdla_exec(mb) ? mb->cmd.result : CMD_TIMEOUT;	if (err != CMD_OK) 		ppp_error(card, err, mb);		return err;}/*============================================================================ * Set interrupt mode. */static int ppp_set_intr_mode(sdla_t *card, unsigned char mode){	ppp_mbox_t *mb = card->mbox;        ppp_intr_info_t *ppp_intr_data = (ppp_intr_info_t *) &mb->data[0];	int err;	memset(&mb->cmd, 0, sizeof(ppp_cmd_t));	ppp_intr_data->i_enable = mode;	ppp_intr_data->irq = card->hw.irq;	mb->cmd.length = 2;       /* If timer has been enabled, set the timer delay to 1sec */       if (mode & 0x80){       		ppp_intr_data->timer_len = 250; //5;//100; //250;                mb->cmd.length = 4;        }		mb->cmd.command = PPP_SET_INTR_FLAGS;	err = sdla_exec(mb) ? mb->cmd.result : CMD_TIMEOUT;		if (err != CMD_OK) 		ppp_error(card, err, mb); 			return err;}/*============================================================================ * Enable communications. */static int ppp_comm_enable(sdla_t *card){	ppp_mbox_t *mb = card->mbox;	int err;	memset(&mb->cmd, 0, sizeof(ppp_cmd_t));	mb->cmd.command = PPP_COMM_ENABLE;	err = sdla_exec(mb) ? mb->cmd.result : CMD_TIMEOUT;		if (err != CMD_OK) 		ppp_error(card, err, mb);	else			card->u.p.comm_enabled = 1;		return err;}/*============================================================================ * Disable communications. */static int ppp_comm_disable(sdla_t *card){	ppp_mbox_t *mb = card->mbox;	int err;	memset(&mb->cmd, 0, sizeof(ppp_cmd_t));	mb->cmd.command = PPP_COMM_DISABLE;	err = sdla_exec(mb) ? mb->cmd.result : CMD_TIMEOUT;	if (err != CMD_OK) 		ppp_error(card, err, mb);	else		card->u.p.comm_enabled = 0;	return err;}static int ppp_comm_disable_shutdown(sdla_t *card){	ppp_mbox_t *mb = card->mbox;	ppp_intr_info_t *ppp_intr_data;	int err;	if (!mb){		return 1;	}		ppp_intr_data = (ppp_intr_info_t *) &mb->data[0];		/* Disable all interrupts */	memset(&mb->cmd, 0, sizeof(ppp_cmd_t));	ppp_intr_data->i_enable = 0;	ppp_intr_data->irq = card->hw.irq;	mb->cmd.length = 2;	mb->cmd.command = PPP_SET_INTR_FLAGS;	err = sdla_exec(mb) ? mb->cmd.result : CMD_TIMEOUT;	/* Disable communicatinons */	memset(&mb->cmd, 0, sizeof(ppp_cmd_t));	mb->cmd.command = PPP_COMM_DISABLE;	err = sdla_exec(mb) ? mb->cmd.result : CMD_TIMEOUT;	card->u.p.comm_enabled = 0;	return 0;}/*============================================================================ * Get communications error statistics. */static int ppp_get_err_stats(sdla_t *card){	ppp_mbox_t *mb = card->mbox;	int err;	memset(&mb->cmd, 0, sizeof(ppp_cmd_t));	mb->cmd.command = PPP_READ_ERROR_STATS;	err = sdla_exec(mb) ? mb->cmd.result : CMD_TIMEOUT;		if (err == CMD_OK) {				ppp_err_stats_t* stats = (void*)mb->data;		card->wandev.stats.rx_over_errors    = stats->rx_overrun;		card->wandev.stats.rx_crc_errors     = stats->rx_bad_crc;		card->wandev.stats.rx_missed_errors  = stats->rx_abort;		card->wandev.stats.rx_length_errors  = stats->rx_lost;		card->wandev.stats.tx_aborted_errors = stats->tx_abort;		} else 		ppp_error(card, err, mb);		return err;}/*============================================================================ * Send packet. *	Return:	0 - o.k. *		1 - no transmit buffers available */static int ppp_send (sdla_t *card, void *data, unsigned len, unsigned proto){	ppp_buf_ctl_t *txbuf = card->u.p.txbuf;	if (txbuf->flag)                return 1;		sdla_poke(&card->hw, txbuf->buf.ptr, data, len);	txbuf->length = len;		/* frame length */		if (proto == htons(ETH_P_IPX))		txbuf->proto = 0x01;	/* protocol ID */	else		txbuf->proto = 0x00;	/* protocol ID */		txbuf->flag = 1;		/* start transmission */	/* Update transmit buffer control fields */	card->u.p.txbuf = ++txbuf;	if ((void*)txbuf > card->u.p.txbuf_last)		card->u.p.txbuf = card->u.p.txbuf_base;	return 0;}/****** Firmware Error Handler **********************************************//*============================================================================ * Firmware error handler. *	This routine is called whenever firmware command returns non-zero *	return code. * * Return zero if previous command has to be cancelled. */static int ppp_error(sdla_t *card, int err, ppp_mbox_t *mb){	unsigned cmd = mb->cmd.command;	switch (err) {		case CMD_TIMEOUT:			printk(KERN_ERR "%s: command 0x%02X timed out!\n",				card->devname, cmd);			break;		default:			printk(KERN_INFO "%s: command 0x%02X returned 0x%02X!\n"				, card->devname, cmd, err);	}	return 0;}/****** Interrupt Handlers **************************************************//*============================================================================ * PPP interrupt service routine. */static void wpp_isr (sdla_t *card){	ppp_flags_t *flags = card->flags;	char *ptr = &flags->iflag;	netdevice_t *dev = card->wandev.dev;	int i;	card->in_isr = 1;	++card->statistics.isr_entry;	if (!dev && flags->iflag != PPP_INTR_CMD){		card->in_isr = 0;		flags->iflag = 0;		return;	}		if (test_bit(PERI_CRIT, (void*)&card->wandev.critical)) {		card->in_isr = 0;		flags->iflag = 0;		return;	}			if(card->hw.type != SDLA_S514){		if (test_bit(SEND_CRIT, (void*)&card->wandev.critical)) {			++card->statistics.isr_already_critical;			printk (KERN_INFO "%s: Critical while in ISR!\n",					card->devname);			card->in_isr = 0;			flags->iflag = 0;			return;		}	}	switch (flags->iflag) {		case PPP_INTR_RXRDY:	/* receive interrupt  0x01  (bit 0)*/			++card->statistics.isr_rx;			rx_intr(card);			break;		case PPP_INTR_TXRDY:	/* transmit interrupt  0x02 (bit 1)*/			++card->statistics.isr_tx;			flags->imask &= ~PPP_INTR_TXRDY;			wake_net_dev(dev);			break;		case PPP_INTR_CMD:      /* interface command completed */			++Intr_test_counter;			++card->statistics.isr_intr_test;			break;		case PPP_INTR_MODEM:    /* modem status change (DCD, CTS) 0x04 (bit 2)*/		case PPP_INTR_DISC:  	/* Data link disconnected 0x10  (bit 4)*/			case PPP_INTR_OPEN:   	/* Data link open 0x20  (bit 5)*/		case PPP_INTR_DROP_DTR:	/* DTR drop timeout expired  0x40 bit 6 */			event_intr(card);			break;			case PPP_INTR_TIMER:			timer_intr(card);			break;	 		default:	/* unexpected interrupt */			++card->statistics.isr_spurious;			printk(KERN_INFO "%s: spurious interrupt 0x%02X!\n", 				card->devname, flags->iflag);			printk(KERN_INFO "%s: ID Bytes = ",card->devname);	 		for(i = 0; i < 8; i ++)				printk(KERN_INFO "0x%02X ", *(ptr + 0x28 + i));			printk(KERN_INFO "\n");		}		card->in_isr = 0;	flags->iflag = 0;	return;}/*============================================================================ * Receive interrupt handler. */static void rx_intr(sdla_t *card){	ppp_buf_ctl_t *rxbuf = card->rxmb;	netdevice_t *dev = card->wandev.dev;	ppp_private_area_t *ppp_priv_area;	struct sk_buff *skb;	unsigned len;	void *buf;	int i;        ppp_flags_t *flags = card->flags;        char *ptr = &flags->iflag;	int udp_type;		if (rxbuf->flag != 0x01) {

⌨️ 快捷键说明

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