Lte design documentation updated default tip
authorDanilo Abrignani <danilo.abrignani@unibo.it>
Sat, 22 Aug 2015 10:20:11 +0200
changeset 11429 df8a67f98887
parent 11428 9ef3e1c4d703
Lte design documentation updated
src/core/model/make-event.h
src/core/model/simulator.h
src/lte/doc/Makefile
src/lte/doc/source/figures/CarrierAggregationDownlinkDataPlane.seqdiag
src/lte/doc/source/figures/CarrierAggregationUlTxOpportunity.seqdiag
src/lte/doc/source/figures/lte-arch-enb-data-carrier-aggregation.dia
src/lte/doc/source/figures/lte-class-net-phy-relation.dia
src/lte/doc/source/figures/setupRadioBearerCarrierAggregation.seqdiag
src/lte/doc/source/lte-design.rst
--- a/src/core/model/make-event.h	Sat Aug 22 01:27:44 2015 +0200
+++ b/src/core/model/make-event.h	Sat Aug 22 10:20:11 2015 +0200
@@ -144,6 +144,32 @@
           typename T1, typename T2, typename T3, typename T4, typename T5>
 EventImpl * MakeEvent (MEM mem_ptr, OBJ obj,
                        T1 a1, T2 a2, T3 a3, T4 a4, T5 a5);
+
+/**
+ * \copybrief MakeEvent(MEM,OBJ)
+ * \tparam MEM The class method function signature.
+ * \tparam OBJ The class type holding the method.
+ * \tparam T1 Type of the first argument to the underlying function.
+ * \tparam T2 Type of the second argument to the underlying function.
+ * \tparam T3 Type of the third argument to the underlying function.
+ * \tparam T4 Type of the fourth argument to the underlying function.
+ * \tparam T5 Type of the fifth argument to the underlying function.
+ * \tparam T6 Type of the sixth argument to the underlying function.
+ * \param mem_ptr Class method member function pointer
+ * \param obj Class instance.
+ * \param a1 First argument value to be bound to the underlying function.
+ * \param a2 Second argument value to be bound to the underlying function.
+ * \param a3 Third argument value to be bound to the underlying function.
+ * \param a4 Fourth argument value to be bound to the underlying function.
+ * \param a5 Fifth argument value to be bound to the underlying function.
+ * \param a6 Sixth argument value to be bound to the underlying function.
+ * \returns The constructed EventImpl.
+ */
+template <typename MEM, typename OBJ,
+          typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
+EventImpl * MakeEvent (MEM mem_ptr, OBJ obj,
+                       T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6);
+
 /**@}*/
   
 /**
@@ -253,6 +279,32 @@
 template <typename U1, typename U2, typename U3, typename U4, typename U5,
           typename T1, typename T2, typename T3, typename T4, typename T5>
 EventImpl * MakeEvent (void (*f)(U1,U2,U3,U4,U5), T1 a1, T2 a2, T3 a3, T4 a4, T5 a5);
+
+/**
+ * \copybrief MakeEvent(void(*f)(void))
+ * \tparam U1 Formal type of the first argument to the function.
+ * \tparam U2 Formal type of the second argument to the function.
+ * \tparam U3 Formal type of the third argument to the function.
+ * \tparam U4 Formal type of the fourth argument to the function.
+ * \tparam U5 Formal type of the fifth argument to the function.
+ * \tparam T1 Actual type of the first argument to the function.
+ * \tparam T2 Actual type of the second argument to the function.
+ * \tparam T3 Actual type of the third argument to the function.
+ * \tparam T4 Actual type of the fourth argument to the function.
+ * \tparam T5 Actual type of the fifth argument to the function.
+ * \tparam T6 Actual type of the sixth argument to the function.
+ * \param f The function pointer.
+ * \param a1 First argument to be bound to the function.
+ * \param a2 Second argument to be bound to the function.
+ * \param a3 Third argument to be bound to the function.
+ * \param a4 Fourth argument to be bound to the function.
+ * \param a5 Fifth argument to be bound to the function.
+ * \param a6 Sixth argument to be bound to the function.
+ * \returns The constructed EventImpl.
+ */
+template <typename U1, typename U2, typename U3, typename U4, typename U5, typename U6,
+          typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
+EventImpl * MakeEvent (void (*f)(U1,U2,U3,U4,U5,U6), T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6);
 /**@}*/
 
 } // namespace ns3
@@ -500,6 +552,47 @@
   return ev;
 }
 
