📄 sdla_ppp.c
字号:
/* Only disable the timer interrupt if there are no udp, statistic */ /* updates or events pending */ if(!ppp_priv_area->timer_int_enabled) { flags->imask &= ~PPP_INTR_TIMER; }}static int handle_IPXWAN(unsigned char *sendpacket, char *devname, unsigned char enable_IPX, unsigned long network_number, unsigned short proto){ int i; if( proto == htons(ETH_P_IPX) ) { //It's an IPX packet if(!enable_IPX) { //Return 1 so we don't pass it up the stack. return 1; } } else { //It's not IPX so pass it up the stack. return 0; } if( sendpacket[16] == 0x90 && sendpacket[17] == 0x04) { //It's IPXWAN if( sendpacket[2] == 0x02 && sendpacket[34] == 0x00) { //It's a timer request packet printk(KERN_INFO "%s: Received IPXWAN Timer Request packet\n",devname); //Go through the routing options and answer no to every //option except Unnumbered RIP/SAP for(i = 41; sendpacket[i] == 0x00; i += 5) { //0x02 is the option for Unnumbered RIP/SAP if( sendpacket[i + 4] != 0x02) { sendpacket[i + 1] = 0; } } //Skip over the extended Node ID option if( sendpacket[i] == 0x04 ) { i += 8; } //We also want to turn off all header compression opt. for(; sendpacket[i] == 0x80 ;) { sendpacket[i + 1] = 0; i += (sendpacket[i + 2] << 8) + (sendpacket[i + 3]) + 4; } //Set the packet type to timer response sendpacket[34] = 0x01; printk(KERN_INFO "%s: Sending IPXWAN Timer Response\n",devname); } else if( sendpacket[34] == 0x02 ) { //This is an information request packet printk(KERN_INFO "%s: Received IPXWAN Information Request packet\n",devname); //Set the packet type to information response sendpacket[34] = 0x03; //Set the router name sendpacket[51] = 'P'; sendpacket[52] = 'T'; sendpacket[53] = 'P'; sendpacket[54] = 'I'; sendpacket[55] = 'P'; sendpacket[56] = 'E'; sendpacket[57] = '-'; sendpacket[58] = CVHexToAscii(network_number >> 28); sendpacket[59] = CVHexToAscii((network_number & 0x0F000000)>> 24); sendpacket[60] = CVHexToAscii((network_number & 0x00F00000)>> 20); sendpacket[61] = CVHexToAscii((network_number & 0x000F0000)>> 16); sendpacket[62] = CVHexToAscii((network_number & 0x0000F000)>> 12); sendpacket[63] = CVHexToAscii((network_number & 0x00000F00)>> 8); sendpacket[64] = CVHexToAscii((network_number & 0x000000F0)>> 4); sendpacket[65] = CVHexToAscii(network_number & 0x0000000F); for(i = 66; i < 99; i+= 1) { sendpacket[i] = 0; } printk(KERN_INFO "%s: Sending IPXWAN Information Response packet\n",devname); } else { printk(KERN_INFO "%s: Unknown IPXWAN packet!\n",devname); return 0; } //Set the WNodeID to our network address sendpacket[35] = (unsigned char)(network_number >> 24); sendpacket[36] = (unsigned char)((network_number & 0x00FF0000) >> 16); sendpacket[37] = (unsigned char)((network_number & 0x0000FF00) >> 8); sendpacket[38] = (unsigned char)(network_number & 0x000000FF); return 1; } else { //If we get here's its an IPX-data packet, so it'll get passed up the stack. //switch the network numbers switch_net_numbers(sendpacket, network_number, 1); return 0; }}/****** Background Polling Routines ****************************************//* All polling functions are invoked by the TIMER interrupt in the wpp_isr * routine. *//*============================================================================ * Monitor active link phase. */static void process_route (sdla_t *card){ ppp_flags_t *flags = card->flags; struct net_device *dev = card->wandev.dev; struct in_device *in_dev = dev->ip_ptr; if (in_dev != NULL ) { if ((card->u.p.ip_mode == WANOPT_PPP_PEER) && (Read_connection_info && flags->ip_state == 0x09)){ printk(KERN_INFO "%s: IPCP State Opened.\n", card->devname); if (read_info( card )) { printk(KERN_INFO "%s: An error occurred in IP assignment.\n", card->devname); } else { struct in_ifaddr *ifa = in_dev->ifa_list; printk(KERN_INFO "%s: Assigned Lcl. Addr: %s\n", card->devname, in_ntoa(ifa->ifa_local)); printk(KERN_INFO "%s: Assigned Rmt. Addr: %s\n", card->devname, in_ntoa(ifa->ifa_address)); } Read_connection_info = 0; } }else{ printk(KERN_INFO "%s: Error: Null pointer in Poll Active\n", card->devname); } card->poll = NULL;}/*============================================================================ * Monitor physical link disconnected phase. * o if interface is up and the hold-down timeout has expired, then retry * connection. */static void poll_disconnected(sdla_t *card){ struct net_device *dev = card->wandev.dev; if (dev && netif_running(dev) && ((jiffies - card->state_tick) > HOLD_DOWN_TIME)) { wanpipe_set_state(card, WAN_CONNECTING); if(ppp_comm_enable(card) == CMD_OK){ init_ppp_tx_rx_buff( card ); } }}/****** Miscellaneous Functions *********************************************//*============================================================================ * Configure S508 adapter. */static int config508(ppp_private_area_t *ppp_priv_area, sdla_t *card){ ppp508_conf_t cfg; struct net_device *dev = card->wandev.dev; struct in_device *in_dev = dev->ip_ptr; /* Prepare PPP configuration structure */ memset(&cfg, 0, sizeof(ppp508_conf_t)); if (card->wandev.clocking) cfg.line_speed = card->wandev.bps; if (card->wandev.interface == WANOPT_RS232) cfg.conf_flags |= INTERFACE_LEVEL_RS232; cfg.conf_flags |= DONT_TERMINATE_LNK_MAX_CONFIG; /*send Configure-Request packets forever*/ cfg.txbuf_percent = PERCENT_TX_BUFF; /* % of Tx bufs */ cfg.mtu_local = card->wandev.mtu; cfg.mtu_remote = card->wandev.mtu; /* Default */ cfg.restart_tmr = TIME_BETWEEN_CONF_REQ; /* 30 = 3sec */ cfg.auth_rsrt_tmr = TIME_BETWEEN_PAP_CHAP_REQ; /* 30 = 3sec */ cfg.auth_wait_tmr = WAIT_PAP_CHAP_WITHOUT_REPLY; /* 300 = 30s */ cfg.mdm_fail_tmr = WAIT_AFTER_DCD_CTS_LOW; /* 5 = 0.5s */ cfg.dtr_drop_tmr = TIME_DCD_CTS_LOW_AFTER_LNK_DOWN; /* 10 = 1s */ cfg.connect_tmout = WAIT_DCD_HIGH_AFTER_ENABLE_COMM; /* 900 = 90s */ cfg.conf_retry = MAX_CONF_REQ_WITHOUT_REPLY; /* 10 = 1s */ cfg.term_retry = MAX_TERM_REQ_WITHOUT_REPLY; /* 2 times */ cfg.fail_retry = NUM_CONF_NAK_WITHOUT_REPLY; /* 5 times */ cfg.auth_retry = NUM_AUTH_REQ_WITHOUT_REPLY; /* 10 times */ if( !card->u.p.authenticator ) { printk(KERN_INFO "%s: Device is not configured as an authenticator\n", card->devname); cfg.auth_options = NO_AUTHENTICATION; }else{ printk(KERN_INFO "%s: Device is configured as an authenticator\n", card->devname); cfg.auth_options = INBOUND_AUTH; } if( ppp_priv_area->pap == WANOPT_YES){ cfg.auth_options |=PAP_AUTH; printk(KERN_INFO "%s: Pap enabled\n", card->devname); } if( ppp_priv_area->chap == WANOPT_YES){ cfg.auth_options |= CHAP_AUTH; printk(KERN_INFO "%s: Chap enabled\n", card->devname); } if (ppp_priv_area->enable_IPX == WANOPT_YES){ cfg.ipx_options = ENABLE_IPX | ROUTING_PROT_DEFAULT; }else{ cfg.ipx_options = DISABLE_IPX; } switch (card->u.p.ip_mode) { case WANOPT_PPP_STATIC: cfg.ip_options = L_AND_R_IP_NO_ASSIG | ENABLE_IP; cfg.ip_local = in_dev->ifa_list->ifa_local; cfg.ip_remote = in_dev->ifa_list->ifa_address; NEX_PRINTK(KERN_INFO "Local %s Remote %s Name %s\n", in_ntoa(cfg.ip_local), in_ntoa(cfg.ip_remote), dev->name); break; case WANOPT_PPP_PEER: cfg.ip_options = L_IP_REMOTE_ASSIG | R_IP_REMOTE_ASSIG | ENABLE_IP; cfg.ip_local = 0x00; cfg.ip_remote = 0x00; break; } return ppp_configure(card, &cfg);}/*============================================================================ * Show disconnection cause. */static void show_disc_cause(sdla_t *card, unsigned cause){ if (cause & 0x0802) printk(KERN_INFO "%s: link terminated by peer\n", card->devname); else if (cause & 0x0004) printk(KERN_INFO "%s: link terminated by user\n", card->devname); else if (cause & 0x0008) printk(KERN_INFO "%s: authentication failed\n", card->devname); else if (cause & 0x0010) printk(KERN_INFO "%s: authentication protocol negotiation failed\n", card->devname); else if (cause & 0x0020) printk(KERN_INFO "%s: peer's request for authentication rejected\n", card->devname); else if (cause & 0x0040) printk(KERN_INFO "%s: MRU option rejected by peer\n", card->devname); else if (cause & 0x0080) printk(KERN_INFO "%s: peer's MRU was too small\n", card->devname); else if (cause & 0x0100) printk(KERN_INFO "%s: failed to negotiate peer's LCP options\n", card->devname); else if (cause & 0x0200) printk(KERN_INFO "%s: failed to negotiate peer's IPCP options\n" , card->devname); else if (cause & 0x0400) printk(KERN_INFO "%s: failed to negotiate peer's IPXCP options\n", card->devname);}/*============================================================================= * Process UDP call of type PTPIPEAB. */static void process_udp_mgmt_pkt(sdla_t *card, struct net_device *dev, ppp_private_area_t *ppp_priv_area ) { unsigned char buf2[5]; unsigned char *buf; unsigned int frames, len; struct sk_buff *new_skb; unsigned short data_length, buffer_length, real_len; unsigned long data_ptr; int udp_mgmt_req_valid = 1; ppp_mbox_t *mbox = card->mbox; struct timeval tv; int err; ppp_udp_pkt_t *ppp_udp_pkt = (ppp_udp_pkt_t*)&ppp_priv_area->udp_pkt_data; memcpy(&buf2, &card->wandev.udp_port, 2 ); switch(ppp_udp_pkt->cblock.command) { /* FT1 MONITOR STATUS */ case FT1_MONITOR_STATUS_CTRL: /* PPIPE_ENABLE_TRACING */ case PPIPE_ENABLE_TRACING: /* PPIPE_DISABLE_TRACING */ case PPIPE_DISABLE_TRACING: /* PPIPE_GET_TRACE_INFO */ case PPIPE_GET_TRACE_INFO: /* SET FT1 MODE */ case SET_FT1_MODE: if(ppp_priv_area->udp_pkt_src == UDP_PKT_FRM_NETWORK) { ++ppp_priv_area->pipe_mgmt_stat. UDP_PIPE_mgmt_direction_err; udp_mgmt_req_valid = 0; } break; default: break; } if(!udp_mgmt_req_valid) { /* set length to 0 */ ppp_udp_pkt->cblock.length = 0x00; /* set return code */ ppp_udp_pkt->cblock.result = 0xCD; } else { /* Initialize the trace element */ trace_element_t trace_element; switch (ppp_udp_pkt->cblock.command){ /* PPIPE_ENABLE_TRACING */ case PPIPE_ENABLE_TRACING: if (!card->TracingEnabled) { /* OPERATE_DATALINE_MONITOR */ mbox->cmd.command = PPP_DATALINE_MONITOR; mbox->cmd.length = 0x01; mbox->data[0] = ppp_udp_pkt->data[0]; err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT; if (err != CMD_OK) { ppp_error(card, err, mbox); card->TracingEnabled = 0; /* set the return code */ ppp_udp_pkt->cblock.result = mbox->cmd.result; mbox->cmd.length = 0; break; } sdla_peek(&card->hw, 0xC000, &buf2, 2); ppp_priv_area->curr_trace_addr = 0; memcpy(&ppp_priv_area->curr_trace_addr, &buf2, 2); ppp_priv_area->start_trace_addr = ppp_priv_area->curr_trace_addr; ppp_priv_area->end_trace_addr = ppp_priv_area->start_trace_addr + END_OFFSET; /* MAX_SEND_BUFFER_SIZE - 28 (IP header) - 32 (ppipemon CBLOCK) */ available_buffer_space = MAX_LGTH_UDP_MGNT_PKT - sizeof(ip_pkt_t)- sizeof(udp_pkt_t)- sizeof(wp_mgmt_t)- sizeof(cblock_t); } ppp_udp_pkt->cblock.result = 0; mbox->cmd.length = 0; card->TracingEnabled = 1; break; /* PPIPE_DISABLE_TRACING */ case PPIPE_DISABLE_TRACING: if(card->TracingEnabled) { /* OPERATE_DATALINE_MONITOR */ mbox->cmd.command = 0x33; mbox->cmd.length = 1; mbox->data[0] = 0x00; err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT; } /*set return code*/ ppp_udp_pkt->cblock.result = 0; mbox->cmd.length = 0; card->TracingEnabled = 0; break; /* PPIPE_GET_TRACE_INFO */ case PPIPE_GET_TRACE_INFO:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -