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

📄 sdla_ppp.c

📁 powerpc内核mpc8241linux系统下net驱动程序
💻 C
📖 第 1 页 / 共 5 页
字号:
		*(unsigned long *) &data[76] =		    card->statistics.isr_intr_test;		*(unsigned long *) &data[80] =		    card->statistics.isr_spurious;		*(unsigned long *) &data[84] =		    card->statistics.isr_enable_tx_int;		*(unsigned long *) &data[88] =		    card->statistics.rx_intr_corrupt_rx_bfr;		*(unsigned long *) &data[92] =		    ppp_priv_area->rx_intr_no_socket;		*(unsigned long *) &data[96] =		    ppp_priv_area->rx_intr_DRVSTATS_request;		*(unsigned long *) &data[100] =		    ppp_priv_area->rx_intr_PTPIPE_request;		*(unsigned long *) &data[104] =		    ppp_priv_area->rx_intr_bfr_passed_to_stack;		*(unsigned long *) &data[108] =		    card->statistics.rx_intr_dev_not_started;		*(unsigned long *) &data[112] =		    card->statistics.tx_intr_dev_not_started;		mbox->cmd.length = 56;		break;	case 0x28:		*(unsigned long *) &data[60] =		    ppp_priv_area->UDP_PTPIPE_mgmt_kmalloc_err;		*(unsigned long *) &data[64] =		    ppp_priv_area->UDP_PTPIPE_mgmt_adptr_type_err;		*(unsigned long *) &data[68] =		    ppp_priv_area->UDP_PTPIPE_mgmt_direction_err;		*(unsigned long *) &data[72] =		    ppp_priv_area->		    UDP_PTPIPE_mgmt_adptr_cmnd_timeout;		*(unsigned long *) &data[76] =		    ppp_priv_area->UDP_PTPIPE_mgmt_adptr_cmnd_OK;		*(unsigned long *) &data[80] =		    ppp_priv_area->UDP_PTPIPE_mgmt_passed_to_adptr;		*(unsigned long *) &data[84] =		    ppp_priv_area->UDP_PTPIPE_mgmt_passed_to_stack;		*(unsigned long *) &data[88] =		    ppp_priv_area->UDP_PTPIPE_mgmt_no_socket;		*(unsigned long *) &data[92] =		    ppp_priv_area->UDP_DRVSTATS_mgmt_kmalloc_err;		*(unsigned long *) &data[96] =		    ppp_priv_area->		    UDP_DRVSTATS_mgmt_adptr_cmnd_timeout;		*(unsigned long *) &data[100] =		    ppp_priv_area->UDP_DRVSTATS_mgmt_adptr_cmnd_OK;		*(unsigned long *) &data[104] =		    ppp_priv_area->		    UDP_DRVSTATS_mgmt_passed_to_adptr;		*(unsigned long *) &data[108] =		    ppp_priv_area->		    UDP_DRVSTATS_mgmt_passed_to_stack;		*(unsigned long *) &data[112] =		    ppp_priv_area->UDP_DRVSTATS_mgmt_no_socket;		*(unsigned long *) &data[116] =		    card->statistics.poll_entry;		*(unsigned long *) &data[120] =		    card->statistics.poll_already_critical;		*(unsigned long *) &data[124] =		    card->statistics.poll_processed;		*(unsigned long *) &data[126] =		    card->irq_dis_poll_count;		mbox->cmd.length = 70;		break;	default:		/* it's a board command */		memcpy(&mbox->cmd, &sendpacket[45], sizeof(ppp_cmd_t));		if (mbox->cmd.length) {			memcpy(&mbox->data, &sendpacket[60],			       mbox->cmd.length);		}		/* run the command on the board */		err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT;		if (err != CMD_OK) {			ppp_error(card, err, mbox);			++ppp_priv_area->			    UDP_DRVSTATS_mgmt_adptr_cmnd_timeout;			break;		}		++ppp_priv_area->UDP_DRVSTATS_mgmt_adptr_cmnd_OK;		/* copy the result back to our buffer */		memcpy(data, sendpacket, skb->len);		memcpy(&data[45], &mbox->cmd, sizeof(ppp_cmd_t));		if (mbox->cmd.length) {			memcpy(&data[60], &mbox->data, mbox->cmd.length);		}	}	/* Fill UDP TTL */	data[8] = card->wandev.ttl;	len = reply_udp(data, mbox->cmd.length);	if (udp_pkt_src == UDP_PKT_FRM_NETWORK) {		++ppp_priv_area->UDP_DRVSTATS_mgmt_passed_to_adptr;		ppp_send(card, data, len, skb->protocol);	} else {		/* Pass it up the stack		   Allocate socket buffer */		if ((new_skb = dev_alloc_skb(len)) != NULL) {			/* copy data into new_skb */			buf = skb_put(new_skb, len);			memcpy(buf, data, len);			++ppp_priv_area->UDP_DRVSTATS_mgmt_passed_to_stack;			/* Decapsulate packet and pass it up the protocol 			   stack */			new_skb->protocol = htons(ETH_P_IP);			new_skb->dev = dev;			new_skb->mac.raw = new_skb->data;			netif_rx(new_skb);		} else {			++ppp_priv_area->UDP_DRVSTATS_mgmt_no_socket;			printk(KERN_INFO "no socket buffers available!\n");		}	}	kfree(data);	return 0;}/*============================================================================= * Process UDP call of type PTPIPEAB. */static int process_udp_mgmt_pkt(char udp_pkt_src, sdla_t * card,				struct sk_buff *skb, struct device *dev,				ppp_private_area_t * ppp_priv_area){	unsigned char *sendpacket;	unsigned char buf2[5];	unsigned char *data;	unsigned char *buf;	unsigned int frames, len;	struct sk_buff *new_skb;	unsigned short 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;	sendpacket = skb->data;	memcpy(&buf2, &card->wandev.udp_port, 2);	if ((data = kmalloc(2000, GFP_ATOMIC)) == NULL) {		printk(KERN_INFO		       "%s: Error allocating memory for UDP management cmnd0x%02X"		       ,card->devname, data[45]);		++ppp_priv_area->UDP_PTPIPE_mgmt_kmalloc_err;		return 1;	}	memcpy(data, sendpacket, skb->len);	switch (data[45]) {		/* FT1 MONITOR STATUS */	case 0x80:		if (card->hw.fwid != SFID_PPP508) {			++ppp_priv_area->UDP_PTPIPE_mgmt_adptr_type_err;			udp_mgmt_req_valid = 0;			break;		}		/* PPIPE_ENABLE_TRACING */	case 0x20:		/* PPIPE_DISABLE_TRACING */	case 0x21:		/* PPIPE_GET_TRACE_INFO */	case 0x22:		/* SET FT1 MODE */	case 0x81:		if (udp_pkt_src == UDP_PKT_FRM_NETWORK) {			++ppp_priv_area->UDP_PTPIPE_mgmt_direction_err;			udp_mgmt_req_valid = 0;		}		break;	default:		break;	}	if (!udp_mgmt_req_valid) {		/* set length to 0 */		data[46] = data[47] = 0;		/* set return code */		data[48] = 0xCD;	} else {		switch (data[45]) {			/* PPIPE_ENABLE_TRACING */		case 0x20:			if (!TracingEnabled) {				/* OPERATE_DATALINE_MONITOR */				mbox->cmd.command = 0x33;				mbox->cmd.length = 1;				mbox->data[0] = 0x03;				err = sdla_exec(mbox) ?				    mbox->cmd.result : CMD_TIMEOUT;				if (err != CMD_OK) {					ppp_error(card, err, mbox);					TracingEnabled = 0;					/* set the return code */					data[48] = mbox->cmd.result;					mbox->cmd.length = 0;					break;				}				if (card->hw.fwid == SFID_PPP502) {					sdla_peek(&card->hw, 0x9000, &buf2, 2);				} else {					sdla_peek(&card->hw, 0xC000, &buf2, 2);				}				curr_trace_addr = 0;				memcpy(&curr_trace_addr, &buf2, 2);				start_trace_addr = curr_trace_addr;				/* MAX_SEND_BUFFER_SIZE -sizeof(UDP_MGMT_PACKET)				   - 41 */				available_buffer_space = 1926;			}			data[48] = 0;			mbox->cmd.length = 0;			TracingEnabled = 1;			break;			/* PPIPE_DISABLE_TRACING */		case 0x21:			if (TracingEnabled) {				/* OPERATE_DATALINE_MONITOR */				mbox->cmd.command = 0x3;				mbox->cmd.length = 1;				mbox->data[0] = 0x00;				err = sdla_exec(mbox) ?				    mbox->cmd.result : CMD_TIMEOUT;			}			/*set return code */			data[48] = 0;			mbox->cmd.length = 0;			TracingEnabled = 0;			break;			/* PPIPE_GET_TRACE_INFO */		case 0x22:			if (TracingEnabled) {				buffer_length = 0;				/* frames < NUM_TRACE_FRAMES */				for (frames = 0; frames < 62; frames += 1) {					sdla_peek(&card->hw, curr_trace_addr,						  &buf2, 1);					/* no data on board so exit */					if (buf2[0] == 0x00)						break;					/*1+sizeof(FRAME_DATA) = 9 */					if ((available_buffer_space -					     buffer_length) < 9) {						/*indicate we have more frames 						   on board and exit */						data[60] |= 0x02;						break;					}					/* get frame status */					sdla_peek(&card->hw, curr_trace_addr +						  0x01, &data[60 + buffer_length], 1);					/* get time stamp */					sdla_peek(&card->hw, curr_trace_addr +						  0x06, &data[64 + buffer_length], 2);					/* get frame length */					sdla_peek(&card->hw, curr_trace_addr +						  0x02, &data[62 + buffer_length], 2);					/* get pointer to real data */					sdla_peek(&card->hw, curr_trace_addr +						  0x04, &buf2, 2);					data_ptr = 0;					memcpy(&data_ptr, &buf2, 2);					/* see if we can fit the frame into the 					   user buffer */					memcpy(&real_len,					   &data[62 + buffer_length], 2);					if ((data_ptr == 0) ||					    ((real_len + 8) >					     available_buffer_space)) {						data[61 + buffer_length] = 0x00;					} else {						/* we can take it next time */						if ((available_buffer_space -						     buffer_length) <						    (real_len + 8)) {							data[60] |= 0x02;							break;						}						/* ok, get the frame */						data[61 + buffer_length] = 0x01;						/* get the data */						sdla_peek(&card->hw, data_ptr,						&data[66 + buffer_length],							  real_len);						/* zero the opp flag to 						   show we got the frame */						buf2[0] = 0x00;						sdla_poke(&card->hw,							  curr_trace_addr, &buf2, 1);						/* now move onto the next 						   frame */						curr_trace_addr += 8;						/* check if we passed the last 						   address */						if (curr_trace_addr >=						    start_trace_addr + 0x1F0) {							curr_trace_addr =							    start_trace_addr;						}						/* update buffer length and make                                                   sure its even */						if (data[61 + buffer_length]						    == 0x01) {							buffer_length +=							    real_len - 1;						}						/* for the header */						buffer_length += 8;						if (buffer_length & 0x0001)							buffer_length += 1;					}				}				/* ok now set the total number of frames passed				   in the high 5 bits */				data[60] = (frames << 2) | data[60];				/* set the data length */				mbox->cmd.length = buffer_length;				memcpy(&data[46], &buffer_length, 2);				/* set return code */				data[48] = 0;			} else {				/* set return code */				data[48] = 1;				mbox->cmd.length = 0;			}			break;			/* PPIPE_GET_IBA_DATA */		case 0x23:			mbox->cmd.length = 0x09;			if (card->hw.fwid == SFID_PPP502) {				sdla_peek(&card->hw, 0xA003, &data[60],					  mbox->cmd.length);			} else {				sdla_peek(&card->hw, 0xF003, &data[60],					  mbox->cmd.length);			}			/* set the length of the data */			data[46] = 0x09;			/* set return code */			data[48] = 0x00;			break;			/* PPIPE_KILL_BOARD */		case 0x24:			break;			/* PPIPE_FT1_READ_STATUS */		case 0x25:			sdla_peek(&card->hw, 0xF020, &data[60], 2);			data[46] = 2;			data[47] = 0;			data[48] = 0;			mbox->cmd.length = 2;			break;		case 0x29:			init_ppp_priv_struct(ppp_priv_area);			init_global_statistics(card);			mbox->cmd.length = 0;			break;		case 0x30:			do_gettimeofday(&tv);			ppp_priv_area->router_up_time = tv.tv_sec -			    ppp_priv_area->router_start_time;			*(unsigned long *) &data[60] =			    ppp_priv_area->router_up_time;			mbox->cmd.length = 4;			break;			/* FT1 MONITOR STATUS */		case 0x80:			/* Enable FT1 MONITOR STATUS */			if (data[60] == 1) {				if (rCount++ != 0) {					data[48] = 0;					mbox->cmd.length = 1;					break;				}			}			/* Disable FT1 MONITOR STATUS */			if (data[60] == 0) {				if (--rCount != 0) {					data[48] = 0;					mbox->cmd.length = 1;					break;				}			}		default:			/* it's a board command */			memcpy(&mbox->cmd, &sendpacket[45], sizeof(ppp_cmd_t));			if (mbox->cmd.length) {				memcpy(&mbox->data, &sendpacket[60],				       mbox->cmd.length);			}			/* run the command on the board */			err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT;			if (err != CMD_OK) {				ppp_error(card, err, mbox);				++ppp_priv_area->				    UDP_PTPIPE_mgmt_adptr_cmnd_timeout;				break;			}			++ppp_priv_area->UDP_PTPIPE_mgmt_adptr_cmnd_OK;			/* copy the result back to our buffer */			memcpy(data, sendpacket, skb->len);			memcpy(&data[45], &mbox->cmd, sizeof(ppp_cmd_t));			if (mbox->cmd.length) {				memcpy(&data[60], &mbox->data, mbox->cmd.length);			}		}		/* end of switch */	}			/* end of else */	/* Fill UDP TTL */	data[8] = card->wandev.ttl;	len = reply_udp(data, mbox->cmd.length);	if (udp_pkt_src == UDP_PKT_FRM_NETWORK) {		++ppp_priv_area->UDP_PTPIPE_mgmt_passed_to_adptr;		ppp_send(card, data, len, skb->protocol);	} else {		/* Pass it up the stack		   Allocate socket buffer */		if ((new_skb = dev_alloc_skb(len)) != 

⌨️ 快捷键说明

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