+template <typename MEM, typename OBJ,
+          typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
+EventImpl * MakeEvent (MEM mem_ptr, OBJ obj,
+                       T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6)
+{
+  // six argument version
+  class EventMemberImpl6 : public EventImpl
+  {
+public:
+    EventMemberImpl6 (OBJ obj, MEM function, T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6)
+      : m_obj (obj),
+        m_function (function),
+        m_a1 (a1),
+        m_a2 (a2),
+        m_a3 (a3),
+        m_a4 (a4),
+        m_a5 (a5),
+        m_a6 (a6)
+    {
+    }
+protected:
+    virtual ~EventMemberImpl6 ()
+    {
+    }
+private:
+    virtual void Notify (void)
+    {
+      (EventMemberImplObjTraits<OBJ>::GetReference (m_obj).*m_function)(m_a1, m_a2, m_a3, m_a4, m_a5, m_a6);
+    }
+    OBJ m_obj;
+    MEM m_function;
+    typename TypeTraits<T1>::ReferencedType m_a1;
+    typename TypeTraits<T2>::ReferencedType m_a2;
+    typename TypeTraits<T3>::ReferencedType m_a3;
+    typename TypeTraits<T4>::ReferencedType m_a4;
+    typename TypeTraits<T5>::ReferencedType m_a5;
+    typename TypeTraits<T6>::ReferencedType m_a6;
+  } *ev = new EventMemberImpl6 (obj, mem_ptr, a1, a2, a3, a4, a5, a6);
+  return ev;
+}
+
 template <typename U1, typename T1>
 EventImpl * MakeEvent (void (*f)(U1), T1 a1)
 {
@@ -668,6 +761,46 @@
   return ev;
 }
 
+template <typename U1, typename U2, typename U3, typename U4, typename U5, typename U6,
+          typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
+EventImpl * MakeEvent (void (*f)(U1,U2,U3,U4,U5,U6), T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6)
+{
+  // six arg version
+  class EventFunctionImpl6 : public EventImpl
+  {
+public:
+    typedef void (*F)(U1,U2,U3,U4,U5,U6);
+
+    EventFunctionImpl6 (F function, T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6)
+      : m_function (function),
+        m_a1 (a1),
+        m_a2 (a2),
+        m_a3 (a3),
+        m_a4 (a4),
+        m_a5 (a5),
+        m_a6 (a6)
+    {
+    }
+protected:
+    virtual ~EventFunctionImpl6 ()
+    {
+    }
+private:
+    virtual void Notify (void)
+    {
+      (*m_function)(m_a1, m_a2, m_a3, m_a4, m_a5, m_a6);
+    }
+    F m_function;
+    typename TypeTraits<T1>::ReferencedType m_a1;
+    typename TypeTraits<T2>::ReferencedType m_a2;
+    typename TypeTraits<T3>::ReferencedType m_a3;
+    typename TypeTraits<T4>::ReferencedType m_a4;
+    typename TypeTraits<T5>::ReferencedType m_a5;
+    typename TypeTraits<T6>::ReferencedType m_a6;
+  } *ev = new EventFunctionImpl6 (f, a1, a2, a3, a4, a5, a6);
+  return ev;
+}
+
 } // namespace ns3
 
 #endif /* MAKE_EVENT_H */
--- a/src/core/model/simulator.h	Sat Aug 22 01:27:44 2015 +0200
+++ b/src/core/model/simulator.h	Sat Aug 22 10:20:11 2015 +0200
@@ -62,7 +62,7 @@
  * expire first.
  * 
  * A simple example of how to use the Simulator class to schedule events
- * is shown in sample-simulator.cc:
+ * is shown in sample-simulator.cc ::
  * \include src/core/examples/sample-simulator.cc
  *
  * \todo Define what the simulation or event context means.
@@ -211,6 +211,24 @@
             typename T1, typename T2, typename T3, typename T4, typename T5>
   static EventId Schedule (Time const &time, MEM mem_ptr, OBJ obj, 
                            T1 a1, T2 a2, T3 a3, T4 a4, T5 a5);
