2 * Copyright 2019 AT&T Intellectual Property
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
19 * This source code is part of the near-RT RIC (RAN Intelligent Controller)
20 * platform project (RICP).
23 #ifndef X2_SCTP_THREAD_H
24 #define X2_SCTP_THREAD_H
33 #include <sys/socket.h>
34 #include <arpa/inet.h>
35 #include <netinet/in_systm.h>
36 #include <netinet/in.h>
37 #include <netinet/ip.h>
38 #include <netinet/ip_icmp.h>
39 #include <netinet/sctp.h>
42 #include <sys/param.h>
46 #include <sys/epoll.h>
48 #include <shared_mutex>
51 #include <sys/inotify.h>
55 #include <rmr/RIC_message_types.h>
56 #include <mdclog/mdclog.h>
60 #include <boost/algorithm/string/predicate.hpp>
61 #include <boost/lexical_cast.hpp>
62 #include <boost/move/utility.hpp>
63 #include <boost/log/sources/logger.hpp>
64 #include <boost/log/sources/record_ostream.hpp>
65 #include <boost/log/sources/global_logger_storage.hpp>
66 #include <boost/log/utility/setup/file.hpp>
67 #include <boost/log/utility/setup/common_attributes.hpp>
68 #include <boost/filesystem.hpp>
70 #include <mdclog/mdclog.h>
72 #include "oranE2/E2AP-PDU.h"
73 #include "oranE2/ProtocolIE-Container.h"
74 #include "oranE2/InitiatingMessage.h"
75 #include "oranE2/SuccessfulOutcome.h"
76 #include "oranE2/UnsuccessfulOutcome.h"
77 #include "oranE2/ProtocolIE-Container.h"
78 #include "oranE2/ProtocolIE-Field.h"
79 #include "oranE2/GlobalE2node-gNB-ID.h"
80 #include "oranE2/GlobalE2node-en-gNB-ID.h"
81 #include "oranE2/GlobalE2node-ng-eNB-ID.h"
82 #include "oranE2/GlobalE2node-eNB-ID.h"
84 #include "cxxopts.hpp"
85 //#include "config-cpp/include/config-cpp/config-cpp.h"
88 #include "openTracing.h"
91 #include "mapWrapper.h"
95 #include "ReadConfigFile.h"
98 namespace logging = boost::log;
99 namespace src = boost::log::sources;
100 namespace keywords = boost::log::keywords;
101 namespace sinks = boost::log::sinks;
102 namespace posix_time = boost::posix_time;
103 namespace expr = boost::log::expressions;
105 #define SRC_PORT 36422
106 #define SA struct sockaddr
107 #define MAX_ENODB_NAME_SIZE 64
109 #define MAXEVENTS 128
111 #define RECEIVE_SCTP_BUFFER_SIZE (8*1024)
112 #define RECEIVE_XAPP_BUFFER_SIZE RECEIVE_SCTP_BUFFER_SIZE
114 typedef mapWrapper Sctp_Map_t;
117 typedef const std::unique_ptr<opentracing::Span> otSpan;
119 typedef const int otSpan;
122 #define VOLUME_URL_SIZE 256
124 typedef struct sctp_params {
125 uint16_t rmrPort = 0;
131 void *rmrCtx = nullptr;
132 Sctp_Map_t *sctpMap = nullptr;
133 char ka_message[4096] {};
134 int ka_message_length = 0;
135 char rmrAddress[256] {}; // "tcp:portnumber" "tcp:5566" listen to all address on port 5566
136 mdclog_severity_t logLevel = MDCLOG_INFO;
137 char volume[VOLUME_URL_SIZE];
141 string configFilePath {};
142 string configFileName {};
144 //shared_timed_mutex fence; // moved to mapWrapper
147 typedef struct ConnectedCU {
148 int fileDescriptor = 0;
149 char hostName[NI_MAXHOST] {};
150 char portNumber[NI_MAXSERV] {};
151 char enodbName[MAX_ENODB_NAME_SIZE] {};
152 char asnData[RECEIVE_SCTP_BUFFER_SIZE] {};
153 size_t asnLength = 0;
155 bool isConnected = false;
156 bool gotSetup = false;
157 sctp_params_t *sctpParams = nullptr;
160 #define MAX_RMR_BUFF_ARRY 32
161 typedef struct RmrMessagesBuffer {
162 char ka_message[4096] {};
163 int ka_message_len = 0;
164 void *rmrCtx = nullptr;
165 rmr_mbuf_t *sendMessage= nullptr;
166 rmr_mbuf_t *sendBufferedMessages[MAX_RMR_BUFF_ARRY] {};
167 rmr_mbuf_t *rcvMessage= nullptr;
168 rmr_mbuf_t *rcvBufferedMessages[MAX_RMR_BUFF_ARRY] {};
169 } RmrMessagesBuffer_t;
171 typedef struct formatedMessage {
172 char enodbName[MAX_ENODB_NAME_SIZE];
173 struct timespec time;
177 unsigned char *asndata;
180 typedef struct ReportingMessages {
181 FormatedMessage_t message {};
182 ConnectedCU_t *peerInfo = nullptr;
184 unsigned char base64Data[RECEIVE_SCTP_BUFFER_SIZE * 2] {};
185 char buffer[RECEIVE_SCTP_BUFFER_SIZE * 8] {};
186 } ReportingMessages_t;
188 cxxopts::ParseResult parse(int argc, char *argv[], sctp_params_t &pSctpParams);
190 int buildInotify(sctp_params_t &sctpParams);
192 void handleTermInit(sctp_params_t &sctpParams);
194 void handleConfigChange(sctp_params_t *sctpParams);
196 void listener(sctp_params_t *params);
198 void sendTermInit(sctp_params_t &sctpParams);
200 int setSocketNoBlocking(int socket);
202 void handleEinprogressMessages(struct epoll_event &event,
203 ReportingMessages_t &message,
204 RmrMessagesBuffer_t &rmrMessageBuffer,
205 sctp_params_t *params,
208 void handlepoll_error(struct epoll_event &event,
209 ReportingMessages_t &message,
210 RmrMessagesBuffer_t &rmrMessageBuffer,
211 sctp_params_t *params,
215 void cleanHashEntry(ConnectedCU_t *peerInfo, Sctp_Map_t *m, otSpan *pSpan);
217 int getSetupRequestMetaData(ReportingMessages_t &message, char *data, char *host, uint16_t &port, otSpan *pSpan);
222 * @param rmrMessageBuffer
225 void getRequestMetaData(ReportingMessages_t &message, RmrMessagesBuffer_t &rmrMessageBuffer, otSpan *pSpan);
230 * @param messagBuffer
232 * @param failedMesgId
236 int sendMessagetoCu(Sctp_Map_t *sctpMap,
237 RmrMessagesBuffer_t &messagBuffer,
238 ReportingMessages_t &message,
239 int failedMesgId, otSpan *pSpan);
241 void sendFailedSendingMessagetoXapp(RmrMessagesBuffer_t &rmrMessageBuffer,
242 ReportingMessages_t &message,
246 int sendRequestToXapp(ReportingMessages_t &message,
248 RmrMessagesBuffer_t &rmrMmessageBuffer,
256 * @param rmrMessageBuffer
262 int sendResponseToXapp(ReportingMessages_t &message,
265 RmrMessagesBuffer_t &rmrMessageBuffer,
278 int sendSctpMsg(ConnectedCU_t *peerInfo,
279 ReportingMessages_t &message,
287 * @param numOfMessages
288 * @param rmrMessageBuffer
293 int receiveDataFromSctp(struct epoll_event *events,
296 RmrMessagesBuffer_t &rmrMessageBuffer,
306 void getRmrContext(sctp_params_t &pSctpParams, otSpan *pSpan);
313 * @param messagBuffer
317 int receiveXappMessages(int epoll_fd,
319 RmrMessagesBuffer_t &rmrMessageBuffer,
325 * @param rmrMessageBuffer
332 int connectToCUandSetUp(RmrMessagesBuffer_t &rmrMessageBuffer,
333 ReportingMessages_t &message,
340 * @param messagBuffer
346 int sendDirectionalSctpMsg(RmrMessagesBuffer_t &messagBuffer,
347 ReportingMessages_t &message,
355 * @param rmrMessageBuffer
358 void asnInitiatingRequest(E2AP_PDU_t *pdu,
359 ReportingMessages_t &message,
360 RmrMessagesBuffer_t &rmrMessageBuffer,
367 * @param rmrMessageBuffer
370 void asnSuccsesfulMsg(E2AP_PDU_t *pdu,
371 ReportingMessages_t &message,
373 RmrMessagesBuffer_t &rmrMessageBuffer,
380 * @param rmrMessageBuffer
383 void asnUnSuccsesfulMsg(E2AP_PDU_t *pdu,
384 ReportingMessages_t &message,
386 RmrMessagesBuffer_t &rmrMessageBuffer,
391 * @param rmrMessageBuffer
396 int sendRmrMessage(RmrMessagesBuffer_t &rmrMessageBuffer, ReportingMessages_t &message, otSpan *pSpan);
406 * @returnsrc::logger_mt& lg = my_logger::get();
408 int addToEpoll(int epoll_fd, ConnectedCU_t *peerInfo, uint32_t events, Sctp_Map_t *sctpMap, char *enodbName, int msgType, otSpan *pSpan);
420 int modifyToEpoll(int epoll_fd, ConnectedCU_t *peerInfo, uint32_t events, Sctp_Map_t *sctpMap, char *enodbName, int msgType, otSpan *pSpan);
426 void buildJsonMessage(ReportingMessages_t &message);
434 string translateRmrErrorMessages(int state);
437 static inline uint64_t rdtscp(uint32_t &aux) {
439 asm volatile ("rdtscp\n" : "=a" (rax), "=d" (rdx), "=c" (aux) : :);
440 return (rdx << (unsigned)32) + rax;
442 #ifndef RIC_SCTP_CONNECTION_FAILURE
443 #define RIC_SCTP_CONNECTION_FAILURE 10080
446 #endif //X2_SCTP_THREAD_H