From ccdc09c82415391c2096bb34cc79e30f457346a6 Mon Sep 17 00:00:00 2001
From: Rohit Gupta <rohit.gupta@eurecom.fr>
Date: Thu, 18 Jan 2018 14:08:19 +0100
Subject: [PATCH] final pieces for SLDCH emulation

---
 openair1/PHY/LTE_TRANSPORT/defs.h  |  5 ++++-
 openair1/PHY/LTE_TRANSPORT/sldch.c | 25 ++++++++++++++++++++++++-
 openair2/RRC/LITE/proto.h          |  2 +-
 targets/RT/USER/lte-ue.c           | 23 +++++++++++++++++++++++
 4 files changed, 52 insertions(+), 3 deletions(-)

diff --git a/openair1/PHY/LTE_TRANSPORT/defs.h b/openair1/PHY/LTE_TRANSPORT/defs.h
index f3db52b18e..a13ccb20e6 100644
--- a/openair1/PHY/LTE_TRANSPORT/defs.h
+++ b/openair1/PHY/LTE_TRANSPORT/defs.h
@@ -937,7 +937,10 @@ typedef struct {
 } SLSCH_t;
 
 typedef struct {
-
+  /// payload length 
+  int payload_length;
+  /// pointer to payload
+  uint8_t *payload;
 } SLDCH_t;
 
 #define TTI_SYNC 0
diff --git a/openair1/PHY/LTE_TRANSPORT/sldch.c b/openair1/PHY/LTE_TRANSPORT/sldch.c
index a06fed05de..c14a1b87a9 100644
--- a/openair1/PHY/LTE_TRANSPORT/sldch.c
+++ b/openair1/PHY/LTE_TRANSPORT/sldch.c
@@ -36,8 +36,31 @@
 
 void generate_sldch(PHY_VARS_UE *ue,SLDCH_t *sldch,int frame_tx,int subframe_tx) {
 
-  AssertFatal(1==0,"Should get here yet for UE %d\n",ue->Mod_id);
+  UE_tport_t pdu;
+  size_t sldch_header_len = sizeof(UE_tport_header_t);
+
+  pdu.header.packet_type = SLDCH;
+  pdu.header.absSF = (frame_tx*10)+subframe_tx;
+
+  memcpy((void*)&pdu.sldch,(void*)sldch,sizeof(SLDCH_t)-sizeof(uint8_t*));
+
+  AssertFatal(sldch->payload_length <=1500-sldch_header_len - sizeof(SLDCH_t) + sizeof(uint8_t*),
+                "SLDCH payload length > %d\n",
+                1500-sldch_header_len - sizeof(SLDCH_t) + sizeof(uint8_t*));
+  memcpy((void*)&pdu.payload[0],
+         (void*)sldch->payload,
+         sldch->payload_length);
+
+  LOG_I(PHY,"SLDCH configuration %d bytes, TBS payload %d bytes => %d bytes\n",
+        sizeof(SLDCH_t)-sizeof(uint8_t*),
+        sldch->payload_length,
+        sldch_header_len+sizeof(SLDCH_t)-sizeof(uint8_t*)+sldch->payload_length);
+
+  multicast_link_write_sock(0,
+                            &pdu,
+                            sldch_header_len+sizeof(SLDCH_t)-sizeof(uint8_t*)+sldch->payload_length);
 
 }
 
+
 #endif
diff --git a/openair2/RRC/LITE/proto.h b/openair2/RRC/LITE/proto.h
index 684ecc5d28..98acfa7fbd 100644
--- a/openair2/RRC/LITE/proto.h
+++ b/openair2/RRC/LITE/proto.h
@@ -363,7 +363,7 @@ SL_DiscConfig_r12_t rrc_eNB_get_sidelink_discTXPool(
 /** \brief Process request from control socket
  *  \param arg
  */
-static void *rrc_control_socket_thread_fct(void *arg);
+void *rrc_control_socket_thread_fct(void *arg);
 
 //L2_interface.c
 int8_t
diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c
index ec7a5f2461..af39b5bdb6 100644
--- a/targets/RT/USER/lte-ue.c
+++ b/targets/RT/USER/lte-ue.c
@@ -762,6 +762,7 @@ void ue_stub_rx_handler(unsigned int num_bytes, char *rx_buffer) {
 
   UE_tport_t *pdu = (UE_tport_t*)rx_buffer;
   SLSCH_t *slsch = (SLSCH_t*)&pdu->slsch;
+  SLDCH_t *sldch = (SLDCH_t*)&pdu->sldch;
 
   switch (((UE_tport_header_t*)rx_buffer)->packet_type) {
   case TTI_SYNC:
@@ -788,6 +789,28 @@ void ue_stub_rx_handler(unsigned int num_bytes, char *rx_buffer) {
 		   0,
 		   SL_DISCOVERY_FLAG_NO);
     break;
+
+  case SLDCH:
+
+
+    LOG_I(PHY,"Emulator SFN.SF %d.%d, Got SLDCH packet\n",emulator_absSF/10,emulator_absSF%10);
+    LOG_I(PHY,"Received %d bytes on UE-UE link for SFN.SF %d.%d, sending SLDCH payload (%d bytes) to MAC\n",num_bytes,
+          pdu->header.absSF/10,pdu->header.absSF%10,
+          sldch->payload_length);
+    printf("SLDCH:");
+    for (int i=0;i<sizeof(SLDCH_t);i++) printf("%x ",((uint8_t*)sldch)[i]);
+    printf("\n");
+
+    ue_send_sl_sdu(0,
+                   0,
+                   pdu->header.absSF/10,
+                   pdu->header.absSF%10,
+                   pdu->payload,
+                   sldch->payload_length,
+                   0,
+                   SL_DISCOVERY_FLAG_YES);
+    break;
+
   }
 }
 
-- 
2.26.2