+
+  /**
+   * @param time the relative expiration time of the event.
+   * @param mem_ptr member method pointer to invoke
+   * @param obj the object on which to invoke the member method
+   * @param a1 the first argument to pass to the invoked method
+   * @param a2 the second argument to pass to the invoked method
+   * @param a3 the third argument to pass to the invoked method
+   * @param a4 the fourth argument to pass to the invoked method
+   * @param a5 the fifth argument to pass to the invoked method
+   * @param a6 the sixth argument to pass to the invoked method
+   * @returns an id for the scheduled event.
+   */
+  template <typename MEM, typename OBJ, 
+            typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
+  static EventId Schedule (Time const &time, MEM mem_ptr, OBJ obj, 
+                           T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6);
+
   /**
    * @param time the relative expiration time of the event.
    * @param f the function to invoke
@@ -275,6 +293,21 @@
             typename T1, typename T2, typename T3, typename T4, typename T5>
   static EventId Schedule (Time const &time, void (*f)(U1,U2,U3,U4,U5), T1 a1, T2 a2, T3 a3, T4 a4, T5 a5);
 
+  /**
+   * @param time the relative expiration time of the event.
+   * @param f the function to invoke
+   * @param a1 the first argument to pass to the function to invoke
+   * @param a2 the second argument to pass to the function to invoke
+   * @param a3 the third argument to pass to the function to invoke
+   * @param a4 the fourth argument to pass to the function to invoke
+   * @param a5 the fifth argument to pass to the function to invoke
+   * @param a6 the sixth argument to pass to the function to invoke
+   * @returns an id for the scheduled event.
+   */
+  template <typename U1, typename U2, typename U3, typename U4, typename U5, typename U6,
+            typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
+  static EventId Schedule (Time const &time, void (*f)(U1,U2,U3,U4,U5,U6), T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6);
+
   /** @} */
 
   /**
@@ -369,6 +402,26 @@
             typename T1, typename T2, typename T3, typename T4, typename T5>
   static void ScheduleWithContext (uint32_t context, Time const &time, MEM mem_ptr, OBJ obj, 
                                    T1 a1, T2 a2, T3 a3, T4 a4, T5 a5);
+
+  /**
+   * This method is thread-safe: it can be called from any thread.
+   *
+   * @param time the relative expiration time of the event.
+   * @param context user-specified context parameter
+   * @param mem_ptr member method pointer to invoke
+   * @param obj the object on which to invoke the member method
+   * @param a1 the first argument to pass to the invoked method
+   * @param a2 the second argument to pass to the invoked method
+   * @param a3 the third argument to pass to the invoked method
+   * @param a4 the fourth argument to pass to the invoked method
+   * @param a5 the fifth argument to pass to the invoked method
+   * @param a6 the sixth argument to pass to the invoked method
+   */
+  template <typename MEM, typename OBJ, 
+            typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
+  static void ScheduleWithContext (uint32_t context, Time const &time, MEM mem_ptr, OBJ obj, 
+                                   T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6);
+
   /**
    * This method is thread-safe: it can be called from any thread.
    *
@@ -445,6 +498,23 @@
             typename T1, typename T2, typename T3, typename T4, typename T5>
   static void ScheduleWithContext (uint32_t context, Time const &time, void (*f)(U1,U2,U3,U4,U5), T1 a1, T2 a2, T3 a3, T4 a4, T5 a5);
 
+  /**
+   * This method is thread-safe: it can be called from any thread.
+   *
+   * @param time the relative expiration time of the event.
+   * @param context user-specified context parameter
+   * @param f the function to invoke
+   * @param a1 the first argument to pass to the function to invoke
+   * @param a2 the second argument to pass to the function to invoke
+   * @param a3 the third argument to pass to the function to invoke
+   * @param a4 the fourth argument to pass to the function to invoke
+   * @param a5 the fifth argument to pass to the function to invoke
+   * @param a6 the sixth argument to pass to the function to invoke
+   */
+  template <typename U1, typename U2, typename U3, typename U4, typename U5, typename U6,
+            typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
+  static void ScheduleWithContext (uint32_t context, Time const &time, void (*f)(U1,U2,U3,U4,U5,U6), T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6);
+
   /** @} */
   
   /**
@@ -523,6 +593,23 @@
             typename T1, typename T2, typename T3, typename T4, typename T5>
   static EventId ScheduleNow (MEM mem_ptr, OBJ obj, 
                               T1 a1, T2 a2, T3 a3, T4 a4, T5 a5);
+
+  /**
+   * @param mem_ptr member method pointer to invoke
+   * @param obj the object on which to invoke the member method
+   * @param a1 the first argument to pass to the invoked method
+   * @param a2 the second argument to pass to the invoked method
+   * @param a3 the third argument to pass to the invoked method
+   * @param a4 the fourth argument to pass to the invoked method
+   * @param a5 the fifth argument to pass to the invoked method
+   * @param a6 the sixth argument to pass to the invoked method
+   * @return The EventId of the scheduled event.
+   */
+  template <typename MEM, typename OBJ, 
+            typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
+  static EventId ScheduleNow (MEM mem_ptr, OBJ obj, 
+                              T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6);
+
   /**
    * @param f the function to invoke
    * @return The EventId of the scheduled event.
@@ -584,6 +671,20 @@
             typename T1, typename T2, typename T3, typename T4, typename T5>
   static EventId ScheduleNow (void (*f)(U1,U2,U3,U4,U5), T1 a1, T2 a2, T3 a3, T4 a4, T5 a5);
 
+  /**
+   * @param f the function to invoke
+   * @param a1 the first argument to pass to the function to invoke
+   * @param a2 the second argument to pass to the function to invoke
+   * @param a3 the third argument to pass to the function to invoke
+   * @param a4 the fourth argument to pass to the function to invoke
+   * @param a5 the fifth argument to pass to the function to invoke
+   * @param a6 the sixth argument to pass to the function to invoke
+   * @return The EventId of the scheduled event.
+   */
+  template <typename U1, typename U2, typename U3, typename U4, typename U5, typename U6,
+            typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
+  static EventId ScheduleNow (void (*f)(U1,U2,U3,U4,U5,U6), T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6);
+
   /** @} */
 
   /**
@@ -663,6 +764,23 @@
             typename T1, typename T2, typename T3, typename T4, typename T5>
   static EventId ScheduleDestroy (MEM mem_ptr, OBJ obj, 
                                   T1 a1, T2 a2, T3 a3, T4 a4, T5 a5);
+
+  /**
+   * @param mem_ptr member method pointer to invoke
+   * @param obj the object on which to invoke the member method
+   * @param a1 the first argument to pass to the invoked method
+   * @param a2 the second argument to pass to the invoked method
+   * @param a3 the third argument to pass to the invoked method
+   * @param a4 the fourth argument to pass to the invoked method
+   * @param a5 the fifth argument to pass to the invoked method
+   * @param a6 the sixth argument to pass to the invoked method
+   * @return The EventId of the scheduled event.
+   */
+  template <typename MEM, typename OBJ, 
+            typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
+  static EventId ScheduleDestroy (MEM mem_ptr, OBJ obj, 
+                                  T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6);
+
   /**
    * @param f the function to invoke
    * @return The EventId of the scheduled event.
@@ -724,6 +842,20 @@
             typename T1, typename T2, typename T3, typename T4, typename T5>
   static EventId ScheduleDestroy (void (*f)(U1,U2,U3,U4,U5), T1 a1, T2 a2, T3 a3, T4 a4, T5 a5);
 
+  /**
+   * @param f the function to invoke
+   * @param a1 the first argument to pass to the function to invoke
+   * @param a2 the second argument to pass to the function to invoke
+   * @param a3 the third argument to pass to the function to invoke
+   * @param a4 the fourth argument to pass to the function to invoke
+   * @param a5 the fifth argument to pass to the function to invoke
+   * @param a6 the sixth argument to pass to the function to invoke
+   * @return The EventId of the scheduled event.
+   */
+  template <typename U1, typename U2, typename U3, typename U4, typename U5, typename U6,
+            typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
+  static EventId ScheduleDestroy (void (*f)(U1,U2,U3,U4,U5,U6), T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6);
+
   /** @} */
 
   /** \copydoc SimulatorImpl::Remove */
