Add reserved queue support for QNX
[ipc/ipcdev.git] / qnx / src / ipc3x_dev / ti / syslink / ipc / hlos / knl / Qnx / messageq_devctl.c
1 /*
2  *  @file   messageq_devctl.c
3  *
4  *  @brief      OS-specific implementation of Messageq driver for Qnx
5  *
6  *
7  *  ============================================================================
8  *
9  *  Copyright (c) 2013-2015, Texas Instruments Incorporated
10  *
11  *  Redistribution and use in source and binary forms, with or without
12  *  modification, are permitted provided that the following conditions
13  *  are met:
14  *
15  *  *  Redistributions of source code must retain the above copyright
16  *     notice, this list of conditions and the following disclaimer.
17  *
18  *  *  Redistributions in binary form must reproduce the above copyright
19  *     notice, this list of conditions and the following disclaimer in the
20  *     documentation and/or other materials provided with the distribution.
21  *
22  *  *  Neither the name of Texas Instruments Incorporated nor the names of
23  *     its contributors may be used to endorse or promote products derived
24  *     from this software without specific prior written permission.
25  *
26  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
27  *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
28  *  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29  *  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
30  *  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31  *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
32  *  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
33  *  OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
34  *  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
35  *  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
36  *  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37  *  Contact information for paper mail:
38  *  Texas Instruments
39  *  Post Office Box 655303
40  *  Dallas, Texas 75265
41  *  Contact information:
42  *  http://www-k.ext.ti.com/sc/technical-support/product-information-centers.htm?
43  *  DCMP=TIHomeTracking&HQS=Other+OT+home_d_contact
44  *  ============================================================================
45  *
46  */
49 /* Standard headers */
50 #include <ti/syslink/Std.h>
52 /* OSAL & Utils headers */
53 #include <ti/syslink/utils/List.h>
54 #include <ti/syslink/utils/Trace.h>
55 #include <ti/syslink/utils/Memory.h>
57 /* QNX specific header include */
58 #include <ti/syslink/build/Qnx/resmgr/proto.h>
59 #include <ti/syslink/build/Qnx/resmgr/dcmd_syslink.h>
61 /* Module specific header files */
62 #include <ti/ipc/MessageQ.h>
63 #include <ti/syslink/inc/MessageQDrvDefs.h>
65 /* Function prototypes */
66 int ipc_messageq_getconfig(resmgr_context_t *ctp, io_devctl_t *msg,
67     ipc_ocb_t *ocb);
68 int ipc_messageq_setup(resmgr_context_t *ctp, io_devctl_t *msg,
69     ipc_ocb_t *ocb);
70 int ipc_messageq_destroy(resmgr_context_t *ctp, io_devctl_t *msg,
71     ipc_ocb_t *ocb);
72 int ipc_messageq_create(resmgr_context_t *ctp, io_devctl_t *msg,
73     ipc_ocb_t *ocb);
74 int ipc_messageq_delete(resmgr_context_t *ctp, io_devctl_t *msg,
75     ipc_ocb_t *ocb);
77 /**
78  * Handler for devctl() messages for messageQ module.
79  *
80  * Handles special devctl() messages that we export for control.
81  *
82  * \param ctp   Thread's associated context information.
83  * \param msg   The actual devctl() message.
84  * \param ocb   OCB associated with client's session.
85  *
86  * \return POSIX errno value.
87  *
88  * \retval EOK      Success.
89  * \retval ENOTSUP  Unsupported devctl().
90  */
91 int ipc_messageq_devctl(resmgr_context_t *ctp, io_devctl_t *msg,
92     ipc_ocb_t *ocb)
93 {
94     switch (msg->i.dcmd)
95     {
96           case DCMD_MESSAGEQ_CREATE:
97           {
98                 return ipc_messageq_create( ctp, msg, ocb);
99           }
100           break;
102           case DCMD_MESSAGEQ_DELETE:
103           {
104                 return ipc_messageq_delete( ctp, msg, ocb);
105           }
106           break;
108           case DCMD_MESSAGEQ_GETCONFIG:
109           {
110                 return ipc_messageq_getconfig( ctp, msg, ocb);
111           }
112           break;
114           case DCMD_MESSAGEQ_SETUP:
115           {
116                 return ipc_messageq_setup( ctp, msg, ocb);
117           }
118           break;
120           case DCMD_MESSAGEQ_DESTROY:
121           {
122                 return ipc_messageq_destroy( ctp, msg, ocb);
123           }
124           break;
126      default:
127         fprintf( stderr, "Invalid DEVCTL for messageQ 0x%x \n", msg->i.dcmd);
128         break;
130     }
132     return (_RESMGR_PTR(ctp, &msg->o, sizeof(msg->o) +
133         sizeof(MessageQDrv_CmdArgs)));
136 /**
137  * Handler for messageq create API.
138  *
139  * \param ctp   Thread's associated context information.
140  * \param msg   The actual devctl() message.
141  * \param ocb   OCB associated with client's session.
142  *
143  * \return POSIX errno value.
144  *
145  * \retval EOK      Success.
146  * \retval ENOTSUP  Unsupported devctl().
147  */
148 int ipc_messageq_create(resmgr_context_t *ctp, io_devctl_t *msg,
149     ipc_ocb_t *ocb)
151     MessageQDrv_CmdArgs *       cargs = (MessageQDrv_CmdArgs *)
152         (_DEVCTL_DATA (msg->i));
153     MessageQDrv_CmdArgs *       out   = (MessageQDrv_CmdArgs *)
154         (_DEVCTL_DATA (msg->o));
155     MessageQ_Params *local_createparams = NULL;
156     String local_createname = NULL;
158     out->apiStatus = MessageQ_S_SUCCESS;
160     if (cargs->args.create.params) {
161         local_createparams = (MessageQ_Params *)(cargs+1);
162         if (cargs->args.create.name)
163             local_createname = (String)(local_createparams+1);
164     }
165     else {
166         if (cargs->args.create.name)
167             local_createname = (String)(cargs+1);
168     }
170     out->args.create.handle = MessageQ_create(local_createname,
171         local_createparams);
172     GT_assert (curTrace, (out->args.create.handle != NULL));
174     /* Set failure status if create has failed. */
175     if (out->args.create.handle == NULL) {
176         out->apiStatus = MessageQ_E_FAIL;
177     }
178     else {
179         out->apiStatus = MessageQ_S_SUCCESS;
180     }
182     if (out->args.create.handle != NULL) {
183         out->args.create.queueId = MessageQ_getQueueId(out->args.create.handle);
184         /*
185          * TODO: Need to implement cleanup of queues for processes that departed
186          */
187         /* MessageQ_setQueueOwner(out->args.create.handle,clientPID[clientId])*/
188     }
190     SETIOV(&ctp->iov[0], &msg->o, sizeof(msg->o) +
191         sizeof(MessageQDrv_CmdArgs));
192     return _RESMGR_NPARTS(1);
195 /**
196  * Handler for messageq delete API.
197  *
198  * \param ctp   Thread's associated context information.
199  * \param msg   The actual devctl() message.
200  * \param ocb   OCB associated with client's session.
201  *
202  * \return POSIX errno value.
203  *
204  * \retval EOK      Success.
205  * \retval ENOTSUP  Unsupported devctl().
206  */
207 int ipc_messageq_delete(resmgr_context_t *ctp, io_devctl_t *msg,
208     ipc_ocb_t *ocb)
210     MessageQDrv_CmdArgs * cargs = (MessageQDrv_CmdArgs *)
211         (_DEVCTL_DATA (msg->i));
212     MessageQDrv_CmdArgs * out  = (MessageQDrv_CmdArgs *)(_DEVCTL_DATA (msg->o));
214     out->apiStatus = MessageQ_delete ((MessageQ_Handle *)
215         &(cargs->args.deleteMessageQ.handle));
216     GT_assert (curTrace, (out->apiStatus >= 0));
218     return (_RESMGR_PTR (ctp, &msg->o, sizeof(msg->o) +
219         sizeof(MessageQDrv_CmdArgs)));
222 /**
223  * Handler for messageq getconfig API.
224  *
225  * \param ctp   Thread's associated context information.
226  * \param msg   The actual devctl() message.
227  * \param ocb   OCB associated with client's session.
228  *
229  * \return POSIX errno value.
230  *
231  * \retval EOK      Success.
232  * \retval ENOTSUP  Unsupported devctl().
233  */
234 int ipc_messageq_getconfig(resmgr_context_t *ctp, io_devctl_t *msg,
235     ipc_ocb_t *ocb)
237     MessageQDrv_CmdArgs * cargs = (MessageQDrv_CmdArgs *)
238         (_DEVCTL_DATA (msg->i));
239     MessageQ_Config local_config;
240     MessageQ_getConfig (&local_config);
242     cargs->apiStatus = MessageQ_S_SUCCESS;
243     SETIOV(&ctp->iov[0], &msg->o, sizeof(msg->o) +
244         sizeof(MessageQDrv_CmdArgs));
245     SETIOV(&ctp->iov[1], &local_config, sizeof(MessageQ_Config));
247     return _RESMGR_NPARTS(2);
251 /**
252  * Handler for messageq setup API.
253  *
254  * \param ctp   Thread's associated context information.
255  * \param msg   The actual devctl() message.
256  * \param ocb   OCB associated with client's session.
257  *
258  * \return POSIX errno value.
259  *
260  * \retval EOK      Success.
261  * \retval ENOTSUP  Unsupported devctl().
262  */
263 int ipc_messageq_setup(resmgr_context_t *ctp, io_devctl_t *msg,
264     ipc_ocb_t *ocb)
266     MessageQDrv_CmdArgs * cargs = (MessageQDrv_CmdArgs *)
267         (_DEVCTL_DATA (msg->i));
268     MessageQDrv_CmdArgs * out  = (MessageQDrv_CmdArgs *)(_DEVCTL_DATA (msg->o));
270     MessageQ_Config *     local_setupconfig;
271     local_setupconfig = (MessageQ_Config *)(cargs+1);
273     out->apiStatus = MessageQ_setup (local_setupconfig);
274     out->args.setup.nameServerHandle  = MessageQ_getNameServerHandle();
276     GT_assert (curTrace, (out->apiStatus  >= 0));
277     GT_assert (curTrace, (out->args.setup.nameServerHandle  != NULL));
279     SETIOV(&ctp->iov[0], &msg->o, sizeof(msg->o) +
280         sizeof(MessageQDrv_CmdArgs));
282     return _RESMGR_NPARTS(1);
286 /**
287  * Handler for messageq destroy API.
288  *
289  * \param ctp   Thread's associated context information.
290  * \param msg   The actual devctl() message.
291  * \param ocb   OCB associated with client's session.
292  *
293  * \return POSIX errno value.
294  *
295  * \retval EOK      Success.
296  * \retval ENOTSUP  Unsupported devctl().
297  */
298 int ipc_messageq_destroy(resmgr_context_t *ctp, io_devctl_t *msg,
299     ipc_ocb_t *ocb)
301     MessageQDrv_CmdArgs * out = (MessageQDrv_CmdArgs *)(_DEVCTL_DATA (msg->o));
303     out->apiStatus = MessageQ_destroy();
304     GT_assert(curTrace, (out->apiStatus  >= 0));
306     return (_RESMGR_PTR (ctp, &msg->o, sizeof(msg->o) +
307         sizeof(MessageQDrv_CmdArgs)));