OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [drivers/] [isdn/] [hardware/] [eicon/] [maintidi.c] - Blame information for rev 62

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
/*
2
 *
3
  Copyright (c) Eicon Networks, 2000.
4
 *
5
  This source file is supplied for the use with
6
  Eicon Networks range of DIVA Server Adapters.
7
 *
8
  Eicon File Revision :    1.9
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)
13
  any later version.
14
 *
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.
19
 *
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.
23
 *
24
 */
25
#include "platform.h"
26
#include "kst_ifc.h"
27
#include "di_defs.h"
28
#include "maintidi.h"
29
#include "pc.h"
30
#include "man_defs.h"
31
 
32
 
33
extern void diva_mnt_internal_dprintf (dword drv_id, dword type, char* p, ...);
34
 
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 */
39
 
40
/*
41
        LOCAL FUNCTIONS
42
        */
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);
61
 
62
/*
63
        LOCAL FUNCTIONS
64
        */
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,
74
                                                                                                                int Channel,
75
                                                                                                                diva_man_var_header_t* pVar);
76
static int diva_fax_info   (diva_strace_context_t* pLib,
77
                                                                                                                int Channel,
78
                                                                                                                diva_man_var_header_t* pVar);
79
static int diva_line_info  (diva_strace_context_t* pLib,
80
                                                                                                                int Channel,
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,
86
                                                                                                                                                                const char* name);
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,
97
                                                                                                                 int Channel,
98
                                                                                                                 int notify_subject);
99
static int diva_trace_read_variable (diva_man_var_header_t* pVar,
100
                                                                                                                                                 void* variable);
101
 
102
/*
103
        Initialize the library and return context
104
        of the created trace object that will represent
105
        the IDI adapter.
106
        Return 0 on error.
107
        */
108
diva_strace_library_interface_t* DivaSTraceLibraryCreateInstance (int Adapter,
109
                                                                                        const diva_trace_library_user_interface_t* user_proc,
110
                      byte* pmem) {
111
        diva_strace_context_t* pLib = (diva_strace_context_t*)pmem;
112
        int i;
113
 
114
        if (!pLib) {
115
                return NULL;
116
        }
117
 
118
        pmem += sizeof(*pLib);
119
        memset(pLib, 0x00, sizeof(*pLib));
120
 
121
        pLib->Adapter  = Adapter;
122
 
123
        /*
124
                Set up Library Interface
125
                */
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;
153
 
154
 
155
        if (user_proc) {
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;
160
        }
161
 
162
        if (!(pLib->hAdapter = SuperTraceOpenAdapter (Adapter))) {
163
    diva_mnt_internal_dprintf (0, DLI_ERR, "Can not open XDI adapter");
164
                return NULL;
165
        }
166
        pLib->Channels = SuperTraceGetNumberOfChannels (pLib->hAdapter);
167
 
168
        /*
169
                Calculate amount of parte table entites necessary to translate
170
                information from all events of onterest
171
                */
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;
176
 
177
        for (i = 0; i < 30; i++) {
178
                pLib->lines[i].pInterface     = &pLib->Interface;
179
                pLib->lines[i].pInterfaceStat = &pLib->InterfaceStat;
180
        }
181
 
182
  pLib->e.R = &pLib->RData;
183
 
184
        pLib->req_busy = 1;
185
        pLib->rc_ok    = ASSIGN_OK;
186
 
187
        diva_create_parse_table (pLib);
188
 
189
        return ((diva_strace_library_interface_t*)pLib);
190
}
191
 
192
static int DivaSTraceLibraryStart (void* hLib) {
193
  diva_strace_context_t* pLib = (diva_strace_context_t*)hLib;
194
 
195
  return (SuperTraceASSIGN (pLib->hAdapter, pLib->buffer));
196
}
197
 
198
/*
199
  Return (-1) on error
200
  Return (0) if was initiated or pending
201
  Return (1) if removal is complete
202
  */
203
static int DivaSTraceLibraryStop  (void* hLib) {
204
  diva_strace_context_t* pLib = (diva_strace_context_t*)hLib;
205
 
206
  if (!pLib->e.Id) { /* Was never started/assigned */
207
    return (1);
208
  }
209
 
210
  switch (pLib->removal_state) {
211
    case 0:
212
      pLib->removal_state = 1;
213
      ScheduleNextTraceRequest(pLib);
214
      break;
215
 
216
    case 3:
217
      return (1);
218
  }
219
 
220
  return (0);
221
}
222
 
223
static int SuperTraceLibraryFinit (void* hLib) {
224
        diva_strace_context_t* pLib = (diva_strace_context_t*)hLib;
225
        if (pLib) {
226
                if (pLib->hAdapter) {
227
                        SuperTraceCloseAdapter  (pLib->hAdapter);
228
                }
229
                return (0);
230
        }
231
        return (-1);
232
}
233
 
234
static void*    SuperTraceGetHandle (void* hLib) {
235
        diva_strace_context_t* pLib = (diva_strace_context_t*)hLib;
236
 
237
  return (&pLib->e);
238
}
239
 
240
/*
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).
244
        */