@@ -858,6 +990,14 @@
   return DoSchedule (time, MakeEvent (mem_ptr, obj, a1, a2, a3, a4, a5));
 }
 
+template <typename MEM, typename OBJ, 
+          typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
+EventId Simulator::Schedule (Time const &time, MEM mem_ptr, OBJ obj, 
+                             T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6) 
+{
+  return DoSchedule (time, MakeEvent (mem_ptr, obj, a1, a2, a3, a4, a5, a6));
+}
+
 template <typename U1, typename T1>
 EventId Simulator::Schedule (Time const &time, void (*f)(U1), T1 a1)
 {
@@ -892,6 +1032,12 @@
   return DoSchedule (time, MakeEvent (f, a1, a2, a3, a4, a5));
 }
 
+template <typename U1, typename U2, typename U3, typename U4, typename U5, typename U6,
+          typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
+EventId Simulator::Schedule (Time const &time, void (*f)(U1,U2,U3,U4,U5,U6), T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6)
+{
+  return DoSchedule (time, MakeEvent (f, a1, a2, a3, a4, a5, a6));
+}
 
 
 
@@ -938,6 +1084,14 @@
   return ScheduleWithContext (context, time, MakeEvent (mem_ptr, obj, a1, a2, a3, a4, a5));
 }
 
+template <typename MEM, typename OBJ,
+          typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
+void Simulator::ScheduleWithContext (uint32_t context, Time const &time, MEM mem_ptr, OBJ obj,
+                                     T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6)
+{
+  return ScheduleWithContext (context, time, MakeEvent (mem_ptr, obj, a1, a2, a3, a4, a5, a6));
+}
+
 template <typename U1, typename T1>
 void Simulator::ScheduleWithContext (uint32_t context, Time const &time, void (*f)(U1), T1 a1)
 {
@@ -972,7 +1126,12 @@
   return ScheduleWithContext (context, time, MakeEvent (f, a1, a2, a3, a4, a5));
 }
 
-
+template <typename U1, typename U2, typename U3, typename U4, typename U5, typename U6,
+          typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
+void Simulator::ScheduleWithContext (uint32_t context, Time const &time, void (*f)(U1,U2,U3,U4,U5,U6), T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6)
+{
+  return ScheduleWithContext (context, time, MakeEvent (f, a1, a2, a3, a4, a5, a6));
+}
 
 
 template <typename MEM, typename OBJ>
