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
, "Unknown 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
, "Unknown 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 if (diva_strace_read_uint(pVar
, &l2_state
))
971 strcpy(tmp
, "Layer2 UP");
974 strcpy(tmp
, "Layer2 Disconnecting");
977 strcpy(tmp
, "Layer2 Connecting");
980 strcpy(tmp
, "SPID Initializing");
983 strcpy(tmp
, "SPID Initialised");
986 strcpy(tmp
, "Layer2 Connecting");
990 strcpy(tmp
, "Auto SPID Stopped");
994 strcpy(tmp
, "Auto SPID Idle");
998 strcpy(tmp
, "Auto SPID Requested");
1002 strcpy(tmp
, "Auto SPID Delivery");
1006 strcpy(tmp
, "Auto SPID Complete");
1010 sprintf(tmp
, "U:%d", (int)l2_state
);
1012 if (pLib
->l2_trace
== 1) {
1015 diva_trace_notify_user(pLib
, 0, DIVA_SUPER_TRACE_INTERFACE_CHANGE
);
1020 if (!strncmp("Statistics\\Incoming Calls\\Calls", path
, pVar
->path_length
) ||
1021 !strncmp("Statistics\\Incoming Calls\\Connected", path
, pVar
->path_length
)) {
1022 return (SuperTraceGetIncomingCallStatistics(pLib
));
1025 if (!strncmp("Statistics\\Outgoing Calls\\Calls", path
, pVar
->path_length
) ||
1026 !strncmp("Statistics\\Outgoing Calls\\Connected", path
, pVar
->path_length
)) {
1027 return (SuperTraceGetOutgoingCallStatistics(pLib
));
1033 static int diva_line_event(diva_strace_context_t
*pLib
, int Channel
) {
1034 pLib
->pending_line_status
|= (1L << (Channel
- 1));
1038 static int diva_modem_event(diva_strace_context_t
*pLib
, int Channel
) {
1039 pLib
->pending_modem_status
|= (1L << (Channel
- 1));
1043 static int diva_fax_event(diva_strace_context_t
*pLib
, int Channel
) {
1044 pLib
->pending_fax_status
|= (1L << (Channel
- 1));
1049 Process INFO indications that arrive from the card
1050 Uses path of first I.E. to detect the source of the
1053 static int process_idi_info(diva_strace_context_t
*pLib
,
1054 diva_man_var_header_t
*pVar
) {
1055 const char *path
= (char *)&pVar
->path_length
+ 1;
1060 First look for Modem Status Info
1062 for (i
= pLib
->Channels
; i
> 0; i
--) {
1063 len
= sprintf(name
, "State\\B%d\\Modem", i
);
1064 if (!strncmp(name
, path
, len
)) {
1065 return (diva_modem_info(pLib
, i
, pVar
));
1070 Look for Fax Status Info
1072 for (i
= pLib
->Channels
; i
> 0; i
--) {
1073 len
= sprintf(name
, "State\\B%d\\FAX", i
);
1074 if (!strncmp(name
, path
, len
)) {
1075 return (diva_fax_info(pLib
, i
, pVar
));
1080 Look for Line Status Info
1082 for (i
= pLib
->Channels
; i
> 0; i
--) {
1083 len
= sprintf(name
, "State\\B%d", i
);
1084 if (!strncmp(name
, path
, len
)) {
1085 return (diva_line_info(pLib
, i
, pVar
));
1089 if (!diva_ifc_statistics(pLib
, pVar
)) {
1097 MODEM INSTANCE STATE UPDATE
1099 Update Modem Status Information and issue notification to user,
1100 that will inform about change in the state of modem instance, that is
1101 associuated with this channel
1103 static int diva_modem_info(diva_strace_context_t
*pLib
,
1105 diva_man_var_header_t
*pVar
) {
1106 diva_man_var_header_t
*cur
;
1107 int i
, nr
= Channel
- 1;
1109 for (i
= pLib
->modem_parse_entry_first
[nr
];
1110 i
<= pLib
->modem_parse_entry_last
[nr
]; i
++) {
1111 if ((cur
= find_var(pVar
, pLib
->parse_table
[i
].path
))) {
1112 if (diva_trace_read_variable(cur
, pLib
->parse_table
[i
].variable
)) {
1113 diva_trace_error(pLib
, -3, __FILE__
, __LINE__
);
1117 diva_trace_error(pLib
, -2, __FILE__
, __LINE__
);
1123 We do not use first event to notify user - this is the event that is
1124 generated as result of EVENT ON operation and is used only to initialize
1125 internal variables of application
1127 if (pLib
->modem_init_event
& (1L << nr
)) {
1128 diva_trace_notify_user(pLib
, nr
, DIVA_SUPER_TRACE_NOTIFY_MODEM_CHANGE
);
1130 pLib
->modem_init_event
|= (1L << nr
);
1136 static int diva_fax_info(diva_strace_context_t
*pLib
,
1138 diva_man_var_header_t
*pVar
) {
1139 diva_man_var_header_t
*cur
;
1140 int i
, nr
= Channel
- 1;
1142 for (i
= pLib
->fax_parse_entry_first
[nr
];
1143 i
<= pLib
->fax_parse_entry_last
[nr
]; i
++) {
1144 if ((cur
= find_var(pVar
, pLib
->parse_table
[i
].path
))) {
1145 if (diva_trace_read_variable(cur
, pLib
->parse_table
[i
].variable
)) {
1146 diva_trace_error(pLib
, -3, __FILE__
, __LINE__
);
1150 diva_trace_error(pLib
, -2, __FILE__
, __LINE__
);
1156 We do not use first event to notify user - this is the event that is
1157 generated as result of EVENT ON operation and is used only to initialize
1158 internal variables of application
1160 if (pLib
->fax_init_event
& (1L << nr
)) {
1161 diva_trace_notify_user(pLib
, nr
, DIVA_SUPER_TRACE_NOTIFY_FAX_CHANGE
);
1163 pLib
->fax_init_event
|= (1L << nr
);
1171 Update Line Status Information and issue notification to user,
1172 that will inform about change in the line state.
1174 static int diva_line_info(diva_strace_context_t
*pLib
,
1176 diva_man_var_header_t
*pVar
) {
1177 diva_man_var_header_t
*cur
;
1178 int i
, nr
= Channel
- 1;
1180 for (i
= pLib
->line_parse_entry_first
[nr
];
1181 i
<= pLib
->line_parse_entry_last
[nr
]; i
++) {
1182 if ((cur
= find_var(pVar
, pLib
->parse_table
[i
].path
))) {
1183 if (diva_trace_read_variable(cur
, pLib
->parse_table
[i
].variable
)) {
1184 diva_trace_error(pLib
, -3, __FILE__
, __LINE__
);
1188 diva_trace_error(pLib
, -2 , __FILE__
, __LINE__
);
1194 We do not use first event to notify user - this is the event that is
1195 generated as result of EVENT ON operation and is used only to initialize
1196 internal variables of application
1198 Exception is is if the line is "online". In this case we have to notify
1199 user about this confition.
1201 if (pLib
->line_init_event
& (1L << nr
)) {
1202 diva_trace_notify_user(pLib
, nr
, DIVA_SUPER_TRACE_NOTIFY_LINE_CHANGE
);
1204 pLib
->line_init_event
|= (1L << nr
);
1205 if (strcmp(&pLib
->lines
[nr
].Line
[0], "Idle")) {
1206 diva_trace_notify_user(pLib
, nr
, DIVA_SUPER_TRACE_NOTIFY_LINE_CHANGE
);
1214 Move position to next vatianle in the chain
1216 static diva_man_var_header_t
*get_next_var(diva_man_var_header_t
*pVar
) {
1217 byte
*msg
= (byte
*)pVar
;
1221 if (*msg
!= ESC
) return NULL
;
1224 msg_length
= *(msg
+ 1);
1225 msg
= (start
+ msg_length
);
1227 if (*msg
!= ESC
) return NULL
;
1229 return ((diva_man_var_header_t
*)msg
);
1233 Move position to variable with given name
1235 static diva_man_var_header_t
*find_var(diva_man_var_header_t
*pVar
,
1240 path
= (char *)&pVar
->path_length
+ 1;
1242 if (!strncmp(name
, path
, pVar
->path_length
)) {
1245 } while ((pVar
= get_next_var(pVar
)));
1250 static void diva_create_line_parse_table(diva_strace_context_t
*pLib
,
1252 diva_trace_line_state_t
*pLine
= &pLib
->lines
[Channel
];
1253 int nr
= Channel
+ 1;
1255 if ((pLib
->cur_parse_entry
+ LINE_PARSE_ENTRIES
) >= pLib
->parse_entries
) {
1256 diva_trace_error(pLib
, -1, __FILE__
, __LINE__
);
1260 pLine
->ChannelNumber
= nr
;
1262 pLib
->line_parse_entry_first
[Channel
] = pLib
->cur_parse_entry
;
1264 sprintf(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1265 "State\\B%d\\Framing", nr
);
1266 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= &pLine
->Framing
[0];
1268 sprintf(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1269 "State\\B%d\\Line", nr
);
1270 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= &pLine
->Line
[0];
1272 sprintf(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1273 "State\\B%d\\Layer2", nr
);
1274 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= &pLine
->Layer2
[0];
1276 sprintf(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1277 "State\\B%d\\Layer3", nr
);
1278 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= &pLine
->Layer3
[0];
1280 sprintf(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1281 "State\\B%d\\Remote Address", nr
);
1282 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1283 &pLine
->RemoteAddress
[0];
1285 sprintf(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1286 "State\\B%d\\Remote SubAddr", nr
);
1287 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1288 &pLine
->RemoteSubAddress
[0];
1290 sprintf(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1291 "State\\B%d\\Local Address", nr
);
1292 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1293 &pLine
->LocalAddress
[0];
1295 sprintf(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1296 "State\\B%d\\Local SubAddr", nr
);
1297 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1298 &pLine
->LocalSubAddress
[0];
1300 sprintf(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1301 "State\\B%d\\BC", nr
);
1302 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= &pLine
->call_BC
;
1304 sprintf(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1305 "State\\B%d\\HLC", nr
);
1306 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= &pLine
->call_HLC
;
1308 sprintf(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1309 "State\\B%d\\LLC", nr
);
1310 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= &pLine
->call_LLC
;
1312 sprintf(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1313 "State\\B%d\\Charges", nr
);
1314 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= &pLine
->Charges
;
1316 sprintf(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1317 "State\\B%d\\Call Reference", nr
);
1318 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= &pLine
->CallReference
;
1320 sprintf(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1321 "State\\B%d\\Last Disc Cause", nr
);
1322 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1323 &pLine
->LastDisconnecCause
;
1325 sprintf(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1326 "State\\B%d\\User ID", nr
);
1327 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= &pLine
->UserID
[0];
1329 pLib
->line_parse_entry_last
[Channel
] = pLib
->cur_parse_entry
- 1;
1332 static void diva_create_fax_parse_table(diva_strace_context_t
*pLib
,
1334 diva_trace_fax_state_t
*pFax
= &pLib
->lines
[Channel
].fax
;
1335 int nr
= Channel
+ 1;
1337 if ((pLib
->cur_parse_entry
+ FAX_PARSE_ENTRIES
) >= pLib
->parse_entries
) {
1338 diva_trace_error(pLib
, -1, __FILE__
, __LINE__
);
1341 pFax
->ChannelNumber
= nr
;
1343 pLib
->fax_parse_entry_first
[Channel
] = pLib
->cur_parse_entry
;
1345 sprintf(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1346 "State\\B%d\\FAX\\Event", nr
);
1347 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= &pFax
->Event
;
1349 sprintf(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1350 "State\\B%d\\FAX\\Page Counter", nr
);
1351 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= &pFax
->Page_Counter
;
1353 sprintf(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1354 "State\\B%d\\FAX\\Features", nr
);
1355 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= &pFax
->Features
;
1357 sprintf(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1358 "State\\B%d\\FAX\\Station ID", nr
);
1359 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= &pFax
->Station_ID
[0];
1361 sprintf(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1362 "State\\B%d\\FAX\\Subaddress", nr
);
1363 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= &pFax
->Subaddress
[0];
1365 sprintf(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1366 "State\\B%d\\FAX\\Password", nr
);
1367 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= &pFax
->Password
[0];
1369 sprintf(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1370 "State\\B%d\\FAX\\Speed", nr
);
1371 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= &pFax
->Speed
;
1373 sprintf(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1374 "State\\B%d\\FAX\\Resolution", nr
);
1375 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= &pFax
->Resolution
;
1377 sprintf(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1378 "State\\B%d\\FAX\\Paper Width", nr
);
1379 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= &pFax
->Paper_Width
;
1381 sprintf(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1382 "State\\B%d\\FAX\\Paper Length", nr
);
1383 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= &pFax
->Paper_Length
;
1385 sprintf(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1386 "State\\B%d\\FAX\\Scanline Time", nr
);
1387 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= &pFax
->Scanline_Time
;
1389 sprintf(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1390 "State\\B%d\\FAX\\Disc Reason", nr
);
1391 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= &pFax
->Disc_Reason
;
1393 pLib
->fax_parse_entry_last
[Channel
] = pLib
->cur_parse_entry
- 1;
1396 static void diva_create_modem_parse_table(diva_strace_context_t
*pLib
,
1398 diva_trace_modem_state_t
*pModem
= &pLib
->lines
[Channel
].modem
;
1399 int nr
= Channel
+ 1;
1401 if ((pLib
->cur_parse_entry
+ MODEM_PARSE_ENTRIES
) >= pLib
->parse_entries
) {
1402 diva_trace_error(pLib
, -1, __FILE__
, __LINE__
);
1405 pModem
->ChannelNumber
= nr
;
1407 pLib
->modem_parse_entry_first
[Channel
] = pLib
->cur_parse_entry
;
1409 sprintf(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1410 "State\\B%d\\Modem\\Event", nr
);
1411 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= &pModem
->Event
;
1413 sprintf(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1414 "State\\B%d\\Modem\\Norm", nr
);
1415 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= &pModem
->Norm
;
1417 sprintf(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1418 "State\\B%d\\Modem\\Options", nr
);
1419 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= &pModem
->Options
;
1421 sprintf(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1422 "State\\B%d\\Modem\\TX Speed", nr
);
1423 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= &pModem
->TxSpeed
;
1425 sprintf(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1426 "State\\B%d\\Modem\\RX Speed", nr
);
1427 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= &pModem
->RxSpeed
;
1429 sprintf(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1430 "State\\B%d\\Modem\\Roundtrip ms", nr
);
1431 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= &pModem
->RoundtripMsec
;
1433 sprintf(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1434 "State\\B%d\\Modem\\Symbol Rate", nr
);
1435 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= &pModem
->SymbolRate
;
1437 sprintf(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1438 "State\\B%d\\Modem\\RX Level dBm", nr
);
1439 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= &pModem
->RxLeveldBm
;
1441 sprintf(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1442 "State\\B%d\\Modem\\Echo Level dBm", nr
);
1443 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= &pModem
->EchoLeveldBm
;
1445 sprintf(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1446 "State\\B%d\\Modem\\SNR dB", nr
);
1447 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= &pModem
->SNRdb
;
1449 sprintf(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1450 "State\\B%d\\Modem\\MAE", nr
);
1451 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= &pModem
->MAE
;
1453 sprintf(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1454 "State\\B%d\\Modem\\Local Retrains", nr
);
1455 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= &pModem
->LocalRetrains
;
1457 sprintf(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1458 "State\\B%d\\Modem\\Remote Retrains", nr
);
1459 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= &pModem
->RemoteRetrains
;
1461 sprintf(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1462 "State\\B%d\\Modem\\Local Resyncs", nr
);
1463 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= &pModem
->LocalResyncs
;
1465 sprintf(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1466 "State\\B%d\\Modem\\Remote Resyncs", nr
);
1467 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= &pModem
->RemoteResyncs
;
1469 sprintf(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1470 "State\\B%d\\Modem\\Disc Reason", nr
);
1471 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= &pModem
->DiscReason
;
1473 pLib
->modem_parse_entry_last
[Channel
] = pLib
->cur_parse_entry
- 1;
1476 static void diva_create_parse_table(diva_strace_context_t
*pLib
) {
1479 for (i
= 0; i
< pLib
->Channels
; i
++) {
1480 diva_create_line_parse_table(pLib
, i
);
1481 diva_create_modem_parse_table(pLib
, i
);
1482 diva_create_fax_parse_table(pLib
, i
);
1485 pLib
->statistic_parse_first
= pLib
->cur_parse_entry
;
1490 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1491 "Statistics\\Outgoing Calls\\Calls");
1492 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1493 &pLib
->InterfaceStat
.outg
.Calls
;
1495 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1496 "Statistics\\Outgoing Calls\\Connected");
1497 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1498 &pLib
->InterfaceStat
.outg
.Connected
;
1500 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1501 "Statistics\\Outgoing Calls\\User Busy");
1502 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1503 &pLib
->InterfaceStat
.outg
.User_Busy
;
1505 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1506 "Statistics\\Outgoing Calls\\No Answer");
1507 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1508 &pLib
->InterfaceStat
.outg
.No_Answer
;
1510 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1511 "Statistics\\Outgoing Calls\\Wrong Number");
1512 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1513 &pLib
->InterfaceStat
.outg
.Wrong_Number
;
1515 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1516 "Statistics\\Outgoing Calls\\Call Rejected");
1517 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1518 &pLib
->InterfaceStat
.outg
.Call_Rejected
;
1520 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1521 "Statistics\\Outgoing Calls\\Other Failures");
1522 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1523 &pLib
->InterfaceStat
.outg
.Other_Failures
;
1528 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1529 "Statistics\\Incoming Calls\\Calls");
1530 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1531 &pLib
->InterfaceStat
.inc
.Calls
;
1533 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1534 "Statistics\\Incoming Calls\\Connected");
1535 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1536 &pLib
->InterfaceStat
.inc
.Connected
;
1538 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1539 "Statistics\\Incoming Calls\\User Busy");
1540 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1541 &pLib
->InterfaceStat
.inc
.User_Busy
;
1543 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1544 "Statistics\\Incoming Calls\\Call Rejected");
1545 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1546 &pLib
->InterfaceStat
.inc
.Call_Rejected
;
1548 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1549 "Statistics\\Incoming Calls\\Wrong Number");
1550 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1551 &pLib
->InterfaceStat
.inc
.Wrong_Number
;
1553 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1554 "Statistics\\Incoming Calls\\Incompatible Dst");
1555 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1556 &pLib
->InterfaceStat
.inc
.Incompatible_Dst
;
1558 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1559 "Statistics\\Incoming Calls\\Out of Order");
1560 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1561 &pLib
->InterfaceStat
.inc
.Out_of_Order
;
1563 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1564 "Statistics\\Incoming Calls\\Ignored");
1565 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1566 &pLib
->InterfaceStat
.inc
.Ignored
;
1571 pLib
->mdm_statistic_parse_first
= pLib
->cur_parse_entry
;
1573 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1574 "Statistics\\Modem\\Disc Normal");
1575 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1576 &pLib
->InterfaceStat
.mdm
.Disc_Normal
;
1578 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1579 "Statistics\\Modem\\Disc Unspecified");
1580 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1581 &pLib
->InterfaceStat
.mdm
.Disc_Unspecified
;
1583 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1584 "Statistics\\Modem\\Disc Busy Tone");
1585 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1586 &pLib
->InterfaceStat
.mdm
.Disc_Busy_Tone
;
1588 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1589 "Statistics\\Modem\\Disc Congestion");
1590 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1591 &pLib
->InterfaceStat
.mdm
.Disc_Congestion
;
1593 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1594 "Statistics\\Modem\\Disc Carr. Wait");
1595 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1596 &pLib
->InterfaceStat
.mdm
.Disc_Carr_Wait
;
1598 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1599 "Statistics\\Modem\\Disc Trn Timeout");
1600 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1601 &pLib
->InterfaceStat
.mdm
.Disc_Trn_Timeout
;
1603 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1604 "Statistics\\Modem\\Disc Incompat.");
1605 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1606 &pLib
->InterfaceStat
.mdm
.Disc_Incompat
;
1608 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1609 "Statistics\\Modem\\Disc Frame Rej.");
1610 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1611 &pLib
->InterfaceStat
.mdm
.Disc_Frame_Rej
;
1613 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1614 "Statistics\\Modem\\Disc V42bis");
1615 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1616 &pLib
->InterfaceStat
.mdm
.Disc_V42bis
;
1618 pLib
->mdm_statistic_parse_last
= pLib
->cur_parse_entry
- 1;
1623 pLib
->fax_statistic_parse_first
= pLib
->cur_parse_entry
;
1625 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1626 "Statistics\\FAX\\Disc Normal");
1627 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1628 &pLib
->InterfaceStat
.fax
.Disc_Normal
;
1630 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1631 "Statistics\\FAX\\Disc Not Ident.");
1632 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1633 &pLib
->InterfaceStat
.fax
.Disc_Not_Ident
;
1635 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1636 "Statistics\\FAX\\Disc No Response");
1637 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1638 &pLib
->InterfaceStat
.fax
.Disc_No_Response
;
1640 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1641 "Statistics\\FAX\\Disc Retries");
1642 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1643 &pLib
->InterfaceStat
.fax
.Disc_Retries
;
1645 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1646 "Statistics\\FAX\\Disc Unexp. Msg.");
1647 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1648 &pLib
->InterfaceStat
.fax
.Disc_Unexp_Msg
;
1650 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1651 "Statistics\\FAX\\Disc No Polling.");
1652 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1653 &pLib
->InterfaceStat
.fax
.Disc_No_Polling
;
1655 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1656 "Statistics\\FAX\\Disc Training");
1657 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1658 &pLib
->InterfaceStat
.fax
.Disc_Training
;
1660 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1661 "Statistics\\FAX\\Disc Unexpected");
1662 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1663 &pLib
->InterfaceStat
.fax
.Disc_Unexpected
;
1665 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1666 "Statistics\\FAX\\Disc Application");
1667 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1668 &pLib
->InterfaceStat
.fax
.Disc_Application
;
1670 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1671 "Statistics\\FAX\\Disc Incompat.");
1672 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1673 &pLib
->InterfaceStat
.fax
.Disc_Incompat
;
1675 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1676 "Statistics\\FAX\\Disc No Command");
1677 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1678 &pLib
->InterfaceStat
.fax
.Disc_No_Command
;
1680 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1681 "Statistics\\FAX\\Disc Long Msg");
1682 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1683 &pLib
->InterfaceStat
.fax
.Disc_Long_Msg
;
1685 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1686 "Statistics\\FAX\\Disc Supervisor");
1687 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1688 &pLib
->InterfaceStat
.fax
.Disc_Supervisor
;
1690 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1691 "Statistics\\FAX\\Disc SUB SEP PWD");
1692 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1693 &pLib
->InterfaceStat
.fax
.Disc_SUB_SEP_PWD
;
1695 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1696 "Statistics\\FAX\\Disc Invalid Msg");
1697 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1698 &pLib
->InterfaceStat
.fax
.Disc_Invalid_Msg
;
1700 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1701 "Statistics\\FAX\\Disc Page Coding");
1702 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1703 &pLib
->InterfaceStat
.fax
.Disc_Page_Coding
;
1705 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1706 "Statistics\\FAX\\Disc App Timeout");
1707 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1708 &pLib
->InterfaceStat
.fax
.Disc_App_Timeout
;
1710 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1711 "Statistics\\FAX\\Disc Unspecified");
1712 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1713 &pLib
->InterfaceStat
.fax
.Disc_Unspecified
;
1715 pLib
->fax_statistic_parse_last
= pLib
->cur_parse_entry
- 1;
1720 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1721 "Statistics\\B-Layer1\\X-Frames");
1722 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1723 &pLib
->InterfaceStat
.b1
.X_Frames
;
1725 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1726 "Statistics\\B-Layer1\\X-Bytes");
1727 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1728 &pLib
->InterfaceStat
.b1
.X_Bytes
;
1730 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1731 "Statistics\\B-Layer1\\X-Errors");
1732 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1733 &pLib
->InterfaceStat
.b1
.X_Errors
;
1735 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1736 "Statistics\\B-Layer1\\R-Frames");
1737 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1738 &pLib
->InterfaceStat
.b1
.R_Frames
;
1740 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1741 "Statistics\\B-Layer1\\R-Bytes");
1742 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1743 &pLib
->InterfaceStat
.b1
.R_Bytes
;
1745 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1746 "Statistics\\B-Layer1\\R-Errors");
1747 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1748 &pLib
->InterfaceStat
.b1
.R_Errors
;
1753 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1754 "Statistics\\B-Layer2\\X-Frames");
1755 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1756 &pLib
->InterfaceStat
.b2
.X_Frames
;
1758 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1759 "Statistics\\B-Layer2\\X-Bytes");
1760 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1761 &pLib
->InterfaceStat
.b2
.X_Bytes
;
1763 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1764 "Statistics\\B-Layer2\\X-Errors");
1765 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1766 &pLib
->InterfaceStat
.b2
.X_Errors
;
1768 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1769 "Statistics\\B-Layer2\\R-Frames");
1770 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1771 &pLib
->InterfaceStat
.b2
.R_Frames
;
1773 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1774 "Statistics\\B-Layer2\\R-Bytes");
1775 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1776 &pLib
->InterfaceStat
.b2
.R_Bytes
;
1778 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1779 "Statistics\\B-Layer2\\R-Errors");
1780 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1781 &pLib
->InterfaceStat
.b2
.R_Errors
;
1786 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1787 "Statistics\\D-Layer1\\X-Frames");
1788 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1789 &pLib
->InterfaceStat
.d1
.X_Frames
;
1791 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1792 "Statistics\\D-Layer1\\X-Bytes");
1793 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1794 &pLib
->InterfaceStat
.d1
.X_Bytes
;
1796 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1797 "Statistics\\D-Layer1\\X-Errors");
1798 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1799 &pLib
->InterfaceStat
.d1
.X_Errors
;
1801 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1802 "Statistics\\D-Layer1\\R-Frames");
1803 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1804 &pLib
->InterfaceStat
.d1
.R_Frames
;
1806 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1807 "Statistics\\D-Layer1\\R-Bytes");
1808 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1809 &pLib
->InterfaceStat
.d1
.R_Bytes
;
1811 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1812 "Statistics\\D-Layer1\\R-Errors");
1813 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1814 &pLib
->InterfaceStat
.d1
.R_Errors
;
1819 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1820 "Statistics\\D-Layer2\\X-Frames");
1821 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1822 &pLib
->InterfaceStat
.d2
.X_Frames
;
1824 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1825 "Statistics\\D-Layer2\\X-Bytes");
1826 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1827 &pLib
->InterfaceStat
.d2
.X_Bytes
;
1829 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1830 "Statistics\\D-Layer2\\X-Errors");
1831 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1832 &pLib
->InterfaceStat
.d2
.X_Errors
;
1834 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1835 "Statistics\\D-Layer2\\R-Frames");
1836 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1837 &pLib
->InterfaceStat
.d2
.R_Frames
;
1839 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1840 "Statistics\\D-Layer2\\R-Bytes");
1841 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1842 &pLib
->InterfaceStat
.d2
.R_Bytes
;
1844 strcpy(pLib
->parse_table
[pLib
->cur_parse_entry
].path
,
1845 "Statistics\\D-Layer2\\R-Errors");
1846 pLib
->parse_table
[pLib
->cur_parse_entry
++].variable
= \
1847 &pLib
->InterfaceStat
.d2
.R_Errors
;
1850 pLib
->statistic_parse_last
= pLib
->cur_parse_entry
- 1;
1853 static void diva_trace_error(diva_strace_context_t
*pLib
,
1854 int error
, const char *file
, int line
) {
1855 if (pLib
->user_proc_table
.error_notify_proc
) {
1856 (*(pLib
->user_proc_table
.error_notify_proc
))(\
1857 pLib
->user_proc_table
.user_context
,
1858 &pLib
->instance
, pLib
->Adapter
,
1864 Delivery notification to user
1866 static void diva_trace_notify_user(diva_strace_context_t
*pLib
,
1868 int notify_subject
) {
1869 if (pLib
->user_proc_table
.notify_proc
) {
1870 (*(pLib
->user_proc_table
.notify_proc
))(pLib
->user_proc_table
.user_context
,
1873 &pLib
->lines
[Channel
],
1879 Read variable value to they destination based on the variable type
1881 static int diva_trace_read_variable(diva_man_var_header_t
*pVar
,
1883 switch (pVar
->type
) {
1884 case 0x03: /* MI_ASCIIZ - syting */
1885 return (diva_strace_read_asz(pVar
, (char *)variable
));
1886 case 0x04: /* MI_ASCII - string */
1887 return (diva_strace_read_asc(pVar
, (char *)variable
));
1888 case 0x05: /* MI_NUMBER - counted sequence of bytes */
1889 return (diva_strace_read_ie(pVar
, (diva_trace_ie_t
*)variable
));
1890 case 0x81: /* MI_INT - signed integer */
1891 return (diva_strace_read_int(pVar
, (int *)variable
));
1892 case 0x82: /* MI_UINT - unsigned integer */
1893 return (diva_strace_read_uint(pVar
, (dword
*)variable
));
1894 case 0x83: /* MI_HINT - unsigned integer, hex representetion */
1895 return (diva_strace_read_uint(pVar
, (dword
*)variable
));
1896 case 0x87: /* MI_BITFLD - unsigned integer, bit representation */
1897 return (diva_strace_read_uint(pVar
, (dword
*)variable
));
1901 This type of variable is not handled, indicate error
1902 Or one problem in management interface, or in application recodeing
1903 table, or this application should handle it.
1909 Read signed integer to destination
1911 static int diva_strace_read_int(diva_man_var_header_t
*pVar
, int *var
) {
1912 byte
*ptr
= (char *)&pVar
->path_length
;
1915 ptr
+= (pVar
->path_length
+ 1);
1917 switch (pVar
->value_length
) {
1919 value
= *(char *)ptr
;
1923 value
= (short)GET_WORD(ptr
);
1927 value
= (int)GET_DWORD(ptr
);
1939 static int diva_strace_read_uint(diva_man_var_header_t
*pVar
, dword
*var
) {
1940 byte
*ptr
= (char *)&pVar
->path_length
;
1943 ptr
+= (pVar
->path_length
+ 1);
1945 switch (pVar
->value_length
) {
1947 value
= (byte
)(*ptr
);
1951 value
= (word
)GET_WORD(ptr
);
1955 value
= (dword
)GET_DWORD(ptr
);
1956 value
&= 0x00ffffff;
1960 value
= (dword
)GET_DWORD(ptr
);
1973 Read zero terminated ASCII string
1975 static int diva_strace_read_asz(diva_man_var_header_t
*pVar
, char *var
) {
1976 char *ptr
= (char *)&pVar
->path_length
;
1979 ptr
+= (pVar
->path_length
+ 1);
1981 if (!(length
= pVar
->value_length
)) {
1982 length
= strlen(ptr
);
1984 memcpy(var
, ptr
, length
);
1991 Read counted (with leading length byte) ASCII string
1993 static int diva_strace_read_asc(diva_man_var_header_t
*pVar
, char *var
) {
1994 char *ptr
= (char *)&pVar
->path_length
;
1996 ptr
+= (pVar
->path_length
+ 1);
1997 memcpy(var
, ptr
+ 1, *ptr
);
2004 Read one information element - i.e. one string of byte values with
2005 one length byte in front
2007 static int diva_strace_read_ie(diva_man_var_header_t
*pVar
,
2008 diva_trace_ie_t
*var
) {
2009 char *ptr
= (char *)&pVar
->path_length
;
2011 ptr
+= (pVar
->path_length
+ 1);
2014 memcpy(&var
->data
[0], ptr
+ 1, *ptr
);
2019 static int SuperTraceSetAudioTap(void *hLib
, int Channel
, int on
) {
2020 diva_strace_context_t
*pLib
= (diva_strace_context_t
*)hLib
;
2022 if ((Channel
< 1) || (Channel
> pLib
->Channels
)) {
2028 pLib
->audio_tap_mask
|= (1L << Channel
);
2030 pLib
->audio_tap_mask
&= ~(1L << Channel
);
2034 EYE patterns have TM_M_DATA set as additional
2037 if (pLib
->audio_tap_mask
) {
2038 pLib
->trace_event_mask
|= TM_M_DATA
;
2040 pLib
->trace_event_mask
&= ~TM_M_DATA
;
2043 return (ScheduleNextTraceRequest(pLib
));
2046 static int SuperTraceSetBChannel(void *hLib
, int Channel
, int on
) {
2047 diva_strace_context_t
*pLib
= (diva_strace_context_t
*)hLib
;
2049 if ((Channel
< 1) || (Channel
> pLib
->Channels
)) {
2055 pLib
->bchannel_trace_mask
|= (1L << Channel
);
2057 pLib
->bchannel_trace_mask
&= ~(1L << Channel
);
2060 return (ScheduleNextTraceRequest(pLib
));
2063 static int SuperTraceSetDChannel(void *hLib
, int on
) {
2064 diva_strace_context_t
*pLib
= (diva_strace_context_t
*)hLib
;
2067 pLib
->trace_event_mask
|= (TM_D_CHAN
| TM_C_COMM
| TM_DL_ERR
| TM_LAYER1
);
2069 pLib
->trace_event_mask
&= ~(TM_D_CHAN
| TM_C_COMM
| TM_DL_ERR
| TM_LAYER1
);
2072 return (ScheduleNextTraceRequest(pLib
));
2075 static int SuperTraceSetInfo(void *hLib
, int on
) {
2076 diva_strace_context_t
*pLib
= (diva_strace_context_t
*)hLib
;
2079 pLib
->trace_event_mask
|= TM_STRING
;
2081 pLib
->trace_event_mask
&= ~TM_STRING
;
2084 return (ScheduleNextTraceRequest(pLib
));
2087 static int SuperTraceClearCall(void *hLib
, int Channel
) {
2088 diva_strace_context_t
*pLib
= (diva_strace_context_t
*)hLib
;
2090 if ((Channel
< 1) || (Channel
> pLib
->Channels
)) {
2095 pLib
->clear_call_command
|= (1L << Channel
);
2097 return (ScheduleNextTraceRequest(pLib
));
2101 Parse and update cumulative statistice
2103 static int diva_ifc_statistics(diva_strace_context_t
*pLib
,
2104 diva_man_var_header_t
*pVar
) {
2105 diva_man_var_header_t
*cur
;
2106 int i
, one_updated
= 0, mdm_updated
= 0, fax_updated
= 0;
2108 for (i
= pLib
->statistic_parse_first
; i
<= pLib
->statistic_parse_last
; i
++) {
2109 if ((cur
= find_var(pVar
, pLib
->parse_table
[i
].path
))) {
2110 if (diva_trace_read_variable(cur
, pLib
->parse_table
[i
].variable
)) {
2111 diva_trace_error(pLib
, -3 , __FILE__
, __LINE__
);
2115 if ((i
>= pLib
->mdm_statistic_parse_first
) && (i
<= pLib
->mdm_statistic_parse_last
)) {
2118 if ((i
>= pLib
->fax_statistic_parse_first
) && (i
<= pLib
->fax_statistic_parse_last
)) {
2125 We do not use first event to notify user - this is the event that is
2126 generated as result of EVENT ON operation and is used only to initialize
2127 internal variables of application
2130 diva_trace_notify_user(pLib
, 0, DIVA_SUPER_TRACE_NOTIFY_MDM_STAT_CHANGE
);
2131 } else if (fax_updated
) {
2132 diva_trace_notify_user(pLib
, 0, DIVA_SUPER_TRACE_NOTIFY_FAX_STAT_CHANGE
);
2133 } else if (one_updated
) {
2134 diva_trace_notify_user(pLib
, 0, DIVA_SUPER_TRACE_NOTIFY_STAT_CHANGE
);
2137 return (one_updated
? 0 : -1);
2140 static int SuperTraceGetOutgoingCallStatistics(void *hLib
) {
2141 diva_strace_context_t
*pLib
= (diva_strace_context_t
*)hLib
;
2142 pLib
->outgoing_ifc_stats
= 1;
2143 return (ScheduleNextTraceRequest(pLib
));
2146 static int SuperTraceGetIncomingCallStatistics(void *hLib
) {
2147 diva_strace_context_t
*pLib
= (diva_strace_context_t
*)hLib
;
2148 pLib
->incoming_ifc_stats
= 1;
2149 return (ScheduleNextTraceRequest(pLib
));
2152 static int SuperTraceGetModemStatistics(void *hLib
) {
2153 diva_strace_context_t
*pLib
= (diva_strace_context_t
*)hLib
;
2154 pLib
->modem_ifc_stats
= 1;
2155 return (ScheduleNextTraceRequest(pLib
));
2158 static int SuperTraceGetFaxStatistics(void *hLib
) {
2159 diva_strace_context_t
*pLib
= (diva_strace_context_t
*)hLib
;
2160 pLib
->fax_ifc_stats
= 1;
2161 return (ScheduleNextTraceRequest(pLib
));
2164 static int SuperTraceGetBLayer1Statistics(void *hLib
) {
2165 diva_strace_context_t
*pLib
= (diva_strace_context_t
*)hLib
;
2166 pLib
->b1_ifc_stats
= 1;
2167 return (ScheduleNextTraceRequest(pLib
));
2170 static int SuperTraceGetBLayer2Statistics(void *hLib
) {
2171 diva_strace_context_t
*pLib
= (diva_strace_context_t
*)hLib
;
2172 pLib
->b2_ifc_stats
= 1;
2173 return (ScheduleNextTraceRequest(pLib
));
2176 static int SuperTraceGetDLayer1Statistics(void *hLib
) {
2177 diva_strace_context_t
*pLib
= (diva_strace_context_t
*)hLib
;
2178 pLib
->d1_ifc_stats
= 1;
2179 return (ScheduleNextTraceRequest(pLib
));
2182 static int SuperTraceGetDLayer2Statistics(void *hLib
) {
2183 diva_strace_context_t
*pLib
= (diva_strace_context_t
*)hLib
;
2184 pLib
->d2_ifc_stats
= 1;
2185 return (ScheduleNextTraceRequest(pLib
));
2188 dword
DivaSTraceGetMemotyRequirement(int channels
) {
2189 dword parse_entries
= (MODEM_PARSE_ENTRIES
+ FAX_PARSE_ENTRIES
+ \
2190 STAT_PARSE_ENTRIES
+ \
2191 LINE_PARSE_ENTRIES
+ 1) * channels
;
2192 return (sizeof(diva_strace_context_t
) + \
2193 (parse_entries
* sizeof(diva_strace_path2action_t
)));