245
static int SuperTraceMessageInput (void* hLib) {
246
        diva_strace_context_t* pLib = (diva_strace_context_t*)hLib;
247
        int ret = 0;
248
  byte Rc, Ind;
249
 
250
  if (pLib->e.complete == 255) {
251
    /*
252
      Process return code
253
      */
254
    pLib->req_busy = 0;
255
    Rc             = pLib->e.Rc;
256
    pLib->e.Rc     = 0;
257
 
258
    if (pLib->removal_state == 2) {
259
      pLib->removal_state = 3;
260
      return (0);
261
    }
262
 
263
                if (Rc != pLib->rc_ok) {
264
      int ignore = 0;
265
      /*
266
        Auto-detect amount of events/channels and features
267
        */
268
      if (pLib->general_b_ch_event == 1) {
269
        pLib->general_b_ch_event = 2;
270
        ignore = 1;
271
      } else if (pLib->general_fax_event == 1) {
272
        pLib->general_fax_event = 2;
273
        ignore = 1;
274
      } else if (pLib->general_mdm_event == 1) {
275
        pLib->general_mdm_event = 2;
276
        ignore = 1;
277
      } else if ((pLib->ChannelsTraceActive < pLib->Channels) && pLib->ChannelsTraceActive) {
278
        pLib->ChannelsTraceActive = pLib->Channels;
279
        ignore = 1;
280
      } else if (pLib->ModemTraceActive < pLib->Channels) {
281
        pLib->ModemTraceActive = pLib->Channels;
282
        ignore = 1;
283
      } else if (pLib->FaxTraceActive < pLib->Channels) {
284
        pLib->FaxTraceActive = pLib->Channels;
285
        ignore = 1;
286
      } else if (pLib->audio_trace_init == 2) {
287
        ignore = 1;
288
        pLib->audio_trace_init = 1;
289
      } else if (pLib->eye_pattern_pending) {
290
                                pLib->eye_pattern_pending =  0;
291
                                ignore = 1;
292
                        } else if (pLib->audio_tap_pending) {
293
                                pLib->audio_tap_pending = 0;
294
                                ignore = 1;
295
      }
296
 
297
      if (!ignore) {
298
        return (-1); /* request failed */
299
      }
300
    } else {
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;
310
      }
311
    }
312
    if (pLib->audio_trace_init == 2) {
313
      pLib->audio_trace_init = 1;
314
    }
315
    pLib->rc_ok = 0xff; /* default OK after assign was done */
316
    if ((ret = ScheduleNextTraceRequest(pLib))) {
317
      return (-1);
318
    }
319
  } else {
320
    /*
321
      Process indication
322
      Always 'RNR' indication if return code is pending
323
      */
324
    Ind         = pLib->e.Ind;
325
    pLib->e.Ind = 0;
326
    if (pLib->removal_state) {
327
      pLib->e.RNum      = 0;
328
      pLib->e.RNR       = 2;
329
    } else if (pLib->req_busy) {
330
      pLib->e.RNum      = 0;
331
      pLib->e.RNR       = 1;
332
    } else {
333
      if (pLib->e.complete != 0x02) {
334
        /*
335
          Look-ahead call, set up buffers
336
          */
337
        pLib->e.RNum       = 1;
338
        pLib->e.R->P       = (byte*)&pLib->buffer[0];
339
        pLib->e.R->PLength = (word)(sizeof(pLib->buffer) - 1);
340
 
341
      } else {
342
        /*
343
          Indication reception complete, process it now
344
          */
345
        byte* p = (byte*)&pLib->buffer[0];
346
        pLib->buffer[pLib->e.R->PLength] = 0; /* terminate I.E. with zero */
347
 
348
        switch (Ind) {
349
          case MAN_COMBI_IND: {
350
            int total_length    = pLib->e.R->PLength;
351
            word  this_ind_length;
352
 
353
            while (total_length > 3 && *p) {
354
              Ind = *p++;
355
              this_ind_length = (word)p[0] | ((word)p[1] << 8);
356
              p += 2;
357
 
358
              switch (Ind) {
359
                case MAN_INFO_IND:
360
                  if (process_idi_info (pLib, (diva_man_var_header_t*)p)) {
361
                    return (-1);
362
                  }
363
                  break;
364
                                        case MAN_EVENT_IND:
365
                  if (process_idi_event (pLib, (diva_man_var_header_t*)p)) {
366
                    return (-1);
367
                  }
368
                  break;
369
                case MAN_TRACE_IND:
370
                  if (pLib->trace_on == 1) {
371
                    /*
372
                      Ignore first trace event that is result of
373
                      EVENT_ON operation
374
                    */
375
                    pLib->trace_on++;
376
                  } else {
377
                    /*
378
                      Delivery XLOG buffer to application
379
                      */
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,
383
                                                            p, this_ind_length);
384
                    }
385
                  }
386
                  break;
387
                default:
388
                  diva_mnt_internal_dprintf (0, DLI_ERR, "Unknon IDI Ind (DMA mode): %02x", Ind);
389
              }
390
              p += (this_ind_length+1);
391
              total_length -= (4 + this_ind_length);
392
            }
393
          } break;
394
          case MAN_INFO_IND:
395
            if (process_idi_info (pLib, (diva_man_var_header_t*)p)) {
396
              return (-1);
397
            }
398
            break;
399
                                        case MAN_EVENT_IND:
400
            if (process_idi_event (pLib, (diva_man_var_header_t*)p)) {
401
              return (-1);
402
            }
403
            break;
404
          case MAN_TRACE_IND:
405
            if (pLib->trace_on == 1) {
406
              /*
407
                Ignore first trace event that is result of
408
                EVENT_ON operation
409
              */
410
              pLib->trace_on++;
411
            } else {
412
              /*
413
                Delivery XLOG buffer to application
414
                */
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);
419
              }
420
            }
421
            break;
422
          default:
423
            diva_mnt_internal_dprintf (0, DLI_ERR, "Unknon IDI Ind: %02x", Ind);
424
        }
425
      }
426
    }
427
  }
428
 
429
        if ((ret = ScheduleNextTraceRequest(pLib))) {
430
                return (-1);
431
        }
432
 
433
        return (ret);
434
}
435
 
436
/*
437
        Internal state machine responsible for scheduling of requests
438
        */