@@ -1024,6 +1183,15 @@
   return DoScheduleNow (MakeEvent (mem_ptr, obj, a1, a2, a3, a4, a5));
 }
 
+template <typename MEM, typename OBJ, 
+          typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
+EventId
+Simulator::ScheduleNow (MEM mem_ptr, OBJ obj, 
+                        T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6) 
+{
+  return DoScheduleNow (MakeEvent (mem_ptr, obj, a1, a2, a3, a4, a5, a6));
+}
+
 template <typename U1,
           typename T1>
 EventId
@@ -1064,6 +1232,14 @@
   return DoScheduleNow (MakeEvent (f, a1, a2, a3, a4, a5));
 }
 
+template <typename U1, typename U2, typename U3, typename U4, typename U5, typename U6,
+          typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
+EventId
+Simulator::ScheduleNow (void (*f)(U1,U2,U3,U4,U5,U6), T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6)
+{
+  return DoScheduleNow (MakeEvent (f, a1, a2, a3, a4, a5, a6));
+}
+
 
 
 template <typename MEM, typename OBJ>
@@ -1115,6 +1291,15 @@
   return DoScheduleDestroy (MakeEvent (mem_ptr, obj, a1, a2, a3, a4, a5));
 }
 
+template <typename MEM, typename OBJ, 
+          typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
+EventId
+Simulator::ScheduleDestroy (MEM mem_ptr, OBJ obj, 
+                            T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6) 
+{
+  return DoScheduleDestroy (MakeEvent (mem_ptr, obj, a1, a2, a3, a4, a5, a6));
+}
+
 template <typename U1,
           typename T1>
 EventId
@@ -1155,6 +1340,14 @@
   return DoScheduleDestroy (MakeEvent (f, a1, a2, a3, a4, a5));
 }
 
+template <typename U1, typename U2, typename U3, typename U4, typename U5, typename U6,
+          typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
+EventId
+Simulator::ScheduleDestroy (void (*f)(U1,U2,U3,U4,U5,U6), T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6)
+{
+  return DoScheduleDestroy (MakeEvent (f, a1, a2, a3, a4, a5, a6));
+}
+
 } // namespace ns3
 
 #endif /* SIMULATOR_H */
--- a/src/lte/doc/Makefile	Sat Aug 22 01:27:44 2015 +0200
+++ b/src/lte/doc/Makefile	Sat Aug 22 10:20:11 2015 +0200
@@ -59,7 +59,11 @@
 	$(FIGURES)/lte-class-net-phy-relation.dia \
 	$(FIGURES)/lte-ca-enable-procedure.dia \
 	$(FIGURES)/lte-arch-enb-ctrl-rrc-phy.dia \
-	$(FIGURES)/lte-ccs-arch.dia
+	$(FIGURES)/lte-ccs-arch.dia \
+	$(FIGURES)/lte-arch-ue-data-carrier-aggregation.dia \
+	$(FIGURES)/lte-arch-ue-ctrl-carrier-aggregationh.dia \
+	$(FIGURES)/lte-arch-enb-data-carrier-aggregation.dia \
+	$(FIGURES)/lte-arch-enb-ctrl-carrier-aggregationh.dia
 
 # specify eps figures from which .png and .pdf figures need to be built
 
@@ -108,7 +112,10 @@
 	$(FIGURES)/rrc-connection-establishment.seqdiag \
 	$(FIGURES)/rrc-connection-reconfiguration.seqdiag \
 	$(FIGURES)/rrc-connection-reconfiguration-handover.seqdiag \
