| /* |
| * |
| * Copyright (C) 2007 Mindspeed Technologies, Inc. |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License as published by |
| * the Free Software Foundation; either version 2 of the License, or |
| * (at your option) any later version. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with this program; if not, write to the Free Software |
| * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| */ |
| #include "cmm.h" |
| #include <stdlib.h> |
| #include <string.h> |
| #include <ctype.h> |
| #include "module_stat.h" |
| |
| static int parse_interface(char *pstring, unsigned short *pinterface_number); |
| |
| /************************************************************ |
| * |
| * |
| * |
| ************************************************************/ |
| void cmmStatShowPrintHelp() |
| { |
| char buf[128]; |
| |
| print_all_gemac_ports(buf, 128); |
| cmm_print(DEBUG_STDOUT, "Usage: show stat queue {queue_no} interface {%s} query|query_reset\n" |
| " show stat interface {%s} query|query_reset\n" |
| " show stat vlan query|query_reset\n" |
| " show stat connection query\n" |
| " show stat pppoe query|query_reset\n" |
| " show stat bridge query|query_reset\n" |
| " show stat ipsec query|query_reset\n", buf, buf); |
| } |
| |
| |
| /************************************************************ |
| * |
| * |
| * |
| ************************************************************/ |
| int cmmStatShowProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle) |
| { |
| int cpt = tabStart; |
| unsigned int cmdToSend = 0; /* bits field*/ |
| int rcvBytes = 0; |
| char rcvBuffer[256]; |
| char * endptr; |
| unsigned int tmp; |
| char *pinterface; |
| unsigned short interface; |
| |
| fpp_stat_queue_cmd_t queueShowCmd; |
| fpp_stat_interface_cmd_t interfaceShowCmd; |
| fpp_stat_connection_cmd_t connShowCmd; |
| fpp_stat_pppoe_status_cmd_t pppoeStatusCmd; |
| fpp_stat_bridge_status_cmd_t bridgeStatusCmd; |
| fpp_stat_ipsec_status_cmd_t ipsecStatusCmd; |
| fpp_stat_vlan_status_cmd_t vlanStatusCmd; |
| fpp_stat_queue_response_t *queueStatRsp; |
| fpp_stat_interface_pkt_response_t *interfacePktStatRsp; |
| fpp_stat_conn_response_t *connStatRsp; |
| |
| uint64_t total_bytes_received_0; |
| uint64_t total_bytes_received_1; |
| uint64_t total_bytes_received; |
| uint64_t total_bytes_transmitted_0; |
| uint64_t total_bytes_transmitted_1; |
| uint64_t total_bytes_transmitted; |
| |
| //goto help |
| if(!keywords[cpt]) |
| goto help; |
| |
| if(strcasecmp(keywords[cpt], "queue") == 0) |
| { |
| if(!keywords[++cpt]) |
| goto help; |
| |
| /*Get an integer from the string*/ |
| endptr = NULL; |
| tmp = strtoul(keywords[cpt], &endptr, 0); |
| if ((keywords[cpt] == endptr) || (tmp >= FPP_NUM_QUEUES)) |
| { |
| cmm_print(DEBUG_CRIT, "Stat ERROR: Queue Number must be a number between 0 and %d\n", FPP_NUM_QUEUES - 1); |
| goto help; |
| } |
| queueShowCmd.queue = tmp; |
| |
| if(!keywords[++cpt]) |
| goto help; |
| |
| if(strcasecmp(keywords[cpt], "interface") != 0) |
| goto keyword_error; |
| |
| if(!keywords[++cpt]) |
| goto help; |
| |
| pinterface = keywords[cpt]; |
| if (parse_interface(pinterface, &interface) < 0) |
| goto help; |
| |
| queueShowCmd.interface = interface; |
| |
| if(!keywords[++cpt]) |
| goto help; |
| |
| if(strcasecmp(keywords[cpt], "query") == 0) |
| { |
| queueShowCmd.action = FPP_CMM_STAT_QUERY; |
| } |
| else if(strcasecmp(keywords[cpt], "query_reset") == 0) |
| { |
| queueShowCmd.action = FPP_CMM_STAT_QUERY_RESET; |
| } |
| else |
| goto keyword_error; |
| |
| cmdToSend |= CMD_BIT(FPP_CMD_STAT_QUEUE); |
| } |
| else if(strcasecmp(keywords[cpt], "interface") == 0) |
| { |
| if(!keywords[++cpt]) |
| goto help; |
| |
| pinterface = keywords[cpt]; |
| if (parse_interface(pinterface, &interface) < 0) |
| goto help; |
| |
| interfaceShowCmd.interface = interface; |
| |
| if(!keywords[++cpt]) |
| goto help; |
| |
| if(strcasecmp(keywords[cpt], "query") == 0) |
| { |
| interfaceShowCmd.action = FPP_CMM_STAT_QUERY; |
| } |
| else if(strcasecmp(keywords[cpt], "query_reset") == 0) |
| { |
| interfaceShowCmd.action = FPP_CMM_STAT_QUERY_RESET; |
| } |
| else |
| goto keyword_error; |
| |
| cmdToSend |= CMD_BIT(FPP_CMD_STAT_INTERFACE_PKT); |
| } |
| else if(strcasecmp(keywords[cpt], "connection") == 0) |
| { |
| if(!keywords[++cpt]) |
| goto help; |
| |
| if(strcasecmp(keywords[cpt], "query") != 0) |
| goto keyword_error; |
| |
| connShowCmd.action = FPP_CMM_STAT_QUERY; |
| |
| cmdToSend |= CMD_BIT(FPP_CMD_STAT_CONNECTION); |
| } |
| else if(strcasecmp(keywords[cpt], "pppoe") == 0) |
| { |
| if(!keywords[++cpt]) |
| goto help; |
| |
| if(strcasecmp(keywords[cpt], "query") == 0) |
| { |
| pppoeStatusCmd.action = FPP_CMM_STAT_QUERY; |
| } |
| else if(strcasecmp(keywords[cpt], "query_reset") == 0) |
| { |
| pppoeStatusCmd.action = FPP_CMM_STAT_QUERY_RESET; |
| } |
| else |
| goto keyword_error; |
| |
| cmdToSend |= CMD_BIT(FPP_CMD_STAT_PPPOE_STATUS); |
| } |
| else if(strcasecmp(keywords[cpt], "bridge") == 0) |
| { |
| if(!keywords[++cpt]) |
| goto help; |
| |
| if(strcasecmp(keywords[cpt], "query") == 0) |
| { |
| bridgeStatusCmd.action = FPP_CMM_STAT_QUERY; |
| } |
| else if(strcasecmp(keywords[cpt], "query_reset") == 0) |
| { |
| bridgeStatusCmd.action = FPP_CMM_STAT_QUERY_RESET; |
| } |
| else |
| goto keyword_error; |
| |
| cmdToSend |= CMD_BIT(FPP_CMD_STAT_BRIDGE_STATUS); |
| } |
| else if(strcasecmp(keywords[cpt], "ipsec") == 0) |
| { |
| if(!keywords[++cpt]) |
| goto help; |
| |
| if((strcasecmp(keywords[cpt], "query") == 0) || (strcasecmp(keywords[cpt], "query_reset") == 0)) { |
| if(strcasecmp(keywords[cpt], "query") == 0) |
| { |
| ipsecStatusCmd.action = FPP_CMM_STAT_QUERY; |
| } |
| else if(strcasecmp(keywords[cpt], "query_reset") == 0) |
| { |
| ipsecStatusCmd.action = FPP_CMM_STAT_QUERY_RESET; |
| } |
| else |
| goto keyword_error; |
| |
| cmdToSend |= CMD_BIT(FPP_CMD_STAT_IPSEC_STATUS); |
| } |
| else |
| goto help; |
| } |
| else if(strcasecmp(keywords[cpt], "vlan") == 0) |
| { |
| if(!keywords[++cpt]) |
| goto help; |
| |
| if(strcasecmp(keywords[cpt], "query") == 0) |
| { |
| vlanStatusCmd.action = FPP_CMM_STAT_QUERY; |
| } |
| else if(strcasecmp(keywords[cpt], "query_reset") == 0) |
| { |
| vlanStatusCmd.action = FPP_CMM_STAT_QUERY_RESET; |
| } |
| else |
| goto keyword_error; |
| |
| cmdToSend |= CMD_BIT(FPP_CMD_STAT_VLAN_STATUS); |
| } |
| else |
| goto keyword_error; |
| |
| if(TEST_CMD_BIT(cmdToSend, FPP_CMD_STAT_QUEUE)) |
| { |
| /* Send CMD_STAT_QUEUE command */ |
| rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_STAT_QUEUE, & queueShowCmd, sizeof(queueShowCmd), rcvBuffer); |
| |
| if ( rcvBytes != sizeof(fpp_stat_queue_response_t)) |
| { |
| cmm_print(DEBUG_STDERR, "ERROR: Unexpected returned result from FPP rc:%04x\n", |
| (rcvBytes < sizeof(unsigned short) ) ? 0 : *((unsigned short *) rcvBuffer)); |
| goto exit; |
| } |
| else |
| { |
| queueStatRsp = (fpp_stat_queue_response_t *)(rcvBuffer); |
| cmm_print(DEBUG_STDOUT, "Emitted Pkts: 0x%0x \n" "Dropped Packets: 0x%0x\n" "Peak Queue Occupancy: 0x%0x \n", |
| queueStatRsp->emitted_pkts, queueStatRsp->dropped_pkts, queueStatRsp->peak_queue_occ); |
| } |
| } |
| |
| if(TEST_CMD_BIT(cmdToSend, FPP_CMD_STAT_INTERFACE_PKT)) |
| { |
| /* Send CMD_STAT_INTERFACE_PKT command */ |
| rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_STAT_INTERFACE_PKT, & interfaceShowCmd, sizeof(interfaceShowCmd), rcvBuffer); |
| |
| if ( rcvBytes != sizeof(fpp_stat_interface_pkt_response_t) ) |
| { |
| cmm_print(DEBUG_STDERR, "ERROR: Unexpected returned result from FPP rc:%04x\n", |
| (rcvBytes < sizeof(unsigned short) ) ? 0 : *((unsigned short *) rcvBuffer)); |
| goto exit; |
| } |
| else |
| { |
| interfacePktStatRsp = (fpp_stat_interface_pkt_response_t *)(rcvBuffer); |
| |
| total_bytes_transmitted_0 = interfacePktStatRsp->total_bytes_transmitted[0]; |
| total_bytes_transmitted_1 = interfacePktStatRsp->total_bytes_transmitted[1]; |
| total_bytes_transmitted_1 <<= 32; |
| |
| total_bytes_transmitted = total_bytes_transmitted_0 | total_bytes_transmitted_1; |
| |
| total_bytes_received_0 = interfacePktStatRsp->total_bytes_received[0]; |
| total_bytes_received_1 = interfacePktStatRsp->total_bytes_received[1]; |
| total_bytes_received_1 <<= 32; |
| |
| total_bytes_received = total_bytes_received_0 | total_bytes_received_1; |
| |
| |
| cmm_print(DEBUG_STDOUT, "Total Bytes Received: %llu \n" |
| "Total Bytes Transmitted: %llu \n" |
| "Total Packets Received: %u \n" |
| "Total Packets Transmitted: %u \n", |
| total_bytes_received, total_bytes_transmitted, |
| interfacePktStatRsp->total_pkts_received, interfacePktStatRsp->total_pkts_transmitted); |
| } |
| } |
| |
| if(TEST_CMD_BIT(cmdToSend, FPP_CMD_STAT_CONNECTION)) |
| { |
| /* Send CMD_STAT_CONNECTION command */ |
| rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_STAT_CONNECTION, & connShowCmd, sizeof(connShowCmd), rcvBuffer); |
| |
| if ( rcvBytes != sizeof(fpp_stat_conn_response_t) ) |
| { |
| cmm_print(DEBUG_STDERR, "ERROR: Unexpected returned result from FPP rc:%04x\n", |
| (rcvBytes < sizeof(unsigned short) ) ? 0 : *((unsigned short *) rcvBuffer)); |
| goto exit; |
| } |
| else |
| { |
| connStatRsp = (fpp_stat_conn_response_t *)(rcvBuffer); |
| #if !defined(COMCERTO_2000) |
| cmm_print(DEBUG_STDOUT, "Maximum Active Connections: %u \n" |
| "Number of Active Connections: %u \n", |
| connStatRsp->max_active_connections, connStatRsp->num_active_connections); |
| #else |
| cmm_print(DEBUG_STDOUT, "Maximum connections supported in FE: %u \n" |
| "Maximum Active Connections: %s \n" |
| "Number of Active Connections: %u \n" |
| "Configured FE DDR Memory available for connections: %s \n" |
| "FE DDR Memory used by connections: %s \n", |
| connStatRsp->max_active_connections, |
| "N/A", |
| connStatRsp->num_active_connections, |
| "N/A", |
| "N/A"); |
| #endif |
| } |
| } |
| |
| if(TEST_CMD_BIT(cmdToSend, FPP_CMD_STAT_PPPOE_STATUS)) |
| { |
| int count = 0; |
| char interface[IFNAMSIZ]; |
| fpp_stat_pppoe_entry_response_t *pEntryResponse = (fpp_stat_pppoe_entry_response_t *)rcvBuffer; |
| /* Send CMD_STAT_PPPOE_STATUS command */ |
| rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_STAT_PPPOE_STATUS, &pppoeStatusCmd, sizeof(pppoeStatusCmd), rcvBuffer); |
| if (rcvBytes != 2) |
| { |
| cmm_print(DEBUG_STDERR, "ERROR: Unexpected result returned from FPP rc:%04x\n", |
| (rcvBytes < sizeof(unsigned short) ) ? 0 : *((unsigned short *) rcvBuffer) |
| ); |
| goto exit; |
| } |
| |
| while (1) |
| { |
| rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_STAT_PPPOE_ENTRY, NULL, 0, rcvBuffer); |
| if (rcvBytes != sizeof(fpp_stat_pppoe_entry_response_t)) |
| { |
| cmm_print(DEBUG_STDERR, "ERROR: Unexpected result returned from FPP rc:%04x\n", |
| (rcvBytes < sizeof(unsigned short) ) ? 0 : *((unsigned short *) rcvBuffer) |
| ); |
| goto exit; |
| } |
| if (pEntryResponse->eof) |
| break; |
| |
| get_port_name(pEntryResponse->interface_no, interface, IFNAMSIZ); |
| |
| cmm_print(DEBUG_STDOUT, "Session ID = 0x%0x " |
| "Interface=%-6s " |
| "Packets Received = 0x%0x " |
| "Packets Transmitted = 0x%0x\n", |
| pEntryResponse->sessionid, |
| interface, |
| pEntryResponse->total_packets_received, |
| pEntryResponse->total_packets_transmitted); |
| count++; |
| } |
| cmm_print(DEBUG_STDOUT, "\n Statistics of %d PPPoE Sessions displayed \n", count); |
| } |
| |
| if(TEST_CMD_BIT(cmdToSend, FPP_CMD_STAT_BRIDGE_STATUS)) |
| { |
| int count = 0; |
| char input_interface[IFNAMSIZ]; |
| char output_interface[IFNAMSIZ]; |
| fpp_stat_bridge_entry_response_t *pEntryResponse = (fpp_stat_bridge_entry_response_t *)rcvBuffer; |
| /* Send CMD_STAT_BRIDGE_STATUS command */ |
| rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_STAT_BRIDGE_STATUS, &bridgeStatusCmd, sizeof(bridgeStatusCmd), rcvBuffer); |
| if (rcvBytes != 2) |
| { |
| cmm_print(DEBUG_STDERR, "ERROR: Unexpected result returned from FPP rc:%04x\n", |
| (rcvBytes < sizeof(unsigned short) ) ? 0 : *((unsigned short *) rcvBuffer) |
| ); |
| goto exit; |
| } |
| |
| while (1) |
| { |
| rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_STAT_BRIDGE_ENTRY, NULL, 0, rcvBuffer); |
| if (rcvBytes != sizeof(fpp_stat_bridge_entry_response_t)) |
| { |
| cmm_print(DEBUG_STDERR, "ERROR: Unexpected result returned from FPP rc:%04x\n", |
| (rcvBytes < sizeof(unsigned short) ) ? 0 : *((unsigned short *) rcvBuffer) |
| ); |
| goto exit; |
| } |
| if (pEntryResponse->eof) |
| break; |
| |
| if (pEntryResponse->input_interface >= GEM_PORTS) |
| strcpy(input_interface, pEntryResponse->input_name); |
| else |
| get_port_name(pEntryResponse->input_interface, input_interface, IFNAMSIZ); |
| |
| if (pEntryResponse->input_vlan != 0xFFFF) |
| sprintf(input_interface + strlen(input_interface), ".%d", pEntryResponse->input_vlan); |
| |
| if (pEntryResponse->output_interface >= GEM_PORTS) |
| strcpy(output_interface, pEntryResponse->output_name); |
| else |
| get_port_name(pEntryResponse->output_interface, output_interface, IFNAMSIZ); |
| |
| if (pEntryResponse->output_vlan != 0xFFFF) |
| sprintf(output_interface + strlen(output_interface), ".%d", pEntryResponse->output_vlan); |
| cmm_print(DEBUG_STDOUT, "Input=%-6s " |
| "DA=%02X:%02X:%02X:%02X:%02X:%02X " |
| "SA=%02X:%02X:%02X:%02X:%02X:%02X " |
| "Type=%04X " |
| "Output=%s " |
| "SessionId=%d " |
| "Packets Transmitted = 0x%0x\n", |
| input_interface, |
| pEntryResponse->dst_mac[0], pEntryResponse->dst_mac[1], pEntryResponse->dst_mac[2], |
| pEntryResponse->dst_mac[3], pEntryResponse->dst_mac[4], pEntryResponse->dst_mac[5], |
| pEntryResponse->src_mac[0], pEntryResponse->src_mac[1], pEntryResponse->src_mac[2], |
| pEntryResponse->src_mac[3], pEntryResponse->src_mac[4], pEntryResponse->src_mac[5], |
| pEntryResponse->ether_type, output_interface,pEntryResponse->session_id, |
| pEntryResponse->total_packets_transmitted); |
| count++; |
| } |
| cmm_print(DEBUG_STDOUT, "\n Statistics of %d Bridge Table Entries displayed \n", count); |
| } |
| |
| if(TEST_CMD_BIT(cmdToSend, FPP_CMD_STAT_IPSEC_STATUS)) |
| { |
| int count = 0; |
| fpp_stat_ipsec_entry_response_t *pEntryResponse = (fpp_stat_ipsec_entry_response_t *)rcvBuffer; |
| /* Send CMD_STAT_IPSEC_STATUS command */ |
| rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_STAT_IPSEC_STATUS, &ipsecStatusCmd, sizeof(ipsecStatusCmd), rcvBuffer); |
| if (rcvBytes != 2) |
| { |
| cmm_print(DEBUG_STDERR, "ERROR: Unexpected result returned from FPP rc:%04x\n", |
| (rcvBytes < sizeof(unsigned short) ) ? 0 : *((unsigned short *) rcvBuffer) |
| ); |
| goto exit; |
| } |
| |
| while (1) |
| { |
| rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_STAT_IPSEC_ENTRY, NULL, 0, rcvBuffer); |
| if (rcvBytes != sizeof(fpp_stat_ipsec_entry_response_t)) |
| { |
| cmm_print(DEBUG_STDERR, "ERROR: Unexpected result returned from FPP rc:%04x\n", |
| (rcvBytes < sizeof(unsigned short) ) ? 0 : *((unsigned short *) rcvBuffer) |
| ); |
| goto exit; |
| } |
| if (pEntryResponse->eof) |
| break; |
| |
| total_bytes_transmitted_0 = pEntryResponse->total_bytes_processed[0]; |
| total_bytes_transmitted_1 = pEntryResponse->total_bytes_processed[1]; |
| total_bytes_transmitted_1 <<= 32; |
| |
| total_bytes_transmitted = total_bytes_transmitted_0 | total_bytes_transmitted_1; |
| |
| cmm_print(DEBUG_STDOUT, "\nSPI: %x \n", pEntryResponse->spi); |
| if(pEntryResponse->family == FPP_PROTO_IPV4){ |
| cmm_print(DEBUG_STDOUT, "Dst IP: %d.%d.%d.%d \n", (pEntryResponse->dst_ip[0] & 0x000000ff), |
| ((pEntryResponse->dst_ip[0] >> 8) & 0x000000ff), |
| ((pEntryResponse->dst_ip[0] >> 16) & 0x000000ff), |
| ((pEntryResponse->dst_ip[0] >> 24) & 0x000000ff)); |
| } |
| else{ |
| char addr[64]; |
| |
| inet_ntop(AF_INET6, pEntryResponse->dst_ip, addr, sizeof(addr)); |
| cmm_print(DEBUG_STDOUT,"Dst IP: %s\n", addr); |
| } |
| cmm_print(DEBUG_STDOUT, "IPsec proto: %d \n", pEntryResponse->proto); |
| cmm_print(DEBUG_STDOUT, "Total Packets Processed: %u \n" |
| "Total Bytes Processed: %llu \n \n", |
| pEntryResponse->total_pkts_processed, total_bytes_transmitted); |
| count++; |
| } |
| cmm_print(DEBUG_STDOUT, "\n Statistics of %d SA Entries displayed \n", count); |
| } |
| |
| if(TEST_CMD_BIT(cmdToSend, FPP_CMD_STAT_VLAN_STATUS)) |
| { |
| int count = 0; |
| fpp_stat_vlan_entry_response_t *pEntryResponse = (fpp_stat_vlan_entry_response_t *)rcvBuffer; |
| /* Send FPP_CMD_STAT_VLAN_STATUS command */ |
| rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_STAT_VLAN_STATUS, &vlanStatusCmd, sizeof(vlanStatusCmd), rcvBuffer); |
| if (rcvBytes != 2) |
| { |
| cmm_print(DEBUG_STDERR, "ERROR: Unexpected result returned from FPP rc:%04x\n", |
| (rcvBytes < sizeof(unsigned short) ) ? 0 : *((unsigned short *) rcvBuffer) |
| ); |
| goto exit; |
| } |
| |
| while (1) |
| { |
| rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_STAT_VLAN_ENTRY, NULL, 0, rcvBuffer); |
| if (rcvBytes != sizeof(fpp_stat_vlan_entry_response_t)) |
| { |
| cmm_print(DEBUG_STDERR, "ERROR: Unexpected result returned from FPP rc:%04x\n", |
| (rcvBytes < sizeof(unsigned short) ) ? 0 : *((unsigned short *) rcvBuffer) |
| ); |
| goto exit; |
| } |
| if (pEntryResponse->eof) |
| break; |
| |
| total_bytes_transmitted_0 = pEntryResponse->total_bytes_transmitted[0]; |
| total_bytes_transmitted_1 = pEntryResponse->total_bytes_transmitted[1]; |
| total_bytes_transmitted_1 <<= 32; |
| |
| total_bytes_transmitted = total_bytes_transmitted_0 | total_bytes_transmitted_1; |
| |
| total_bytes_received_0 = pEntryResponse->total_bytes_received[0]; |
| total_bytes_received_1 = pEntryResponse->total_bytes_received[1]; |
| total_bytes_received_1 <<= 32; |
| |
| total_bytes_received = total_bytes_received_0 | total_bytes_received_1; |
| |
| cmm_print(DEBUG_STDOUT, "VLAN ID = %4d " |
| "VLAN Interface Name = %s " |
| "VLAN Physical Interface Name = %s " |
| "Packets Received = %u " |
| "Packets Transmitted = %u " |
| "Bytes Received = %llu " |
| "Bytes Transmitted = %llu\n", |
| pEntryResponse->vlanID, |
| pEntryResponse->vlanifname, |
| pEntryResponse->phyifname, |
| pEntryResponse->total_packets_received, |
| pEntryResponse->total_packets_transmitted, total_bytes_received, total_bytes_transmitted); |
| |
| count++; |
| } |
| cmm_print(DEBUG_STDOUT, "\n Statistics of %d VLAN Entries displayed \n", count); |
| } |
| |
| |
| return 0; |
| |
| keyword_error: |
| cmm_print(DEBUG_STDERR, "ERROR: Unknown keyword %s\n", keywords[cpt]); |
| |
| help: |
| cmmStatShowPrintHelp(); |
| |
| exit: |
| return -1; |
| |
| } |
| |
| |
| /************************************************************ |
| * |
| * |
| * |
| ************************************************************/ |
| void cmmStatSetPrintHelp(int cmd_type) |
| { |
| if (cmd_type == FPP_STAT_UNKNOWN_CMD || cmd_type == FPP_STAT_ENABLE_CMD) |
| { |
| cmm_print(DEBUG_STDOUT, "Usage: set stat enable {queue|interface|vlan|pppoe|bridge|ipsec} \n" |
| " set stat disable {queue|interface|vlan|pppoe|bridge|ipsec} \n"); |
| } |
| if (cmd_type == FPP_STAT_UNKNOWN_CMD || cmd_type == FPP_STAT_QUEUE_CMD) |
| { |
| cmm_print(DEBUG_STDOUT, |
| "Usage: set stat queue {queue_no} interface {wan|lan|wan0|lan0} reset \n"); |
| } |
| if (cmd_type == FPP_STAT_UNKNOWN_CMD || cmd_type == FPP_STAT_INTERFACE_PKT_CMD) |
| { |
| cmm_print(DEBUG_STDOUT, |
| "Usage: set stat interface {wan|lan|wan0|lan0} reset\n"); |
| } |
| if (cmd_type == FPP_STAT_UNKNOWN_CMD || cmd_type == FPP_STAT_VLAN_CMD) |
| { |
| cmm_print(DEBUG_STDOUT, |
| "Usage: set stat vlan reset\n"); |
| } |
| if (cmd_type == FPP_STAT_UNKNOWN_CMD || cmd_type == FPP_STAT_PPPOE_CMD) |
| { |
| cmm_print(DEBUG_STDOUT, |
| "Usage: set stat pppoe reset\n"); |
| } |
| if (cmd_type == FPP_STAT_UNKNOWN_CMD || cmd_type == FPP_STAT_BRIDGE_CMD) |
| { |
| cmm_print(DEBUG_STDOUT, |
| "Usage: set stat bridge reset\n"); |
| } |
| if (cmd_type == FPP_STAT_UNKNOWN_CMD || cmd_type == FPP_STAT_IPSEC_CMD) |
| { |
| cmm_print(DEBUG_STDOUT, |
| "Usage: set stat ipsec reset\n"); |
| } |
| if (cmd_type == FPP_STAT_UNKNOWN_CMD || cmd_type == FPP_STAT_CONNECTION_CMD) |
| { |
| cmm_print(DEBUG_STDOUT, "Usage: set stat connection { maxconn <no.of connections> } \n" |
| " { memconn <Value of FPP DDR memory available for connections specified in bytes> }\n"); |
| } |
| |
| if (cmd_type == FPP_STAT_UNKNOWN_CMD) |
| { |
| cmm_print(DEBUG_STDOUT, "\n"); |
| } |
| |
| } |
| |
| |
| /************************************************************ |
| * |
| * |
| * |
| ************************************************************/ |
| int cmmStatSetProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle) |
| { |
| int cmd_type = FPP_STAT_UNKNOWN_CMD; |
| int cpt = tabStart; |
| unsigned int cmdToSend = 0; /* bits field*/ |
| char * endptr; |
| unsigned int tmp; |
| int rcvBytes = 0; |
| char *pinterface; |
| unsigned short interface; |
| |
| |
| fpp_stat_enable_cmd_t statEnableCmd; |
| fpp_stat_queue_cmd_t queueResetCmd; |
| fpp_stat_interface_cmd_t interfaceResetCmd; |
| fpp_stat_pppoe_status_cmd_t pppoeResetCmd; |
| fpp_stat_bridge_status_cmd_t bridgeResetCmd; |
| fpp_stat_ipsec_status_cmd_t ipsecResetCmd; |
| fpp_stat_vlan_status_cmd_t vlanResetCmd; |
| fpp_stat_connection_cmd_t connectionSetCmd; |
| |
| char rcvBuffer[256]; |
| |
| if(!keywords[cpt]) |
| goto help; |
| |
| if( (strcasecmp(keywords[cpt], "enable") == 0) || |
| (strcasecmp(keywords[cpt], "disable") == 0) ) |
| { |
| cmd_type = FPP_STAT_ENABLE_CMD; |
| |
| if(strcasecmp(keywords[cpt], "enable") == 0) |
| statEnableCmd.action = FPP_CMM_STAT_ENABLE; |
| else |
| statEnableCmd.action = FPP_CMM_STAT_DISABLE; |
| |
| if(!keywords[++cpt]) |
| goto help; |
| |
| if(strcasecmp(keywords[cpt], "queue") == 0) |
| statEnableCmd.bitmask = FPP_STAT_QUEUE_BITMASK; |
| else if(strcasecmp(keywords[cpt], "interface") == 0) |
| statEnableCmd.bitmask = FPP_STAT_INTERFACE_BITMASK; |
| else if(strcasecmp(keywords[cpt], "pppoe") == 0) |
| statEnableCmd.bitmask = FPP_STAT_PPPOE_BITMASK; |
| else if(strcasecmp(keywords[cpt], "bridge") == 0) |
| statEnableCmd.bitmask = FPP_STAT_BRIDGE_BITMASK; |
| else if(strcasecmp(keywords[cpt], "ipsec") == 0) |
| statEnableCmd.bitmask = FPP_STAT_IPSEC_BITMASK; |
| else if(strcasecmp(keywords[cpt], "vlan") == 0) |
| statEnableCmd.bitmask = FPP_STAT_VLAN_BITMASK; |
| else |
| goto keyword_error; |
| |
| cmdToSend |= CMD_BIT(FPP_CMD_STAT_ENABLE); |
| |
| } |
| else if(strcasecmp(keywords[cpt], "queue") == 0) |
| { |
| cmd_type = FPP_STAT_QUEUE_CMD; |
| if(!keywords[++cpt]) |
| goto help; |
| |
| /*Get an integer from the string*/ |
| endptr = NULL; |
| tmp = strtoul(keywords[cpt], &endptr, 0); |
| if ((keywords[cpt] == endptr) || (tmp >= FPP_NUM_QUEUES)) |
| { |
| cmm_print(DEBUG_CRIT, "Stat ERROR: Queue Number must be a number between 0 and %d\n", FPP_NUM_QUEUES - 1); |
| goto help; |
| } |
| |
| memset(&queueResetCmd, 0, sizeof(queueResetCmd)); |
| queueResetCmd.queue= tmp; |
| |
| if(!keywords[++cpt]) |
| goto help; |
| |
| if(strcasecmp(keywords[cpt], "interface") != 0) |
| goto keyword_error; |
| |
| if(!keywords[++cpt]) |
| goto help; |
| |
| pinterface = keywords[cpt]; |
| if (parse_interface(pinterface, &interface) < 0) |
| goto help; |
| |
| queueResetCmd.interface = interface; |
| |
| if(!keywords[++cpt]) |
| goto help; |
| |
| if(strcasecmp(keywords[cpt], "reset") != 0) |
| goto help; |
| |
| queueResetCmd.action = FPP_CMM_STAT_RESET; |
| cmdToSend |= CMD_BIT(FPP_CMD_STAT_QUEUE); |
| } |
| else if(strcasecmp(keywords[cpt], "interface") == 0) |
| { |
| cmd_type = FPP_STAT_INTERFACE_PKT_CMD; |
| if(!keywords[++cpt]) |
| goto help; |
| pinterface = keywords[cpt]; |
| |
| memset(&interfaceResetCmd, 0, sizeof(interfaceResetCmd)); |
| if (parse_interface(pinterface, &interface) < 0) |
| goto help; |
| |
| interfaceResetCmd.interface = interface; |
| |
| if(!keywords[++cpt]) |
| goto help; |
| |
| |
| if(strcasecmp(keywords[cpt], "reset") != 0) |
| goto help; |
| |
| interfaceResetCmd.action = FPP_CMM_STAT_RESET; |
| cmdToSend |= CMD_BIT(FPP_CMD_STAT_INTERFACE_PKT); |
| } |
| else if(strcasecmp(keywords[cpt], "pppoe") == 0) |
| { |
| cmd_type = FPP_STAT_PPPOE_CMD; |
| if(!keywords[++cpt]) |
| goto help; |
| |
| if(strcasecmp(keywords[cpt], "reset") != 0) |
| goto help; |
| |
| pppoeResetCmd.action = FPP_CMM_STAT_RESET; |
| cmdToSend |= CMD_BIT(FPP_CMD_STAT_PPPOE_STATUS); |
| } |
| else if(strcasecmp(keywords[cpt], "bridge") == 0) |
| { |
| cmd_type = FPP_STAT_BRIDGE_CMD; |
| if(!keywords[++cpt]) |
| goto help; |
| |
| if(strcasecmp(keywords[cpt], "reset") != 0) |
| goto help; |
| |
| bridgeResetCmd.action = FPP_CMM_STAT_RESET; |
| cmdToSend |= CMD_BIT(FPP_CMD_STAT_BRIDGE_STATUS); |
| } |
| else if(strcasecmp(keywords[cpt], "ipsec") == 0) |
| { |
| if(!keywords[++cpt]) |
| goto help; |
| |
| if(strcasecmp(keywords[cpt], "reset") == 0) |
| { |
| cmd_type = FPP_STAT_IPSEC_CMD; |
| |
| ipsecResetCmd.action = FPP_CMM_STAT_RESET; |
| cmdToSend |= CMD_BIT(FPP_CMD_STAT_IPSEC_STATUS); |
| |
| } |
| else |
| goto help; |
| } |
| else if(strcasecmp(keywords[cpt], "vlan") == 0) |
| { |
| cmd_type = FPP_STAT_VLAN_CMD; |
| if(!keywords[++cpt]) |
| goto help; |
| |
| if(strcasecmp(keywords[cpt], "reset") != 0) |
| goto help; |
| |
| vlanResetCmd.action = FPP_CMM_STAT_RESET; |
| cmdToSend |= CMD_BIT(FPP_CMD_STAT_VLAN_STATUS); |
| } |
| else if(strcasecmp(keywords[cpt], "connection") == 0) |
| { |
| if(!keywords[++cpt]) |
| goto help; |
| if((strcasecmp(keywords[cpt], "maxconn") != 0) && |
| (strcasecmp(keywords[cpt], "memconn") != 0) ) |
| goto help; |
| if(strcasecmp(keywords[cpt], "maxconn") == 0) |
| { |
| if(!keywords[++cpt]) |
| goto help; |
| |
| tmp = strtoul(keywords[cpt], &endptr, 0); |
| } |
| else if ( strcasecmp(keywords[cpt], "memconn") == 0 ) |
| { |
| if(!keywords[++cpt]) |
| goto help; |
| |
| tmp = strtoul(keywords[cpt], &endptr, 0); |
| } |
| /* Just Positively acknowledge the command & return without programming FE */ |
| goto ack_return; |
| } |
| else |
| goto keyword_error; |
| |
| |
| /* |
| * Parsing have been performed |
| * Now send the right commands |
| */ |
| if(TEST_CMD_BIT(cmdToSend, FPP_CMD_STAT_ENABLE)) |
| { |
| /* Send CMD_STAT_ENABLE command */ |
| rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_STAT_ENABLE, &statEnableCmd, sizeof(statEnableCmd), rcvBuffer); |
| } |
| |
| if(TEST_CMD_BIT(cmdToSend, FPP_CMD_STAT_QUEUE)) |
| { |
| /* Send CMD_STAT_QUEUE command */ |
| rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_STAT_QUEUE, &queueResetCmd, sizeof(queueResetCmd), rcvBuffer); |
| } |
| |
| if(TEST_CMD_BIT(cmdToSend, FPP_CMD_STAT_INTERFACE_PKT)) |
| { |
| /* Send CMD_STAT_INTERFACE_PKT command */ |
| rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_STAT_INTERFACE_PKT, &interfaceResetCmd, sizeof(interfaceResetCmd), rcvBuffer); |
| } |
| |
| if(TEST_CMD_BIT(cmdToSend, FPP_CMD_STAT_PPPOE_STATUS)) |
| { |
| // Send CMD_STAT_PPPOE_STATUS command |
| rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_STAT_PPPOE_STATUS, &pppoeResetCmd, sizeof(pppoeResetCmd), rcvBuffer); |
| } |
| |
| if(TEST_CMD_BIT(cmdToSend, FPP_CMD_STAT_BRIDGE_STATUS)) |
| { |
| // Send CMD_STAT_BRIDGE_STATUS command |
| rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_STAT_BRIDGE_STATUS, &bridgeResetCmd, sizeof(bridgeResetCmd), rcvBuffer); |
| } |
| |
| if(TEST_CMD_BIT(cmdToSend, FPP_CMD_STAT_IPSEC_STATUS)) |
| { |
| /* Send CMD_STAT_IPSEC_STATUS command */ |
| rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_STAT_IPSEC_STATUS, &ipsecResetCmd, sizeof(ipsecResetCmd), rcvBuffer); |
| } |
| |
| if(TEST_CMD_BIT(cmdToSend, FPP_CMD_STAT_VLAN_STATUS)) |
| { |
| // Send FPP_CMD_STAT_VLAN_STATUS command |
| rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_STAT_VLAN_STATUS, &vlanResetCmd, sizeof(vlanResetCmd), rcvBuffer); |
| } |
| |
| if ( (rcvBytes == 2) && ( ((unsigned short *)rcvBuffer)[0] != 0)) |
| cmm_print(DEBUG_STDERR, "ERROR: Unexpected result returned from FPP rc:%04x\n", ((unsigned short *)rcvBuffer)[0]); |
| |
| ack_return: |
| return 0; |
| |
| keyword_error: |
| cmm_print(DEBUG_CRIT, "ERROR: Unknown keyword %s\n", keywords[cpt]); |
| |
| help: |
| cmmStatSetPrintHelp(cmd_type); |
| return -1; |
| |
| } |
| |
| static int parse_interface(char *pstring, unsigned short *pinterface_number) |
| { |
| if ((short)(*pinterface_number = get_port_id(pstring)) < 0) |
| { |
| /*cmm_print(DEBUG_CRIT, "ERROR: Invalid interface specification: %s\n", pstring);*/ |
| return -1; |
| } |
| return 0; |
| } |
| |