diff --git a/include/radio_ims_types.h b/include/radio_ims_types.h new file mode 100644 index 0000000..04a6787 --- /dev/null +++ b/include/radio_ims_types.h @@ -0,0 +1,123 @@ +/* + * Copyright (C) 2024 Jollyboys Ltd + * + * You may use this file under the terms of the BSD license as follows: + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the names of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation + * are those of the authors and should not be interpreted as representing + * any official policies, either expressed or implied. + */ + +#ifndef RADIO_IMS_TYPES_H +#define RADIO_IMS_TYPES_H + +#include + +G_BEGIN_DECLS + +#define RADIO_IMS_INTERFACE_MAX (RADIO_IMS_INTERFACE_COUNT - 1) + +#define RADIO_IMS_INSTANCE "default" +#define RADIO_IMS_IFACE_PREFIX "android.hardware.radio.ims." +#define RADIO_IMS_IFACE "IRadioIms" +#define RADIO_IMS_RESPONSE_IFACE "IRadioImsResponse" +#define RADIO_IMS_INDICATION_IFACE "IRadioImsIndication" +#define RADIO_IMS RADIO_IMS_IFACE_PREFIX RADIO_IMS_IFACE +#define RADIO_IMS_FQNAME RADIO_IMS "/" RADIO_IMS_INSTANCE +#define RADIO_IMS_RESPONSE RADIO_IMS_IFACE_PREFIX RADIO_IMS_RESPONSE_IFACE +#define RADIO_IMS_INDICATION RADIO_IMS_IFACE_PREFIX RADIO_IMS_INDICATION_IFACE + +/* Transaction codes */ + +/* c(req,resp,Name,CALL_NAME) */ +#define RADIO_IMS_CALL_1(c) \ + c(1,1,setSrvccCallInfo,SET_SRVCC_CALL_INFO) \ + c(2,2,updateImsRegistrationInfo,UPDATE_IMS_REGISTRATION_INFO) \ + c(3,3,startImsTraffic,START_IMS_TRAFFIC) \ + c(4,4,stopImsTraffic,STOP_IMS_TRAFFIC) \ + c(5,5,triggerEpsFallback,TRIGGER_EPS_FALLBACK) \ + c(7,6,sendAnbrQuery,SEND_ANBR_QUERY) \ + c(8,7,updateImsCallStatus,UPDATE_IMS_CALL_STATUS) \ + +/* i(code,Name,IND_NAME) */ +#define RADIO_IMS_IND_1(i) \ + i(1,onConnectionSetupFailure,ON_CONNECTION_SETUP_FAILURE) \ + i(2,notifyAnbr,NOTIFY_ANBR) \ + i(3,triggerImsDeregistration,TRIGGER_IMS_DEREGISTRATION) \ + +typedef enum radio_ims_req { + RADIO_IMS_REQ_ANY = 0, + RADIO_IMS_REQ_NONE = 0, +#define RADIO_IMS_REQ_(req,resp,Name,NAME) RADIO_IMS_REQ_##NAME = req, + + /* android.hardware.radio.ims.IRadioIms v1 */ + RADIO_IMS_CALL_1(RADIO_IMS_REQ_) + RADIO_IMS_REQ_SET_RESPONSE_FUNCTIONS = 6, /* setResponseFunctions */ + RADIO_IMS_1_REQ_LAST = RADIO_IMS_REQ_UPDATE_IMS_CALL_STATUS, + +#undef RADIO_IMS_REQ_ +} RADIO_IMS_REQ; +G_STATIC_ASSERT(sizeof(RADIO_IMS_REQ) == 4); + +typedef enum radio_ims_resp { + RADIO_IMS_RESP_ANY = 0, + RADIO_IMS_RESP_NONE = 0, +#define RADIO_IMS_RESP_(req,resp,Name,NAME) RADIO_IMS_RESP_##NAME = resp, + + /* android.hardware.radio.ims.IRadioImsResponse v1 */ + RADIO_IMS_CALL_1(RADIO_IMS_RESP_) + RADIO_IMS_1_RESP_LAST = RADIO_IMS_RESP_UPDATE_IMS_CALL_STATUS, + +#undef RADIO_IMS_RESP_ +} RADIO_IMS_RESP; +G_STATIC_ASSERT(sizeof(RADIO_IMS_RESP) == 4); + +typedef enum radio_ims_ind { + RADIO_IMS_IND_ANY = 0, + RADIO_IMS_IND_NONE = 0, +#define RADIO_IMS_IND_(code,Name,NAME) RADIO_IMS_IND_##NAME = code, + + /* android.hardware.radio.ims.IRadioImsIndication v1 */ + RADIO_IMS_IND_1(RADIO_IMS_IND_) + RADIO_IMS_1_IND_LAST = RADIO_IMS_IND_TRIGGER_IMS_DEREGISTRATION, + +#undef RADIO_IMS_IND_ +} RADIO_IMS_IND; +G_STATIC_ASSERT(sizeof(RADIO_IMS_IND) == 4); + +G_END_DECLS + +#endif /* RADIO_IMS_TYPES_H */ + +/* + * Local Variables: + * mode: C + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/include/radio_instance.h b/include/radio_instance.h index b999118..4610980 100644 --- a/include/radio_instance.h +++ b/include/radio_instance.h @@ -39,6 +39,7 @@ #include #include +#include #include #include #include diff --git a/include/radio_types.h b/include/radio_types.h index 3f4029f..3b98366 100644 --- a/include/radio_types.h +++ b/include/radio_types.h @@ -69,7 +69,7 @@ typedef enum radio_interface { typedef enum radio_aidl_interface { RADIO_AIDL_INTERFACE_NONE = -1, RADIO_DATA_INTERFACE, - // RADIO_IMS_INTERFACE, + RADIO_IMS_INTERFACE, RADIO_MESSAGING_INTERFACE, RADIO_MODEM_INTERFACE, RADIO_NETWORK_INTERFACE, diff --git a/src/radio_instance.c b/src/radio_instance.c index 4e1534a..73dcdae 100644 --- a/src/radio_instance.c +++ b/src/radio_instance.c @@ -185,6 +185,7 @@ G_STATIC_ASSERT(G_N_ELEMENTS(radio_interfaces) == RADIO_INTERFACE_COUNT); static const GBinderClientIfaceInfo radio_aidl_iface_info[] = { {RADIO_DATA, RADIO_DATA_1_REQ_LAST}, + {RADIO_IMS, RADIO_IMS_1_REQ_LAST}, {RADIO_MESSAGING, RADIO_MESSAGING_1_REQ_LAST}, {RADIO_MODEM, RADIO_MODEM_1_REQ_LAST}, {RADIO_NETWORK, RADIO_NETWORK_1_REQ_LAST}, @@ -202,6 +203,16 @@ static const char* const radio_data_response_ifaces[] = { NULL }; +static const char* const radio_ims_indication_ifaces[] = { + RADIO_IMS_INDICATION, + NULL +}; + +static const char* const radio_ims_response_ifaces[] = { + RADIO_IMS_RESPONSE, + NULL +}; + static const char* const radio_messaging_indication_ifaces[] = { RADIO_MESSAGING_INDICATION, NULL @@ -261,6 +272,14 @@ static const RadioInterfaceDesc radio_aidl_interfaces[] = { radio_data_response_ifaces, RADIO_DATA_REQ_SET_RESPONSE_FUNCTIONS, }, + { + RADIO_INTERFACE_NONE, + RADIO_IMS_INTERFACE, + RADIO_IMS, + radio_ims_indication_ifaces, + radio_ims_response_ifaces, + RADIO_IMS_REQ_SET_RESPONSE_FUNCTIONS, + }, { RADIO_INTERFACE_NONE, RADIO_MESSAGING_INTERFACE, @@ -408,6 +427,7 @@ radio_instance_indication( if (gutil_strv_contains((const GStrV*)radio_indication_ifaces, iface) || gutil_strv_contains((const GStrV*)radio_data_indication_ifaces, iface) + || gutil_strv_contains((const GStrV*)radio_ims_indication_ifaces, iface) || gutil_strv_contains((const GStrV*)radio_messaging_indication_ifaces, iface) || gutil_strv_contains((const GStrV*)radio_modem_indication_ifaces, iface) || gutil_strv_contains((const GStrV*)radio_network_indication_ifaces, iface) @@ -521,6 +541,13 @@ radio_instance_response( info = gbinder_reader_read_parcelable(&reader, &out_size); GASSERT(out_size >= sizeof(RadioResponseInfo)); } + } else if (gutil_strv_contains((const GStrV*)radio_ims_response_ifaces, iface)) { + { + /* RadioResponseInfo has the same fields/padding between HIDL and AIDL */ + gsize out_size; + info = gbinder_reader_read_parcelable(&reader, &out_size); + GASSERT(out_size >= sizeof(RadioResponseInfo)); + } } else if (gutil_strv_contains((const GStrV*)radio_messaging_response_ifaces, iface)) { if (code == RADIO_MESSAGING_RESP_ACKNOWLEDGE_REQUEST) { gbinder_reader_read_int32(&reader, &ack_serial); diff --git a/src/radio_util.c b/src/radio_util.c index e1f958b..c44abad 100644 --- a/src/radio_util.c +++ b/src/radio_util.c @@ -101,6 +101,16 @@ radio_req_name2( case RADIO_DATA_REQ_ANY: break; } + } else if (instance->interface_aidl == RADIO_IMS_INTERFACE) { + switch ((RADIO_IMS_REQ)req) { +#define RADIO_IMS_REQ_(req,resp,Name,NAME) \ + case RADIO_IMS_REQ_##NAME: return #Name; + RADIO_IMS_CALL_1(RADIO_IMS_REQ_) +#undef RADIO_IMS_REQ_ + case RADIO_IMS_REQ_SET_RESPONSE_FUNCTIONS: return "setResponseFunctions"; + case RADIO_IMS_REQ_ANY: + break; + } } else if (instance->interface_aidl == RADIO_MESSAGING_INTERFACE) { switch ((RADIO_MESSAGING_REQ)req) { #define RADIO_MESSAGING_REQ_(req,resp,Name,NAME) \ @@ -227,6 +237,15 @@ radio_resp_name2( case RADIO_DATA_RESP_ANY: break; } + } else if (instance->interface_aidl == RADIO_IMS_INTERFACE) { + switch ((RADIO_IMS_RESP)resp) { +#define RADIO_IMS_RESP_(req,resp,Name,NAME) \ + case RADIO_IMS_RESP_##NAME: return #Name "Response"; + RADIO_IMS_CALL_1(RADIO_IMS_RESP_) +#undef RADIO_IMS_RESP_ + case RADIO_IMS_RESP_ANY: + break; + } } else if (instance->interface_aidl == RADIO_MESSAGING_INTERFACE) { switch ((RADIO_MESSAGING_RESP)resp) { case RADIO_MESSAGING_RESP_ACKNOWLEDGE_REQUEST: return "acknowledgeRequest"; @@ -316,6 +335,15 @@ radio_ind_name2( case RADIO_DATA_IND_ANY: break; } + } else if (instance->interface_aidl == RADIO_IMS_INTERFACE) { + switch ((RADIO_IMS_IND)ind) { +#define RADIO_IMS_IND_(code,Name,NAME) \ + case RADIO_IMS_IND_##NAME: return #Name; + RADIO_IMS_IND_1(RADIO_IMS_IND_) +#undef RADIO_IMS_IND_ + case RADIO_IMS_IND_ANY: + break; + } } else if (instance->interface_aidl == RADIO_MESSAGING_INTERFACE) { switch ((RADIO_MESSAGING_IND)ind) { #define RADIO_MESSAGING_IND_(code,Name,NAME) \