-	$(FIGURES)/nas-attach.seqdiag 
+	$(FIGURES)/nas-attach.seqdiag  \
+	$(FIGURES)/CarrierAggregationUlTxOpportunity.seqdiag \
+	$(FIGURES)/CarrierAggregationDownlinkDataPlane.seqdiag \
+	$(FIGURES)/setupRadioBearerCarrierAggregation.seqdiag
 
 IMAGES_DOT = \
 	$(FIGURES)/lte-enb-rrc-states.dot \
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/lte/doc/source/figures/CarrierAggregationDownlinkDataPlane.seqdiag	Sat Aug 22 10:20:11 2015 +0200
@@ -0,0 +1,17 @@
+
+diagram {
+  LteEnbPdcp -> LteEnbRlc [label="New Rlc SDU"];
+            LteEnbRlc -> CaMacProxy [label="ReportBufferStatus ()"];
+                         CaMacProxy -> LteEnbMac0 [label="ReportBufferStatus (x%)"];
+	                 CaMacProxy -> LteEnbMac1 [label="ReportBufferStatus ((100-x)%)"];
+                         CaMacProxy <- LteEnbMac0 [label="NotifyTxOpportunity ()"];
+            LteEnbRlc <- CaMacProxy [label="NotifyTx Oportunity"];
+            LteEnbRlc -> CaMacProxy [label="Build PDU"];
+                         CaMacProxy -> LteEnbMac0 [label=" "];
+                         CaMacProxy <- LteEnbMac1 [label="NotifyTxOpportunity ()"];
+            LteEnbRlc <- CaMacProxy [label="NotifyTxOpportunity ()"];
+            LteEnbRlc -> CaMacProxy [label="Build PDU"];
+                         CaMacProxy -> LteEnbMac1 [label=" "];
+
+  }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/lte/doc/source/figures/CarrierAggregationUlTxOpportunity.seqdiag	Sat Aug 22 10:20:11 2015 +0200
@@ -0,0 +1,25 @@
+
+diagram {
+  UeRrc -> LteUeComponentCarrierManager [label="ReportBufferStatus ()"];
+            LteUeComponentCarrierManager -> LteUeMac0 [label="ReportBufferStatus ()"];
+			 LteUeMac0 -> LteEnbMac0 [label="ReceiveBsrMessage ()"];
+                         LteEnbMac0 -> LteEnbComponentCarrierManager [label="UlReceiveMacCe ()"];
+                         LteEnbMac1 <- LteEnbComponentCarrierManager [label="ReportMacCeToScheduler ()"];
+                         LteEnbMac0 <- LteEnbComponentCarrierManager [label="ReportMacCeToScheduler ()"];
+	                 LteEnbMac0 -> Scheduler0[label="RlcBufferStatusReport ()"];
+	                 LteEnbMac1 -> Scheduler1[label="RlcBufferStatusReport ()"];
+                         LteEnbMac0 <- Scheduler0 [label="NotifyTxOpportunity ()"];
+                         LteEnbMac1 <- Scheduler1 [label="NotifyTxOpportunity ()"];
+                         LteUeMac1 <- LteEnbMac1 [label="NotifyTxOpportunity ()"];
+                         LteUeMac0 <- LteEnbMac0 [label="NotifyTxOpportunity ()"];
+                         LteUeComponentCarrierManager <- LteUeMac0 [label="NotifyTxOpportunity ()"];
+			 UeRrc <- LteUeComponentCarrierManager[label="NotifyTxOpportunity ()"];
+ 			 UeRrc -> LteUeComponentCarrierManager[label="TransmitPdu ()"];
+			 LteUeComponentCarrierManager -> LteUeMac0 [label="TransmitPdu ()"];
+                         LteUeComponentCarrierManager <- LteUeMac1 [label="NotifyTxOpportunity ()"];
+			 UeRrc <- LteUeComponentCarrierManager[label="NotifyTxOpportunity ()"];
+ 			 UeRrc -> LteUeComponentCarrierManager[label="TransmitPdu ()"];
+			 LteUeComponentCarrierManager -> LteUeMac1 [label="TransmitPdu ()"];
+
+  }
+
Binary file src/lte/doc/source/figures/lte-arch-enb-data-carrier-aggregation.dia has changed
Binary file src/lte/doc/source/figures/lte-class-net-phy-relation.dia has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/lte/doc/source/figures/setupRadioBearerCarrierAggregation.seqdiag	Sat Aug 22 10:20:11 2015 +0200
@@ -0,0 +1,17 @@
+
+diagram {
+  LteEpc -> LteEnbRrc [label="SetupDataRadioBearer ()"];
+            LteEnbRrc -> CcManager [label="SetupDataRadioBearer ()"];
+            LteEnbRrc <- CcManager [label="AddLc (std::vector<LcConfiguration>)"];
+            LteEnbRrc -> LteEnbMac0 [label="AddLc ()"];
+            LteEnbRrc -> LteEnbMac1 [label="AddLC ()"]; 
+  // Separator
+  === ===
+            LteEnbRrc -> CcManager [label="MeasurementReport ()"];
+                         // self referenced edge
+                         CcManager -> CcManager [label = "Decide Activation"];
+            LteEnbRrc <- CcManager [label="AddLc (std::vector<LcConfiguration>)"];
+            LteEnbRrc -> LteEnbMac0 [label="AddLc ()"];
+            LteEnbRrc -> LteEnbMac1 [label="AddLc ()"]; 
+  }
+
--- a/src/lte/doc/source/lte-design.rst	Sat Aug 22 01:27:44 2015 +0200
+++ b/src/lte/doc/source/lte-design.rst	Sat Aug 22 10:20:11 2015 +0200
@@ -4151,8 +4151,9 @@
 Impact on RLC layer
 -------------------------------
 
-The impact on the RLC layer is very small. Basically, it is needed just a large buffer.
-As for the PDCP layer, carrier aggregation is almost transparent to that layer.
+From theoretical point of view, the impact on the RLC layer is very small. Basically, it is needed just a larger buffer.
+However, due to the implementation, the real impact it is larger than it was expected during the design phase.
+Details will be given in the class description section.
 
 Impact on MAC layer
 -------------------------------
