FreeCalypso > hg > fc-magnetite
diff src/g23m-fad/tcpip/socket_api.c @ 174:90eb61ecd093
src/g23m-fad: initial import from TCS3.2/LoCosto
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Wed, 12 Oct 2016 05:40:46 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/g23m-fad/tcpip/socket_api.c Wed Oct 12 05:40:46 2016 +0000 @@ -0,0 +1,1656 @@ +/* ++------------------------------------------------------------------------------ +| 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; + } + + while((socket_data != NULL) && (tcpip_socket != socket_data->tcpip_socket)) + { + socket_data = socket_data->next_socket_data; + } + + 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.result = (T_SOCK_RESULT)tcpip_data_cnf->result; + sock_flow_ready_ind.socket = (T_SOCK_SOCKET)sock_data; + /* permit next packet to be send */ + sock_data->tx_flow_control = SOCK_FLOW_XON; + + sock_data->callback(&sock_flow_ready_ind,sock_data->context); + + PFREE(tcpip_data_cnf); +} + + +/******************************************************************************/ +T_SOCK_RESULT sock_set_callback(T_SOCK_SOCKET socket ,T_SOCK_CALLBACK new_callback, + void* new_context) +{ + T_SOCK_SOCKET_DATA* sock_data; + + sock_data = (T_SOCK_SOCKET_DATA*)socket; + + if(new_callback EQ NULL) + return SOCK_RESULT_INVALID_PARAMETER; + + if(sock_data == NULL) + { + return SOCK_RESULT_INVALID_PARAMETER; + } + + sock_data->callback = new_callback; + sock_data->context = new_context; + + return SOCK_RESULT_OK; +} + + +/******************************************************************************/ +T_SOCK_RESULT sock_get_callback(T_SOCK_SOCKET socket, T_SOCK_CALLBACK *callback_p, + void **context_p) +{ + T_SOCK_SOCKET_DATA* sock_data; + + TRACE_FUNCTION("[Socket API] sock_get_callback()"); + + /* get current callback,context */ + sock_data = (T_SOCK_SOCKET_DATA*)socket; + if(sock_data == NULL) + { + return SOCK_RESULT_INVALID_PARAMETER; + } + if(callback_p != NULL) + { + callback_p = &sock_data->callback; + } + if(context_p != NULL) + { + context_p = &sock_data->context; + } + return SOCK_RESULT_OK; +} /* socket_get_callback */ + + +/******************************************************************************/ +T_SOCK_RESULT sock_flow_xoff(T_SOCK_SOCKET socket) +{ + T_SOCK_SOCKET_DATA* sock_data; + + TRACE_FUNCTION("[Socket API] sock_flow_xoff()"); + + sock_data = (T_SOCK_SOCKET_DATA*)socket; + if(sock_data == NULL) + { + return SOCK_RESULT_INVALID_PARAMETER; + } + + sock_data->rx_flow_control = SOCK_FLOW_XOFF; + + return SOCK_RESULT_OK; + +} /* sock_flow_xoff */ + + +/******************************************************************************/ +T_SOCK_RESULT sock_flow_xon(T_SOCK_SOCKET socket) +{ + 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_flow_xon()"); + + sock_data = (T_SOCK_SOCKET_DATA*)socket; + + if(sock_data == NULL) + { + return SOCK_RESULT_INVALID_PARAMETER; + } + + api_data = sock_data->api_data; + sock_data->rx_flow_control = SOCK_FLOW_XON; + + if(sock_data->recv_ind.data_length != 0) + { + sock_receive_ind.event_type = sock_data->recv_ind.event_type; + sock_receive_ind.result = sock_data->recv_ind.result; + sock_receive_ind.socket = (T_SOCK_SOCKET)sock_data; + sock_receive_ind.data_length = sock_data->recv_ind.data_length; + sock_receive_ind.data_buffer = sock_data->recv_ind.data_buffer; + + /* clear recv_ind struct, buffer is freed by application */ + memset(&sock_data->recv_ind, 0x00 , sizeof(T_SOCK_RECV_IND)); + + sock_data->callback((T_SOCK_EVENTSTRUCT*)&sock_receive_ind,sock_data->context); + } + + 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; + tcpip_data_res_prim->socket = sock_data->tcpip_socket; + tcpip_data_res_prim->window = 1; + sock_data->rx_window = 1; + + PSEND(api_data->hCommTCPIP, tcpip_data_res_prim); + } + return SOCK_RESULT_OK; +} /* sock_flow_xon */ + + +/******************************************************************************/ +T_SOCK_RESULT sock_get_mtu_size(T_SOCK_SOCKET socket) +{ + T_SOCK_API_INSTANCE_DATA* api_data; + T_SOCK_SOCKET_DATA* sock_data; + + TRACE_FUNCTION("[Socket API] sock_get_mtu_size()"); + + sock_data = (T_SOCK_SOCKET_DATA*)socket; + + /* check whether sock_data is NULL or not */ + if(sock_data == NULL) + { + return SOCK_RESULT_INVALID_PARAMETER; + } + + api_data = sock_data->api_data; + + /* send primitive */ + { + PALLOC (tcpip_mtu_size_req_prim, TCPIP_MTU_SIZE_REQ); + tcpip_mtu_size_req_prim->app_handle = api_data->hCommAPP; + tcpip_mtu_size_req_prim->socket = sock_data->tcpip_socket; + PSEND(api_data->hCommTCPIP, tcpip_mtu_size_req_prim); + } + return SOCK_RESULT_OK; +} /* sock_get_mtu_size */ + + +/******************************************************************************/ +LOCAL void pei_not_supported (void *data) +{ + TRACE_FUNCTION ("pei_not_supported()"); + + PFREE (data); +} + + +/******************************************************************************/ +BOOL sock_api_handles_primitive( T_SOCK_API_INSTANCE api_instance, T_PRIM* prim) +{ + LOCAL const T_FUNC tcpip_table[] = + { + MAK_FUNC_N( pei_not_supported, 0 /*TCPIP_INITIALIZE_CNF*/ ), /* 0x00 */ + MAK_FUNC_N( pei_not_supported, 0 /*TCPIP_SHUTDOWN_CNF*/ ), /* 0x01 */ + MAK_FUNC_N( pei_not_supported, 0 /*TCPIP_IFCONFIG_CNF */ ), /* 0x02 */ + MAK_FUNC_N( pei_not_supported, 0 /*TCPIP_DTI_CNF*/ ), /* 0x03 */ + MAK_FUNC_0( sock_create_cnf, TCPIP_CREATE_CNF ), /* 0x04 */ + MAK_FUNC_0( sock_close_cnf, TCPIP_CLOSE_CNF ), /* 0x05 */ + MAK_FUNC_0( sock_bind_cnf, TCPIP_BIND_CNF ), /* 0x06 */ + MAK_FUNC_0( sock_listen_cnf, TCPIP_LISTEN_CNF ), /* 0x07 */ + MAK_FUNC_0( sock_connect_cnf, TCPIP_CONNECT_CNF ), /* 0x08 */ + MAK_FUNC_0( sock_send_cnf, TCPIP_DATA_CNF ), /* 0x09 */ + MAK_FUNC_0( sock_recv_ind, TCPIP_DATA_IND ), /* 0x0a */ + MAK_FUNC_0( sock_sockname_cnf, TCPIP_SOCKNAME_CNF ), /* 0x0b */ + MAK_FUNC_0( sock_peername_cnf, TCPIP_PEERNAME_CNF ), /* 0x0c */ + MAK_FUNC_0( sock_hostinfo_cnf, TCPIP_HOSTINFO_CNF ), /* 0x0d */ + MAK_FUNC_0( sock_mtu_size_cnf, TCPIP_MTU_SIZE_CNF ), /* 0x0e */ + MAK_FUNC_0( sock_connect_ind, TCPIP_CONNECT_IND ), /* 0x0f */ + MAK_FUNC_0( sock_conn_closed_ind, TCPIP_CONN_CLOSED_IND ), /* 0x10 */ + MAK_FUNC_0( sock_error_ind, TCPIP_ERROR_IND ), /* 0x11 */ + }; + + LOCAL const T_FUNC dcm_table[] = + { + MAK_FUNC_0( sock_open_bearer_cnf, DCM_OPEN_CONN_CNF ), + MAK_FUNC_0( sock_close_bearer_cnf, DCM_CLOSE_CONN_CNF ), + MAK_FUNC_0( sock_bearer_info_cnf, DCM_GET_CURRENT_CONN_CNF), + MAK_FUNC_0( sock_dcm_error_ind, DCM_ERROR_IND ), + }; + + TRACE_FUNCTION("sock_api_handles_primitive()"); + + if(prim NEQ NULL) + { + ULONG opc = prim->custom.opc; + USHORT tabsize; + const T_FUNC *table = 0; + + switch( SAP_NR(opc) ) + { + case SAP_NR(TCPIP_DL): + table = tcpip_table; + tabsize = TAB_SIZE (tcpip_table); + break; + case SAP_NR(DCM_UL): + table = dcm_table; + tabsize = TAB_SIZE(dcm_table); + break; + default: + /* Primitive is not for these SAP's */ + return FALSE; + } + + if (PRIM_NR(opc) < tabsize) + { + table += PRIM_NR(opc); + { + TRACE_EVENT_P1( "sock_api_handles_primitive: %d", PRIM_NR(opc) ); + } + JUMP (table->func) (P2D(prim),api_instance); + } + else + { + TRACE_ERROR("PRIM_NR(opc) >= tabsize"); + return FALSE; + } + } + return TRUE; +} /* sock_api_handles_primitive */