blob: 15950f76d53bb7d777d13bebb58224489f34ad51 [file] [log] [blame]
anjana_sreekumar@infosys.com991c2062020-01-08 11:42:57 +05301/*
2 * Copyright (c) 2019, Infosys Ltd.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <interfaces/mmeIpcInterface.h>
18#include <blockingCircularFifo.h>
19#include <ipcTypes.h>
20#include <tipcSocket.h>
21#include <tipcTypes.h>
22#include <msgBuffer.h>
23#include <mme_app.h>
24#include <msgHandlers/gtpMsgHandler.h>
25#include <msgHandlers/s1MsgHandler.h>
26#include <msgHandlers/s6MsgHandler.h>
27
28extern "C" {
29 #include "log.h"
30}
31
32using namespace cmn::ipc;
33using namespace cmn::utils;
34
35extern BlockingCircularFifo<MsgBuffer, fifoQSize_c> mmeIpcEgressFifo_g;
36
37MmeIpcInterface::MmeIpcInterface():sender_mp(), reader_mp()
38{
39
40}
41
42MmeIpcInterface::~MmeIpcInterface()
43{
44 teardown();
45}
46
47bool MmeIpcInterface::setup()
48{
49
50 // INIT socket for receiving ipc message
51 TipcSocket* receiver_sock = new TipcSocket();
52
53 IpcAddress myAddress;
54 myAddress.u32 = mmeAppInstanceNum_c;
55
56 if (receiver_sock->bindTipcSocket(myAddress) == false)
57 {
58 log_msg(LOG_ERROR, "MmeIpcInterface Setup Failed!!!\n");
59
60 delete receiver_sock;
61
62 return false;
63 }
64
65 // INIT socket for sending ipc message
66 TipcSocket* sender_sock = new TipcSocket();
67
68 sender_mp = sender_sock;
69 reader_mp = receiver_sock;
70
71 return true;
72}
73
74void MmeIpcInterface::teardown()
75{
76 if (sender_mp != NULL)
77 delete sender_mp;
78
79 if (reader_mp != NULL)
80 delete reader_mp;
81}
82
83cmn::ipc::IpcChannel* MmeIpcInterface::sender()
84{
85 if (sender_mp != NULL)
86 return sender_mp;
87 else
88 return NULL;
89}
90
91cmn::ipc::IpcChannel* MmeIpcInterface::reader()
92{
93 if (reader_mp != NULL)
94 return reader_mp;
95 else
96 return NULL;
97}
98
99void MmeIpcInterface::handleIpcMsg(MsgBuffer* msgBuf)
100{
101 uint32_t srcAddr, destAddr;
102
103 msgBuf->readUint32(destAddr);
104 msgBuf->readUint32(srcAddr);
105
106 log_msg(LOG_INFO, "IPC Message from src %u to dest %u\n", srcAddr, destAddr);
107
108 switch (srcAddr)
109
110 {
111 case TipcInstanceTypes::s1apAppInstanceNum_c:
112 S1MsgHandler::Instance()->handleS1Message_v(msgBuf);
113 break;
114 case TipcInstanceTypes::s11AppInstanceNum_c:
115 GtpMsgHandler::Instance()->handleGtpMessage_v(msgBuf);
116 break;
117 case TipcInstanceTypes::s6AppInstanceNum_c:
118 S6MsgHandler::Instance()->handleS6Message_v(msgBuf);
119 break;
120 default:
121 log_msg(LOG_INFO, "IPC Message from unsupported instance\n");
122 }
123}
124
125bool MmeIpcInterface::dispatchIpcMsg(char* buf, uint32_t len, cmn::ipc::IpcAddress& destAddr)
126{
127 cmn::ipc::IpcMsgHeader msgHeader;
128 msgHeader.srcAddr.u32 = TipcInstanceTypes::mmeAppInstanceNum_c;
129 msgHeader.destAddr.u32 = destAddr.u32;
130
131 MsgBuffer *msgBuf = new MsgBuffer(len + sizeof(cmn::ipc::IpcMsgHeader));
132 msgBuf->writeUint32(msgHeader.destAddr.u32);
133 msgBuf->writeUint32(msgHeader.srcAddr.u32);
134 msgBuf->writeBytes((uint8_t*)buf, len);
135
136 log_msg(LOG_INFO, "Dispatch IPC msg\n");
137
138 return mmeIpcEgressFifo_g.push(msgBuf);
139}
140
141bool MmeIpcInterface::dispatchIpcMsg(cmn::utils::MsgBuffer* msgBuf, cmn::ipc::IpcAddress& destAddr)
142{
143 cmn::ipc::IpcMsgHeader msgHeader;
144 msgHeader.srcAddr.u32 = TipcInstanceTypes::mmeAppInstanceNum_c;
145 msgHeader.destAddr.u32 = destAddr.u32;
146
147 msgBuf->rewind();
148 msgBuf->writeUint32(msgHeader.destAddr.u32, false);
149 msgBuf->writeUint32(msgHeader.srcAddr.u32, false);
150
151 return mmeIpcEgressFifo_g.push(msgBuf);
152}
153