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

📄 sdla_ppp.c

📁 Linux内核源代码 为压缩文件 是<<Linux内核>>一书中的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
	/* 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 + -