O-CU-UP
[scp/ocu/5gnr.git] / Include / vos_module.h
1 /******************************************************************************
2 ###############################################################################
3 #   Copyright (c) [2017-2020] [ICT/CAS]                                        #
4 #   Licensed under the ORAN Software License v1.0 (License)             #
5 ###############################################################################
6 ******************************************************************************/
7
8
9 #ifndef __VOS_MODULE_H__ 
10 #define __VOS_MODULE_H__
11
12 #include "vos_types.h"
13 #include "vos_timer.h"
14 #include "vos_que.h"
15 #include "vos_socket.h"
16
17
18
19 /** 模块名大小 */
20 #define MODULE_NAME_LEN (48)
21
22
23 /** 模块类型 */
24 typedef enum module_type_e{
25     VOS_MOD_T_NORMAL = 0,       ///< 一般模块
26     VOS_MOD_T_HOST,             ///< host task
27     VOS_MOD_T_USER,             ///< user task
28     VOS_MOD_T_EXTERN,           ///< 外部模块 (不是 vos app 中的模块,其他的进程 )
29     VOS_MOD_T_MAX,              ///< 
30 }module_type_t;
31
32 /** 模块通信类型 */
33 typedef enum module_comm_type_e{
34     VOS_MOD_COMM_T_VOS              = (1 << 0),     ///< vos 模块间通信
35     VOS_MOD_COMM_T_UNIX_UDP_C       = (1 << 1),     ///< unix socket udp client
36     VOS_MOD_COMM_T_UNIX_UDP_S       = (1 << 2),     ///< unix socket udp server
37     VOS_MOD_COMM_T_UNIX_TCP_C       = (1 << 3),     ///< unix socket tcp client
38     VOS_MOD_COMM_T_UNIX_TCP_S       = (1 << 4),     ///< unix socket tcp server
39     VOS_MOD_COMM_T_UDP_C            = (1 << 5),     ///< udp client
40     VOS_MOD_COMM_T_UDP_S            = (1 << 6),     ///< udp server
41     VOS_MOD_COMM_T_TCP_C            = (1 << 7),     ///< tcp client
42     VOS_MOD_COMM_T_TCP_S            = (1 << 8),     ///< tcp server
43     VOS_MOD_COMM_T_SCTP_ONE2ONE_C   = (1 << 9),     ///< sctp one2one client
44     VOS_MOD_COMM_T_SCTP_ONE2ONE_S   = (1 << 10),    ///< sctp one2one server
45     VOS_MOD_COMM_T_SCTP_ONE2MANY_C  = (1 << 11),    ///< sctp one2many client
46     VOS_MOD_COMM_T_SCTP_ONE2MANY_S  = (1 << 12),    ///< sctp one2many server
47     VOS_MOD_COMM_T_SOCK_OP          = (1 << 13),    ///< socket
48     VOS_MOD_COMM_T_MAX,                             ///< max
49 }module_comm_type_t;
50
51
52 /** 模块管理类型 */
53 typedef struct vos_module_s{
54     module_type_t       modType;                      ///< 模块类型
55     LONG                commType;                     ///< 当前的通信类型
56     ULONG               moduleID;                     ///< 模块ID 
57     CHAR                name[MODULE_NAME_LEN];        ///< 模块名 
58     ULONG               queueID;                      ///< 模块消息队列,用于接收从其他模块发送过来的消息 
59     LONG                paraCount;                    ///< 无需关心,         (添加的额外参数个数)
60     void                *pPara;                       ///< 无需关心,         (vos_mod_com_para_cb_t)
61     LONG                paraLock;                     ///< 无需关心,
62 }vos_module_t;
63
64
65 /** 采用非VOS通信方式的模块需要提供的handle函数,用于接收数据
66 *   buf         用于消息接收的缓冲区
67 *   size        buf 大小
68 *   opval       额外信息,类型为 vos_mod_com_op_t 
69 *   opvalLen    opval的大小
70 *   
71 */
72 typedef LONG (*receive_handler)(VOID *buf,LONG size,VOID *opval,LONG opvalLen);
73
74
75 /** 
76  * 模块注册 API 
77  * 向VOS 模块管理中注册模块 。
78  * @param[in ]   name         模块名,大小为 MODULE_NAME_LEN
79  * @param[in]    module       模块管理信息
80  *                               传入值
81  *                                      module.queueID  用于模块间通信
82  *                                      module.mod_type 模块类型
83  * @param[out]   module       模块管理信息
84  *                               传出值
85  *                                      module.name
86  *                                      module.moduleID
87  * @return       VOS_OK - 成功,其他 - 失败
88  */ 
89 LONG VOS_module_register(const CHAR *name,vos_module_t *module);
90
91
92 /** 
93  * 模块注销 API 
94  * 向VOS 模块管理中注册模块 。
95  * @param[in ]   name         模块名,大小为 MODULE_NAME_LEN
96  * @return       VOS_OK - 成功,其他 - 失败
97  */ 
98 LONG VOS_module_deregister(const CHAR *name);
99
100
101 /** 
102  * 根据模块ID获得模块名 
103  * @param[in ]   id         模块ID
104  * @param[out]   name       模块名,大小为 MODULE_NAME_LEN
105  * @return       VOS_OK - 成功,其他 - 失败
106  */ 
107 LONG VOS_module_get_name(ULONG id,CHAR name[MODULE_NAME_LEN]);
108
109 /** 
110  * 根据模块名获得模块ID 
111  * @param[in ]   name       模块名,大小为 MODULE_NAME_LEN
112  * @return       成功返回模块ID,失败返回 0
113  */ 
114 ULONG VOS_module_get_Id(CHAR *name);
115
116
117 /** 
118  * 向某个模块发送异步消息 
119  * @param[in ]   dst_slot           目的槽位号
120  * @param[in ]   dst_moduleName     目的模块名,大小为 MODULE_NAME_LEN
121  * @param[in ]   src_moduleName     源模块名,大小为 MODULE_NAME_LEN
122  * @param[in ]   msgCode            消息码
123  * @param[in ]   msgData            消息数据
124  * @param[in ]   msgDataLen         消息数据长度
125  * @return       成功返回 VOS_OK,失败返回 其他
126  */ 
127 LONG VOS_SendAsynMsg2Module(LONG dst_slot,CHAR dst_moduleName[MODULE_NAME_LEN],CHAR src_moduleName[MODULE_NAME_LEN],
128                                     LONG msgCode,VOID *msgData,LONG msgDataLen);
129
130 /** 
131  * 向某个模块发送同步消息 
132  * @param[in ]   dst_slot           目的槽位号
133  * @param[in ]   dst_moduleName     目的模块名,大小为 MODULE_NAME_LEN
134  * @param[in ]   src_moduleName     源模块名,大小为 MODULE_NAME_LEN
135  * @param[in ]   msgCode            消息码
136  * @param[in ]   msgData            消息数据,如果没有则填 NULL
137  * @param[in ]   msgDataLen         消息数据长度,如果msgData 为NULL 填0
138  * @param[out]   ackData            接收返回数据的buf
139  * @param[in ]   ackDataLen         输入:接收返回数据buf的长度
140  * @param[out]   ackDataLen         输出:buf的有效长度
141  * @param[in ]   timeout            等待接收的时间,单位毫秒,调用者自行判断需要等待时间,一般等待 5秒
142  * @return       成功返回 VOS_OK,失败返回 其他
143  */ 
144 LONG VOS_SendSynMsg2Module(LONG dst_slot,CHAR dst_moduleName[MODULE_NAME_LEN],CHAR src_moduleName[MODULE_NAME_LEN],
145                                   LONG msgCode,VOID *msgData,LONG msgDataLen,VOID *ackData,LONG *ackDataLen,LONG timeout);
146
147
148
149 /** 
150  * 向某个模块发送异步消息,支持非VOS通信方式 
151  * @param[in ]   dst_slot           目的槽位号
152  * @param[in ]   dst_moduleName     目的模块名,大小为 MODULE_NAME_LEN
153  * @param[in ]   src_moduleName     源模块名,大小为 MODULE_NAME_LEN
154  * @param[in ]   msgCode            消息码
155  * @param[in ]   msgData            消息数据
156  * @param[in ]   msgDataLen         消息数据长度
157  * @param[in ]   commType           通信方式
158  * @param[in ]   optval             可选参数,不需要则填NULL
159  * @param[in ]   optlen             可选参数长度
160  * @return       成功返回 VOS_OK,失败返回 其他
161  */ 
162 LONG VOS_SendAsynMsg2ModuleEx(LONG dst_slot,CHAR dst_moduleName[MODULE_NAME_LEN],CHAR src_moduleName[MODULE_NAME_LEN],
163                                       LONG msgCode,VOID *msgData,LONG msgDataLen,
164                                       module_comm_type_t commType,VOID *optval,LONG optlen);
165
166
167 /** 
168  * 向某个模块发送同步消息,仅支持VOS通信方式 
169  * @param[in ]   dst_slot           目的槽位号
170  * @param[in ]   dst_moduleName     目的模块名,大小为 MODULE_NAME_LEN
171  * @param[in ]   src_moduleName     源模块名,大小为 MODULE_NAME_LEN
172  * @param[in ]   msgCode            消息码
173  * @param[in ]   msgData            消息数据,如果没有则填 NULL
174  * @param[in ]   msgDataLen         消息数据长度,如果msgData 为NULL 填0
175  * @param[out]   ackData            接收返回数据的buf
176  * @param[in ]   ackDataLen         输入:接收返回数据buf的长度
177  * @param[out]   ackDataLen         输出:buf的有效长度
178  * @param[in ]   timeout            等待接收的时间,单位毫秒,调用者自行判断需要等待时间,一般等待 5秒
179  * @param[in ]   commType           通信方式
180  * @param[in ]   optval             可选参数,不需要则填NULL
181  * @param[in ]   optlen             可选参数长度
182  * @return       成功返回 VOS_OK,失败返回 其他
183  */ 
184 LONG VOS_SendSynMsg2ModuleEx(LONG dst_slot,CHAR dst_moduleName[MODULE_NAME_LEN],CHAR src_moduleName[MODULE_NAME_LEN],
185                                     LONG msgCode,VOID *msgData,LONG msgDataLen,VOID *ackData,LONG *ackDataLen,LONG timeout,
186                                     module_comm_type_t commType,VOID *optval,LONG optlen);
187
188 LONG VOS_SendAsynMsg2Module_Raw(LONG dst_slot,CHAR dst_moduleName[MODULE_NAME_LEN],CHAR src_moduleName[MODULE_NAME_LEN],
189                                     ULONG aulMsg[VOS_QUEUE_MSG_SIZE]);
190
191
192
193 /** 
194 * 回复同步消息 
195 * @param[in ]   aulMsg             VOS_QueReceive 收到的原始消息
196 * @param[in ]   ackData            返回数据的buf
197 * @param[in ]   ackDataLen         返回数据buf的长度
198 * @return       成功返回 VOS_OK,失败返回 其他
199 */ 
200 LONG VOS_SendSynAckMsg(ULONG aulMsg[VOS_QUEUE_MSG_SIZE],VOID *ackData,LONG ackDataLen);
201
202
203 /** 
204 * 注册timer 消息 
205 * @param[in ]   module_ID        要注册timer msg的模块号
206 * @param[in ]   msg_code         消息码
207 * @param[in ]   interval         发送间隔,毫秒
208 * @param[in ]   type             类型,循环或者只执行一次
209 * @param[in ]   pArg             附加参数,一般为一个指针
210 * @return       成功返回 VOS_OK,失败返回 其他
211 */ 
212 LONG VOS_RegTimerMsg(LONG module_ID,LONG msg_code,LONG interval,VOS_TIMER_TYPE_EN type,VOID  *pArg);
213
214
215 /** 
216 * 注销timer 消息 
217 * @param[in ]   module_ID        要注销timer msg的模块号
218 * @param[in ]   msg_code         消息码
219 * @return       成功返回 VOS_OK,失败返回 其他
220 */ 
221 LONG VOS_DeregTimerMsg(LONG module_ID,LONG msg_code);
222
223
224 /** 从原始消息中获取消息类型 (同步/异步) */
225 #define VOS_MOD_MSG_GET_EVENT_TYPE(aulMsg)       aulMsg[0]
226
227 /** 从原始消息中获取消息类码 */
228 #define VOS_MOD_MSG_GET_CODE(aulMsg)         ((SYS_MSG_S *)(aulMsg[3]))->usMsgCode
229
230
231 /** 从原始消息中获取源模块号 */
232 #define VOS_MOD_MSG_GET_SRC_ID(aulMsg)       ((SYS_MSG_S *)(aulMsg[3]))->ulSrcModuleID
233
234
235 /** 从原始消息中获取目的模块号 */
236 #define VOS_MOD_MSG_GET_DST_ID(aulMsg)       ((SYS_MSG_S *)(aulMsg[3]))->ulDstModuleID
237
238
239 /** 从原始消息中获取源槽位号 */
240 #define VOS_MOD_MSG_GET_SRC_SLOT(aulMsg)     ((SYS_MSG_S *)(aulMsg[3]))->ulSrcSlotID
241
242
243 /** 从原始消息中获取目的槽位号 */
244 #define VOS_MOD_MSG_GET_DST_SLOT(aulMsg)     ((SYS_MSG_S *)(aulMsg[3]))->ulDstSlotID
245
246
247 /** 从原始消息中获取消息长度 */
248 #define VOS_MOD_MSG_GET_LEN(aulMsg)        ((SYS_MSG_S *)(aulMsg[3]))->usFrameLen
249
250 /** 从原始消息中获取消息buf 的指针 */
251 #define VOS_MOD_MSG_GET_DATAPTR(aulMsg)    ((SYS_MSG_S *)(aulMsg[3]))->ptrMsgBody
252
253 /** 从原始消息中拷贝消息到dst中 */
254 #define VOS_MOD_MSG_GET_DATA(dst,aulMsg)   if( NULL != VOS_MOD_MSG_GET_DATAPTR(aulMsg) )                                                 \
255                                            {  VOS_MemCpy(dst,VOS_MOD_MSG_GET_DATAPTR(aulMsg),VOS_MOD_MSG_GET_LEN(aulMsg));  }           \
256                                            else                                                                                         \
257                                            {  VOS_ASSERT(0);   }
258
259 /** 释放原始消息中的sys msg */
260 #define VOS_MOD_MSG_FREE(aulMsg)           VOS_Free((VOID *)aulMsg[3])
261
262
263 /** msg handler的函数原型 */
264 typedef LONG(*VOS_msg_code_handler_ptr)(ULONG aulMsg[VOS_QUEUE_MSG_SIZE]);
265
266
267 /** 用于模块间通信的code 和 handler的map */
268 typedef struct msg_code_handle_map_s
269 {
270     LONG                     msg_code;   ///< 消息码 
271     VOS_msg_code_handler_ptr handler;    ///< 消息码的处理函数
272 }VOS_msg_code_handle_map_t;
273
274
275
276 #endif /* __VOS_MODULE_H__ */