--- /dev/null
+/*****************************************************************************\r
+ * win_api_common.h Windows Sangoma API Code Library\r
+ *\r
+ * Author(s): David Rokhvarg <davidr@sangoma.com>\r
+ *\r
+ * Copyright: (c) 1984-2006 Sangoma Technologies Inc.\r
+ *\r
+ * ============================================================================\r
+ */\r
+\r
+#ifndef _WIN_API_COMMON_H\r
+#define _WIN_API_COMMON_H\r
+\r
+#define DEV_NAME_LEN 100
+char device_name[DEV_NAME_LEN];
+
+/* IOCTL management structures and variables*/
+wan_udp_hdr_t wan_udp;
+
+static wan_cmd_api_t api_cmd;
+static api_tx_hdr_t *tx_hdr = (api_tx_hdr_t *)api_cmd.data;\r
+\r
+/* keeps the LAST (and single) event received */\r
+static wp_tdm_api_rx_hdr_t last_tdm_api_event_buffer;\r
+\r
+static \r
+int \r
+tdmv_api_ioctl(\r
+ HANDLE fd, \r
+ wanpipe_tdm_api_cmd_t *tdm_api_cmd\r
+ )\r
+{\r
+ DWORD ln;\r
+ unsigned char id = 0;\r
+ int err = 0;\r
+\r
+ wan_udp.wan_udphdr_request_reply = 0x01;\r
+ wan_udp.wan_udphdr_id = id;\r
+ wan_udp.wan_udphdr_return_code = WAN_UDP_TIMEOUT_CMD;\r
+\r
+ wan_udp.wan_udphdr_command = WAN_TDMV_API_IOCTL;\r
+ wan_udp.wan_udphdr_data_len = sizeof(wanpipe_tdm_api_cmd_t);\r
+\r
+ //copy data from caller's buffer to driver's buffer\r
+ memcpy( wan_udp.wan_udphdr_data, \r
+ (void*)tdm_api_cmd,\r
+ sizeof(wanpipe_tdm_api_cmd_t));\r
+\r
+ if(DeviceIoControl(\r
+ fd,\r
+ IoctlManagementCommand,\r
+ (LPVOID)&wan_udp,\r
+ sizeof(wan_udp_hdr_t),\r
+ (LPVOID)&wan_udp,\r
+ sizeof(wan_udp_hdr_t),\r
+ (LPDWORD)(&ln),\r
+ (LPOVERLAPPED)NULL\r
+ ) == FALSE){\r
+ //actual ioctl failed\r
+ err = 1;\r
+ return err;\r
+ }else{\r
+ err = 0;\r
+ }\r
+\r
+ if(wan_udp.wan_udphdr_return_code != WAN_CMD_OK){\r
+ //ioctl ok, but command failed\r
+ return 2;\r
+ }\r
+\r
+ //copy data from driver's buffer to caller's buffer\r
+ memcpy( (void*)tdm_api_cmd,\r
+ wan_udp.wan_udphdr_data, \r
+ sizeof(wanpipe_tdm_api_cmd_t));\r
+ return 0;\r
+}\r
+\r
+static \r
+int \r
+wanpipe_api_ioctl(\r
+ HANDLE fd,\r
+ wan_cmd_api_t *api_cmd\r
+ )\r
+{\r
+ DWORD ln;\r
+ unsigned char id = 0;\r
+ int err = 0;\r
+\r
+ wan_udp.wan_udphdr_request_reply = 0x01;\r
+ wan_udp.wan_udphdr_id = id;\r
+ wan_udp.wan_udphdr_return_code = WAN_UDP_TIMEOUT_CMD;\r
+\r
+ wan_udp.wan_udphdr_command = SIOC_WANPIPE_API;\r
+ wan_udp.wan_udphdr_data_len = sizeof(wan_cmd_api_t);\r
+\r
+ //copy data from caller's buffer to driver's buffer\r
+ memcpy( wan_udp.wan_udphdr_data, \r
+ (void*)api_cmd,\r
+ sizeof(wan_cmd_api_t));\r
+\r
+ if(DeviceIoControl(\r
+ fd,\r
+ IoctlManagementCommand,\r
+ (LPVOID)&wan_udp,\r
+ sizeof(wan_udp_hdr_t),\r
+ (LPVOID)&wan_udp,\r
+ sizeof(wan_udp_hdr_t),\r
+ (LPDWORD)(&ln),\r
+ (LPOVERLAPPED)NULL\r
+ ) == FALSE){\r
+ err = 1;\r
+ return err;\r
+ }else{\r
+ err = 0;\r
+ }\r
+\r
+ if(wan_udp.wan_udphdr_return_code != WAN_CMD_OK){\r
+ return 2;\r
+ }\r
+\r
+ //copy data from driver's buffer to caller's buffer\r
+ memcpy( (void*)api_cmd,\r
+ wan_udp.wan_udphdr_data, \r
+ sizeof(wan_cmd_api_t));\r
+ return 0;\r
+}\r
+\r
+// Blocking read command. If used after DoApiPollCommand(),\r
+// it will return immediatly, without blocking.\r
+static \r
+USHORT \r
+DoReadCommand(\r
+ HANDLE drv, \r
+ RX_DATA_STRUCT * pRx\r
+ )\r
+{\r
+ DWORD ln;\r
+\r
+ if (DeviceIoControl(\r
+ drv,\r
+ IoctlReadCommand,\r
+ (LPVOID)NULL,\r
+ 0L,\r
+ (LPVOID)pRx,\r
+ sizeof(RX_DATA_STRUCT),\r
+ (LPDWORD)(&ln),\r
+ (LPOVERLAPPED)NULL\r
+ ) == FALSE){\r
+ //check messages log\r
+ return 1;\r
+ }else{\r
+ return 0;\r
+ }\r
+}\r
+\r
+// Blocking write command. If used after DoApiPollCommand(),\r
+// it will return immediatly, without blocking.\r
+static\r
+UCHAR \r
+DoWriteCommand(\r
+ HANDLE drv, \r
+ TX_DATA_STRUCT * pTx\r
+ )\r
+{\r
+ DWORD ln;\r
+\r
+ if(DeviceIoControl(\r
+ drv,\r
+ IoctlWriteCommand,\r
+ (LPVOID)pTx,\r
+ (ULONG)sizeof(TX_DATA_STRUCT),\r
+ (LPVOID)pTx,\r
+ sizeof(TX_DATA_STRUCT),\r
+ (LPDWORD)(&ln),\r
+ (LPOVERLAPPED)NULL\r
+ ) == FALSE){\r
+ return 1;\r
+ }else{\r
+ return 0;\r
+ }\r
+}\r
+\r
+// Blocking API Poll command.\r
+static\r
+USHORT \r
+DoApiPollCommand(\r
+ HANDLE drv, \r
+ API_POLL_STRUCT *api_poll_ptr\r
+ )\r
+{\r
+ DWORD ln;\r
+\r
+ if (DeviceIoControl(\r
+ drv,\r
+ IoctlApiPoll,\r
+ (LPVOID)NULL,\r
+ 0L,\r
+ (LPVOID)api_poll_ptr,\r
+ sizeof(API_POLL_STRUCT),\r
+ (LPDWORD)(&ln),\r
+ (LPOVERLAPPED)NULL\r
+ ) == FALSE){\r
+ return 1;\r
+ }else{\r
+ return 0;\r
+ }\r
+}\r
+\r
+static\r
+int \r
+DoManagementCommand(\r
+ HANDLE drv, \r
+ wan_udp_hdr_t* wan_udp\r
+ )\r
+{\r
+ DWORD ln;\r
+ static unsigned char id = 0;\r
+\r
+ wan_udp->wan_udphdr_request_reply = 0x01;\r
+ wan_udp->wan_udphdr_id = id++;\r
+ wan_udp->wan_udphdr_return_code = WAN_UDP_TIMEOUT_CMD;\r
+\r
+ if(DeviceIoControl(\r
+ drv,\r
+ IoctlManagementCommand,\r
+ (LPVOID)wan_udp,\r
+ sizeof(wan_udp_hdr_t),\r
+ (LPVOID)wan_udp,\r
+ sizeof(wan_udp_hdr_t),\r
+ (LPDWORD)(&ln),\r
+ (LPOVERLAPPED)NULL\r
+ ) == FALSE){\r
+ return 1;\r
+ }else{\r
+ return 0;\r
+ }\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////////\r
+//\r
+//structures and definitions used for queueing data\r
+//\r
+typedef struct\r
+{\r
+ void* previous;\r
+ TX_RX_DATA_STRUCT tx_rx_data;\r
+}api_queue_element_t;\r
+\r
+#define API_Q_MUTEX_TIMEOUT 1000//1 second\r
+#define API_Q_MAX_SIZE 100//optimal length. for short data may need longer queue\r
+\r
+enum API_Q_STATUS{\r
+ API_Q_SUCCESS=0,\r
+ API_Q_GEN_FAILURE,\r
+ API_Q_MEM_ALLOC_FAILURE,\r
+ API_Q_FULL,\r
+ API_Q_EMPTY\r
+};\r
+\r
+typedef struct\r
+{\r
+ //number of nodes in the list\r
+ USHORT size;\r
+ //insert at tail\r
+ api_queue_element_t * tail;\r
+ //remove from head\r
+ api_queue_element_t * head;\r
+ //mutex for synchronizing access to the queue\r
+ HANDLE api_queue_mutex;\r
+}api_queue_t;\r
+\r
+\r
+static __inline int api_enqueue( api_queue_t* api_queue, \r
+ unsigned char * buffer,\r
+ unsigned short length)\r
+{\r
+ api_queue_element_t *element;\r
+ DWORD mresult;\r
+\r
+ mresult = WaitForSingleObject(api_queue->api_queue_mutex, API_Q_MUTEX_TIMEOUT);\r
+ if (mresult != WAIT_OBJECT_0) {\r
+ return API_Q_GEN_FAILURE;\r
+ }\r
+\r
+ if(api_queue->size == API_Q_MAX_SIZE){\r
+ ReleaseMutex(api_queue->api_queue_mutex);\r
+ return API_Q_FULL;\r
+ }\r
+\r
+ element = malloc(sizeof(api_queue_element_t));\r
+ if(element == NULL){\r
+ ReleaseMutex(api_queue->api_queue_mutex);\r
+ return API_Q_MEM_ALLOC_FAILURE;\r
+ }\r
+\r
+ //now copy everything in to the element\r
+ memcpy(element->tx_rx_data.data, buffer, length);\r
+ \r
+ element->tx_rx_data.api_header.data_length = length;\r
+ element->tx_rx_data.api_header.operation_status = SANG_STATUS_TX_TIMEOUT;\r
+\r
+ //insert element at the tail of the queue\r
+ element->previous = NULL;\r
+\r
+ if(api_queue->size == 0){\r
+ //special case of a previously empty queue\r
+ api_queue->head = element;\r
+ api_queue->tail = element;\r
+ }else{\r
+ api_queue->tail->previous = element;\r
+ api_queue->tail = element;\r
+ }\r
+ api_queue->size++;\r
+ ReleaseMutex(api_queue->api_queue_mutex);\r
+ return API_Q_SUCCESS;\r
+}\r
+\r
+static __inline int api_dequeue( api_queue_t* api_queue,\r
+ TX_RX_DATA_STRUCT* destination)\r
+{\r
+ api_queue_element_t *element;\r
+ DWORD mresult;\r
+\r
+ mresult = WaitForSingleObject(api_queue->api_queue_mutex, API_Q_MUTEX_TIMEOUT);\r
+ if (mresult != WAIT_OBJECT_0) {\r
+ return API_Q_GEN_FAILURE;\r
+ }\r
+\r
+ if(api_queue->size == 0){\r
+ //tx queue is empty\r
+ ReleaseMutex(api_queue->api_queue_mutex);\r
+ return API_Q_EMPTY;\r
+ }\r
+\r
+ //remove from the head of the queue\r
+ element = api_queue->head;\r
+ api_queue->head = element->previous;\r
+\r
+ //now copy everything in to the user buffer\r
+ memcpy(destination, &element->tx_rx_data, sizeof(TX_DATA_STRUCT));\r
+\r
+ free(element);\r
+ api_queue->size--;\r
+ if(api_queue->size == 0){\r
+ api_queue->head = NULL;\r
+ api_queue->tail = NULL;\r
+ }\r
+ ReleaseMutex(api_queue->api_queue_mutex);\r
+ return API_Q_SUCCESS;\r
+}\r
+\r
+//remove all elements from the queue\r
+static __inline void empty_api_queue(api_queue_t* api_queue)\r
+{\r
+ TX_DATA_STRUCT tx_rx_data;\r
+\r
+ while(api_dequeue(api_queue, &tx_rx_data) == 0){\r
+ ;\r
+ }\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////////\r
+#endif /* _WIN_API_COMMON_H */\r
#define WANPIPE_TDM_API 1
-#ifndef __WINDOWS__
-#if defined(WIN32) || defined(WIN64) || defined(_MSC_VER) || defined(_WIN32)
-#define __WINDOWS__
-#endif
-#endif
-
#include "openzap.h"
#include "zap_wanpipe.h"
#pragma warning(disable:4200 4201 4214)
#endif
#include <windows.h>
-#include <winioctl.h>
-#include <conio.h>
-#include <stddef.h>
-typedef unsigned __int16 u_int16_t;
-typedef unsigned __int32 u_int32_t;
+#define FNAME_LEN 50
+#define WP_INVALID_SOCKET INVALID_HANDLE_VALUE
+#else
+#define WP_INVALID_SOCKET -1
#endif
#include <wanpipe_defines.h>
#include <wanpipe_cfg.h>
#include <wanpipe_tdm_api.h>
+#include <sdla_te1_pmc.h>
#ifdef __WINDOWS__
#include <sang_status_defines.h>
#include <sang_api.h>
#endif
-#include <sdla_te1_pmc.h>
-#include <sdla_te1.h>
-#include <sdla_56k.h>
-#include <sdla_remora.h>
-#include <sdla_te3.h>
-#include <sdla_front_end.h>
#include <sdla_aft_te1.h>
+
+#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
+#endif
+
+#if defined(__WINDOWS__)
+#include <zap_wanpipe_windows.h>
+#endif
+
static zap_software_interface_t wanpipe_interface;
fd = open(fname, O_RDWR);
+ if (fd < 0) {
+ fd = WP_INVALID_SOCKET;
+ }
+
return fd;
#endif
}
for(x = start; x < end; x++) {
zap_channel_t *chan;
- zap_socket_t sockfd = -1;
+ zap_socket_t sockfd = WP_INVALID_SOCKET;
sockfd = wp_open_device(spanno, x);
- if (sockfd > -1 && zap_span_add_channel(span, sockfd, type, &chan) == ZAP_SUCCESS) {
+ if (sockfd != WP_INVALID_SOCKET && zap_span_add_channel(span, sockfd, type, &chan) == ZAP_SUCCESS) {
zap_log(ZAP_LOG_INFO, "configuring device s%dc%d as OpenZAP device %d:%d fd:%d\n", spanno, x, chan->span_id, chan->chan_id, sockfd);
configured++;
} else {
int channo;
int spanno;
int top = 0;
- int x;
unsigned configured = 0;
assert(str != NULL);
}
+#ifndef __WINDOWS__
+
static ZINT_READ_FUNCTION(wanpipe_read_unix)
{
int rx_len = 0;
return ZAP_SUCCESS;
}
-static ZINT_READ_FUNCTION(wanpipe_read)
-{
- ZINT_READ_MUZZLE;
-
-#ifndef WIN32
- return wanpipe_read_unix(zchan, data, datalen);
-#endif
-
- return ZAP_FAIL;
-}
-
static ZINT_WRITE_FUNCTION(wanpipe_write_unix)
{
int bsent;
}
+#endif
+
+static ZINT_READ_FUNCTION(wanpipe_read)
+{
+ ZINT_READ_MUZZLE;
+
+#ifndef WIN32
+ return wanpipe_read_unix(zchan, data, datalen);
+#endif
+
+ return ZAP_FAIL;
+}
+
static ZINT_WRITE_FUNCTION(wanpipe_write)
{
ZINT_WRITE_MUZZLE;