| /* |
| * |
| Copyright (c) Eicon Networks, 2000. |
| * |
| This source file is supplied for the use with |
| Eicon Networks range of DIVA Server Adapters. |
| * |
| Eicon File Revision : 1.9 |
| * |
| 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, or (at your option) |
| any later version. |
| * |
| This program is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY |
| 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., 675 Mass Ave, Cambridge, MA 02139, USA. |
| * |
| */ |
| #include "platform.h" |
| #include "kst_ifc.h" |
| #include "di_defs.h" |
| #include "maintidi.h" |
| #include "pc.h" |
| #include "man_defs.h" |
| |
| |
| extern void diva_mnt_internal_dprintf(dword drv_id, dword type, char *p, ...); |
| |
| #define MODEM_PARSE_ENTRIES 16 /* amount of variables of interest */ |
| #define FAX_PARSE_ENTRIES 12 /* amount of variables of interest */ |
| #define LINE_PARSE_ENTRIES 15 /* amount of variables of interest */ |
| #define STAT_PARSE_ENTRIES 70 /* amount of variables of interest */ |
| |
| /* |
| LOCAL FUNCTIONS |
| */ |
| static int DivaSTraceLibraryStart(void *hLib); |
| static int DivaSTraceLibraryStop(void *hLib); |
| static int SuperTraceLibraryFinit(void *hLib); |
| static void *SuperTraceGetHandle(void *hLib); |
| static int SuperTraceMessageInput(void *hLib); |
| static int SuperTraceSetAudioTap(void *hLib, int Channel, int on); |
| static int SuperTraceSetBChannel(void *hLib, int Channel, int on); |
| static int SuperTraceSetDChannel(void *hLib, int on); |
| static int SuperTraceSetInfo(void *hLib, int on); |
| static int SuperTraceClearCall(void *hLib, int Channel); |
| static int SuperTraceGetOutgoingCallStatistics(void *hLib); |
| static int SuperTraceGetIncomingCallStatistics(void *hLib); |
| static int SuperTraceGetModemStatistics(void *hLib); |
| static int SuperTraceGetFaxStatistics(void *hLib); |
| static int SuperTraceGetBLayer1Statistics(void *hLib); |
| static int SuperTraceGetBLayer2Statistics(void *hLib); |
| static int SuperTraceGetDLayer1Statistics(void *hLib); |
| static int SuperTraceGetDLayer2Statistics(void *hLib); |
| |
| /* |
| LOCAL FUNCTIONS |
| */ |
| static int ScheduleNextTraceRequest(diva_strace_context_t *pLib); |
| static int process_idi_event(diva_strace_context_t *pLib, |
| diva_man_var_header_t *pVar); |
| static int process_idi_info(diva_strace_context_t *pLib, |
| diva_man_var_header_t *pVar); |
| static int diva_modem_event(diva_strace_context_t *pLib, int Channel); |
| static int diva_fax_event(diva_strace_context_t *pLib, int Channel); |
| static int diva_line_event(diva_strace_context_t *pLib, int Channel); |
| static int diva_modem_info(diva_strace_context_t *pLib, |
| int Channel, |
| diva_man_var_header_t *pVar); |
| static int diva_fax_info(diva_strace_context_t *pLib, |
| int Channel, |
| diva_man_var_header_t *pVar); |
| static int diva_line_info(diva_strace_context_t *pLib, |
| int Channel, |
| diva_man_var_header_t *pVar); |
| static int diva_ifc_statistics(diva_strace_context_t *pLib, |
| diva_man_var_header_t *pVar); |
| static diva_man_var_header_t *get_next_var(diva_man_var_header_t *pVar); |
| static diva_man_var_header_t *find_var(diva_man_var_header_t *pVar, |
| const char *name); |
| static int diva_strace_read_int(diva_man_var_header_t *pVar, int *var); |
| static int diva_strace_read_uint(diva_man_var_header_t *pVar, dword *var); |
| static int diva_strace_read_asz(diva_man_var_header_t *pVar, char *var); |
| static int diva_strace_read_asc(diva_man_var_header_t *pVar, char *var); |
| static int diva_strace_read_ie(diva_man_var_header_t *pVar, |
| diva_trace_ie_t *var); |
| static void diva_create_parse_table(diva_strace_context_t *pLib); |
| static void diva_trace_error(diva_strace_context_t *pLib, |
| int error, const char *file, int line); |
| static void diva_trace_notify_user(diva_strace_context_t *pLib, |
| int Channel, |
| int notify_subject); |
| static int diva_trace_read_variable(diva_man_var_header_t *pVar, |
| void *variable); |
| |
| /* |
| Initialize the library and return context |
| of the created trace object that will represent |
| the IDI adapter. |
| Return 0 on error. |
| */ |
| diva_strace_library_interface_t *DivaSTraceLibraryCreateInstance(int Adapter, |
| const diva_trace_library_user_interface_t *user_proc, |
| byte *pmem) { |
| diva_strace_context_t *pLib = (diva_strace_context_t *)pmem; |
| int i; |
| |
| if (!pLib) { |
| return NULL; |
| } |
| |
| pmem += sizeof(*pLib); |
| memset(pLib, 0x00, sizeof(*pLib)); |
| |
| pLib->Adapter = Adapter; |
| |
| /* |
| Set up Library Interface |
| */ |
| pLib->instance.hLib = pLib; |
| pLib->instance.DivaSTraceLibraryStart = DivaSTraceLibraryStart; |
| pLib->instance.DivaSTraceLibraryStop = DivaSTraceLibraryStop; |
| pLib->instance.DivaSTraceLibraryFinit = SuperTraceLibraryFinit; |
| pLib->instance.DivaSTraceMessageInput = SuperTraceMessageInput; |
| pLib->instance.DivaSTraceGetHandle = SuperTraceGetHandle; |
| pLib->instance.DivaSTraceSetAudioTap = SuperTraceSetAudioTap; |
| pLib->instance.DivaSTraceSetBChannel = SuperTraceSetBChannel; |
| pLib->instance.DivaSTraceSetDChannel = SuperTraceSetDChannel; |
| pLib->instance.DivaSTraceSetInfo = SuperTraceSetInfo; |
| pLib->instance.DivaSTraceGetOutgoingCallStatistics = \ |
| SuperTraceGetOutgoingCallStatistics; |
| pLib->instance.DivaSTraceGetIncomingCallStatistics = \ |
| SuperTraceGetIncomingCallStatistics; |
| pLib->instance.DivaSTraceGetModemStatistics = \ |
| SuperTraceGetModemStatistics; |
| pLib->instance.DivaSTraceGetFaxStatistics = \ |
| SuperTraceGetFaxStatistics; |
| pLib->instance.DivaSTraceGetBLayer1Statistics = \ |
| SuperTraceGetBLayer1Statistics; |
| pLib->instance.DivaSTraceGetBLayer2Statistics = \ |
| SuperTraceGetBLayer2Statistics; |
| pLib->instance.DivaSTraceGetDLayer1Statistics = \ |
| SuperTraceGetDLayer1Statistics; |
| pLib->instance.DivaSTraceGetDLayer2Statistics = \ |
| SuperTraceGetDLayer2Statistics; |
| pLib->instance.DivaSTraceClearCall = SuperTraceClearCall; |
| |
| |
| if (user_proc) { |
| pLib->user_proc_table.user_context = user_proc->user_context; |
| pLib->user_proc_table.notify_proc = user_proc->notify_proc; |
| pLib->user_proc_table.trace_proc = user_proc->trace_proc; |
| pLib->user_proc_table.error_notify_proc = user_proc->error_notify_proc; |
| } |
| |
| if (!(pLib->hAdapter = SuperTraceOpenAdapter(Adapter))) { |
| diva_mnt_internal_dprintf(0, DLI_ERR, "Can not open XDI adapter"); |
| return NULL; |
| } |
| pLib->Channels = SuperTraceGetNumberOfChannels(pLib->hAdapter); |
| |
| /* |
| Calculate amount of parte table entites necessary to translate |
| information from all events of onterest |
| */ |
| pLib->parse_entries = (MODEM_PARSE_ENTRIES + FAX_PARSE_ENTRIES + \ |
| STAT_PARSE_ENTRIES + \ |
| LINE_PARSE_ENTRIES + 1) * pLib->Channels; |
| pLib->parse_table = (diva_strace_path2action_t *)pmem; |
| |
| for (i = 0; i < 30; i++) { |
| pLib->lines[i].pInterface = &pLib->Interface; |
| pLib->lines[i].pInterfaceStat = &pLib->InterfaceStat; |
| } |
| |
| pLib->e.R = &pLib->RData; |
| |
| pLib->req_busy = 1; |
| pLib->rc_ok = ASSIGN_OK; |
| |
| diva_create_parse_table(pLib); |
| |
| return ((diva_strace_library_interface_t *)pLib); |
| } |
| |
| static int DivaSTraceLibraryStart(void *hLib) { |
| diva_strace_context_t *pLib = (diva_strace_context_t *)hLib; |
| |
| return (SuperTraceASSIGN(pLib->hAdapter, pLib->buffer)); |
| } |
| |
| /* |
| Return (-1) on error |
| Return (0) if was initiated or pending |
| Return (1) if removal is complete |
| */ |
| static int DivaSTraceLibraryStop(void *hLib) { |
| diva_strace_context_t *pLib = (diva_strace_context_t *)hLib; |
| |
| if (!pLib->e.Id) { /* Was never started/assigned */ |
| return (1); |
| } |
| |
| switch (pLib->removal_state) { |
| case 0: |
| pLib->removal_state = 1; |
| ScheduleNextTraceRequest(pLib); |
| break; |
| |
| case 3: |
| return (1); |
| } |
| |
| return (0); |
| } |
| |
| static int SuperTraceLibraryFinit(void *hLib) { |
| diva_strace_context_t *pLib = (diva_strace_context_t *)hLib; |
| if (pLib) { |
| if (pLib->hAdapter) { |
| SuperTraceCloseAdapter(pLib->hAdapter); |
| } |
| return (0); |
| } |
| return (-1); |
| } |
| |
| static void *SuperTraceGetHandle(void *hLib) { |
| diva_strace_context_t *pLib = (diva_strace_context_t *)hLib; |
| |
| return (&pLib->e); |
| } |
| |
| /* |
| After library handle object is gone in signaled state |
| this function should be called and will pick up incoming |
| IDI messages (return codes and indications). |
| */ |
| static int SuperTraceMessageInput(void *hLib) { |
| diva_strace_context_t *pLib = (diva_strace_context_t *)hLib; |
| int ret = 0; |
| byte Rc, Ind; |
| |
| if (pLib->e.complete == 255) { |
| /* |
| Process return code |
| */ |
| pLib->req_busy = 0; |
| Rc = pLib->e.Rc; |
| pLib->e.Rc = 0; |
| |
| if (pLib->removal_state == 2) { |
| pLib->removal_state = 3; |
| return (0); |
| } |
| |
| if (Rc != pLib->rc_ok) { |
| int ignore = 0; |
| /* |
| Auto-detect amount of events/channels and features |
| */ |
| if (pLib->general_b_ch_event == 1) { |
| pLib->general_b_ch_event = 2; |
| ignore = 1; |
| } else if (pLib->general_fax_event == 1) { |
| pLib->general_fax_event = 2; |
| ignore = 1; |
| } else if (pLib->general_mdm_event == 1) { |
| pLib->general_mdm_event = 2; |
| ignore = 1; |
| } else if ((pLib->ChannelsTraceActive < pLib->Channels) && pLib->ChannelsTraceActive) { |
| pLib->ChannelsTraceActive = pLib->Channels; |
| ignore = 1; |
| } else if (pLib->ModemTraceActive < pLib->Channels) { |
| pLib->ModemTraceActive = pLib->Channels; |
| ignore = 1; |
| } else if (pLib->FaxTraceActive < pLib->Channels) { |
| pLib->FaxTraceActive = pLib->Channels; |
| ignore = 1; |
| } else if (pLib->audio_trace_init == 2) { |
| ignore = 1; |
| pLib->audio_trace_init = 1; |
| } else if (pLib->eye_pattern_pending) { |
| pLib->eye_pattern_pending = 0; |
| ignore = 1; |
| } else if (pLib->audio_tap_pending) { |
| pLib->audio_tap_pending = 0; |
| ignore = 1; |
| } |
| |
| if (!ignore) { |
| return (-1); /* request failed */ |
| } |
| } else { |
| if (pLib->general_b_ch_event == 1) { |
| pLib->ChannelsTraceActive = pLib->Channels; |
| pLib->general_b_ch_event = 2; |
| } else if (pLib->general_fax_event == 1) { |
| pLib->general_fax_event = 2; |
| pLib->FaxTraceActive = pLib->Channels; |
| } else if (pLib->general_mdm_event == 1) { |
| pLib->general_mdm_event = 2; |
| pLib->ModemTraceActive = pLib->Channels; |
| } |
| } |
| if (pLib->audio_trace_init == 2) { |
| pLib->audio_trace_init = 1; |
| } |
| pLib->rc_ok = 0xff; /* default OK after assign was done */ |
| if ((ret = ScheduleNextTraceRequest(pLib))) { |
| return (-1); |
| } |
| } else { |
| /* |
| Process indication |
| Always 'RNR' indication if return code is pending |
| */ |
| Ind = pLib->e.Ind; |
| pLib->e.Ind = 0; |
| if (pLib->removal_state) { |
| pLib->e.RNum = 0; |
| pLib->e.RNR = 2; |
| } else if (pLib->req_busy) { |
| pLib->e.RNum = 0; |
| pLib->e.RNR = 1; |
| } else { |
| if (pLib->e.complete != 0x02) { |
| /* |
| Look-ahead call, set up buffers |
| */ |
| pLib->e.RNum = 1; |
| pLib->e.R->P = (byte *)&pLib->buffer[0]; |
| pLib->e.R->PLength = (word)(sizeof(pLib->buffer) - 1); |
| |
| } else { |
| /* |
| Indication reception complete, process it now |
| */ |
| byte *p = (byte *)&pLib->buffer[0]; |
| pLib->buffer[pLib->e.R->PLength] = 0; /* terminate I.E. with zero */ |
| |
| switch (Ind) { |
| case MAN_COMBI_IND: { |
| int total_length = pLib->e.R->PLength; |
| word this_ind_length; |
| |
| while (total_length > 3 && *p) { |
| Ind = *p++; |
| this_ind_length = (word)p[0] | ((word)p[1] << 8); |
| p += 2; |
| |
| switch (Ind) { |
| case MAN_INFO_IND: |
| if (process_idi_info(pLib, (diva_man_var_header_t *)p)) { |
| return (-1); |
| } |
| break; |
| case MAN_EVENT_IND: |
| if (process_idi_event(pLib, (diva_man_var_header_t *)p)) { |
| return (-1); |
| } |
| break; |
| case MAN_TRACE_IND: |
| if (pLib->trace_on == 1) { |
| /* |
| Ignore first trace event that is result of |
| EVENT_ON operation |
| */ |
| pLib->trace_on++; |
| } else { |
| /* |
| Delivery XLOG buffer to application |
| */ |
| if (pLib->user_proc_table.trace_proc) { |
| (*(pLib->user_proc_table.trace_proc))(pLib->user_proc_table.user_context, |
| &pLib->instance, pLib->Adapter, |
| p, this_ind_length); |
| } |
| } |
| break; |
| default: |
| diva_mnt_internal_dprintf(0, DLI_ERR, "Unknown IDI Ind (DMA mode): %02x", Ind); |
| } |
| p += (this_ind_length + 1); |
| total_length -= (4 + this_ind_length); |
| } |
| } break; |
| case MAN_INFO_IND: |
| if (process_idi_info(pLib, (diva_man_var_header_t *)p)) { |
| return (-1); |
| } |
| break; |
| case MAN_EVENT_IND: |
| if (process_idi_event(pLib, (diva_man_var_header_t *)p)) { |
| return (-1); |
| } |
| break; |
| case MAN_TRACE_IND: |
| if (pLib->trace_on == 1) { |
| /* |
| Ignore first trace event that is result of |
| EVENT_ON operation |
| */ |
| pLib->trace_on++; |
| } else { |
| /* |
| Delivery XLOG buffer to application |
| */ |
| if (pLib->user_proc_table.trace_proc) { |
| (*(pLib->user_proc_table.trace_proc))(pLib->user_proc_table.user_context, |
| &pLib->instance, pLib->Adapter, |
| p, pLib->e.R->PLength); |
| } |
| } |
| break; |
| default: |
| diva_mnt_internal_dprintf(0, DLI_ERR, "Unknown IDI Ind: %02x", Ind); |
| } |
| } |
| } |
| } |
| |
| if ((ret = ScheduleNextTraceRequest(pLib))) { |
| return (-1); |
| } |
| |
| return (ret); |
| } |
| |
| /* |
| Internal state machine responsible for scheduling of requests |
| */ |
| static int ScheduleNextTraceRequest(diva_strace_context_t *pLib) { |
| char name[64]; |
| int ret = 0; |
| int i; |
| |
| if (pLib->req_busy) { |
| return (0); |
| } |
| |
| if (pLib->removal_state == 1) { |
| if (SuperTraceREMOVE(pLib->hAdapter)) { |
| pLib->removal_state = 3; |
| } else { |
| pLib->req_busy = 1; |
| pLib->removal_state = 2; |
| } |
| return (0); |
| } |
| |
| if (pLib->removal_state) { |
| return (0); |
| } |
| |
| if (!pLib->general_b_ch_event) { |
| if ((ret = SuperTraceTraceOnRequest(pLib->hAdapter, "State\\B Event", pLib->buffer))) { |
| return (-1); |
| } |
| pLib->general_b_ch_event = 1; |
| pLib->req_busy = 1; |
| return (0); |
| } |
| |
| if (!pLib->general_fax_event) { |
| if ((ret = SuperTraceTraceOnRequest(pLib->hAdapter, "State\\FAX Event", pLib->buffer))) { |
| return (-1); |
| } |
| pLib->general_fax_event = 1; |
| pLib->req_busy = 1; |
| return (0); |
| } |
| |
| if (!pLib->general_mdm_event) { |
| if ((ret = SuperTraceTraceOnRequest(pLib->hAdapter, "State\\Modem Event", pLib->buffer))) { |
| return (-1); |
| } |
| pLib->general_mdm_event = 1; |
| pLib->req_busy = 1; |
| return (0); |
| } |
| |
| if (pLib->ChannelsTraceActive < pLib->Channels) { |
| pLib->ChannelsTraceActive++; |
| sprintf(name, "State\\B%d\\Line", pLib->ChannelsTraceActive); |
| if ((ret = SuperTraceTraceOnRequest(pLib->hAdapter, name, pLib->buffer))) { |
| pLib->ChannelsTraceActive--; |
| return (-1); |
| } |
| pLib->req_busy = 1; |
| return (0); |
| } |
| |
| if (pLib->ModemTraceActive < pLib->Channels) { |
| pLib->ModemTraceActive++; |
| sprintf(name, "State\\B%d\\Modem\\Event", pLib->ModemTraceActive); |
| if ((ret = SuperTraceTraceOnRequest(pLib->hAdapter, name, pLib->buffer))) { |
| pLib->ModemTraceActive--; |
| return (-1); |
| } |
| pLib->req_busy = 1; |
| return (0); |
| } |
| |
| if (pLib->FaxTraceActive < pLib->Channels) { |
| pLib->FaxTraceActive++; |
| sprintf(name, "State\\B%d\\FAX\\Event", pLib->FaxTraceActive); |
| if ((ret = SuperTraceTraceOnRequest(pLib->hAdapter, name, pLib->buffer))) { |
| pLib->FaxTraceActive--; |
| return (-1); |
| } |
| pLib->req_busy = 1; |
| return (0); |
| } |
| |
| if (!pLib->trace_mask_init) { |
| word tmp = 0x0000; |
| if (SuperTraceWriteVar(pLib->hAdapter, |
| pLib->buffer, |
| "Trace\\Event Enable", |
| &tmp, |
| 0x87, /* MI_BITFLD */ |
| sizeof(tmp))) { |
| return (-1); |
| } |
| pLib->trace_mask_init = 1; |
| pLib->req_busy = 1; |
| return (0); |
| } |
| |
| if (!pLib->audio_trace_init) { |
| dword tmp = 0x00000000; |
| if (SuperTraceWriteVar(pLib->hAdapter, |
| pLib->buffer, |
| "Trace\\AudioCh# Enable", |
| &tmp, |
| 0x87, /* MI_BITFLD */ |
| sizeof(tmp))) { |
| return (-1); |
| } |
| pLib->audio_trace_init = 2; |
| pLib->req_busy = 1; |
| return (0); |
| } |
| |
| if (!pLib->bchannel_init) { |
| dword tmp = 0x00000000; |
| if (SuperTraceWriteVar(pLib->hAdapter, |
| pLib->buffer, |
| "Trace\\B-Ch# Enable", |
| &tmp, |
| 0x87, /* MI_BITFLD */ |
| sizeof(tmp))) { |
| return (-1); |
| } |
| pLib->bchannel_init = 1; |
| pLib->req_busy = 1; |
| return (0); |
| } |
| |
| if (!pLib->trace_length_init) { |
| word tmp = 30; |
| if (SuperTraceWriteVar(pLib->hAdapter, |
| pLib->buffer, |
| "Trace\\Max Log Length", |
| &tmp, |
| 0x82, /* MI_UINT */ |
| sizeof(tmp))) { |
| return (-1); |
| } |
| pLib->trace_length_init = 1; |
| pLib->req_busy = 1; |
| return (0); |
| } |
| |
| if (!pLib->trace_on) { |
| if (SuperTraceTraceOnRequest(pLib->hAdapter, |
| "Trace\\Log Buffer", |
| pLib->buffer)) { |
| return (-1); |
| } |
| pLib->trace_on = 1; |
| pLib->req_busy = 1; |
| return (0); |
| } |
| |
| if (pLib->trace_event_mask != pLib->current_trace_event_mask) { |
| if (SuperTraceWriteVar(pLib->hAdapter, |
| pLib->buffer, |
| "Trace\\Event Enable", |
| &pLib->trace_event_mask, |
| 0x87, /* MI_BITFLD */ |
| sizeof(pLib->trace_event_mask))) { |
| return (-1); |
| } |
| pLib->current_trace_event_mask = pLib->trace_event_mask; |
| pLib->req_busy = 1; |
| return (0); |
| } |
| |
| if ((pLib->audio_tap_pending >= 0) && (pLib->audio_tap_mask != pLib->current_audio_tap_mask)) { |
| if (SuperTraceWriteVar(pLib->hAdapter, |
| pLib->buffer, |
| "Trace\\AudioCh# Enable", |
| &pLib->audio_tap_mask, |
| 0x87, /* MI_BITFLD */ |
| sizeof(pLib->audio_tap_mask))) { |
| return (-1); |
| } |
| pLib->current_audio_tap_mask = pLib->audio_tap_mask; |
| pLib->audio_tap_pending = 1; |
| pLib->req_busy = 1; |
| return (0); |
| } |
| |
| if ((pLib->eye_pattern_pending >= 0) && (pLib->audio_tap_mask != pLib->current_eye_pattern_mask)) { |
| if (SuperTraceWriteVar(pLib->hAdapter, |
| pLib->buffer, |
| "Trace\\EyeCh# Enable", |
| &pLib->audio_tap_mask, |
| 0x87, /* MI_BITFLD */ |
| sizeof(pLib->audio_tap_mask))) { |
| return (-1); |
| } |
| pLib->current_eye_pattern_mask = pLib->audio_tap_mask; |
| pLib->eye_pattern_pending = 1; |
| pLib->req_busy = 1; |
| return (0); |
| } |
| |
| if (pLib->bchannel_trace_mask != pLib->current_bchannel_trace_mask) { |
| if (SuperTraceWriteVar(pLib->hAdapter, |
| pLib->buffer, |
| "Trace\\B-Ch# Enable", |
| &pLib->bchannel_trace_mask, |
| 0x87, /* MI_BITFLD */ |
| sizeof(pLib->bchannel_trace_mask))) { |
| return (-1); |
| } |
| pLib->current_bchannel_trace_mask = pLib->bchannel_trace_mask; |
| pLib->req_busy = 1; |
| return (0); |
| } |
| |
| if (!pLib->trace_events_down) { |
| if (SuperTraceTraceOnRequest(pLib->hAdapter, |
| "Events Down", |
| pLib->buffer)) { |
| return (-1); |
| } |
| pLib->trace_events_down = 1; |
| pLib->req_busy = 1; |
| return (0); |
| } |
| |
| if (!pLib->l1_trace) { |
| if (SuperTraceTraceOnRequest(pLib->hAdapter, |
| "State\\Layer1", |
| pLib->buffer)) { |
| return (-1); |
| } |
| pLib->l1_trace = 1; |
| pLib->req_busy = 1; |
| return (0); |
| } |
| |
| if (!pLib->l2_trace) { |
| if (SuperTraceTraceOnRequest(pLib->hAdapter, |
| "State\\Layer2 No1", |
| pLib->buffer)) { |
| return (-1); |
| } |
| pLib->l2_trace = 1; |
| pLib->req_busy = 1; |
| return (0); |
| } |
| |
| for (i = 0; i < 30; i++) { |
| if (pLib->pending_line_status & (1L << i)) { |
| sprintf(name, "State\\B%d", i + 1); |
| if (SuperTraceReadRequest(pLib->hAdapter, name, pLib->buffer)) { |
| return (-1); |
| } |
| pLib->pending_line_status &= ~(1L << i); |
| pLib->req_busy = 1; |
| return (0); |
| } |
| if (pLib->pending_modem_status & (1L << i)) { |
| sprintf(name, "State\\B%d\\Modem", i + 1); |
| if (SuperTraceReadRequest(pLib->hAdapter, name, pLib->buffer)) { |
| return (-1); |
| } |
| pLib->pending_modem_status &= ~(1L << i); |
| pLib->req_busy = 1; |
| return (0); |
| } |
| if (pLib->pending_fax_status & (1L << i)) { |
| sprintf(name, "State\\B%d\\FAX", i + 1); |
| if (SuperTraceReadRequest(pLib->hAdapter, name, pLib->buffer)) { |
| return (-1); |
| } |
| pLib->pending_fax_status &= ~(1L << i); |
| pLib->req_busy = 1; |
| return (0); |
| } |
| if (pLib->clear_call_command & (1L << i)) { |
| sprintf(name, "State\\B%d\\Clear Call", i + 1); |
| if (SuperTraceExecuteRequest(pLib->hAdapter, name, pLib->buffer)) { |
| return (-1); |
| } |
| pLib->clear_call_command &= ~(1L << i); |
| pLib->req_busy = 1; |
| return (0); |
| } |
| } |
| |
| if (pLib->outgoing_ifc_stats) { |
| if (SuperTraceReadRequest(pLib->hAdapter, |
| "Statistics\\Outgoing Calls", |
| pLib->buffer)) { |
| return (-1); |
| } |
| pLib->outgoing_ifc_stats = 0; |
| pLib->req_busy = 1; |
| return (0); |
| } |
| |
| if (pLib->incoming_ifc_stats) { |
| if (SuperTraceReadRequest(pLib->hAdapter, |
| "Statistics\\Incoming Calls", |
| pLib->buffer)) { |
| return (-1); |
| } |
| pLib->incoming_ifc_stats = 0; |
| pLib->req_busy = 1; |
| return (0); |
| } |
| |
| if (pLib->modem_ifc_stats) { |
| if (SuperTraceReadRequest(pLib->hAdapter, |
| "Statistics\\Modem", |
| pLib->buffer)) { |
| return (-1); |
| } |
| pLib->modem_ifc_stats = 0; |
| pLib->req_busy = 1; |
| return (0); |
| } |
| |
| if (pLib->fax_ifc_stats) { |
| if (SuperTraceReadRequest(pLib->hAdapter, |
| "Statistics\\FAX", |
| pLib->buffer)) { |
| return (-1); |
| } |
| pLib->fax_ifc_stats = 0; |
| pLib->req_busy = 1; |
| return (0); |
| } |
| |
| if (pLib->b1_ifc_stats) { |
| if (SuperTraceReadRequest(pLib->hAdapter, |
| "Statistics\\B-Layer1", |
| pLib->buffer)) { |
| return (-1); |
| } |
| pLib->b1_ifc_stats = 0; |
| pLib->req_busy = 1; |
| return (0); |
| } |
| |
| if (pLib->b2_ifc_stats) { |
| if (SuperTraceReadRequest(pLib->hAdapter, |
| "Statistics\\B-Layer2", |
| pLib->buffer)) { |
| return (-1); |
| } |
| pLib->b2_ifc_stats = 0; |
| pLib->req_busy = 1; |
| return (0); |
| } |
| |
| if (pLib->d1_ifc_stats) { |
| if (SuperTraceReadRequest(pLib->hAdapter, |
| "Statistics\\D-Layer1", |
| pLib->buffer)) { |
| return (-1); |
| } |
| pLib->d1_ifc_stats = 0; |
| pLib->req_busy = 1; |
| return (0); |
| } |
| |
| if (pLib->d2_ifc_stats) { |
| if (SuperTraceReadRequest(pLib->hAdapter, |
| "Statistics\\D-Layer2", |
| pLib->buffer)) { |
| return (-1); |
| } |
| pLib->d2_ifc_stats = 0; |
| pLib->req_busy = 1; |
| return (0); |
| } |
| |
| if (!pLib->IncomingCallsCallsActive) { |
| pLib->IncomingCallsCallsActive = 1; |
| sprintf(name, "%s", "Statistics\\Incoming Calls\\Calls"); |
| if ((ret = SuperTraceTraceOnRequest(pLib->hAdapter, name, pLib->buffer))) { |
| pLib->IncomingCallsCallsActive = 0; |
| return (-1); |
| } |
| pLib->req_busy = 1; |
| return (0); |
| } |
| if (!pLib->IncomingCallsConnectedActive) { |
| pLib->IncomingCallsConnectedActive = 1; |
| sprintf(name, "%s", "Statistics\\Incoming Calls\\Connected"); |
| if ((ret = SuperTraceTraceOnRequest(pLib->hAdapter, name, pLib->buffer))) { |
| pLib->IncomingCallsConnectedActive = 0; |
| return (-1); |
| } |
| pLib->req_busy = 1; |
| return (0); |
| } |
| if (!pLib->OutgoingCallsCallsActive) { |
| pLib->OutgoingCallsCallsActive = 1; |
| sprintf(name, "%s", "Statistics\\Outgoing Calls\\Calls"); |
| if ((ret = SuperTraceTraceOnRequest(pLib->hAdapter, name, pLib->buffer))) { |
| pLib->OutgoingCallsCallsActive = 0; |
| return (-1); |
| } |
| pLib->req_busy = 1; |
| return (0); |
| } |
| if (!pLib->OutgoingCallsConnectedActive) { |
| pLib->OutgoingCallsConnectedActive = 1; |
| sprintf(name, "%s", "Statistics\\Outgoing Calls\\Connected"); |
| if ((ret = SuperTraceTraceOnRequest(pLib->hAdapter, name, pLib->buffer))) { |
| pLib->OutgoingCallsConnectedActive = 0; |
| return (-1); |
| } |
| pLib->req_busy = 1; |
| return (0); |
| } |
| |
| return (0); |
| } |
| |
| static int process_idi_event(diva_strace_context_t *pLib, |
| diva_man_var_header_t *pVar) { |
| const char *path = (char *)&pVar->path_length + 1; |
| char name[64]; |
| int i; |
| |
| if (!strncmp("State\\B Event", path, pVar->path_length)) { |
| dword ch_id; |
| if (!diva_trace_read_variable(pVar, &ch_id)) { |
| if (!pLib->line_init_event && !pLib->pending_line_status) { |
| for (i = 1; i <= pLib->Channels; i++) { |
| diva_line_event(pLib, i); |
| } |
| return (0); |
| } else if (ch_id && ch_id <= pLib->Channels) { |
| return (diva_line_event(pLib, (int)ch_id)); |
| } |
| return (0); |
| } |
| return (-1); |
| } |
| |
| if (!strncmp("State\\FAX Event", path, pVar->path_length)) { |
| dword ch_id; |
| if (!diva_trace_read_variable(pVar, &ch_id)) { |
| if (!pLib->pending_fax_status && !pLib->fax_init_event) { |
| for (i = 1; i <= pLib->Channels; i++) { |
| diva_fax_event(pLib, i); |
| } |
| return (0); |
| } else if (ch_id && ch_id <= pLib->Channels) { |
| return (diva_fax_event(pLib, (int)ch_id)); |
| } |
| return (0); |
| } |
| return (-1); |
| } |
| |
| if (!strncmp("State\\Modem Event", path, pVar->path_length)) { |
| dword ch_id; |
| if (!diva_trace_read_variable(pVar, &ch_id)) { |
| if (!pLib->pending_modem_status && !pLib->modem_init_event) { |
| for (i = 1; i <= pLib->Channels; i++) { |
| diva_modem_event(pLib, i); |
| } |
| return (0); |
| } else if (ch_id && ch_id <= pLib->Channels) { |
| return (diva_modem_event(pLib, (int)ch_id)); |
| } |
| return (0); |
| } |
| return (-1); |
| } |
| |
| /* |
| First look for Line Event |
| */ |
| for (i = 1; i <= pLib->Channels; i++) { |
| sprintf(name, "State\\B%d\\Line", i); |
| if (find_var(pVar, name)) { |
| return (diva_line_event(pLib, i)); |
| } |
| } |
| |
| /* |
| Look for Moden Progress Event |
| */ |
| for (i = 1; i <= pLib->Channels; i++) { |
| sprintf(name, "State\\B%d\\Modem\\Event", i); |
| if (find_var(pVar, name)) { |
| return (diva_modem_event(pLib, i)); |
| } |
| } |
| |
| /* |
| Look for Fax Event |
| */ |
| for (i = 1; i <= pLib->Channels; i++) { |
| sprintf(name, "State\\B%d\\FAX\\Event", i); |
| if (find_var(pVar, name)) { |
| return (diva_fax_event(pLib, i)); |
| } |
| } |
| |
| /* |
| Notification about loss of events |
| */ |
| if (!strncmp("Events Down", path, pVar->path_length)) { |
| if (pLib->trace_events_down == 1) { |
| pLib->trace_events_down = 2; |
| } else { |
| diva_trace_error(pLib, 1, "Events Down", 0); |
| } |
| return (0); |
| } |
| |
| if (!strncmp("State\\Layer1", path, pVar->path_length)) { |
| diva_strace_read_asz(pVar, &pLib->lines[0].pInterface->Layer1[0]); |
| if (pLib->l1_trace == 1) { |
| pLib->l1_trace = 2; |
| } else { |
| diva_trace_notify_user(pLib, 0, DIVA_SUPER_TRACE_INTERFACE_CHANGE); |
| } |
| return (0); |
| } |
| if (!strncmp("State\\Layer2 No1", path, pVar->path_length)) { |
| char *tmp = &pLib->lines[0].pInterface->Layer2[0]; |
| dword l2_state; |
| if (diva_strace_read_uint(pVar, &l2_state)) |
| return -1; |
| |
| switch (l2_state) { |
| case 0: |
| strcpy(tmp, "Idle"); |
| break; |
| case 1: |
| strcpy(tmp, "Layer2 UP"); |
| break; |
| case 2: |
| strcpy(tmp, "Layer2 Disconnecting"); |
| break; |
| case 3: |
| strcpy(tmp, "Layer2 Connecting"); |
| break; |
| case 4: |
| strcpy(tmp, "SPID Initializing"); |
| break; |
| case 5: |
| strcpy(tmp, "SPID Initialised"); |
| break; |
| case 6: |
| strcpy(tmp, "Layer2 Connecting"); |
| break; |
| |
| case 7: |
| strcpy(tmp, "Auto SPID Stopped"); |
| break; |
| |
| case 8: |
| strcpy(tmp, "Auto SPID Idle"); |
| break; |
| |
| case 9: |
| strcpy(tmp, "Auto SPID Requested"); |
| break; |
| |
| case 10: |
| strcpy(tmp, "Auto SPID Delivery"); |
| break; |
| |
| case 11: |
| strcpy(tmp, "Auto SPID Complete"); |
| break; |
| |
| default: |
| sprintf(tmp, "U:%d", (int)l2_state); |
| } |
| if (pLib->l2_trace == 1) { |
| pLib->l2_trace = 2; |
| } else { |
| diva_trace_notify_user(pLib, 0, DIVA_SUPER_TRACE_INTERFACE_CHANGE); |
| } |
| return (0); |
| } |
| |
| if (!strncmp("Statistics\\Incoming Calls\\Calls", path, pVar->path_length) || |
| !strncmp("Statistics\\Incoming Calls\\Connected", path, pVar->path_length)) { |
| return (SuperTraceGetIncomingCallStatistics(pLib)); |
| } |
| |
| if (!strncmp("Statistics\\Outgoing Calls\\Calls", path, pVar->path_length) || |
| !strncmp("Statistics\\Outgoing Calls\\Connected", path, pVar->path_length)) { |
| return (SuperTraceGetOutgoingCallStatistics(pLib)); |
| } |
| |
| return (-1); |
| } |
| |
| static int diva_line_event(diva_strace_context_t *pLib, int Channel) { |
| pLib->pending_line_status |= (1L << (Channel - 1)); |
| return (0); |
| } |
| |
| static int diva_modem_event(diva_strace_context_t *pLib, int Channel) { |
| pLib->pending_modem_status |= (1L << (Channel - 1)); |
| return (0); |
| } |
| |
| static int diva_fax_event(diva_strace_context_t *pLib, int Channel) { |
| pLib->pending_fax_status |= (1L << (Channel - 1)); |
| return (0); |
| } |
| |
| /* |
| Process INFO indications that arrive from the card |
| Uses path of first I.E. to detect the source of the |
| infication |
| */ |
| static int process_idi_info(diva_strace_context_t *pLib, |
| diva_man_var_header_t *pVar) { |
| const char *path = (char *)&pVar->path_length + 1; |
| char name[64]; |
| int i, len; |
| |
| /* |
| First look for Modem Status Info |
| */ |
| for (i = pLib->Channels; i > 0; i--) { |
| len = sprintf(name, "State\\B%d\\Modem", i); |
| if (!strncmp(name, path, len)) { |
| return (diva_modem_info(pLib, i, pVar)); |
| } |
| } |
| |
| /* |
| Look for Fax Status Info |
| */ |
| for (i = pLib->Channels; i > 0; i--) { |
| len = sprintf(name, "State\\B%d\\FAX", i); |
| if (!strncmp(name, path, len)) { |
| return (diva_fax_info(pLib, i, pVar)); |
| } |
| } |
| |
| /* |
| Look for Line Status Info |
| */ |
| for (i = pLib->Channels; i > 0; i--) { |
| len = sprintf(name, "State\\B%d", i); |
| if (!strncmp(name, path, len)) { |
| return (diva_line_info(pLib, i, pVar)); |
| } |
| } |
| |
| if (!diva_ifc_statistics(pLib, pVar)) { |
| return (0); |
| } |
| |
| return (-1); |
| } |
| |
| /* |
| MODEM INSTANCE STATE UPDATE |
| |
| Update Modem Status Information and issue notification to user, |
| that will inform about change in the state of modem instance, that is |
| associuated with this channel |
| */ |
| static int diva_modem_info(diva_strace_context_t *pLib, |
| int Channel, |
| diva_man_var_header_t *pVar) { |
| diva_man_var_header_t *cur; |
| int i, nr = Channel - 1; |
| |
| for (i = pLib->modem_parse_entry_first[nr]; |
| i <= pLib->modem_parse_entry_last[nr]; i++) { |
| if ((cur = find_var(pVar, pLib->parse_table[i].path))) { |
| if (diva_trace_read_variable(cur, pLib->parse_table[i].variable)) { |
| diva_trace_error(pLib, -3, __FILE__, __LINE__); |
| return (-1); |
| } |
| } else { |
| diva_trace_error(pLib, -2, __FILE__, __LINE__); |
| return (-1); |
| } |
| } |
| |
| /* |
| We do not use first event to notify user - this is the event that is |
| generated as result of EVENT ON operation and is used only to initialize |
| internal variables of application |
| */ |
| if (pLib->modem_init_event & (1L << nr)) { |
| diva_trace_notify_user(pLib, nr, DIVA_SUPER_TRACE_NOTIFY_MODEM_CHANGE); |
| } else { |
| pLib->modem_init_event |= (1L << nr); |
| } |
| |
| return (0); |
| } |
| |
| static int diva_fax_info(diva_strace_context_t *pLib, |
| int Channel, |
| diva_man_var_header_t *pVar) { |
| diva_man_var_header_t *cur; |
| int i, nr = Channel - 1; |
| |
| for (i = pLib->fax_parse_entry_first[nr]; |
| i <= pLib->fax_parse_entry_last[nr]; i++) { |
| if ((cur = find_var(pVar, pLib->parse_table[i].path))) { |
| if (diva_trace_read_variable(cur, pLib->parse_table[i].variable)) { |
| diva_trace_error(pLib, -3, __FILE__, __LINE__); |
| return (-1); |
| } |
| } else { |
| diva_trace_error(pLib, -2, __FILE__, __LINE__); |
| return (-1); |
| } |
| } |
| |
| /* |
| We do not use first event to notify user - this is the event that is |
| generated as result of EVENT ON operation and is used only to initialize |
| internal variables of application |
| */ |
| if (pLib->fax_init_event & (1L << nr)) { |
| diva_trace_notify_user(pLib, nr, DIVA_SUPER_TRACE_NOTIFY_FAX_CHANGE); |
| } else { |
| pLib->fax_init_event |= (1L << nr); |
| } |
| |
| return (0); |
| } |
| |
| /* |
| LINE STATE UPDATE |
| Update Line Status Information and issue notification to user, |
| that will inform about change in the line state. |
| */ |
| static int diva_line_info(diva_strace_context_t *pLib, |
| int Channel, |
| diva_man_var_header_t *pVar) { |
| diva_man_var_header_t *cur; |
| int i, nr = Channel - 1; |
| |
| for (i = pLib->line_parse_entry_first[nr]; |
| i <= pLib->line_parse_entry_last[nr]; i++) { |
| if ((cur = find_var(pVar, pLib->parse_table[i].path))) { |
| if (diva_trace_read_variable(cur, pLib->parse_table[i].variable)) { |
| diva_trace_error(pLib, -3, __FILE__, __LINE__); |
| return (-1); |
| } |
| } else { |
| diva_trace_error(pLib, -2 , __FILE__, __LINE__); |
| return (-1); |
| } |
| } |
| |
| /* |
| We do not use first event to notify user - this is the event that is |
| generated as result of EVENT ON operation and is used only to initialize |
| internal variables of application |
| |
| Exception is is if the line is "online". In this case we have to notify |
| user about this confition. |
| */ |
| if (pLib->line_init_event & (1L << nr)) { |
| diva_trace_notify_user(pLib, nr, DIVA_SUPER_TRACE_NOTIFY_LINE_CHANGE); |
| } else { |
| pLib->line_init_event |= (1L << nr); |
| if (strcmp(&pLib->lines[nr].Line[0], "Idle")) { |
| diva_trace_notify_user(pLib, nr, DIVA_SUPER_TRACE_NOTIFY_LINE_CHANGE); |
| } |
| } |
| |
| return (0); |
| } |
| |
| /* |
| Move position to next vatianle in the chain |
| */ |
| static diva_man_var_header_t *get_next_var(diva_man_var_header_t *pVar) { |
| byte *msg = (byte *)pVar; |
| byte *start; |
| int msg_length; |
| |
| if (*msg != ESC) return NULL; |
| |
| start = msg + 2; |
| msg_length = *(msg + 1); |
| msg = (start + msg_length); |
| |
| if (*msg != ESC) return NULL; |
| |
| return ((diva_man_var_header_t *)msg); |
| } |
| |
| /* |
| Move position to variable with given name |
| */ |
| static diva_man_var_header_t *find_var(diva_man_var_header_t *pVar, |
| const char *name) { |
| const char *path; |
| |
| do { |
| path = (char *)&pVar->path_length + 1; |
| |
| if (!strncmp(name, path, pVar->path_length)) { |
| break; |
| } |
| } while ((pVar = get_next_var(pVar))); |
| |
| return (pVar); |
| } |
| |
| static void diva_create_line_parse_table(diva_strace_context_t *pLib, |
| int Channel) { |
| diva_trace_line_state_t *pLine = &pLib->lines[Channel]; |
| int nr = Channel + 1; |
| |
| if ((pLib->cur_parse_entry + LINE_PARSE_ENTRIES) >= pLib->parse_entries) { |
| diva_trace_error(pLib, -1, __FILE__, __LINE__); |
| return; |
| } |
| |
| pLine->ChannelNumber = nr; |
| |
| pLib->line_parse_entry_first[Channel] = pLib->cur_parse_entry; |
| |
| sprintf(pLib->parse_table[pLib->cur_parse_entry].path, |
| "State\\B%d\\Framing", nr); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = &pLine->Framing[0]; |
| |
| sprintf(pLib->parse_table[pLib->cur_parse_entry].path, |
| "State\\B%d\\Line", nr); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = &pLine->Line[0]; |
| |
| sprintf(pLib->parse_table[pLib->cur_parse_entry].path, |
| "State\\B%d\\Layer2", nr); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = &pLine->Layer2[0]; |
| |
| sprintf(pLib->parse_table[pLib->cur_parse_entry].path, |
| "State\\B%d\\Layer3", nr); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = &pLine->Layer3[0]; |
| |
| sprintf(pLib->parse_table[pLib->cur_parse_entry].path, |
| "State\\B%d\\Remote Address", nr); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLine->RemoteAddress[0]; |
| |
| sprintf(pLib->parse_table[pLib->cur_parse_entry].path, |
| "State\\B%d\\Remote SubAddr", nr); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLine->RemoteSubAddress[0]; |
| |
| sprintf(pLib->parse_table[pLib->cur_parse_entry].path, |
| "State\\B%d\\Local Address", nr); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLine->LocalAddress[0]; |
| |
| sprintf(pLib->parse_table[pLib->cur_parse_entry].path, |
| "State\\B%d\\Local SubAddr", nr); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLine->LocalSubAddress[0]; |
| |
| sprintf(pLib->parse_table[pLib->cur_parse_entry].path, |
| "State\\B%d\\BC", nr); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = &pLine->call_BC; |
| |
| sprintf(pLib->parse_table[pLib->cur_parse_entry].path, |
| "State\\B%d\\HLC", nr); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = &pLine->call_HLC; |
| |
| sprintf(pLib->parse_table[pLib->cur_parse_entry].path, |
| "State\\B%d\\LLC", nr); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = &pLine->call_LLC; |
| |
| sprintf(pLib->parse_table[pLib->cur_parse_entry].path, |
| "State\\B%d\\Charges", nr); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = &pLine->Charges; |
| |
| sprintf(pLib->parse_table[pLib->cur_parse_entry].path, |
| "State\\B%d\\Call Reference", nr); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = &pLine->CallReference; |
| |
| sprintf(pLib->parse_table[pLib->cur_parse_entry].path, |
| "State\\B%d\\Last Disc Cause", nr); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLine->LastDisconnecCause; |
| |
| sprintf(pLib->parse_table[pLib->cur_parse_entry].path, |
| "State\\B%d\\User ID", nr); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = &pLine->UserID[0]; |
| |
| pLib->line_parse_entry_last[Channel] = pLib->cur_parse_entry - 1; |
| } |
| |
| static void diva_create_fax_parse_table(diva_strace_context_t *pLib, |
| int Channel) { |
| diva_trace_fax_state_t *pFax = &pLib->lines[Channel].fax; |
| int nr = Channel + 1; |
| |
| if ((pLib->cur_parse_entry + FAX_PARSE_ENTRIES) >= pLib->parse_entries) { |
| diva_trace_error(pLib, -1, __FILE__, __LINE__); |
| return; |
| } |
| pFax->ChannelNumber = nr; |
| |
| pLib->fax_parse_entry_first[Channel] = pLib->cur_parse_entry; |
| |
| sprintf(pLib->parse_table[pLib->cur_parse_entry].path, |
| "State\\B%d\\FAX\\Event", nr); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = &pFax->Event; |
| |
| sprintf(pLib->parse_table[pLib->cur_parse_entry].path, |
| "State\\B%d\\FAX\\Page Counter", nr); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = &pFax->Page_Counter; |
| |
| sprintf(pLib->parse_table[pLib->cur_parse_entry].path, |
| "State\\B%d\\FAX\\Features", nr); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = &pFax->Features; |
| |
| sprintf(pLib->parse_table[pLib->cur_parse_entry].path, |
| "State\\B%d\\FAX\\Station ID", nr); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = &pFax->Station_ID[0]; |
| |
| sprintf(pLib->parse_table[pLib->cur_parse_entry].path, |
| "State\\B%d\\FAX\\Subaddress", nr); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = &pFax->Subaddress[0]; |
| |
| sprintf(pLib->parse_table[pLib->cur_parse_entry].path, |
| "State\\B%d\\FAX\\Password", nr); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = &pFax->Password[0]; |
| |
| sprintf(pLib->parse_table[pLib->cur_parse_entry].path, |
| "State\\B%d\\FAX\\Speed", nr); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = &pFax->Speed; |
| |
| sprintf(pLib->parse_table[pLib->cur_parse_entry].path, |
| "State\\B%d\\FAX\\Resolution", nr); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = &pFax->Resolution; |
| |
| sprintf(pLib->parse_table[pLib->cur_parse_entry].path, |
| "State\\B%d\\FAX\\Paper Width", nr); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = &pFax->Paper_Width; |
| |
| sprintf(pLib->parse_table[pLib->cur_parse_entry].path, |
| "State\\B%d\\FAX\\Paper Length", nr); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = &pFax->Paper_Length; |
| |
| sprintf(pLib->parse_table[pLib->cur_parse_entry].path, |
| "State\\B%d\\FAX\\Scanline Time", nr); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = &pFax->Scanline_Time; |
| |
| sprintf(pLib->parse_table[pLib->cur_parse_entry].path, |
| "State\\B%d\\FAX\\Disc Reason", nr); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = &pFax->Disc_Reason; |
| |
| pLib->fax_parse_entry_last[Channel] = pLib->cur_parse_entry - 1; |
| } |
| |
| static void diva_create_modem_parse_table(diva_strace_context_t *pLib, |
| int Channel) { |
| diva_trace_modem_state_t *pModem = &pLib->lines[Channel].modem; |
| int nr = Channel + 1; |
| |
| if ((pLib->cur_parse_entry + MODEM_PARSE_ENTRIES) >= pLib->parse_entries) { |
| diva_trace_error(pLib, -1, __FILE__, __LINE__); |
| return; |
| } |
| pModem->ChannelNumber = nr; |
| |
| pLib->modem_parse_entry_first[Channel] = pLib->cur_parse_entry; |
| |
| sprintf(pLib->parse_table[pLib->cur_parse_entry].path, |
| "State\\B%d\\Modem\\Event", nr); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->Event; |
| |
| sprintf(pLib->parse_table[pLib->cur_parse_entry].path, |
| "State\\B%d\\Modem\\Norm", nr); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->Norm; |
| |
| sprintf(pLib->parse_table[pLib->cur_parse_entry].path, |
| "State\\B%d\\Modem\\Options", nr); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->Options; |
| |
| sprintf(pLib->parse_table[pLib->cur_parse_entry].path, |
| "State\\B%d\\Modem\\TX Speed", nr); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->TxSpeed; |
| |
| sprintf(pLib->parse_table[pLib->cur_parse_entry].path, |
| "State\\B%d\\Modem\\RX Speed", nr); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->RxSpeed; |
| |
| sprintf(pLib->parse_table[pLib->cur_parse_entry].path, |
| "State\\B%d\\Modem\\Roundtrip ms", nr); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->RoundtripMsec; |
| |
| sprintf(pLib->parse_table[pLib->cur_parse_entry].path, |
| "State\\B%d\\Modem\\Symbol Rate", nr); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->SymbolRate; |
| |
| sprintf(pLib->parse_table[pLib->cur_parse_entry].path, |
| "State\\B%d\\Modem\\RX Level dBm", nr); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->RxLeveldBm; |
| |
| sprintf(pLib->parse_table[pLib->cur_parse_entry].path, |
| "State\\B%d\\Modem\\Echo Level dBm", nr); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->EchoLeveldBm; |
| |
| sprintf(pLib->parse_table[pLib->cur_parse_entry].path, |
| "State\\B%d\\Modem\\SNR dB", nr); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->SNRdb; |
| |
| sprintf(pLib->parse_table[pLib->cur_parse_entry].path, |
| "State\\B%d\\Modem\\MAE", nr); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->MAE; |
| |
| sprintf(pLib->parse_table[pLib->cur_parse_entry].path, |
| "State\\B%d\\Modem\\Local Retrains", nr); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->LocalRetrains; |
| |
| sprintf(pLib->parse_table[pLib->cur_parse_entry].path, |
| "State\\B%d\\Modem\\Remote Retrains", nr); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->RemoteRetrains; |
| |
| sprintf(pLib->parse_table[pLib->cur_parse_entry].path, |
| "State\\B%d\\Modem\\Local Resyncs", nr); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->LocalResyncs; |
| |
| sprintf(pLib->parse_table[pLib->cur_parse_entry].path, |
| "State\\B%d\\Modem\\Remote Resyncs", nr); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->RemoteResyncs; |
| |
| sprintf(pLib->parse_table[pLib->cur_parse_entry].path, |
| "State\\B%d\\Modem\\Disc Reason", nr); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->DiscReason; |
| |
| pLib->modem_parse_entry_last[Channel] = pLib->cur_parse_entry - 1; |
| } |
| |
| static void diva_create_parse_table(diva_strace_context_t *pLib) { |
| int i; |
| |
| for (i = 0; i < pLib->Channels; i++) { |
| diva_create_line_parse_table(pLib, i); |
| diva_create_modem_parse_table(pLib, i); |
| diva_create_fax_parse_table(pLib, i); |
| } |
| |
| pLib->statistic_parse_first = pLib->cur_parse_entry; |
| |
| /* |
| Outgoing Calls |
| */ |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\Outgoing Calls\\Calls"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.outg.Calls; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\Outgoing Calls\\Connected"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.outg.Connected; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\Outgoing Calls\\User Busy"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.outg.User_Busy; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\Outgoing Calls\\No Answer"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.outg.No_Answer; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\Outgoing Calls\\Wrong Number"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.outg.Wrong_Number; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\Outgoing Calls\\Call Rejected"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.outg.Call_Rejected; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\Outgoing Calls\\Other Failures"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.outg.Other_Failures; |
| |
| /* |
| Incoming Calls |
| */ |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\Incoming Calls\\Calls"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.inc.Calls; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\Incoming Calls\\Connected"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.inc.Connected; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\Incoming Calls\\User Busy"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.inc.User_Busy; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\Incoming Calls\\Call Rejected"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.inc.Call_Rejected; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\Incoming Calls\\Wrong Number"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.inc.Wrong_Number; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\Incoming Calls\\Incompatible Dst"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.inc.Incompatible_Dst; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\Incoming Calls\\Out of Order"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.inc.Out_of_Order; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\Incoming Calls\\Ignored"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.inc.Ignored; |
| |
| /* |
| Modem Statistics |
| */ |
| pLib->mdm_statistic_parse_first = pLib->cur_parse_entry; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\Modem\\Disc Normal"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.mdm.Disc_Normal; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\Modem\\Disc Unspecified"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.mdm.Disc_Unspecified; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\Modem\\Disc Busy Tone"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.mdm.Disc_Busy_Tone; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\Modem\\Disc Congestion"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.mdm.Disc_Congestion; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\Modem\\Disc Carr. Wait"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.mdm.Disc_Carr_Wait; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\Modem\\Disc Trn Timeout"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.mdm.Disc_Trn_Timeout; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\Modem\\Disc Incompat."); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.mdm.Disc_Incompat; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\Modem\\Disc Frame Rej."); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.mdm.Disc_Frame_Rej; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\Modem\\Disc V42bis"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.mdm.Disc_V42bis; |
| |
| pLib->mdm_statistic_parse_last = pLib->cur_parse_entry - 1; |
| |
| /* |
| Fax Statistics |
| */ |
| pLib->fax_statistic_parse_first = pLib->cur_parse_entry; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\FAX\\Disc Normal"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.fax.Disc_Normal; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\FAX\\Disc Not Ident."); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.fax.Disc_Not_Ident; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\FAX\\Disc No Response"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.fax.Disc_No_Response; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\FAX\\Disc Retries"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.fax.Disc_Retries; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\FAX\\Disc Unexp. Msg."); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.fax.Disc_Unexp_Msg; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\FAX\\Disc No Polling."); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.fax.Disc_No_Polling; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\FAX\\Disc Training"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.fax.Disc_Training; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\FAX\\Disc Unexpected"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.fax.Disc_Unexpected; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\FAX\\Disc Application"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.fax.Disc_Application; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\FAX\\Disc Incompat."); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.fax.Disc_Incompat; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\FAX\\Disc No Command"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.fax.Disc_No_Command; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\FAX\\Disc Long Msg"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.fax.Disc_Long_Msg; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\FAX\\Disc Supervisor"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.fax.Disc_Supervisor; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\FAX\\Disc SUB SEP PWD"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.fax.Disc_SUB_SEP_PWD; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\FAX\\Disc Invalid Msg"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.fax.Disc_Invalid_Msg; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\FAX\\Disc Page Coding"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.fax.Disc_Page_Coding; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\FAX\\Disc App Timeout"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.fax.Disc_App_Timeout; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\FAX\\Disc Unspecified"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.fax.Disc_Unspecified; |
| |
| pLib->fax_statistic_parse_last = pLib->cur_parse_entry - 1; |
| |
| /* |
| B-Layer1" |
| */ |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\B-Layer1\\X-Frames"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.b1.X_Frames; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\B-Layer1\\X-Bytes"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.b1.X_Bytes; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\B-Layer1\\X-Errors"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.b1.X_Errors; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\B-Layer1\\R-Frames"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.b1.R_Frames; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\B-Layer1\\R-Bytes"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.b1.R_Bytes; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\B-Layer1\\R-Errors"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.b1.R_Errors; |
| |
| /* |
| B-Layer2 |
| */ |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\B-Layer2\\X-Frames"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.b2.X_Frames; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\B-Layer2\\X-Bytes"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.b2.X_Bytes; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\B-Layer2\\X-Errors"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.b2.X_Errors; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\B-Layer2\\R-Frames"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.b2.R_Frames; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\B-Layer2\\R-Bytes"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.b2.R_Bytes; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\B-Layer2\\R-Errors"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.b2.R_Errors; |
| |
| /* |
| D-Layer1 |
| */ |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\D-Layer1\\X-Frames"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.d1.X_Frames; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\D-Layer1\\X-Bytes"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.d1.X_Bytes; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\D-Layer1\\X-Errors"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.d1.X_Errors; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\D-Layer1\\R-Frames"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.d1.R_Frames; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\D-Layer1\\R-Bytes"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.d1.R_Bytes; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\D-Layer1\\R-Errors"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.d1.R_Errors; |
| |
| /* |
| D-Layer2 |
| */ |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\D-Layer2\\X-Frames"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.d2.X_Frames; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\D-Layer2\\X-Bytes"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.d2.X_Bytes; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\D-Layer2\\X-Errors"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.d2.X_Errors; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\D-Layer2\\R-Frames"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.d2.R_Frames; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\D-Layer2\\R-Bytes"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.d2.R_Bytes; |
| |
| strcpy(pLib->parse_table[pLib->cur_parse_entry].path, |
| "Statistics\\D-Layer2\\R-Errors"); |
| pLib->parse_table[pLib->cur_parse_entry++].variable = \ |
| &pLib->InterfaceStat.d2.R_Errors; |
| |
| |
| pLib->statistic_parse_last = pLib->cur_parse_entry - 1; |
| } |
| |
| static void diva_trace_error(diva_strace_context_t *pLib, |
| int error, const char *file, int line) { |
| if (pLib->user_proc_table.error_notify_proc) { |
| (*(pLib->user_proc_table.error_notify_proc))(\ |
| pLib->user_proc_table.user_context, |
| &pLib->instance, pLib->Adapter, |
| error, file, line); |
| } |
| } |
| |
| /* |
| Delivery notification to user |
| */ |
| static void diva_trace_notify_user(diva_strace_context_t *pLib, |
| int Channel, |
| int notify_subject) { |
| if (pLib->user_proc_table.notify_proc) { |
| (*(pLib->user_proc_table.notify_proc))(pLib->user_proc_table.user_context, |
| &pLib->instance, |
| pLib->Adapter, |
| &pLib->lines[Channel], |
| notify_subject); |
| } |
| } |
| |
| /* |
| Read variable value to they destination based on the variable type |
| */ |
| static int diva_trace_read_variable(diva_man_var_header_t *pVar, |
| void *variable) { |
| switch (pVar->type) { |
| case 0x03: /* MI_ASCIIZ - syting */ |
| return (diva_strace_read_asz(pVar, (char *)variable)); |
| case 0x04: /* MI_ASCII - string */ |
| return (diva_strace_read_asc(pVar, (char *)variable)); |
| case 0x05: /* MI_NUMBER - counted sequence of bytes */ |
| return (diva_strace_read_ie(pVar, (diva_trace_ie_t *)variable)); |
| case 0x81: /* MI_INT - signed integer */ |
| return (diva_strace_read_int(pVar, (int *)variable)); |
| case 0x82: /* MI_UINT - unsigned integer */ |
| return (diva_strace_read_uint(pVar, (dword *)variable)); |
| case 0x83: /* MI_HINT - unsigned integer, hex representetion */ |
| return (diva_strace_read_uint(pVar, (dword *)variable)); |
| case 0x87: /* MI_BITFLD - unsigned integer, bit representation */ |
| return (diva_strace_read_uint(pVar, (dword *)variable)); |
| } |
| |
| /* |
| This type of variable is not handled, indicate error |
| Or one problem in management interface, or in application recodeing |
| table, or this application should handle it. |
| */ |
| return (-1); |
| } |
| |
| /* |
| Read signed integer to destination |
| */ |
| static int diva_strace_read_int(diva_man_var_header_t *pVar, int *var) { |
| byte *ptr = (char *)&pVar->path_length; |
| int value; |
| |
| ptr += (pVar->path_length + 1); |
| |
| switch (pVar->value_length) { |
| case 1: |
| value = *(char *)ptr; |
| break; |
| |
| case 2: |
| value = (short)GET_WORD(ptr); |
| break; |
| |
| case 4: |
| value = (int)GET_DWORD(ptr); |
| break; |
| |
| default: |
| return (-1); |
| } |
| |
| *var = value; |
| |
| return (0); |
| } |
| |
| static int diva_strace_read_uint(diva_man_var_header_t *pVar, dword *var) { |
| byte *ptr = (char *)&pVar->path_length; |
| dword value; |
| |
| ptr += (pVar->path_length + 1); |
| |
| switch (pVar->value_length) { |
| case 1: |
| value = (byte)(*ptr); |
| break; |
| |
| case 2: |
| value = (word)GET_WORD(ptr); |
| break; |
| |
| case 3: |
| value = (dword)GET_DWORD(ptr); |
| value &= 0x00ffffff; |
| break; |
| |
| case 4: |
| value = (dword)GET_DWORD(ptr); |
| break; |
| |
| default: |
| return (-1); |
| } |
| |
| *var = value; |
| |
| return (0); |
| } |
| |
| /* |
| Read zero terminated ASCII string |
| */ |
| static int diva_strace_read_asz(diva_man_var_header_t *pVar, char *var) { |
| char *ptr = (char *)&pVar->path_length; |
| int length; |
| |
| ptr += (pVar->path_length + 1); |
| |
| if (!(length = pVar->value_length)) { |
| length = strlen(ptr); |
| } |
| memcpy(var, ptr, length); |
| var[length] = 0; |
| |
| return (0); |
| } |
| |
| /* |
| Read counted (with leading length byte) ASCII string |
| */ |
| static int diva_strace_read_asc(diva_man_var_header_t *pVar, char *var) { |
| char *ptr = (char *)&pVar->path_length; |
| |
| ptr += (pVar->path_length + 1); |
| memcpy(var, ptr + 1, *ptr); |
| var[(int)*ptr] = 0; |
| |
| return (0); |
| } |
| |
| /* |
| Read one information element - i.e. one string of byte values with |
| one length byte in front |
| */ |
| static int diva_strace_read_ie(diva_man_var_header_t *pVar, |
| diva_trace_ie_t *var) { |
| char *ptr = (char *)&pVar->path_length; |
| |
| ptr += (pVar->path_length + 1); |
| |
| var->length = *ptr; |
| memcpy(&var->data[0], ptr + 1, *ptr); |
| |
| return (0); |
| } |
| |
| static int SuperTraceSetAudioTap(void *hLib, int Channel, int on) { |
| diva_strace_context_t *pLib = (diva_strace_context_t *)hLib; |
| |
| if ((Channel < 1) || (Channel > pLib->Channels)) { |
| return (-1); |
| } |
| Channel--; |
| |
| if (on) { |
| pLib->audio_tap_mask |= (1L << Channel); |
| } else { |
| pLib->audio_tap_mask &= ~(1L << Channel); |
| } |
| |
| /* |
| EYE patterns have TM_M_DATA set as additional |
| condition |
| */ |
| if (pLib->audio_tap_mask) { |
| pLib->trace_event_mask |= TM_M_DATA; |
| } else { |
| pLib->trace_event_mask &= ~TM_M_DATA; |
| } |
| |
| return (ScheduleNextTraceRequest(pLib)); |
| } |
| |
| static int SuperTraceSetBChannel(void *hLib, int Channel, int on) { |
| diva_strace_context_t *pLib = (diva_strace_context_t *)hLib; |
| |
| if ((Channel < 1) || (Channel > pLib->Channels)) { |
| return (-1); |
| } |
| Channel--; |
| |
| if (on) { |
| pLib->bchannel_trace_mask |= (1L << Channel); |
| } else { |
| pLib->bchannel_trace_mask &= ~(1L << Channel); |
| } |
| |
| return (ScheduleNextTraceRequest(pLib)); |
| } |
| |
| static int SuperTraceSetDChannel(void *hLib, int on) { |
| diva_strace_context_t *pLib = (diva_strace_context_t *)hLib; |
| |
| if (on) { |
| pLib->trace_event_mask |= (TM_D_CHAN | TM_C_COMM | TM_DL_ERR | TM_LAYER1); |
| } else { |
| pLib->trace_event_mask &= ~(TM_D_CHAN | TM_C_COMM | TM_DL_ERR | TM_LAYER1); |
| } |
| |
| return (ScheduleNextTraceRequest(pLib)); |
| } |
| |
| static int SuperTraceSetInfo(void *hLib, int on) { |
| diva_strace_context_t *pLib = (diva_strace_context_t *)hLib; |
| |
| if (on) { |
| pLib->trace_event_mask |= TM_STRING; |
| } else { |
| pLib->trace_event_mask &= ~TM_STRING; |
| } |
| |
| return (ScheduleNextTraceRequest(pLib)); |
| } |
| |
| static int SuperTraceClearCall(void *hLib, int Channel) { |
| diva_strace_context_t *pLib = (diva_strace_context_t *)hLib; |
| |
| if ((Channel < 1) || (Channel > pLib->Channels)) { |
| return (-1); |
| } |
| Channel--; |
| |
| pLib->clear_call_command |= (1L << Channel); |
| |
| return (ScheduleNextTraceRequest(pLib)); |
| } |
| |
| /* |
| Parse and update cumulative statistice |
| */ |
| static int diva_ifc_statistics(diva_strace_context_t *pLib, |
| diva_man_var_header_t *pVar) { |
| diva_man_var_header_t *cur; |
| int i, one_updated = 0, mdm_updated = 0, fax_updated = 0; |
| |
| for (i = pLib->statistic_parse_first; i <= pLib->statistic_parse_last; i++) { |
| if ((cur = find_var(pVar, pLib->parse_table[i].path))) { |
| if (diva_trace_read_variable(cur, pLib->parse_table[i].variable)) { |
| diva_trace_error(pLib, -3 , __FILE__, __LINE__); |
| return (-1); |
| } |
| one_updated = 1; |
| if ((i >= pLib->mdm_statistic_parse_first) && (i <= pLib->mdm_statistic_parse_last)) { |
| mdm_updated = 1; |
| } |
| if ((i >= pLib->fax_statistic_parse_first) && (i <= pLib->fax_statistic_parse_last)) { |
| fax_updated = 1; |
| } |
| } |
| } |
| |
| /* |
| We do not use first event to notify user - this is the event that is |
| generated as result of EVENT ON operation and is used only to initialize |
| internal variables of application |
| */ |
| if (mdm_updated) { |
| diva_trace_notify_user(pLib, 0, DIVA_SUPER_TRACE_NOTIFY_MDM_STAT_CHANGE); |
| } else if (fax_updated) { |
| diva_trace_notify_user(pLib, 0, DIVA_SUPER_TRACE_NOTIFY_FAX_STAT_CHANGE); |
| } else if (one_updated) { |
| diva_trace_notify_user(pLib, 0, DIVA_SUPER_TRACE_NOTIFY_STAT_CHANGE); |
| } |
| |
| return (one_updated ? 0 : -1); |
| } |
| |
| static int SuperTraceGetOutgoingCallStatistics(void *hLib) { |
| diva_strace_context_t *pLib = (diva_strace_context_t *)hLib; |
| pLib->outgoing_ifc_stats = 1; |
| return (ScheduleNextTraceRequest(pLib)); |
| } |
| |
| static int SuperTraceGetIncomingCallStatistics(void *hLib) { |
| diva_strace_context_t *pLib = (diva_strace_context_t *)hLib; |
| pLib->incoming_ifc_stats = 1; |
| return (ScheduleNextTraceRequest(pLib)); |
| } |
| |
| static int SuperTraceGetModemStatistics(void *hLib) { |
| diva_strace_context_t *pLib = (diva_strace_context_t *)hLib; |
| pLib->modem_ifc_stats = 1; |
| return (ScheduleNextTraceRequest(pLib)); |
| } |
| |
| static int SuperTraceGetFaxStatistics(void *hLib) { |
| diva_strace_context_t *pLib = (diva_strace_context_t *)hLib; |
| pLib->fax_ifc_stats = 1; |
| return (ScheduleNextTraceRequest(pLib)); |
| } |
| |
| static int SuperTraceGetBLayer1Statistics(void *hLib) { |
| diva_strace_context_t *pLib = (diva_strace_context_t *)hLib; |
| pLib->b1_ifc_stats = 1; |
| return (ScheduleNextTraceRequest(pLib)); |
| } |
| |
| static int SuperTraceGetBLayer2Statistics(void *hLib) { |
| diva_strace_context_t *pLib = (diva_strace_context_t *)hLib; |
| pLib->b2_ifc_stats = 1; |
| return (ScheduleNextTraceRequest(pLib)); |
| } |
| |
| static int SuperTraceGetDLayer1Statistics(void *hLib) { |
| diva_strace_context_t *pLib = (diva_strace_context_t *)hLib; |
| pLib->d1_ifc_stats = 1; |
| return (ScheduleNextTraceRequest(pLib)); |
| } |
| |
| static int SuperTraceGetDLayer2Statistics(void *hLib) { |
| diva_strace_context_t *pLib = (diva_strace_context_t *)hLib; |
| pLib->d2_ifc_stats = 1; |
| return (ScheduleNextTraceRequest(pLib)); |
| } |
| |
| dword DivaSTraceGetMemotyRequirement(int channels) { |
| dword parse_entries = (MODEM_PARSE_ENTRIES + FAX_PARSE_ENTRIES + \ |
| STAT_PARSE_ENTRIES + \ |
| LINE_PARSE_ENTRIES + 1) * channels; |
| return (sizeof(diva_strace_context_t) + \ |
| (parse_entries * sizeof(diva_strace_path2action_t))); |
| } |