wanpipe/util/wanpipemon/aftpipemon.c

2603 lines
77 KiB
C

/*****************************************************************************
* aftpipemon.c AFT Debugger/Monitor
*
* Author(s): Nenad Corbic <ncorbic@sangoma.com>
* David Rokhvarg <davidr@sangoma.com>
*
* Copyright: (c) 2004 Sangoma 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.
* ----------------------------------------------------------------------------
* Dec 24, 2010 David Rokhvarg Added control of Wanpipe Logger
* Jan 06, 2004 Nenad Corbic Initial version based on aftpipemon
*****************************************************************************/
/******************************************************************************
* INCLUDE FILES *
*****************************************************************************/
#if defined(__WINDOWS__)
#define WIN_STATS 1
/* all needed .h files are in wanpipemon.h */
#else
# include <stdio.h>
# include <stddef.h> /* offsetof(), etc. */
# include <ctype.h>
# include <unistd.h>
# include <string.h>
# include <stdlib.h>
# include <time.h>
#if defined(__FreeBSD__)
# include <limits.h>
#endif
# include <sys/time.h>
# include <sys/types.h>
# include <sys/socket.h>
# include <sys/ioctl.h>
# include <arpa/inet.h>
# include <net/if.h>
# include <netinet/in_systm.h>
# include <netinet/in.h>
# include <netinet/ip.h>
# include <netinet/udp.h>
#if defined(__LINUX__)
# include <linux/version.h>
# include <linux/types.h>
# include <linux/if_packet.h>
# include <linux/if_wanpipe.h>
# include <linux/if_ether.h>
#endif
#endif
#include "libsangoma.h"
#include "wanpipe_api.h"
#include "fe_lib.h"
#include "wanpipemon.h"
/******************************************************************************
* DEFINES/MACROS *
*****************************************************************************/
#if LINUX_VERSION_CODE >= 0x020100
#define LINUX_2_1
#endif
#define TIMEOUT 1
#define MDATALEN MAX_LGTH_UDP_MGNT_PKT
#define MAX_TRACE_BUF ((MDATALEN+200)*2)
#define BANNER(str) banner(str,0)
/******************************************************************************
* TYPEDEF/STRUCTURE *
*****************************************************************************/
/* Structures for data casting */
/******************************************************************************
* GLOBAL VARIABLES *
*****************************************************************************/
/* The ft1_lib needs these global variables */
extern wan_femedia_t femedia;
extern char *csudsu_menu_te1_pmc[];
extern char *csudsu_menu_te1_dm[];
extern char *csudsu_menu_te3[];
/******************************************************************************
* FUNCTION PROTOTYPES *
*****************************************************************************/
/* Command routines */
static void modem( void );
#if 0
static void global_stats( void );
#endif
static void comm_err_stats( void );
static void read_code_version( void );
static void link_status( void );
static void operational_stats( void );
static void line_trace( int );
static void aft_router_up_time( void );
static void flush_operational_stats( void );
static void flush_comm_err_stats( void );
static void read_ft1_te1_56k_config( void );
static int aft_read_hwec_status(void);
static int aft_remora_tones(int);
static int aft_remora_ring(int);
static int aft_remora_regdump(int);
static int aft_fe_reg_bit(int, int, int);
static wp_trace_output_iface_t trace_iface;
static char *gui_main_menu[]={
"aft_card_stats_menu","Card Status",
"aft_stats_menu", "Card Statistics",
"aft_trace_menu", "Trace Data",
"csudsu_menu", "CSU DSU Config/Stats",
"aft_flush_menu","Flush Statistics",
"."
};
static char *aft_card_stats_menu[]={
"xm","Modem Status",
"xl","Link Status",
"xcv","Read Code Version",
"xru","Display Router UP time",
"."
};
static char *aft_stats_menu[]={
"sc","Communication Error Statistics",
"so","Operational Statistics",
"."
};
static char *aft_trace_menu[]={
"tr","Raw Hex trace",
"ti","Interpreted trace",
"."
};
static char *aft_flush_menu[]={
"fc","Flush Communication Error Statistics",
"fo","Flush Operational Statistics",
"fpm","Flush T1/E1 performance monitoring cnters",
"."
};
static struct cmd_menu_lookup_t gui_cmd_menu_lookup[]={
{"aft_card_stats_menu",aft_card_stats_menu},
{"aft_stats_menu",aft_stats_menu},
{"aft_trace_menu",aft_trace_menu},
{"csudsu_menu",csudsu_menu},
{"aft_flush_menu",aft_flush_menu},
{".",NULL}
};
char ** AFTget_main_menu(int *len)
{
int i=0;
while(strcmp(gui_main_menu[i],".") != 0){
i++;
}
*len=i/2;
return gui_main_menu;
}
char ** AFTget_cmd_menu(char *cmd_name,int *len)
{
int i=0,j=0;
char **cmd_menu=NULL;
if (strcmp(cmd_name, "csudsu_menu") == 0){
if (femedia.media == WAN_MEDIA_T1 || femedia.media == WAN_MEDIA_E1){
if (femedia.chip_id == WAN_TE_CHIP_PMC){
cmd_menu = csudsu_menu_te1_pmc;
}else if (femedia.chip_id == WAN_TE_CHIP_DM){
cmd_menu = csudsu_menu_te1_dm;
}else{
cmd_menu = csudsu_menu;
}
}else if (femedia.media == WAN_MEDIA_DS3 || femedia.media == WAN_MEDIA_E3){
cmd_menu = csudsu_menu_te3;
}else{
cmd_menu = csudsu_menu;
}
}else{
while(gui_cmd_menu_lookup[i].cmd_menu_ptr != NULL){
if (strcmp(cmd_name,gui_cmd_menu_lookup[i].cmd_menu_name) == 0){
cmd_menu=(char**)gui_cmd_menu_lookup[i].cmd_menu_ptr;
break;
}
i++;
}
}
if (cmd_menu){
while (strcmp(cmd_menu[j],".") != 0){
j++;
}
}
*len=j/2;
return cmd_menu;
}
/******************************************************************************
* FUNCTION DEFINITION *
*****************************************************************************/
int AFTConfig(void)
{
char codeversion[10];
unsigned char x=0;
protocol_cb_size = sizeof(wan_mgmt_t) +
sizeof(wan_cmd_t) +
sizeof(wan_trace_info_t) + 1;
wan_udp.wan_udphdr_command= READ_CONFIGURATION;
wan_udp.wan_udphdr_return_code = 0xaa;
wan_udp.wan_udphdr_data_len = 0;
while (++x < 4) {
DO_COMMAND(wan_udp);
if (wan_udp.wan_udphdr_return_code == 0x00){
break;
}
if (wan_udp.wan_udphdr_return_code == 0xaa){
printf("Error: Command timeout occurred\n");
return(WAN_FALSE);
}
if (wan_udp.wan_udphdr_return_code == 0xCC){
return(WAN_FALSE);
}
wan_udp.wan_udphdr_return_code = 0xaa;
}
if (x >= 4) return(WAN_FALSE);
is_508 = WAN_FALSE;
wp_strlcpy(codeversion, "?.??",10);
wan_udp.wan_udphdr_command = READ_CODE_VERSION;
wan_udp.wan_udphdr_data_len = 0;
wan_udp.wan_udphdr_return_code = 0xaa;
DO_COMMAND(wan_udp);
if (wan_udp.wan_udphdr_return_code == 0) {
wan_udp.wan_udphdr_data[wan_udp.wan_udphdr_data_len] = 0;
wp_strlcpy(codeversion, (char*)wan_udp.wan_udphdr_data,10);
}
return(WAN_TRUE);
};
#if 0
static void global_stats (void)
{
GLOBAL_STATS_STRUCT* global_stats;
wan_udp.wan_udphdr_command= READ_GLOBAL_STATISTICS;
wan_udp.wan_udphdr_return_code = 0xaa;
wan_udp.wan_udphdr_data_len = 0;
DO_COMMAND(wan_udp);
if (wan_udp.wan_udphdr_return_code == 0 ) {
BANNER("GLOBAL STATISTICS");
global_stats = (GLOBAL_STATS_STRUCT *)&wan_udp.wan_udphdr_data[0];
printf("Times application did not respond to IRQ: %u",
global_stats->app_IRQ_timeout_count);
} else {
error();
}
}; /* global stats */
#endif
static void modem( void )
{
#if 1
unsigned char cts_dcd;
wan_udp.wan_udphdr_command= AFT_MODEM_STATUS;
wan_udp.wan_udphdr_return_code = 0xaa;
wan_udp.wan_udphdr_data_len = 0;
DO_COMMAND(wan_udp);
if (wan_udp.wan_udphdr_return_code == 0 ) {
BANNER("MODEM STATUS");
memcpy(&cts_dcd, &wan_udp.wan_udphdr_data[0],1);
printf("DCD: ");
(cts_dcd & 0x08) ? printf("High\n") : printf("Low\n");
printf("CTS: ");
(cts_dcd & 0x20) ? printf("High\n") : printf("Low\n");
}
#endif
}; /* modem */
static int set_bri_loopback(int enable)
{
/*! API command structure used to execute API commands.
This command structure is used with libsangoma library */
wanpipe_api_t wp_api;
int err;
if (tdmv_chan != 1 && tdmv_chan != 2) {
printf("Error: Please specify the channel using -chan option. eg -chan 1 or -chan 2\n");
return -1;
}
if (enable) {
err=sangoma_enable_bri_bchan_loopback(sangoma_fd, &wp_api, tdmv_chan);
} else {
err=sangoma_disable_bri_bchan_loopback(sangoma_fd, &wp_api, tdmv_chan);
}
printf ("BRI Loopback Channel=%i %s: %s\n",tdmv_chan, enable?"Enabled":"Disabled",err?"Failed":"Ok");
return err;
}
int get_if_operational_stats(void)
{
/*! API command structure used to execute API commands.
This command structure is used with libsangoma library */
wanpipe_api_t wp_api;
wanpipe_chan_stats_t stats;
int err;
unsigned char firm_ver, cpld_ver;
err=sangoma_get_stats(sangoma_fd, &wp_api, &stats);
if (err) {
return 1;
}
printf( "******* OPERATIONAL_STATS *******\n");
printf("\trx_packets\t: %u\n", stats.rx_packets);
printf("\ttx_packets\t: %u\n", stats.tx_packets);
printf("\trx_bytes\t: %u\n", stats.rx_bytes);
printf("\ttx_bytes\t: %u\n", stats.tx_bytes);
printf("\trx_errors\t: %u\n", stats.rx_errors);
printf("\ttx_errors\t: %u\n", stats.tx_errors);
printf("\trx_dropped\t: %u\n", stats.rx_dropped);
printf("\ttx_dropped\t: %u\n", stats.tx_dropped);
printf("\tmulticast\t: %u\n", stats.multicast);
printf("\tcollisions\t: %u\n", stats.collisions);
printf("\trx_length_errors: %u\n", stats.rx_length_errors);
printf("\trx_over_errors\t: %u\n", stats.rx_over_errors);
printf("\trx_crc_errors\t: %u\n", stats.rx_crc_errors);
printf("\trx_frame_errors\t: %u\n", stats.rx_frame_errors);
printf("\trx_fifo_errors\t: %u\n", stats.rx_fifo_errors);
printf("\trx_missed_errors: %u\n", stats.rx_missed_errors);
/* Transmitter aborted frame transmission. Not an error. */
printf("\trx_hdlc_abort_counter: %u\n", stats.rx_hdlc_abort_counter);
printf("\ttx_aborted_errors: %u\n", stats.tx_aborted_errors);
printf("\tTx Idle Data\t: %u\n", stats.tx_carrier_errors);
printf("\ttx_fifo_errors\t: %u\n", stats.tx_fifo_errors);
printf("\ttx_heartbeat_errors: %u\n", stats.tx_heartbeat_errors);
printf("\ttx_window_errors: %u\n", stats.tx_window_errors);
printf("\n\ttx_packets_in_q: %u\n", stats.current_number_of_frames_in_tx_queue);
printf("\ttx_queue_size: %u\n", stats.max_tx_queue_length);
printf("\n\trx_packets_in_q: %u\n", stats.current_number_of_frames_in_rx_queue);
printf("\trx_queue_size: %u\n", stats.max_rx_queue_length);
printf("\n\trx_events_in_q: %u\n", stats.current_number_of_events_in_event_queue);
printf("\trx_event_queue_size: %u\n", stats.max_event_queue_length);
printf("\trx_events: %u\n", stats.rx_events);
printf("\trx_events_dropped: %u\n", stats.rx_events_dropped);
printf("\tHWEC tone (DTMF) events counter: %u\n", stats.rx_events_tone);
printf( "*********************************\n");
err=sangoma_get_driver_version(sangoma_fd,&wp_api, NULL);
if (err) {
return 1;
}
printf("\tDriver Version: %u.%u.%u.%u\n",
wp_api.wp_cmd.version.major,
wp_api.wp_cmd.version.minor,
wp_api.wp_cmd.version.minor1,
wp_api.wp_cmd.version.minor2);
err=sangoma_get_firmware_version(sangoma_fd, &wp_api, &firm_ver);
if (err) {
return 1;
}
printf("\tFirmware Version: %X\n",
firm_ver);
err=sangoma_get_cpld_version(sangoma_fd, &wp_api, &cpld_ver);
if (err) {
return 1;
}
printf("\tCPLD Version: %X\n",
cpld_ver);
return 0;
}
int flush_if_operational_stats(void)
{
/*! API command structure used to execute API commands.
This command structure is used with libsangoma library */
wanpipe_api_t wp_api;
return sangoma_flush_stats(sangoma_fd, &wp_api);
}
static void comm_err_stats (void)
{
#ifdef WIN_STATS
/* use libsangoma api to get statistics */
get_if_operational_stats();
#else
aft_comm_err_stats_t* comm_err_stats;
wan_udp.wan_udphdr_command= READ_COMMS_ERROR_STATS;
wan_udp.wan_udphdr_return_code = 0xaa;
wan_udp.wan_udphdr_data_len = 0;
DO_COMMAND(wan_udp);
if (wan_udp.wan_udphdr_return_code == 0 ) {
BANNER("AFT COMMUNICATION ERROR STATISTICS");
comm_err_stats = (aft_comm_err_stats_t *)&wan_udp.wan_udphdr_data[0];
printf("RX Stats:\n");
printf(" Number of receiver overrun errors: %u\n",
comm_err_stats->Rx_overrun_err_count);
printf(" Number of receiver CRC errors: %u\n",
comm_err_stats->Rx_crc_err_count);
printf(" Number of receiver Abort errors: %u\n",
comm_err_stats->Rx_abort_count);
printf(" Number of receiver corruption errors: %u\n",
comm_err_stats->Rx_hdlc_corrupiton);
printf(" Number of receiver PCI errors: %u\n",
comm_err_stats->Rx_pci_errors);
printf(" Number of receiver DMA descriptor errors: %u\n",
comm_err_stats->Rx_dma_descr_err);
printf("TX Stats:\n");
printf(" Number of transmitter PCI errors: %u\n",
comm_err_stats->Tx_pci_errors);
printf(" Number of transmitter PCI latency warnings: %u\n",
comm_err_stats->Tx_pci_latency);
printf(" Number of transmitter DMA descriptor errors: %u\n",
comm_err_stats->Tx_dma_errors);
printf(" Number of transmitter DMA descriptor length errors: %u\n",
comm_err_stats->Tx_dma_len_nonzero);
#if 0
printf(" Number of times DCD changed state: %u\n",
comm_err_stats->DCD_state_change_count);
printf(" Number of times CTS changed state: %u\n",
comm_err_stats->CTS_state_change_count);
#endif
}
#endif
}; /* comm_err_stats */
static void flush_comm_err_stats( void )
{
#ifdef WIN_STATS
/* use libsangoma api to get statistics */
flush_if_operational_stats();
#else
wan_udp.wan_udphdr_command=FLUSH_COMMS_ERROR_STATS;
wan_udp.wan_udphdr_return_code = 0xaa;
wan_udp.wan_udphdr_data_len = 0;
DO_COMMAND(wan_udp);
#endif
}; /* flush_comm_err_stats */
static void read_code_version (void)
{
wan_udp.wan_udphdr_command= READ_CODE_VERSION;
wan_udp.wan_udphdr_return_code = 0xaa;
wan_udp.wan_udphdr_data_len = 0;
DO_COMMAND(wan_udp);
if (wan_udp.wan_udphdr_return_code == 0) {
BANNER("AFT CODE VERSION");
printf("Code version: HDLC rev.%X\n",
wan_udp.wan_udphdr_data[0]);
}else{
printf("Error: Rc=%x\n",wan_udp.wan_udphdr_return_code);
}
}; /* read code version */
static void link_status (void)
{
wan_udp.wan_udphdr_command= AFT_LINK_STATUS;
wan_udp.wan_udphdr_return_code = 0xaa;
wan_udp.wan_udphdr_data_len = 0;
DO_COMMAND(wan_udp);
BANNER("AFT LINK STATUS");
if (wan_udp.wan_udphdr_return_code == 0){
printf("Device Link Status: %s\n",
STATE_DECODE(wan_udp.wan_udphdr_data[0]));
}
return;
}; /* Link Status */
static void operational_stats (void)
{
#ifdef WIN_STATS
comm_err_stats ();
#else
wanpipe_chan_stats_t *stats;
wan_udp.wan_udphdr_command= READ_OPERATIONAL_STATS;
wan_udp.wan_udphdr_return_code = 0xaa;
wan_udp.wan_udphdr_data_len = 0;
DO_COMMAND(wan_udp);
if (wan_udp.wan_udphdr_data_len != sizeof(wanpipe_chan_stats_t)) {
printf("Error: op stats data_len=%i != stats %i\n",
wan_udp.wan_udphdr_data_len,sizeof(wanpipe_chan_stats_t));
}
if (wan_udp.wan_udphdr_return_code == 0) {
BANNER("AFT OPERATIONAL STATISTICS");
stats = (wanpipe_chan_stats_t *)&wan_udp.wan_udphdr_data[0];
printf( "******* OPERATIONAL_STATS *******\n");
printf("\trx_packets\t: %u\n", stats->rx_packets);
printf("\ttx_packets\t: %u\n", stats->tx_packets);
printf("\trx_bytes\t: %u\n", stats->rx_bytes);
printf("\ttx_bytes\t: %u\n", stats->tx_bytes);
printf("\trx_errors\t: %u\n", stats->rx_errors);
printf("\ttx_errors\t: %u\n", stats->tx_errors);
printf("\trx_dropped\t: %u\n", stats->rx_dropped);
printf("\ttx_dropped\t: %u\n", stats->tx_dropped);
printf("\tmulticast\t: %u\n", stats->multicast);
printf("\tcollisions\t: %u\n", stats->collisions);
printf("\trx_length_errors: %u\n", stats->rx_length_errors);
printf("\trx_over_errors\t: %u\n", stats->rx_over_errors);
printf("\trx_crc_errors\t: %u\n", stats->rx_crc_errors);
printf("\trx_frame_errors\t: %u\n", stats->rx_frame_errors);
printf("\trx_fifo_errors\t: %u\n", stats->rx_fifo_errors);
printf("\trx_missed_errors: %u\n", stats->rx_missed_errors);
/* Transmitter aborted frame transmission. Not an error. */
printf("\trx_hdlc_abort_counter: %u\n", stats->rx_hdlc_abort_counter);
printf("\ttx_aborted_errors: %u\n", stats->tx_aborted_errors);
printf("\tTx Idle Data\t: %u\n", stats->tx_carrier_errors);
printf("\ttx_fifo_errors\t: %u\n", stats->tx_fifo_errors);
printf("\ttx_heartbeat_errors: %u\n", stats->tx_heartbeat_errors);
printf("\ttx_window_errors: %u\n", stats->tx_window_errors);
printf("\n\ttx_packets_in_q: %u\n", stats->current_number_of_frames_in_tx_queue);
printf("\ttx_queue_size: %u\n", stats->max_tx_queue_length);
printf("\n\trx_packets_in_q: %u\n", stats->current_number_of_frames_in_rx_queue);
printf("\trx_queue_size: %u\n", stats->max_rx_queue_length);
printf("\n\trx_events_in_q: %u\n", stats->current_number_of_events_in_event_queue);
printf("\trx_event_queue_size: %u\n", stats->max_event_queue_length);
printf("\trx_events: %u\n", stats->rx_events);
printf("\trx_events_dropped: %u\n", stats->rx_events_dropped);
printf("\tHWEC tone (DTMF) events counter: %u\n", stats->rx_events_tone);
printf( "*********************************\n");
}
#endif /* !__WINDOWS__ */
}; /* Operational_stats */
static void flush_operational_stats( void )
{
wan_udp.wan_udphdr_command= FLUSH_OPERATIONAL_STATS;
wan_udp.wan_udphdr_return_code = 0xaa;
wan_udp.wan_udphdr_data_len = 0;
DO_COMMAND(wan_udp);
}; /* flush_operational_stats */
static void wp_span_debugging( unsigned char toggle )
{
wan_udp.wan_udphdr_command= WANPIPEMON_CHAN_SEQ_DEBUGGING;
wan_udp.wan_udphdr_return_code = 0xaa;
wan_udp.wan_udphdr_data_len = 1;
wan_udp.wan_udphdr_data[0] = toggle;
DO_COMMAND(wan_udp);
}; /* flush_operational_stats */
static void wp_gen_fifo_debugging( unsigned char toggle )
{
if (toggle) {
wan_udp.wan_udphdr_command= WANPIPEMON_GEN_FIFO_ERR_RX;
} else {
wan_udp.wan_udphdr_command= WANPIPEMON_GEN_FIFO_ERR_TX;
}
wan_udp.wan_udphdr_return_code = 0xaa;
wan_udp.wan_udphdr_data_len = 1;
wan_udp.wan_udphdr_data[0] = 0;
DO_COMMAND(wan_udp);
}; /* flush_operational_stats */
static void wp_get_fifo_sync_cnt(void)
{
wan_udp.wan_udphdr_command= WANPIPEMON_GEN_FE_SYNC_ERR;
wan_udp.wan_udphdr_return_code = 0xaa;
wan_udp.wan_udphdr_data_len = 1;
wan_udp.wan_udphdr_data[0] = 0;
DO_COMMAND(wan_udp);
}; /* flush_operational_stats */
static void wp_port_led_blink(void)
{
led_blink=1;
while (1) {
if (cmd_timeout >= 0) {
if (cmd_timeout) {
cmd_timeout--;
} else {
break;
}
}
wan_udp.wan_udphdr_command= WANPIPEMON_LED_CTRL;
wan_udp.wan_udphdr_return_code = 0xaa;
wan_udp.wan_udphdr_data_len = 1;
wan_udp.wan_udphdr_data[0] = 1;
DO_COMMAND(wan_udp);
wp_usleep(500000);
wan_udp.wan_udphdr_command= WANPIPEMON_LED_CTRL;
wan_udp.wan_udphdr_return_code = 0xaa;
wan_udp.wan_udphdr_data_len = 1;
wan_udp.wan_udphdr_data[0] = 0;
DO_COMMAND(wan_udp);
wp_usleep(500000);
}
wan_udp.wan_udphdr_command= WANPIPEMON_LED_CTRL;
wan_udp.wan_udphdr_return_code = 0xaa;
wan_udp.wan_udphdr_data_len = 1;
wan_udp.wan_udphdr_data[0] = 0;
DO_COMMAND(wan_udp);
}
void wp_port_led_blink_off(void)
{
wan_udp.wan_udphdr_command= WANPIPEMON_LED_CTRL;
wan_udp.wan_udphdr_return_code = 0xaa;
wan_udp.wan_udphdr_data_len = 1;
wan_udp.wan_udphdr_data[0] = 0;
DO_COMMAND(wan_udp);
}
int AFTDisableTrace(void)
{
wan_udp.wan_udphdr_command= DISABLE_TRACING;
wan_udp.wan_udphdr_return_code = 0xaa;
wan_udp.wan_udphdr_data_len = 0;
DO_COMMAND(wan_udp);
return 0;
}
static int print_local_time (char *date_string, int max_len)
{
char tmp_time[50];
time_t time_val;
struct tm *time_tm;
date_string[0]='\0';
time_val=time(NULL);
/* Parse time and date */
time_tm=localtime(&time_val);
strftime(tmp_time,sizeof(tmp_time),"%b",time_tm);
snprintf(date_string, max_len, " %s ",tmp_time);
strftime(tmp_time,sizeof(tmp_time),"%d",time_tm);
snprintf(date_string+strlen(date_string), max_len-strlen(date_string), "%s ",tmp_time);
strftime(tmp_time,sizeof(tmp_time),"%H",time_tm);
snprintf(date_string+strlen(date_string), max_len-strlen(date_string), "%s:",tmp_time);
strftime(tmp_time,sizeof(tmp_time),"%M",time_tm);
snprintf(date_string+strlen(date_string), max_len-strlen(date_string), "%s:",tmp_time);
strftime(tmp_time,sizeof(tmp_time),"%S",time_tm);
snprintf(date_string+strlen(date_string), max_len-strlen(date_string), "%s",tmp_time);
return 0;
}
static int loop_rx_data(int passnum)
{
unsigned int num_frames;
unsigned short curr_pos = 0;
wan_trace_pkt_t *trace_pkt;
unsigned int i;
struct wan_timeval to;
int timeout=0;
char date_string[100];
wp_gettimeofday(&to, NULL);
to.tv_sec = 0;
to.tv_usec = 0;
print_local_time(date_string,100);
printf("%s | Test %04i | ",
date_string, passnum);
for(;;) {
#ifdef __WINDOWS__
if(to.tv_usec){
wp_usleep(to.tv_usec);
}
#else
select(1,NULL, NULL, NULL, &to);
#endif
wan_udp.wan_udphdr_command = GET_TRACE_INFO;
wan_udp.wan_udphdr_return_code = 0xaa;
wan_udp.wan_udphdr_data_len = 0;
DO_COMMAND(wan_udp);
if (wan_udp.wan_udphdr_return_code == 0 && wan_udp.wan_udphdr_data_len) {
num_frames = wan_udp.wan_udphdr_aft_num_frames;
for ( i = 0; i < num_frames; i++) {
trace_pkt= (wan_trace_pkt_t *)&wan_udp.wan_udphdr_data[curr_pos];
/* frame type */
if (trace_pkt->status & 0x01) {
trace_iface.status |= WP_TRACE_OUTGOING;
}else{
if (trace_pkt->status & 0x10) {
trace_iface.status |= WP_TRACE_ABORT;
} else if (trace_pkt->status & 0x20) {
trace_iface.status |= WP_TRACE_CRC;
} else if (trace_pkt->status & 0x40) {
trace_iface.status |= WP_TRACE_OVERRUN;
}
}
trace_iface.len = trace_pkt->real_length;
trace_iface.timestamp=trace_pkt->time_stamp;
trace_iface.sec = trace_pkt->sec;
trace_iface.usec = trace_pkt->usec;
curr_pos += sizeof(wan_trace_pkt_t);
if (trace_pkt->real_length >= WAN_MAX_DATA_SIZE){
printf("\t:the frame data is to big (%u)!",
trace_pkt->real_length);
fflush(stdout);
continue;
}else if (trace_pkt->data_avail == 0) {
printf("\t: the frame data is not available" );
fflush(stdout);
continue;
}
/* update curr_pos again */
curr_pos += trace_pkt->real_length;
trace_iface.trace_all_data=trace_all_data;
trace_iface.data=(unsigned char*)&trace_pkt->data[0];
if (trace_pkt->status & 0x01){
continue;
}
if (trace_iface.data[0] == (0xFF-0) &&
trace_iface.data[1] == (0xFF-1) &&
trace_iface.data[2] == (0xFF-2) &&
trace_iface.data[3] == (0xFF-3)) {
printf("Successful (%s)!\n",
trace_iface.status & WP_TRACE_ABORT ? "Abort" :
trace_iface.status & WP_TRACE_CRC ? "Crc" :
trace_iface.status & WP_TRACE_OVERRUN ? "Overrun" : "Ok"
);
return 0;
}
} //for
} //if
curr_pos = 0;
if (!wan_udp.wan_udphdr_chdlc_ismoredata){
to.tv_sec = 0;
to.tv_usec = WAN_TRACE_DELAY;
timeout++;
if (timeout > 100) {
printf("Timeout!\n");
break;
}
}else{
to.tv_sec = 0;
to.tv_usec = 0;
}
}
return 0;
}
static int aft_digital_loop_test( void )
{
int passnum=0;
/* Disable trace to ensure that the buffers are flushed */
wan_udp.wan_udphdr_command= DISABLE_TRACING;
wan_udp.wan_udphdr_return_code = 0xaa;
wan_udp.wan_udphdr_data_len = 0;
DO_COMMAND(wan_udp);
wan_udp.wan_udphdr_command= ENABLE_TRACING;
wan_udp.wan_udphdr_return_code = 0xaa;
wan_udp.wan_udphdr_data_len = 1;
wan_udp.wan_udphdr_data[0]=0;
DO_COMMAND(wan_udp);
if (wan_udp.wan_udphdr_return_code != 0 &&
wan_udp.wan_udphdr_return_code != 1) {
printf("Error: Failed to start loop test: failed to start tracing!\n");
return -1;
}
printf("Starting Loop Test (press ctrl-c to exit)!\n\n");
while (1) {
memset(&wan_udp, 0x00, sizeof(wan_udp));
wan_udp.wan_udphdr_command= DIGITAL_LOOPTEST;
wan_udp.wan_udphdr_return_code = 0xaa;
wan_udp.wan_udphdr_data[0] = 0xFF-0;
wan_udp.wan_udphdr_data[1] = 0xFF-1;
wan_udp.wan_udphdr_data[2] = 0xFF-2;
wan_udp.wan_udphdr_data[3] = 0xFF-3;
wan_udp.wan_udphdr_data_len = 100;
DO_COMMAND(wan_udp);
switch (wan_udp.wan_udphdr_return_code) {
case 0:
break;
case 1:
printf("Error: Failed to start loop test: dev not found\n");
goto loop_rx_exit;
case 2:
printf("Error: Failed to start loop test: dev state not connected\n");
goto loop_rx_exit;
case 3:
printf("Error: Failed to start loop test: memory error\n");
goto loop_rx_exit;
case 4:
printf("Error: Failed to start loop test: invalid operation mode\n");
goto loop_rx_exit;
default:
#if defined(__WINDOWS__)
printf("Error: Failed to start loop test: %s (%i)\n",
SDLA_DECODE_SANG_STATUS(wan_udp.wan_udphdr_return_code),
wan_udp.wan_udphdr_return_code);
#else
printf("Error: Failed to start loop test: unknown error (%i)\n",
wan_udp.wan_udphdr_return_code);
#endif
goto loop_rx_exit;
}
loop_rx_data(++passnum);
wp_usleep(500000);
fflush(stdout);
if (passnum >= 10) {
break;
}
}
loop_rx_exit:
wan_udp.wan_udphdr_command= DISABLE_TRACING;
wan_udp.wan_udphdr_return_code = 0xaa;
wan_udp.wan_udphdr_data_len = 0;
DO_COMMAND(wan_udp);
return 0;
}
extern int mtp2_msu_only;
extern int trace_only_diff;
extern int trace_rx_only;
extern int trace_tx_only;
extern wanpipe_hdlc_engine_t *rx_hdlc_eng;
wp_trace_output_iface_t hdlc_trace_iface;
static int trace_aft_hdlc_data(wanpipe_hdlc_engine_t *hdlc_eng, void *data, int len)
{
char *frame = (char*)data;
hdlc_trace_iface.data=data;
hdlc_trace_iface.len=len;
hdlc_trace_iface.status = trace_iface.status;
hdlc_trace_iface.timestamp = trace_iface.timestamp;
hdlc_trace_iface.sec = trace_iface.sec;
hdlc_trace_iface.usec = trace_iface.usec;
if (mtp2_msu_only) {
if (frame[2] < 3) {
return 1;
}
}
if (pcap_output){
hdlc_trace_iface.type=WP_OUT_TRACE_PCAP;
} else {
hdlc_trace_iface.type=WP_OUT_TRACE_RAW;
}
hdlc_trace_iface.link_type=wan_protocol;
wp_trace_output(&hdlc_trace_iface);
fflush(stdout);
return 0;
}
#ifdef __WINDOWS__
int wanpipe_hdlc_decode (wanpipe_hdlc_engine_t *hdlc_eng,
unsigned char *buf, int len)
{
WIN_DBG_FUNC_NOT_IMPLEMENTED();
return 1;
}
#endif
static int previous_trace_len=0;
static int previous_trace_data[5000];
extern int no_exit;
static void line_trace(int trace_mode)
{
unsigned int num_frames;
unsigned short curr_pos = 0;
wan_trace_pkt_t *trace_pkt;
unsigned int i;
int recv_buff = sizeof(wan_udp_hdr_t)+ 100;
struct wan_timeval to;
#ifndef __WINDOWS__
fd_set ready;
setsockopt( sock, SOL_SOCKET, SO_RCVBUF, &recv_buff, sizeof(int) );
#endif
/* Disable trace to ensure that the buffers are flushed */
wan_udp.wan_udphdr_command= DISABLE_TRACING;
wan_udp.wan_udphdr_return_code = 0xaa;
wan_udp.wan_udphdr_data_len = 0;
DO_COMMAND(wan_udp);
wan_udp.wan_udphdr_command= ENABLE_TRACING;
wan_udp.wan_udphdr_return_code = 0xaa;
wan_udp.wan_udphdr_data_len = 1;
wan_udp.wan_udphdr_data[0]=trace_mode;
DO_COMMAND(wan_udp);
if (wan_udp.wan_udphdr_return_code == 0) {
if (no_exit) {
printf("Starting trace...(Press CTRL + C to exit)\n");
} else {
printf("Starting trace...(Press ENTER to exit)\n");
}
fflush(stdout);
} else if(wan_udp.wan_udphdr_return_code == 0xCD ) {
printf("Cannot Enable Line Tracing from Underneath.\n");
fflush(stdout);
return;
}else if (wan_udp.wan_udphdr_return_code == 0x01 ) {
printf("Starting trace...(although it's already enabled!)\n");
if (no_exit) {
printf("Press CTRL + C to exit\n");
} else {
printf("Press ENTER to exit\n");
}
fflush(stdout);
}else{
printf("Failed to Enable Line Tracing. Return code: 0x%02X\n",
wan_udp.wan_udphdr_return_code );
fflush(stdout);
return;
}
to.tv_sec = 0;
to.tv_usec = 0;
for(;;) {
#ifdef __WINDOWS__
if (!no_exit) {
if(to.tv_usec){
wp_usleep(to.tv_usec);
}
if(_kbhit()){
if(_getch() == 0x0D){
/* Enter key was pressed */
break;
}else{
printf("Invalid key... (Press ENTER to exit)\n");
fflush(stdout);
}
}
}
#else
if (!no_exit) {
FD_ZERO(&ready);
FD_SET(0,&ready);
if(select(1,&ready, NULL, NULL, &to)) {
break;
} /* if */
}
#endif
wan_udp.wan_udphdr_command = GET_TRACE_INFO;
wan_udp.wan_udphdr_return_code = 0xaa;
wan_udp.wan_udphdr_data_len = 0;
DO_COMMAND(wan_udp);
if (wan_udp.wan_udphdr_return_code == 0 && wan_udp.wan_udphdr_data_len) {
num_frames = wan_udp.wan_udphdr_aft_num_frames;
for ( i = 0; i < num_frames; i++) {
trace_pkt= (wan_trace_pkt_t *)&wan_udp.wan_udphdr_data[curr_pos];
/* frame type */
trace_iface.status=0;
if (trace_pkt->status & 0x01) {
trace_iface.status |= WP_TRACE_OUTGOING;
}else{
if (trace_pkt->status & 0x10) {
trace_iface.status |= WP_TRACE_ABORT;
} else if (trace_pkt->status & 0x20) {
trace_iface.status |= WP_TRACE_CRC;
} else if (trace_pkt->status & 0x40) {
trace_iface.status |= WP_TRACE_OVERRUN;
}
}
#if 0
if (trace_pkt->real_length != 4800){
printf("Trace Len = %i Num frames =%i Current=%i status=0x%X\n",trace_pkt->real_length,num_frames,i, trace_pkt->status);
continue;
}
#endif
trace_iface.len = trace_pkt->real_length;
trace_iface.timestamp=trace_pkt->time_stamp;
trace_iface.sec = trace_pkt->sec;
trace_iface.usec = trace_pkt->usec;
hdlc_trace_iface.status = trace_iface.status;
hdlc_trace_iface.timestamp = trace_iface.timestamp;
hdlc_trace_iface.sec = trace_iface.sec;
hdlc_trace_iface.usec = trace_iface.usec;
curr_pos += sizeof(wan_trace_pkt_t);
if (tdmv_chan) {
if (trace_pkt->channel != tdmv_chan) {
continue;
}
}
if (trace_pkt->real_length >= WAN_MAX_DATA_SIZE){
printf("\t:the frame data is to big (%u)!",
trace_pkt->real_length);
fflush(stdout);
continue;
}else if (trace_pkt->data_avail == 0) {
printf("\t: the frame data is not available" );
fflush(stdout);
continue;
}
/* update curr_pos again */
curr_pos += trace_pkt->real_length;
trace_iface.trace_all_data=trace_all_data;
trace_iface.data=(unsigned char*)&trace_pkt->data[0];
hdlc_trace_iface.trace_all_data = trace_iface.trace_all_data;
hdlc_trace_iface.data = trace_iface.data;
hdlc_trace_iface.len = trace_iface.len;
if (trace_rx_only && (trace_iface.status & WP_TRACE_OUTGOING)) {
continue;
}
if (trace_tx_only && !(trace_iface.status & WP_TRACE_OUTGOING)) {
continue;
}
/*
if (raw_data) {
trace_iface.type=WP_OUT_TRACE_RAW;
}else
*/
if (trace_iface.type == WP_OUT_TRACE_HDLC && rx_hdlc_eng) {
rx_hdlc_eng->hdlc_data = trace_aft_hdlc_data;
wanpipe_hdlc_decode(rx_hdlc_eng,trace_iface.data,trace_iface.len);
continue;
}
if (mtp2_msu_only) {
if (trace_iface.data[2] < 3) {
continue;
}
}
if (trace_only_diff) {
if (trace_iface.len == previous_trace_len) {
int err=memcmp(trace_iface.data,previous_trace_data,trace_iface.len);
if (err == 0) {
continue;
}
}
previous_trace_len=trace_iface.len;
memcpy(previous_trace_data,trace_iface.data,trace_iface.len);
}
if (pcap_output){
trace_iface.type=WP_OUT_TRACE_PCAP;
}
if (trace_binary){
trace_iface.type=WP_OUT_TRACE_BIN;
}
/*
else{
trace_iface.type=WP_OUT_TRACE_INTERP;
}
*/
trace_iface.link_type=wan_protocol;
wp_trace_output(&trace_iface);
fflush(stdout);
} //for
} //if
curr_pos = 0;
if (!wan_udp.wan_udphdr_chdlc_ismoredata){
to.tv_sec = 0;
to.tv_usec = WAN_TRACE_DELAY;
}else{
to.tv_sec = 0;
to.tv_usec = 0;
}
}
wan_udp.wan_udphdr_command= DISABLE_TRACING;
wan_udp.wan_udphdr_return_code = 0xaa;
wan_udp.wan_udphdr_data_len = 0;
DO_COMMAND(wan_udp);
}; /* line_trace */
static int aft_read_hwec_status()
{
u_int32_t hwec_status;
int channel, found = 0;
/* Disable trace to ensure that the buffers are flushed */
wan_udp.wan_udphdr_command = AFT_HWEC_STATUS;
wan_udp.wan_udphdr_return_code = 0xaa;
wan_udp.wan_udphdr_data_len = 0;
DO_COMMAND(wan_udp);
if (wan_udp.wan_udphdr_return_code) {
printf("Failed to get HW Echo Canceller status!\n");
fflush(stdout);
return 0;
}
hwec_status = *(u_int32_t*)&wan_udp.wan_udphdr_data[0];
for(channel = 0; channel < 32; channel++){
if (hwec_status & (1 << channel)){
printf(
"Sangoma HW Echo Canceller is enabled for channel %d\n",
channel);
found = 1;
}
}
if (!found){
printf(
"Sangoma HW Echo Canceller is disabled for all channels!\n");
}
fflush(stdout);
return 0;
}
static int aft_fe_reg_bit(int is_setbit, int reg, int bit)
{
sdla_fe_debug_t fe_debug;
unsigned char value = 0;
fe_debug.type = WAN_FE_DEBUG_REG;
fe_debug.fe_debug_reg.reg = reg;
fe_debug.fe_debug_reg.read = 1;
set_fe_debug_mode(&fe_debug);
value = fe_debug.fe_debug_reg.value;
if (is_setbit){
fe_debug.fe_debug_reg.value |= (1<<bit);
}else{
fe_debug.fe_debug_reg.value &= ~(1<<bit);
}
fe_debug.fe_debug_reg.read = 0;
set_fe_debug_mode(&fe_debug);
printf("\t%s bit %d in Register %04X (%02X:%02X)\n",
(is_setbit) ? "Set" : "Clear",
bit, fe_debug.fe_debug_reg.reg,
value, (unsigned char)fe_debug.fe_debug_reg.value);
return 0;
}
static int aft_remora_tones(int mod_no)
{
int cnt = 0;
char ch;
wan_remora_udp_t *rm_udp;
/* Disable trace to ensure that the buffers are flushed */
wan_udp.wan_udphdr_command = WAN_FE_TONES;
wan_udp.wan_udphdr_return_code = 0xaa;
wan_udp.wan_udphdr_data_len = 2;
rm_udp = (wan_remora_udp_t *)get_wan_udphdr_data_ptr(0);
rm_udp->mod_no = mod_no;
rm_udp->type = 1;
DO_COMMAND(wan_udp);
if (wan_udp.wan_udphdr_return_code) {
printf("Failed to start tone on Module %d!\n", mod_no);
fflush(stdout);
return 0;
}
printf("Press enter to stop the tone ...");fflush(stdout);ch=getchar();
tone_stop_again:
/* Disable A200/A400 Ring event */
wan_udp.wan_udphdr_command = WAN_FE_TONES;
wan_udp.wan_udphdr_return_code = 0xaa;
wan_udp.wan_udphdr_data_len = 2;
rm_udp = (wan_remora_udp_t *)get_wan_udphdr_data_ptr(0);
rm_udp->mod_no = mod_no;
rm_udp->type = 0;
DO_COMMAND(wan_udp);
if (wan_udp.wan_udphdr_return_code) {
if (cnt++ > 10){
wp_sleep(1);
goto tone_stop_again;
}
printf("Failed to stop tone on Module %d (timeout)!\n",
mod_no);
fflush(stdout);
return 0;
}
return 0;
}
static int aft_remora_ring(int mod_no)
{
int cnt=0;
char ch;
wan_remora_udp_t *rm_udp;
/* Enable A200/A400 Ring event */
wan_udp.wan_udphdr_command = WAN_FE_RING;
wan_udp.wan_udphdr_return_code = 0xaa;
wan_udp.wan_udphdr_data_len = 2;
rm_udp = (wan_remora_udp_t *)get_wan_udphdr_data_ptr(0);
rm_udp->mod_no = mod_no;
rm_udp->type = 1;
DO_COMMAND(wan_udp);
if (wan_udp.wan_udphdr_return_code) {
printf("Failed to start ring for Module %d!\n", mod_no);
fflush(stdout);
return 0;
}
fflush(stdout);
printf("Press enter to stop the ring ...");fflush(stdout);ch=getchar();
ring_stop_again:
/* Disable A200/A400 Ring event */
wan_udp.wan_udphdr_command = WAN_FE_RING;
wan_udp.wan_udphdr_return_code = 0xaa;
wan_udp.wan_udphdr_data_len = 2;
rm_udp = (wan_remora_udp_t *)get_wan_udphdr_data_ptr(0);
rm_udp->mod_no = mod_no;
rm_udp->type = 0;
DO_COMMAND(wan_udp);
if (wan_udp.wan_udphdr_return_code) {
if (cnt++ > 10){
wp_sleep(1);
goto ring_stop_again;
}
printf("Failed to stop ring for Module %d (timeout)!\n", mod_no);
fflush(stdout);
return 0;
}
fflush(stdout);
return 0;
}
static int aft_gsm_pcm_loopback_toggle(void)
{
wan_udp.wan_udphdr_command = WAN_GSM_PCM_LOOPBACK;
wan_udp.wan_udphdr_return_code = 0xaa;
wan_udp.wan_udphdr_data_len = 0;
DO_COMMAND(wan_udp);
if (wan_udp.wan_udphdr_return_code != WAN_CMD_OK) {
printf("Failed to toggle PCM loopback!\n");
fflush(stdout);
return 0;
}
printf("Done toggling PCM loopback!\n");
fflush(stdout);
return 0;
}
static int aft_gsm_update_sim_status(void)
{
wan_udp.wan_udphdr_command = WAN_GSM_UPDATE_SIM_STATUS;
wan_udp.wan_udphdr_return_code = 0xaa;
wan_udp.wan_udphdr_data_len = 0;
DO_COMMAND(wan_udp);
if (wan_udp.wan_udphdr_return_code != WAN_CMD_OK) {
printf("Failed to update GSM SIM status!\n");
fflush(stdout);
return 0;
}
printf("Done updating GSM status!\n");
fflush(stdout);
return 0;
}
static int aft_gsm_regdump(void)
{
wan_udp.wan_udphdr_command = WAN_GSM_REGDUMP;
wan_udp.wan_udphdr_return_code = 0xaa;
wan_udp.wan_udphdr_data_len = 0;
DO_COMMAND(wan_udp);
if (wan_udp.wan_udphdr_return_code != WAN_CMD_OK) {
printf("Failed to get GSM register dump!\n");
fflush(stdout);
return 0;
}
printf("Done dumping GSM registers!\n");
fflush(stdout);
return 0;
}
static int aft_gsm_uart_debug(int enable)
{
wan_gsm_udp_t *gsm_udp = NULL;
wan_udp.wan_udphdr_command = WAN_GSM_UART_DEBUG;
wan_udp.wan_udphdr_return_code = 0xaa;
gsm_udp = (wan_gsm_udp_t *)get_wan_udphdr_data_ptr(0);
gsm_udp->u.uart_debug = enable ? WAN_TRUE : WAN_FALSE;
wan_udp.wan_udphdr_data_len = sizeof(wan_gsm_udp_t);
DO_COMMAND(wan_udp);
if (wan_udp.wan_udphdr_return_code != WAN_CMD_OK) {
printf("Failed to %s UART debugging!\n", enable ? "enable" : "disable");
fflush(stdout);
return 0;
}
printf("GSM UART debugging is now %s!\n", enable ? "enabled" : "disabled");
fflush(stdout);
return 0;
}
static int aft_gsm_audio_debug(void)
{
wan_udp.wan_udphdr_command = WAN_GSM_AUDIO_DEBUG;
wan_udp.wan_udphdr_return_code = 0xaa;
wan_udp.wan_udphdr_data_len = 0;
DO_COMMAND(wan_udp);
if (wan_udp.wan_udphdr_return_code != WAN_CMD_OK) {
printf("Failed to toggle audio debugging!\n");
fflush(stdout);
return 0;
}
printf("GSM audio debugging was toggled!\n");
fflush(stdout);
return 0;
}
static int aft_gsm_pll_reset(void)
{
wan_udp.wan_udphdr_command = WAN_GSM_PLL_RESET;
wan_udp.wan_udphdr_return_code = 0xaa;
wan_udp.wan_udphdr_data_len = 0;
DO_COMMAND(wan_udp);
if (wan_udp.wan_udphdr_return_code != WAN_CMD_OK) {
printf("Failed to reset PLL!\n");
fflush(stdout);
return 0;
}
printf("GSM PLL reset done!\n");
fflush(stdout);
return 0;
}
static int aft_gsm_power_toggle(void)
{
wan_udp.wan_udphdr_command = WAN_GSM_POWER_TOGGLE;
wan_udp.wan_udphdr_return_code = 0xaa;
wan_udp.wan_udphdr_data_len = 0;
DO_COMMAND(wan_udp);
if (wan_udp.wan_udphdr_return_code != WAN_CMD_OK) {
printf("Failed to toggle power!\n");
fflush(stdout);
return 0;
}
printf("GSM power toggle done!\n");
fflush(stdout);
return 0;
}
static int aft_remora_regdump(int mod_no)
{
wan_remora_udp_t *rm_udp;
int reg;
rm_udp = (wan_remora_udp_t *)get_wan_udphdr_data_ptr(0);
rm_udp->mod_no = mod_no;
wan_udp.wan_udphdr_command = WAN_FE_REGDUMP;
wan_udp.wan_udphdr_return_code = 0xaa;
wan_udp.wan_udphdr_data_len = sizeof(wan_remora_udp_t);
DO_COMMAND(wan_udp);
if (wan_udp.wan_udphdr_return_code || !wan_udp.wan_udphdr_data_len) {
printf("Failed to get register dump!\n");
fflush(stdout);
return 0;
}
rm_udp = (wan_remora_udp_t *)get_wan_udphdr_data_ptr(0);
printf("\t------- Direct registers (%s,port %d) -------\n",
WP_REMORA_DECODE_TYPE(rm_udp->type),
rm_udp->mod_no);
if (rm_udp->type == MOD_TYPE_FXS){
for(reg = 0; reg < WAN_FXS_NUM_REGS; reg++){
if (reg % 8 == 0) printf("\n\t");
printf("%3d. %02X ", reg, rm_udp->u.regs_fxs.direct[reg]);
}
printf("\n\t-----------------------------\n");
printf("\n");
printf("\t------- Indirect registers (port %d) -------\n",
rm_udp->mod_no);
for (reg=0; reg < WAN_FXS_NUM_INDIRECT_REGS; reg++){
if (reg % 6 == 0) printf("\n\t");
printf("%3d. %04X ", reg, rm_udp->u.regs_fxs.indirect[reg]);
}
printf("\n\t-----------------------------\n");
printf("\n");
printf("TIP\t: -%d Volts\n", (rm_udp->u.regs_fxs.direct[80]*376)/1000);
printf("RING\t: -%d Volts\n", (rm_udp->u.regs_fxs.direct[81]*376)/1000);
printf("VBAT\t: -%d Volts\n", (rm_udp->u.regs_fxs.direct[82]*376)/1000);
} else if (rm_udp->type == MOD_TYPE_FXO){
for(reg = 0; reg < WAN_FXO_NUM_REGS; reg++){
if (reg % 8 == 0) printf("\n\t");
printf("%3d. %02X ", reg, rm_udp->u.regs_fxo.direct[reg]);
}
printf("\n\t-----------------------------\n");
printf("\n");
}
fflush(stdout);
return 0;
}
static int aft_remora_stats(int mod_no)
{
wan_remora_udp_t *rm_udp;
rm_udp = (wan_remora_udp_t *)get_wan_udphdr_data_ptr(0);
rm_udp->mod_no = mod_no;
wan_udp.wan_udphdr_command = WAN_FE_STATS;
wan_udp.wan_udphdr_return_code = 0xaa;
wan_udp.wan_udphdr_data_len = sizeof(wan_remora_udp_t);
DO_COMMAND(wan_udp);
if (wan_udp.wan_udphdr_return_code || !wan_udp.wan_udphdr_data_len) {
printf("Failed to get voltage stats!\n");
fflush(stdout);
return 0;
}
rm_udp = (wan_remora_udp_t *)get_wan_udphdr_data_ptr(0);
if (rm_udp->type == MOD_TYPE_FXS){
printf("\t------- Voltage Status (%s,port %d) -------\n\n",
WP_REMORA_DECODE_TYPE(rm_udp->type),
rm_udp->mod_no);
printf("TIP\t: -%7.4f Volts\n", (float)(rm_udp->u.stats.tip_volt*376)/1000);
printf("RING\t: -%7.4f Volts\n", (float)(rm_udp->u.stats.ring_volt*376)/1000);
printf("VBAT\t: -%7.4f Volts\n", (float)(rm_udp->u.stats.bat_volt*376)/1000);
}else if (rm_udp->type == MOD_TYPE_FXO){
unsigned char volt = rm_udp->u.stats.volt;
printf("\t------- Voltage Status (%s,port %d) -------\n\n",
WP_REMORA_DECODE_TYPE(rm_udp->type),
rm_udp->mod_no);
if (volt & 0x80){
volt = ~volt + 1;
}
printf("VOLTAGE\t: %d Volts\n", volt);
printf("\n");
printf("\t------- Line Status (%s,port %d) -------\n\n",
WP_REMORA_DECODE_TYPE(rm_udp->type),
rm_udp->mod_no);
printf("Line\t: %s\n", FE_STATUS_DECODE(rm_udp->u.stats.status));
printf("\n");
}
fflush(stdout);
return 0;
}
static int aft_remora_hook(int mod_no, int offhook)
{
sdla_fe_debug_t fe_debug;
fe_debug.type = WAN_FE_DEBUG_HOOK;
fe_debug.mod_no = mod_no;
fe_debug.fe_debug_hook.offhook = offhook;
aft_remora_debug_mode(&fe_debug);
return 0;
}
//CORBA
int AFTUsage(void)
{
printf("wanpipemon: Wanpipe AFT Hardware Level Debugging Utility\n\n");
printf("Usage:\n");
printf("-----\n\n");
#if 1
printf("wanpipemon -i <interface name> -c <command>\n\n");
printf("\tOption -i: \n");
printf("\t\tWanpipe interface name (ex: wanpipe1_if1)\n");
#else
printf("wanpipemon -i <ip-address or interface name> -u <port> -c <command>\n\n");
printf("\tOption -i: \n");
printf("\t\tWanpipe remote IP address must be supplied\n");
printf("\t\t<or> Wanpipe network interface name (ex: wp1_chdlc)\n");
printf("\tOption -u: (Optional, default: 9000)\n");
printf("\t\tWanpipe UDPPORT specified in /etc/wanpipe#.conf\n");
#endif
printf("\tOption -full: (Optional, trace option)\n");
printf("\t\tDisplay raw packets in full: default trace pkt len=25bytes\n");
printf("\tOption -c: \n");
printf("\t\tCommand is split into two parts:\n");
printf("\t\t\tFirst letter is a command and the rest are options:\n");
printf("\t\t\tex: xm = View Modem Status\n\n");
printf("\tSupported Commands: x=status : s=statistics : t=trace \n");
printf("\t c=config : T=FT1 stats : f=flush\n\n");
printf("\tCommand: Options: Description \n");
printf("\t-------------------------------- \n\n");
printf("\tCard Status\n");
printf("\t x m Modem Status\n");
printf("\t x l Link Status\n");
printf("\t x cv Read Code Version\n");
printf("\t x ru Display Router UP time\n");
printf("\tCard Statistics\n");
printf("\t s c Communication Error Statistics\n");
printf("\t s o Operational Statistics\n");
printf("\tTrace Data \n");
#ifdef __WINDOWS__
printf("\t t r Trace data frames. Do not attempt interpret the\n");
printf("\t data.\n");
#else
printf("\t t i Trace and Interpret ALL frames\n");
printf("\t t r Trace ALL frames, in RAW format\n");
#endif
printf("\tT1/E1 Configuration/Statistics\n");
printf("\t T a Read T1/E1 alarms.\n");
printf("\n");
printf("\t ============================================\n");
printf("\t ========= T1/E1 Loop Back commands =========\n");
printf("\n");
printf("\t T allb Activate Line (Remote) Loopback.\n");
printf("\t (T1/E1; NORMAL Clock)\n");
printf("\t T dllb Deactivate Line (Remote) Loopback.\n");
printf("\t (T1/E1; NORMAL Clock)\n");
printf("\n");
printf("\t T adlb Activate Diagnostic (Local) Loopback.\n");
printf("\t (T1/E1; MASTER Clock)\n");
printf("\t T ddlb Deactivate Diagnostic (Local) Loopback.\n");
printf("\t (T1/E1; MASTER Clock)\n");
printf("\n");
printf("\t T lb Read LoopBack status (T1/E1). This is the LoopBack\n");
printf("\t status of the LOCAL device, not a status of LoopBack\n");
printf("\t COMMAND which was transmitted to REMOTE device.\n");
printf("\t The status (return code) of any LoopBack COMMAND is\n");
printf("\t displayed on command completion.\n");
printf("\n");
printf("\t ============================================\n");
printf("\t ======= T1 FDL/BOC Loop Back commands ======\n");
printf("\n");
printf("\t T salb Send Activate Loopback (Remote) Code.\n");
printf("\t (T1; MASTER Clock)\n");
printf("\t T sdlb Send Deactivate Loopback (Remote) Code.\n");
printf("\t (T1; MASTER Clock)\n");
printf("\n");
printf("\t T saplb Send Activate Payload Loopback (Remote) Code.\n");
printf("\t (T1; MASTER Clock)\n");
printf("\t T sdplb Send Deactivate Payload Loopback (Remote) Code.\n");
printf("\t (T1; MASTER Clock)\n");
printf("\n");
printf("\t ============================================\n");
printf("\t =============== BERT Commands ==============\n");
printf("\n");
printf("\t T sw_bert <command> BERT test (AFT only)\n");
printf("\t command:\n");
printf("\t --random - start BERT, use random data\n");
printf("\t --ascendant - start BERT, use ascendant data\n");
printf("\t --descendant - start BERT, use descendant data\n");
printf("\t --stop - stop BERT\n");
printf("\t --status - print BERT status/statistics\n");
printf("\n");
printf("\t ***** DS3/E3 Test modes *****\n");
printf("\t T allb3 Activate Analog Loopback mode (DS3/E3 cards)\n");
printf("\t T dllb3 Deactivate Analog Loopback mode (DS3/E3 cards)\n");
printf("\t T arlb3 Activate Remote Loopback mode (DS3/E3 cards)\n");
printf("\t T drlb3 Deactivate Remote Loopback mode (DS3/E3 cards)\n");
printf("\t T adlb3 Activate Digital Loopback mode (DS3/E3 cards)\n");
printf("\t T ddlb3 Deactivate Digital Loopback mode (DS3/E3 cards)\n");
printf("\t ***** End of DS3/E3 Test modes *****\n");
printf("\n");
printf("\t T txe Enable TX (AFT card only)\n");
printf("\t T txd Disable TX (AFT card only)\n");
printf("\t T tx_ais_on Enable AIS Alarm - Maintenance On (AFT card only)\n");
printf("\t T tx_ais_off Disable AIS Alarm - Maintenance Off (AFT card only)\n");
printf("\n");
printf("\t T bri_loop_on Enable BRI Remote Loopback (BRI card only, -chan option to specify bchan 1 or 2\n");
printf("\t T bri_loop_off Disable BRI Remote Loopback (BRI card only, -chan option to specify bchan 1 or 2\n");
printf("\n");
printf("\tFlush Statistics\n");
printf("\t f c Flush Communication Error Statistics\n");
printf("\t f o Flush Operational Statistics\n");
printf("\t f pm Flush T1/E1 performance monitoring counters\n");
printf("\t f perf Flush driver performance statistics\n");
printf("\n");
printf("\tEcho Canceller Statistics\n");
printf("\t e hw Read HW Echo Canceller Status\n");
printf("\tAFT Remora Statistics\n");
printf("\t a tone Play a tones ( -m <mod_no> - Module number)\n");
printf("\t a ring Rings phone ( -m <mod_no> - Module number)\n");
printf("\t a regdump Dumps FXS/FXO registers.\n");
printf("\t ( -m <mod_no> - Module number)\n");
printf("\t a stats Voltage status ( -m <mod_no> - Module number)\n");
printf("\tAFT GSM\n");
printf("\t g regdump Dumps GSM registers to the kernel ring buffer\n");
printf("\t g ude GSM UART debug enable (any UART transmission is logged to the kernel ring buffer)\n");
printf("\t g udd GSM UART debug disable\n");
printf("\t g pr PLL reset (force UART reset)\n");
printf("\t g pt Power toggle (force turn on/off GSM module)\n");
printf("\t g adt Toggle (enable/disable) audio debugging (play demo-congrats at the kernel level ignoring audio from user space)\n");
printf("\t g uss Update GSM SIM status\n");
printf("\t g plt Toggle the PCM audio loopback\n");
printf("\tAFT BRI\n");
printf("\t b aloop Enable BRI b-channel loop\n");
printf("\t b dloop Disable BRI b-channel loop\n");
printf("\tAFT Debugging\n");
printf("\t d err Enable RX RBS debugging\n");
printf("\t d drr Disable RX RBS debugging\n");
printf("\t d ert Enable TX RBS debugging\n");
printf("\t d drt Disable TX RBS debugging\n");
printf("\t d rr Read RX/TX RBS status\n");
printf("\t d pr Print current RX/TX RBS status\n");
printf("\t d sr Set TX RBS status\n");
printf("\n");
printf("\t d e_span_seq Enable span seq debugging\n");
printf("\t d d_span_seq Disable span seq debugging\n");
printf("\t d rx_fifo_gen Generate rx fifo error\n");
printf("\t d tx_fifo_gen Generate tx fifo error\n");
printf("\t d fifo_sync_cnt Increment fifo sync cnt\n");
printf("\t d led_blink Enable led blinking - identify port\n");
printf("\t d perf_on Enable driver performance statistics\n");
printf("\t d perf Read driver performance statistics (must be enabled)\n");
printf("\t d perf_off Disable driver performance statistics\n");
#ifdef _LIBSANGOMA_H
printf("\tWanpipe Logger Control (used by Sangoma Technical Support)\n");
printf("\t logger <control code> <logger type> <logger level>\n");
printf("\t control code:\n");
printf("\t -e - Enable Logger output\n");
printf("\t -d - Disable Logger output\n");
printf("\t logger type:\n");
printf("\t <-te1 | -hwec | -default | -tdmapi | -bri>\n");
printf("\t logger level:\n");
printf("\t Each Logger type has it's own Level:\n");
printf("\t -te1 <-default>\n");
printf("\t -hwec <-default>\n");
printf("\t -default <-error | -warning | -info>\n");
printf("\t -tdmapi <-default>\n");
printf("\t -bri <-L2toL1activation | -s0states>\n");
#endif /* _LIBSANGOMA_H */
printf("\n");
printf("\t--------\n\n");
printf("\tExamples:\n");
#ifdef _LIBSANGOMA_H
printf("\t View T1/E1 Alarams:\n");
printf("\t\t wanpipemon -i wanpipe1_if1 -c Ta\n");
printf("\t View Communications/Error statistics:\n");
printf("\t\t wanpipemon -i wanpipe1_if1 -c sc\n");
printf("\t Flush (Reset) Communications/Error statistics:\n");
printf("\t\t wanpipemon -i wanpipe1_if1 -c fc\n");
printf("\t Trace frames (Tx and Rx):\n");
printf("\t\t wanpipemon -i wanpipe1_if1 -c tr\n");
printf("\t Enable BRI Logger - Layer 1 (De)Activation:\n");
printf("\t\t wanpipemon -i wanpipe_logger -c logger -e -bri -L2toL1activation\n\n");
#else
printf("\tex: wanpipemon -i w1g1 -u 9000 -c xm :View Modem Status \n");
printf("\tex: wanpipemon -i 201.1.1.2 -u 9000 -c ti :Trace and Interpret ALL frames\n\n");
#endif
return 0;
}
static void aft_router_up_time( void )
{
u_int32_t time;
wan_udp.wan_udphdr_command= ROUTER_UP_TIME;
wan_udp.wan_udphdr_return_code = 0xaa;
wan_udp.wan_udphdr_data_len = 0;
wan_udp.wan_udphdr_data[0] = 0;
DO_COMMAND(wan_udp);
time = *(u_int32_t*)&wan_udp.wan_udphdr_data[0];
BANNER("ROUTER UP TIME");
print_router_up_time(time);
}
static void aft_perf_stats_enable(void)
{
wan_udp.wan_udphdr_command= WANPIPEMON_PERFORMANCE_STATS;
wan_udp.wan_udphdr_return_code = 0xaa;
wan_udp.wan_udphdr_data_len = 1;
wan_udp.wan_udphdr_data[0] = 1;
DO_COMMAND(wan_udp);
}
static void aft_perf_stats_disable(void)
{
wan_udp.wan_udphdr_command= WANPIPEMON_PERFORMANCE_STATS;
wan_udp.wan_udphdr_return_code = 0xaa;
wan_udp.wan_udphdr_data_len = 1;
wan_udp.wan_udphdr_data[0] = 0;
DO_COMMAND(wan_udp);
}
static void aft_perf_stats( void )
{
aft_driver_performance_stats_t *aft_perf = NULL;
wan_udp.wan_udphdr_command= WANPIPEMON_READ_PERFORMANCE_STATS;
wan_udp.wan_udphdr_return_code = 0xaa;
wan_udp.wan_udphdr_data_len = 0;
wan_udp.wan_udphdr_data[0] = 0;
DO_COMMAND(wan_udp);
if (wan_udp.wan_udphdr_return_code != WAN_CMD_OK) {
fprintf(stderr, "Unable to retrieve AFT performance stats!\n");
return;
}
aft_perf = (aft_driver_performance_stats_t *)&wan_udp.wan_udphdr_data[0];
if (!aft_perf) {
fprintf(stderr, "invalid AFT performance stats retrieved (len = %d)!\n", wan_udp.wan_udphdr_data_len);
return;
}
BANNER("WANPIPE PERFORMANCE STATS");
printf(" Latency in ms\n");
printf("===========================================\n");
//printf("ISR Latency=%02lu Max=%02lu Min=%02lu Avg=%02lu AbvAvg=%04lu BelAvg=%04lu Limit=%02lu\n",
printf("ISR Latency=%05lu Max=%05lu Min=%05lu Avg=%05lu AbvAvg=%04lu BelAvg=%04lu Limit=%02lu\n",
aft_perf->aft_isr_latency.latency,
aft_perf->aft_isr_latency.max_latency,
aft_perf->aft_isr_latency.min_latency,
aft_perf->aft_isr_latency.latency_avg,
aft_perf->aft_isr_latency.above_avg,
aft_perf->aft_isr_latency.below_avg,
aft_perf->aft_isr_latency.limit);
printf("P Task Latency=%05lu Max=%05lu Min=%05lu Avg=%05lu AbvAvg=%04lu BelAvg=%04lu Limit=%02lu\n",
aft_perf->port_task_latency.latency,
aft_perf->port_task_latency.max_latency,
aft_perf->port_task_latency.min_latency,
aft_perf->port_task_latency.latency_avg,
aft_perf->port_task_latency.above_avg,
aft_perf->port_task_latency.below_avg,
aft_perf->port_task_latency.limit);
printf("BH Latency=%05lu Max=%05lu Min=%05lu Avg=%05lu AbvAvg=%04lu BelAvg=%04lu Limit=%02lu\n",
aft_perf->bh_latency.latency,
aft_perf->bh_latency.max_latency,
aft_perf->bh_latency.min_latency,
aft_perf->bh_latency.latency_avg,
aft_perf->bh_latency.above_avg,
aft_perf->bh_latency.below_avg,
aft_perf->bh_latency.limit);
printf("Kernel Latency=%05lu Max=%05lu Min=%05lu Avg=%05lu AbvAvg=%04lu BelAvg=%04lu Limit=%02lu\n",
aft_perf->kernel_isr_latency.latency,
aft_perf->kernel_isr_latency.max_latency,
aft_perf->kernel_isr_latency.min_latency,
aft_perf->kernel_isr_latency.latency_avg,
aft_perf->kernel_isr_latency.above_avg,
aft_perf->kernel_isr_latency.below_avg,
aft_perf->kernel_isr_latency.limit);
printf("-------------------------------------------\n");
printf(" ISR\n");
printf("===========================================\n");
printf("-------------------------------------------\n");
printf("ALL ..............................%lu\n",aft_perf->isr.all);
printf("AFT ..............................%lu\n",aft_perf->isr.aft);
printf("Non AFT .........................%lu\n",aft_perf->isr.non_aft);
printf("-------------------------------------------\n");
printf("FE ...............................%lu\n",aft_perf->isr.fe);
printf("FE Run............................%lu\n",aft_perf->isr.fe_run);
printf("-------------------------------------------\n");
printf("TDM ..............................%lu\n",aft_perf->isr.tdm);
printf("TDM Run...........................%lu\n",aft_perf->isr.tdm_run);
printf("TDM Run Span......................%lu\n",aft_perf->isr.tdm_run_span);
printf("-------------------------------------------\n");
printf("DMA ..............................%lu\n",aft_perf->isr.dma);
printf("DMA Rx............................%lu\n",aft_perf->isr.dma_rx);
printf("DMA Tx ...........................%lu\n",aft_perf->isr.dma_tx);
printf("-------------------------------------------\n");
printf("FIFO..............................%lu\n",aft_perf->isr.fifo);
printf("FIFO RX...........................%lu\n",aft_perf->isr.fifo_rx);
printf("FIFO TX...........................%lu\n",aft_perf->isr.fifo_tx);
printf("-------------------------------------------\n");
printf("Free Run Timer....................%lu\n",aft_perf->isr.free_run);
printf("WDT ..............................%lu\n",aft_perf->isr.wdt);
printf("WDT Soft..........................%lu\n",aft_perf->isr.wdt_software);
printf("-------------------------------------------\n");
printf("Serial............................%lu\n",aft_perf->isr.serial);
printf(" BH\n");
printf("===========================================\n");
printf("All ..............................%lu\n",aft_perf->bh.all);
printf("Rx ...............................%lu\n",aft_perf->bh.rx);
printf("Rx Stack .........................%lu\n",aft_perf->bh.rx_stack);
printf("Rx Bri Dchan .....................%lu\n",aft_perf->bh.rx_bri_dchan);
printf("Tx Post ..........................%lu\n",aft_perf->bh.tx_post);
printf(" Port Task\n");
printf("===========================================\n");
printf("All ..............................%lu\n",aft_perf->port_task.all);
printf("FE ISR............................%lu\n",aft_perf->port_task.fe_isr);
printf("FE Poll ..........................%lu\n",aft_perf->port_task.fe_poll);
printf("EC ...............................%lu\n",aft_perf->port_task.ec);
printf("EC Poll ..........................%lu\n",aft_perf->port_task.ec_poll);
printf("LED ..............................%lu\n",aft_perf->port_task.led);
printf("RBS ..... ........................%lu\n",aft_perf->port_task.rbs);
printf("Serial Status ....................%lu\n",aft_perf->port_task.serial_status);
printf("TAP Queue ........................%lu\n",aft_perf->port_task.tap_q);
printf("Restart ..... ....................%lu\n",aft_perf->port_task.restart);
}
static void flush_aft_perf_stats( void )
{
wan_udp.wan_udphdr_command= WANPIPEMON_FLUSH_PERFORMANCE_STATS;
wan_udp.wan_udphdr_return_code = 0xaa;
wan_udp.wan_udphdr_data_len = 0;
wan_udp.wan_udphdr_data[0] = 0;
DO_COMMAND(wan_udp);
}
static void read_ft1_te1_56k_config (void)
{
unsigned char adapter_type = 0x00;
/* Read Adapter Type */
if (get_fe_type(&adapter_type)){
return;
}
#if 0
printf("Adapter type %i\n",adapter_type);
#endif
switch(adapter_type){
case WAN_MEDIA_NONE:
printf("CSU/DSU Read Configuration Failed");
break;
case WAN_MEDIA_T1:
case WAN_MEDIA_E1:
case WAN_MEDIA_DS3:
case WAN_MEDIA_56K:
read_te1_56k_config();
break;
default:
printf("Unknown Front End Adapter Type: 0x%X",adapter_type);
break;
}
return;
}
static u_int32_t parse_channel_arg(int argc, char* argv[])
{
u_int32_t chan_map = 0x00;
int argi = 0;
for(argi = 1; argi < argc; argi++){
char *parg = argv[argi], *param;
if (strcmp(parg, "--chan") == 0){
if (argi + 1 >= argc ){
printf("ERROR: Channel argument is missing!\n");
return ENABLE_ALL_CHANNELS;
}
param = argv[argi+1];
chan_map= 0x00;
if (wp_strcasecmp(param,"all") == 0){
return ENABLE_ALL_CHANNELS;
}else{
char chan[10];
int i, j = 0, len=strlen(param);
int start_ch = 0, stop_ch = 0, range = 0;
for(i = 0; i < len; i++){
if (param[i] == '-'){
range = 1;
start_ch = atoi(chan);
j = 0;
continue;
}
chan[j++] = param[i];
}
if (!range){
start_ch = atoi(chan);
}
stop_ch = atoi(chan);
chan_map = 0x00;
for(i = stop_ch; i >= start_ch; i--){
chan_map |= (0x01 << i);
}
}
return chan_map;
}
}
return ENABLE_ALL_CHANNELS;
}
int AFTMain(char *command,int argc, char* argv[])
{
char *opt=&command[1];
int mod_no = 0, i, err=0;
u_int32_t chan_map;
sdla_fe_debug_t fe_debug;
#if 0
printf("argc: %d\n", argc);
for (i = 0; i < argc; i++) {
printf("argv[%02d]:%s\n", i, argv[i]);
}
#endif
switch(command[0]){
case 'x':
if (!strcmp(opt,"m")){
modem();
}else if (!strcmp(opt,"l")){
link_status();
}else if (!strcmp(opt, "cv")){
read_code_version();
}else if (!strcmp(opt,"ru")){
aft_router_up_time();
}else if (!strcmp(opt,"perf")) {
aft_perf_stats();
}else if (!strcmp(opt,"perf_on")) {
aft_perf_stats_enable();
}else if (!strcmp(opt,"perf_off")) {
aft_perf_stats_disable();
}else{
printf("ERROR: Invalid Status Command 'x', Type wanpipemon <cr> for help\n\n");
}
break;
case 's':
if (!strcmp(opt,"c")){
comm_err_stats();
}else if (!strcmp(opt,"o")){
operational_stats();
}else if (!strcmp(opt,"if")) {
get_if_operational_stats();
}else{
printf("ERROR: Invalid Statistics Command 's', Type wanpipemon <cr> for help\n\n");
printf("command: %s\n", command);
}
break;
case 't':
memset(&trace_iface,0,sizeof(wp_trace_output_iface_t));
if (!strcmp(opt, "r")){
raw_data = WAN_TRUE;
trace_iface.type=WP_OUT_TRACE_RAW;
line_trace(0);
}else if (!strcmp(opt, "rh")){
raw_data = WAN_TRUE;
trace_iface.type=WP_OUT_TRACE_HDLC;
line_trace(0);
}else if (!strcmp(opt, "rd")){
raw_data = WAN_TRUE;
trace_iface.type=WP_OUT_TRACE_RAW;
line_trace(1);
}else if (!strcmp(opt, "i")){
raw_data = WAN_FALSE;
trace_iface.type=WP_OUT_TRACE_INTERP;
line_trace(0);
}else if (!strcmp(opt, "i4")){
raw_data = WAN_FALSE;
trace_iface.type=WP_OUT_TRACE_INTERP;
trace_iface.sub_type = WP_OUT_TRACE_INTERP_IPV4;
line_trace(0);
}else{
printf("ERROR: Invalid Trace Command 't', Type wanpipemon <cr> for help\n\n");
}
break;
case 'f':
if (!strcmp(opt, "o")){
flush_operational_stats();
printf("Operational statistics flushed\n");
/*operational_stats();*/
}else if (!strcmp(opt, "c")){
flush_comm_err_stats();
printf("Communication statistics flushed\n");
/* comm_err_stats();*/
}else if (!strcmp(opt, "if")){
flush_if_operational_stats();
}else if (!strcmp(opt, "pm")){
flush_te1_pmon();
printf("Performance monitoring counters flushed\n");
}else if (!strcmp(opt, "perf")) {
flush_aft_perf_stats();
} else{
printf("ERROR: Invalid Flush Command 'f', Type wanpipemon <cr> for help\n\n");
}
break;
case 'T':
if (!strcmp(opt,"read")){
read_ft1_te1_56k_config();
/* T1/E1 begins */
}else if (!strcmp(opt,"lt")){
aft_digital_loop_test();
}else if (!strcmp(opt,"lb")){
get_lb_modes(0);
/* DavidR: 'apclb' and 'dpclb' commands don't work.
* Not removing to keep backward compatibility. */
}else if (!strcmp(opt,"apclb")){
chan_map = parse_channel_arg(argc, argv);
set_lb_modes(WAN_TE1_LINELB_MODE, WAN_TE1_LB_ENABLE);
set_lb_modes_per_chan(WAN_TE1_PCLB_MODE, WAN_TE1_LB_ENABLE, chan_map);
}else if (!strcmp(opt,"dpclb")){
chan_map = parse_channel_arg(argc, argv);
set_lb_modes_per_chan(WAN_TE1_PCLB_MODE, WAN_TE1_LB_DISABLE, chan_map);
/* DavidR: Warning: The LLB command should NOT be used Locally.
* These commands must be controlled from Remote side.
* Not removing to keep backward compatibility. */
}else if (!strcmp(opt,"allb")){
set_lb_modes(WAN_TE1_LINELB_MODE, WAN_TE1_LB_ENABLE);
}else if (!strcmp(opt,"dllb")){
set_lb_modes(WAN_TE1_LINELB_MODE, WAN_TE1_LB_DISABLE);
}else if (!strcmp(opt,"aplb")){
set_lb_modes(WAN_TE1_PAYLB_MODE, WAN_TE1_LB_ENABLE);
}else if (!strcmp(opt,"dplb")){
set_lb_modes(WAN_TE1_PAYLB_MODE, WAN_TE1_LB_DISABLE);
}else if (!strcmp(opt,"adlb")){
set_lb_modes(WAN_TE1_DDLB_MODE, WAN_TE1_LB_ENABLE);
}else if (!strcmp(opt,"ddlb")){
set_lb_modes(WAN_TE1_DDLB_MODE, WAN_TE1_LB_DISABLE);
}else if (!strcmp(opt,"salb")){
set_lb_modes(WAN_TE1_TX_LINELB_MODE, WAN_TE1_LB_ENABLE);
}else if (!strcmp(opt,"sdlb")){
set_lb_modes(WAN_TE1_TX_LINELB_MODE, WAN_TE1_LB_DISABLE);
}else if (!strcmp(opt,"saplb")){
set_lb_modes(WAN_TE1_TX_PAYLB_MODE, WAN_TE1_LB_ENABLE);
}else if (!strcmp(opt,"sdplb")){
set_lb_modes(WAN_TE1_TX_PAYLB_MODE, WAN_TE1_LB_DISABLE);
}else if (!strcmp(opt,"alalb")){
/* T1/E1 LIU LBs */
set_lb_modes(WAN_TE1_LIU_ALB_MODE, WAN_TE1_LB_ENABLE);
}else if (!strcmp(opt,"dlalb")){
set_lb_modes(WAN_TE1_LIU_ALB_MODE, WAN_TE1_LB_DISABLE);
}else if (!strcmp(opt,"alllb")){
set_lb_modes(WAN_TE1_LIU_LLB_MODE, WAN_TE1_LB_ENABLE);
}else if (!strcmp(opt,"dlllb")){
set_lb_modes(WAN_TE1_LIU_LLB_MODE, WAN_TE1_LB_DISABLE);
}else if (!strcmp(opt,"alrlb")){
set_lb_modes(WAN_TE1_LIU_RLB_MODE, WAN_TE1_LB_ENABLE);
}else if (!strcmp(opt,"dlrlb")){
set_lb_modes(WAN_TE1_LIU_RLB_MODE, WAN_TE1_LB_DISABLE);
}else if (!strcmp(opt,"aldlb")){
set_lb_modes(WAN_TE1_LIU_DLB_MODE, WAN_TE1_LB_ENABLE);
}else if (!strcmp(opt,"dldlb")){
set_lb_modes(WAN_TE1_LIU_DLB_MODE, WAN_TE1_LB_DISABLE);
/* T3 begins */
}else if (!strcmp(opt,"allb3")){
set_lb_modes(WAN_TE3_LIU_LB_ANALOG, WAN_TE3_LB_ENABLE);
}else if (!strcmp(opt,"dllb3")){
set_lb_modes(WAN_TE3_LIU_LB_ANALOG, WAN_TE3_LB_DISABLE);
}else if (!strcmp(opt,"arlb3")){
set_lb_modes(WAN_TE3_LIU_LB_REMOTE, WAN_TE3_LB_ENABLE);
}else if (!strcmp(opt,"drlb3")){
set_lb_modes(WAN_TE3_LIU_LB_REMOTE, WAN_TE3_LB_DISABLE);
}else if (!strcmp(opt,"adlb3")){
set_lb_modes(WAN_TE3_LIU_LB_DIGITAL, WAN_TE3_LB_ENABLE);
}else if (!strcmp(opt,"ddlb3")){
set_lb_modes(WAN_TE3_LIU_LB_DIGITAL, WAN_TE3_LB_DISABLE);
/* 56k begins */
}else if (!strcmp(opt,"a")){
read_te1_56k_stat(0);
}else if (!strcmp(opt,"af")){
read_te1_56k_stat(1);
}else if (!strcmp(opt,"bri_loop_on")){
set_bri_loopback(1);
}else if (!strcmp(opt,"bri_loop_off")){
set_bri_loopback(0);
}else if (!strcmp(opt,"txe")){
set_fe_tx_mode(WAN_FE_TXMODE_ENABLE);
}else if (!strcmp(opt,"txd")){
set_fe_tx_mode(WAN_FE_TXMODE_DISABLE);
}else if (!strcmp(opt,"tx_ais_on")){
set_fe_tx_alarm(WAN_FE_DEBUG_ALARM_AIS_ENABLE);
}else if (!strcmp(opt,"tx_ais_off")){
set_fe_tx_alarm(WAN_FE_DEBUG_ALARM_AIS_DISABLE);
}else if (!strcmp(opt,"bert")){
err = set_fe_bert(argc, argv);
}else if (!strcmp(opt,"sw_bert")){
err = set_sw_bert(argc, argv);
}else{
printf("ERROR: Invalid FT1 Command 'T', Type wanpipemon <cr> for help\n\n");
}
break;
case 'd':
if (!strcmp(opt,"err")){
set_debug_mode(WAN_FE_DEBUG_RBS, WAN_FE_DEBUG_RBS_RX_ENABLE);
}else if (!strcmp(opt,"ert")){
set_debug_mode(WAN_FE_DEBUG_RBS, WAN_FE_DEBUG_RBS_TX_ENABLE);
}else if (!strcmp(opt,"drr")){
set_debug_mode(WAN_FE_DEBUG_RBS, WAN_FE_DEBUG_RBS_RX_DISABLE);
}else if (!strcmp(opt,"drt")){
set_debug_mode(WAN_FE_DEBUG_RBS, WAN_FE_DEBUG_RBS_TX_DISABLE);
}else if (!strcmp(opt,"rr")){
set_debug_mode(WAN_FE_DEBUG_RBS, WAN_FE_DEBUG_RBS_READ);
}else if (!strcmp(opt,"pr")){
set_debug_mode(WAN_FE_DEBUG_RBS, WAN_FE_DEBUG_RBS_PRINT);
}else if (!strcmp(opt,"sr")){
int i=0;
if (argc < 6){
printf("ERROR: Invalid command argument!\n");
break;
}
fe_debug.fe_debug_rbs.abcd = 0x00;
fe_debug.fe_debug_rbs.channel= atoi(argv[5]);
if (fe_debug.fe_debug_rbs.channel < 1 || fe_debug.fe_debug_rbs.channel > 31){
printf("ERROR: T1/E1 channel number of out range (%d)!\n",
fe_debug.fe_debug_rbs.channel);
break;
}
if (argc > 6){
for(i = 0; i < strlen(argv[6]); i++){
switch(argv[6][i]){
case 'A': case 'a':
fe_debug.fe_debug_rbs.abcd |= WAN_RBS_SIG_A;
break;
case 'B': case 'b':
fe_debug.fe_debug_rbs.abcd |= WAN_RBS_SIG_B;
break;
case 'C': case 'c':
fe_debug.fe_debug_rbs.abcd |= WAN_RBS_SIG_C;
break;
case 'D': case 'd':
fe_debug.fe_debug_rbs.abcd |= WAN_RBS_SIG_D;
break;
}
}
}
fe_debug.type = WAN_FE_DEBUG_RBS;
fe_debug.mode = WAN_FE_DEBUG_RBS_SET;
set_fe_debug_mode(&fe_debug);
}else if (!strcmp(opt,"eais")){
set_debug_mode(WAN_FE_DEBUG_ALARM, WAN_FE_DEBUG_ALARM_AIS_ENABLE);
}else if (!strcmp(opt,"dais")){
set_debug_mode(WAN_FE_DEBUG_ALARM, WAN_FE_DEBUG_ALARM_AIS_DISABLE);
}else if (!strcmp(opt,"cfg")){
fe_debug.type = WAN_FE_DEBUG_RECONFIG;
set_fe_debug_mode(&fe_debug);
}else if (!strcmp(opt,"reg")){
long value;
fe_debug.type = WAN_FE_DEBUG_REG;
if (argc < 6){
printf("ERROR: Invalid command argument!\n");
break;
}
value = strtol(argv[5],(char**)NULL, 16);
if (value == LONG_MIN || value == LONG_MAX){
printf("ERROR: Invalid argument 5: %s!\n",
argv[5]);
break;
}
fe_debug.fe_debug_reg.reg = value;
fe_debug.fe_debug_reg.read = 1;
if (argc > 6){
value = strtol(argv[6],(char**)NULL, 16);
if (value == LONG_MIN || value == LONG_MAX){
printf("ERROR: Invalid argument 6: %s!\n",
argv[6]);
break;
}
fe_debug.fe_debug_reg.read = 0;
fe_debug.fe_debug_reg.value = value;
}
set_fe_debug_mode(&fe_debug);
}else if (!strcmp(opt,"regsb") || !strcmp(opt,"regcb")){
long value, bit;
fe_debug.type = WAN_FE_DEBUG_REG;
if (argc < 7){
printf("ERROR: Invalid command argument!\n");
break;
}
value = strtol(argv[5],(char**)NULL, 16);
if (value == LONG_MIN || value == LONG_MAX){
printf("ERROR: Invalid argument 5: %s!\n",
argv[5]);
break;
}
bit = strtol(argv[6],(char**)NULL, 10);
if (bit == LONG_MIN || bit == LONG_MAX){
printf("ERROR: Invalid argument 6: %s!\n",
argv[6]);
break;
}
aft_fe_reg_bit((!strcmp(opt,"regsb")) ? 1 : 0, value, bit);
}else if (!strcmp(opt,"e_span_seq")){
wp_span_debugging(1);
}else if (!strcmp(opt,"d_span_seq")){
wp_span_debugging(0);
}else if (!strcmp(opt,"rx_fifo_gen")) {
wp_gen_fifo_debugging(1);
} else if (!strcmp(opt,"tx_fifo_gen")) {
wp_gen_fifo_debugging(0);
} else if (!strcmp(opt, "fifo_sync_cnt")) {
wp_get_fifo_sync_cnt();
} else if (!strcmp(opt, "led_blink")) {
wp_port_led_blink();
}else if (!strcmp(opt,"perf")) {
aft_perf_stats();
}else if (!strcmp(opt,"perf_on")) {
aft_perf_stats_enable();
}else if (!strcmp(opt,"perf_off")) {
aft_perf_stats_disable();
}else if (!strcmp(opt,"dma_restart")) {
wp_get_fifo_sync_cnt();
}else{
printf("ERROR: Invalid Status Command 'd', Type wanpipemon <cr> for help\n\n");
}
break;
case 'e':
if (strcmp(opt,"hw") == 0){
aft_read_hwec_status();
}else{
printf("ERROR: Invalid Status Command 'e', Type wanpipemon <cr> for help\n\n");
}
break;
case 'g':
if (!strcmp(opt,"regdump")){ /* Register dump */
aft_gsm_regdump();
} else if (!strcmp(opt, "ude")) { /* UART debug enable */
aft_gsm_uart_debug(1);
} else if (!strcmp(opt, "udd")) { /* UART debug disable */
aft_gsm_uart_debug(0);
} else if (!strcmp(opt, "adt")) { /* Audio Debug Toggle */
aft_gsm_audio_debug();
} else if (!strcmp(opt, "pr")) { /* PLL Reset */
aft_gsm_pll_reset();
} else if (!strcmp(opt, "pt")) { /* Power Toggle */
aft_gsm_power_toggle();
} else if (!strcmp(opt, "uss")) { /* Update SIM Status */
aft_gsm_update_sim_status();
} else if (!strcmp(opt, "plt")) { /* PCM Loopback Toggle */
aft_gsm_pcm_loopback_toggle();
} else {
printf("ERROR: Invalid GSM option '%s', Type wanpipemon <cr> for help\n\n", opt);
}
break;
case 'a':
err = 0;
for(i=0;i<argc;i++){
if (!wp_strcasecmp(argv[i], "-m") && argv[i+1]){
err = sscanf(argv[i+1], "%d", &mod_no);
if (err){
if (mod_no < 1 || mod_no > 24){ //24 is the maximum number of channels allowed due to backplane
printf("ERROR: Invalid Module number!\n\n");
fflush(stdout);
return 0;
}
mod_no--;
}else{
printf("ERROR: Invalid Module number!\n\n");
fflush(stdout);
return 0;
}
break;
}
}
if (strcmp(opt,"tone") == 0){
aft_remora_tones(mod_no);
}else if (strcmp(opt,"ring") == 0){
aft_remora_ring(mod_no);
}else if (strcmp(opt,"regdump") == 0){
aft_remora_regdump(mod_no);
}else if (!strcmp(opt,"reg")){
long value;
fe_debug.type = WAN_FE_DEBUG_REG;
if (argc < 6){
printf("ERROR: Invalid command argument!\n");
break;
}
value = strtol(argv[5],(char**)NULL, 10);
if (value == LONG_MIN || value == LONG_MAX){
printf("ERROR: Invalid argument 5: %s!\n",
argv[5]);
break;
}
fe_debug.fe_debug_reg.reg = value;
fe_debug.fe_debug_reg.read = 1;
if (strcmp(argv[6], "-m") && argc > 6){
value = strtol(argv[6],(char**)NULL, 16);
if (value == LONG_MIN || value == LONG_MAX){
printf("ERROR: Invalid argument 6: %s!\n",
argv[6]);
break;
}
fe_debug.fe_debug_reg.read = 0;
fe_debug.fe_debug_reg.value = value;
}
fe_debug.mod_no = mod_no;
aft_remora_debug_mode(&fe_debug);
}else if (strcmp(opt,"stats") == 0){
aft_remora_stats(mod_no);
}else if (strcmp(opt,"offhook") == 0){
aft_remora_hook(mod_no, 1);
}else if (strcmp(opt,"onhook") == 0){
aft_remora_hook(mod_no, 0);
}else{
printf("ERROR: Invalid Status Command 'a', Type wanpipemon <cr> for help\n\n");
}
break;
#ifdef _LIBSANGOMA_H
case 'l':
/* check that ALL parameters were given */
if (argc != 8) {
printf("ERROR: Invalid number of parameters for Logger, Type wanpipemon <cr> for help\n\n");
break;
}
{
wp_logger_cmd_t logger_cmd;
int control_code = -1, logger_type = -1, logger_level = -1;
char *level_str = NULL;
memset(&logger_cmd, 0x00, sizeof(logger_cmd));
for (i = 0; i < argc; i++) {
if (!wp_strcasecmp(argv[i], "-e")){
control_code = 1;
} else if (!wp_strcasecmp(argv[i], "-d")){
control_code = 0;
} else if (!wp_strcasecmp(argv[i], "-te1")){
logger_type = WAN_LOGGER_TE1;
level_str = argv[i+1];
if (!wp_strcasecmp(level_str, "-default")){
logger_level = SANG_LOGGER_TE1_DEFAULT;
}
} else if (!wp_strcasecmp(argv[i], "-hwec")){
logger_type = WAN_LOGGER_HWEC;
level_str = argv[i+1];
if (!wp_strcasecmp(level_str, "-default")){
logger_level = SANG_LOGGER_HWEC_DEFAULT;
}
} else if (!wp_strcasecmp(argv[i], "-default")){
/* Prevent parser from confusing "default logger" with
* "default level" .*/
if (-1 == logger_type) {
logger_type = WAN_LOGGER_DEFAULT;
level_str = argv[i+1];
if (!wp_strcasecmp(level_str, "-error")){
logger_level = SANG_LOGGER_ERROR;
}
if (!wp_strcasecmp(level_str, "-warning")){
logger_level = SANG_LOGGER_WARNING;
}
if (!wp_strcasecmp(level_str, "-info")){
logger_level = SANG_LOGGER_INFORMATION;
}
}
} else if (!wp_strcasecmp(argv[i], "-tdmapi")){
logger_type = WAN_LOGGER_TDMAPI;
level_str = argv[i+1];
if (!wp_strcasecmp(level_str, "-default")){
logger_level = SANG_LOGGER_TDMAPI_DEFAULT;
}
} else if (!wp_strcasecmp(argv[i], "-bri")){
logger_type = WAN_LOGGER_BRI;
level_str = argv[i+1];
if (!wp_strcasecmp(level_str, "-L2toL1activation")){
logger_level = SANG_LOGGER_BRI_L2_TO_L1_ACTIVATION;
}
if (!wp_strcasecmp(level_str, "-s0states")){
logger_level = SANG_LOGGER_BRI_HFC_S0_STATES;
}
}
} /* for() */
if (control_code == -1) {
printf("ERROR: Invalid <control code> for Logger, Type wanpipemon <cr> for help\n\n");
break;
}
if (logger_type == -1) {
printf("ERROR: Invalid <logger type>, Type wanpipemon <cr> for help\n\n");
break;
}
if (logger_level == -1) {
printf("ERROR: Invalid <logger level>, Type wanpipemon <cr> for help\n\n");
break;
}
/****************************************/
/* set logger type */
logger_cmd.logger_level_ctrl.logger_type = logger_type;
/* get CURRENT logger level */
if(sangoma_logger_get_logger_level(sangoma_fd, &logger_cmd)){
printf("ERROR: sangoma_logger_get_logger_level() failed!\n");
break;
}
/* change only what user requested */
if (control_code == 1) {
/* turn on */
logger_cmd.logger_level_ctrl.logger_level |= (logger_level);
} else {
/* turn off */
logger_cmd.logger_level_ctrl.logger_level &= (~logger_level);
}
if(sangoma_logger_set_logger_level(sangoma_fd, &logger_cmd)){
printf("ERROR: sangoma_logger_set_logger_level() failed!\n");
break;
}
}
break;
#endif /* _LIBSANGOMA_H */
default:
printf("ERROR: Invalid Command, Type wanpipemon <cr> for help\n\n");
break;
}/* switch */
printf("\n");
fflush(stdout);
return err;
}; /* AFTMain() */