@@ -4176,41 +4177,18 @@
 
 Basically, there will be a phy layer entity for each CC, in this sense, each entity is exactly as before, so no large impact on phy layer.
 
-Impact on the code structure
+Code Structure Design
 +++++++++++++++++++++++++++++++
 
-In this section, it is briefly explained the new software architecture proposed to introduce carrier aggregation.
-
-Impact on LteRrc classes
+In this section, it is briefly explained the software architecture proposed to introduce carrier aggregation.
+
+Change on LteNetDevice
 -------------------------------
-The Rrc layer in the LTE protocol stack is responsible of all the procedure related with the connection of a Ue in certain cell. In other word, connection, handhover, frequency reuse techniques and so on. 
-All this procedure need Ue measurement of the channel to be performed. Even if conceptually the RRC layer ad the PHY layer are separated in the current implementation in the control plan exist a direct link maintained by the Lte[Enb/Ue]CPhySap[Provider/User] needed to transfer the Ue Measurement to the RRC layer.
-In figure :ref:`lte-arch-enb-ctrl-rrc-phy`, it is shown the new connection between the sap.
-From the code point of you the LteRrc instance instead of having just one CPhySapUser, it will have a vector of sap, where the dimension of the vector is equal to the number of CC.
-As a remark, the number of CC is defined in the initialization part of the simulation script, hence it is knew before the initialization of the LteRrc objects.
-
-.. _fig-lte-arch-enb-ctrl-rrc-phy:
- 
-.. figure:: figures/lte-arch-enb-ctrl-rrc-phy.*
-   :scale: 70 %
-   :align: center
-
-Following the same designed used for handover procedure, fractional frequency reuse (ffr) procedure and the scheduling, it was added a new module LteCcs. 
-The general idea is to create a module able to decide when and for which user enable the SCCs. Currently only a no--algorithm is implemented. A details view is presented in figure :ref:`fig-lte-ccs-arch`.
-
-.. _fig-lte-ccs-arch:
- 
-.. figure:: figures/lte-ccs-arch.*
-   :scale: 80 %
-   :align: center
-
-
-Impact on LteNetDevice classes
--------------------------------
-
 Both LteEnbNetDevice and LteUeNetDevice are create by the LteHelper using the method InstallSingleEnbDevice and InstallSingleUeDevice. In :ref:`fig-lte-net-phy-relation` it is shown all the parameters defined within these objects.
-The new architecture remove the pointer to the physical layer and introduce a map of ComponentCarrier objects.
+Basically with this implementation all the attributes formerly part of the Lte[Enb/Ue]NetDevice are migrated within the ComponentCarrier[Enb/Ue] object.
 The ComponentCarrier object contains all the parameters necessary to characterize each  CC plus the pointer to the related physical layer.
+The attributes currently are mantained in the Lte[Enb/Ue]NetDevice mainly for backward compatibility purpose. By default the Lte[Enb/Ue]NetDevice attributes
+are the same aaas the primary carrier attributes.
 In order to help in configuring the map a specific helper was introduced, i.e. CcHelper.
 
 
@@ -4220,6 +4198,97 @@
    :scale: 70 %
    :align: center
 
