📄 sdla_ppp.c
字号:
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 + -