Copy latest code to master
[ric-plt/e2.git] / RIC-E2-TERMINATION / sctpThread.h
index 2149cd3..588f6a8 100644 (file)
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
- */
+*/
 
 /*
  * This source code is part of the near-RT RIC (RAN Intelligent Controller)
  * platform project (RICP).
  */
 
-
 #ifndef X2_SCTP_THREAD_H
 #define X2_SCTP_THREAD_H
 
@@ -49,6 +48,8 @@
 #include <shared_mutex>
 #include <iterator>
 #include <map>
+#include <sys/inotify.h>
+#include <csignal>
 
 #include <rmr/rmr.h>
 #include <rmr/RIC_message_types.h>
 #include <boost/log/sources/global_logger_storage.hpp>
 #include <boost/log/utility/setup/file.hpp>
 #include <boost/log/utility/setup/common_attributes.hpp>
-
+#include <boost/filesystem.hpp>
 
 #include <mdclog/mdclog.h>
 
-#include "3rdparty/asn1cFiles/E2AP-PDU.h"
-#include <3rdparty/asn1cFiles/ProtocolIE-Container.h>
-#include "3rdparty/asn1cFiles/InitiatingMessage.h"
-#include "3rdparty/asn1cFiles/SuccessfulOutcome.h"
-#include "3rdparty/asn1cFiles/UnsuccessfulOutcome.h"
-#include "3rdparty/asn1cFiles/ProtocolIE-Container.h"
-#include "3rdparty/asn1cFiles/ProtocolIE-Field.h"
+#include "asn1cFiles/E2AP-PDU.h"
+#include "asn1cFiles/ProtocolIE-Container.h"
+#include "asn1cFiles/InitiatingMessage.h"
+#include "asn1cFiles/SuccessfulOutcome.h"
+#include "asn1cFiles/UnsuccessfulOutcome.h"
+#include "asn1cFiles/ProtocolIE-Container.h"
+#include "asn1cFiles/ProtocolIE-Field.h"
+
+#include "cxxopts.hpp"
+//#include "config-cpp/include/config-cpp/config-cpp.h"
 
 #ifdef __TRACING__
 #include "openTracing.h"
@@ -84,6 +88,8 @@
 
 #include "base64.h"
 
+#include "ReadConfigFile.h"
+
 using namespace std;
 namespace logging = boost::log;
 namespace src = boost::log::sources;
@@ -115,11 +121,20 @@ typedef struct sctp_params {
     uint16_t rmrPort = 0;
     int      epoll_fd = 0;
     int      rmrListenFd = 0;
+    int      inotifyFD = 0;
+    int      inotifyWD = 0;
     void     *rmrCtx = nullptr;
     Sctp_Map_t *sctpMap = nullptr;
+    char      ka_message[4096] {};
+    int       ka_message_length = 0;
     char       rmrAddress[256] {}; // "tcp:portnumber" "tcp:5566" listen to all address on port 5566
     mdclog_severity_t logLevel = MDCLOG_INFO;
     char volume[VOLUME_URL_SIZE];
+    string myIP {};
+    string fqdn {};
+    string configFilePath {};
+    string configFileName {};
+    bool trace = true;
     //shared_timed_mutex fence; // moved to mapWrapper
 } sctp_params_t;
 
@@ -136,11 +151,13 @@ typedef struct ConnectedCU {
 
 #define MAX_RMR_BUFF_ARRY 32
 typedef struct RmrMessagesBuffer {
-    void *rmrCtx;
-    rmr_mbuf_t *sendMessage;
-    rmr_mbuf_t *sendBufferedMessages[MAX_RMR_BUFF_ARRY];
-    rmr_mbuf_t *rcvMessage;
-    rmr_mbuf_t *rcvBufferedMessages[MAX_RMR_BUFF_ARRY];
+    char ka_message[4096] {};
+    int  ka_message_len = 0;
+    void *rmrCtx = nullptr;
+    rmr_mbuf_t *sendMessage= nullptr;
+    rmr_mbuf_t *sendBufferedMessages[MAX_RMR_BUFF_ARRY] {};
+    rmr_mbuf_t *rcvMessage= nullptr;
+    rmr_mbuf_t *rcvBufferedMessages[MAX_RMR_BUFF_ARRY] {};
 } RmrMessagesBuffer_t;
 
 typedef struct formatedMessage {
@@ -154,17 +171,38 @@ typedef struct formatedMessage {
 
 typedef struct ReportingMessages {
     FormatedMessage_t message;
-    int outLen;
+    long outLen;
     unsigned char base64Data[RECEIVE_SCTP_BUFFER_SIZE * 2];
     char buffer[RECEIVE_SCTP_BUFFER_SIZE * 8];
-    size_t bufferLen;
 } ReportingMessages_t;
 
+cxxopts::ParseResult parse(int argc, char *argv[], sctp_params_t &pSctpParams);
+
+int buildInotify(sctp_params_t &sctpParams);
+
+void handleTermInit(sctp_params_t &sctpParams);
+
+void handleConfigChange(sctp_params_t *sctpParams);
 
 void listener(sctp_params_t *params);
 
+void sendTermInit(sctp_params_t &sctpParams);
+
 int setSocketNoBlocking(int socket);
 
+void handleEinprogressMessages(struct epoll_event &event,
+                               ReportingMessages_t &message,
+                               RmrMessagesBuffer_t &rmrMessageBuffer,
+                               sctp_params_t *params,
+                               otSpan *pSpan);
+
+void handlepoll_error(struct epoll_event &event,
+                      ReportingMessages_t &message,
+                      RmrMessagesBuffer_t &rmrMessageBuffer,
+                      sctp_params_t *params,
+                      otSpan *pSpan);
+
+
 void cleanHashEntry(ConnectedCU_t *peerInfo, Sctp_Map_t *m, otSpan *pSpan);
 
 int getSetupRequestMetaData(ReportingMessages_t &message, char *data, char *host, uint16_t &port, otSpan *pSpan);
@@ -254,7 +292,7 @@ int receiveDataFromSctp(struct epoll_event *events,
  * @param pSpan
  * @return
  */
-void *getRmrContext(char *rmrAddress, otSpan *pSpan);
+void getRmrContext(sctp_params_t &pSctpParams, otSpan *pSpan);
 
 /**
  *
@@ -385,6 +423,12 @@ void buildJsonMessage(ReportingMessages_t &message);
  */
 string translateRmrErrorMessages(int state);
 
+
+static inline uint64_t rdtscp(uint32_t &aux) {
+    uint64_t rax,rdx;
+    asm volatile ("rdtscp\n" : "=a" (rax), "=d" (rdx), "=c" (aux) : :);
+    return (rdx << 32) + rax;
+}
 #ifndef RIC_SCTP_CONNECTION_FAILURE
 #define RIC_SCTP_CONNECTION_FAILURE  10080
 #endif