439
static int ScheduleNextTraceRequest (diva_strace_context_t* pLib) {
440
        char name[64];
441
        int ret = 0;
442
        int i;
443
 
444
        if (pLib->req_busy) {
445
                return (0);
446
        }
447
 
448
  if (pLib->removal_state == 1) {
449
                if (SuperTraceREMOVE (pLib->hAdapter)) {
450
      pLib->removal_state = 3;
451
    } else {
452
      pLib->req_busy = 1;
453
      pLib->removal_state = 2;
454
    }
455
    return (0);
456
  }
457
 
458
  if (pLib->removal_state) {
459
    return (0);
460
  }
461
 
462
  if (!pLib->general_b_ch_event) {
463
                if ((ret = SuperTraceTraceOnRequest(pLib->hAdapter, "State\\B Event", pLib->buffer))) {
464
      return (-1);
465
    }
466
    pLib->general_b_ch_event = 1;
467
                pLib->req_busy = 1;
468
                return (0);
469
  }
470
 
471
  if (!pLib->general_fax_event) {
472
                if ((ret = SuperTraceTraceOnRequest(pLib->hAdapter, "State\\FAX Event", pLib->buffer))) {
473
      return (-1);
474
    }
475
    pLib->general_fax_event = 1;
476
                pLib->req_busy = 1;
477
                return (0);
478
  }
479
 
480
  if (!pLib->general_mdm_event) {
481
                if ((ret = SuperTraceTraceOnRequest(pLib->hAdapter, "State\\Modem Event", pLib->buffer))) {
482
      return (-1);
483
    }
484
    pLib->general_mdm_event = 1;
485
                pLib->req_busy = 1;
486
                return (0);
487
  }
488
 
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--;
494
                        return (-1);
495
                }
496
                pLib->req_busy = 1;
497
                return (0);
498
        }
499
 
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--;
505
                        return (-1);
506
                }
507
                pLib->req_busy = 1;
508
                return (0);
509
        }
510
 
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--;
516
                        return (-1);
517
                }
518
                pLib->req_busy = 1;
519
                return (0);
520
        }
521
 
522
        if (!pLib->trace_mask_init) {
523
                word tmp = 0x0000;
524
                if (SuperTraceWriteVar (pLib->hAdapter,
525
                                                                                                                pLib->buffer,
526
                                                                                                                "Trace\\Event Enable",
527
                                                                                                                &tmp,
528
                                                                                                                0x87, /* MI_BITFLD */
529
                                                                                                                sizeof(tmp))) {
530
                        return (-1);
531
                }
532
                pLib->trace_mask_init = 1;
533
                pLib->req_busy = 1;
534
                return (0);
535
        }
536
 
537
        if (!pLib->audio_trace_init) {
538
                dword tmp = 0x00000000;
539
                if (SuperTraceWriteVar (pLib->hAdapter,
540
                                                                                                                pLib->buffer,
541
                                                                                                                "Trace\\AudioCh# Enable",
542
                                                                                                                &tmp,
543
                                                                                                                0x87, /* MI_BITFLD */
544
                                                                                                                sizeof(tmp))) {
545
                        return (-1);
546
                }
547
                pLib->audio_trace_init = 2;
548
                pLib->req_busy = 1;
549
                return (0);
550
        }
551
 
552
        if (!pLib->bchannel_init) {
553
                dword tmp = 0x00000000;
554
                if (SuperTraceWriteVar (pLib->hAdapter,
555
                                                                                                                pLib->buffer,
556
                                                                                                                "Trace\\B-Ch# Enable",
557
                                                                                                                &tmp,
558
                                                                                                                0x87, /* MI_BITFLD */
559
                                                                                                                sizeof(tmp))) {
560
                        return (-1);
561
                }
562
                pLib->bchannel_init = 1;
563
                pLib->req_busy = 1;
564
                return (0);
565
        }
566
 
567
        if (!pLib->trace_length_init) {
568
                word tmp = 30;
569
                if (SuperTraceWriteVar (pLib->hAdapter,
570
                                                                                                                pLib->buffer,
571
                                                                                                                "Trace\\Max Log Length",
572
                                                                                                                &tmp,
573
                                                                                                                0x82, /* MI_UINT */
574
                                                                                                                sizeof(tmp))) {
575
                        return (-1);
576
                }
577
                pLib->trace_length_init = 1;
578
                pLib->req_busy = 1;
579
                return (0);
580
        }
581
 
582
        if (!pLib->trace_on) {
583
                if (SuperTraceTraceOnRequest (pLib->hAdapter,
584
                                                                                                                                        "Trace\\Log Buffer",
585
                                                                                                                                        pLib->buffer)) {
586
                        return (-1);
587
                }
588
                pLib->trace_on = 1;
589
                pLib->req_busy = 1;
590
                return (0);
591
        }
592
 
593
        if (pLib->trace_event_mask != pLib->current_trace_event_mask) {
594
                if (SuperTraceWriteVar (pLib->hAdapter,
595
                                                                                                                pLib->buffer,
596
                                                                                                                "Trace\\Event Enable",
597
                                                                                                                &pLib->trace_event_mask,
598
                                                                                                                0x87, /* MI_BITFLD */
599
                                                                                                                sizeof(pLib->trace_event_mask))) {
600
                        return (-1);
601
                }
602
                pLib->current_trace_event_mask = pLib->trace_event_mask;
603
                pLib->req_busy = 1;
604
                return (0);
605
        }
606
 
607
        if ((pLib->audio_tap_pending >= 0) && (pLib->audio_tap_mask != pLib->current_audio_tap_mask)) {
608
                if (SuperTraceWriteVar (pLib->hAdapter,
609
                                                                                                                pLib->buffer,
610
                                                                                                                "Trace\\AudioCh# Enable",
611
                                                                                                                &pLib->audio_tap_mask,
612
                                                                                                                0x87, /* MI_BITFLD */
613
                                                                                                                sizeof(pLib->audio_tap_mask))) {
614
                        return (-1);
615
                }
616
                pLib->current_audio_tap_mask = pLib->audio_tap_mask;
617
                pLib->audio_tap_pending = 1;
618
                pLib->req_busy = 1;
619
                return (0);
620
        }
621
 
622
        if ((pLib->eye_pattern_pending >= 0) && (pLib->audio_tap_mask != pLib->current_eye_pattern_mask)) {
623
                if (SuperTraceWriteVar (pLib->hAdapter,
624
                                                                                                                pLib->buffer,
625
                                                                                                                "Trace\\EyeCh# Enable",
626
                                                                                                                &pLib->audio_tap_mask,
627
                                                                                                                0x87, /* MI_BITFLD */
628
                                                                                                                sizeof(pLib->audio_tap_mask))) {
629
                        return (-1);
630
                }
631
                pLib->current_eye_pattern_mask = pLib->audio_tap_mask;
632
                pLib->eye_pattern_pending = 1;
633
                pLib->req_busy = 1;
634
                return (0);
635
        }
