00001
00035 #include "libsangoma-pvt.h"
00036
00037 #if defined(__WINDOWS__)
00038 # include <setupapi.h>
00039 # include <initguid.h>
00040 # include <devguid.h>
00041 # include "public.h"
00042
00043 # define MAX_COMP_INSTID 2096
00044 # define MAX_COMP_DESC 2096
00045 # define MAX_FRIENDLY 2096
00046 # define TMP_BUFFER_LEN 256
00047
00049 # define INVALID_INDEX (uint32_t) -1
00050 # define WP_ALL_BITS_SET ((uint32_t)-1)
00051 #endif
00052
00053 int libsng_dbg_level = 0;
00054
00055
00059 #if defined(__WINDOWS__)
00060 #define DBG_REGISTRY if(libsng_dbg_level)libsng_dbg
00061
00062
00063
00064
00065
00066
00067
00068
00069 static void LibSangomaDecodeLastError(LPSTR lpszFunction)
00070 {
00071 LPVOID lpMsgBuf;
00072 DWORD dwLastErr = GetLastError();
00073 FormatMessage(
00074 FORMAT_MESSAGE_ALLOCATE_BUFFER |
00075 FORMAT_MESSAGE_FROM_SYSTEM |
00076 FORMAT_MESSAGE_IGNORE_INSERTS,
00077 NULL,
00078 dwLastErr,
00079 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
00080 (LPTSTR) &lpMsgBuf,
00081 0,
00082 NULL
00083 );
00084
00085 DBG_POLL("Last Error in %s(): %s (%d)\n", lpszFunction, (char*)lpMsgBuf, dwLastErr);
00086
00087 LocalFree( lpMsgBuf );
00088 }
00089
00090
00091
00092
00093
00094
00095
00096
00097 static u16 handle_device_ioctl_result(int bResult, char *caller_name)
00098 {
00099 if(bResult == 0){
00100
00101 LibSangomaDecodeLastError(caller_name);
00102 return SANG_STATUS_IO_ERROR;
00103 }else{
00104 return SANG_STATUS_SUCCESS;
00105 }
00106 }
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116 int UdpManagementCommand(sng_fd_t fd, wan_udp_hdr_t* wan_udp)
00117 {
00118 DWORD ln, bIoResult;
00119 unsigned char id = 0;
00120
00121 wan_udp->wan_udphdr_request_reply = 0x01;
00122 wan_udp->wan_udphdr_id = id;
00123 wan_udp->wan_udphdr_return_code = WAN_UDP_TIMEOUT_CMD;
00124
00125 bIoResult = DeviceIoControl(
00126 fd,
00127 IoctlManagementCommand,
00128 (LPVOID)wan_udp,
00129 sizeof(wan_udp_hdr_t),
00130 (LPVOID)wan_udp,
00131 sizeof(wan_udp_hdr_t),
00132 (LPDWORD)(&ln),
00133 (LPOVERLAPPED)NULL
00134 );
00135
00136 return handle_device_ioctl_result(bIoResult, __FUNCTION__);
00137 }
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147 static int tdmv_api_ioctl(sng_fd_t fd, wanpipe_tdm_api_cmd_t *api_cmd)
00148 {
00149 DWORD ln, bIoResult;
00150
00151 bIoResult = DeviceIoControl(
00152 fd,
00153 IoctlTdmApiCommand,
00154 (LPVOID)api_cmd,
00155 sizeof(wanpipe_tdm_api_cmd_t),
00156 (LPVOID)api_cmd,
00157 sizeof(wanpipe_tdm_api_cmd_t),
00158 (LPDWORD)(&ln),
00159 (LPOVERLAPPED)NULL
00160 );
00161
00162 return handle_device_ioctl_result(bIoResult, __FUNCTION__);
00163 }
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174 static USHORT DoReadCommand(sng_fd_t fd, RX_DATA_STRUCT * pRx)
00175 {
00176 DWORD ln, bIoResult;
00177
00178 bIoResult = DeviceIoControl(
00179 fd,
00180 IoctlReadCommandNonBlocking,
00181 (LPVOID)NULL,
00182 0,
00183 (LPVOID)pRx,
00184 sizeof(RX_DATA_STRUCT),
00185 (LPDWORD)(&ln),
00186 (LPOVERLAPPED)NULL);
00187
00188 return handle_device_ioctl_result(bIoResult, __FUNCTION__);
00189 }
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201 static UCHAR DoWriteCommand(sng_fd_t fd,
00202 void *input_data_buffer, u32 size_of_input_data_buffer,
00203 void *output_data_buffer, u32 size_of_output_data_buffer
00204 )
00205 {
00206 DWORD BytesReturned, bIoResult;
00207
00208 bIoResult = DeviceIoControl(
00209 fd,
00210 IoctlWriteCommandNonBlocking,
00211 (LPVOID)input_data_buffer,
00212 size_of_input_data_buffer,
00213 (LPVOID)output_data_buffer,
00214 size_of_output_data_buffer,
00215 (LPDWORD)(&BytesReturned),
00216 (LPOVERLAPPED)NULL);
00217
00218 return (UCHAR)handle_device_ioctl_result(bIoResult, __FUNCTION__);
00219 }
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231 static USHORT sangoma_poll_fd(sng_fd_t fd, API_POLL_STRUCT *api_poll_ptr)
00232 {
00233 DWORD ln, bIoResult;
00234
00235 bIoResult = DeviceIoControl(
00236 fd,
00237 IoctlApiPoll,
00238 (LPVOID)NULL,
00239 0L,
00240 (LPVOID)api_poll_ptr,
00241 sizeof(API_POLL_STRUCT),
00242 (LPDWORD)(&ln),
00243 (LPOVERLAPPED)NULL);
00244
00245 return handle_device_ioctl_result(bIoResult, __FUNCTION__);
00246 }
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256 static sangoma_status_t logger_api_ioctl(sng_fd_t fd, wp_logger_cmd_t *logger_cmd)
00257 {
00258 DWORD ln, bIoResult;
00259
00260 bIoResult = DeviceIoControl(
00261 fd,
00262 IoctlLoggerApiCommand,
00263 (LPVOID)logger_cmd,
00264 sizeof(wp_logger_cmd_t),
00265 (LPVOID)logger_cmd,
00266 sizeof(wp_logger_cmd_t),
00267 (LPDWORD)(&ln),
00268 (LPOVERLAPPED)NULL );
00269
00270 return handle_device_ioctl_result(bIoResult, __FUNCTION__);
00271 }
00272
00273
00274 sangoma_status_t _LIBSNG_CALL sangoma_cdev_ctrl_cmd(sng_fd_t fd, wanpipe_tdm_api_cmd_t *api_cmd)
00275 {
00276 DWORD ln, bIoResult;
00277
00278 bIoResult = DeviceIoControl(
00279 fd,
00280 IoctlCdevControlCommand,
00281 (LPVOID)api_cmd,
00282 sizeof(wanpipe_tdm_api_cmd_t),
00283 (LPVOID)api_cmd,
00284 sizeof(wanpipe_tdm_api_cmd_t),
00285 (LPDWORD)(&ln),
00286 (LPOVERLAPPED)NULL
00287 );
00288
00289 return handle_device_ioctl_result(bIoResult, __FUNCTION__);
00290 }
00291
00292 static sangoma_status_t init_sangoma_event_object(sangoma_wait_obj_t *sng_wait_obj, sng_fd_t fd)
00293 {
00294 wanpipe_tdm_api_cmd_t tdm_api_cmd;
00295 sangoma_status_t sng_status;
00296 char event_name[200];
00297
00298 memset(&tdm_api_cmd, 0x00, sizeof(tdm_api_cmd));
00299
00300 tdm_api_cmd.cmd = WP_CDEV_CMD_GET_INTERFACE_NAME;
00301 sng_status = sangoma_cdev_ctrl_cmd(fd, &tdm_api_cmd);
00302 if(SANG_ERROR(sng_status)){
00303 DBG_ERR("sangoma_cdev_ctrl_cmd() failed!\n");
00304 return sng_status;
00305 }
00306
00307 DBG_EVNT("%s(): interface name: %s\n", __FUNCTION__, tdm_api_cmd.data);
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317 _snprintf(event_name, sizeof(event_name), "Global\\%s_signal", tdm_api_cmd.data);
00318
00319 sng_wait_obj->signal_object = OpenEvent(EVENT_ALL_ACCESS, TRUE, event_name);
00320 if(NULL == sng_wait_obj->signal_object){
00321
00322 LibSangomaDecodeLastError(__FUNCTION__);
00323 return SANG_STATUS_GENERAL_ERROR;
00324 }
00325
00326 return SANG_STATUS_SUCCESS;
00327 }
00328
00329 static sangoma_status_t sangoma_wait_obj_poll(sangoma_wait_obj_t *sangoma_wait_object, int flags_in, uint32_t *flags_out)
00330 {
00331 int err;
00332 sangoma_wait_obj_t *sng_wait_obj = sangoma_wait_object;
00334 API_POLL_STRUCT api_poll;
00335
00336 *flags_out = 0;
00337
00338 memset(&api_poll, 0x00, sizeof(api_poll));
00339 api_poll.user_flags_bitmap = flags_in;
00340
00341
00342 if(sangoma_poll_fd(sng_wait_obj->fd, &api_poll)){
00343
00344 return SANG_STATUS_IO_ERROR;
00345 }
00346
00347 if(api_poll.operation_status == SANG_STATUS_SUCCESS){
00348 *flags_out = api_poll.poll_events_bitmap;
00349 err = 0;
00350 }else{
00351
00352 err = api_poll.operation_status;
00353 }
00354
00355 if(*flags_out == 0){
00356
00357 }
00358 return err;
00359 }
00360
00361 static int sangoma_check_number_of_wait_objects(uint32_t number_of_objects)
00362 {
00363 if(number_of_objects > MAXIMUM_WAIT_OBJECTS){
00364 DBG_ERR("'number_of_objects': %d is greater than the Maximum of: %d\n",
00365 number_of_objects, MAXIMUM_WAIT_OBJECTS);
00366 return 1;
00367 }
00368
00369 if(number_of_objects < 1){
00370 DBG_ERR("'number_of_objects': %d is less than the Minimum of: 1\n",
00371 number_of_objects);
00372 return 1;
00373 }
00374
00375 return 0;
00376 }
00377
00378 static sangoma_status_t get_out_flags(IN sangoma_wait_obj_t *sng_wait_objects[],
00379 IN uint32_t first_signaled_obj_index,
00380 IN uint32_t in_flags[], OUT uint32_t out_flags[],
00381 IN uint32_t number_of_sangoma_wait_objects,
00382 OUT BOOL *at_least_one_poll_set_flags_out)
00383 {
00384 uint32_t i;
00385
00386 if(at_least_one_poll_set_flags_out){
00387 *at_least_one_poll_set_flags_out = FALSE;
00388 }
00389
00390 for(i = 0; i < number_of_sangoma_wait_objects; i++) {
00391
00392 sangoma_wait_obj_t *sangoma_wait_object = sng_wait_objects[i];
00393
00394 if (!sangoma_wait_object->signal_object) {
00395 return SANG_STATUS_DEV_INIT_INCOMPLETE;
00396 }
00397
00398 if (!SANGOMA_OBJ_HAS_DEVICE(sangoma_wait_object)) {
00399
00400
00401
00402
00403 if((i == first_signaled_obj_index) ||
00404
00405
00406
00407
00408 (WaitForSingleObject(sangoma_wait_object->signal_object, 0) == WAIT_OBJECT_0)) {
00409 out_flags[i] |= SANG_WAIT_OBJ_IS_SIGNALED;
00410 }
00411 continue;
00412 }
00413
00414 if(sangoma_wait_obj_poll(sangoma_wait_object, in_flags[i], &out_flags[i])){
00415 return SANG_STATUS_GENERAL_ERROR;
00416 }
00417
00418 if (out_flags[i] & in_flags[i]) {
00419 if (at_least_one_poll_set_flags_out) {
00420 *at_least_one_poll_set_flags_out = TRUE;
00421 }
00422 }
00423
00424 }
00425
00426 return SANG_STATUS_SUCCESS;
00427 }
00428
00432 static LONG registry_get_string_value(HKEY hkey, LPTSTR szKeyname, OUT LPSTR szValue, OUT DWORD *pdwSize)
00433 {
00434 LONG iReturnCode;
00435
00436
00437 RegQueryValueEx(hkey, szKeyname, NULL, NULL, (unsigned char *)szValue, pdwSize);
00438
00439 iReturnCode = RegQueryValueEx(hkey, szKeyname, NULL, NULL, (unsigned char *)szValue, pdwSize);
00440 if(ERROR_SUCCESS == iReturnCode){
00441 iReturnCode = 0;
00442 }
00443 DBG_REGISTRY("%s(): %s: %s: iReturnCode: %d\n", __FUNCTION__, szKeyname, szValue, iReturnCode);
00444 return iReturnCode;
00445 }
00446
00450 LONG registry_set_string_value(HKEY hkey, LPTSTR szKeyname, IN LPSTR szValue)
00451 {
00452 DWORD dwSize;
00453 LONG iReturnCode;
00454
00455 dwSize = (DWORD)strlen(szValue) + 1;
00456
00457 iReturnCode = RegSetValueEx(hkey, szKeyname, 0, REG_SZ, (unsigned char *)szValue, dwSize);
00458 DBG_REGISTRY("%s(): %s: %s\n", __FUNCTION__, szKeyname, szValue);
00459
00460 if(ERROR_SUCCESS == iReturnCode){
00461 iReturnCode = 0;
00462 }
00463 return iReturnCode;
00464 }
00465
00469 LONG registry_set_integer_value(HKEY hkey, LPTSTR szKeyname, IN int iValue)
00470 {
00471 DWORD dwSize;
00472 char szTemp[TMP_BUFFER_LEN];
00473 LONG iReturnCode;
00474
00475 sprintf(szTemp, "%u", iValue);
00476
00477 dwSize = (DWORD)strlen(szTemp) + 1;
00478 iReturnCode = RegSetValueEx(hkey, szKeyname, 0, REG_SZ, (unsigned char *)szTemp, dwSize);
00479
00480 if(ERROR_SUCCESS == iReturnCode){
00481 iReturnCode = 0;
00482 }
00483
00484 DBG_REGISTRY("%s(): %s: %d: iReturnCode: %d\n", __FUNCTION__, szKeyname, iValue, iReturnCode);
00485 return iReturnCode;
00486 }
00487
00492 HKEY registry_open_port_key(hardware_info_t *hardware_info)
00493 {
00494 int i, iRegistryReturnCode;
00495 SP_DEVINFO_DATA deid={sizeof(SP_DEVINFO_DATA)};
00496 HDEVINFO hdi = SetupDiGetClassDevs((struct _GUID *)&GUID_DEVCLASS_SANGOMA_ADAPTER, NULL,NULL, DIGCF_PRESENT);
00497 char DeviceName[TMP_BUFFER_LEN], PCI_Bus[TMP_BUFFER_LEN], PCI_Slot[TMP_BUFFER_LEN], Port_Number[TMP_BUFFER_LEN];
00498 DWORD dwTemp;
00499 HKEY hKeyTmp = (struct HKEY__ *)INVALID_HANDLE_VALUE;
00500 HKEY hPortRegistryKey = (struct HKEY__ *)INVALID_HANDLE_VALUE;
00501
00502 char szCompInstanceId[MAX_COMP_INSTID];
00503 TCHAR szCompDescription[MAX_COMP_DESC];
00504 DWORD dwRegType;
00505
00506
00507
00508
00509
00510
00511
00512
00513
00514
00515
00516 const TCHAR *search_SubStr = "Sangoma Hardware Abstraction Driver";
00517
00518
00519 for (i = 0; SetupDiEnumDeviceInfo(hdi, i, &deid); i++){
00520
00521 BOOL fSuccess = SetupDiGetDeviceInstanceId(hdi, &deid, (PSTR)szCompInstanceId, MAX_COMP_INSTID, NULL);
00522 if (!fSuccess){
00523 continue;
00524 }
00525
00526 fSuccess = SetupDiGetDeviceRegistryProperty(hdi, &deid, SPDRP_DEVICEDESC, &dwRegType, (BYTE*)szCompDescription, MAX_COMP_DESC, NULL);
00527 if (!fSuccess){
00528 continue;
00529 }
00530
00531 if (!strstr(szCompDescription, search_SubStr)) {
00532
00533 continue;
00534 }
00535
00536 DBG_REGISTRY("* %s\n", szCompDescription);
00537
00538 hKeyTmp = SetupDiOpenDevRegKey(hdi, &deid, DICS_FLAG_GLOBAL, 0, DIREG_DRV, KEY_READ | KEY_SET_VALUE );
00539 if(hKeyTmp == INVALID_HANDLE_VALUE){
00540 DBG_REGISTRY("Error: Failed to open Registry key!!\n");
00541 continue;
00542 }
00543
00544 PCI_Bus[0] = '\0';
00545 iRegistryReturnCode = registry_get_string_value(hKeyTmp, "PCI_Bus", PCI_Bus, &dwTemp);
00546 if(iRegistryReturnCode){
00547 continue;
00548 }
00549
00550 PCI_Slot[0] = '\0';
00551 iRegistryReturnCode = registry_get_string_value(hKeyTmp, "PCI_Slot", PCI_Slot, &dwTemp);
00552 if(iRegistryReturnCode){
00553 continue;
00554 }
00555
00556 Port_Number[0] = '\0';
00557 iRegistryReturnCode = registry_get_string_value(hKeyTmp, "Port_Number", Port_Number, &dwTemp);
00558 if(iRegistryReturnCode){
00559 continue;
00560 }
00561
00562 if( atoi(PCI_Bus) == hardware_info->pci_bus_number &&
00563 atoi(PCI_Slot) == hardware_info->pci_slot_number &&
00564 atoi(Port_Number) == hardware_info->port_number ){
00565
00566 hPortRegistryKey = hKeyTmp;
00567
00568
00569 DeviceName[0] = '\0';
00570 registry_get_string_value(hPortRegistryKey, "DeviceName", DeviceName, &dwTemp);
00571
00572 DBG_REGISTRY("Found Port's Registry key: DeviceName: %s, PCI_Bus: %s, PCI_Slot: %s, Port_Number: %s\n",
00573 DeviceName, PCI_Bus, PCI_Slot, Port_Number);
00574 break;
00575 }
00576 }
00577
00578 SetupDiDestroyDeviceInfoList(hdi);
00579
00580 DBG_REGISTRY("hPortRegistryKey: 0x%X\n", hPortRegistryKey);
00581
00582 return hPortRegistryKey;
00583 }
00584
00585 static char* timeslot_bitmap_to_string(int bitmap)
00586 {
00587 int i = 0, range_counter = 0;
00588 int start_channel = -1, stop_channel = -1;
00589 static char tmp_string[256];
00590
00591 if( WP_ALL_BITS_SET == bitmap ){
00592 return "ALL";
00593 }
00594
00595 tmp_string[0] = '\0';
00596
00597
00598 for(i = 0; i < sizeof(bitmap) * 8; i++){
00599
00600 if(start_channel < 0){
00601
00602 if(bitmap & (1 << i)){
00603 start_channel = i + 1;
00604 }
00605 }
00606
00607 if(start_channel >= 0){
00608 if((bitmap & (1 << i)) == 0){
00609
00610
00611 stop_channel = i;
00612
00613 }else if(i == (sizeof(bitmap) * 8 - 1)){
00614
00615
00616
00617
00618 stop_channel = (sizeof(bitmap) * 8);
00619 }
00620 }
00621
00622 if(start_channel >= 0 && stop_channel >= 0){
00623
00624 if(range_counter){
00625
00626 _snprintf(&tmp_string[strlen(tmp_string)], sizeof(tmp_string) - strlen(tmp_string), ".");
00627 }
00628
00629 if(start_channel == stop_channel){
00630
00631 _snprintf(&tmp_string[strlen(tmp_string)], sizeof(tmp_string) - strlen(tmp_string),
00632 "%d", start_channel);
00633 }else{
00634
00635 _snprintf(&tmp_string[strlen(tmp_string)], sizeof(tmp_string) - strlen(tmp_string),
00636 "%d-%d", start_channel, stop_channel);
00637 }
00638
00639 start_channel = stop_channel = -1;
00640 range_counter++;
00641 }
00642 }
00643
00644 return tmp_string;
00645 }
00646
00647 int registry_write_front_end_cfg(HKEY hPortRegistryKey, port_cfg_t *port_cfg)
00648 {
00649 wandev_conf_t *wandev_conf = &port_cfg->wandev_conf;
00650 sdla_fe_cfg_t *sdla_fe_cfg = &wandev_conf->fe_cfg;
00651 sdla_te_cfg_t *te_cfg = &sdla_fe_cfg->cfg.te_cfg;
00652 sdla_remora_cfg_t *analog_cfg = &sdla_fe_cfg->cfg.remora;
00653 sdla_bri_cfg_t *bri_cfg = &sdla_fe_cfg->cfg.bri;
00654 int iReturnCode = 0;
00655
00656
00657
00658
00659 iReturnCode = registry_set_integer_value(hPortRegistryKey, "tdmv_law", FE_TDMV_LAW(sdla_fe_cfg) );
00660 if(iReturnCode){
00661 return iReturnCode;
00662 }
00663
00664 iReturnCode = registry_set_integer_value(hPortRegistryKey, "ExternalSynchronization", FE_NETWORK_SYNC(sdla_fe_cfg) );
00665 if(iReturnCode){
00666 return iReturnCode;
00667 }
00668
00669 iReturnCode = registry_set_integer_value(hPortRegistryKey, "FE_TXTRISTATE", FE_TXTRISTATE(sdla_fe_cfg) );
00670 if(iReturnCode){
00671 return iReturnCode;
00672 }
00673
00674 iReturnCode = registry_set_integer_value(hPortRegistryKey, "HWEC_CLKSRC", wandev_conf->hwec_conf.clk_src );
00675 if(iReturnCode){
00676 return iReturnCode;
00677 }
00678
00679
00680
00681 switch(sdla_fe_cfg->media)
00682 {
00683 case WAN_MEDIA_T1:
00684 case WAN_MEDIA_J1:
00685 case WAN_MEDIA_E1:
00686
00687 iReturnCode = registry_set_integer_value(hPortRegistryKey, "Media", sdla_fe_cfg->media );
00688 if(iReturnCode){
00689 break;
00690 }
00691
00692 iReturnCode = registry_set_integer_value(hPortRegistryKey, "LDecoding", sdla_fe_cfg->lcode );
00693 if(iReturnCode){
00694 break;
00695 }
00696
00697 iReturnCode = registry_set_integer_value(hPortRegistryKey, "Framing", sdla_fe_cfg->frame );
00698 if(iReturnCode){
00699 break;
00700 }
00701
00702 iReturnCode = registry_set_integer_value(hPortRegistryKey, "ClkRefPort", te_cfg->te_ref_clock);
00703 if(iReturnCode){
00704 break;
00705 }
00706
00707 iReturnCode = registry_set_integer_value(hPortRegistryKey, "TE_IGNORE_YEL", te_cfg->ignore_yel_alarm);
00708 if(iReturnCode){
00709 break;
00710 }
00711
00712 iReturnCode = registry_set_integer_value(hPortRegistryKey, "ACTIVE_CH", ENABLE_ALL_CHANNELS );
00713 if(iReturnCode){
00714 break;
00715 }
00716
00717 iReturnCode = registry_set_integer_value(hPortRegistryKey, "TE_RBS_CH", te_cfg->te_rbs_ch);
00718 if(iReturnCode){
00719 break;
00720 }
00721
00722 iReturnCode = registry_set_integer_value(hPortRegistryKey, "LBO", te_cfg->lbo );
00723 if(iReturnCode){
00724 break;
00725 }
00726
00727 iReturnCode = registry_set_integer_value(hPortRegistryKey, "ClkMode", te_cfg->te_clock );
00728 if(iReturnCode){
00729 break;
00730 }
00731
00732 iReturnCode = registry_set_integer_value(hPortRegistryKey, "HighImpedanceMode",te_cfg->high_impedance_mode );
00733 if(iReturnCode){
00734 break;
00735 }
00736
00737 iReturnCode = registry_set_integer_value(hPortRegistryKey, "TE_RX_SLEVEL", te_cfg->rx_slevel );
00738 if(iReturnCode){
00739 break;
00740 }
00741
00742
00743 iReturnCode = registry_set_integer_value(hPortRegistryKey, "E1Signalling", te_cfg->sig_mode );
00744 if(iReturnCode){
00745 break;
00746 }
00747 break;
00748
00749 case WAN_MEDIA_56K:
00750
00751 iReturnCode = 0;
00752 break;
00753
00754 case WAN_MEDIA_FXOFXS:
00755
00756 iReturnCode = registry_set_string_value(hPortRegistryKey, "remora_fxo_operation_mode_name", analog_cfg->opermode_name);
00757 if(iReturnCode){
00758 break;
00759 }
00760
00761 iReturnCode = registry_set_integer_value(hPortRegistryKey, "RM_BATTTHRESH", analog_cfg->battthresh);
00762 if(iReturnCode){
00763 break;
00764 }
00765
00766 iReturnCode = registry_set_integer_value(hPortRegistryKey, "RM_BATTDEBOUNCE", analog_cfg->battdebounce);
00767 if(iReturnCode){
00768 break;
00769 }
00770
00771 iReturnCode = registry_set_integer_value(hPortRegistryKey, "RM_FXO_TAPPING", analog_cfg->rm_mode);
00772 if(iReturnCode){
00773 break;
00774 }
00775
00776 iReturnCode = registry_set_integer_value(hPortRegistryKey, "RM_FXO_TAPPING_OFF_HOOK_THRESHOLD",analog_cfg->ohthresh);
00777 if(iReturnCode){
00778 break;
00779 }
00780
00781 iReturnCode = registry_set_integer_value(hPortRegistryKey, "RM_LCM", analog_cfg->rm_lcm);
00782 if(iReturnCode){
00783 break;
00784 }
00785
00786 iReturnCode = registry_set_integer_value(hPortRegistryKey, "RM_FXSTXGAIN", analog_cfg->fxs_txgain);
00787 if(iReturnCode){
00788 break;
00789 }
00790
00791 iReturnCode = registry_set_integer_value(hPortRegistryKey, "RM_FXSRXGAIN", analog_cfg->fxs_rxgain);
00792 if(iReturnCode){
00793 break;
00794 }
00795
00796 iReturnCode = registry_set_integer_value(hPortRegistryKey, "RM_FXOTXGAIN", analog_cfg->fxo_txgain);
00797 if(iReturnCode){
00798 break;
00799 }
00800
00801 iReturnCode = registry_set_integer_value(hPortRegistryKey, "RM_FXORXGAIN", analog_cfg->fxo_rxgain);
00802 if(iReturnCode){
00803 break;
00804 }
00805 break;
00806
00807 case WAN_MEDIA_BRI:
00808 iReturnCode = registry_set_integer_value(hPortRegistryKey, "aft_bri_clock_mode", bri_cfg->clock_mode);
00809 if(iReturnCode){
00810 break;
00811 }
00812 break;
00813
00814 case WAN_MEDIA_SERIAL:
00815 iReturnCode = registry_set_integer_value(hPortRegistryKey, "clock_source", wandev_conf->clocking);
00816 if(iReturnCode){
00817 break;
00818 }
00819
00820 iReturnCode = registry_set_integer_value(hPortRegistryKey, "BaudRate", wandev_conf->bps);
00821 if(iReturnCode){
00822 break;
00823 }
00824
00825 iReturnCode = registry_set_integer_value(hPortRegistryKey, "serial_connection_type", wandev_conf->connection);
00826 if(iReturnCode){
00827 break;
00828 }
00829
00830 iReturnCode = registry_set_integer_value(hPortRegistryKey, "serial_line_coding", wandev_conf->line_coding);
00831 if(iReturnCode){
00832 break;
00833 }
00834
00835 iReturnCode = registry_set_integer_value(hPortRegistryKey, "serial_line_idle", wandev_conf->line_idle);
00836 if(iReturnCode){
00837 break;
00838 }
00839 break;
00840
00841 default:
00842 DBG_ERR("Invalid Media Type %d!\n", sdla_fe_cfg->media);
00843 iReturnCode = 1;
00844 }
00845
00846 return iReturnCode;
00847 }
00848
00849 int registry_write_wan_tdmv_conf(HKEY hPortRegistryKey, port_cfg_t *port_cfg)
00850 {
00851 wandev_conf_t *wandev_conf = &port_cfg->wandev_conf;
00852 sdla_fe_cfg_t *sdla_fe_cfg = &wandev_conf->fe_cfg;
00853 wan_tdmv_conf_t *tdmv_conf = &wandev_conf->tdmv_conf;
00854 int iReturnCode = 1;
00855
00856
00857 switch(sdla_fe_cfg->media)
00858 {
00859 case WAN_MEDIA_T1:
00860 case WAN_MEDIA_J1:
00861 case WAN_MEDIA_E1:
00862
00863 iReturnCode = registry_set_string_value(hPortRegistryKey, "TDMV_DCHAN", timeslot_bitmap_to_string(tdmv_conf->dchan));
00864 break;
00865
00866 case WAN_MEDIA_56K:
00867 case WAN_MEDIA_FXOFXS:
00868 case WAN_MEDIA_BRI:
00869 case WAN_MEDIA_SERIAL:
00870
00871 iReturnCode = 0;
00872 break;
00873
00874 default:
00875 DBG_ERR("Invalid Media Type %d!\n", sdla_fe_cfg->media);
00876 iReturnCode = 2;
00877 break;
00878 }
00879
00880 return iReturnCode;
00881 }
00882
00883 int registry_write_channel_group_cfg(HKEY hPortRegistryKey, port_cfg_t *port_cfg, int interface_index, wanif_conf_t wanif_conf)
00884 {
00885 char szTemp[TMP_BUFFER_LEN];
00886 int iReturnCode = 0;
00887
00888 do{
00889
00890 _snprintf(szTemp, TMP_BUFFER_LEN, "aft_logic_channel_%d_line_mode", interface_index);
00891 iReturnCode = registry_set_string_value(hPortRegistryKey, szTemp,
00892 (wanif_conf.hdlc_streaming == WANOPT_YES ? MODE_OPTION_HDLC : MODE_OPTION_BITSTRM));
00893 if(iReturnCode){
00894 break;
00895 }
00896
00897
00898 _snprintf(szTemp, TMP_BUFFER_LEN, "aft_logic_channel_%d_mtu", interface_index);
00899 iReturnCode = registry_set_integer_value(hPortRegistryKey, szTemp, wanif_conf.mtu);
00900 if(iReturnCode){
00901 break;
00902 }
00903
00904
00905 _snprintf(szTemp, TMP_BUFFER_LEN, "aft_logic_channel_%d_operational_mode", interface_index);
00906 iReturnCode = registry_set_string_value(hPortRegistryKey, szTemp, wanif_conf.usedby);
00907 if(iReturnCode){
00908 break;
00909 }
00910
00911
00912 _snprintf(szTemp, TMP_BUFFER_LEN, "aft_logic_channel_%d_active_ch", interface_index);
00913 iReturnCode = registry_set_string_value(hPortRegistryKey, szTemp, timeslot_bitmap_to_string(wanif_conf.active_ch));
00914 if(iReturnCode){
00915 break;
00916 }
00917
00918
00919 _snprintf(szTemp, TMP_BUFFER_LEN, "aft_logic_channel_%d_idle_char", interface_index);
00920 iReturnCode = registry_set_integer_value(hPortRegistryKey, szTemp, wanif_conf.u.aft.idle_flag);
00921 if(iReturnCode){
00922 break;
00923 }
00924
00925 }while(0);
00926
00927 return iReturnCode;
00928 }
00929
00934 static sangoma_status_t sangoma_control_cards(DWORD StateChange)
00935 {
00936 sangoma_status_t rc;
00937 int i;
00938 SP_DEVINFO_DATA deid = {sizeof(SP_DEVINFO_DATA)};
00939 HDEVINFO hdi;
00940 TCHAR szInstanceId[MAX_COMP_INSTID];
00941
00942 const TCHAR *szAftSearchSubStr = "PCI\\VEN_1923";
00943
00944
00945 SP_PROPCHANGE_PARAMS pcp;
00946
00947 hdi = SetupDiGetClassDevs((struct _GUID *)&GUID_DEVCLASS_SANGOMA_ADAPTER, NULL, NULL, DIGCF_PRESENT);
00948 if(INVALID_HANDLE_VALUE == hdi){
00949
00950 return SANG_STATUS_INVALID_DEVICE;
00951 }
00952
00953
00954 for (i = 0; SetupDiEnumDeviceInfo(hdi, i, &deid); i++){
00955
00956 BOOL fSuccess = SetupDiGetDeviceInstanceId(hdi, &deid, (PSTR)szInstanceId, sizeof(szInstanceId), NULL);
00957 if (!fSuccess){
00958 rc = SANG_STATUS_REGISTRY_ERROR;
00959 break;
00960 }
00961 if(!strstr(szInstanceId, szAftSearchSubStr)){
00962
00963 continue;
00964 }
00965
00966 memset(&pcp, 0x00, sizeof(pcp));
00967
00968 pcp.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
00969 pcp.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
00970 pcp.Scope = DICS_FLAG_GLOBAL;
00971
00972
00973
00974 pcp.StateChange = StateChange;
00975
00976 if(!SetupDiSetClassInstallParams(hdi, &deid, (SP_CLASSINSTALL_HEADER *)&pcp, sizeof(pcp))){
00977 rc = SANG_STATUS_REGISTRY_ERROR;
00978 break;
00979 }
00980
00981 if(!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, hdi, &deid)){
00982 rc = SANG_STATUS_REGISTRY_ERROR;
00983 break;
00984 }
00985
00986 }
00987
00988 SetupDiDestroyDeviceInfoList(hdi);
00989
00990 return SANG_STATUS_SUCCESS;
00991 }
00992
00993 sangoma_status_t _LIBSNG_CALL sangoma_unload_driver()
00994 {
00995 return sangoma_control_cards(DICS_DISABLE);
00996 }
00997
00998 sangoma_status_t _LIBSNG_CALL sangoma_load_driver()
00999 {
01000 return sangoma_control_cards(DICS_ENABLE);
01001 }
01002
01008 void _LIBSNG_CALL sangoma_reset_port_numbers()
01009 {
01010 int i, iRegistryReturnCode, iPortCounter = 0;
01011 SP_DEVINFO_DATA deid={sizeof(SP_DEVINFO_DATA)};
01012 HDEVINFO hdi = SetupDiGetClassDevs((struct _GUID *)&GUID_DEVCLASS_SANGOMA_ADAPTER, NULL,NULL, DIGCF_PRESENT);
01013 HKEY hKeyTmp = (struct HKEY__ *)INVALID_HANDLE_VALUE;
01014
01015 char szCompInstanceId[MAX_COMP_INSTID];
01016 TCHAR szCompDescription[MAX_COMP_DESC];
01017 DWORD dwRegType;
01018
01019
01020
01021
01022
01023
01024
01025
01026
01027
01028
01029 const TCHAR *search_SubStr = "Sangoma Hardware Abstraction Driver";
01030
01031
01032 for (i = 0; SetupDiEnumDeviceInfo(hdi, i, &deid); i++){
01033
01034 BOOL fSuccess = SetupDiGetDeviceInstanceId(hdi, &deid, (PSTR)szCompInstanceId, MAX_COMP_INSTID, NULL);
01035 if (!fSuccess){
01036 continue;
01037 }
01038
01039 fSuccess = SetupDiGetDeviceRegistryProperty(hdi, &deid, SPDRP_DEVICEDESC, &dwRegType, (BYTE*)szCompDescription, MAX_COMP_DESC, NULL);
01040 if (!fSuccess){
01041 continue;
01042 }
01043
01044 if (!strstr(szCompDescription, search_SubStr)) {
01045
01046 continue;
01047 }
01048
01049 hKeyTmp = SetupDiOpenDevRegKey(hdi, &deid, DICS_FLAG_GLOBAL, 0, DIREG_DRV, KEY_READ | KEY_SET_VALUE );
01050 if(hKeyTmp == INVALID_HANDLE_VALUE){
01051 DBG_REGISTRY("Error: Failed to open Registry key!!\n");
01052 continue;
01053 }
01054
01055 iPortCounter++;
01056
01057 printf("* %s -> Setting Span/Port number: %d\n", szCompDescription, iPortCounter);
01058
01059
01060
01061
01062
01063
01064
01065
01066 iRegistryReturnCode = registry_set_integer_value(hKeyTmp, WP_REGSTR_USER_SPECIFIED_WANPIPE_NUMBER, iPortCounter);
01067 if(iRegistryReturnCode){
01068 continue;
01069 }
01070
01071 RegCloseKey(hKeyTmp);
01072
01073 }
01074
01075 SetupDiDestroyDeviceInfoList(hdi);
01076
01077 return;
01078 }
01079
01080
01086 sangoma_status_t _LIBSNG_CALL sangoma_get_driver_version_from_registry(char *out_buffer, int out_buffer_length)
01087 {
01088 int i, iRegistryReturnCode;
01089 SP_DEVINFO_DATA deid = {sizeof(SP_DEVINFO_DATA)};
01090 HDEVINFO hdi = SetupDiGetClassDevs((struct _GUID *)&GUID_DEVCLASS_SANGOMA_ADAPTER, NULL, NULL, DIGCF_PRESENT);
01091 DWORD dwTemp;
01092 HKEY hKeyTmp = (struct HKEY__ *)INVALID_HANDLE_VALUE;
01093
01094 TCHAR szTmp[MAX_COMP_DESC];
01095 BOOL fSuccess = FALSE;
01096
01097
01098 for (i = 0; SetupDiEnumDeviceInfo(hdi, i, &deid); i++){
01099
01100 fSuccess = SetupDiGetDeviceInstanceId(hdi, &deid, (PSTR)szTmp, sizeof(szTmp), NULL);
01101 if (!fSuccess){
01102 break;
01103 }
01104 DBG_REGISTRY("%s(): Device Instance Id: %s\n", __FUNCTION__, szTmp);
01105
01106
01107
01108 hKeyTmp = SetupDiOpenDevRegKey( hdi, &deid, DICS_FLAG_GLOBAL, 0, DIREG_DRV, KEY_READ | KEY_SET_VALUE );
01109 if(hKeyTmp == INVALID_HANDLE_VALUE){
01110 DBG_REGISTRY("Error: Failed to open Registry key!!\n");
01111 fSuccess = FALSE;
01112 break;
01113 }
01114
01115 iRegistryReturnCode = registry_get_string_value(hKeyTmp, "DriverVersion", szTmp, &dwTemp);
01116 if(iRegistryReturnCode){
01117 fSuccess = FALSE;
01118 break;
01119 }
01120
01121 wp_snprintf(out_buffer, out_buffer_length, szTmp);
01122
01123 RegCloseKey(hKeyTmp);
01124
01125
01126 break;
01127 }
01128
01129 SetupDiDestroyDeviceInfoList(hdi);
01130
01131 if (!fSuccess){
01132 return SANG_STATUS_REGISTRY_ERROR;
01133 }else{
01134 return SANG_STATUS_SUCCESS;
01135 }
01136 }
01137
01143 sangoma_status_t _LIBSNG_CALL sangoma_set_driver_mode_of_all_hw_devices(int driver_mode)
01144 {
01145 sangoma_status_t rc;
01146 int i, iRegistryReturnCode;
01147 SP_DEVINFO_DATA deid = {sizeof(SP_DEVINFO_DATA)};
01148 HDEVINFO hdi;
01149 TCHAR szInstanceId[MAX_COMP_INSTID];
01150 HKEY hKeyTmp = (struct HKEY__ *)INVALID_HANDLE_VALUE;
01151
01152 const TCHAR *szAftSearchSubStr = "PCI\\VEN_1923";
01153
01154 hdi = SetupDiGetClassDevs((struct _GUID *)&GUID_DEVCLASS_SANGOMA_ADAPTER, NULL, NULL, DIGCF_PRESENT);
01155 if(INVALID_HANDLE_VALUE == hdi){
01156
01157 return SANG_STATUS_INVALID_DEVICE;
01158 }
01159
01160
01161 for (i = 0; SetupDiEnumDeviceInfo(hdi, i, &deid); i++){
01162
01163 BOOL fSuccess = SetupDiGetDeviceInstanceId(hdi, &deid, (PSTR)szInstanceId, sizeof(szInstanceId), NULL);
01164 if (!fSuccess){
01165 rc = SANG_STATUS_REGISTRY_ERROR;
01166 break;
01167 }
01168 if(!strstr(szInstanceId, szAftSearchSubStr)){
01169
01170 continue;
01171 }
01172
01173 hKeyTmp = SetupDiOpenDevRegKey(hdi, &deid, DICS_FLAG_GLOBAL, 0, DIREG_DRV, KEY_READ | KEY_SET_VALUE );
01174 if(hKeyTmp == INVALID_HANDLE_VALUE){
01175 rc = SANG_STATUS_REGISTRY_ERROR;
01176 break;
01177 }
01178
01179 iRegistryReturnCode = registry_set_integer_value(hKeyTmp, "driver_mode", driver_mode);
01180 if(iRegistryReturnCode){
01181 rc = SANG_STATUS_REGISTRY_ERROR;
01182 break;
01183 }
01184
01185 RegCloseKey(hKeyTmp);
01186
01187 }
01188
01189 SetupDiDestroyDeviceInfoList(hdi);
01190
01191 return SANG_STATUS_SUCCESS;
01192 }
01193
01194
01195 #endif
01196
01197
01198
01202
01203
01204
01205
01206 static unsigned char* sangoma_get_wan_udphdr_data_ptr(wan_udp_hdr_t *wan_udp_ptr, unsigned char off)
01207 {
01208 unsigned char *p_data = &wan_udp_ptr->wan_udphdr_data[0];
01209 p_data += off;
01210 return p_data;
01211 }
01212
01213
01214 static unsigned char sangoma_set_wan_udphdr_data_byte(wan_udp_hdr_t *wan_udp_ptr, unsigned char off, unsigned char data)
01215 {
01216 unsigned char *p_data = &wan_udp_ptr->wan_udphdr_data[0];
01217 p_data[off] = data;
01218 return 0;
01219 }
01220
01221
01222 static unsigned char sangoma_get_wan_udphdr_data_byte(wan_udp_hdr_t *wan_udp_ptr, unsigned char off)
01223 {
01224 unsigned char *p_data = &wan_udp_ptr->wan_udphdr_data[0];
01225 return p_data[off];
01226 }
01227
01228
01229
01230
01243 sangoma_status_t _LIBSNG_CALL sangoma_wait_obj_create(sangoma_wait_obj_t **sangoma_wait_object, sng_fd_t fd, sangoma_wait_obj_type_t object_type)
01244 {
01245 int err = 0;
01246 sangoma_wait_obj_t *sng_wait_obj = NULL;
01247
01248 if (!sangoma_wait_object) {
01249 return SANG_STATUS_INVALID_PARAMETER;
01250 }
01251 *sangoma_wait_object = NULL;
01252 sng_wait_obj = malloc(sizeof(**sangoma_wait_object));
01253 if (!sng_wait_obj) {
01254 return SANG_STATUS_FAILED_ALLOCATE_MEMORY;
01255 }
01256
01257 memset(sng_wait_obj, 0x00, sizeof(*sng_wait_obj));
01258
01259 sng_wait_obj->init_flag = LIBSNG_MAGIC_NO;
01260
01261 sng_wait_obj->fd = fd;
01262 sng_wait_obj->object_type = object_type;
01263
01264 #if defined(__WINDOWS__)
01265 if (!SANGOMA_OBJ_HAS_DEVICE(sng_wait_obj)) {
01266 sng_wait_obj->signal_object = CreateEvent(NULL, FALSE, FALSE, NULL);
01267 if(!sng_wait_obj->signal_object){
01268 err = SANG_STATUS_GENERAL_ERROR;
01269 goto failed;
01270 }
01271 err = SANG_STATUS_SUCCESS;
01272 } else {
01273 err = init_sangoma_event_object(sng_wait_obj, fd);
01274 if(SANG_STATUS_SUCCESS != err){
01275 goto failed;
01276 }
01277 }
01278 #else
01279 int filedes[2];
01280 if (SANGOMA_OBJ_IS_SIGNALABLE(sng_wait_obj)) {
01281 sng_wait_obj->signal_read_fd = INVALID_HANDLE_VALUE;
01282 sng_wait_obj->signal_write_fd = INVALID_HANDLE_VALUE;
01283
01284 if (pipe(filedes)) {
01285 err = SANG_STATUS_GENERAL_ERROR;
01286 goto failed;
01287 }
01288 sng_wait_obj->signal_read_fd = filedes[0];
01289 sng_wait_obj->signal_write_fd = filedes[1];
01290 }
01291 #endif
01292 *sangoma_wait_object = sng_wait_obj;
01293 return err;
01294
01295 failed:
01296 if (sng_wait_obj) {
01297 sangoma_wait_obj_delete(&sng_wait_obj);
01298 }
01299 return err;
01300 }
01301
01308 sangoma_status_t _LIBSNG_CALL sangoma_wait_obj_delete(sangoma_wait_obj_t **sangoma_wait_object)
01309 {
01310 sangoma_wait_obj_t *sng_wait_obj = *sangoma_wait_object;
01311
01312 if(sng_wait_obj->init_flag != LIBSNG_MAGIC_NO){
01313
01314 return SANG_STATUS_INVALID_DEVICE;
01315 }
01316
01317 #if defined(__WINDOWS__)
01318 if (sng_wait_obj->signal_object &&
01319 sng_wait_obj->signal_object != INVALID_HANDLE_VALUE) {
01320 sangoma_close(&sng_wait_obj->signal_object);
01321 }
01322 #else
01323 if (SANGOMA_OBJ_IS_SIGNALABLE(sng_wait_obj)) {
01324 sangoma_close(&sng_wait_obj->signal_read_fd);
01325 sangoma_close(&sng_wait_obj->signal_write_fd);
01326 }
01327 #endif
01328 sng_wait_obj->init_flag = 0;
01329 sng_wait_obj->object_type = UNKNOWN_WAIT_OBJ;
01330 free(sng_wait_obj);
01331 *sangoma_wait_object = NULL;
01332 return SANG_STATUS_SUCCESS;
01333 }
01334
01341 int _LIBSNG_CALL sangoma_wait_obj_signal(sangoma_wait_obj_t *sng_wait_obj)
01342 {
01343 if (!SANGOMA_OBJ_IS_SIGNALABLE(sng_wait_obj)) {
01344
01345
01346
01347 return SANG_STATUS_INVALID_DEVICE;
01348 }
01349 #if defined(__WINDOWS__)
01350 if(sng_wait_obj->signal_object){
01351 if (!SetEvent(sng_wait_obj->signal_object)) {
01352 return SANG_STATUS_GENERAL_ERROR;
01353 }
01354 }
01355 #else
01356
01357 if (write(sng_wait_obj->signal_write_fd, "s", 1) < 1) {
01358 return SANG_STATUS_GENERAL_ERROR;
01359 }
01360 #endif
01361 return SANG_STATUS_SUCCESS;
01362 }
01363
01370 sng_fd_t _LIBSNG_CALL sangoma_wait_obj_get_fd(sangoma_wait_obj_t *sng_wait_obj)
01371 {
01372 return sng_wait_obj->fd;
01373 }
01374
01383 void _LIBSNG_CALL sangoma_wait_obj_set_context(sangoma_wait_obj_t *sng_wait_obj, void *context)
01384 {
01385 sng_wait_obj->context = context;
01386 }
01387
01394 PVOID _LIBSNG_CALL sangoma_wait_obj_get_context(sangoma_wait_obj_t *sng_wait_obj)
01395 {
01396 return sng_wait_obj->context;
01397 }
01398
01409 sangoma_status_t _LIBSNG_CALL sangoma_waitfor_many(sangoma_wait_obj_t *sng_wait_objects[], uint32_t in_flags[], uint32_t out_flags[],
01410 uint32_t number_of_sangoma_wait_objects, int32_t system_wait_timeout)
01411 {
01412 #if defined(__WINDOWS__)
01413 HANDLE hEvents[MAXIMUM_WAIT_OBJECTS];
01414 DWORD dwResult;
01415 int at_least_one_poll_set_flags_out, err;
01416 sangoma_wait_obj_t *sangoma_wait_object;
01417 #else
01418 uint32_t j = 0;
01419 #endif
01420 uint32_t i = 0;
01421
01422 memset(out_flags, 0x00, number_of_sangoma_wait_objects * sizeof(out_flags[0]));
01423 #if defined(__WINDOWS__)
01424
01425 if(sangoma_check_number_of_wait_objects(number_of_sangoma_wait_objects)){
01426
01427 return SANG_STATUS_INVALID_PARAMETER;
01428 }
01429
01430 for(i = 0; i < MAXIMUM_WAIT_OBJECTS; i++){
01431 hEvents[i] = INVALID_HANDLE_VALUE;
01432 }
01433
01434
01435
01436 for(i = 0; i < number_of_sangoma_wait_objects; i++){
01437
01438 sangoma_wait_object = sng_wait_objects[i];
01439
01440 if(LIBSNG_MAGIC_NO != sangoma_wait_object->init_flag){
01441 return SANG_STATUS_DEV_INIT_INCOMPLETE;
01442 }
01443
01444 if(sangoma_wait_object->signal_object){
01445 hEvents[i] = sangoma_wait_object->signal_object;
01446 }
01447
01448 }
01449
01450 at_least_one_poll_set_flags_out = FALSE;
01451
01452
01453
01454 err = get_out_flags(sng_wait_objects, INVALID_INDEX, in_flags, out_flags, number_of_sangoma_wait_objects, &at_least_one_poll_set_flags_out);
01455 if(SANG_ERROR(err)){
01456 return err;
01457 }
01458
01459 if(TRUE == at_least_one_poll_set_flags_out){
01460 return SANG_STATUS_SUCCESS;
01461 }
01462
01463
01464 dwResult = WaitForMultipleObjects(number_of_sangoma_wait_objects, &hEvents[0], FALSE, system_wait_timeout);
01465 if (WAIT_TIMEOUT == dwResult){
01466 return SANG_STATUS_APIPOLL_TIMEOUT;
01467 }
01468
01469 if( dwResult >= (DWORD)number_of_sangoma_wait_objects ) {
01470 return SANG_STATUS_GENERAL_ERROR;
01471 }
01472
01473
01474 err = get_out_flags(sng_wait_objects,
01475 dwResult,
01476
01477 in_flags, out_flags, number_of_sangoma_wait_objects, NULL);
01478 if(SANG_ERROR(err)){
01479 return err;
01480 }
01481
01482 return SANG_STATUS_SUCCESS;
01483 #else
01484 struct pollfd pfds[number_of_sangoma_wait_objects*2];
01485 char dummy_buf[1];
01486 int res;
01487 j = 0;
01488
01489 memset(pfds, 0, sizeof(pfds));
01490
01491 for(i = 0; i < number_of_sangoma_wait_objects; i++){
01492
01493 if (SANGOMA_OBJ_HAS_DEVICE(sng_wait_objects[i])) {
01494 pfds[i].fd = sng_wait_objects[i]->fd;
01495 pfds[i].events = in_flags[i];
01496 }
01497
01498 if (SANGOMA_OBJ_IS_SIGNALABLE(sng_wait_objects[i])) {
01499 pfds[number_of_sangoma_wait_objects+j].fd = sng_wait_objects[i]->signal_read_fd;
01500 pfds[number_of_sangoma_wait_objects+j].events = POLLIN;
01501 j++;
01502 }
01503 }
01504
01505 poll_try_again:
01506
01507 res = poll(pfds, (number_of_sangoma_wait_objects + j), system_wait_timeout);
01508 if (res > 0) {
01509 for(i = 0; i < number_of_sangoma_wait_objects; i++){
01510 out_flags[i] = pfds[i].revents;
01511
01512 }
01513 for(i = 0; i < j; i++){
01514 if (pfds[number_of_sangoma_wait_objects+i].revents & POLLIN) {
01515
01516 read(pfds[number_of_sangoma_wait_objects+i].fd, &dummy_buf, 1);
01517
01518 out_flags[i] |= SANG_WAIT_OBJ_IS_SIGNALED;
01519 }
01520 }
01521 } else if (res < 0 && errno == EINTR) {
01522
01523 goto poll_try_again;
01524 }
01525 if (res < 0) {
01526 return SANG_STATUS_GENERAL_ERROR;
01527 }
01528 if (res == 0) {
01529 return SANG_STATUS_APIPOLL_TIMEOUT;
01530 }
01531 return SANG_STATUS_SUCCESS;
01532 #endif
01533 }
01534
01535
01543 sangoma_status_t _LIBSNG_CALL sangoma_waitfor(sangoma_wait_obj_t *sangoma_wait_obj, uint32_t inflags, uint32_t *outflags, int32_t timeout)
01544 {
01545 return sangoma_waitfor_many(&sangoma_wait_obj, &inflags, outflags, 1, timeout);
01546 }
01547
01548
01549
01554 int _LIBSNG_CALL sangoma_span_chan_toif(int span, int chan, char *interface_name)
01555 {
01556 #if defined(__WINDOWS__)
01557
01558 sprintf(interface_name, WP_INTERFACE_NAME_FORM, span, chan);
01559 #else
01560 sprintf(interface_name,"s%ic%i",span,chan);
01561 #endif
01562 return 0;
01563 }
01564
01565 int _LIBSNG_CALL sangoma_interface_toi(char *interface_name, int *span, int *chan)
01566 {
01567 char *p=NULL, *sp = NULL, *ch = NULL;
01568 int ret = 0;
01569 char data[FNAME_LEN];
01570
01571 strncpy(data, interface_name, FNAME_LEN);
01572 if ((data[0])) {
01573 for (p = data; *p; p++) {
01574 if (sp && *p == 'g') {
01575 *p = '\0';
01576 ch = (p + 1);
01577 break;
01578 } else if (*p == 'w') {
01579 sp = (p + 1);
01580 }
01581 }
01582
01583 if(ch && sp) {
01584 *span = atoi(sp);
01585 *chan = atoi(ch);
01586 ret = 1;
01587 } else {
01588 *span = -1;
01589 *chan = -1;
01590 }
01591 }
01592
01593 return ret;
01594 }
01595
01596 int _LIBSNG_CALL sangoma_interface_wait_up(int span, int chan, int sectimeout)
01597 {
01598 #if defined(__WINDOWS__)
01599
01600 return 0;
01601 #else
01602 char interface_name[FNAME_LEN];
01603 struct stat statbuf;
01604 struct timeval endtime = {0,0};
01605 struct timeval curtime = {0,0};
01606 int counter;
01607 int rc;
01608 if (sectimeout >= 0 && gettimeofday(&endtime, NULL)) {
01609 return -1;
01610 }
01611 snprintf(interface_name, sizeof(interface_name), "/dev/" WP_INTERFACE_NAME_FORM, span, chan);
01612 endtime.tv_sec += sectimeout;
01613 do {
01614 counter = 0;
01615 while ((rc = stat(interface_name, &statbuf)) && errno == ENOENT && counter != 10) {
01616 poll(0, 0, 100);
01617 counter++;
01618 }
01619 if (!rc || errno != ENOENT) break;
01620 if (gettimeofday(&curtime, NULL)) {
01621 return -1;
01622 }
01623 } while (sectimeout < 0 || timercmp(&endtime, &curtime,>));
01624 return rc;
01625 #endif
01626 }
01627
01628 int _LIBSNG_CALL sangoma_span_chan_fromif(char *interface_name, int *span, int *chan)
01629 {
01630 char *p = NULL, *sp = NULL, *ch = NULL;
01631 int ret = 0;
01632 char data[FNAME_LEN];
01633
01634
01635
01636
01637 strncpy(data, interface_name, FNAME_LEN);
01638 if ((data[0])) {
01639 for (p = data; *p; p++) {
01640 #if defined(__WINDOWS__)
01641 if (sp && (*p == 'F'||*p == 'f')) {
01642 #else
01643 if (sp && *p == 'c') {
01644 #endif
01645 *p = '\0';
01646 ch = (p + 1);
01647 break;
01648 #if defined(__WINDOWS__)
01649 } else if (*p == 'E'||*p == 'e') {
01650 #else
01651 } else if (*p == 's') {
01652 #endif
01653 sp = (p + 1);
01654 }
01655 }
01656
01657 if(ch && sp) {
01658 *span = atoi(sp);
01659 *chan = atoi(ch);
01660 ret = 1;
01661 } else {
01662 *span = -1;
01663 *chan = -1;
01664 }
01665 }
01666
01667 return ret;
01668 }
01669
01670 sng_fd_t _LIBSNG_CALL sangoma_open_api_span_chan(int span, int chan)
01671 {
01672 sng_fd_t fd = INVALID_HANDLE_VALUE;
01673 wanpipe_api_t tdm_api;
01674 int err;
01675
01676 fd = __sangoma_open_api_span_chan(span, chan);
01677
01678 #if defined(__WINDOWS__)
01679 if(fd == INVALID_HANDLE_VALUE){
01680 return fd;
01681 }
01682 #else
01683 if (fd < 0) {
01684 return fd;
01685 }
01686 #endif
01687
01688 memset(&tdm_api,0,sizeof(tdm_api));
01689 tdm_api.wp_cmd.cmd = WP_API_CMD_OPEN_CNT;
01690 err=sangoma_cmd_exec(fd,&tdm_api);
01691 if (err){
01692 sangoma_close(&fd);
01693 return fd;
01694 }
01695
01696 if (tdm_api.wp_cmd.open_cnt > 1) {
01697
01698 sangoma_close(&fd);
01699 fd = INVALID_HANDLE_VALUE;
01700 }
01701
01702 return fd;
01703 }
01704
01705 sng_fd_t _LIBSNG_CALL sangoma_open_dev_by_name(const char *dev_name)
01706 {
01707 char fname[FNAME_LEN];
01708
01709 #if defined(__WINDOWS__)
01710 _snprintf(fname , FNAME_LEN, "\\\\.\\%s", dev_name);
01711
01712 return CreateFile( fname,
01713 GENERIC_READ | GENERIC_WRITE,
01714 FILE_SHARE_READ | FILE_SHARE_WRITE,
01715 (LPSECURITY_ATTRIBUTES)NULL,
01716 OPEN_EXISTING,
01717 FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH,
01718 (HANDLE)NULL
01719 );
01720 #else
01721 sprintf(fname,"/dev/%s", dev_name);
01722
01723 return open(fname, O_RDWR);
01724 #endif
01725 }
01726
01727
01728 sng_fd_t _LIBSNG_CALL __sangoma_open_api_span_chan(int span, int chan)
01729 {
01730 char tmp_fname[FNAME_LEN];
01731
01732
01733 _snprintf(tmp_fname, DEV_NAME_LEN, WP_INTERFACE_NAME_FORM, span, chan);
01734
01735 return sangoma_open_dev_by_name(tmp_fname);
01736 }
01737
01738 sng_fd_t _LIBSNG_CALL sangoma_open_api_ctrl(void)
01739 {
01740 return sangoma_open_dev_by_name(WP_CTRL_DEV_NAME);
01741 }
01742
01743 #ifdef WP_API_FEATURE_LOGGER
01744 sng_fd_t _LIBSNG_CALL sangoma_logger_open(void)
01745 {
01746 return sangoma_open_dev_by_name(WP_LOGGER_DEV_NAME);
01747 }
01748 #endif
01749
01750 int _LIBSNG_CALL sangoma_get_open_cnt(sng_fd_t fd, wanpipe_api_t *tdm_api)
01751 {
01752 int err;
01753
01754 WANPIPE_API_INIT_CHAN(tdm_api, 0);
01755 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
01756 tdm_api->wp_cmd.cmd = WP_API_CMD_OPEN_CNT;
01757
01758 err=sangoma_cmd_exec(fd,tdm_api);
01759 if (err){
01760 return -1;
01761 }
01762
01763 return tdm_api->wp_cmd.open_cnt;
01764 }
01765
01766 sng_fd_t _LIBSNG_CALL sangoma_create_socket_by_name(char *device, char *card)
01767 {
01768 int span,chan;
01769 sangoma_interface_toi(device,&span,&chan);
01770
01771 return sangoma_open_api_span_chan(span,chan);
01772 }
01773
01774
01775 sng_fd_t _LIBSNG_CALL sangoma_open_api_span(int span)
01776 {
01777 int i=0;
01778 sng_fd_t fd = INVALID_HANDLE_VALUE;
01779
01780 for(i = 1; i < 32; i++){
01781
01782 fd = sangoma_open_api_span_chan(span, i);
01783
01784 #if defined(__WINDOWS__)
01785 if(fd != INVALID_HANDLE_VALUE){
01786 #else
01787 if (fd >= 0) {
01788 #endif
01789
01790
01791 break;
01792 }
01793
01794 }
01795
01796 return fd;
01797 }
01798
01799
01806 void _LIBSNG_CALL sangoma_close(sng_fd_t *fd)
01807 {
01808 if (!fd) {
01809 return;
01810 }
01811 #if defined(__WINDOWS__)
01812 if (*fd != INVALID_HANDLE_VALUE){
01813 CloseHandle(*fd);
01814 *fd = INVALID_HANDLE_VALUE;
01815 }
01816 #else
01817 if (*fd >= 0) {
01818 close(*fd);
01819 *fd = -1;
01820 }
01821 #endif
01822 }
01823
01824
01825
01826
01830 int _LIBSNG_CALL sangoma_readmsg(sng_fd_t fd, void *hdrbuf, int hdrlen, void *databuf, int datalen, int flag)
01831 {
01832 int rx_len=0;
01833
01834 #if defined(__WINDOWS__)
01835 wp_api_hdr_t *rx_hdr = (wp_api_hdr_t*)hdrbuf;
01836 wp_api_element_t wp_api_element;
01837
01838 if(hdrlen != sizeof(wp_api_hdr_t)){
01839
01840 DBG_ERR("hdrlen (%i) != sizeof(wp_api_hdr_t) (%i)\n", hdrlen, sizeof(wp_api_hdr_t));
01841 return -1;
01842 }
01843
01844 wp_api_element.hdr.operation_status = SANG_STATUS_IO_ERROR;
01845
01846 if(DoReadCommand(fd, &wp_api_element)){
01847
01848 DBG_ERR("DoReadCommand() failed! Check messages log.\n");
01849 return -4;
01850 }
01851
01852 memcpy(rx_hdr, &wp_api_element.hdr, sizeof(wp_api_hdr_t));
01853
01854 switch(rx_hdr->operation_status)
01855 {
01856 case SANG_STATUS_RX_DATA_AVAILABLE:
01857
01858 if(rx_hdr->data_length <= datalen){
01859 memcpy(databuf, wp_api_element.data, rx_hdr->data_length);
01860 }else{
01861 rx_hdr->operation_status = SANG_STATUS_BUFFER_TOO_SMALL;
01862 }
01863 break;
01864 case SANG_STATUS_NO_DATA_AVAILABLE:
01865
01866
01867 return 1;
01868 default:
01869 if(libsng_dbg_level)DBG_ERR("Operation Status: %s(%d)\n",
01870 SDLA_DECODE_SANG_STATUS(rx_hdr->operation_status), rx_hdr->operation_status);
01871 return -5;
01872 }
01873
01874 rx_len = rx_hdr->data_length;
01875 #else
01876 wan_msghdr_t msg;
01877 wan_iovec_t iov[2];
01878
01879 memset(&msg,0,sizeof(msg));
01880 memset(&iov[0],0,sizeof(iov[0])*2);
01881
01882 iov[0].iov_len=hdrlen;
01883 iov[0].iov_base=hdrbuf;
01884
01885 iov[1].iov_len=datalen;
01886 iov[1].iov_base=databuf;
01887
01888 msg.msg_iovlen=2;
01889 msg.msg_iov=iov;
01890
01891 rx_len = read(fd,&msg,sizeof(msg));
01892
01893 if (rx_len <= sizeof(wp_api_hdr_t)){
01894 return -EINVAL;
01895 }
01896
01897 rx_len -= sizeof(wp_api_hdr_t);
01898 #endif
01899 return rx_len;
01900 }
01901
01902 int _LIBSNG_CALL sangoma_writemsg(sng_fd_t fd, void *hdrbuf, int hdrlen, void *databuf, unsigned short datalen, int flag)
01903 {
01904 int bsent=-1;
01905 wp_api_hdr_t *wp_api_hdr = hdrbuf;
01906
01907 if (hdrlen != sizeof(wp_api_hdr_t)) {
01908
01909 DBG_ERR("hdrlen (%i) != sizeof(wp_api_hdr_t) (%i)\n", hdrlen, sizeof(wp_api_hdr_t));
01910 return -1;
01911 }
01912
01913 #if defined(__WINDOWS__)
01914
01915 wp_api_hdr->data_length = datalen;
01916
01917
01918 if(DoWriteCommand(fd, databuf, datalen, hdrbuf, hdrlen)){
01919
01920 DBG_ERR("DoWriteCommand() failed!! Check messages log.\n");
01921 return -1;
01922 }
01923
01924 bsent=0;
01925
01926 switch(wp_api_hdr->operation_status)
01927 {
01928 case SANG_STATUS_SUCCESS:
01929 bsent = datalen;
01930 break;
01931 default:
01932 DBG_ERR("Operation Status: %s(%d)\n",
01933 SDLA_DECODE_SANG_STATUS(wp_api_hdr->operation_status), wp_api_hdr->operation_status);
01934 break;
01935 }
01936 #else
01937 wan_msghdr_t msg;
01938 wan_iovec_t iov[2];
01939
01940 memset(&msg,0,sizeof(msg));
01941 memset(&iov[0],0,sizeof(iov[0])*2);
01942
01943 iov[0].iov_len=hdrlen;
01944 iov[0].iov_base=hdrbuf;
01945
01946 iov[1].iov_len=datalen;
01947 iov[1].iov_base=databuf;
01948
01949 msg.msg_iovlen=2;
01950 msg.msg_iov=iov;
01951
01952 bsent = write(fd,&msg,sizeof(msg));
01953
01954 if (bsent == (datalen+hdrlen)){
01955 wp_api_hdr->wp_api_hdr_operation_status=SANG_STATUS_SUCCESS;
01956 bsent-=sizeof(wp_api_hdr_t);
01957 } else if (errno == EBUSY){
01958 wp_api_hdr->wp_api_hdr_operation_status=SANG_STATUS_DEVICE_BUSY;
01959 } else {
01960 wp_api_hdr->wp_api_hdr_operation_status=SANG_STATUS_IO_ERROR;
01961 }
01962 wp_api_hdr->wp_api_hdr_data_length=bsent;
01963
01964 #endif
01965 return bsent;
01966 }
01967
01968
01969 #ifdef WANPIPE_TDM_API
01970
01971
01972
01978
01979
01980
01981
01982 int _LIBSNG_CALL sangoma_cmd_exec(sng_fd_t fd, wanpipe_api_t *tdm_api)
01983 {
01984 int err;
01985
01986 #if defined(__WINDOWS__)
01987 err = tdmv_api_ioctl(fd, &tdm_api->wp_cmd);
01988 #else
01989 err = ioctl(fd,WANPIPE_IOCTL_API_CMD,&tdm_api->wp_cmd);
01990 if (err < 0){
01991 char tmp[50];
01992 sprintf(tmp,"TDM API: CMD: %i\n",tdm_api->wp_cmd.cmd);
01993 perror(tmp);
01994 return -1;
01995 }
01996 #endif
01997 return err;
01998 }
01999
02000
02001
02002
02003
02004 int _LIBSNG_CALL sangoma_get_full_cfg(sng_fd_t fd, wanpipe_api_t *tdm_api)
02005 {
02006 int err;
02007
02008 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02009 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02010 tdm_api->wp_cmd.cmd = WP_API_CMD_GET_FULL_CFG;
02011
02012 err=sangoma_cmd_exec(fd,tdm_api);
02013 if (err){
02014 return err;
02015 }
02016
02017 #if 0
02018 printf("TDM API CFG:\n");
02019 printf("\thw_tdm_coding:\t%d\n",tdm_api->wp_cmd.hw_tdm_coding);
02020 printf("\thw_mtu_mru:\t%d\n",tdm_api->wp_cmd.hw_mtu_mru);
02021 printf("\tusr_period:\t%d\n",tdm_api->wp_cmd.usr_period);
02022 printf("\ttdm_codec:\t%d\n",tdm_api->wp_cmd.tdm_codec);
02023 printf("\tpower_level:\t%d\n",tdm_api->wp_cmd.power_level);
02024 printf("\trx_disable:\t%d\n",tdm_api->wp_cmd.rx_disable);
02025 printf("\ttx_disable:\t%d\n",tdm_api->wp_cmd.tx_disable);
02026 printf("\tusr_mtu_mru:\t%d\n",tdm_api->wp_cmd.usr_mtu_mru);
02027 printf("\tidle flag:\t0x%02X\n",tdm_api->wp_cmd.idle_flag);
02028
02029 #ifdef WP_API_FEATURE_FE_ALARM
02030 printf("\tfe alarms:\t0x%02X\n",tdm_api->wp_cmd.fe_alarms);
02031 #endif
02032
02033 printf("\trx pkt\t%d\ttx pkt\t%d\n",tdm_api->wp_cmd.stats.rx_packets,
02034 tdm_api->wp_cmd.stats.tx_packets);
02035 printf("\trx err\t%d\ttx err\t%d\n",
02036 tdm_api->wp_cmd.stats.rx_errors,
02037 tdm_api->wp_cmd.stats.tx_errors);
02038 #ifndef __WINDOWS__
02039 printf("\trx ovr\t%d\ttx idl\t%d\n",
02040 tdm_api->wp_cmd.stats.rx_fifo_errors,
02041 tdm_api->wp_cmd.stats.tx_carrier_errors);
02042 #endif
02043 #endif
02044
02045 return 0;
02046 }
02047
02048
02049
02050
02051
02052
02053
02054
02055
02056
02057
02058
02059
02060 int _LIBSNG_CALL sangoma_tdm_set_codec(sng_fd_t fd, wanpipe_api_t *tdm_api, int codec)
02061 {
02062 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02063 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02064 tdm_api->wp_cmd.cmd = WP_API_CMD_SET_CODEC;
02065 tdm_api->wp_cmd.tdm_codec = codec;
02066 return sangoma_cmd_exec(fd,tdm_api);
02067 }
02068
02069
02070
02071
02072
02073
02074
02075
02076
02077
02078
02079
02080
02081 int _LIBSNG_CALL sangoma_tdm_get_codec(sng_fd_t fd, wanpipe_api_t *tdm_api)
02082 {
02083 int err;
02084
02085 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02086 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02087 tdm_api->wp_cmd.cmd = WP_API_CMD_GET_CODEC;
02088
02089 err=sangoma_cmd_exec(fd,tdm_api);
02090 if (err){
02091 return err;
02092 }
02093
02094 return tdm_api->wp_cmd.tdm_codec;
02095 }
02096
02097
02098
02099
02100
02101
02102
02103
02104 int _LIBSNG_CALL sangoma_tdm_set_usr_period(sng_fd_t fd, wanpipe_api_t *tdm_api, int period)
02105 {
02106 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02107 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02108 tdm_api->wp_cmd.cmd = WP_API_CMD_SET_USR_PERIOD;
02109 tdm_api->wp_cmd.usr_period = period;
02110 return sangoma_cmd_exec(fd,tdm_api);
02111 }
02112
02113
02114
02115
02116
02117
02118
02119
02120 int _LIBSNG_CALL sangoma_tdm_get_usr_period(sng_fd_t fd, wanpipe_api_t *tdm_api)
02121 {
02122 int err;
02123
02124 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02125 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02126 tdm_api->wp_cmd.cmd = WP_API_CMD_GET_USR_PERIOD;
02127
02128 err=sangoma_cmd_exec(fd,tdm_api);
02129 if (err){
02130 return err;
02131 }
02132
02133 return tdm_api->wp_cmd.usr_period;
02134 }
02135
02136
02137
02138
02139
02140
02141
02142 int _LIBSNG_CALL sangoma_get_hw_coding(sng_fd_t fd, wanpipe_api_t *tdm_api)
02143 {
02144 int err;
02145
02146 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02147 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02148 tdm_api->wp_cmd.cmd = WP_API_CMD_GET_HW_CODING;
02149 err=sangoma_cmd_exec(fd,tdm_api);
02150 if (err){
02151 return err;
02152 }
02153 return tdm_api->wp_cmd.hw_tdm_coding;
02154 }
02155
02156 #ifdef WP_API_FEATURE_DTMF_EVENTS
02157
02158
02159
02160
02161
02162
02163 int _LIBSNG_CALL sangoma_tdm_get_hw_dtmf(sng_fd_t fd, wanpipe_api_t *tdm_api)
02164 {
02165 int err;
02166
02167 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02168 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02169 tdm_api->wp_cmd.cmd = WP_API_CMD_GET_HW_DTMF;
02170 err=sangoma_cmd_exec(fd,tdm_api);
02171 if (err){
02172 return err;
02173 }
02174 return tdm_api->wp_cmd.hw_dtmf;
02175 }
02176
02177
02178
02179
02180
02181
02182
02183 int _LIBSNG_CALL sangoma_tdm_get_hw_ec(sng_fd_t fd, wanpipe_api_t *tdm_api)
02184 {
02185 int err;
02186
02187 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02188 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02189 tdm_api->wp_cmd.cmd = WP_API_CMD_GET_HW_EC;
02190 err=sangoma_cmd_exec(fd,tdm_api);
02191 if (err){
02192 return err;
02193 }
02194 return tdm_api->wp_cmd.hw_ec;
02195 }
02196 #endif
02197
02198
02199 #ifdef WP_API_FEATURE_EC_CHAN_STAT
02200
02201
02202
02203
02204
02205
02206 int _LIBSNG_CALL sangoma_tdm_get_hwec_chan_status(sng_fd_t fd, wanpipe_api_t *tdm_api)
02207 {
02208 int err;
02209
02210 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02211 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02212 tdm_api->wp_cmd.cmd = WP_API_CMD_GET_HW_EC_CHAN;
02213 err=sangoma_cmd_exec(fd,tdm_api);
02214 if (err){
02215 return err;
02216 }
02217 return tdm_api->wp_cmd.hw_ec;
02218 }
02219
02220 #endif
02221
02222 #ifdef WP_API_FEATURE_HWEC_PERSIST
02223
02224
02225
02226
02227
02228
02229
02230
02231
02232 int _LIBSNG_CALL sangoma_tdm_get_hwec_persist_status(sng_fd_t fd, wanpipe_api_t *tdm_api)
02233 {
02234 int err;
02235
02236 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02237 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02238 tdm_api->wp_cmd.cmd = WP_API_CMD_GET_HW_EC_PERSIST;
02239 err=sangoma_cmd_exec(fd,tdm_api);
02240 if (err){
02241 return err;
02242 }
02243 return tdm_api->wp_cmd.hw_ec;
02244 }
02245 #endif
02246
02247
02248
02249
02250
02251
02252
02253
02254 int _LIBSNG_CALL sangoma_tdm_get_usr_mtu_mru(sng_fd_t fd, wanpipe_api_t *tdm_api)
02255 {
02256 int err;
02257
02258 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02259 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02260 tdm_api->wp_cmd.cmd = WP_API_CMD_GET_USR_MTU_MRU;
02261
02262 err=sangoma_cmd_exec(fd,tdm_api);
02263 if (err){
02264 return err;
02265 }
02266
02267 return tdm_api->wp_cmd.usr_mtu_mru;
02268 }
02269
02270
02271
02272
02273
02274
02275
02276 int _LIBSNG_CALL sangoma_tdm_set_power_level(sng_fd_t fd, wanpipe_api_t *tdm_api, int power)
02277 {
02278 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02279 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02280 tdm_api->wp_cmd.cmd = WP_API_CMD_SET_POWER_LEVEL;
02281 tdm_api->wp_cmd.power_level = power;
02282 return sangoma_cmd_exec(fd,tdm_api);
02283 }
02284
02285
02286
02287
02288
02289
02290
02291 int _LIBSNG_CALL sangoma_tdm_get_power_level(sng_fd_t fd, wanpipe_api_t *tdm_api)
02292 {
02293 int err;
02294
02295 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02296 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02297 tdm_api->wp_cmd.cmd = WP_API_CMD_GET_POWER_LEVEL;
02298
02299 err=sangoma_cmd_exec(fd,tdm_api);
02300 if (err){
02301 return err;
02302 }
02303
02304 return tdm_api->wp_cmd.power_level;
02305 }
02306
02307 int _LIBSNG_CALL sangoma_flush_bufs(sng_fd_t fd, wanpipe_api_t *tdm_api)
02308 {
02309 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02310 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02311 tdm_api->wp_cmd.cmd = WP_API_CMD_FLUSH_BUFFERS;
02312 return sangoma_cmd_exec(fd,tdm_api);
02313 }
02314
02315 int _LIBSNG_CALL sangoma_flush_rx_bufs(sng_fd_t fd, wanpipe_api_t *tdm_api)
02316 {
02317 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02318 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02319 tdm_api->wp_cmd.cmd = WP_API_CMD_FLUSH_RX_BUFFERS;
02320 return sangoma_cmd_exec(fd,tdm_api);
02321 }
02322
02323 int _LIBSNG_CALL sangoma_flush_tx_bufs(sng_fd_t fd, wanpipe_api_t *tdm_api)
02324 {
02325 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02326 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02327 tdm_api->wp_cmd.cmd = WP_API_CMD_FLUSH_TX_BUFFERS;
02328 return sangoma_cmd_exec(fd,tdm_api);
02329 }
02330
02331 int _LIBSNG_CALL sangoma_flush_event_bufs(sng_fd_t fd, wanpipe_api_t *tdm_api)
02332 {
02333 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02334 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02335 tdm_api->wp_cmd.cmd = WP_API_CMD_FLUSH_EVENT_BUFFERS;
02336 return sangoma_cmd_exec(fd,tdm_api);
02337 }
02338
02339 int _LIBSNG_CALL sangoma_tdm_enable_rbs_events(sng_fd_t fd, wanpipe_api_t *tdm_api, int poll_in_sec)
02340 {
02341 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02342 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02343 tdm_api->wp_cmd.cmd = WP_API_CMD_ENABLE_RBS_EVENTS;
02344 tdm_api->wp_cmd.rbs_poll = poll_in_sec;
02345 return sangoma_cmd_exec(fd,tdm_api);
02346 }
02347
02348 int _LIBSNG_CALL sangoma_tdm_disable_rbs_events(sng_fd_t fd, wanpipe_api_t *tdm_api) {
02349
02350 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02351 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02352 tdm_api->wp_cmd.cmd = WP_API_CMD_DISABLE_RBS_EVENTS;
02353 return sangoma_cmd_exec(fd,tdm_api);
02354 }
02355
02356 int _LIBSNG_CALL sangoma_tdm_write_rbs(sng_fd_t fd, wanpipe_api_t *tdm_api, int channel, unsigned char rbs)
02357 {
02358 WANPIPE_API_INIT_CHAN(tdm_api, channel);
02359 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02360 tdm_api->wp_cmd.cmd = WP_API_CMD_WRITE_RBS_BITS;
02361 tdm_api->wp_cmd.rbs_tx_bits=rbs;
02362 return sangoma_cmd_exec(fd,tdm_api);
02363 }
02364
02365 int _LIBSNG_CALL sangoma_tdm_read_rbs(sng_fd_t fd, wanpipe_api_t *tdm_api, int channel, unsigned char *rbs)
02366 {
02367 int err;
02368 WANPIPE_API_INIT_CHAN(tdm_api, channel);
02369 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02370 tdm_api->wp_cmd.cmd = WP_API_CMD_READ_RBS_BITS;
02371 tdm_api->wp_cmd.rbs_tx_bits=0;
02372
02373 err=sangoma_cmd_exec(fd,tdm_api);
02374 if (err){
02375 return err;
02376 }
02377
02378 *rbs=(unsigned char)tdm_api->wp_cmd.rbs_rx_bits;
02379 return 0;
02380 }
02381
02382 #ifdef WP_API_FEATURE_BUFFER_MULT
02383
02384 int _LIBSNG_CALL sangoma_tdm_set_buffer_multiplier(sng_fd_t fd, wanpipe_api_t *tdm_api, unsigned int multiplier)
02385 {
02386
02387 int err;
02388 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02389 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02390 tdm_api->wp_cmd.cmd = WP_API_CMD_BUFFER_MULTIPLIER;
02391 *((unsigned int*)&tdm_api->wp_cmd.data[0]) = multiplier;
02392
02393 err=sangoma_cmd_exec(fd,tdm_api);
02394 if (err){
02395 return err;
02396 }
02397
02398 return 0;
02399 }
02400
02401 #endif
02402
02403
02404 int _LIBSNG_CALL sangoma_read_event(sng_fd_t fd, wanpipe_api_t *tdm_api)
02405 {
02406
02407 #ifdef WP_API_FEATURE_EVENTS
02408 wp_api_event_t *rx_event;
02409 int err;
02410
02411 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02412 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02413 tdm_api->wp_cmd.cmd = WP_API_CMD_READ_EVENT;
02414
02415 err=sangoma_cmd_exec(fd,tdm_api);
02416 if (err){
02417 return err;
02418 }
02419
02420 rx_event = &tdm_api->wp_cmd.event;
02421
02422 #ifdef WP_API_DEPRECATED_FEATURE_READ_CALLBACK_FUNCTIONS
02423
02424
02425
02426
02427
02428
02429
02430 switch (rx_event->wp_api_event_type){
02431
02432 case WP_API_EVENT_RBS:
02433 if (tdm_api->wp_callback.wp_rbs_event) {
02434 tdm_api->wp_callback.wp_rbs_event(fd,rx_event->wp_api_event_rbs_bits);
02435 }
02436 break;
02437
02438 #ifdef WP_API_FEATURE_DTMF_EVENTS
02439 case WP_API_EVENT_DTMF:
02440 if (tdm_api->wp_callback.wp_dtmf_event) {
02441 tdm_api->wp_callback.wp_dtmf_event(fd,
02442 rx_event->wp_api_event_dtmf_digit,
02443 rx_event->wp_api_event_dtmf_type,
02444 rx_event->wp_api_event_dtmf_port);
02445 }
02446 break;
02447 #endif
02448
02449 case WP_API_EVENT_RXHOOK:
02450 if (tdm_api->wp_callback.wp_rxhook_event) {
02451 tdm_api->wp_callback.wp_rxhook_event(fd,
02452 rx_event->wp_api_event_hook_state);
02453 }
02454 break;
02455
02456 case WP_API_EVENT_RING_DETECT:
02457 if (tdm_api->wp_callback.wp_ring_detect_event) {
02458 tdm_api->wp_callback.wp_ring_detect_event(fd,
02459 rx_event->wp_api_event_ring_state);
02460 }
02461 break;
02462
02463 case WP_API_EVENT_RING_TRIP_DETECT:
02464 if (tdm_api->wp_callback.wp_ring_trip_detect_event) {
02465 tdm_api->wp_callback.wp_ring_trip_detect_event(fd,
02466 rx_event->wp_api_event_ring_state);
02467 }
02468 break;
02469
02470 #ifdef WP_API_FEATURE_FE_ALARM
02471 case WP_API_EVENT_ALARM:
02472 if (tdm_api->wp_callback.wp_fe_alarm_event) {
02473 tdm_api->wp_callback.wp_fe_alarm_event(fd,
02474 rx_event->wp_api_event_alarm);
02475 }
02476 break;
02477 #endif
02478
02479 #ifdef WP_API_FEATURE_LINK_STATUS
02480
02481 case WP_API_EVENT_LINK_STATUS:
02482 if(tdm_api->wp_callback.wp_link_status_event){
02483 tdm_api->wp_callback.wp_link_status_event(fd,
02484 rx_event->wp_api_event_link_status);
02485 }
02486
02487 break;
02488 #endif
02489
02490 #ifdef WP_API_FEATURE_POL_REV
02491 case WP_API_EVENT_POLARITY_REVERSE:
02492 break;
02493 #endif
02494 default:
02495 #ifdef __WINDOWS__
02496 if(0)printf("Warning: libsangoma: %s fd=0x%p: Unknown TDM event!", __FUNCTION__,fd);
02497 #else
02498 if(0)printf("Warning: libsangoma: %s fd=%d: Unknown TDM event!", __FUNCTION__, fd);
02499 #endif
02500 break;
02501 }
02502
02503 #endif
02504
02505
02506 return 0;
02507 #else
02508 printf("Error: Read Event not supported!\n");
02509 return -1;
02510 #endif
02511 }
02512
02513
02514 #ifdef WP_API_FEATURE_LOGGER
02515
02516
02517
02518 sangoma_status_t _LIBSNG_CALL sangoma_logger_cmd_exec(sng_fd_t fd, wp_logger_cmd_t *logger_cmd)
02519 {
02520 #if defined(__WINDOWS__)
02521 return logger_api_ioctl(fd, logger_cmd);
02522 #else
02523 int err = ioctl(fd,WANPIPE_IOCTL_LOGGER_CMD,logger_cmd);
02524 if (err < 0){
02525 char tmp[50];
02526 sprintf(tmp,"Logger CMD: %i\n",logger_cmd->cmd);
02527 perror(tmp);
02528 return -1;
02529 }
02530 return err;
02531 #endif
02532 }
02533
02534 sangoma_status_t _LIBSNG_CALL sangoma_logger_read_event(sng_fd_t fd, wp_logger_cmd_t *logger_cmd)
02535 {
02536 logger_cmd->cmd = WP_API_LOGGER_CMD_READ_EVENT;
02537 return sangoma_logger_cmd_exec(fd, logger_cmd);
02538 }
02539
02540 sangoma_status_t _LIBSNG_CALL sangoma_logger_flush_buffers(sng_fd_t fd, wp_logger_cmd_t *logger_cmd)
02541 {
02542 logger_cmd->cmd = WP_API_LOGGER_CMD_FLUSH_BUFFERS;
02543 return sangoma_logger_cmd_exec(fd, logger_cmd);
02544 }
02545
02546 sangoma_status_t _LIBSNG_CALL sangoma_logger_get_statistics(sng_fd_t fd, wp_logger_cmd_t *logger_cmd)
02547 {
02548 logger_cmd->cmd = WP_API_LOGGER_CMD_GET_STATS;
02549 return sangoma_logger_cmd_exec(fd, logger_cmd);
02550 }
02551
02552 sangoma_status_t _LIBSNG_CALL sangoma_logger_reset_statistics(sng_fd_t fd, wp_logger_cmd_t *logger_cmd)
02553 {
02554 logger_cmd->cmd = WP_API_LOGGER_CMD_RESET_STATS;
02555 return sangoma_logger_cmd_exec(fd, logger_cmd);
02556 }
02557
02558 sangoma_status_t _LIBSNG_CALL sangoma_logger_get_open_handle_counter(sng_fd_t fd, wp_logger_cmd_t *logger_cmd)
02559 {
02560 logger_cmd->cmd = WP_API_LOGGER_CMD_OPEN_CNT;
02561 return sangoma_logger_cmd_exec(fd, logger_cmd);
02562 }
02563
02564 sangoma_status_t _LIBSNG_CALL sangoma_logger_get_logger_level(sng_fd_t fd, wp_logger_cmd_t *logger_cmd)
02565 {
02566 logger_cmd->cmd = WP_API_LOGGER_CMD_GET_LOGGER_LEVEL;
02567 return sangoma_logger_cmd_exec(fd, logger_cmd);
02568 }
02569
02570 sangoma_status_t _LIBSNG_CALL sangoma_logger_set_logger_level(sng_fd_t fd, wp_logger_cmd_t *logger_cmd)
02571 {
02572 logger_cmd->cmd = WP_API_LOGGER_CMD_SET_LOGGER_LEVEL;
02573 return sangoma_logger_cmd_exec(fd, logger_cmd);
02574 }
02575
02576 #endif
02577
02578 #ifdef WP_API_FEATURE_FAX_EVENTS
02579 int _LIBSNG_CALL sangoma_tdm_enable_fax_events(sng_fd_t fd, wanpipe_api_t *tdm_api)
02580 {
02581 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02582 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02583 tdm_api->wp_cmd.cmd = WP_API_CMD_SET_EVENT;
02584 tdm_api->wp_cmd.event.wp_api_event_type = WP_API_EVENT_FAX_DETECT;
02585 tdm_api->wp_cmd.event.wp_api_event_mode = WP_API_EVENT_ENABLE;
02586 return sangoma_cmd_exec(fd,tdm_api);
02587 }
02588
02589 int _LIBSNG_CALL sangoma_tdm_disable_fax_events(sng_fd_t fd, wanpipe_api_t *tdm_api)
02590 {
02591 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02592 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02593 tdm_api->wp_cmd.cmd = WP_API_CMD_SET_EVENT;
02594 tdm_api->wp_cmd.event.wp_api_event_type = WP_API_EVENT_FAX_DETECT;
02595 tdm_api->wp_cmd.event.wp_api_event_mode = WP_API_EVENT_DISABLE;
02596 return sangoma_cmd_exec(fd,tdm_api);
02597 }
02598
02599 int _LIBSNG_CALL sangoma_tdm_get_hw_fax(sng_fd_t fd, wanpipe_api_t *tdm_api)
02600 {
02601 int err;
02602 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02603 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02604 tdm_api->wp_cmd.cmd = WP_API_CMD_GET_HW_FAX_DETECT;
02605 err=sangoma_cmd_exec(fd,tdm_api);
02606 if (err){
02607 return err;
02608 }
02609 return tdm_api->wp_cmd.hw_fax;
02610 }
02611 #endif
02612
02613 #ifdef WP_API_FEATURE_DTMF_EVENTS
02614 int _LIBSNG_CALL sangoma_tdm_enable_dtmf_events(sng_fd_t fd, wanpipe_api_t *tdm_api)
02615 {
02616 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02617 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02618 tdm_api->wp_cmd.cmd = WP_API_CMD_SET_EVENT;
02619 tdm_api->wp_cmd.event.wp_api_event_type = WP_API_EVENT_DTMF;
02620 tdm_api->wp_cmd.event.wp_api_event_mode = WP_API_EVENT_ENABLE;
02621 return sangoma_cmd_exec(fd,tdm_api);
02622 }
02623
02624 int _LIBSNG_CALL sangoma_tdm_disable_dtmf_events(sng_fd_t fd, wanpipe_api_t *tdm_api)
02625 {
02626 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02627 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02628 tdm_api->wp_cmd.cmd = WP_API_CMD_SET_EVENT;
02629 tdm_api->wp_cmd.event.wp_api_event_type = WP_API_EVENT_DTMF;
02630 tdm_api->wp_cmd.event.wp_api_event_mode = WP_API_EVENT_DISABLE;
02631 return sangoma_cmd_exec(fd,tdm_api);
02632 }
02633
02634 int _LIBSNG_CALL sangoma_tdm_enable_rm_dtmf_events(sng_fd_t fd, wanpipe_api_t *tdm_api)
02635 {
02636 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02637 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02638 tdm_api->wp_cmd.cmd = WP_API_CMD_SET_EVENT;
02639 tdm_api->wp_cmd.event.wp_api_event_type = WP_API_EVENT_RM_DTMF;
02640 tdm_api->wp_cmd.event.wp_api_event_mode = WP_API_EVENT_ENABLE;
02641 return sangoma_cmd_exec(fd,tdm_api);
02642 }
02643
02644 int _LIBSNG_CALL sangoma_tdm_disable_rm_dtmf_events(sng_fd_t fd, wanpipe_api_t *tdm_api)
02645 {
02646 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02647 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02648 tdm_api->wp_cmd.cmd = WP_API_CMD_SET_EVENT;
02649 tdm_api->wp_cmd.event.wp_api_event_type = WP_API_EVENT_RM_DTMF;
02650 tdm_api->wp_cmd.event.wp_api_event_mode = WP_API_EVENT_DISABLE;
02651 return sangoma_cmd_exec(fd,tdm_api);
02652 }
02653
02654 int _LIBSNG_CALL sangoma_tdm_enable_rxhook_events(sng_fd_t fd, wanpipe_api_t *tdm_api)
02655 {
02656 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02657 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02658 tdm_api->wp_cmd.cmd = WP_API_CMD_SET_EVENT;
02659 tdm_api->wp_cmd.event.wp_api_event_type = WP_API_EVENT_RXHOOK;
02660 tdm_api->wp_cmd.event.wp_api_event_mode = WP_API_EVENT_ENABLE;
02661 return sangoma_cmd_exec(fd,tdm_api);
02662 }
02663
02664 int _LIBSNG_CALL sangoma_tdm_disable_rxhook_events(sng_fd_t fd, wanpipe_api_t *tdm_api)
02665 {
02666 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02667 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02668 tdm_api->wp_cmd.cmd = WP_API_CMD_SET_EVENT;
02669 tdm_api->wp_cmd.event.wp_api_event_type = WP_API_EVENT_RXHOOK;
02670 tdm_api->wp_cmd.event.wp_api_event_mode = WP_API_EVENT_DISABLE;
02671 return sangoma_cmd_exec(fd,tdm_api);
02672 }
02673
02674 int _LIBSNG_CALL sangoma_tdm_enable_ring_events(sng_fd_t fd, wanpipe_api_t *tdm_api)
02675 {
02676 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02677 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02678 tdm_api->wp_cmd.cmd = WP_API_CMD_SET_EVENT;
02679 tdm_api->wp_cmd.event.wp_api_event_type = WP_API_EVENT_RING;
02680 tdm_api->wp_cmd.event.wp_api_event_mode = WP_API_EVENT_ENABLE;
02681 return sangoma_cmd_exec(fd,tdm_api);
02682 }
02683
02684 int _LIBSNG_CALL sangoma_tdm_disable_ring_events(sng_fd_t fd, wanpipe_api_t *tdm_api)
02685 {
02686 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02687 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02688 tdm_api->wp_cmd.cmd = WP_API_CMD_SET_EVENT;
02689 tdm_api->wp_cmd.event.wp_api_event_type = WP_API_EVENT_RING;
02690 tdm_api->wp_cmd.event.wp_api_event_mode = WP_API_EVENT_DISABLE;
02691 return sangoma_cmd_exec(fd,tdm_api);
02692 }
02693
02694 int _LIBSNG_CALL sangoma_tdm_enable_ring_detect_events(sng_fd_t fd, wanpipe_api_t *tdm_api)
02695 {
02696 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02697 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02698 tdm_api->wp_cmd.cmd = WP_API_CMD_SET_EVENT;
02699 tdm_api->wp_cmd.event.wp_api_event_type = WP_API_EVENT_RING_DETECT;
02700 tdm_api->wp_cmd.event.wp_api_event_mode = WP_API_EVENT_ENABLE;
02701 return sangoma_cmd_exec(fd,tdm_api);
02702 }
02703
02704 int _LIBSNG_CALL sangoma_tdm_disable_ring_detect_events(sng_fd_t fd, wanpipe_api_t *tdm_api)
02705 {
02706 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02707 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02708 tdm_api->wp_cmd.cmd = WP_API_CMD_SET_EVENT;
02709 tdm_api->wp_cmd.event.wp_api_event_type = WP_API_EVENT_RING_DETECT;
02710 tdm_api->wp_cmd.event.wp_api_event_mode = WP_API_EVENT_DISABLE;
02711 return sangoma_cmd_exec(fd,tdm_api);
02712 }
02713
02714 int _LIBSNG_CALL sangoma_tdm_enable_ring_trip_detect_events(sng_fd_t fd, wanpipe_api_t *tdm_api)
02715 {
02716 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02717 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02718 tdm_api->wp_cmd.cmd = WP_API_CMD_SET_EVENT;
02719 tdm_api->wp_cmd.event.wp_api_event_type = WP_API_EVENT_RING_TRIP_DETECT;
02720 tdm_api->wp_cmd.event.wp_api_event_mode = WP_API_EVENT_ENABLE;
02721 return sangoma_cmd_exec(fd,tdm_api);
02722 }
02723
02724 int _LIBSNG_CALL sangoma_tdm_disable_ring_trip_detect_events(sng_fd_t fd, wanpipe_api_t *tdm_api)
02725 {
02726 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02727 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02728 tdm_api->wp_cmd.cmd = WP_API_CMD_SET_EVENT;
02729 tdm_api->wp_cmd.event.wp_api_event_type = WP_API_EVENT_RING_TRIP_DETECT;
02730 tdm_api->wp_cmd.event.wp_api_event_mode = WP_API_EVENT_DISABLE;
02731 return sangoma_cmd_exec(fd,tdm_api);
02732 }
02733
02734 int _LIBSNG_CALL sangoma_tdm_txsig_kewl(sng_fd_t fd, wanpipe_api_t *tdm_api)
02735 {
02736 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02737 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02738 tdm_api->wp_cmd.cmd = WP_API_CMD_SET_EVENT;
02739 tdm_api->wp_cmd.event.wp_api_event_type = WP_API_EVENT_TXSIG_KEWL;
02740 tdm_api->wp_cmd.event.wp_api_event_mode = WP_API_EVENT_ENABLE;
02741 return sangoma_cmd_exec(fd,tdm_api);
02742 }
02743
02744 int _LIBSNG_CALL sangoma_tdm_txsig_start(sng_fd_t fd, wanpipe_api_t *tdm_api)
02745 {
02746 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02747 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02748 tdm_api->wp_cmd.cmd = WP_API_CMD_SET_EVENT;
02749 tdm_api->wp_cmd.event.wp_api_event_type = WP_API_EVENT_TXSIG_START;
02750 tdm_api->wp_cmd.event.wp_api_event_mode = WP_API_EVENT_ENABLE;
02751 return sangoma_cmd_exec(fd,tdm_api);
02752 }
02753
02754 int _LIBSNG_CALL sangoma_tdm_txsig_onhook(sng_fd_t fd, wanpipe_api_t *tdm_api)
02755 {
02756 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02757 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02758 tdm_api->wp_cmd.cmd = WP_API_CMD_SET_EVENT;
02759 tdm_api->wp_cmd.event.wp_api_event_type = WP_API_EVENT_TXSIG_ONHOOK;
02760 tdm_api->wp_cmd.event.wp_api_event_mode = WP_API_EVENT_ENABLE;
02761 return sangoma_cmd_exec(fd,tdm_api);
02762 }
02763
02764 int _LIBSNG_CALL sangoma_tdm_txsig_offhook(sng_fd_t fd, wanpipe_api_t *tdm_api)
02765 {
02766 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02767 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02768 tdm_api->wp_cmd.cmd = WP_API_CMD_SET_EVENT;
02769 tdm_api->wp_cmd.event.wp_api_event_type = WP_API_EVENT_TXSIG_OFFHOOK;
02770 tdm_api->wp_cmd.event.wp_api_event_mode = WP_API_EVENT_ENABLE;
02771 return sangoma_cmd_exec(fd,tdm_api);
02772 }
02773
02774 int _LIBSNG_CALL sangoma_tdm_enable_tone_events(sng_fd_t fd, wanpipe_api_t *tdm_api, uint16_t tone_id)
02775 {
02776 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02777 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02778 tdm_api->wp_cmd.cmd = WP_API_CMD_SET_EVENT;
02779 tdm_api->wp_cmd.event.wp_api_event_type = WP_API_EVENT_TONE;
02780 tdm_api->wp_cmd.event.wp_api_event_mode = WP_API_EVENT_ENABLE;
02781 tdm_api->wp_cmd.event.wp_api_event_tone_type = tone_id;
02782 return sangoma_cmd_exec(fd,tdm_api);
02783 }
02784
02785 int _LIBSNG_CALL sangoma_tdm_disable_tone_events(sng_fd_t fd, wanpipe_api_t *tdm_api)
02786 {
02787 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02788 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02789 tdm_api->wp_cmd.cmd = WP_API_CMD_SET_EVENT;
02790 tdm_api->wp_cmd.event.wp_api_event_type = WP_API_EVENT_TONE;
02791 tdm_api->wp_cmd.event.wp_api_event_mode = WP_API_EVENT_DISABLE;
02792 tdm_api->wp_cmd.event.wp_api_event_tone_type = 0x00;
02793 return sangoma_cmd_exec(fd,tdm_api);
02794 }
02795 #endif
02796
02797 int _LIBSNG_CALL sangoma_tdm_enable_hwec(sng_fd_t fd, wanpipe_api_t *tdm_api)
02798 {
02799
02800 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02801 tdm_api->wp_cmd.cmd = WP_API_CMD_ENABLE_HWEC;
02802 return sangoma_cmd_exec(fd,tdm_api);
02803 }
02804
02805 int _LIBSNG_CALL sangoma_tdm_disable_hwec(sng_fd_t fd, wanpipe_api_t *tdm_api)
02806 {
02807
02808 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02809 tdm_api->wp_cmd.cmd = WP_API_CMD_DISABLE_HWEC;
02810 return sangoma_cmd_exec(fd,tdm_api);
02811 }
02812
02813
02814
02815
02816
02817
02818 #ifdef WP_API_FEATURE_FE_ALARM
02819 int _LIBSNG_CALL sangoma_tdm_get_fe_alarms(sng_fd_t fd, wanpipe_api_t *tdm_api, unsigned int *alarms)
02820 {
02821 int err;
02822
02823 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02824 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02825 tdm_api->wp_cmd.cmd = WP_API_CMD_GET_FE_ALARMS;
02826
02827 err=sangoma_cmd_exec(fd,tdm_api);
02828 if (err){
02829 return err;
02830 }
02831
02832 *alarms=tdm_api->wp_cmd.fe_alarms;
02833
02834 return 0;
02835 }
02836
02837
02838 int _LIBSNG_CALL sangoma_get_fe_status(sng_fd_t fd, wanpipe_api_t *tdm_api, unsigned char *current_status)
02839 {
02840 int err;
02841
02842 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02843 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02844 tdm_api->wp_cmd.cmd = WP_API_CMD_GET_FE_STATUS;
02845 err = sangoma_cmd_exec(fd, tdm_api);
02846 *current_status = tdm_api->wp_cmd.fe_status;
02847
02848 return err;
02849 }
02850 #endif
02851
02852
02853 #ifdef WP_API_FEATURE_LINK_STATUS
02854 int _LIBSNG_CALL sangoma_get_link_status(sng_fd_t fd, wanpipe_api_t *tdm_api, unsigned char *current_status)
02855 {
02856 int err;
02857
02858 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02859 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02860 tdm_api->wp_cmd.cmd = WP_API_CMD_GET_FE_STATUS;
02861 err = sangoma_cmd_exec(fd, tdm_api);
02862 *current_status = tdm_api->wp_cmd.fe_status;
02863
02864 return err;
02865 }
02866
02867
02868 int _LIBSNG_CALL sangoma_set_fe_status(sng_fd_t fd, wanpipe_api_t *tdm_api, unsigned char new_status)
02869 {
02870 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02871 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02872 tdm_api->wp_cmd.cmd = WP_API_CMD_SET_FE_STATUS;
02873 tdm_api->wp_cmd.fe_status = new_status;
02874 return sangoma_cmd_exec(fd, tdm_api);
02875 }
02876 #endif
02877
02878 int _LIBSNG_CALL sangoma_disable_bri_bchan_loopback(sng_fd_t fd, wanpipe_api_t *tdm_api, int channel)
02879 {
02880 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02881 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02882 tdm_api->wp_cmd.cmd = WP_API_CMD_SET_EVENT;
02883 tdm_api->wp_cmd.event.channel = (unsigned char)channel;
02884 tdm_api->wp_cmd.event.wp_api_event_type = WP_API_EVENT_BRI_CHAN_LOOPBACK;
02885 tdm_api->wp_cmd.event.wp_api_event_mode = WP_API_EVENT_DISABLE;
02886 return sangoma_cmd_exec(fd, tdm_api);
02887 }
02888
02889 int _LIBSNG_CALL sangoma_enable_bri_bchan_loopback(sng_fd_t fd, wanpipe_api_t *tdm_api, int channel)
02890 {
02891 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02892 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02893 tdm_api->wp_cmd.cmd = WP_API_CMD_SET_EVENT;
02894 tdm_api->wp_cmd.event.channel = (unsigned char)channel;
02895 tdm_api->wp_cmd.event.wp_api_event_type = WP_API_EVENT_BRI_CHAN_LOOPBACK;
02896 tdm_api->wp_cmd.event.wp_api_event_mode = WP_API_EVENT_ENABLE;
02897 return sangoma_cmd_exec(fd, tdm_api);
02898 }
02899
02900 int _LIBSNG_CALL sangoma_get_tx_queue_sz(sng_fd_t fd, wanpipe_api_t *tdm_api)
02901 {
02902 int err;
02903
02904 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02905 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02906 tdm_api->wp_cmd.cmd = WP_API_CMD_GET_TX_Q_SIZE;
02907 tdm_api->wp_cmd.tx_queue_sz = 0;
02908
02909 err=sangoma_cmd_exec(fd, tdm_api);
02910 if (err < 0) {
02911 return err;
02912 }
02913
02914 return tdm_api->wp_cmd.tx_queue_sz;
02915 }
02916
02917 int _LIBSNG_CALL sangoma_set_tx_queue_sz(sng_fd_t fd, wanpipe_api_t *tdm_api, int size)
02918 {
02919 if (size < 0) {
02920 return -1;
02921 }
02922 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02923 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02924 tdm_api->wp_cmd.cmd = WP_API_CMD_SET_TX_Q_SIZE;
02925 tdm_api->wp_cmd.tx_queue_sz = size;
02926 return sangoma_cmd_exec(fd, tdm_api);
02927 }
02928
02929 int _LIBSNG_CALL sangoma_get_rx_queue_sz(sng_fd_t fd, wanpipe_api_t *tdm_api)
02930 {
02931 int err;
02932
02933 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02934 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02935 tdm_api->wp_cmd.cmd = WP_API_CMD_GET_RX_Q_SIZE;
02936 tdm_api->wp_cmd.rx_queue_sz = 0;
02937
02938 err=sangoma_cmd_exec(fd, tdm_api);
02939 if (err < 0) {
02940 return err;
02941 }
02942
02943 return tdm_api->wp_cmd.rx_queue_sz;
02944
02945 }
02946
02947 int _LIBSNG_CALL sangoma_set_rx_queue_sz(sng_fd_t fd, wanpipe_api_t *tdm_api, int size)
02948 {
02949 if (size < 0) {
02950 return -1;
02951 }
02952
02953 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02954 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02955 tdm_api->wp_cmd.cmd = WP_API_CMD_SET_RX_Q_SIZE;
02956 tdm_api->wp_cmd.rx_queue_sz = size;
02957 return sangoma_cmd_exec(fd, tdm_api);
02958 }
02959
02960 int _LIBSNG_CALL sangoma_get_driver_version(sng_fd_t fd, wanpipe_api_t *tdm_api, wan_driver_version_t *drv_ver)
02961 {
02962 int err;
02963
02964 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02965 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02966 tdm_api->wp_cmd.cmd = WP_API_CMD_DRIVER_VERSION;
02967
02968 err = sangoma_cmd_exec(fd, tdm_api);
02969 if (err == 0) {
02970 if (tdm_api->wp_cmd.data_len == sizeof(wan_driver_version_t)) {
02971 if (drv_ver) {
02972 memcpy(drv_ver,&tdm_api->wp_cmd.version,sizeof(wan_driver_version_t));
02973 }
02974 } else {
02975 return -1;
02976 }
02977 }
02978
02979 return err;
02980 }
02981
02982 int _LIBSNG_CALL sangoma_get_firmware_version(sng_fd_t fd, wanpipe_api_t *tdm_api, unsigned char *ver)
02983 {
02984 int err;
02985
02986 WANPIPE_API_INIT_CHAN(tdm_api, 0);
02987 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
02988 tdm_api->wp_cmd.cmd = WP_API_CMD_FIRMWARE_VERSION;
02989
02990 err = sangoma_cmd_exec(fd, tdm_api);
02991 if (err == 0) {
02992 if (tdm_api->wp_cmd.data_len == sizeof(unsigned char)) {
02993 *ver = tdm_api->wp_cmd.data[0];
02994 } else {
02995 return -1;
02996 }
02997 }
02998
02999 return err;
03000 }
03001
03002 int _LIBSNG_CALL sangoma_get_cpld_version(sng_fd_t fd, wanpipe_api_t *tdm_api, unsigned char *ver)
03003 {
03004 int err;
03005
03006 WANPIPE_API_INIT_CHAN(tdm_api, 0);
03007 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
03008 tdm_api->wp_cmd.cmd = WP_API_CMD_CPLD_VERSION;
03009
03010 err = sangoma_cmd_exec(fd, tdm_api);
03011 if (err == 0) {
03012 if (tdm_api->wp_cmd.data_len == sizeof(unsigned char)) {
03013 *ver = tdm_api->wp_cmd.data[0];
03014 } else {
03015 return -1;
03016 }
03017 }
03018
03019 return err;
03020 }
03021
03022 int _LIBSNG_CALL sangoma_get_aft_customer_id(sng_fd_t fd, unsigned char *out_customer_id)
03023 {
03024 wan_udp_hdr_t wan_udp;
03025
03026 memset(&wan_udp, 0x00, sizeof(wan_udp));
03027
03028 wan_udp.wan_udphdr_command = WANPIPEMON_AFT_CUSTOMER_ID;
03029 wan_udp.wan_udphdr_return_code = SANG_STATUS_UNSUPPORTED_FUNCTION;
03030 wan_udp.wan_udphdr_data_len = 0;
03031
03032 if (sangoma_mgmt_cmd(fd, &wan_udp)) {
03033 return SANG_STATUS_IO_ERROR;
03034 }
03035
03036 if (wan_udp.wan_udphdr_return_code) {
03037 return SANG_STATUS_UNSUPPORTED_FUNCTION;
03038 }
03039
03040 *out_customer_id = sangoma_get_wan_udphdr_data_byte(&wan_udp, 0);
03041
03042 return 0;
03043 }
03044
03045 #ifdef WP_API_FEATURE_LED_CTRL
03046 int _LIBSNG_CALL sangoma_port_led_ctrl(sng_fd_t fd, unsigned char led_ctrl)
03047 {
03048 wan_udp_hdr_t wan_udp;
03049
03050 memset(&wan_udp, 0x00, sizeof(wan_udp));
03051
03052 wan_udp.wan_udphdr_command = WANPIPEMON_LED_CTRL;
03053 wan_udp.wan_udphdr_return_code = SANG_STATUS_UNSUPPORTED_FUNCTION;
03054 wan_udp.wan_udphdr_data_len = 1;
03055 wan_udp.wan_udphdr_data[0] = led_ctrl;
03056
03057 if (sangoma_mgmt_cmd(fd, &wan_udp)) {
03058 return SANG_STATUS_IO_ERROR;
03059 }
03060
03061 if (wan_udp.wan_udphdr_return_code) {
03062 return SANG_STATUS_UNSUPPORTED_FUNCTION;
03063 }
03064
03065 return 0;
03066 }
03067 #endif
03068
03069 #ifdef WP_API_FEATURE_FE_RW
03070 int _LIBSNG_CALL sangoma_fe_reg_write(sng_fd_t fd, uint32_t offset, uint8_t data)
03071 {
03072 int chan=0;
03073 wan_udp_hdr_t wan_udp;
03074 sdla_fe_debug_t *fe_debug;
03075 memset(&wan_udp, 0x00, sizeof(wan_udp));
03076
03077 {
03078 int err;
03079 wanpipe_api_t tdm_api;
03080 memset(&tdm_api,0,sizeof(tdm_api));
03081 err=sangoma_get_full_cfg(fd, &tdm_api);
03082 if (err) {
03083 return err;
03084 }
03085 chan=tdm_api.wp_cmd.chan;
03086 if (chan)
03087 chan--;
03088 }
03089
03090 wan_udp.wan_udphdr_command = WAN_FE_SET_DEBUG_MODE;
03091 wan_udp.wan_udphdr_data_len = sizeof(sdla_fe_debug_t);
03092 wan_udp.wan_udphdr_return_code = 0xaa;
03093 fe_debug = (sdla_fe_debug_t*)wan_udp.wan_udphdr_data;
03094
03095 fe_debug->type = WAN_FE_DEBUG_REG;
03096 fe_debug->mod_no = chan;
03097 fe_debug->fe_debug_reg.reg = offset;
03098 fe_debug->fe_debug_reg.value = data;
03099 fe_debug->fe_debug_reg.read = 0;
03100
03101 if (sangoma_mgmt_cmd(fd, &wan_udp)) {
03102 return SANG_STATUS_IO_ERROR;
03103 }
03104
03105 if (wan_udp.wan_udphdr_return_code) {
03106 return SANG_STATUS_UNSUPPORTED_FUNCTION;
03107 }
03108
03109 return 0;
03110 }
03111
03112 int _LIBSNG_CALL sangoma_fe_reg_read(sng_fd_t fd, uint32_t offset, uint8_t *data)
03113 {
03114 int chan=0;
03115 wan_udp_hdr_t wan_udp;
03116 sdla_fe_debug_t *fe_debug;
03117 memset(&wan_udp, 0x00, sizeof(wan_udp));
03118
03119 {
03120 int err;
03121 wanpipe_api_t tdm_api;
03122 memset(&tdm_api,0,sizeof(tdm_api));
03123 err=sangoma_get_full_cfg(fd, &tdm_api);
03124 if (err) {
03125 return err;
03126 }
03127 chan=tdm_api.wp_cmd.chan;
03128 if (chan)
03129 chan--;
03130 }
03131
03132 wan_udp.wan_udphdr_command = WAN_FE_SET_DEBUG_MODE;
03133 wan_udp.wan_udphdr_data_len = sizeof(sdla_fe_debug_t);
03134 wan_udp.wan_udphdr_return_code = 0xaa;
03135 fe_debug = (sdla_fe_debug_t*)wan_udp.wan_udphdr_data;
03136
03137 fe_debug->type = WAN_FE_DEBUG_REG;
03138 fe_debug->mod_no = chan;
03139 fe_debug->fe_debug_reg.reg = offset;
03140 fe_debug->fe_debug_reg.read = 1;
03141
03142 if (sangoma_mgmt_cmd(fd, &wan_udp)) {
03143 return SANG_STATUS_IO_ERROR;
03144 }
03145
03146 if (wan_udp.wan_udphdr_return_code) {
03147 return SANG_STATUS_UNSUPPORTED_FUNCTION;
03148 }
03149
03150 *data = fe_debug->fe_debug_reg.value;
03151
03152 return 0;
03153 }
03154 #endif
03155
03156 int _LIBSNG_CALL sangoma_get_stats(sng_fd_t fd, wanpipe_api_t *tdm_api, wanpipe_chan_stats_t *stats)
03157 {
03158 int err;
03159
03160 WANPIPE_API_INIT_CHAN(tdm_api, 0);
03161 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
03162 tdm_api->wp_cmd.cmd = WP_API_CMD_GET_STATS;
03163
03164 err = sangoma_cmd_exec(fd, tdm_api);
03165 if (err == 0) {
03166 if (stats) {
03167 memcpy(stats, &tdm_api->wp_cmd.stats, sizeof(wanpipe_chan_stats_t));
03168 }
03169 }
03170
03171 return err;
03172 }
03173
03174 int _LIBSNG_CALL sangoma_flush_stats(sng_fd_t fd, wanpipe_api_t *tdm_api)
03175 {
03176 WANPIPE_API_INIT_CHAN(tdm_api, 0);
03177 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
03178 tdm_api->wp_cmd.cmd = WP_API_CMD_RESET_STATS;
03179 return sangoma_cmd_exec(fd, tdm_api);
03180 }
03181
03182 int _LIBSNG_CALL sangoma_set_rm_rxflashtime(sng_fd_t fd, wanpipe_api_t *tdm_api, int rxflashtime)
03183 {
03184 WANPIPE_API_INIT_CHAN(tdm_api, 0);
03185 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
03186 tdm_api->wp_cmd.cmd = WP_API_CMD_SET_RM_RXFLASHTIME;
03187 tdm_api->wp_cmd.rxflashtime=rxflashtime;
03188 return sangoma_cmd_exec(fd, tdm_api);
03189 }
03190
03191 #ifdef WP_API_FEATURE_RM_GAIN
03192 int _LIBSNG_CALL sangoma_set_rm_tx_gain(sng_fd_t fd, wanpipe_api_t *tdm_api, int value)
03193 {
03194 WANPIPE_API_INIT_CHAN(tdm_api, 0);
03195 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
03196 tdm_api->wp_cmd.cmd = WP_API_CMD_SET_EVENT;
03197 tdm_api->wp_cmd.event.wp_api_event_type = WP_API_EVENT_SET_RM_TX_GAIN;
03198 tdm_api->wp_cmd.event.wp_api_event_mode = WP_API_EVENT_ENABLE;
03199 tdm_api->wp_cmd.event.wp_api_event_gain_value = value;
03200 return sangoma_cmd_exec(fd, tdm_api);
03201 }
03202
03203 int _LIBSNG_CALL sangoma_set_rm_rx_gain(sng_fd_t fd, wanpipe_api_t *tdm_api, int value)
03204 {
03205 WANPIPE_API_INIT_CHAN(tdm_api, 0);
03206 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
03207 tdm_api->wp_cmd.cmd = WP_API_CMD_SET_EVENT;
03208 tdm_api->wp_cmd.event.wp_api_event_type = WP_API_EVENT_SET_RM_RX_GAIN;
03209 tdm_api->wp_cmd.event.wp_api_event_mode = WP_API_EVENT_ENABLE;
03210 tdm_api->wp_cmd.event.wp_api_event_gain_value = value;
03211 return sangoma_cmd_exec(fd, tdm_api);
03212 }
03213 #endif
03214
03215 int _LIBSNG_CALL sangoma_tdm_set_polarity(sng_fd_t fd, wanpipe_api_t *tdm_api, int polarity)
03216 {
03217 int err;
03218
03219 WANPIPE_API_INIT_CHAN(tdm_api, 0);
03220 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
03221 tdm_api->wp_cmd.cmd = WP_API_CMD_SET_EVENT;
03222 tdm_api->wp_cmd.event.wp_api_event_type = WP_API_EVENT_SETPOLARITY;
03223 tdm_api->wp_cmd.event.wp_api_event_polarity = polarity;
03224 err = sangoma_cmd_exec(fd, tdm_api);
03225 return err;
03226
03227 }
03228
03229
03230 int _LIBSNG_CALL sangoma_tdm_txsig_onhooktransfer(sng_fd_t fd, wanpipe_api_t *tdm_api)
03231 {
03232 WANPIPE_API_INIT_CHAN(tdm_api, 0);
03233 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
03234 tdm_api->wp_cmd.cmd = WP_API_CMD_SET_EVENT;
03235 tdm_api->wp_cmd.event.wp_api_event_type = WP_API_EVENT_ONHOOKTRANSFER;
03236 tdm_api->wp_cmd.event.wp_api_event_mode = WP_API_EVENT_ENABLE;
03237 return sangoma_cmd_exec(fd,tdm_api);
03238 }
03239
03240 #ifdef WP_API_FEATURE_LOOP
03241
03242 int _LIBSNG_CALL sangoma_tdm_enable_loop(sng_fd_t fd, wanpipe_api_t *tdm_api)
03243 {
03244 int err;
03245
03246 WANPIPE_API_INIT_CHAN(tdm_api, 0);
03247 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
03248 tdm_api->wp_cmd.cmd = WP_API_CMD_ENABLE_LOOP;
03249 err = sangoma_cmd_exec(fd, tdm_api);
03250 return err;
03251 }
03252
03253 int _LIBSNG_CALL sangoma_tdm_disable_loop(sng_fd_t fd, wanpipe_api_t *tdm_api)
03254 {
03255 int err;
03256
03257 WANPIPE_API_INIT_CHAN(tdm_api, 0);
03258 SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
03259 tdm_api->wp_cmd.cmd = WP_API_CMD_DISABLE_LOOP;
03260 err = sangoma_cmd_exec(fd, tdm_api);
03261 return err;
03262 }
03263
03264 #endif
03265
03266 #ifdef WP_API_FEATURE_HWEC_PERSIST
03267
03268
03269
03270
03271 #endif
03272
03273
03274
03275 #endif