505 lines
13 KiB
C
505 lines
13 KiB
C
#ifdef WANPIPEMON_GUI
|
|
#include "../lxdialog/dialog.h"
|
|
#endif
|
|
|
|
#include <wanpipe_hdlc.h>
|
|
|
|
#ifdef WANPIPEMON_ZAP
|
|
extern int MakeZapConnection(void);
|
|
extern int zap_chan;
|
|
#endif
|
|
|
|
extern int output_start_xml_router (void);
|
|
extern int output_stop_xml_router (void);
|
|
extern int output_start_xml_header (char *hdr);
|
|
extern int output_stop_xml_header (void);
|
|
|
|
extern void output_xml_val_data (char *value_name, int value);
|
|
extern void output_xml_val_asc (char *value_name, char * value);
|
|
extern void output_error(char *value);
|
|
|
|
extern void flush_te1_pmon(void);
|
|
extern void read_te1_56k_stat(int);
|
|
extern void banner(char *, int);
|
|
extern int DoCommand(wan_udp_hdr_t*);
|
|
|
|
extern int MakeConnection(void);
|
|
|
|
extern char *global_command;
|
|
extern int global_argc;
|
|
extern char** global_argv;
|
|
extern int global_card_type;
|
|
|
|
extern int connected_to_hw_level;
|
|
|
|
extern void CHDLC_set_FT1_mode(void);
|
|
extern void ATM_set_FT1_mode(void);
|
|
extern void FR_set_FT1_mode(void);
|
|
extern void PPP_set_FT1_mode(void);
|
|
extern void CHDLC_read_FT1_status(void);
|
|
extern void FR_read_FT1_status(void);
|
|
extern void PPP_read_FT1_status(void);
|
|
extern void ATM_read_FT1_status(void);
|
|
|
|
extern int sock;
|
|
extern char i_name[];
|
|
extern FT1_LED_STATUS FT1_LED;
|
|
extern int raw_data;
|
|
extern int fail;
|
|
extern int xml_output;
|
|
extern int trace_all_data;
|
|
extern short dlci_number;
|
|
extern int start_xml_router;
|
|
extern int stop_xml_router;
|
|
extern int is_508;
|
|
extern wan_udp_hdr_t wan_udp;
|
|
extern unsigned char par_port_A_byte, par_port_B_byte;
|
|
extern int lcn_number;
|
|
extern void ResetWanUdp(wan_udp_hdr_t *wan);
|
|
extern int protocol_cb_size;
|
|
extern char if_name[];
|
|
extern int ip_addr;
|
|
extern char ipaddress[];
|
|
extern int udp_port;
|
|
extern int wan_protocol;
|
|
extern int annexg_trace;
|
|
|
|
extern char *csudsu_menu[];
|
|
|
|
extern int pcap_output;
|
|
extern int pcap_prot;
|
|
extern int pcap_isdn_network;
|
|
extern FILE *pcap_output_file;
|
|
extern char pcap_output_file_name[];
|
|
|
|
|
|
#define MAX_CMD_ARG 10
|
|
#define MAX_CMD_LENGTH 15
|
|
#define DEFAULT_TRACE_LEN 39
|
|
#define DO_COMMAND(packet) DoCommand((wan_udp_hdr_t*)&packet)
|
|
|
|
#define UDP_CHDLC_SIGNATURE "CTPIPEAB"
|
|
#define UDP_PPP_SIGNATURE "PTPIPEAB"
|
|
#define UDP_FR_SIGNATURE "FPIPE8ND"
|
|
#define UDP_X25_SIGNATURE "XLINK8ND"
|
|
|
|
/* Trace delay value in micro seconds */
|
|
#define WAN_TRACE_DELAY 20000
|
|
|
|
struct cmd_menu_lookup_t
|
|
{
|
|
char *cmd_menu_name;
|
|
char **cmd_menu_ptr;
|
|
};
|
|
|
|
extern char ** FRget_main_menu(int *len);
|
|
extern char ** FRget_cmd_menu(char *cmd_name,int *len);
|
|
extern char ** CHDLCget_main_menu(int *len);
|
|
extern char ** CHDLCget_cmd_menu(char *cmd_name,int *len);
|
|
extern char ** PPPget_main_menu(int *len);
|
|
extern char ** PPPget_cmd_menu(char *cmd_name,int *len);
|
|
#if defined(__LINUX__)
|
|
extern char ** X25get_main_menu(int *len);
|
|
extern char ** X25get_cmd_menu(char *cmd_name,int *len);
|
|
|
|
extern char ** SS7get_main_menu(int *len);
|
|
extern char ** SS7get_cmd_menu(char *cmd_name,int *len);
|
|
|
|
extern char ** BITSTRMget_main_menu(int *len);
|
|
extern char ** BITSTRMget_cmd_menu(char *cmd_name,int *len);
|
|
|
|
|
|
#endif
|
|
extern char ** ADSLget_main_menu(int *len);
|
|
extern char ** ATMget_main_menu(int *len);
|
|
extern char ** AFTget_main_menu(int *len);
|
|
extern char ** ZAPget_main_menu(int *len);
|
|
extern char ** ADSLget_cmd_menu(char *cmd_name,int *len);
|
|
extern char ** ATMget_cmd_menu(char *cmd_name,int *len);
|
|
extern char ** AFTget_cmd_menu(char *cmd_name,int *len);
|
|
extern char ** ZAPget_cmd_menu(char *cmd_name,int *len);
|
|
|
|
typedef int config_t(void);
|
|
typedef int usage_t(void);
|
|
typedef int main_t(char*,int,char**);
|
|
typedef int dis_trace_t(void);
|
|
typedef char ** main_menu_t(int *len);
|
|
typedef char ** cmd_menu_t(char *cmd_name,int *len);
|
|
typedef void ft1_cfg_t(void);
|
|
|
|
struct fun_protocol {
|
|
int protocol_id;
|
|
char prot_name[10];
|
|
config_t* config;
|
|
usage_t* usage;
|
|
main_t* main;
|
|
dis_trace_t* disable_trace;
|
|
main_menu_t* get_main_menu;
|
|
cmd_menu_t* get_cmd_menu;
|
|
ft1_cfg_t* read_FT1_status;
|
|
ft1_cfg_t* set_FT1_mode;
|
|
unsigned char mbox_offset;
|
|
};
|
|
|
|
extern int wan_main_gui(void);
|
|
extern config_t CHDLCConfig;
|
|
extern config_t FRConfig;
|
|
extern config_t PPPConfig;
|
|
extern config_t ADSLConfig;
|
|
extern config_t ATMConfig;
|
|
extern config_t AFTConfig;
|
|
|
|
#if defined(__LINUX__)
|
|
extern config_t X25Config;
|
|
extern config_t SS7Config;
|
|
extern config_t BITSTRMConfig;
|
|
#endif
|
|
|
|
extern usage_t ATMUsage;
|
|
extern usage_t AFTUsage;
|
|
extern usage_t ZAPUsage;
|
|
extern usage_t CHDLCUsage;
|
|
extern usage_t FRUsage;
|
|
extern usage_t PPPUsage;
|
|
extern usage_t ADSLUsage;
|
|
#if defined(__LINUX__)
|
|
extern usage_t X25Usage;
|
|
extern usage_t SS7Usage;
|
|
extern usage_t BITSTRMUsage;
|
|
#endif
|
|
|
|
extern main_t CHDLCMain;
|
|
extern main_t ATMMain;
|
|
extern main_t AFTMain;
|
|
extern main_t ZAPMain;
|
|
extern main_t FRMain;
|
|
extern main_t PPPMain;
|
|
extern main_t ADSLMain;
|
|
#if defined(__LINUX__)
|
|
extern main_t SS7Main;
|
|
extern main_t X25Main;
|
|
extern main_t BITSTRMMain;
|
|
#endif
|
|
|
|
extern dis_trace_t CHDLCDisableTrace;
|
|
extern dis_trace_t FRDisableTrace;
|
|
extern dis_trace_t PPPDisableTrace;
|
|
extern dis_trace_t ADSLDisableTrace;
|
|
extern dis_trace_t ATMDisableTrace;
|
|
extern dis_trace_t AFTDisableTrace;
|
|
#if defined(__LINUX__)
|
|
extern dis_trace_t SS7DisableTrace;
|
|
extern dis_trace_t X25DisableTrace;
|
|
#endif
|
|
|
|
extern struct fun_protocol function_lookup[];
|
|
|
|
#define DECODE_PROT(prot)((prot==WANCONFIG_FR)?"Frame Relay": \
|
|
(prot==WANCONFIG_MFR)?"Frame Relay": \
|
|
(prot==WANCONFIG_PPP)?"PPP Point-to-Point":\
|
|
(prot==WANCONFIG_CHDLC)?"Cisco HDLC": \
|
|
(prot==WANCONFIG_X25)?"X25": \
|
|
(prot==WANCONFIG_ADSL)?"ADSL: Eth,IP,PPP/ATM":\
|
|
(prot==WANCONFIG_ATM)?"ATM":\
|
|
(prot==WANCONFIG_AFT)?"AFT":\
|
|
(prot==WANCONFIG_AFT_TE1)?"AFT_TE1":\
|
|
(prot==WANCONFIG_AFT_TE3)?"AFT_TE3":\
|
|
(prot==WANCONFIG_AFT_ANALOG)?"AFT_ANALOG":\
|
|
(prot==WANCONFIG_ZAP)?"Zaptel":\
|
|
"Unknown")
|
|
|
|
#define EXEC_PROT_FUNC(func,prot,err,arg) {\
|
|
int i=0; \
|
|
err=WAN_FALSE; \
|
|
for(;;){ \
|
|
if (function_lookup[i].protocol_id == 0){\
|
|
printf("\nProtocol: %s support not compiled in!\n\n", \
|
|
DECODE_PROT(prot)); \
|
|
break;\
|
|
}\
|
|
\
|
|
if (function_lookup[i].protocol_id == prot){\
|
|
if (function_lookup[i].func){\
|
|
err=function_lookup[i].func arg;\
|
|
break; \
|
|
}\
|
|
printf("\nProtocol: %s support not compiled in!\n\n", \
|
|
DECODE_PROT(prot)); \
|
|
break;\
|
|
}\
|
|
i++;\
|
|
}\
|
|
}
|
|
|
|
#define EXEC_PROT_VOID_FUNC(func,prot,arg) {\
|
|
int i=0; \
|
|
for(;;){ \
|
|
if (function_lookup[i].protocol_id == 0){\
|
|
printf("\nProtocol: %s support not compiled in!\n\n", \
|
|
DECODE_PROT(prot)); \
|
|
break;\
|
|
}\
|
|
\
|
|
if (function_lookup[i].protocol_id == prot){\
|
|
if (function_lookup[i].func){\
|
|
function_lookup[i].func arg;\
|
|
break; \
|
|
}\
|
|
printf("\nProtocol: %s support not compiled in!\n\n", \
|
|
DECODE_PROT(prot)); \
|
|
break;\
|
|
}\
|
|
i++;\
|
|
}\
|
|
}
|
|
|
|
#define EXEC_NAME_FUNC(func,name,arg) {\
|
|
int i=0; \
|
|
for(;;){ \
|
|
if (function_lookup[i].protocol_id == 0){\
|
|
printf("\nProtocol: '%s' support not compiled in!\n\n", \
|
|
name); \
|
|
break;\
|
|
}\
|
|
\
|
|
if (strcmp(function_lookup[i].prot_name,name)==0){\
|
|
if (function_lookup[i].func){\
|
|
function_lookup[i].func arg;\
|
|
break;\
|
|
}\
|
|
printf("\nProtocol: '%s' support not compiled in!\n\n", \
|
|
name); \
|
|
break;\
|
|
}\
|
|
i++;\
|
|
}\
|
|
}
|
|
|
|
|
|
static inline unsigned char get_wan_udphdr_data_byte(unsigned char off)
|
|
{
|
|
int i=0;
|
|
for (;;){
|
|
if (function_lookup[i].protocol_id == 0){
|
|
printf("\nProtocol: '%s' support not compiled in!\n\n",
|
|
DECODE_PROT(wan_protocol));
|
|
break;
|
|
};
|
|
|
|
if (function_lookup[i].protocol_id == wan_protocol){
|
|
|
|
#if 0
|
|
printf("Ptr %p Off %i New Ptr %p Chdlc %p\n",
|
|
&wan_udp.wan_udphdr_data[0],
|
|
function_lookup[i].mbox_offset,
|
|
(((unsigned char*)&wan_udp.wan_udphdr_data[0])+
|
|
function_lookup[i].mbox_offset),
|
|
wan_udp.wan_udphdr_chdlc_data);
|
|
#endif
|
|
return (((unsigned char*)&wan_udp.wan_udphdr_data[0])+
|
|
function_lookup[i].mbox_offset)[off];
|
|
}
|
|
i++;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
static inline unsigned char *get_wan_udphdr_data_ptr(unsigned char off)
|
|
{
|
|
int i=0;
|
|
for (;;){
|
|
if (function_lookup[i].protocol_id == 0){
|
|
printf("\nProtocol: '%s' support not compiled in!\n\n",
|
|
DECODE_PROT(wan_protocol));
|
|
break;
|
|
};
|
|
|
|
if (function_lookup[i].protocol_id == wan_protocol){
|
|
|
|
return &(((unsigned char*)&wan_udp.wan_udphdr_data[0])+
|
|
function_lookup[i].mbox_offset)[off];
|
|
}
|
|
i++;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
static inline unsigned char set_wan_udphdr_data_byte(unsigned char off, unsigned char data)
|
|
{
|
|
int i=0;
|
|
for (;;){
|
|
if (function_lookup[i].protocol_id == 0){
|
|
printf("\nProtocol: '%s' support not compiled in!\n\n",
|
|
DECODE_PROT(wan_protocol));
|
|
break;
|
|
};
|
|
|
|
if (function_lookup[i].protocol_id == wan_protocol){
|
|
|
|
(((unsigned char*)&wan_udp.wan_udphdr_data[0])+
|
|
function_lookup[i].mbox_offset)[off] = data;
|
|
|
|
return 0;
|
|
}
|
|
i++;
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
#define FRAME 0x01
|
|
#define LAPB 0x02
|
|
#define X25 0x04
|
|
#define PPP 0x08
|
|
#define CHDLC 0x10
|
|
#define ETH 0x20
|
|
#define IP 0x40
|
|
#define LAPD 0x80
|
|
#define ALL_PROT (FRAME|LAPB|X25|PPP|CHDLC);
|
|
|
|
#define DATA 0x1
|
|
#define PROT 0x2
|
|
#define ALL_X25 (DATA|PROT)
|
|
|
|
typedef struct {
|
|
unsigned char prot_name[15];
|
|
signed char prot_index;
|
|
unsigned int pcap_prot;
|
|
} trace_prot_t;
|
|
|
|
|
|
/* "libpcap" file header (minus magic number). */
|
|
struct pcap_hdr {
|
|
u_int32_t magic; /* magic */
|
|
unsigned short version_major; /* major version number */
|
|
unsigned short version_minor; /* minor version number */
|
|
u_int32_t thiszone; /* GMT to local correction */
|
|
u_int32_t sigfigs; /* accuracy of timestamps */
|
|
u_int32_t snaplen; /* max length of captured packets, in octets */
|
|
u_int32_t network; /* data link type */
|
|
};
|
|
|
|
/* "libpcap" record header. */
|
|
struct pcaprec_hdr {
|
|
u_int32_t ts_sec; /* timestamp seconds */
|
|
u_int32_t ts_usec; /* timestamp microseconds */
|
|
u_int32_t incl_len; /* number of octets of packet saved in file */
|
|
u_int32_t orig_len; /* actual length of packet */
|
|
};
|
|
|
|
|
|
|
|
enum {
|
|
WP_OUT_TRACE_RAW,
|
|
WP_OUT_TRACE_INTERP,
|
|
WP_OUT_TRACE_PCAP,
|
|
WP_OUT_TRACE_INTERP_IPV4,
|
|
WP_OUT_TRACE_ATM_RAW_PHY,
|
|
WP_OUT_TRACE_ATM_INTERPRETED_PHY,
|
|
WP_OUT_TRACE_HDLC
|
|
};
|
|
|
|
#define WP_TRACE_OUTGOING 0x01
|
|
#define WP_TRACE_INCOMING 0x02
|
|
#define WP_TRACE_ABORT 0x04
|
|
#define WP_TRACE_CRC 0x08
|
|
#define WP_TRACE_OVERRUN 0x10
|
|
|
|
|
|
typedef struct {
|
|
unsigned char *data;
|
|
unsigned int len;
|
|
unsigned int status;
|
|
unsigned short timestamp;
|
|
unsigned long systimestamp;
|
|
unsigned int type;
|
|
unsigned int link_type;
|
|
unsigned int prot_criteria;
|
|
unsigned char trace_all_data;
|
|
unsigned int pkts_written;
|
|
unsigned char init;
|
|
time_t sec,usec;
|
|
FILE *output_file;
|
|
unsigned int sub_type;
|
|
} wp_trace_output_iface_t;
|
|
|
|
|
|
|
|
#pragma pack(1)
|
|
typedef struct {
|
|
unsigned char link_address; /* Broadcast or Unicast */
|
|
unsigned char control;
|
|
unsigned short packet_type; /* IP/SLARP/CDP */
|
|
} cisco_header_t;
|
|
|
|
typedef struct {
|
|
u_int32_t code; /* Slarp Control Packet Code */
|
|
union {
|
|
struct {
|
|
u_int32_t address; /* IP address */
|
|
u_int32_t mask; /* IP mask */
|
|
unsigned short reserved[3];
|
|
} address;
|
|
struct {
|
|
u_int32_t my_sequence;
|
|
u_int32_t your_sequence;
|
|
unsigned short reliability;
|
|
unsigned short t1; /* time alive (upper) */
|
|
unsigned short t2; /* time alive (lower) */
|
|
} keepalive;
|
|
} un;
|
|
} cisco_slarp_t;
|
|
#pragma pack()
|
|
|
|
/* Link addresses */
|
|
#define CISCO_ADDR_UNICAST 0x0F
|
|
#define CISCO_ADDR_BCAST 0x8F
|
|
|
|
/* Packet Types */
|
|
#define CISCO_PACKET_IP 0x0800
|
|
#define CISCO_PACKET_SLARP 0x8035
|
|
#define CISCO_PACKET_CDP 0x2000
|
|
|
|
/* Packet Codes */
|
|
#define SLARP_REQUEST 0
|
|
#define SLARP_REPLY 1
|
|
#define SLARP_KEEPALIVE 2
|
|
|
|
#ifndef LONG_MAX
|
|
#define LONG_MAX ((long)(~0UL>>1))
|
|
#endif
|
|
|
|
#ifndef LONG_MIN
|
|
#define LONG_MIN (-LONG_MAX - 1)
|
|
#endif
|
|
|
|
|
|
|
|
//extern void decode_pkt (unsigned char *data,int len,
|
|
// unsigned char status, unsigned int timestamp, int protocol);
|
|
|
|
extern void wp_trace_output(wp_trace_output_iface_t *trace_iface);
|
|
extern void print_router_up_time(u_int32_t time);
|
|
|
|
extern char* get_hardware_level_interface_name(char* interface_name);
|
|
extern int make_hardware_level_connection(void);
|
|
extern void cleanup_hardware_level_connection(void);
|
|
|
|
extern void read_te1_56k_stat(int);
|
|
extern void flush_te1_pmon(void);
|
|
|
|
extern void hw_line_trace(int trace_mode);
|
|
extern void hw_modem( void );
|
|
extern void hw_general_stats( void );
|
|
extern void hw_flush_general_stats( void ) ;
|
|
extern void hw_comm_err( void ) ;
|
|
extern void hw_flush_comm_err( void );
|
|
extern void hw_router_up_time(void);
|
|
extern void hw_read_code_version(void);
|
|
extern void hw_link_status(void);
|
|
|