+Enb Class Structure: Data Plane
+-------------------------------
+In :ref:`fig-lte-arch-enb-data-carrier-aggregation` it is shown the relation between the different classes related to the Enb data plane.
+Thanks to the LTeEnbComponentCarrierManager, the Carrier Aggregation is basically transparent to the upper layers.
+As you can see, the main different with respect to the former architecture is that each Mac layer object sees only one LteMacSapUser.
+In the same way, each RLC instance sees only one LteMacSapProvider. The LteEnbComponentCarrierManager it is responsible of the (re)mapping.
+In the current implementation, a PDCP and a RLC instances are activated each time a new Data Radio Bearer is configured. 
+The correspondance between a new  Data Radio Bearer and a RLC Logical Channel is one to one.
+Logical channel configurations are propagated "as it is" to the Mac layer. In order to mantain the same behaviour LteEnbComponentCarrierManager,
+when a new logical channel is activated, propagate the logical channel configurations to each Mac layer object.
+The logical channel configuration sent to each mac layer object changing accordingly to the algoritm implemented. 
+.. _fig-lte-arch-enb-data-carrier-aggregation:
+ 
+.. figure:: figures/lte-arch-enb-data-carrier-aggregation.*
+   :scale: 70 %
+   :align: center
+   
+In :ref:`fig-CarrierAggregationDownlinkDataPlane` it is show an example on how the downlink buffer status report is propagated.
+Each time an Rlc instance send a buffer status report, the LteEnbComponentCarrierManager, propagate split the buffer status report
+between all the component carrier accordingly to the algorithm policies.
+
+.. _fig-CarrierAggregationDownlinkDataPlane:
+ 
+.. figure:: figures/CarrierAggregationDownlinkDataPlane.*
+   :scale: 70 %
+   :align: center
+   
+Enb Class Structure: Control Plane
+-------------------------------
+In :ref:`fig-lte-arch-enb-ctrl-carrier-aggregation` it is shown the relation between the different classes for the Enb control plane.
+During the design phase was choosen to maintain the same link as in the former architecture.
+To do so, each component carrier (either phy layer and mac layer objects) are connected in a one-to-one fashion to the Rrc instance.
+However, the Rrc instance is connected to the LteEnbComponentCarrierManager since this one it is responsible to enable/disable the
+carrier components.
+To clarify, when the simulation start, the number of component carrier is fixed, but only the primary carrier component is enabled.
+Depending on the LteEnbComponentCarrierManager algorithm the other carrier components could be activated or not.
+
+.. _fig-lte-arch-enb-ctrl-carrier-aggregation:
+ 
+.. figure:: figures/lte-arch-enb-ctrl-carrier-aggregation.*
+   :scale: 70 %
+   :align: center
+   
+In :ref:`fig-setupRadioBearerCarrierAggregation` it is shown how the Radio Bearer are configured. 
+.. _fig-setupRadioBearerCarrierAggregation:
+ 
+.. figure:: figures/setupRadioBearerCarrierAggregation.*
+   :scale: 70 %
+   :align: center
+   
+Ue Class Structure: Data Plane
+-------------------------------
+In :ref:`fig-lte-arch-ue-data-carrier-aggregation` it is shown the relation between the different classes related to the Ue data plane.
+The Ue data plane architecture is similar to the Enb data plane implementation.
+The LteUeComponentCarrierManager is responsible to (re)map each MacSap[User/Provider] to the correspondance Rlc instance or to proper
+Mac instance. The channel remapping depend on algorithm used as LteUeComponentCarrierManager.
+A particular case is represented by the Ue buffer status report (BSR) to Enb.
+Since, i) at the best of my knowledge the standard do not specify how the buffer status have to be reported on each component carrier and
+ii) we decide to map one-to-one the logical channel to each mac layer. The only way to send BSR to the Enb was through the primary carrier.
+:ref:`fig-CarrierAggregationUlTxOpportunity` show the sequence diagram. 
+Each time a BSR is generated, the LteUeComponentCarrierManager sends it through the primary carrier component.
+When the primary carrier component, at the Enb, receive the BSR send it to LteEnbComponentCarrierManager.
+The latter, accordingly to algorithm dependent policies, send a BSR packet to each component carrier.
+The communication LteEnbMac <--> LteEnbComponentCarrierManager is done through a specific set of Sap: LteUlCcmRrcSap[User/Provider].
+.. _fig-lte-arch-ue-data-carrier-aggregation:
+ 
+.. figure:: figures/lte-arch-ue-data-carrier-aggregation.*
+   :scale: 70 %
+   :align: center
+   
+.. _fig-CarrierAggregationUlTxOpportunity:
+ 
+.. figure:: figures/CarrierAggregationUlTxOpportunity.*
+   :scale: 70 %
+   :align: center
+   
+Ue Class Structure: Control Plane
+-------------------------------
+In :ref:`fig-lte-arch-ue-ctrl-carrier-aggregation` it is shown the relation between the different classes related to the Ue control plane.
+The control plane implementation at the Ue is basically the same as the Enb control plane implementation.
+Each component carrier control sap (both for phy and mac layer objects) is linked in a one-to-one fashion directly to Rrc instance.
+The Ue Rrc instance is then connected to LteUeComponentCarrierManager in the same way as in the Enb.
+
+.. _fig-lte-arch-ue-ctrl-carrier-aggregation:
+ 
+.. figure:: figures/lte-arch-ue-ctrl-carrier-aggregation.*
+   :scale: 70 %
+   :align: center
+
+
+
 
 -------
 Helpers
@@ -4238,6 +4307,12 @@
    which only provides the API definition; the implementation is delegated
    to child classes in order to allow for different EPC network
    models.
+ * ``CcHelper``, which takes care of the configuration of the LteEnbComponentCarrierMap,
+   basically, it create a user specified number of LteEnbComponentCarrier.
+   LteUeComponentCarrierMap is currently create starting from the LteEnbComponentCarrierMap.
+   LteHelper:InstallSingleUeDevice, in this implementation, it is needed
+   to invoke after the LteHelper:InstallSingleEnbDevice to ensure that the
+   LteEnbComponentCarrierMap is properly initialize.
 
 It is possible to create a simple LTE-only simulations by
 using ``LteHelper`` alone, or to create complete LTE-EPC simulations by