636
 
637
        if (pLib->bchannel_trace_mask != pLib->current_bchannel_trace_mask) {
638
                if (SuperTraceWriteVar (pLib->hAdapter,
639
                                                                                                                pLib->buffer,
640
                                                                                                                "Trace\\B-Ch# Enable",
641
                                                                                                                &pLib->bchannel_trace_mask,
642
                                                                                                                0x87, /* MI_BITFLD */
643
                                                                                                                sizeof(pLib->bchannel_trace_mask))) {
644
                        return (-1);
645
                }
646
                pLib->current_bchannel_trace_mask = pLib->bchannel_trace_mask;
647
                pLib->req_busy = 1;
648
                return (0);
649
        }
650
 
651
        if (!pLib->trace_events_down) {
652
                if (SuperTraceTraceOnRequest (pLib->hAdapter,
653
                                                                                                                                        "Events Down",
654
                                                                                                                                        pLib->buffer)) {
655
                        return (-1);
656
                }
657
                pLib->trace_events_down = 1;
658
                pLib->req_busy = 1;
659
                return (0);
660
        }
661
 
662
        if (!pLib->l1_trace) {
663
                if (SuperTraceTraceOnRequest (pLib->hAdapter,
664
                                                                                                                                        "State\\Layer1",
665
                                                                                                                                        pLib->buffer)) {
666
                        return (-1);
667
                }
668
                pLib->l1_trace = 1;
669
                pLib->req_busy = 1;
670
                return (0);
671
        }
672
 
673
        if (!pLib->l2_trace) {
674
                if (SuperTraceTraceOnRequest (pLib->hAdapter,
675
                                                                                                                                        "State\\Layer2 No1",
676
                                                                                                                                        pLib->buffer)) {
677
                        return (-1);
678
                }
679
                pLib->l2_trace = 1;
680
                pLib->req_busy = 1;
681
                return (0);
682
        }
683
 
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)) {
688
                                return (-1);
689
                        }
690
                        pLib->pending_line_status &= ~(1L << i);
691
                        pLib->req_busy = 1;
692
                        return (0);
693
                }
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)) {
697
                                return (-1);
698
                        }
699
                        pLib->pending_modem_status &= ~(1L << i);
700
                        pLib->req_busy = 1;
701
                        return (0);
702
                }
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)) {
706
                                return (-1);
707
                        }
708
                        pLib->pending_fax_status &= ~(1L << i);
709
                        pLib->req_busy = 1;
710
                        return (0);
711
                }
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)) {
715
                                return (-1);
716
                        }
717
                        pLib->clear_call_command &= ~(1L << i);
718
                        pLib->req_busy = 1;
719
                        return (0);
720
                }
721
        }
722
 
723
        if (pLib->outgoing_ifc_stats) {
724
                if (SuperTraceReadRequest (pLib->hAdapter,
725
                                                                                                                         "Statistics\\Outgoing Calls",
726
                                                                                                                         pLib->buffer)) {
727
                        return (-1);
728
                }
729
                pLib->outgoing_ifc_stats = 0;
730
                pLib->req_busy = 1;
731
                return (0);
732
        }
733
 
734
        if (pLib->incoming_ifc_stats) {
735
                if (SuperTraceReadRequest (pLib->hAdapter,
736
                                                                                                                         "Statistics\\Incoming Calls",
737
                                                                                                                         pLib->buffer)) {
738
                        return (-1);
739
                }
740
                pLib->incoming_ifc_stats = 0;
741
                pLib->req_busy = 1;
742
                return (0);
743
        }
744
 
745
        if (pLib->modem_ifc_stats) {
746
                if (SuperTraceReadRequest (pLib->hAdapter,
747
                                                                                                                         "Statistics\\Modem",
748
                                                                                                                         pLib->buffer)) {
749
                        return (-1);
750
                }
751
                pLib->modem_ifc_stats = 0;
752
                pLib->req_busy = 1;
753
                return (0);
754
        }
755
 
756
        if (pLib->fax_ifc_stats) {
757
                if (SuperTraceReadRequest (pLib->hAdapter,
758
                                                                                                                         "Statistics\\FAX",
759
                                                                                                                         pLib->buffer)) {
760
                        return (-1);
761
                }
762
                pLib->fax_ifc_stats = 0;
763
                pLib->req_busy = 1;
764
                return (0);
765
        }
766
 
767
        if (pLib->b1_ifc_stats) {
768
                if (SuperTraceReadRequest (pLib->hAdapter,
769
                                                                                                                         "Statistics\\B-Layer1",
770
                                                                                                                         pLib->buffer)) {
771
                        return (-1);
772
                }
773
                pLib->b1_ifc_stats = 0;
774
                pLib->req_busy = 1;
775
                return (0);
776
        }
777
 
778
        if (pLib->b2_ifc_stats) {
779
                if (SuperTraceReadRequest (pLib->hAdapter,
780
                                                                                                                         "Statistics\\B-Layer2",
781
                                                                                                                         pLib->buffer)) {
782
                        return (-1);
783
                }
784
                pLib->b2_ifc_stats = 0;
785
                pLib->req_busy = 1;
786
                return (0);
787
        }
788
 
789
        if (pLib->d1_ifc_stats) {
790
                if (SuperTraceReadRequest (pLib->hAdapter,
791
                                                                                                                         "Statistics\\D-Layer1",
792
                                                                                                                         pLib->buffer)) {
793
                        return (-1);
794
                }
795
                pLib->d1_ifc_stats = 0;
796
                pLib->req_busy = 1;
797
                return (0);
798
        }
799
 
800
        if (pLib->d2_ifc_stats) {
801
                if (SuperTraceReadRequest (pLib->hAdapter,
802
                                                                                                                         "Statistics\\D-Layer2",
803
                                                                                                                         pLib->buffer)) {
804
                        return (-1);
805
                }
806
                pLib->d2_ifc_stats = 0;
807
                pLib->req_busy = 1;
808
                return (0);
809
        }
810
 
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;
816
                        return (-1);
817
                }
818
                pLib->req_busy = 1;
819
                return (0);
820
        }
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;
826
                        return (-1);
