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