/* * Copyright (c) 2017 The Linux Foundation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 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. * * Neither the name of The Linux Foundation 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 "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 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. * * Changes from Qualcomm Innovation Center are provided under the following license: * * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted (subject to the limitations in the * disclaimer below) provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * 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. * * * Neither the name of Qualcomm Innovation Center, Inc. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE * GRANTED BY THIS LICENSE. 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 HOLDER 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 */ #include #include #include #include #include #include #include "HeaderInsertion.h" #include "TestsUtils.h" #define LOG_IOCTL_RETURN_VALUE(nRetVal) \ printf("%s()- %s\n", __func__, \ (-1 == nRetVal) ? "Fail" : "Success"); bool HeaderInsertion::AddHeader(struct ipa_ioc_add_hdr *pHeaderTableToAdd) { int nRetVal = 0; /*call the Driver ioctl in order to add header*/ nRetVal = ioctl(m_fd, IPA_IOC_ADD_HDR, pHeaderTableToAdd); LOG_IOCTL_RETURN_VALUE(nRetVal); return (-1 != nRetVal); } bool HeaderInsertion::addHeaderHpc(const string& name, uint8_t* header, const size_t headerLen, bool isPartial, enum ipa_client_type ipaClient){ if(name.empty() || name.size() >= IPA_RESOURCE_NAME_MAX){ return false; } int fd = open(CONFIGURATION_NODE_PATH, O_RDONLY); if (fd < 0) { cout << "failed to open " << CONFIGURATION_NODE_PATH << endl; return false; } struct ipa_ioc_add_hdr *iocH = static_cast(calloc(1, sizeof(*iocH) + sizeof(struct ipa_hdr_add))); if(!iocH){ return false; } iocH->commit = 1; iocH->num_hdrs = 1; struct ipa_hdr_add *h = &iocH->hdr[0]; strlcpy(h->name, name.c_str(), IPA_RESOURCE_NAME_MAX); memcpy(h->hdr, header, headerLen); h->hdr_len = headerLen; h->hdr_hdl = -1; h->status = -1; h->is_partial = isPartial; cout << "h->name=" << h->name << ", h->is_partial=" << h->is_partial << endl; int result = ioctl(fd, IPA_TEST_IOC_ADD_HDR_HPC, iocH); if(result || h->status){ free(iocH); close(fd); return false; } cout << "result=" << result << ", status=" << h->status << ", ipaClient=" << ipaClient << endl; struct ipa_pkt_init_ex_hdr_ofst_set lookup; lookup.ep = ipaClient; strlcpy(lookup.name, name.c_str(), IPA_RESOURCE_NAME_MAX); result = ioctl(fd, IPA_TEST_IOC_PKT_INIT_EX_SET_HDR_OFST , &lookup); if (result) { free(iocH); close(fd); return false; } free(iocH); close(fd); return true; } bool HeaderInsertion::DeleteHeader(struct ipa_ioc_del_hdr *pHeaderTableToDelete) { int nRetVal = 0; /*call the Driver ioctl in order to remove header*/ nRetVal = ioctl(m_fd, IPA_IOC_DEL_HDR , pHeaderTableToDelete); LOG_IOCTL_RETURN_VALUE(nRetVal); return (-1 != nRetVal); } bool HeaderInsertion::DeleteHeader(const string& name){ if(name.empty() || name.size() >= IPA_RESOURCE_NAME_MAX){ return false; } int hdl = GetHeaderHandle(name); if(hdl == -1){ return false; } struct ipa_ioc_del_hdr *iocD = static_cast(calloc(1, sizeof(*iocD) + sizeof(struct ipa_hdr_del))); if(!iocD){ return false; } iocD->commit = 1; iocD->num_hdls = 1; struct ipa_hdr_del *h = &iocD->hdl[0]; h->hdl = hdl; h->status = -1; cout << "h->hdl=" << h->hdl << endl; if(!DeleteHeader(iocD)){ free(iocD); return false; } free(iocD); return true; } bool HeaderInsertion::AddProcCtx(struct ipa_ioc_add_hdr_proc_ctx *procCtxTable) { int retval = 0; retval = ioctl(m_fd, IPA_IOC_ADD_HDR_PROC_CTX, procCtxTable); if (retval) { printf("%s(), failed adding ProcCtx rule table %p\n", __FUNCTION__, procCtxTable); return false; } printf("%s(), Added ProcCtx rule to table %p\n", __FUNCTION__, procCtxTable); return true; } bool HeaderInsertion::DeleteProcCtx(struct ipa_ioc_del_hdr_proc_ctx *procCtxTable) { int retval = 0; retval = ioctl(m_fd, IPA_IOC_DEL_HDR_PROC_CTX, procCtxTable); if (retval) { printf("%s(), failed deleting ProcCtx rule in table %p\n", __FUNCTION__, procCtxTable); return false; } printf("%s(), Deleted ProcCtx rule in table %p\n", __FUNCTION__, procCtxTable); return true; } bool HeaderInsertion::Commit() { int nRetVal = 0; nRetVal = ioctl(m_fd, IPA_IOC_COMMIT_HDR); LOG_IOCTL_RETURN_VALUE(nRetVal); return true; } bool HeaderInsertion::Reset() { int nRetVal = 0; nRetVal = ioctl(m_fd, IPA_IOC_RESET_HDR); nRetVal |= ioctl(m_fd, IPA_IOC_COMMIT_HDR); LOG_IOCTL_RETURN_VALUE(nRetVal); return true; } bool HeaderInsertion::GetHeaderHandle(struct ipa_ioc_get_hdr *pHeaderStruct) { int retval = 0; if (!DeviceNodeIsOpened()) return false; retval = ioctl(m_fd, IPA_IOC_GET_HDR, pHeaderStruct); if (retval) { printf( "%s(), IPA_IOC_GET_HDR ioctl failed, routingTable =0x%p, retval=0x%x.\n" , __func__, pHeaderStruct, retval); return false; } printf( "%s(), IPA_IOC_GET_HDR ioctl issued to IPA header insertion block.\n", __func__); return true; } int HeaderInsertion::GetHeaderHandle(const string& name){ if(name.empty() || name.size() >= IPA_RESOURCE_NAME_MAX){ return false; } struct ipa_ioc_get_hdr retHeader; memset(&retHeader, 0, sizeof(retHeader)); strlcpy(retHeader.name, name.c_str(), IPA_RESOURCE_NAME_MAX); retHeader.hdl = -1; printf("retHeader.name=%s\n", retHeader.name); if(!GetHeaderHandle(&retHeader)){ cout << "GetHeaderHandle(&retHeader) Failed" << endl; return -1; } cout << "retHeader.hdl=" << retHeader.hdl << endl; return retHeader.hdl; } bool HeaderInsertion::CopyHeader(struct ipa_ioc_copy_hdr *pCopyHeaderStruct) { int retval = 0; if (!DeviceNodeIsOpened()) return false; retval = ioctl(m_fd, IPA_IOC_COPY_HDR, pCopyHeaderStruct); if (retval) { printf( "%s(), IPA_IOC_COPY_HDR ioctl failed, retval=0x%x.\n", __func__, retval); return false; } printf( "%s(), IPA_IOC_COPY_HDR ioctl issued to IPA header insertion block.\n", __func__); return true; }