827
                }
828
                pLib->req_busy = 1;
829
                return (0);
830
        }
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;
836
                        return (-1);
837
                }
838
                pLib->req_busy = 1;
839
                return (0);
840
        }
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;
846
                        return (-1);
847
                }
848
                pLib->req_busy = 1;
849
                return (0);
850
        }
851
 
852
        return (0);
853
}
854
 
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;
858
        char name[64];
859
        int i;
860
 
861
        if (!strncmp("State\\B Event", path, pVar->path_length)) {
862
    dword ch_id;
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);
867
        }
868
        return (0);
869
      } else if (ch_id && ch_id <= pLib->Channels) {
870
        return (diva_line_event(pLib, (int)ch_id));
871
      }
872
      return (0);
873
    }
874
    return (-1);
875
  }
876
 
877
        if (!strncmp("State\\FAX Event", path, pVar->path_length)) {
878
    dword ch_id;
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);
883
        }
884
        return (0);
885
      } else if (ch_id && ch_id <= pLib->Channels) {
886
        return (diva_fax_event(pLib, (int)ch_id));
887
      }
888
      return (0);
889
    }
890
    return (-1);
891
  }
892
 
893
        if (!strncmp("State\\Modem Event", path, pVar->path_length)) {
894
    dword ch_id;
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);
899
        }
900
        return (0);
901
      } else if (ch_id && ch_id <= pLib->Channels) {
902
        return (diva_modem_event(pLib, (int)ch_id));
903
      }
904
      return (0);
905
    }
906
    return (-1);
907
  }
908
 
909
        /*
910
                First look for Line Event
911
                */
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));
916
                }
917
        }
918
 
919
        /*
920
                Look for Moden Progress Event
921
                */
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));
926
                }
927
        }
928
 
929
        /*
930
                Look for Fax Event
931
                */
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));
936
                }
937
        }
938
 
939
        /*
940
                Notification about loss of events
941
                */
942
        if (!strncmp("Events Down", path, pVar->path_length)) {
943
                if (pLib->trace_events_down == 1) {
944
                        pLib->trace_events_down = 2;
945
                } else {
946
                        diva_trace_error (pLib, 1, "Events Down", 0);
947
                }
948
                return (0);
949
        }
950
 
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) {
954
                        pLib->l1_trace = 2;
955
                } else {
956
                        diva_trace_notify_user (pLib, 0, DIVA_SUPER_TRACE_INTERFACE_CHANGE);
957
                }
958
                return (0);
959
        }
960
        if (!strncmp("State\\Layer2 No1", path, pVar->path_length)) {
961
                char* tmp = &pLib->lines[0].pInterface->Layer2[0];
962
    dword l2_state;
963
    diva_strace_read_uint (pVar, &l2_state);
964
 
965
                switch (l2_state) {
966
                        case 0:
967
                                strcpy (tmp, "Idle");
968
                                break;
969
                        case 1:
970
                                strcpy (tmp, "Layer2 UP");
971
                                break;
972
                        case 2:
973
                                strcpy (tmp, "Layer2 Disconnecting");
974
                                break;
975
                        case 3:
976
                                strcpy (tmp, "Layer2 Connecting");
977
                                break;
978
                        case 4:
979
                                strcpy (tmp, "SPID Initializing");
980
                                break;
981
                        case 5:
982
                                strcpy (tmp, "SPID Initialised");
983
                                break;
984
                        case 6:
985
                                strcpy (tmp, "Layer2 Connecting");
986
                                break;
987
 
988
                        case  7:
989
                                strcpy (tmp, "Auto SPID Stopped");
990
                                break;
991
 
992
                        case  8:
993
                                strcpy (tmp, "Auto SPID Idle");
994
                                break;
995
 
996
                        case  9:
997
                                strcpy (tmp, "Auto SPID Requested");
998
                                break;
999
 
1000
                        case  10:
1001
                                strcpy (tmp, "Auto SPID Delivery");
1002
                                break;
1003
 
1004
                        case 11:
1005
                                strcpy (tmp, "Auto SPID Complete");
1006
                                break;
1007
 
1008
                        default:
1009
                                sprintf (tmp, "U:%d", (int)l2_state);
1010
                }
1011
                if (pLib->l2_trace == 1) {
1012
                        pLib->l2_trace = 2;
1013
                } else {
1014
                        diva_trace_notify_user (pLib, 0, DIVA_SUPER_TRACE_INTERFACE_CHANGE);
1015
                }
1016
                return (0);
1017
        }
1018
 
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));
1022
        }
1023
 
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));
1027
        }
1028
 
1029
        return (-1);
1030
}
1031
 
1032
static int diva_line_event (diva_strace_context_t* pLib, int Channel) {
1033
        pLib->pending_line_status |= (1L << (Channel-1));
1034
        return (0);
1035
}
1036
 
1037
static int diva_modem_event (diva_strace_context_t* pLib, int Channel) {
1038
        pLib->pending_modem_status |= (1L << (Channel-1));
1039
        return (0);
1040
}
1041
 
1042
static int diva_fax_event (diva_strace_context_t* pLib, int Channel) {
1043
        pLib->pending_fax_status |= (1L << (Channel-1));
1044
        return (0);
1045
}
1046
 
1047
/*
1048
        Process INFO indications that arrive from the card
1049
        Uses path of first I.E. to detect the source of the
1050
        infication
1051
        */
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;
1055
        char name[64];
1056
        int i, len;
1057
 
1058
        /*
1059
                First look for Modem Status Info
1060
                */
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));
1065
                }
1066
        }
1067
 
1068
        /*
1069
                Look for Fax Status Info
1070
                */
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));
1075
                }
1076
        }
1077
 
1078
        /*
1079
                Look for Line Status Info
1080
                */
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));
1085
                }
1086
        }
1087
 
1088
        if (!diva_ifc_statistics (pLib, pVar)) {
1089
                return (0);
1090
        }
1091
 
1092
        return (-1);
1093
}
1094
 
1095
/*
1096
        MODEM INSTANCE STATE UPDATE
1097
 
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
1101
        */
