/peek-build/m23/g23m-fad/tcpip/socket_api.c
C | 1658 lines | 1121 code | 325 blank | 212 comment | 114 complexity | 283744c86590d751da6a488c017d5ce1 MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.1, LGPL-2.0
Large files files are truncated, but you can click here to view the full file
- /*
- +------------------------------------------------------------------------------
- | File: socket.c
- +------------------------------------------------------------------------------
- | Copyright 2002 Texas Instruments Berlin, AG
- | All rights reserved.
- |
- | This file is confidential and a trade secret of Texas
- | Instruments Berlin, AG
- | The receipt of or possession of this file does not convey
- | any rights to reproduce or disclose its contents or to
- | manufacture, use, or sell anything it may describe, in
- | whole, or in part, without the specific written consent of
- | Texas Instruments Berlin, AG.
- +-----------------------------------------------------------------------------
- | Purpose : This file implements the socket API functionality.
- | For a description of this file read g23m\condat\doc\8462_601.doc
- +-----------------------------------------------------------------------------
- */
- #ifndef SAP_DCM
- #define SAP_DCM
- #endif /* !SAP_DCM */
- #define ENTITY_TCPIP
- #include <string.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include "socket_api.h"
- #include "custom.h"
- #include "pei.h"
- #include "socket_int.h"
- #include "dcm.h"
- #include "aci_all.h"
- LOCAL const int UNUSED = 0;
- /* this function maps the DCM result codes to the Socket-API result codes */
- LOCAL T_SOCK_RESULT map_dcm_result_code(S32 result)
- {
- switch(result)
- {
- case DCM_OK: return SOCK_RESULT_OK;
- case DCM_NOT_READY: return SOCK_RESULT_NOT_READY;
- case DCM_ALREADY_ACTIVATED: return SOCK_RESULT_BEARER_ACTIVE;
- case DCM_UNKNOWN_EVENT: return SOCK_RESULT_INTERNAL_ERROR;
- case DCM_INVALID_PARAMETER: return SOCK_RESULT_INVALID_PARAMETER;
- case DCM_BUSY: return SOCK_RESULT_IN_PROGRESS;
- case DCM_PS_CONN_BROKEN: return SOCK_RESULT_NETWORK_LOST;
- case DCM_NO_NETWORK: return SOCK_RESULT_BEARER_NOT_READY;
- default: return SOCK_RESULT_INTERNAL_ERROR;
- }
- }
- /*******************************************************************************
- ** Function : FindSocketData
- ** Parameter : T_SOCK_API_INSTANCE_DATA*
- ** T_SOCK_SOCKET
- ** Description : The function returns a pointer to the data structure of a socket.
- ** If the socket does not exist or api_data is NULL,
- ** then it returns NULL.
- *******************************************************************************/
- LOCAL T_SOCK_SOCKET_DATA* FindSocketData(T_SOCK_API_INSTANCE_DATA* api_data,
- T_SOCK_SOCKET tcpip_socket)
- {
- T_SOCK_SOCKET_DATA* socket_data;
- TRACE_FUNCTION("FindSocketData()");
- /* must be checked whether api_data is NULL or not.*/
- if(api_data != NULL)
- socket_data = api_data->socket_data;
- else
- {
- TRACE_ERROR("FindSocketData: api_data = NULL!");
- return NULL;
- }
-
- TRACE_EVENT_P2("FindSocketData() cached: %08X, search: %08X", socket_data, tcpip_socket);
- while((socket_data != NULL) && (tcpip_socket != socket_data->tcpip_socket))
- {
- socket_data = socket_data->next_socket_data;
- TRACE_EVENT_P2("FindSocketData() next: %08X, search: %08X", socket_data, tcpip_socket);
- }
- TRACE_EVENT_P2("FindSocketData: tcpip_data=%x, ret=%x",tcpip_socket,socket_data );
- return socket_data;
- } /* FindSocketData */
- /*******************************************************************************
- ** Function : ReleaseSocketData
- ** Parameter : T_SOCK_API_INSTANCE_DATA*
- ** T_SOCK_SOCKET_DATA*
- ** Description : The function releases the specified socket data.
- *******************************************************************************/
- static void ReleaseSocketData(T_SOCK_API_INSTANCE_DATA* api_data,
- T_SOCK_SOCKET_DATA* socket_data)
- {
- T_SOCK_SOCKET_DATA* temp_socket_data;
- TRACE_FUNCTION("ReleaseSocketData()");
- /* take socket data from linked list */
- if(api_data->socket_data == socket_data)
- {
- api_data->socket_data = socket_data->next_socket_data;
- }
- else
- {
- temp_socket_data = api_data->socket_data;
- while(temp_socket_data->next_socket_data != socket_data)
- {
- temp_socket_data = temp_socket_data->next_socket_data;
- }
- temp_socket_data->next_socket_data = socket_data->next_socket_data;
- }
-
- /* release socket data */
- MFREE(socket_data);
- } /* ReleaseSocketData */
- /******************************************************************************/
- BOOL sock_api_initialize(T_SOCK_API_INSTANCE *api_instance,
- T_HANDLE app_handle,
- char* app_name)
- {
- T_SOCK_API_INSTANCE_DATA* api_data_p;
- T_HANDLE hCommAPP;
- T_HANDLE hCommTCPIP;
- T_HANDLE hCommDCM;
- TRACE_FUNCTION("[Socket API] sock_api_initialize()");
- /* open communication handles */
- if((hCommTCPIP = vsi_c_open (app_handle, TCPIP_NAME)) < VSI_OK)
- {
- TRACE_ERROR( "sock_api_initialize: vsi_c_open(TCP) failed");
- return FALSE;
- }
- if((hCommAPP = vsi_c_open (app_handle, app_name)) < VSI_OK)
- {
- TRACE_ERROR( "sock_api_initialize: vsi_c_open(APP) failed");
- return FALSE;
- }
-
- if((hCommDCM = vsi_c_open (app_handle, DCM_NAME)) < VSI_OK)
- {
- TRACE_ERROR( "sock_api_initialize: vsi_c_open(DCM) failed");
- return FALSE;
- }
- /* initialization successful */
-
- /* allocate API Data structure */
- MALLOC(api_data_p, sizeof(T_SOCK_API_INSTANCE_DATA));
-
- /*initialize API Data */
- api_data_p->app_handle = app_handle;
- api_data_p->hCommAPP = hCommAPP;
- api_data_p->hCommTCPIP = hCommTCPIP;
- api_data_p->hCommDCM = hCommDCM;
- api_data_p->socket_data = NULL;
-
- /* derefernce 'api_instance' and save address of 'api_data' */
- *api_instance = (T_SOCK_API_INSTANCE)api_data_p;
- return TRUE;
- } /* sock_api_initialize */
- /******************************************************************************/
- void sock_api_deinitialize(T_SOCK_API_INSTANCE api_instance)
- {
- T_SOCK_API_INSTANCE_DATA* api_data_p;
- T_SOCK_SOCKET_DATA* socket_data1;
- T_SOCK_SOCKET_DATA* socket_data2;
- TRACE_FUNCTION("[Socket API] sock_api_deinitialize()");
- /* get the address of 'api_data' */
- api_data_p = (T_SOCK_API_INSTANCE_DATA*)api_instance;
-
- /*close communication channels */
- vsi_c_close (api_data_p->app_handle, api_data_p->hCommAPP);
- vsi_c_close (api_data_p->app_handle, api_data_p->hCommTCPIP);
- vsi_c_close (api_data_p->app_handle, api_data_p->hCommDCM);
- /* release all socket data */
- socket_data1 = api_data_p->socket_data;
- while(socket_data1 != NULL)
- {
- socket_data2 = socket_data1;
- socket_data1 = socket_data1->next_socket_data;
- MFREE(socket_data2);
- }
- /* release API data */
- MFREE(api_data_p);
- }
- /******************************************************************************/
- T_SOCK_RESULT sock_open_bearer(T_SOCK_API_INSTANCE api_instance,
- T_SOCK_BEARER_TYPE bearer_select,
- int profile_number,
- T_SOCK_BEARER_INFO *params,
- T_SOCK_CALLBACK sock_cb,
- void *context)
- {
- T_SOCK_API_INSTANCE_DATA* api_data_p;
- TRACE_FUNCTION("[Socket API] sock_open_bearer()");
-
- if(sock_cb EQ NULL)
- return SOCK_RESULT_INVALID_PARAMETER;
- /* set API data pointer */
- api_data_p = (T_SOCK_API_INSTANCE_DATA*)api_instance;
- api_data_p->context = context;
- api_data_p->callback = sock_cb;
-
- /* send primitive to DCM */
- {
- PALLOC(dcm_open_conn_req, DCM_OPEN_CONN_REQ);
- dcm_open_conn_req->api_instance = api_instance;
- dcm_open_conn_req->bearer_select = bearer_select;
- dcm_open_conn_req->profile_number = profile_number;
- dcm_open_conn_req->dcm_info_conn.bearer_handle = UNUSED;
- dcm_open_conn_req->dcm_info_conn.app_handle = params->app_handle;
- dcm_open_conn_req->dcm_info_conn.bearer_type = params->bearer_type;
- dcm_open_conn_req->dcm_info_conn.apn_valid = params->apn_valid;
- memcpy(dcm_open_conn_req->dcm_info_conn.apn, params->apn, SOCK_MAX_APN_LEN+1);
- dcm_open_conn_req->dcm_info_conn.phone_number_valid = params->phone_nr_valid;
- memcpy(dcm_open_conn_req->dcm_info_conn.phone_number, params->phone_nr,
- SOCK_MAX_PHONENUM_LEN+1);
- dcm_open_conn_req->dcm_info_conn.user_id_valid = params->user_id_valid;
- memcpy(dcm_open_conn_req->dcm_info_conn.user_id, params->user_id,
- SOCK_MAX_USERID_LEN+1);
- dcm_open_conn_req->dcm_info_conn.password_valid = params->password_valid;
- memcpy(dcm_open_conn_req->dcm_info_conn.password, params->password,
- SOCK_MAX_PASSWORD_LEN+1);
- dcm_open_conn_req->dcm_info_conn.cid = params->cid;
- dcm_open_conn_req->dcm_info_conn.ip_address = params->ip_address;
- dcm_open_conn_req->dcm_info_conn.dns1 = params->dns1;
- dcm_open_conn_req->dcm_info_conn.dns2 = params->dns2;
- dcm_open_conn_req->dcm_info_conn.gateway = params->gateway;
- dcm_open_conn_req->dcm_info_conn.auth_type = params->authtype;
- dcm_open_conn_req->dcm_info_conn.data_compr = params->data_compr;
- dcm_open_conn_req->dcm_info_conn.header_compr = params->header_comp;
- dcm_open_conn_req->dcm_info_conn.precedence = params->precedence;
- dcm_open_conn_req->dcm_info_conn.delay = params->precedence;
- dcm_open_conn_req->dcm_info_conn.reliability = params->reliability;
- dcm_open_conn_req->dcm_info_conn.peak_throughput = params->peak_throughput;
- dcm_open_conn_req->dcm_info_conn.mean_throughput = params->mean_througput;
- dcm_open_conn_req->dcm_info_conn.shareable = params->shareable;
- PSEND(api_data_p->hCommDCM, dcm_open_conn_req);
- }
- return SOCK_RESULT_OK;
- }
- /******************************************************************************/
- LOCAL void sock_open_bearer_cnf(T_DCM_OPEN_CONN_CNF *dcm_open_conn_cnf,
- T_SOCK_API_INSTANCE api_instance)
- {
- T_SOCK_OPEN_BEARER_CNF sock_open_bearer_cnf;
- T_SOCK_API_INSTANCE_DATA *api_data_p;
- TRACE_FUNCTION("[Socket API] sock_open_bearer_cnf()");
- api_data_p = (T_SOCK_API_INSTANCE_DATA*)api_instance;
-
- /* fill signal struct */
- sock_open_bearer_cnf.result = map_dcm_result_code(dcm_open_conn_cnf->result);
- sock_open_bearer_cnf.socket = UNUSED;
- sock_open_bearer_cnf.event_type = SOCK_OPEN_BEARER_CNF;
- sock_open_bearer_cnf.bearer_handle = dcm_open_conn_cnf->bearer_handle;
- /* release primitive */
- PFREE(dcm_open_conn_cnf);
-
- api_data_p->callback((T_SOCK_EVENTSTRUCT *)&sock_open_bearer_cnf,
- api_data_p->context);
- }
- /******************************************************************************/
- T_SOCK_RESULT sock_close_bearer(T_SOCK_API_INSTANCE api_instance,
- T_SOCK_BEARER_HANDLE bearer_handle,
- T_SOCK_CALLBACK sock_cb,
- void *context)
- {
- T_SOCK_API_INSTANCE_DATA* api_data_p;
- TRACE_FUNCTION("[Socket API] sock_close_bearer()");
- if(sock_cb EQ NULL) {
- return SOCK_RESULT_INVALID_PARAMETER;
- }
- /* set API data pointer */
- api_data_p = (T_SOCK_API_INSTANCE_DATA*)api_instance;
- api_data_p->callback = sock_cb;
- api_data_p->context = context;
- /* send primitive to DCM */
- {
- PALLOC(dcm_close_conn_req, DCM_CLOSE_CONN_REQ);
- dcm_close_conn_req->api_instance = api_instance;
- dcm_close_conn_req->bearer_handle = bearer_handle;
- PSEND(api_data_p->hCommDCM, dcm_close_conn_req);
- }
-
- return SOCK_RESULT_OK;
- }
- /******************************************************************************/
- LOCAL void sock_close_bearer_cnf(T_DCM_CLOSE_CONN_CNF *dcm_close_conn_cnf,
- T_SOCK_API_INSTANCE api_instance)
- {
- T_SOCK_CLOSE_BEARER_CNF sock_close_bearer_cnf;
- T_SOCK_API_INSTANCE_DATA *api_data_p;
- TRACE_FUNCTION("[Socket API] dcm_close_conn_cnf()");
- api_data_p = (T_SOCK_API_INSTANCE_DATA*)api_instance;
- sock_close_bearer_cnf.result = map_dcm_result_code(dcm_close_conn_cnf->result);
- sock_close_bearer_cnf.socket = UNUSED;
- sock_close_bearer_cnf.event_type = SOCK_CLOSE_BEARER_CNF;
- /* release primitive */
- PFREE(dcm_close_conn_cnf);
- /* call callback function */
- api_data_p->callback((T_SOCK_EVENTSTRUCT *)&sock_close_bearer_cnf,
- api_data_p->context);
- }
- /******************************************************************************/
- T_SOCK_RESULT sock_bearer_info(T_SOCK_API_INSTANCE api_instance,
- T_SOCK_BEARER_HANDLE bearer_handle,
- T_SOCK_CALLBACK sock_cb,
- void *context)
- {
- T_SOCK_API_INSTANCE_DATA* api_data_p;
- TRACE_FUNCTION("[Socket API] sock_bearer_info()");
- if(sock_cb EQ NULL)
- return SOCK_RESULT_INVALID_PARAMETER;
- /* set API data pointer */
- api_data_p = (T_SOCK_API_INSTANCE_DATA*)api_instance;
- api_data_p->callback = sock_cb;
- api_data_p->context = context;
- /* send primitive to DCM */
- {
- PALLOC(dcm_get_current_conn_req, DCM_GET_CURRENT_CONN_REQ);
- dcm_get_current_conn_req->api_instance = api_instance;
- dcm_get_current_conn_req->bearer_handle = bearer_handle;
- PSEND(api_data_p->hCommDCM, dcm_get_current_conn_req);
- }
- return SOCK_RESULT_OK;
- }
- /******************************************************************************/
- LOCAL void sock_bearer_info_cnf(T_DCM_GET_CURRENT_CONN_CNF *current_conn_cnf,
- T_SOCK_API_INSTANCE api_instance)
- {
- T_SOCK_BEARER_INFO_CNF bearer_info;
- T_SOCK_API_INSTANCE_DATA *api_data_p;
- TRACE_FUNCTION("[Socket API] sock_bearer_info_cnf()");
- api_data_p = (T_SOCK_API_INSTANCE_DATA*)api_instance;
- bearer_info.result = map_dcm_result_code(current_conn_cnf->result);
- bearer_info.socket = UNUSED;
- bearer_info.event_type = SOCK_BEARER_INFO_CNF;
- bearer_info.bearer_params.bearer_handle = current_conn_cnf->dcm_info_conn.bearer_handle;
- bearer_info.bearer_params.app_handle = current_conn_cnf->dcm_info_conn.app_handle;
- bearer_info.bearer_params.bearer_type =(T_SOCK_BEARER_TYPE)current_conn_cnf->dcm_info_conn.bearer_type;
- bearer_info.bearer_params.apn_valid = current_conn_cnf->dcm_info_conn.apn_valid;
- memcpy(bearer_info.bearer_params.apn,
- current_conn_cnf->dcm_info_conn.apn, SOCK_MAX_APN_LEN);
- bearer_info.bearer_params.phone_nr_valid = current_conn_cnf->dcm_info_conn.phone_number_valid;
- memcpy(bearer_info.bearer_params.phone_nr,current_conn_cnf->dcm_info_conn.phone_number,
- SOCK_MAX_PHONENUM_LEN);
- bearer_info.bearer_params.user_id_valid = current_conn_cnf->dcm_info_conn.user_id_valid;
- memcpy(bearer_info.bearer_params.user_id, current_conn_cnf->dcm_info_conn.user_id,
- SOCK_MAX_USERID_LEN);
- bearer_info.bearer_params.password_valid = current_conn_cnf->dcm_info_conn.password_valid;
- memcpy(bearer_info.bearer_params.password, current_conn_cnf->dcm_info_conn.password,
- SOCK_MAX_PASSWORD_LEN);
- bearer_info.bearer_params.cid = current_conn_cnf->dcm_info_conn.cid;
- bearer_info.bearer_params.ip_address = current_conn_cnf->dcm_info_conn.ip_address;
- bearer_info.bearer_params.dns1 = current_conn_cnf->dcm_info_conn.dns1;
- bearer_info.bearer_params.dns2 = current_conn_cnf->dcm_info_conn.dns2;
- bearer_info.bearer_params.gateway = current_conn_cnf->dcm_info_conn.gateway;
- bearer_info.bearer_params.authtype = (T_SOCK_AUTHTYPE)current_conn_cnf->dcm_info_conn.auth_type;
- bearer_info.bearer_params.data_compr = current_conn_cnf->dcm_info_conn.data_compr;
- bearer_info.bearer_params.header_comp = current_conn_cnf->dcm_info_conn.header_compr;
- bearer_info.bearer_params.precedence = current_conn_cnf->dcm_info_conn.precedence;
- bearer_info.bearer_params.delay = current_conn_cnf->dcm_info_conn.delay;
- bearer_info.bearer_params.reliability = current_conn_cnf->dcm_info_conn.reliability;
- bearer_info.bearer_params.peak_throughput = current_conn_cnf->dcm_info_conn.peak_throughput;
- bearer_info.bearer_params.mean_througput = current_conn_cnf->dcm_info_conn.mean_throughput;
- bearer_info.bearer_params.shareable = current_conn_cnf->dcm_info_conn.shareable;
- /* release primitive */
- PFREE(current_conn_cnf);
- /* call callback function */
- api_data_p->callback((T_SOCK_EVENTSTRUCT *)&bearer_info, api_data_p->context);
- }
- /******************************************************************************/
- LOCAL void sock_dcm_error_ind(T_DCM_ERROR_IND *dcm_error_ind,
- T_SOCK_API_INSTANCE api_instance)
- {
- T_SOCK_BAERER_CLOSED_IND sock_bearer_closed_ind;
- T_SOCK_API_INSTANCE_DATA *api_data_p;
- TRACE_FUNCTION("[Socket API] sock_dcm_error_ind()");
- api_data_p = (T_SOCK_API_INSTANCE_DATA*)api_instance;
- sock_bearer_closed_ind.event_type = SOCK_BAERER_CLOSED_IND;
- sock_bearer_closed_ind.result = map_dcm_result_code(dcm_error_ind->result);
- sock_bearer_closed_ind.socket = UNUSED;
- sock_bearer_closed_ind.dcm_error = dcm_error_ind->dcm_err;
- PFREE(dcm_error_ind);
-
- if(api_data_p->callback NEQ NULL)
- {
- api_data_p->callback((T_SOCK_EVENTSTRUCT *)&sock_bearer_closed_ind,
- api_data_p->context);
- }
- }
- /* ******************* Socket related functions ***************************** */
- /******************************************************************************/
- T_SOCK_RESULT sock_create(T_SOCK_API_INSTANCE api_instance,
- T_SOCK_IPPROTO ipproto,
- T_SOCK_CALLBACK callback,
- void* context)
- {
- T_SOCK_API_INSTANCE_DATA* api_data;
- T_SOCK_SOCKET_DATA* socket_data;
- TRACE_FUNCTION("[Socket API] sock_create()");
- TRACE_EVENT_P1("IP-Protocol=%d",(U32)ipproto);
-
- /* set api_data */
- api_data = (T_SOCK_API_INSTANCE_DATA*)api_instance;
-
- if(callback EQ NULL)
- return SOCK_RESULT_INVALID_PARAMETER;
- /* check for correct data */
- if((ipproto != SOCK_IPPROTO_UDP) && (ipproto != SOCK_IPPROTO_TCP))
- {
- TRACE_ERROR("[Socket API] Error: Invalid IP-Protocol");
- return SOCK_RESULT_INVALID_PARAMETER;
- }
- if( api_data == NULL )
- {
- TRACE_ERROR("[Socket API] Error: api_instance == NULL!");
- return SOCK_RESULT_INVALID_PARAMETER;
- }
- /* allocate socket data */
- MALLOC(socket_data, sizeof(T_SOCK_SOCKET_DATA));
-
- /* put socket data in linked list */
- socket_data->next_socket_data = api_data->socket_data;
- api_data->socket_data = socket_data;
-
- /* initialize socket data */
- socket_data->api_data = api_data;
- socket_data->tcpip_socket = 0;
- socket_data->callback = callback;
- socket_data->context = context;
- socket_data->rx_flow_control = SOCK_FLOW_XON;
- socket_data->tx_flow_control = SOCK_FLOW_XON;
- socket_data->rx_window = 1;
- socket_data->tx_window = 1;
-
- /* send primitive to TCPIP */
- {
- PALLOC(tcpip_create_req_prim, TCPIP_CREATE_REQ);
- tcpip_create_req_prim->app_handle = api_data->hCommAPP;
- tcpip_create_req_prim->ipproto = ipproto;
- tcpip_create_req_prim->request_id = (T_SOCK_SOCKET)socket_data;
- PSEND(api_data->hCommTCPIP, tcpip_create_req_prim);
- }
- return SOCK_RESULT_OK;
- }/* sock_create */
- /*****************************************************************************************
- ** Function : sock_create_cnf
- ** Parameter : T_TCPIP_CREATE_CNF *
- ** T_SOCK_API_INSTANCE ' this value will be ignored in this function
- ** because you can find socket_data only using request_id
- *****************************************************************************************/
- LOCAL void sock_create_cnf(T_TCPIP_CREATE_CNF *tcpip_create_cnf,
- T_SOCK_API_INSTANCE api_instance)
- {
- T_SOCK_SOCKET_DATA* socket_data;
- T_SOCK_CREATE_CNF sock_create_cnf;
- TRACE_FUNCTION("[Socket API] sock_create_cnf()");
- /* set socket data */
- socket_data = (T_SOCK_SOCKET_DATA*)tcpip_create_cnf->request_id;
-
- /* set received values */
- socket_data->tcpip_socket = tcpip_create_cnf->socket;
-
- /* fill confirm struct */
- sock_create_cnf.event_type = (T_SOCK_EVENTTYPE)tcpip_create_cnf->event_type;
- sock_create_cnf.result = (T_SOCK_RESULT)tcpip_create_cnf->result;
- sock_create_cnf.socket = (T_SOCK_SOCKET)socket_data;
-
- socket_data->callback((T_SOCK_EVENTSTRUCT *)&sock_create_cnf, socket_data->context);
- /* release socket data if context creation was not successful */
- if(tcpip_create_cnf->result != TCPIP_RESULT_OK)
- {
- TRACE_ERROR("[Socket API] Error: sock_create() failed");
- ReleaseSocketData(socket_data->api_data, socket_data);
- }
-
- PFREE(tcpip_create_cnf);
- }/* sock_create_cnf */
- /******************************************************************************/
- T_SOCK_RESULT sock_close(T_SOCK_SOCKET socket)
- {
- T_SOCK_API_INSTANCE_DATA* api_data;
- T_SOCK_SOCKET_DATA* sock_data;
- TRACE_FUNCTION("[Socket API] sock_close()");
- sock_data = (T_SOCK_SOCKET_DATA*)socket;
- if(sock_data == NULL)
- {
- return SOCK_RESULT_INVALID_PARAMETER;
- }
- api_data = sock_data->api_data;
-
- /* send primitive to TCPIP */
- {
- PALLOC(tcpip_close_req_prim, TCPIP_CLOSE_REQ);
- tcpip_close_req_prim->app_handle = api_data->hCommAPP;
- tcpip_close_req_prim->socket = sock_data->tcpip_socket;
- PSEND(api_data->hCommTCPIP, tcpip_close_req_prim);
- }
- return SOCK_RESULT_OK;
- }/* sock_close */
- /*******************************************************************************
- ** Function : sock_close_cnf
- ** Parameter : T_SOCK_CLOSE_CNF *
- *******************************************************************************/
- LOCAL void sock_close_cnf(T_TCPIP_CLOSE_CNF *tcpip_close_cnf,
- T_SOCK_API_INSTANCE api_instance)
- {
- T_SOCK_SOCKET_DATA* sock_data;
- T_SOCK_CLOSE_CNF sock_close_cnf;
- T_SOCK_API_INSTANCE_DATA *api_data;
- TRACE_FUNCTION("[Socket API] sock_close_cnf()");
- api_data = (T_SOCK_API_INSTANCE_DATA*)api_instance;
- sock_data = FindSocketData(api_data ,tcpip_close_cnf->socket);
- if(sock_data == NULL)
- {
- PFREE(tcpip_close_cnf);
- return;
- }
- /* fill confirm struct */
- sock_close_cnf.event_type = (T_SOCK_EVENTTYPE)tcpip_close_cnf->event_type;
- sock_close_cnf.result = (T_SOCK_RESULT)tcpip_close_cnf->result;
- sock_close_cnf.socket = (T_SOCK_SOCKET)sock_data;
-
- sock_data->callback(&sock_close_cnf, sock_data->context);
- /* release socket data if sock closing was successful */
- if(tcpip_close_cnf->result == TCPIP_RESULT_OK)
- {
- ReleaseSocketData(sock_data->api_data, sock_data);
- }
-
- PFREE(tcpip_close_cnf);
- }/* sock_close_cnf */
- /******************************************************************************/
- T_SOCK_RESULT sock_bind(T_SOCK_SOCKET socket, T_SOCK_PORT port)
- {
- T_SOCK_API_INSTANCE_DATA* api_data;
- T_SOCK_SOCKET_DATA *sock_data;
- TRACE_FUNCTION("[Socket API] sock_bind()");
- sock_data = (T_SOCK_SOCKET_DATA*)socket;
- if(sock_data == NULL)
- {
- return SOCK_RESULT_INVALID_PARAMETER;
- }
- api_data = sock_data->api_data;
- {
- PALLOC (tcpip_bind_req_prim, TCPIP_BIND_REQ);
- tcpip_bind_req_prim->app_handle = api_data->hCommAPP;
- tcpip_bind_req_prim->socket = sock_data->tcpip_socket;
- tcpip_bind_req_prim->port = port;
- PSEND(api_data->hCommTCPIP, tcpip_bind_req_prim);
- }
- return SOCK_RESULT_OK;
- }/* sock_bind */
- /*******************************************************************************
- ** Function : sock_bind_cnf
- ** Parameter : T_SOCK_BIND_CNF *
- ** T_SOCK_API_INSTANCE
- *******************************************************************************/
- LOCAL void sock_bind_cnf(T_TCPIP_BIND_CNF *tcpip_bind_cnf,
- T_SOCK_API_INSTANCE api_instance)
- {
- T_SOCK_SOCKET_DATA *sock_data;
- T_SOCK_BIND_CNF sock_bind_cnf;
- T_SOCK_API_INSTANCE_DATA *api_data;
- TRACE_FUNCTION("[Socket API] sock_bind_cnf()");
- api_data = (T_SOCK_API_INSTANCE_DATA*)api_instance;
- sock_data = FindSocketData(api_data ,tcpip_bind_cnf->socket);
- if(sock_data == NULL)
- {
- PFREE(tcpip_bind_cnf);
- return;
- }
- /* fill confirm struct */
- sock_bind_cnf.event_type = (T_SOCK_EVENTTYPE)tcpip_bind_cnf->event_type;
- sock_bind_cnf.result = (T_SOCK_RESULT)tcpip_bind_cnf->result;
- sock_bind_cnf.socket = (T_SOCK_SOCKET)sock_data;
- sock_data->callback(&sock_bind_cnf,sock_data->context);
- PFREE(tcpip_bind_cnf);
- }/* sock_bind_cnf */
- /******************************************************************************/
- T_SOCK_RESULT sock_listen(T_SOCK_SOCKET socket )
- {
- T_SOCK_API_INSTANCE_DATA* api_data;
- T_SOCK_SOCKET_DATA* sock_data;
-
- TRACE_FUNCTION("[Socket API] sock_listen()");
-
- sock_data = (T_SOCK_SOCKET_DATA*)socket;
- if(sock_data == NULL)
- {
- TRACE_ERROR("[Socket API] listen() error: Invalid socket data");
- return SOCK_RESULT_INVALID_PARAMETER;
- }
- api_data = sock_data->api_data;
- {
- PALLOC (tcpip_listen_req_prim, TCPIP_LISTEN_REQ);
- tcpip_listen_req_prim->app_handle = api_data->hCommAPP;
- tcpip_listen_req_prim->socket = sock_data->tcpip_socket;
- PSEND(api_data->hCommTCPIP,tcpip_listen_req_prim );
- }
- return SOCK_RESULT_OK;
- }/* sock_listen */
- /*******************************************************************************
- ** Function : sock_listen_cnf
- ** Parameter : T_SOCK_LISTEN_CNF *
- ** T_SOCK_API_INSTANCE
- *******************************************************************************/
- LOCAL void sock_listen_cnf(T_TCPIP_LISTEN_CNF *tcpip_listen_cnf,
- T_SOCK_API_INSTANCE api_instance )
- {
- T_SOCK_SOCKET_DATA *sock_data;
- T_SOCK_LISTEN_CNF sock_listen_cnf;
- T_SOCK_API_INSTANCE_DATA *api_data;
- TRACE_FUNCTION("[Socket API] sock_listen_cnf()");
- api_data = (T_SOCK_API_INSTANCE_DATA*)api_instance;
- sock_data = FindSocketData(api_data ,tcpip_listen_cnf->socket);
- if(sock_data == NULL)
- {
- PFREE(tcpip_listen_cnf);
- return;
- }
- /* fill confirm struct */
- sock_listen_cnf.event_type = (T_SOCK_EVENTTYPE)tcpip_listen_cnf->event_type;
- sock_listen_cnf.result = (T_SOCK_RESULT)tcpip_listen_cnf->result;
- sock_listen_cnf.socket = (T_SOCK_SOCKET)sock_data;
- sock_data->callback(&sock_listen_cnf,sock_data->context);
- PFREE(tcpip_listen_cnf);
- } /* sock_listen_cnf */
- /******************************************************************************/
- T_SOCK_RESULT sock_connect(T_SOCK_SOCKET socket,
- T_SOCK_IPADDR ipaddr,
- T_SOCK_PORT port)
- {
- T_SOCK_API_INSTANCE_DATA* api_data;
- T_SOCK_SOCKET_DATA* sock_data;
- TRACE_FUNCTION("sock_connect()");
- sock_data = (T_SOCK_SOCKET_DATA*)socket;
- if(sock_data == NULL)
- {
- TRACE_ERROR("[Socket API] connect error: Invalid socket data");
- return SOCK_RESULT_INVALID_PARAMETER;
- }
- api_data = sock_data->api_data;
- {
- PALLOC (tcpip_connect_req_prim, TCPIP_CONNECT_REQ);
- tcpip_connect_req_prim->app_handle = api_data->hCommAPP;
- tcpip_connect_req_prim->socket = sock_data->tcpip_socket;
- tcpip_connect_req_prim->ipaddr = ipaddr;
- tcpip_connect_req_prim->port = port;
- PSEND(api_data->hCommTCPIP, tcpip_connect_req_prim);
- }
- return SOCK_RESULT_OK;
- } /* sock_connect */
- /*******************************************************************************
- ** Function : sock_connect_cnf
- ** Parameter : T_SOCK_CONNECT_CNF *
- ** T_SOCK_API_INSTANCE
- *******************************************************************************/
- LOCAL void sock_connect_cnf(T_TCPIP_CONNECT_CNF *tcpip_connect_cnf,
- T_SOCK_API_INSTANCE api_instance )
- {
- T_SOCK_SOCKET_DATA *sock_data;
- T_SOCK_CONNECT_CNF sock_connect_cnf;
- T_SOCK_API_INSTANCE_DATA *api_data;
- TRACE_FUNCTION("sock_connect_cnf()");
- api_data = (T_SOCK_API_INSTANCE_DATA*)api_instance;
- TRACE_EVENT_P3("api_data %d, socket %d, reslut %d",api_data,
- tcpip_connect_cnf->socket,tcpip_connect_cnf->result);
- sock_data = FindSocketData(api_data ,tcpip_connect_cnf->socket);
- if(sock_data == NULL)
- {
- TRACE_EVENT("sock data NULL !!!");
- PFREE(tcpip_connect_cnf);
- return;
- }
- /* fill confirm struct */
- sock_connect_cnf.event_type = (T_SOCK_EVENTTYPE)tcpip_connect_cnf->event_type;
- sock_connect_cnf.result = (T_SOCK_RESULT)tcpip_connect_cnf->result;
- sock_connect_cnf.socket = (T_SOCK_SOCKET)sock_data;
- sock_data->callback(&sock_connect_cnf,sock_data->context);
- PFREE(tcpip_connect_cnf);
- } /* sock_connect_cnf */
- /******************************************************************************/
- T_SOCK_RESULT sock_getsockname(T_SOCK_SOCKET socket)
- {
- T_SOCK_API_INSTANCE_DATA* api_data;
- T_SOCK_SOCKET_DATA* sock_data;
- TRACE_FUNCTION("sock_getsockname()");
- sock_data = (T_SOCK_SOCKET_DATA*)socket;
- if(sock_data == NULL)
- {
- TRACE_ERROR("[Socket API] getsockname() error: Invalid socket data");
- return SOCK_RESULT_INVALID_PARAMETER;
- }
- api_data = sock_data->api_data;
- {
- PALLOC(tcpip_sockname_req_prim, TCPIP_SOCKNAME_REQ);
- tcpip_sockname_req_prim->app_handle = api_data->hCommAPP;
- tcpip_sockname_req_prim->socket = sock_data->tcpip_socket;
- PSEND(api_data->hCommTCPIP, tcpip_sockname_req_prim);
- }
- return SOCK_RESULT_OK;
- } /* sock_getsockname */
- /*******************************************************************************
- ** Function : sock_connect_cnf
- ** Parameter : T_SOCK_SOCKNAME_CNF *
- ** T_SOCK_API_INSTANCE
- *******************************************************************************/
- LOCAL void sock_sockname_cnf(T_TCPIP_SOCKNAME_CNF *tcpip_sockname_cnf,
- T_SOCK_API_INSTANCE api_instance )
- {
- T_SOCK_SOCKET_DATA *sock_data;
- T_SOCK_SOCKNAME_CNF sock_sockname_cnf;
- T_SOCK_API_INSTANCE_DATA *api_data;
- TRACE_FUNCTION("sock_getsockname_cnf()");
- api_data = (T_SOCK_API_INSTANCE_DATA*)api_instance;
- sock_data = FindSocketData(api_data , tcpip_sockname_cnf->socket);
- if(sock_data == NULL)
- {
- PFREE(tcpip_sockname_cnf);
- return;
- }
- /* fill confirm struct */
- sock_sockname_cnf.event_type = (T_SOCK_EVENTTYPE)tcpip_sockname_cnf->event_type;
- sock_sockname_cnf.result = (T_SOCK_RESULT)tcpip_sockname_cnf->result;
- sock_sockname_cnf.socket = (T_SOCK_SOCKET)sock_data;
- sock_sockname_cnf.ipaddr = tcpip_sockname_cnf->ipaddr;
- sock_sockname_cnf.port = tcpip_sockname_cnf->port;
- sock_data->callback((T_SOCK_EVENTSTRUCT*)&sock_sockname_cnf,sock_data->context);
- PFREE(tcpip_sockname_cnf);
- } /* sock_sockname_cnf */
- /******************************************************************************/
- T_SOCK_RESULT sock_getpeername(T_SOCK_SOCKET socket)
- {
- T_SOCK_API_INSTANCE_DATA* api_data;
- T_SOCK_SOCKET_DATA* sock_data;
- TRACE_FUNCTION("sock_getpeername()");
- sock_data = (T_SOCK_SOCKET_DATA*)socket;
- api_data = sock_data->api_data;
-
- if((sock_data == NULL) OR (api_data == NULL))
- {
- TRACE_ERROR("[Socket API] getpeername() error: Invalid socket data");
- return SOCK_RESULT_INVALID_PARAMETER;
- }
- {
- PALLOC (tcpip_peername_req_prim, TCPIP_PEERNAME_REQ);
- tcpip_peername_req_prim->app_handle = api_data->hCommAPP;
- tcpip_peername_req_prim->socket = sock_data->tcpip_socket;
- PSEND(api_data->hCommTCPIP, tcpip_peername_req_prim);
- }
- return SOCK_RESULT_OK;
- } /* sock_getpeername */
- /*******************************************************************************
- ** Function : sock_peername_cnf
- ** Parameter : T_SOCK_PEERNAME_CNF *
- ** T_SOCK_API_INSTANCE
- *******************************************************************************/
- LOCAL void sock_peername_cnf(T_TCPIP_PEERNAME_CNF *tcpip_peername_cnf,
- T_SOCK_API_INSTANCE api_instance )
- {
- T_SOCK_SOCKET_DATA *sock_data;
- T_SOCK_PEERNAME_CNF sock_peername_cnf;
- T_SOCK_API_INSTANCE_DATA *api_data;
- TRACE_FUNCTION("sock_getpeername_cnf()");
- api_data = (T_SOCK_API_INSTANCE_DATA*)api_instance;
- sock_data = FindSocketData(api_data ,tcpip_peername_cnf->socket);
- if(sock_data == NULL)
- {
- PFREE(tcpip_peername_cnf);
- return;
- }
- sock_peername_cnf.event_type = (T_SOCK_EVENTTYPE)tcpip_peername_cnf->event_type;
- sock_peername_cnf.result = (T_SOCK_RESULT)tcpip_peername_cnf->result;
- sock_peername_cnf.socket = (T_SOCK_SOCKET)sock_data;
- sock_peername_cnf.ipaddr = tcpip_peername_cnf->ipaddr;
- sock_peername_cnf.port = tcpip_peername_cnf->port;
-
- sock_data->callback((T_SOCK_EVENTSTRUCT*)&sock_peername_cnf,sock_data->context);
- PFREE(tcpip_peername_cnf);
- } /* sock_peername_cnf */
- /******************************************************************************/
- T_SOCK_RESULT sock_gethostbyname(T_SOCK_API_INSTANCE api_instance,
- char* hostname,
- T_SOCK_CALLBACK callback,
- void* context)
- {
- T_SOCK_API_INSTANCE_DATA* api_data;
- T_SOCK_SOCKET_DATA* socket_data;
- TRACE_FUNCTION("sock_gethostbyname()");
- TRACE_EVENT_P1("hostname: %s",hostname);
- api_data = (T_SOCK_API_INSTANCE_DATA*)api_instance;
- if(callback EQ NULL)
- return SOCK_RESULT_INVALID_PARAMETER;
- if(api_data == NULL)
- {
- TRACE_ERROR("[Socket API] gethostbyname() error: Invalid socket data");
- return SOCK_RESULT_INVALID_PARAMETER;
- }
-
- MALLOC(socket_data, sizeof(T_SOCK_SOCKET_DATA));
-
- /* put socket data in linked list */
- socket_data->next_socket_data = api_data->socket_data;
- api_data->socket_data = socket_data;
-
- /* initialize socket data */
- socket_data->api_data = api_data;
- socket_data->tcpip_socket = 0;
- socket_data->callback = callback;
- socket_data->context = context;
- socket_data->rx_flow_control = SOCK_FLOW_XON;
- socket_data->tx_flow_control = SOCK_FLOW_XON;
- socket_data->rx_window = 1;
- socket_data->tx_window = 1;
- {
- PALLOC (tcpip_hostinfo_req_prim , TCPIP_HOSTINFO_REQ);
- tcpip_hostinfo_req_prim->app_handle = api_data->hCommAPP;
- tcpip_hostinfo_req_prim->ipaddr = 0;
- strcpy((char*)tcpip_hostinfo_req_prim->hostname, hostname);
- tcpip_hostinfo_req_prim->request_id = (T_SOCK_SOCKET)socket_data;
- PSEND(api_data->hCommTCPIP,tcpip_hostinfo_req_prim);
- }
- return SOCK_RESULT_OK;
- } /* sock_gethostbyname */
- /*******************************************************************************
- ** Function : sock_hostinfo_cnf
- ** Parameter : T_SOCK_HOSTINFO_CNF *
- ** T_SOCK_API_INSTANCE this value will be ignored ...
- ** because you can find sock_data using request_id.
- *******************************************************************************/
- LOCAL void sock_hostinfo_cnf(T_TCPIP_HOSTINFO_CNF* tcpip_hostinfo_cnf ,
- T_SOCK_API_INSTANCE api_instance )
- {
- T_SOCK_SOCKET_DATA* socket_data;
- T_SOCK_HOSTINFO_CNF sock_hostinfo_cnf;
- socket_data = (T_SOCK_SOCKET_DATA*)tcpip_hostinfo_cnf->request_id;
-
- /* set received values */
- socket_data->tcpip_socket = tcpip_hostinfo_cnf->socket;
-
- /* fill confirm struct */
- sock_hostinfo_cnf.event_type = (T_SOCK_EVENTTYPE)tcpip_hostinfo_cnf->event_type;
- sock_hostinfo_cnf.result = (T_SOCK_RESULT)tcpip_hostinfo_cnf->result;
- sock_hostinfo_cnf.socket = (T_SOCK_SOCKET)socket_data;
- sock_hostinfo_cnf.ipaddr = tcpip_hostinfo_cnf->ipaddr;
- strcpy(sock_hostinfo_cnf.hostname,(char*)tcpip_hostinfo_cnf->hostname);
- socket_data->callback((T_SOCK_EVENTSTRUCT*)&sock_hostinfo_cnf, socket_data->context);
- ReleaseSocketData(socket_data->api_data, socket_data);
-
- PFREE(tcpip_hostinfo_cnf);
- } /* sock_hostinfo_cnf */
- /******************************************************************************/
- T_SOCK_RESULT sock_send(T_SOCK_SOCKET socket, char* buffer, U16 buffer_length)
- {
- T_SOCK_API_INSTANCE_DATA* api_data;
- T_SOCK_SOCKET_DATA* sock_data;
- TRACE_FUNCTION("[Socket API] sock_send()");
- sock_data = (T_SOCK_SOCKET_DATA*)socket;
- if(sock_data == NULL)
- {
- return SOCK_RESULT_INVALID_PARAMETER;
- }
- api_data = sock_data->api_data;
- if(sock_data->tx_window != 0)
- {
- PALLOC(tcpip_data_req_prim,TCPIP_DATA_REQ);
- tcpip_data_req_prim->app_handle = api_data->hCommAPP;
- tcpip_data_req_prim->socket = sock_data->tcpip_socket;
- tcpip_data_req_prim->ipaddr = 0;
- tcpip_data_req_prim->port = 0;
- tcpip_data_req_prim->buflen = buffer_length;
- tcpip_data_req_prim->data = (U32) M_ALLOC(buffer_length);
- if(tcpip_data_req_prim->data)
- {
- /* copy the user data buffer,
- the prim-data is freed by tcpip_clear_send_buffer() */
- memcpy((char *)tcpip_data_req_prim->data,buffer,buffer_length);
- }
- else
- {
- PFREE(tcpip_data_req_prim);
- return SOCK_RESULT_OUT_OF_MEMORY;
- }
- sock_data->tx_window--;
- PSEND(api_data->hCommTCPIP,tcpip_data_req_prim);
- return SOCK_RESULT_OK;
- }
- else /* tx_window = 0 */
- {
- sock_data->tx_flow_control = SOCK_FLOW_XOFF;
- return SOCK_RESULT_NO_BUFSPACE;
- }
- } /* sock_send */
- /******************************************************************************/
- T_SOCK_RESULT sock_sendto(T_SOCK_SOCKET socket, char* buffer,U16 buffer_length,
- T_SOCK_IPADDR ipaddr,T_SOCK_PORT port)
- {
- T_SOCK_API_INSTANCE_DATA* api_data;
- T_SOCK_SOCKET_DATA* sock_data;
- TRACE_FUNCTION("[Socket API] sock_sendto()");
- sock_data = (T_SOCK_SOCKET_DATA*)socket;
- if(sock_data == NULL)
- return SOCK_RESULT_INVALID_PARAMETER;
- api_data = sock_data->api_data;
- if(sock_data->tx_window != 0)
- {
- PALLOC(tcpip_data_req_prim,TCPIP_DATA_REQ);
- tcpip_data_req_prim->app_handle = api_data->hCommAPP;
- tcpip_data_req_prim->socket = sock_data->tcpip_socket;
- tcpip_data_req_prim->ipaddr = ipaddr;
- tcpip_data_req_prim->port = port;
- tcpip_data_req_prim->buflen = buffer_length;
- tcpip_data_req_prim->data=(U32) M_ALLOC(buffer_length);
- if(tcpip_data_req_prim->data )
- {
- /* copy the user data buffer,
- the prim-data is freed by tcpip_clear_send_buffer() */
- memcpy((char *)tcpip_data_req_prim->data,buffer,buffer_length);
- }
- else
- {
- PFREE(tcpip_data_req_prim);
- return SOCK_RESULT_OUT_OF_MEMORY;
- }
- sock_data->tx_window--;
- PSEND(api_data->hCommTCPIP, tcpip_data_req_prim);
- return SOCK_RESULT_OK;
- }
- else /* tx_window = 0 */
- {
- sock_data->tx_flow_control = SOCK_FLOW_XOFF;
- return SOCK_RESULT_NO_BUFSPACE;
- }
- }
-
- /*******************************************************************************
- ** Function : sock_mtu_size_cnf
- ** Parameter : T_SOCK_MTU_SIZE_CNF *
- ** T_SOCK_API_INSTANCE
- *******************************************************************************/
- LOCAL void sock_mtu_size_cnf(T_TCPIP_MTU_SIZE_CNF *tcpip_mtu_size_cnf ,
- T_SOCK_API_INSTANCE api_instance )
- {
- T_SOCK_SOCKET_DATA *sock_data;
- T_SOCK_MTU_SIZE_CNF sock_mtu_size_cnf;
- T_SOCK_API_INSTANCE_DATA *api_data;
- TRACE_FUNCTION("[Socket API] sock_mtu_size_cnf()");
- api_data = (T_SOCK_API_INSTANCE_DATA*)api_instance;
- sock_data = FindSocketData(api_data ,tcpip_mtu_size_cnf->socket);
- if(sock_data == NULL)
- {
- PFREE(tcpip_mtu_size_cnf);
- return;
- }
- sock_mtu_size_cnf.event_type = (T_SOCK_EVENTTYPE)tcpip_mtu_size_cnf->event_type;
- sock_mtu_size_cnf.result = (T_SOCK_RESULT)tcpip_mtu_size_cnf->result;
- sock_mtu_size_cnf.socket = (T_SOCK_SOCKET)sock_data;
- sock_mtu_size_cnf.mtu_size = tcpip_mtu_size_cnf->mtu_size;
- sock_data->callback((T_SOCK_EVENTSTRUCT*)&sock_mtu_size_cnf,sock_data->context);
- PFREE(tcpip_mtu_size_cnf);
- } /* sock_mtu_size_cnf */
- /*******************************************************************************
- ** Function : sock_connect_ind
- ** Parameter : T_SOCK_CONNECT_IND *
- ** T_SOCK_API_INSTANCE
- ** Description : new socket_data will be linked to current socket_data(listening socke_data)
- *******************************************************************************/
- LOCAL void sock_connect_ind(T_TCPIP_CONNECT_IND *tcpip_connect_ind ,
- T_SOCK_API_INSTANCE api_instance )
- {
- T_SOCK_SOCKET_DATA *cur_sock_data; /* listening socket_data */
- T_SOCK_SOCKET_DATA *new_sock_data; /* connected socket_data */
- T_SOCK_CONNECT_IND sock_connect_ind;
- T_SOCK_API_INSTANCE_DATA *api_data;
- TRACE_FUNCTION("[Socket API] sock_connect_ind()");
- api_data = (T_SOCK_API_INSTANCE_DATA*)api_instance;
- /* find listening socket_data
- * tcpip_connent_ind->socket is listening socket descrpitor
- */
- cur_sock_data = FindSocketData(api_data ,tcpip_connect_ind->socket);
- if(cur_sock_data == NULL)
- {
- PFREE(tcpip_connect_ind);
- return;
- }
- /* allocate socket data */
- MALLOC(new_sock_data, sizeof(T_SOCK_SOCKET_DATA));
- /* put socket data in linked list */
- new_sock_data->next_socket_data = NULL;
- cur_sock_data->next_socket_data = new_sock_data;
- /* initialize socket data */
- new_sock_data->api_data = api_data;
- new_sock_data->tcpip_socket = tcpip_connect_ind->new_socket;
- /* server must register callback using socket_get_callback() after receiving */
- /* connect ind event. */
- new_sock_data->callback = NULL;
- new_sock_data->context = NULL;
- new_sock_data->rx_flow_control = SOCK_FLOW_XON;
- new_sock_data->tx_flow_control = SOCK_FLOW_XON;
- new_sock_data->rx_window = 1;
- new_sock_data->tx_window = 1;
- /* fill confirm struct */
- sock_connect_ind.event_type = (T_SOCK_EVENTTYPE)tcpip_connect_ind->event_type;
- sock_connect_ind.result = (T_SOCK_RESULT)tcpip_connect_ind->result;
- /* Check !!! why cur_sock data become new_sock_data */
- /* sock_connect_ind.socket = (T_SOCK_SOCKET)cur_sock_data;*/
- sock_connect_ind.socket = (T_SOCK_SOCKET)new_sock_data;
- sock_connect_ind.new_socket = tcpip_connect_ind->new_socket;
- sock_connect_ind.peer_ipaddr = tcpip_connect_ind->ipaddr;
- sock_connect_ind.peer_port = tcpip_connect_ind->port;
- cur_sock_data->callback((T_SOCK_EVENTSTRUCT*)&sock_connect_ind,cur_sock_data->context);
- PFREE(tcpip_connect_ind);
- } /* sock_connect_ind */
- /*******************************************************************************
- ** Function : sock_conn_closed_ind
- ** Parameter : T_SOCK_CONN_CLOSED_IND *
- ** T_SOCK_API_INSTANCE
- ** Release closed socket data
- *******************************************************************************/
- LOCAL void sock_conn_closed_ind(T_TCPIP_CONN_CLOSED_IND *tcpip_conn_closed_ind,
- T_SOCK_API_INSTANCE api_instance)
- {
- T_SOCK_SOCKET_DATA *sock_data;
- T_SOCK_CONN_CLOSED_IND sock_conn_closed_ind;
- T_SOCK_API_INSTANCE_DATA *api_data;
- TRACE_FUNCTION("[Socket API] sock_closed_ind()");
- api_data = (T_SOCK_API_INSTANCE_DATA*)api_instance;
- sock_data = FindSocketData(api_data, tcpip_conn_closed_ind->socket);
- if(sock_data != NULL)
- {
- sock_conn_closed_ind.event_type = (T_SOCK_EVENTTYPE)tcpip_conn_closed_ind->event_type;
- sock_conn_closed_ind.result = (T_SOCK_RESULT)tcpip_conn_closed_ind->result;
- sock_conn_closed_ind.socket = (T_SOCK_SOCKET)sock_data;
- sock_data->callback(&sock_conn_closed_ind,sock_data->context);
- ReleaseSocketData(sock_data->api_data,sock_data);
- }
- else {;}
- PFREE(tcpip_conn_closed_ind);
- } /* sock_conn_closed_ind */
- /*******************************************************************************
- ** Function : sock_error_ind
- ** Parameter : T_SOCK_ERROR_IND *
- ** T_SOCK_API_INSTANCE
- *******************************************************************************/
- LOCAL void sock_error_ind(T_TCPIP_ERROR_IND* tcpip_error_ind ,
- T_SOCK_API_INSTANCE api_instance)
- {
- T_SOCK_SOCKET_DATA* sock_data;
- T_SOCK_ERROR_IND sock_error_ind;
- T_SOCK_API_INSTANCE_DATA *api_data;
- TRACE_FUNCTION("[Socket API] sock_error_ind()");
- api_data = (T_SOCK_API_INSTANCE_DATA*)api_instance;
-
- sock_data = FindSocketData(api_data , tcpip_error_ind->socket);
- if(sock_data != NULL)
- {
- /* fill confirm struct */
- sock_error_ind.event_type = (T_SOCK_EVENTTYPE)tcpip_error_ind->event_type;
- sock_error_ind.result = (T_SOCK_RESULT)tcpip_error_ind->result;
- sock_error_ind.socket = (T_SOCK_SOCKET)sock_data;
- sock_data->callback(&sock_error_ind,sock_data->context);
- }
- else {;}
-
- PFREE(tcpip_error_ind);
- } /* sock_error_ind */
- /******************************************************************************/
- T_SOCK_RESULT sock_gethostbyaddr(T_SOCK_API_INSTANCE api_instance,
- T_SOCK_IPADDR ipaddr,
- T_SOCK_CALLBACK callback,
- void* context )
- {
- T_SOCK_API_INSTANCE_DATA* api_data;
- T_SOCK_SOCKET_DATA* socket_data;
- TRACE_FUNCTION("[Socket API] sock_gethostbyaddr()");
- if(callback EQ NULL)
- return SOCK_RESULT_INVALID_PARAMETER;
- api_data = (T_SOCK_API_INSTANCE_DATA*)api_instance;
-
- MALLOC(socket_data, sizeof(T_SOCK_SOCKET_DATA));
-
- /* put socket data in linked list */
- socket_data->next_socket_data = api_data->socket_data;
- api_data->socket_data = socket_data;
-
- /* initialize socket data */
- socket_data->api_data = api_data;
- socket_data->tcpip_socket = 0;
- socket_data->callback = callback;
- socket_data->context = context;
- socket_data->rx_flow_control = SOCK_FLOW_XON;
- socket_data->tx_flow_control = SOCK_FLOW_XON;
- socket_data->rx_window = 1;
- socket_data->tx_window = 1;
-
- {
- PALLOC (tcpip_hostinfo_req_prim ,TCPIP_HOSTINFO_REQ);
- tcpip_hostinfo_req_prim->app_handle = api_data->hCommAPP;
- tcpip_hostinfo_req_prim->ipaddr = ipaddr;
- *tcpip_hostinfo_req_prim->hostname = 0;
- tcpip_hostinfo_req_prim->request_id = (T_SOCK_SOCKET)socket_data;
- PSEND(api_data->hCommTCPIP, tcpip_hostinfo_req_prim);
- }
- return SOCK_RESULT_OK;
- } /* sock_gethostbyaddr */
- /*******************************************************************************
- Function : sock_recv_ind
- Parameter : T_TCPIP_DATA_IND*
- T_SOCK_API_INSTANCE
- Return : VOID
- Return Event : None
- *******************************************************************************/
- static void sock_recv_ind(T_TCPIP_DATA_IND* tcpip_data_ind,
- T_SOCK_API_INSTANCE api_instance)
- {
- T_SOCK_SOCKET_DATA* sock_data;
- T_SOCK_RECV_IND sock_receive_ind;
- T_SOCK_API_INSTANCE_DATA *api_data;
- TRACE_FUNCTION("[Socket API] sock_recv_ind()");
- api_data = (T_SOCK_API_INSTANCE_DATA*)api_instance;
-
- sock_data = FindSocketData(api_data , tcpip_data_ind->socket);
- if(sock_data == NULL)
- {
- MFREE(tcpip_data_ind->data);
- PFREE(tcpip_data_ind);
- return;
- }
- sock_data->rx_window--; /* when data received, window size will be descreased..*/
- if(sock_data->rx_flow_control == SOCK_FLOW_XOFF )
- {
- /* case sock flow xoff, sock_data will be stored and send to the application
- with sock_flow_xon() */
- sock_data->recv_ind.socket = tcpip_data_ind->socket;
- sock_data->recv_ind.result = (T_SOCK_RESULT)tcpip_data_ind->result;
- sock_data->recv_ind.event_type = (T_SOCK_EVENTTYPE)tcpip_data_ind->event_type;
- sock_data->recv_ind.data_length = tcpip_data_ind->buflen;
- sock_data->recv_ind.data_buffer = (char*)tcpip_data_ind->data;
- }
- else
- {
- /* case sock flow xon , sock_data will be sent to application...*/
- sock_receive_ind.event_type = (T_SOCK_EVENTTYPE)tcpip_data_ind->event_type;
- sock_receive_ind.result = (T_SOCK_RESULT)tcpip_data_ind->result;
- sock_receive_ind.socket = (T_SOCK_SOCKET)sock_data;
- sock_receive_ind.data_length = tcpip_data_ind->buflen;
- sock_receive_ind.data_buffer = (char *)tcpip_data_ind->data;
- sock_data->callback((T_SOCK_EVENTSTRUCT*)&sock_receive_ind,sock_data->context);
- /* send primitive */
- if( (sock_data->rx_flow_control != SOCK_FLOW_XOFF) &&
- (sock_data->rx_window == 0) )
- {
- PALLOC(tcpip_data_res_prim,TCPIP_DATA_RES);
- tcpip_data_res_prim->app_handle = api_data->hCommAPP;
- ACI_ASSERT(sock_data->tcpip_socket == tcpip_data_ind->socket);
- tcpip_data_res_prim->socket = tcpip_data_ind->socket ;
- tcpip_data_res_prim->window = 1;
- sock_data->rx_window = 1;
- PSEND(api_data->hCommTCPIP, tcpip_data_res_prim);
- }
- }
- PFREE(tcpip_data_ind);
- } /* sock_recv_ind */
- /*******************************************************************************
- ** Function : sock_send_cnf
- ** Parameter : T_TCPIP_DATA_CNF *
- ** T_SOCK_API_INSTANCE
- *******************************************************************************/
- static void sock_send_cnf(T_TCPIP_DATA_CNF* tcpip_data_cnf,
- T_SOCK_API_INSTANCE api_instance)
- {
- T_SOCK_SOCKET_DATA *sock_data;
- T_SOCK_API_INSTANCE_DATA *api_data;
- T_SOCK_FLOW_READY_IND sock_flow_ready_ind;
- TRACE_FUNCTION("[Socket API] sock_send_cnf()");
- api_data = (T_SOCK_API_INSTANCE_DATA*)api_instance;
- sock_data = FindSocketData(api_data , tcpip_data_cnf->socket);
- if(sock_data == NULL)
- {
- PFREE(tcpip_data_cnf);
- return;
- }
- /* if tcpip_data_cnf->window is 0,*/
- /* this value will be 1 because 0 and 1 is the same meaning in the Rnet TCPIP.*/
- if( tcpip_data_cnf->window == 0 )
- {
- sock_data->tx_window = 1;
- }
- else
- {
- sock_data->tx_window = tcpip_data_cnf->window;
- }
- sock_flow_ready_ind.event_type = (T_SOCK_EVENTTYPE)tcpip_data_cnf->event_type;
- sock_flow_ready_ind.re…
Large files files are truncated, but you can click here to view the full file