3 Copyright (c) Eicon Networks, 2000.
5 This source file is supplied for the use with
6 Eicon Networks range of DIVA Server Adapters.
8 Eicon File Revision : 1.9
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2, or (at your option)
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
17 implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
33 extern void diva_mnt_internal_dprintf (dword drv_id, dword type, char* p, ...);
35 #define MODEM_PARSE_ENTRIES 16 /* amount of variables of interest */
36 #define FAX_PARSE_ENTRIES 12 /* amount of variables of interest */
37 #define LINE_PARSE_ENTRIES 15 /* amount of variables of interest */
38 #define STAT_PARSE_ENTRIES 70 /* amount of variables of interest */
43 static int DivaSTraceLibraryStart (void* hLib);
44 static int DivaSTraceLibraryStop (void* hLib);
45 static int SuperTraceLibraryFinit (void* hLib);
46 static void* SuperTraceGetHandle (void* hLib);
47 static int SuperTraceMessageInput (void* hLib);
48 static int SuperTraceSetAudioTap (void* hLib, int Channel, int on);
49 static int SuperTraceSetBChannel (void* hLib, int Channel, int on);
50 static int SuperTraceSetDChannel (void* hLib, int on);
51 static int SuperTraceSetInfo (void* hLib, int on);
52 static int SuperTraceClearCall (void* hLib, int Channel);
53 static int SuperTraceGetOutgoingCallStatistics (void* hLib);
54 static int SuperTraceGetIncomingCallStatistics (void* hLib);
55 static int SuperTraceGetModemStatistics (void* hLib);
56 static int SuperTraceGetFaxStatistics (void* hLib);
57 static int SuperTraceGetBLayer1Statistics (void* hLib);
58 static int SuperTraceGetBLayer2Statistics (void* hLib);
59 static int SuperTraceGetDLayer1Statistics (void* hLib);
60 static int SuperTraceGetDLayer2Statistics (void* hLib);
65 static int ScheduleNextTraceRequest (diva_strace_context_t* pLib);
66 static int process_idi_event (diva_strace_context_t* pLib,
67 diva_man_var_header_t* pVar);
68 static int process_idi_info (diva_strace_context_t* pLib,
69 diva_man_var_header_t* pVar);
70 static int diva_modem_event (diva_strace_context_t* pLib, int Channel);
71 static int diva_fax_event (diva_strace_context_t* pLib, int Channel);
72 static int diva_line_event (diva_strace_context_t* pLib, int Channel);
73 static int diva_modem_info (diva_strace_context_t* pLib,
75 diva_man_var_header_t* pVar);
76 static int diva_fax_info (diva_strace_context_t* pLib,
78 diva_man_var_header_t* pVar);
79 static int diva_line_info (diva_strace_context_t* pLib,
81 diva_man_var_header_t* pVar);
82 static int diva_ifc_statistics (diva_strace_context_t* pLib,
83 diva_man_var_header_t* pVar);
84 static diva_man_var_header_t* get_next_var (diva_man_var_header_t* pVar);
85 static diva_man_var_header_t* find_var (diva_man_var_header_t* pVar,
87 static int diva_strace_read_int (diva_man_var_header_t* pVar, int* var);
88 static int diva_strace_read_uint (diva_man_var_header_t* pVar, dword* var);
89 static int diva_strace_read_asz (diva_man_var_header_t* pVar, char* var);
90 static int diva_strace_read_asc (diva_man_var_header_t* pVar, char* var);
91 static int diva_strace_read_ie (diva_man_var_header_t* pVar,
92 diva_trace_ie_t* var);
93 static void diva_create_parse_table (diva_strace_context_t* pLib);
94 static void diva_trace_error (diva_strace_context_t* pLib,
95 int error, const char* file, int line);
96 static void diva_trace_notify_user (diva_strace_context_t* pLib,
99 static int diva_trace_read_variable (diva_man_var_header_t* pVar,
103 Initialize the library and return context
104 of the created trace object that will represent
108 diva_strace_library_interface_t* DivaSTraceLibraryCreateInstance (int Adapter,
109 const diva_trace_library_user_interface_t* user_proc,
111 diva_strace_context_t* pLib = (diva_strace_context_t*)pmem;
118 pmem += sizeof(*pLib);
119 memset(pLib, 0x00, sizeof(*pLib));
121 pLib->Adapter = Adapter;
124 Set up Library Interface
126 pLib->instance.hLib = pLib;
127 pLib->instance.DivaSTraceLibraryStart = DivaSTraceLibraryStart;
128 pLib->instance.DivaSTraceLibraryStop = DivaSTraceLibraryStop;
129 pLib->instance.DivaSTraceLibraryFinit = SuperTraceLibraryFinit;
130 pLib->instance.DivaSTraceMessageInput = SuperTraceMessageInput;
131 pLib->instance.DivaSTraceGetHandle = SuperTraceGetHandle;
132 pLib->instance.DivaSTraceSetAudioTap = SuperTraceSetAudioTap;
133 pLib->instance.DivaSTraceSetBChannel = SuperTraceSetBChannel;
134 pLib->instance.DivaSTraceSetDChannel = SuperTraceSetDChannel;
135 pLib->instance.DivaSTraceSetInfo = SuperTraceSetInfo;
136 pLib->instance.DivaSTraceGetOutgoingCallStatistics = \
137 SuperTraceGetOutgoingCallStatistics;
138 pLib->instance.DivaSTraceGetIncomingCallStatistics = \
139 SuperTraceGetIncomingCallStatistics;
140 pLib->instance.DivaSTraceGetModemStatistics = \
141 SuperTraceGetModemStatistics;
142 pLib->instance.DivaSTraceGetFaxStatistics = \
143 SuperTraceGetFaxStatistics;
144 pLib->instance.DivaSTraceGetBLayer1Statistics = \
145 SuperTraceGetBLayer1Statistics;
146 pLib->instance.DivaSTraceGetBLayer2Statistics = \
147 SuperTraceGetBLayer2Statistics;
148 pLib->instance.DivaSTraceGetDLayer1Statistics = \
149 SuperTraceGetDLayer1Statistics;
150 pLib->instance.DivaSTraceGetDLayer2Statistics = \
151 SuperTraceGetDLayer2Statistics;
152 pLib->instance.DivaSTraceClearCall = SuperTraceClearCall;
156 pLib->user_proc_table.user_context = user_proc->user_context;
157 pLib->user_proc_table.notify_proc = user_proc->notify_proc;
158 pLib->user_proc_table.trace_proc = user_proc->trace_proc;
159 pLib->user_proc_table.error_notify_proc = user_proc->error_notify_proc;
162 if (!(pLib->hAdapter = SuperTraceOpenAdapter (Adapter))) {
163 diva_mnt_internal_dprintf (0, DLI_ERR, "Can not open XDI adapter");
166 pLib->Channels = SuperTraceGetNumberOfChannels (pLib->hAdapter);
169 Calculate amount of parte table entites necessary to translate
170 information from all events of onterest
172 pLib->parse_entries = (MODEM_PARSE_ENTRIES + FAX_PARSE_ENTRIES + \
173 STAT_PARSE_ENTRIES + \
174 LINE_PARSE_ENTRIES + 1) * pLib->Channels;
175 pLib->parse_table = (diva_strace_path2action_t*)pmem;
177 for (i = 0; i < 30; i++) {
178 pLib->lines[i].pInterface = &pLib->Interface;
179 pLib->lines[i].pInterfaceStat = &pLib->InterfaceStat;
182 pLib->e.R = &pLib->RData;
185 pLib->rc_ok = ASSIGN_OK;
187 diva_create_parse_table (pLib);
189 return ((diva_strace_library_interface_t*)pLib);
192 static int DivaSTraceLibraryStart (void* hLib) {
193 diva_strace_context_t* pLib = (diva_strace_context_t*)hLib;
195 return (SuperTraceASSIGN (pLib->hAdapter, pLib->buffer));
200 Return (0) if was initiated or pending
201 Return (1) if removal is complete
203 static int DivaSTraceLibraryStop (void* hLib) {
204 diva_strace_context_t* pLib = (diva_strace_context_t*)hLib;
206 if (!pLib->e.Id) { /* Was never started/assigned */
210 switch (pLib->removal_state) {
212 pLib->removal_state = 1;
213 ScheduleNextTraceRequest(pLib);
223 static int SuperTraceLibraryFinit (void* hLib) {
224 diva_strace_context_t* pLib = (diva_strace_context_t*)hLib;
226 if (pLib->hAdapter) {
227 SuperTraceCloseAdapter (pLib->hAdapter);
234 static void* SuperTraceGetHandle (void* hLib) {
235 diva_strace_context_t* pLib = (diva_strace_context_t*)hLib;
241 After library handle object is gone in signaled state
242 this function should be called and will pick up incoming
243 IDI messages (return codes and indications).
245 static int SuperTraceMessageInput (void* hLib) {
246 diva_strace_context_t* pLib = (diva_strace_context_t*)hLib;
250 if (pLib->e.complete == 255) {
258 if (pLib->removal_state == 2) {
259 pLib->removal_state = 3;
263 if (Rc != pLib->rc_ok) {
266 Auto-detect amount of events/channels and features
268 if (pLib->general_b_ch_event == 1) {
269 pLib->general_b_ch_event = 2;
271 } else if (pLib->general_fax_event == 1) {
272 pLib->general_fax_event = 2;
274 } else if (pLib->general_mdm_event == 1) {
275 pLib->general_mdm_event = 2;
277 } else if ((pLib->ChannelsTraceActive < pLib->Channels) && pLib->ChannelsTraceActive) {
278 pLib->ChannelsTraceActive = pLib->Channels;
280 } else if (pLib->ModemTraceActive < pLib->Channels) {
281 pLib->ModemTraceActive = pLib->Channels;
283 } else if (pLib->FaxTraceActive < pLib->Channels) {
284 pLib->FaxTraceActive = pLib->Channels;
286 } else if (pLib->audio_trace_init == 2) {
288 pLib->audio_trace_init = 1;
289 } else if (pLib->eye_pattern_pending) {
290 pLib->eye_pattern_pending = 0;
292 } else if (pLib->audio_tap_pending) {
293 pLib->audio_tap_pending = 0;
298 return (-1); /* request failed */
301 if (pLib->general_b_ch_event == 1) {
302 pLib->ChannelsTraceActive = pLib->Channels;
303 pLib->general_b_ch_event = 2;
304 } else if (pLib->general_fax_event == 1) {
305 pLib->general_fax_event = 2;
306 pLib->FaxTraceActive = pLib->Channels;
307 } else if (pLib->general_mdm_event == 1) {
308 pLib->general_mdm_event = 2;
309 pLib->ModemTraceActive = pLib->Channels;
312 if (pLib->audio_trace_init == 2) {
313 pLib->audio_trace_init = 1;
315 pLib->rc_ok = 0xff; /* default OK after assign was done */
316 if ((ret = ScheduleNextTraceRequest(pLib))) {
322 Always 'RNR' indication if return code is pending
326 if (pLib->removal_state) {
329 } else if (pLib->req_busy) {
333 if (pLib->e.complete != 0x02) {
335 Look-ahead call, set up buffers
338 pLib->e.R->P = (byte*)&pLib->buffer[0];
339 pLib->e.R->PLength = (word)(sizeof(pLib->buffer) - 1);
343 Indication reception complete, process it now
345 byte* p = (byte*)&pLib->buffer[0];
346 pLib->buffer[pLib->e.R->PLength] = 0; /* terminate I.E. with zero */
349 case MAN_COMBI_IND: {
350 int total_length = pLib->e.R->PLength;
351 word this_ind_length;
353 while (total_length > 3 && *p) {
355 this_ind_length = (word)p[0] | ((word)p[1] << 8);
360 if (process_idi_info (pLib, (diva_man_var_header_t*)p)) {
365 if (process_idi_event (pLib, (diva_man_var_header_t*)p)) {
370 if (pLib->trace_on == 1) {
372 Ignore first trace event that is result of
378 Delivery XLOG buffer to application
380 if (pLib->user_proc_table.trace_proc) {
381 (*(pLib->user_proc_table.trace_proc))(pLib->user_proc_table.user_context,
382 &pLib->instance, pLib->Adapter,
388 diva_mnt_internal_dprintf (0, DLI_ERR, "Unknon IDI Ind (DMA mode): %02x", Ind);
390 p += (this_ind_length+1);
391 total_length -= (4 + this_ind_length);
395 if (process_idi_info (pLib, (diva_man_var_header_t*)p)) {
400 if (process_idi_event (pLib, (diva_man_var_header_t*)p)) {
405 if (pLib->trace_on == 1) {
407 Ignore first trace event that is result of
413 Delivery XLOG buffer to application
415 if (pLib->user_proc_table.trace_proc) {
416 (*(pLib->user_proc_table.trace_proc))(pLib->user_proc_table.user_context,
417 &pLib->instance, pLib->Adapter,
418 p, pLib->e.R->PLength);
423 diva_mnt_internal_dprintf (0, DLI_ERR, "Unknon IDI Ind: %02x", Ind);
429 if ((ret = ScheduleNextTraceRequest(pLib))) {
437 Internal state machine responsible for scheduling of requests
439 static int ScheduleNextTraceRequest (diva_strace_context_t* pLib) {
444 if (pLib->req_busy) {
448 if (pLib->removal_state == 1) {
449 if (SuperTraceREMOVE (pLib->hAdapter)) {
450 pLib->removal_state = 3;
453 pLib->removal_state = 2;
458 if (pLib->removal_state) {
462 if (!pLib->general_b_ch_event) {
463 if ((ret = SuperTraceTraceOnRequest(pLib->hAdapter, "State\\B Event", pLib->buffer))) {
466 pLib->general_b_ch_event = 1;
471 if (!pLib->general_fax_event) {
472 if ((ret = SuperTraceTraceOnRequest(pLib->hAdapter, "State\\FAX Event", pLib->buffer))) {
475 pLib->general_fax_event = 1;
480 if (!pLib->general_mdm_event) {
481 if ((ret = SuperTraceTraceOnRequest(pLib->hAdapter, "State\\Modem Event", pLib->buffer))) {
484 pLib->general_mdm_event = 1;
489 if (pLib->ChannelsTraceActive < pLib->Channels) {
490 pLib->ChannelsTraceActive++;
491 sprintf (name, "State\\B%d\\Line", pLib->ChannelsTraceActive);
492 if ((ret = SuperTraceTraceOnRequest(pLib->hAdapter, name, pLib->buffer))) {
493 pLib->ChannelsTraceActive--;
500 if (pLib->ModemTraceActive < pLib->Channels) {
501 pLib->ModemTraceActive++;
502 sprintf (name, "State\\B%d\\Modem\\Event", pLib->ModemTraceActive);
503 if ((ret = SuperTraceTraceOnRequest(pLib->hAdapter, name, pLib->buffer))) {
504 pLib->ModemTraceActive--;
511 if (pLib->FaxTraceActive < pLib->Channels) {
512 pLib->FaxTraceActive++;
513 sprintf (name, "State\\B%d\\FAX\\Event", pLib->FaxTraceActive);
514 if ((ret = SuperTraceTraceOnRequest(pLib->hAdapter, name, pLib->buffer))) {
515 pLib->FaxTraceActive--;
522 if (!pLib->trace_mask_init) {
524 if (SuperTraceWriteVar (pLib->hAdapter,
526 "Trace\\Event Enable",
528 0x87, /* MI_BITFLD */
532 pLib->trace_mask_init = 1;
537 if (!pLib->audio_trace_init) {
538 dword tmp = 0x00000000;
539 if (SuperTraceWriteVar (pLib->hAdapter,
541 "Trace\\AudioCh# Enable",
543 0x87, /* MI_BITFLD */
547 pLib->audio_trace_init = 2;
552 if (!pLib->bchannel_init) {
553 dword tmp = 0x00000000;
554 if (SuperTraceWriteVar (pLib->hAdapter,
556 "Trace\\B-Ch# Enable",
558 0x87, /* MI_BITFLD */
562 pLib->bchannel_init = 1;
567 if (!pLib->trace_length_init) {
569 if (SuperTraceWriteVar (pLib->hAdapter,
571 "Trace\\Max Log Length",
577 pLib->trace_length_init = 1;
582 if (!pLib->trace_on) {
583 if (SuperTraceTraceOnRequest (pLib->hAdapter,
593 if (pLib->trace_event_mask != pLib->current_trace_event_mask) {
594 if (SuperTraceWriteVar (pLib->hAdapter,
596 "Trace\\Event Enable",
597 &pLib->trace_event_mask,
598 0x87, /* MI_BITFLD */
599 sizeof(pLib->trace_event_mask))) {
602 pLib->current_trace_event_mask = pLib->trace_event_mask;
607 if ((pLib->audio_tap_pending >= 0) && (pLib->audio_tap_mask != pLib->current_audio_tap_mask)) {
608 if (SuperTraceWriteVar (pLib->hAdapter,
610 "Trace\\AudioCh# Enable",
611 &pLib->audio_tap_mask,
612 0x87, /* MI_BITFLD */
613 sizeof(pLib->audio_tap_mask))) {
616 pLib->current_audio_tap_mask = pLib->audio_tap_mask;
617 pLib->audio_tap_pending = 1;
622 if ((pLib->eye_pattern_pending >= 0) && (pLib->audio_tap_mask != pLib->current_eye_pattern_mask)) {
623 if (SuperTraceWriteVar (pLib->hAdapter,
625 "Trace\\EyeCh# Enable",
626 &pLib->audio_tap_mask,
627 0x87, /* MI_BITFLD */
628 sizeof(pLib->audio_tap_mask))) {
631 pLib->current_eye_pattern_mask = pLib->audio_tap_mask;
632 pLib->eye_pattern_pending = 1;
637 if (pLib->bchannel_trace_mask != pLib->current_bchannel_trace_mask) {
638 if (SuperTraceWriteVar (pLib->hAdapter,
640 "Trace\\B-Ch# Enable",
641 &pLib->bchannel_trace_mask,
642 0x87, /* MI_BITFLD */
643 sizeof(pLib->bchannel_trace_mask))) {
646 pLib->current_bchannel_trace_mask = pLib->bchannel_trace_mask;
651 if (!pLib->trace_events_down) {
652 if (SuperTraceTraceOnRequest (pLib->hAdapter,
657 pLib->trace_events_down = 1;
662 if (!pLib->l1_trace) {
663 if (SuperTraceTraceOnRequest (pLib->hAdapter,
673 if (!pLib->l2_trace) {
674 if (SuperTraceTraceOnRequest (pLib->hAdapter,
684 for (i = 0; i < 30; i++) {
685 if (pLib->pending_line_status & (1L << i)) {
686 sprintf (name, "State\\B%d", i+1);
687 if (SuperTraceReadRequest (pLib->hAdapter, name, pLib->buffer)) {
690 pLib->pending_line_status &= ~(1L << i);
694 if (pLib->pending_modem_status & (1L << i)) {
695 sprintf (name, "State\\B%d\\Modem", i+1);
696 if (SuperTraceReadRequest (pLib->hAdapter, name, pLib->buffer)) {
699 pLib->pending_modem_status &= ~(1L << i);
703 if (pLib->pending_fax_status & (1L << i)) {
704 sprintf (name, "State\\B%d\\FAX", i+1);
705 if (SuperTraceReadRequest (pLib->hAdapter, name, pLib->buffer)) {
708 pLib->pending_fax_status &= ~(1L << i);
712 if (pLib->clear_call_command & (1L << i)) {
713 sprintf (name, "State\\B%d\\Clear Call", i+1);
714 if (SuperTraceExecuteRequest (pLib->hAdapter, name, pLib->buffer)) {
717 pLib->clear_call_command &= ~(1L << i);
723 if (pLib->outgoing_ifc_stats) {
724 if (SuperTraceReadRequest (pLib->hAdapter,
725 "Statistics\\Outgoing Calls",
729 pLib->outgoing_ifc_stats = 0;
734 if (pLib->incoming_ifc_stats) {
735 if (SuperTraceReadRequest (pLib->hAdapter,
736 "Statistics\\Incoming Calls",
740 pLib->incoming_ifc_stats = 0;
745 if (pLib->modem_ifc_stats) {
746 if (SuperTraceReadRequest (pLib->hAdapter,
751 pLib->modem_ifc_stats = 0;
756 if (pLib->fax_ifc_stats) {
757 if (SuperTraceReadRequest (pLib->hAdapter,
762 pLib->fax_ifc_stats = 0;
767 if (pLib->b1_ifc_stats) {
768 if (SuperTraceReadRequest (pLib->hAdapter,
769 "Statistics\\B-Layer1",
773 pLib->b1_ifc_stats = 0;
778 if (pLib->b2_ifc_stats) {
779 if (SuperTraceReadRequest (pLib->hAdapter,
780 "Statistics\\B-Layer2",
784 pLib->b2_ifc_stats = 0;
789 if (pLib->d1_ifc_stats) {
790 if (SuperTraceReadRequest (pLib->hAdapter,
791 "Statistics\\D-Layer1",
795 pLib->d1_ifc_stats = 0;
800 if (pLib->d2_ifc_stats) {
801 if (SuperTraceReadRequest (pLib->hAdapter,
802 "Statistics\\D-Layer2",
806 pLib->d2_ifc_stats = 0;
811 if (!pLib->IncomingCallsCallsActive) {
812 pLib->IncomingCallsCallsActive = 1;
813 sprintf (name, "%s", "Statistics\\Incoming Calls\\Calls");
814 if ((ret = SuperTraceTraceOnRequest(pLib->hAdapter, name, pLib->buffer))) {
815 pLib->IncomingCallsCallsActive = 0;
821 if (!pLib->IncomingCallsConnectedActive) {
822 pLib->IncomingCallsConnectedActive = 1;
823 sprintf (name, "%s", "Statistics\\Incoming Calls\\Connected");
824 if ((ret = SuperTraceTraceOnRequest(pLib->hAdapter, name, pLib->buffer))) {
825 pLib->IncomingCallsConnectedActive = 0;
831 if (!pLib->OutgoingCallsCallsActive) {
832 pLib->OutgoingCallsCallsActive = 1;
833 sprintf (name, "%s", "Statistics\\Outgoing Calls\\Calls");
834 if ((ret = SuperTraceTraceOnRequest(pLib->hAdapter, name, pLib->buffer))) {
835 pLib->OutgoingCallsCallsActive = 0;
841 if (!pLib->OutgoingCallsConnectedActive) {
842 pLib->OutgoingCallsConnectedActive = 1;
843 sprintf (name, "%s", "Statistics\\Outgoing Calls\\Connected");
844 if ((ret = SuperTraceTraceOnRequest(pLib->hAdapter, name, pLib->buffer))) {
845 pLib->OutgoingCallsConnectedActive = 0;
855 static int process_idi_event (diva_strace_context_t* pLib,
856 diva_man_var_header_t* pVar) {
857 const char* path = (char*)&pVar->path_length+1;
861 if (!strncmp("State\\B Event", path, pVar->path_length)) {
863 if (!diva_trace_read_variable (pVar, &ch_id)) {
864 if (!pLib->line_init_event && !pLib->pending_line_status) {
865 for (i = 1; i <= pLib->Channels; i++) {
866 diva_line_event(pLib, i);
869 } else if (ch_id && ch_id <= pLib->Channels) {
870 return (diva_line_event(pLib, (int)ch_id));
877 if (!strncmp("State\\FAX Event", path, pVar->path_length)) {
879 if (!diva_trace_read_variable (pVar, &ch_id)) {
880 if (!pLib->pending_fax_status && !pLib->fax_init_event) {
881 for (i = 1; i <= pLib->Channels; i++) {
882 diva_fax_event(pLib, i);
885 } else if (ch_id && ch_id <= pLib->Channels) {
886 return (diva_fax_event(pLib, (int)ch_id));
893 if (!strncmp("State\\Modem Event", path, pVar->path_length)) {
895 if (!diva_trace_read_variable (pVar, &ch_id)) {
896 if (!pLib->pending_modem_status && !pLib->modem_init_event) {
897 for (i = 1; i <= pLib->Channels; i++) {
898 diva_modem_event(pLib, i);
901 } else if (ch_id && ch_id <= pLib->Channels) {
902 return (diva_modem_event(pLib, (int)ch_id));
910 First look for Line Event
912 for (i = 1; i <= pLib->Channels; i++) {
913 sprintf (name, "State\\B%d\\Line", i);
914 if (find_var (pVar, name)) {
915 return (diva_line_event(pLib, i));
920 Look for Moden Progress Event
922 for (i = 1; i <= pLib->Channels; i++) {
923 sprintf (name, "State\\B%d\\Modem\\Event", i);
924 if (find_var (pVar, name)) {
925 return (diva_modem_event (pLib, i));
932 for (i = 1; i <= pLib->Channels; i++) {
933 sprintf (name, "State\\B%d\\FAX\\Event", i);
934 if (find_var (pVar, name)) {
935 return (diva_fax_event (pLib, i));
940 Notification about loss of events
942 if (!strncmp("Events Down", path, pVar->path_length)) {
943 if (pLib->trace_events_down == 1) {
944 pLib->trace_events_down = 2;
946 diva_trace_error (pLib, 1, "Events Down", 0);
951 if (!strncmp("State\\Layer1", path, pVar->path_length)) {
952 diva_strace_read_asz (pVar, &pLib->lines[0].pInterface->Layer1[0]);
953 if (pLib->l1_trace == 1) {
956 diva_trace_notify_user (pLib, 0, DIVA_SUPER_TRACE_INTERFACE_CHANGE);
960 if (!strncmp("State\\Layer2 No1", path, pVar->path_length)) {
961 char* tmp = &pLib->lines[0].pInterface->Layer2[0];
963 diva_strace_read_uint (pVar, &l2_state);
967 strcpy (tmp, "Idle");
970 strcpy (tmp, "Layer2 UP");
973 strcpy (tmp, "Layer2 Disconnecting");
976 strcpy (tmp, "Layer2 Connecting");
979 strcpy (tmp, "SPID Initializing");
982 strcpy (tmp, "SPID Initialised");
985 strcpy (tmp, "Layer2 Connecting");
989 strcpy (tmp, "Auto SPID Stopped");
993 strcpy (tmp, "Auto SPID Idle");
997 strcpy (tmp, "Auto SPID Requested");
1001 strcpy (tmp, "Auto SPID Delivery");
1005 strcpy (tmp, "Auto SPID Complete");
1009 sprintf (tmp, "U:%d", (int)l2_state);
1011 if (pLib->l2_trace == 1) {
1014 diva_trace_notify_user (pLib, 0, DIVA_SUPER_TRACE_INTERFACE_CHANGE);
1019 if (!strncmp("Statistics\\Incoming Calls\\Calls", path, pVar->path_length) ||
1020 !strncmp("Statistics\\Incoming Calls\\Connected", path, pVar->path_length)) {
1021 return (SuperTraceGetIncomingCallStatistics (pLib));
1024 if (!strncmp("Statistics\\Outgoing Calls\\Calls", path, pVar->path_length) ||
1025 !strncmp("Statistics\\Outgoing Calls\\Connected", path, pVar->path_length)) {
1026 return (SuperTraceGetOutgoingCallStatistics (pLib));
1032 static int diva_line_event (diva_strace_context_t* pLib, int Channel) {
1033 pLib->pending_line_status |= (1L << (Channel-1));
1037 static int diva_modem_event (diva_strace_context_t* pLib, int Channel) {
1038 pLib->pending_modem_status |= (1L << (Channel-1));
1042 static int diva_fax_event (diva_strace_context_t* pLib, int Channel) {
1043 pLib->pending_fax_status |= (1L << (Channel-1));
1048 Process INFO indications that arrive from the card
1049 Uses path of first I.E. to detect the source of the
1052 static int process_idi_info (diva_strace_context_t* pLib,
1053 diva_man_var_header_t* pVar) {
1054 const char* path = (char*)&pVar->path_length+1;
1059 First look for Modem Status Info
1061 for (i = pLib->Channels; i > 0; i--) {
1062 len = sprintf (name, "State\\B%d\\Modem", i);
1063 if (!strncmp(name, path, len)) {
1064 return (diva_modem_info (pLib, i, pVar));
1069 Look for Fax Status Info
1071 for (i = pLib->Channels; i > 0; i--) {
1072 len = sprintf (name, "State\\B%d\\FAX", i);
1073 if (!strncmp(name, path, len)) {
1074 return (diva_fax_info (pLib, i, pVar));
1079 Look for Line Status Info
1081 for (i = pLib->Channels; i > 0; i--) {
1082 len = sprintf (name, "State\\B%d", i);
1083 if (!strncmp(name, path, len)) {
1084 return (diva_line_info (pLib, i, pVar));
1088 if (!diva_ifc_statistics (pLib, pVar)) {
1096 MODEM INSTANCE STATE UPDATE
1098 Update Modem Status Information and issue notification to user,
1099 that will inform about change in the state of modem instance, that is
1100 associuated with this channel
1102 static int diva_modem_info (diva_strace_context_t* pLib,
1104 diva_man_var_header_t* pVar) {
1105 diva_man_var_header_t* cur;
1106 int i, nr = Channel - 1;
1108 for (i = pLib->modem_parse_entry_first[nr];
1109 i <= pLib->modem_parse_entry_last[nr]; i++) {
1110 if ((cur = find_var (pVar, pLib->parse_table[i].path))) {
1111 if (diva_trace_read_variable (cur, pLib->parse_table[i].variable)) {
1112 diva_trace_error (pLib, -3 , __FILE__, __LINE__);
1116 diva_trace_error (pLib, -2 , __FILE__, __LINE__);
1122 We do not use first event to notify user - this is the event that is
1123 generated as result of EVENT ON operation and is used only to initialize
1124 internal variables of application
1126 if (pLib->modem_init_event & (1L << nr)) {
1127 diva_trace_notify_user (pLib, nr, DIVA_SUPER_TRACE_NOTIFY_MODEM_CHANGE);
1129 pLib->modem_init_event |= (1L << nr);
1135 static int diva_fax_info (diva_strace_context_t* pLib,
1137 diva_man_var_header_t* pVar) {
1138 diva_man_var_header_t* cur;
1139 int i, nr = Channel - 1;
1141 for (i = pLib->fax_parse_entry_first[nr];
1142 i <= pLib->fax_parse_entry_last[nr]; i++) {
1143 if ((cur = find_var (pVar, pLib->parse_table[i].path))) {
1144 if (diva_trace_read_variable (cur, pLib->parse_table[i].variable)) {
1145 diva_trace_error (pLib, -3 , __FILE__, __LINE__);
1149 diva_trace_error (pLib, -2 , __FILE__, __LINE__);
1155 We do not use first event to notify user - this is the event that is
1156 generated as result of EVENT ON operation and is used only to initialize
1157 internal variables of application
1159 if (pLib->fax_init_event & (1L << nr)) {
1160 diva_trace_notify_user (pLib, nr, DIVA_SUPER_TRACE_NOTIFY_FAX_CHANGE);
1162 pLib->fax_init_event |= (1L << nr);
1170 Update Line Status Information and issue notification to user,
1171 that will inform about change in the line state.
1173 static int diva_line_info (diva_strace_context_t* pLib,
1175 diva_man_var_header_t* pVar) {
1176 diva_man_var_header_t* cur;
1177 int i, nr = Channel - 1;
1179 for (i = pLib->line_parse_entry_first[nr];
1180 i <= pLib->line_parse_entry_last[nr]; i++) {
1181 if ((cur = find_var (pVar, pLib->parse_table[i].path))) {
1182 if (diva_trace_read_variable (cur, pLib->parse_table[i].variable)) {
1183 diva_trace_error (pLib, -3 , __FILE__, __LINE__);
1187 diva_trace_error (pLib, -2 , __FILE__, __LINE__);
1193 We do not use first event to notify user - this is the event that is
1194 generated as result of EVENT ON operation and is used only to initialize
1195 internal variables of application
1197 Exception is is if the line is "online". In this case we have to notify
1198 user about this confition.
1200 if (pLib->line_init_event & (1L << nr)) {
1201 diva_trace_notify_user (pLib, nr, DIVA_SUPER_TRACE_NOTIFY_LINE_CHANGE);
1203 pLib->line_init_event |= (1L << nr);
1204 if (strcmp (&pLib->lines[nr].Line[0], "Idle")) {
1205 diva_trace_notify_user (pLib, nr, DIVA_SUPER_TRACE_NOTIFY_LINE_CHANGE);
1213 Move position to next vatianle in the chain
1215 static diva_man_var_header_t* get_next_var (diva_man_var_header_t* pVar) {
1216 byte* msg = (byte*)pVar;
1220 if (*msg != ESC) return NULL;
1223 msg_length = *(msg+1);
1224 msg = (start+msg_length);
1226 if (*msg != ESC) return NULL;
1228 return ((diva_man_var_header_t*)msg);
1232 Move position to variable with given name
1234 static diva_man_var_header_t* find_var (diva_man_var_header_t* pVar,
1239 path = (char*)&pVar->path_length+1;
1241 if (!strncmp (name, path, pVar->path_length)) {
1244 } while ((pVar = get_next_var (pVar)));
1249 static void diva_create_line_parse_table (diva_strace_context_t* pLib,
1251 diva_trace_line_state_t* pLine = &pLib->lines[Channel];
1254 if ((pLib->cur_parse_entry + LINE_PARSE_ENTRIES) >= pLib->parse_entries) {
1255 diva_trace_error (pLib, -1, __FILE__, __LINE__);
1259 pLine->ChannelNumber = nr;
1261 pLib->line_parse_entry_first[Channel] = pLib->cur_parse_entry;
1263 sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
1264 "State\\B%d\\Framing", nr);
1265 pLib->parse_table[pLib->cur_parse_entry++].variable = &pLine->Framing[0];
1267 sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
1268 "State\\B%d\\Line", nr);
1269 pLib->parse_table[pLib->cur_parse_entry++].variable = &pLine->Line[0];
1271 sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
1272 "State\\B%d\\Layer2", nr);
1273 pLib->parse_table[pLib->cur_parse_entry++].variable = &pLine->Layer2[0];
1275 sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
1276 "State\\B%d\\Layer3", nr);
1277 pLib->parse_table[pLib->cur_parse_entry++].variable = &pLine->Layer3[0];
1279 sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
1280 "State\\B%d\\Remote Address", nr);
1281 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1282 &pLine->RemoteAddress[0];
1284 sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
1285 "State\\B%d\\Remote SubAddr", nr);
1286 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1287 &pLine->RemoteSubAddress[0];
1289 sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
1290 "State\\B%d\\Local Address", nr);
1291 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1292 &pLine->LocalAddress[0];
1294 sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
1295 "State\\B%d\\Local SubAddr", nr);
1296 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1297 &pLine->LocalSubAddress[0];
1299 sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
1300 "State\\B%d\\BC", nr);
1301 pLib->parse_table[pLib->cur_parse_entry++].variable = &pLine->call_BC;
1303 sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
1304 "State\\B%d\\HLC", nr);
1305 pLib->parse_table[pLib->cur_parse_entry++].variable = &pLine->call_HLC;
1307 sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
1308 "State\\B%d\\LLC", nr);
1309 pLib->parse_table[pLib->cur_parse_entry++].variable = &pLine->call_LLC;
1311 sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
1312 "State\\B%d\\Charges", nr);
1313 pLib->parse_table[pLib->cur_parse_entry++].variable = &pLine->Charges;
1315 sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
1316 "State\\B%d\\Call Reference", nr);
1317 pLib->parse_table[pLib->cur_parse_entry++].variable = &pLine->CallReference;
1319 sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
1320 "State\\B%d\\Last Disc Cause", nr);
1321 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1322 &pLine->LastDisconnecCause;
1324 sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
1325 "State\\B%d\\User ID", nr);
1326 pLib->parse_table[pLib->cur_parse_entry++].variable = &pLine->UserID[0];
1328 pLib->line_parse_entry_last[Channel] = pLib->cur_parse_entry - 1;
1331 static void diva_create_fax_parse_table (diva_strace_context_t* pLib,
1333 diva_trace_fax_state_t* pFax = &pLib->lines[Channel].fax;
1336 if ((pLib->cur_parse_entry + FAX_PARSE_ENTRIES) >= pLib->parse_entries) {
1337 diva_trace_error (pLib, -1, __FILE__, __LINE__);
1340 pFax->ChannelNumber = nr;
1342 pLib->fax_parse_entry_first[Channel] = pLib->cur_parse_entry;
1344 sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
1345 "State\\B%d\\FAX\\Event", nr);
1346 pLib->parse_table[pLib->cur_parse_entry++].variable = &pFax->Event;
1348 sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
1349 "State\\B%d\\FAX\\Page Counter", nr);
1350 pLib->parse_table[pLib->cur_parse_entry++].variable = &pFax->Page_Counter;
1352 sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
1353 "State\\B%d\\FAX\\Features", nr);
1354 pLib->parse_table[pLib->cur_parse_entry++].variable = &pFax->Features;
1356 sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
1357 "State\\B%d\\FAX\\Station ID", nr);
1358 pLib->parse_table[pLib->cur_parse_entry++].variable = &pFax->Station_ID[0];
1360 sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
1361 "State\\B%d\\FAX\\Subaddress", nr);
1362 pLib->parse_table[pLib->cur_parse_entry++].variable = &pFax->Subaddress[0];
1364 sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
1365 "State\\B%d\\FAX\\Password", nr);
1366 pLib->parse_table[pLib->cur_parse_entry++].variable = &pFax->Password[0];
1368 sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
1369 "State\\B%d\\FAX\\Speed", nr);
1370 pLib->parse_table[pLib->cur_parse_entry++].variable = &pFax->Speed;
1372 sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
1373 "State\\B%d\\FAX\\Resolution", nr);
1374 pLib->parse_table[pLib->cur_parse_entry++].variable = &pFax->Resolution;
1376 sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
1377 "State\\B%d\\FAX\\Paper Width", nr);
1378 pLib->parse_table[pLib->cur_parse_entry++].variable = &pFax->Paper_Width;
1380 sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
1381 "State\\B%d\\FAX\\Paper Length", nr);
1382 pLib->parse_table[pLib->cur_parse_entry++].variable = &pFax->Paper_Length;
1384 sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
1385 "State\\B%d\\FAX\\Scanline Time", nr);
1386 pLib->parse_table[pLib->cur_parse_entry++].variable = &pFax->Scanline_Time;
1388 sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
1389 "State\\B%d\\FAX\\Disc Reason", nr);
1390 pLib->parse_table[pLib->cur_parse_entry++].variable = &pFax->Disc_Reason;
1392 pLib->fax_parse_entry_last[Channel] = pLib->cur_parse_entry - 1;
1395 static void diva_create_modem_parse_table (diva_strace_context_t* pLib,
1397 diva_trace_modem_state_t* pModem = &pLib->lines[Channel].modem;
1400 if ((pLib->cur_parse_entry + MODEM_PARSE_ENTRIES) >= pLib->parse_entries) {
1401 diva_trace_error (pLib, -1, __FILE__, __LINE__);
1404 pModem->ChannelNumber = nr;
1406 pLib->modem_parse_entry_first[Channel] = pLib->cur_parse_entry;
1408 sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
1409 "State\\B%d\\Modem\\Event", nr);
1410 pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->Event;
1412 sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
1413 "State\\B%d\\Modem\\Norm", nr);
1414 pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->Norm;
1416 sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
1417 "State\\B%d\\Modem\\Options", nr);
1418 pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->Options;
1420 sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
1421 "State\\B%d\\Modem\\TX Speed", nr);
1422 pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->TxSpeed;
1424 sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
1425 "State\\B%d\\Modem\\RX Speed", nr);
1426 pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->RxSpeed;
1428 sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
1429 "State\\B%d\\Modem\\Roundtrip ms", nr);
1430 pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->RoundtripMsec;
1432 sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
1433 "State\\B%d\\Modem\\Symbol Rate", nr);
1434 pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->SymbolRate;
1436 sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
1437 "State\\B%d\\Modem\\RX Level dBm", nr);
1438 pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->RxLeveldBm;
1440 sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
1441 "State\\B%d\\Modem\\Echo Level dBm", nr);
1442 pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->EchoLeveldBm;
1444 sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
1445 "State\\B%d\\Modem\\SNR dB", nr);
1446 pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->SNRdb;
1448 sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
1449 "State\\B%d\\Modem\\MAE", nr);
1450 pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->MAE;
1452 sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
1453 "State\\B%d\\Modem\\Local Retrains", nr);
1454 pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->LocalRetrains;
1456 sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
1457 "State\\B%d\\Modem\\Remote Retrains", nr);
1458 pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->RemoteRetrains;
1460 sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
1461 "State\\B%d\\Modem\\Local Resyncs", nr);
1462 pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->LocalResyncs;
1464 sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
1465 "State\\B%d\\Modem\\Remote Resyncs", nr);
1466 pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->RemoteResyncs;
1468 sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
1469 "State\\B%d\\Modem\\Disc Reason", nr);
1470 pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->DiscReason;
1472 pLib->modem_parse_entry_last[Channel] = pLib->cur_parse_entry - 1;
1475 static void diva_create_parse_table (diva_strace_context_t* pLib) {
1478 for (i = 0; i < pLib->Channels; i++) {
1479 diva_create_line_parse_table (pLib, i);
1480 diva_create_modem_parse_table (pLib, i);
1481 diva_create_fax_parse_table (pLib, i);
1484 pLib->statistic_parse_first = pLib->cur_parse_entry;
1489 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1490 "Statistics\\Outgoing Calls\\Calls");
1491 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1492 &pLib->InterfaceStat.outg.Calls;
1494 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1495 "Statistics\\Outgoing Calls\\Connected");
1496 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1497 &pLib->InterfaceStat.outg.Connected;
1499 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1500 "Statistics\\Outgoing Calls\\User Busy");
1501 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1502 &pLib->InterfaceStat.outg.User_Busy;
1504 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1505 "Statistics\\Outgoing Calls\\No Answer");
1506 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1507 &pLib->InterfaceStat.outg.No_Answer;
1509 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1510 "Statistics\\Outgoing Calls\\Wrong Number");
1511 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1512 &pLib->InterfaceStat.outg.Wrong_Number;
1514 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1515 "Statistics\\Outgoing Calls\\Call Rejected");
1516 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1517 &pLib->InterfaceStat.outg.Call_Rejected;
1519 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1520 "Statistics\\Outgoing Calls\\Other Failures");
1521 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1522 &pLib->InterfaceStat.outg.Other_Failures;
1527 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1528 "Statistics\\Incoming Calls\\Calls");
1529 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1530 &pLib->InterfaceStat.inc.Calls;
1532 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1533 "Statistics\\Incoming Calls\\Connected");
1534 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1535 &pLib->InterfaceStat.inc.Connected;
1537 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1538 "Statistics\\Incoming Calls\\User Busy");
1539 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1540 &pLib->InterfaceStat.inc.User_Busy;
1542 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1543 "Statistics\\Incoming Calls\\Call Rejected");
1544 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1545 &pLib->InterfaceStat.inc.Call_Rejected;
1547 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1548 "Statistics\\Incoming Calls\\Wrong Number");
1549 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1550 &pLib->InterfaceStat.inc.Wrong_Number;
1552 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1553 "Statistics\\Incoming Calls\\Incompatible Dst");
1554 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1555 &pLib->InterfaceStat.inc.Incompatible_Dst;
1557 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1558 "Statistics\\Incoming Calls\\Out of Order");
1559 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1560 &pLib->InterfaceStat.inc.Out_of_Order;
1562 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1563 "Statistics\\Incoming Calls\\Ignored");
1564 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1565 &pLib->InterfaceStat.inc.Ignored;
1570 pLib->mdm_statistic_parse_first = pLib->cur_parse_entry;
1572 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1573 "Statistics\\Modem\\Disc Normal");
1574 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1575 &pLib->InterfaceStat.mdm.Disc_Normal;
1577 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1578 "Statistics\\Modem\\Disc Unspecified");
1579 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1580 &pLib->InterfaceStat.mdm.Disc_Unspecified;
1582 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1583 "Statistics\\Modem\\Disc Busy Tone");
1584 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1585 &pLib->InterfaceStat.mdm.Disc_Busy_Tone;
1587 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1588 "Statistics\\Modem\\Disc Congestion");
1589 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1590 &pLib->InterfaceStat.mdm.Disc_Congestion;
1592 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1593 "Statistics\\Modem\\Disc Carr. Wait");
1594 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1595 &pLib->InterfaceStat.mdm.Disc_Carr_Wait;
1597 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1598 "Statistics\\Modem\\Disc Trn Timeout");
1599 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1600 &pLib->InterfaceStat.mdm.Disc_Trn_Timeout;
1602 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1603 "Statistics\\Modem\\Disc Incompat.");
1604 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1605 &pLib->InterfaceStat.mdm.Disc_Incompat;
1607 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1608 "Statistics\\Modem\\Disc Frame Rej.");
1609 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1610 &pLib->InterfaceStat.mdm.Disc_Frame_Rej;
1612 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1613 "Statistics\\Modem\\Disc V42bis");
1614 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1615 &pLib->InterfaceStat.mdm.Disc_V42bis;
1617 pLib->mdm_statistic_parse_last = pLib->cur_parse_entry - 1;
1622 pLib->fax_statistic_parse_first = pLib->cur_parse_entry;
1624 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1625 "Statistics\\FAX\\Disc Normal");
1626 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1627 &pLib->InterfaceStat.fax.Disc_Normal;
1629 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1630 "Statistics\\FAX\\Disc Not Ident.");
1631 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1632 &pLib->InterfaceStat.fax.Disc_Not_Ident;
1634 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1635 "Statistics\\FAX\\Disc No Response");
1636 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1637 &pLib->InterfaceStat.fax.Disc_No_Response;
1639 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1640 "Statistics\\FAX\\Disc Retries");
1641 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1642 &pLib->InterfaceStat.fax.Disc_Retries;
1644 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1645 "Statistics\\FAX\\Disc Unexp. Msg.");
1646 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1647 &pLib->InterfaceStat.fax.Disc_Unexp_Msg;
1649 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1650 "Statistics\\FAX\\Disc No Polling.");
1651 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1652 &pLib->InterfaceStat.fax.Disc_No_Polling;
1654 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1655 "Statistics\\FAX\\Disc Training");
1656 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1657 &pLib->InterfaceStat.fax.Disc_Training;
1659 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1660 "Statistics\\FAX\\Disc Unexpected");
1661 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1662 &pLib->InterfaceStat.fax.Disc_Unexpected;
1664 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1665 "Statistics\\FAX\\Disc Application");
1666 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1667 &pLib->InterfaceStat.fax.Disc_Application;
1669 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1670 "Statistics\\FAX\\Disc Incompat.");
1671 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1672 &pLib->InterfaceStat.fax.Disc_Incompat;
1674 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1675 "Statistics\\FAX\\Disc No Command");
1676 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1677 &pLib->InterfaceStat.fax.Disc_No_Command;
1679 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1680 "Statistics\\FAX\\Disc Long Msg");
1681 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1682 &pLib->InterfaceStat.fax.Disc_Long_Msg;
1684 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1685 "Statistics\\FAX\\Disc Supervisor");
1686 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1687 &pLib->InterfaceStat.fax.Disc_Supervisor;
1689 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1690 "Statistics\\FAX\\Disc SUB SEP PWD");
1691 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1692 &pLib->InterfaceStat.fax.Disc_SUB_SEP_PWD;
1694 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1695 "Statistics\\FAX\\Disc Invalid Msg");
1696 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1697 &pLib->InterfaceStat.fax.Disc_Invalid_Msg;
1699 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1700 "Statistics\\FAX\\Disc Page Coding");
1701 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1702 &pLib->InterfaceStat.fax.Disc_Page_Coding;
1704 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1705 "Statistics\\FAX\\Disc App Timeout");
1706 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1707 &pLib->InterfaceStat.fax.Disc_App_Timeout;
1709 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1710 "Statistics\\FAX\\Disc Unspecified");
1711 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1712 &pLib->InterfaceStat.fax.Disc_Unspecified;
1714 pLib->fax_statistic_parse_last = pLib->cur_parse_entry - 1;
1719 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1720 "Statistics\\B-Layer1\\X-Frames");
1721 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1722 &pLib->InterfaceStat.b1.X_Frames;
1724 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1725 "Statistics\\B-Layer1\\X-Bytes");
1726 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1727 &pLib->InterfaceStat.b1.X_Bytes;
1729 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1730 "Statistics\\B-Layer1\\X-Errors");
1731 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1732 &pLib->InterfaceStat.b1.X_Errors;
1734 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1735 "Statistics\\B-Layer1\\R-Frames");
1736 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1737 &pLib->InterfaceStat.b1.R_Frames;
1739 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1740 "Statistics\\B-Layer1\\R-Bytes");
1741 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1742 &pLib->InterfaceStat.b1.R_Bytes;
1744 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1745 "Statistics\\B-Layer1\\R-Errors");
1746 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1747 &pLib->InterfaceStat.b1.R_Errors;
1752 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1753 "Statistics\\B-Layer2\\X-Frames");
1754 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1755 &pLib->InterfaceStat.b2.X_Frames;
1757 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1758 "Statistics\\B-Layer2\\X-Bytes");
1759 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1760 &pLib->InterfaceStat.b2.X_Bytes;
1762 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1763 "Statistics\\B-Layer2\\X-Errors");
1764 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1765 &pLib->InterfaceStat.b2.X_Errors;
1767 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1768 "Statistics\\B-Layer2\\R-Frames");
1769 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1770 &pLib->InterfaceStat.b2.R_Frames;
1772 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1773 "Statistics\\B-Layer2\\R-Bytes");
1774 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1775 &pLib->InterfaceStat.b2.R_Bytes;
1777 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1778 "Statistics\\B-Layer2\\R-Errors");
1779 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1780 &pLib->InterfaceStat.b2.R_Errors;
1785 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1786 "Statistics\\D-Layer1\\X-Frames");
1787 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1788 &pLib->InterfaceStat.d1.X_Frames;
1790 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1791 "Statistics\\D-Layer1\\X-Bytes");
1792 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1793 &pLib->InterfaceStat.d1.X_Bytes;
1795 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1796 "Statistics\\D-Layer1\\X-Errors");
1797 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1798 &pLib->InterfaceStat.d1.X_Errors;
1800 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1801 "Statistics\\D-Layer1\\R-Frames");
1802 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1803 &pLib->InterfaceStat.d1.R_Frames;
1805 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1806 "Statistics\\D-Layer1\\R-Bytes");
1807 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1808 &pLib->InterfaceStat.d1.R_Bytes;
1810 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1811 "Statistics\\D-Layer1\\R-Errors");
1812 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1813 &pLib->InterfaceStat.d1.R_Errors;
1818 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1819 "Statistics\\D-Layer2\\X-Frames");
1820 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1821 &pLib->InterfaceStat.d2.X_Frames;
1823 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1824 "Statistics\\D-Layer2\\X-Bytes");
1825 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1826 &pLib->InterfaceStat.d2.X_Bytes;
1828 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1829 "Statistics\\D-Layer2\\X-Errors");
1830 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1831 &pLib->InterfaceStat.d2.X_Errors;
1833 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1834 "Statistics\\D-Layer2\\R-Frames");
1835 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1836 &pLib->InterfaceStat.d2.R_Frames;
1838 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1839 "Statistics\\D-Layer2\\R-Bytes");
1840 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1841 &pLib->InterfaceStat.d2.R_Bytes;
1843 strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
1844 "Statistics\\D-Layer2\\R-Errors");
1845 pLib->parse_table[pLib->cur_parse_entry++].variable = \
1846 &pLib->InterfaceStat.d2.R_Errors;
1849 pLib->statistic_parse_last = pLib->cur_parse_entry - 1;
1852 static void diva_trace_error (diva_strace_context_t* pLib,
1853 int error, const char* file, int line) {
1854 if (pLib->user_proc_table.error_notify_proc) {
1855 (*(pLib->user_proc_table.error_notify_proc))(\
1856 pLib->user_proc_table.user_context,
1857 &pLib->instance, pLib->Adapter,
1863 Delivery notification to user
1865 static void diva_trace_notify_user (diva_strace_context_t* pLib,
1867 int notify_subject) {
1868 if (pLib->user_proc_table.notify_proc) {
1869 (*(pLib->user_proc_table.notify_proc))(pLib->user_proc_table.user_context,
1872 &pLib->lines[Channel],
1878 Read variable value to they destination based on the variable type
1880 static int diva_trace_read_variable (diva_man_var_header_t* pVar,
1882 switch (pVar->type) {
1883 case 0x03: /* MI_ASCIIZ - syting */
1884 return (diva_strace_read_asz (pVar, (char*)variable));
1885 case 0x04: /* MI_ASCII - string */
1886 return (diva_strace_read_asc (pVar, (char*)variable));
1887 case 0x05: /* MI_NUMBER - counted sequence of bytes */
1888 return (diva_strace_read_ie (pVar, (diva_trace_ie_t*)variable));
1889 case 0x81: /* MI_INT - signed integer */
1890 return (diva_strace_read_int (pVar, (int*)variable));
1891 case 0x82: /* MI_UINT - unsigned integer */
1892 return (diva_strace_read_uint (pVar, (dword*)variable));
1893 case 0x83: /* MI_HINT - unsigned integer, hex representetion */
1894 return (diva_strace_read_uint (pVar, (dword*)variable));
1895 case 0x87: /* MI_BITFLD - unsigned integer, bit representation */
1896 return (diva_strace_read_uint (pVar, (dword*)variable));
1900 This type of variable is not handled, indicate error
1901 Or one problem in management interface, or in application recodeing
1902 table, or this application should handle it.
1908 Read signed integer to destination
1910 static int diva_strace_read_int (diva_man_var_header_t* pVar, int* var) {
1911 byte* ptr = (char*)&pVar->path_length;
1914 ptr += (pVar->path_length + 1);
1916 switch (pVar->value_length) {
1918 value = *(char*)ptr;
1922 value = (short)GET_WORD(ptr);
1926 value = (int)GET_DWORD(ptr);
1938 static int diva_strace_read_uint (diva_man_var_header_t* pVar, dword* var) {
1939 byte* ptr = (char*)&pVar->path_length;
1942 ptr += (pVar->path_length + 1);
1944 switch (pVar->value_length) {
1946 value = (byte)(*ptr);
1950 value = (word)GET_WORD(ptr);
1954 value = (dword)GET_DWORD(ptr);
1955 value &= 0x00ffffff;
1959 value = (dword)GET_DWORD(ptr);
1972 Read zero terminated ASCII string
1974 static int diva_strace_read_asz (diva_man_var_header_t* pVar, char* var) {
1975 char* ptr = (char*)&pVar->path_length;
1978 ptr += (pVar->path_length + 1);
1980 if (!(length = pVar->value_length)) {
1981 length = strlen (ptr);
1983 memcpy (var, ptr, length);
1990 Read counted (with leading length byte) ASCII string
1992 static int diva_strace_read_asc (diva_man_var_header_t* pVar, char* var) {
1993 char* ptr = (char*)&pVar->path_length;
1995 ptr += (pVar->path_length + 1);
1996 memcpy (var, ptr+1, *ptr);
2003 Read one information element - i.e. one string of byte values with
2004 one length byte in front
2006 static int diva_strace_read_ie (diva_man_var_header_t* pVar,
2007 diva_trace_ie_t* var) {
2008 char* ptr = (char*)&pVar->path_length;
2010 ptr += (pVar->path_length + 1);
2013 memcpy (&var->data[0], ptr+1, *ptr);
2018 static int SuperTraceSetAudioTap (void* hLib, int Channel, int on) {
2019 diva_strace_context_t* pLib = (diva_strace_context_t*)hLib;
2021 if ((Channel < 1) || (Channel > pLib->Channels)) {
2027 pLib->audio_tap_mask |= (1L << Channel);
2029 pLib->audio_tap_mask &= ~(1L << Channel);
2033 EYE patterns have TM_M_DATA set as additional
2036 if (pLib->audio_tap_mask) {
2037 pLib->trace_event_mask |= TM_M_DATA;
2039 pLib->trace_event_mask &= ~TM_M_DATA;
2042 return (ScheduleNextTraceRequest (pLib));
2045 static int SuperTraceSetBChannel (void* hLib, int Channel, int on) {
2046 diva_strace_context_t* pLib = (diva_strace_context_t*)hLib;
2048 if ((Channel < 1) || (Channel > pLib->Channels)) {
2054 pLib->bchannel_trace_mask |= (1L << Channel);
2056 pLib->bchannel_trace_mask &= ~(1L << Channel);
2059 return (ScheduleNextTraceRequest (pLib));
2062 static int SuperTraceSetDChannel (void* hLib, int on) {
2063 diva_strace_context_t* pLib = (diva_strace_context_t*)hLib;
2066 pLib->trace_event_mask |= (TM_D_CHAN | TM_C_COMM | TM_DL_ERR | TM_LAYER1);
2068 pLib->trace_event_mask &= ~(TM_D_CHAN | TM_C_COMM | TM_DL_ERR | TM_LAYER1);
2071 return (ScheduleNextTraceRequest (pLib));
2074 static int SuperTraceSetInfo (void* hLib, int on) {
2075 diva_strace_context_t* pLib = (diva_strace_context_t*)hLib;
2078 pLib->trace_event_mask |= TM_STRING;
2080 pLib->trace_event_mask &= ~TM_STRING;
2083 return (ScheduleNextTraceRequest (pLib));
2086 static int SuperTraceClearCall (void* hLib, int Channel) {
2087 diva_strace_context_t* pLib = (diva_strace_context_t*)hLib;
2089 if ((Channel < 1) || (Channel > pLib->Channels)) {
2094 pLib->clear_call_command |= (1L << Channel);
2096 return (ScheduleNextTraceRequest (pLib));
2100 Parse and update cumulative statistice
2102 static int diva_ifc_statistics (diva_strace_context_t* pLib,
2103 diva_man_var_header_t* pVar) {
2104 diva_man_var_header_t* cur;
2105 int i, one_updated = 0, mdm_updated = 0, fax_updated = 0;
2107 for (i = pLib->statistic_parse_first; i <= pLib->statistic_parse_last; i++) {
2108 if ((cur = find_var (pVar, pLib->parse_table[i].path))) {
2109 if (diva_trace_read_variable (cur, pLib->parse_table[i].variable)) {
2110 diva_trace_error (pLib, -3 , __FILE__, __LINE__);
2114 if ((i >= pLib->mdm_statistic_parse_first) && (i <= pLib->mdm_statistic_parse_last)) {
2117 if ((i >= pLib->fax_statistic_parse_first) && (i <= pLib->fax_statistic_parse_last)) {
2124 We do not use first event to notify user - this is the event that is
2125 generated as result of EVENT ON operation and is used only to initialize
2126 internal variables of application
2129 diva_trace_notify_user (pLib, 0, DIVA_SUPER_TRACE_NOTIFY_MDM_STAT_CHANGE);
2130 } else if (fax_updated) {
2131 diva_trace_notify_user (pLib, 0, DIVA_SUPER_TRACE_NOTIFY_FAX_STAT_CHANGE);
2132 } else if (one_updated) {
2133 diva_trace_notify_user (pLib, 0, DIVA_SUPER_TRACE_NOTIFY_STAT_CHANGE);
2136 return (one_updated ? 0 : -1);
2139 static int SuperTraceGetOutgoingCallStatistics (void* hLib) {
2140 diva_strace_context_t* pLib = (diva_strace_context_t*)hLib;
2141 pLib->outgoing_ifc_stats = 1;
2142 return (ScheduleNextTraceRequest (pLib));
2145 static int SuperTraceGetIncomingCallStatistics (void* hLib) {
2146 diva_strace_context_t* pLib = (diva_strace_context_t*)hLib;
2147 pLib->incoming_ifc_stats = 1;
2148 return (ScheduleNextTraceRequest (pLib));
2151 static int SuperTraceGetModemStatistics (void* hLib) {
2152 diva_strace_context_t* pLib = (diva_strace_context_t*)hLib;
2153 pLib->modem_ifc_stats = 1;
2154 return (ScheduleNextTraceRequest (pLib));
2157 static int SuperTraceGetFaxStatistics (void* hLib) {
2158 diva_strace_context_t* pLib = (diva_strace_context_t*)hLib;
2159 pLib->fax_ifc_stats = 1;
2160 return (ScheduleNextTraceRequest (pLib));
2163 static int SuperTraceGetBLayer1Statistics (void* hLib) {
2164 diva_strace_context_t* pLib = (diva_strace_context_t*)hLib;
2165 pLib->b1_ifc_stats = 1;
2166 return (ScheduleNextTraceRequest (pLib));
2169 static int SuperTraceGetBLayer2Statistics (void* hLib) {
2170 diva_strace_context_t* pLib = (diva_strace_context_t*)hLib;
2171 pLib->b2_ifc_stats = 1;
2172 return (ScheduleNextTraceRequest (pLib));
2175 static int SuperTraceGetDLayer1Statistics (void* hLib) {
2176 diva_strace_context_t* pLib = (diva_strace_context_t*)hLib;
2177 pLib->d1_ifc_stats = 1;
2178 return (ScheduleNextTraceRequest (pLib));
2181 static int SuperTraceGetDLayer2Statistics (void* hLib) {
2182 diva_strace_context_t* pLib = (diva_strace_context_t*)hLib;
2183 pLib->d2_ifc_stats = 1;
2184 return (ScheduleNextTraceRequest (pLib));
2187 dword DivaSTraceGetMemotyRequirement (int channels) {
2188 dword parse_entries = (MODEM_PARSE_ENTRIES + FAX_PARSE_ENTRIES + \
2189 STAT_PARSE_ENTRIES + \
2190 LINE_PARSE_ENTRIES + 1) * channels;
2191 return (sizeof(diva_strace_context_t) + \
2192 (parse_entries * sizeof(diva_strace_path2action_t)));