1102
static int diva_modem_info (diva_strace_context_t* pLib,
1103
                                                                                                                int Channel,
1104
                                                                                                                diva_man_var_header_t* pVar) {
1105
        diva_man_var_header_t* cur;
1106
        int i, nr = Channel - 1;
1107
 
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__);
1113
                                return (-1);
1114
                        }
1115
                } else {
1116
                        diva_trace_error (pLib, -2 , __FILE__, __LINE__);
1117
                        return (-1);
1118
                }
1119
        }
1120
 
1121
        /*
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
1125
                */
1126
        if (pLib->modem_init_event & (1L << nr)) {
1127
                diva_trace_notify_user (pLib, nr, DIVA_SUPER_TRACE_NOTIFY_MODEM_CHANGE);
1128
        } else {
1129
                pLib->modem_init_event |= (1L << nr);
1130
        }
1131
 
1132
        return (0);
1133
}
1134
 
1135
static int diva_fax_info (diva_strace_context_t* pLib,
1136
                                                                                                        int Channel,
1137
                                                                                                        diva_man_var_header_t* pVar) {
1138
        diva_man_var_header_t* cur;
1139
        int i, nr = Channel - 1;
1140
 
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__);
1146
                                return (-1);
1147
                        }
1148
                } else {
1149
                        diva_trace_error (pLib, -2 , __FILE__, __LINE__);
1150
                        return (-1);
1151
                }
1152
        }
1153
 
1154
        /*
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
1158
                */
1159
        if (pLib->fax_init_event & (1L << nr)) {
1160
                diva_trace_notify_user (pLib, nr, DIVA_SUPER_TRACE_NOTIFY_FAX_CHANGE);
1161
        } else {
1162
                pLib->fax_init_event |= (1L << nr);
1163
        }
1164
 
1165
        return (0);
1166
}
1167
 
1168
/*
1169
        LINE STATE UPDATE
1170
        Update Line Status Information and issue notification to user,
1171
        that will inform about change in the line state.
1172
        */
1173
static int diva_line_info  (diva_strace_context_t* pLib,
1174
                                                                                                                int Channel,
1175
                                                                                                                diva_man_var_header_t* pVar) {
1176
        diva_man_var_header_t* cur;
1177
        int i, nr = Channel - 1;
1178
 
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__);
1184
                                return (-1);
1185
                        }
1186
                } else {
1187
                        diva_trace_error (pLib, -2 , __FILE__, __LINE__);
1188
                        return (-1);
1189
                }
1190
        }
1191
 
1192
        /*
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
1196
 
1197
                Exception is is if the line is "online". In this case we have to notify
1198
                user about this confition.
1199
                */
1200
        if (pLib->line_init_event & (1L << nr)) {
1201
                diva_trace_notify_user (pLib, nr, DIVA_SUPER_TRACE_NOTIFY_LINE_CHANGE);
1202
        } else {
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);
1206
                }
1207
        }
1208
 
1209
        return (0);
1210
}
1211
 
1212
/*
1213
        Move position to next vatianle in the chain
1214
        */
1215
static diva_man_var_header_t* get_next_var (diva_man_var_header_t* pVar) {
1216
        byte* msg   = (byte*)pVar;
1217
        byte* start;
1218
        int msg_length;
1219
 
1220
        if (*msg != ESC) return NULL;
1221
 
1222
        start = msg + 2;
1223
        msg_length = *(msg+1);
1224
        msg = (start+msg_length);
1225
 
1226
        if (*msg != ESC) return NULL;
1227
 
1228
        return ((diva_man_var_header_t*)msg);
1229
}
1230
 
1231
/*
1232
        Move position to variable with given name
1233
        */
1234
static diva_man_var_header_t* find_var (diva_man_var_header_t* pVar,
1235
                                                                                                                                                                const char* name) {
1236
        const char* path;
1237
 
1238
        do {
1239
                path = (char*)&pVar->path_length+1;
1240
 
1241
                if (!strncmp (name, path, pVar->path_length)) {
1242
                        break;
1243
                }
1244
        } while ((pVar = get_next_var (pVar)));
1245
 
1246
        return (pVar);
1247
}
1248
 
1249
static void diva_create_line_parse_table  (diva_strace_context_t* pLib,
1250
                                                                                                                                                                         int Channel) {
1251
        diva_trace_line_state_t* pLine = &pLib->lines[Channel];
1252
        int nr = Channel+1;
1253
 
1254
        if ((pLib->cur_parse_entry + LINE_PARSE_ENTRIES) >= pLib->parse_entries) {
1255
                diva_trace_error (pLib, -1, __FILE__, __LINE__);
1256
                return;
1257
        }
1258
 
1259
        pLine->ChannelNumber = nr;
1260
 
1261
        pLib->line_parse_entry_first[Channel] = pLib->cur_parse_entry;
1262
 
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];
1266
 
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];
1270
 
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];
1274
 
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];
1278
 
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];
1283
 
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];
1288
 
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];
1293
 
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];
1298
 
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;
1302
 
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;
1306
 
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;
1310
 
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;
1314
 
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;
1318
 
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;
1323
 
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];
1327
 
1328
        pLib->line_parse_entry_last[Channel] = pLib->cur_parse_entry - 1;
1329
}
1330
 
1331
static void diva_create_fax_parse_table (diva_strace_context_t* pLib,
1332
                                                                                                                                                                 int Channel) {
1333
        diva_trace_fax_state_t* pFax = &pLib->lines[Channel].fax;
1334
        int nr = Channel+1;
1335
 
1336
        if ((pLib->cur_parse_entry + FAX_PARSE_ENTRIES) >= pLib->parse_entries) {
1337
                diva_trace_error (pLib, -1, __FILE__, __LINE__);
1338
                return;
1339
        }
1340
        pFax->ChannelNumber = nr;
1341
 
1342
        pLib->fax_parse_entry_first[Channel] = pLib->cur_parse_entry;
1343
 
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;
1347
 
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;
1351
 
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;
1355
 
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];
1359
 
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];
1363
 
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];
1367
 
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;
1371
 
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;
1375
 
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;
1379
 
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;
1383
 
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;
1387
 
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;
1391
 
1392
        pLib->fax_parse_entry_last[Channel] = pLib->cur_parse_entry - 1;
1393
}
1394
 
1395
static void diva_create_modem_parse_table (diva_strace_context_t* pLib,
1396
                                                                                                                                                                         int Channel) {
1397
        diva_trace_modem_state_t* pModem = &pLib->lines[Channel].modem;
1398
        int nr = Channel+1;
1399
 
1400
        if ((pLib->cur_parse_entry + MODEM_PARSE_ENTRIES) >= pLib->parse_entries) {
1401
                diva_trace_error (pLib, -1, __FILE__, __LINE__);
1402
                return;
1403
        }
1404
        pModem->ChannelNumber = nr;
1405
 
1406
        pLib->modem_parse_entry_first[Channel] = pLib->cur_parse_entry;
1407
 
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;
1411
 
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;
1415
 
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;
1419
 
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;
1423
 
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;
1427
 
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;
1431
 
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;
1435
 
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;
1439
 
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;
1443
 
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;
1447
 
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;
1451
 
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;
1455
 
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;
1459
 
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;
1463
 
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;
1467
 
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;
1471
 
1472
        pLib->modem_parse_entry_last[Channel] = pLib->cur_parse_entry - 1;
1473
}
1474
 
1475
static void diva_create_parse_table (diva_strace_context_t* pLib) {
1476
        int i;
1477
 
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);
1482
        }
1483
 
1484
        pLib->statistic_parse_first = pLib->cur_parse_entry;
1485
 
1486
        /*
1487
                Outgoing Calls
1488
                */
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;
1493
 
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;
1498
 
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;
1503
 
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;
1508
 
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;
1513
 
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;
1518
 
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;
1523
 
1524
        /*
1525
                Incoming Calls
1526
                */
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;
1531
 
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;
1536
 
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;
1541
 
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;
1546
 
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;
1551
 
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;
1556
 
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;
1561
 
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;
1566
 
1567
        /*
1568
                Modem Statistics
1569
                */
1570
        pLib->mdm_statistic_parse_first = pLib->cur_parse_entry;
1571
 
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;
1576
 
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;
1581
 
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;
1586
 
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;
1591
 
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;
1596
 
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;
1601
 
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;
1606
 
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;
1611
 
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;
1616
 
1617
        pLib->mdm_statistic_parse_last  = pLib->cur_parse_entry - 1;
1618
 
1619
        /*
1620
                Fax Statistics
1621
                */
1622
        pLib->fax_statistic_parse_first = pLib->cur_parse_entry;
1623
 
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;
1628
 
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;
1633
 
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;
1638
 
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;
1643
 
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;
1648
 
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;
1653
 
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;
1658
 
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;
1663
 
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;
1668
 
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;
1673
 
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;
1678
 
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;
1683
 
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;
1688
 
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;
1693
 
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;
1698
 
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;
1703
 
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;
1708
 
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;
1713
 
1714
        pLib->fax_statistic_parse_last  = pLib->cur_parse_entry - 1;
1715
 
1716
        /*
1717
                B-Layer1"
1718
                */
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;
1723
 
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;
1728
 
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;
1733
 
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;
1738
 
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;
1743
 
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;
1748
 
1749
        /*
1750
                B-Layer2
1751
                */
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;
1756
 
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;
1761
 
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;
1766
 
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;
1771
 
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;
1776
 
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;
1781
 
1782
        /*
1783
                D-Layer1
1784
                */
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;
1789
 
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;
1794
 
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;
1799
 
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;
1804
 
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;
1809
 
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;
1814
 
1815
        /*
1816
                D-Layer2
1817
                */
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;
1822
 
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;
1827
 
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;
1832
 
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;
1837
 
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;
1842
 
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;
1847
 
1848
 
1849
        pLib->statistic_parse_last  = pLib->cur_parse_entry - 1;
1850
}
1851
 
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,
1858
                                                                                                                                                                                error, file, line);
1859
        }
1860
}
1861
 
1862
/*
1863
        Delivery notification to user
1864
        */
1865
static void diva_trace_notify_user (diva_strace_context_t* pLib,
1866
                                                                                                                 int Channel,
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,
1870
                                                                                                                                                                         &pLib->instance,
1871
                                                                                                                                                                         pLib->Adapter,
1872
                                                                                                                                                                         &pLib->lines[Channel],
1873
                                                                                                                                                                         notify_subject);
1874
        }
1875
}
1876
 
1877
/*
1878
        Read variable value to they destination based on the variable type
1879
        */
1880
static int diva_trace_read_variable (diva_man_var_header_t* pVar,
1881
                                                                                                                                                 void* variable) {
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));
1897
        }
1898
 
1899
        /*
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.
1903
                */
1904
        return (-1);
1905
}
1906
 
1907
/*
1908
        Read signed integer to destination
1909
        */
1910
static int diva_strace_read_int  (diva_man_var_header_t* pVar, int* var) {
1911
        byte* ptr = (char*)&pVar->path_length;
1912
        int value;
1913
 
1914
        ptr += (pVar->path_length + 1);
1915
 
1916
        switch (pVar->value_length) {
1917
                case 1:
1918
                        value = *(char*)ptr;
1919
                        break;
1920
 
1921
                case 2:
1922
                        value = (short)GET_WORD(ptr);
1923
                        break;
1924
 
1925
                case 4:
1926
                        value = (int)GET_DWORD(ptr);
1927
                        break;
1928
 
1929
                default:
1930
                        return (-1);
1931
        }
1932
 
1933
        *var = value;
1934
 
1935
        return (0);
1936
}
1937
 
1938
static int diva_strace_read_uint (diva_man_var_header_t* pVar, dword* var) {
1939
        byte* ptr = (char*)&pVar->path_length;
1940
        dword value;
1941
 
1942
        ptr += (pVar->path_length + 1);
1943
 
1944
        switch (pVar->value_length) {
1945
                case 1:
1946
                        value = (byte)(*ptr);
1947
                        break;
1948
 
1949
                case 2:
1950
                        value = (word)GET_WORD(ptr);
1951
                        break;
1952
 
1953
                case 3:
1954
                        value  = (dword)GET_DWORD(ptr);
1955
                        value &= 0x00ffffff;
1956
                        break;
1957
 
1958
                case 4:
1959
                        value = (dword)GET_DWORD(ptr);
1960
                        break;
1961
 
1962
                default:
1963
                        return (-1);
1964
        }
1965
 
1966
        *var = value;
1967
 
1968
        return (0);
1969
}
1970
 
1971
/*
1972
        Read zero terminated ASCII string
1973
        */
1974
static int diva_strace_read_asz  (diva_man_var_header_t* pVar, char* var) {
1975
        char* ptr = (char*)&pVar->path_length;
1976
        int length;
1977
 
1978
        ptr += (pVar->path_length + 1);
1979
 
1980
        if (!(length = pVar->value_length)) {
1981
                length = strlen (ptr);
1982
        }
1983
        memcpy (var, ptr, length);
1984
        var[length] = 0;
1985
 
1986
        return (0);
1987
}
1988
 
1989
/*
1990
        Read counted (with leading length byte) ASCII string
1991
        */
1992
static int diva_strace_read_asc  (diva_man_var_header_t* pVar, char* var) {
1993
        char* ptr = (char*)&pVar->path_length;
1994
 
1995
        ptr += (pVar->path_length + 1);
1996
        memcpy (var, ptr+1, *ptr);
1997
        var[(int)*ptr] = 0;
1998
 
1999
        return (0);
2000
}
2001
 
2002
/*
2003
                Read one information element - i.e. one string of byte values with
2004
                one length byte in front
2005
        */
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;
2009
 
2010
        ptr += (pVar->path_length + 1);
2011
 
2012
        var->length = *ptr;
2013
        memcpy (&var->data[0], ptr+1, *ptr);
2014
 
2015
        return (0);
2016
}
2017
 
2018
static int SuperTraceSetAudioTap  (void* hLib, int Channel, int on) {
2019
        diva_strace_context_t* pLib = (diva_strace_context_t*)hLib;
2020
 
2021
        if ((Channel < 1) || (Channel > pLib->Channels)) {
2022
                return (-1);
2023
        }
2024
        Channel--;
2025
 
2026
        if (on) {
2027
                pLib->audio_tap_mask |=  (1L << Channel);
2028
        } else {
2029
                pLib->audio_tap_mask &= ~(1L << Channel);
2030
        }
2031
 
2032
  /*
2033
    EYE patterns have TM_M_DATA set as additional
2034
    condition
2035
    */
2036
  if (pLib->audio_tap_mask) {
2037
    pLib->trace_event_mask |= TM_M_DATA;
2038
  } else {
2039
    pLib->trace_event_mask &= ~TM_M_DATA;
2040
  }
2041
 
2042
        return (ScheduleNextTraceRequest (pLib));
2043
}
2044
 
2045
static int SuperTraceSetBChannel  (void* hLib, int Channel, int on) {
2046
        diva_strace_context_t* pLib = (diva_strace_context_t*)hLib;
2047
 
2048
        if ((Channel < 1) || (Channel > pLib->Channels)) {
2049
                return (-1);
2050
        }
2051
        Channel--;
2052
 
2053
        if (on) {
2054
                pLib->bchannel_trace_mask |=  (1L << Channel);
2055
        } else {
2056
                pLib->bchannel_trace_mask &= ~(1L << Channel);
2057
        }
2058
 
2059
        return (ScheduleNextTraceRequest (pLib));
2060
}
2061
 
2062
static int SuperTraceSetDChannel  (void* hLib, int on) {
2063
        diva_strace_context_t* pLib = (diva_strace_context_t*)hLib;
2064
 
2065
        if (on) {
2066
                pLib->trace_event_mask |= (TM_D_CHAN | TM_C_COMM | TM_DL_ERR | TM_LAYER1);
2067
        } else {
2068
                pLib->trace_event_mask &= ~(TM_D_CHAN | TM_C_COMM | TM_DL_ERR | TM_LAYER1);
2069
        }
2070
 
2071
        return (ScheduleNextTraceRequest (pLib));
2072
}
2073
 
2074
static int SuperTraceSetInfo (void* hLib, int on) {
2075
        diva_strace_context_t* pLib = (diva_strace_context_t*)hLib;
2076
 
2077
        if (on) {
2078
                pLib->trace_event_mask |= TM_STRING;
2079
        } else {
2080
                pLib->trace_event_mask &= ~TM_STRING;
2081
        }
2082
 
2083
        return (ScheduleNextTraceRequest (pLib));
2084
}
2085
 
2086
static int SuperTraceClearCall (void* hLib, int Channel) {
2087
        diva_strace_context_t* pLib = (diva_strace_context_t*)hLib;
2088
 
2089
        if ((Channel < 1) || (Channel > pLib->Channels)) {
2090
                return (-1);
2091
        }
2092
        Channel--;
2093
 
2094
        pLib->clear_call_command |= (1L << Channel);
2095
 
2096
        return (ScheduleNextTraceRequest (pLib));
2097
}
2098
 
2099
/*
2100
        Parse and update cumulative statistice
2101
        */
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;
2106
 
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__);
2111
                                return (-1);
2112
                        }
2113
                        one_updated = 1;
2114
      if ((i >= pLib->mdm_statistic_parse_first) && (i <= pLib->mdm_statistic_parse_last)) {
2115
        mdm_updated = 1;
2116
      }
2117
      if ((i >= pLib->fax_statistic_parse_first) && (i <= pLib->fax_statistic_parse_last)) {
2118
        fax_updated = 1;
2119
      }
2120
                }
2121
        }
2122
 
2123
        /*
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
2127
                */
2128
  if (mdm_updated) {
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);
2134
        }
2135
 
2136
        return (one_updated ? 0 : -1);
2137
}
2138
 
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));
2143
}
2144
 
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));
2149
}
2150
 
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));
2155
}
2156
 
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));
2161
}
2162
 
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));
2167
}
2168
 
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));
2173
}
2174
 
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));
2179
}
2180
 
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));
2185
}
2186
 
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)));
2193
}
2194
 

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.