Pre-ci test passed git-svn-id: http://svn.eurecom.fr/openair4G/trunk@4000 818b1a75-f10b-46b9-bf7c-635c3b92a50f
353 lines
11 KiB
C
353 lines
11 KiB
C
/*!
|
|
*******************************************************************************
|
|
|
|
\file rb_db.c
|
|
|
|
\brief Fonctions permettant la gestion de la base de donnée sur les radio-
|
|
bearers du cluster par le cluster head
|
|
|
|
\author BURLOT Pascal
|
|
|
|
\date 29/08/08
|
|
|
|
|
|
\par Historique:
|
|
$Author$ $Date$ $Revision$
|
|
$Id$
|
|
$Log$
|
|
|
|
*******************************************************************************
|
|
*/
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <errno.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
|
|
#include <sys/socket.h>
|
|
#include <sys/un.h>
|
|
|
|
#include <pthread.h>
|
|
|
|
#include "debug.h"
|
|
#include "L3_rrc_defs.h"
|
|
#include "rrm_util.h"
|
|
#include "rb_db.h"
|
|
|
|
//! Selection locale du mode de debug
|
|
#define DBG_RB_DB 0
|
|
|
|
#if DBG_RB_DB==0
|
|
//! Macro inactive
|
|
#define PRINT_RB_DB(...)
|
|
#else
|
|
//! Macro affichant la liste des radio bearers
|
|
#define PRINT_RB_DB(...) print_rb_db( __VA_ARGS__ )
|
|
#endif
|
|
|
|
/*!
|
|
*******************************************************************************
|
|
\brief La fonction affiche a l'ecran la liste (pour du debug)
|
|
|
|
\return aucune valeur retournee
|
|
*/
|
|
static void print_rb_db(
|
|
RB_desc_t *pEntry ///< pointeur sur le debut de liste
|
|
)
|
|
{
|
|
unsigned int i ;
|
|
RB_desc_t *pCurrentItem = pEntry;
|
|
|
|
fprintf(stderr,"RB list=[\n");
|
|
while ( pCurrentItem != NULL)
|
|
{
|
|
fprintf(stderr," @%p(.Trans_id=%d, .Rb_id=%d, .Rb_type=%d",
|
|
pCurrentItem, pCurrentItem->Trans_id,
|
|
pCurrentItem->Rb_id, pCurrentItem->RB_type);
|
|
|
|
fprintf(stderr,", @SRC=");
|
|
for ( i=0;i<8;i++)
|
|
fprintf(stderr,"%02X", pCurrentItem->L2_id[0].L2_id[i]);
|
|
|
|
fprintf(stderr,", @DST=");
|
|
for ( i=0;i<8;i++)
|
|
fprintf(stderr,"%02X", pCurrentItem->L2_id[1].L2_id[i]);
|
|
|
|
fprintf(stderr,", .QoS_class=%d", pCurrentItem->QoS_class );
|
|
|
|
/*
|
|
fprintf(stderr,",\n .Lchan_desc=%p(",&(pCurrentItem->Lchan_desc));
|
|
fprintf(stderr,".transport_block_size=%d,",pCurrentItem->Lchan_desc.transport_block_size);
|
|
fprintf(stderr,".max_transport_blocks=%d,",pCurrentItem->Lchan_desc.max_transport_blocks);
|
|
fprintf(stderr,".Guaranteed_bit_rate=%ld,",pCurrentItem->Lchan_desc.Guaranteed_bit_rate);
|
|
fprintf(stderr,".Max_bit_rate=%ld,",pCurrentItem->Lchan_desc.Max_bit_rate);
|
|
fprintf(stderr,".Delay_class=%d,",pCurrentItem->Lchan_desc.Delay_class);
|
|
fprintf(stderr,".Target_bler=%d,",pCurrentItem->Lchan_desc.Target_bler);
|
|
fprintf(stderr,".LCHAN_t=%d),",pCurrentItem->Lchan_desc.LCHAN_t);
|
|
|
|
fprintf(stderr,",\n .Mac_rlc_meas_desc=%p(",&(pCurrentItem->Mac_rlc_meas_desc));
|
|
fprintf(stderr,".Meas_trigger=%p(",&(pCurrentItem->Mac_rlc_meas_desc.Meas_trigger));
|
|
fprintf(stderr,".Rssi=%d, ",pCurrentItem->Mac_rlc_meas_desc.Meas_trigger.Rssi);
|
|
fprintf(stderr,".Sinr=%d, ",pCurrentItem->Mac_rlc_meas_desc.Meas_trigger.Sinr);
|
|
fprintf(stderr,".Harq_delay=%u, ",pCurrentItem->Mac_rlc_meas_desc.Meas_trigger.Harq_delay);
|
|
fprintf(stderr,".Bler=%u,",pCurrentItem->Mac_rlc_meas_desc.Meas_trigger.Bler);
|
|
fprintf(stderr,".Spec_eff=%u), ",pCurrentItem->Mac_rlc_meas_desc.Meas_trigger.Spec_eff);
|
|
fprintf(stderr,".Mac_avg=%p(",&(pCurrentItem->Mac_rlc_meas_desc.Mac_avg));
|
|
fprintf(stderr,".Rssi_forgetting_factor=%u, ",pCurrentItem->Mac_rlc_meas_desc.Mac_avg.Rssi_forgetting_factor);
|
|
fprintf(stderr,".Sinr_forgetting_factor=%u, ",pCurrentItem->Mac_rlc_meas_desc.Mac_avg.Sinr_forgetting_factor);
|
|
fprintf(stderr,".Harq_delay_forgetting_factor=%u, ",pCurrentItem->Mac_rlc_meas_desc.Mac_avg.Harq_delay_forgetting_factor);
|
|
fprintf(stderr,".Bler_forgetting_factor=%u, ",pCurrentItem->Mac_rlc_meas_desc.Mac_avg.Bler_forgetting_factor);
|
|
fprintf(stderr,".Spec_eff_forgetting_factor=%u),\n",pCurrentItem->Mac_rlc_meas_desc.Mac_avg.Spec_eff_forgetting_factor);
|
|
fprintf(stderr," .bo_forgetting_factor=%u,",pCurrentItem->Mac_rlc_meas_desc.bo_forgetting_factor);
|
|
fprintf(stderr,".sdu_loss_trigger=%u,",pCurrentItem->Mac_rlc_meas_desc.sdu_loss_trigger);
|
|
fprintf(stderr,".Rep_amount=%u,",pCurrentItem->Mac_rlc_meas_desc.Rep_amount);
|
|
fprintf(stderr,".Rep_interval=%d,",pCurrentItem->Mac_rlc_meas_desc.Rep_interval);
|
|
*/
|
|
|
|
fprintf(stderr,", .next=%p)\n", pCurrentItem->next );
|
|
|
|
pCurrentItem = pCurrentItem->next ;
|
|
}
|
|
fprintf(stderr," ]\n");
|
|
}
|
|
|
|
/*!
|
|
*******************************************************************************
|
|
\brief La fonction ajoute un rb dans la liste des RB ouverts du Cluster head.
|
|
|
|
\return retourne la valeur du nouvel element
|
|
*/
|
|
RB_desc_t *add_rb(
|
|
RB_desc_t **rb_entry , ///< pointeur sur l'entree de la liste des RB
|
|
Transaction_t Trans_id , ///< transaction associee
|
|
QOS_CLASS_T QoS_class , ///< index de la classe de QoS
|
|
L2_ID *L2_id ///< ID de niveau 2 des noeuds associes au RB
|
|
)
|
|
{
|
|
RB_desc_t *pOldEntry = *rb_entry;
|
|
RB_desc_t *pNewItem = RRM_CALLOC( RB_desc_t , 1 ) ;
|
|
|
|
PNULL(pNewItem) ;
|
|
if ( pNewItem == NULL )
|
|
return NULL ;
|
|
|
|
pNewItem->QoS_class = QoS_class ;
|
|
|
|
memcpy( &(pNewItem->L2_id[0]) , L2_id, 2*sizeof(L2_ID) ) ;
|
|
|
|
pNewItem->Trans_id = Trans_id ;
|
|
pNewItem->Rb_id = 0 ;
|
|
pNewItem->RB_type = 0;
|
|
|
|
*rb_entry = pNewItem ;
|
|
pNewItem->next = pOldEntry;
|
|
|
|
PRINT_RB_DB( *rb_entry );
|
|
return pNewItem ;
|
|
}
|
|
|
|
/*!
|
|
*******************************************************************************
|
|
\brief La fonction retire l'element identifie par le RB_id de la liste des RB
|
|
|
|
\return aucune valeur.
|
|
*/
|
|
void del_rb_by_rbid(
|
|
RB_desc_t **rb_entry , ///< pointeur sur l'entree de la liste des RB
|
|
RB_ID Rb_id ///< ID du RB a detruire
|
|
)
|
|
{
|
|
RB_desc_t *pCurrentItem = *rb_entry;
|
|
RB_desc_t *pNextItem ;
|
|
RB_desc_t **ppPrevItem = rb_entry ;
|
|
|
|
if ( (pCurrentItem == NULL) || (rb_entry==NULL))
|
|
return ;
|
|
|
|
while ( pCurrentItem != NULL )
|
|
{
|
|
pNextItem = pCurrentItem->next ;
|
|
if ( Rb_id == pCurrentItem->Rb_id )
|
|
{
|
|
*ppPrevItem = pNextItem;
|
|
RRM_FREE( pCurrentItem ) ;
|
|
PRINT_RB_DB( *rb_entry );
|
|
return ;
|
|
}
|
|
ppPrevItem = &(pCurrentItem->next) ;
|
|
pCurrentItem = pNextItem ;
|
|
}
|
|
|
|
if ( pCurrentItem == NULL )
|
|
fprintf(stderr, "ERROR: RB_id (%d) unknown\n", Rb_id ) ;
|
|
|
|
PRINT_RB_DB( *rb_entry );
|
|
}
|
|
|
|
/*!
|
|
*******************************************************************************
|
|
\brief La fonction retire l'element identifie par le Trans_id de la liste des RB
|
|
|
|
\return aucune valeur.
|
|
*/
|
|
void del_rb_by_transid(
|
|
RB_desc_t **rb_entry , ///< pointeur sur l'entree de la liste des RB
|
|
Transaction_t Trans_id ///< transaction identifiant le RB
|
|
)
|
|
{
|
|
RB_desc_t *pCurrentItem = *rb_entry;
|
|
RB_desc_t *pNextItem ;
|
|
RB_desc_t **ppPrevItem = rb_entry ;
|
|
|
|
if ( (pCurrentItem == NULL) || (rb_entry==NULL))
|
|
return ;
|
|
|
|
while ( pCurrentItem != NULL )
|
|
{
|
|
pNextItem = pCurrentItem->next ;
|
|
if ( Trans_id == pCurrentItem->Trans_id )
|
|
{
|
|
*ppPrevItem = pNextItem;
|
|
RRM_FREE( pCurrentItem ) ;
|
|
PRINT_RB_DB( *rb_entry );
|
|
return ;
|
|
}
|
|
ppPrevItem = &(pCurrentItem->next) ;
|
|
pCurrentItem = pNextItem ;
|
|
}
|
|
|
|
PRINT_RB_DB( *rb_entry );
|
|
}
|
|
|
|
/*!
|
|
*******************************************************************************
|
|
\brief La fonction detruit entierement la liste des RB
|
|
|
|
\return aucune valeur.
|
|
*/
|
|
void del_all_rb(
|
|
RB_desc_t **rb_entry ///< pointeur sur l'entree de la liste des RB
|
|
)
|
|
{
|
|
RB_desc_t *pCurrentItem = *rb_entry;
|
|
RB_desc_t *pNextItem ;
|
|
|
|
if ( (pCurrentItem == NULL) || (rb_entry==NULL))
|
|
return ;
|
|
|
|
while ( pCurrentItem != NULL )
|
|
{
|
|
pNextItem = pCurrentItem->next ;
|
|
RRM_FREE( pCurrentItem ) ;
|
|
pCurrentItem = pNextItem ;
|
|
}
|
|
|
|
*rb_entry = NULL ;
|
|
}
|
|
|
|
/*!
|
|
*******************************************************************************
|
|
\brief La fonction recherche le descripteur de RB identifie par le RB_id
|
|
la liste des RBs
|
|
|
|
\return pointeur sur le descripteur de RB trouve sinon NULL .
|
|
*/
|
|
RB_desc_t *get_rb_desc_by_rbid(
|
|
RB_desc_t *rb_entry , ///< pointeur sur l'entree de la liste des RB
|
|
RB_ID Rb_id ///< Id du descripteur de RB recherchee
|
|
)
|
|
{
|
|
RB_desc_t *pCurrentItem = rb_entry;
|
|
|
|
while ( pCurrentItem != NULL)
|
|
{
|
|
if ( Rb_id == pCurrentItem->Rb_id )
|
|
break ;
|
|
|
|
pCurrentItem = pCurrentItem->next ;
|
|
}
|
|
|
|
return pCurrentItem ;
|
|
}
|
|
|
|
/*!
|
|
*******************************************************************************
|
|
\brief La fonction recherche le descripteur de RB identifie par le Trans_id
|
|
la liste des RBs
|
|
|
|
\return pointeur sur le descripteur de RB trouve sinon NULL .
|
|
*/
|
|
RB_desc_t *get_rb_desc_by_transid(
|
|
RB_desc_t *rb_entry , ///< pointeur sur l'entree de la liste des RB
|
|
Transaction_t Trans_id ///< transaction du descripteur de RB recherchee
|
|
)
|
|
{
|
|
RB_desc_t *pCurrentItem = rb_entry;
|
|
|
|
while ( pCurrentItem != NULL)
|
|
{
|
|
if ( Trans_id == pCurrentItem->Trans_id )
|
|
break ;
|
|
|
|
pCurrentItem = pCurrentItem->next ;
|
|
}
|
|
|
|
return pCurrentItem ;
|
|
}
|
|
|
|
/*!
|
|
*******************************************************************************
|
|
\brief La fonction rafraichit les champs Rb_id, RB_type d'un descripteur
|
|
de RB identifie par le Trans_id la liste des RBs .
|
|
|
|
\return aucune valeur
|
|
*/
|
|
void update_rb_desc(
|
|
RB_desc_t *rb_entry , ///< pointeur sur un element de la liste des RB
|
|
Transaction_t Trans_id , ///< transaction id
|
|
RB_ID Rb_id , ///< RB id
|
|
RB_TYPE RB_type ///< type de RB
|
|
)
|
|
{
|
|
RB_desc_t *pItem = get_rb_desc_by_transid(rb_entry,Trans_id);
|
|
|
|
if ( pItem != NULL)
|
|
{
|
|
pItem->Trans_id= -1 ;
|
|
pItem->Rb_id = Rb_id ;
|
|
pItem->RB_type = RB_type ;
|
|
}
|
|
PRINT_RB_DB( rb_entry );
|
|
}
|
|
|
|
/*!
|
|
*******************************************************************************
|
|
\brief La fonction rafraichit le champs Rb_meas d'un RB identifie dans la
|
|
liste des RBs .
|
|
|
|
\return aucune valeur
|
|
*/
|
|
void update_rb_meas(
|
|
RB_desc_t *rb_entry , ///< pointeur sur un element de la liste des RB
|
|
RB_ID Rb_id , ///< RB id
|
|
L2_ID *L2_id , ///< ID de niveau 2 d'un des noeuds du RB
|
|
MAC_RLC_MEAS_T *Rb_meas ///< mesure RB effectue par le noeud
|
|
)
|
|
{
|
|
RB_desc_t *pItem = get_rb_desc_by_rbid(rb_entry,Rb_id);
|
|
|
|
if ( pItem != NULL)
|
|
{
|
|
if ( memcmp(L2_id, &pItem->L2_id[0], sizeof(L2_ID) ) == 0 )
|
|
{
|
|
memcpy( &pItem->Rb_meas[0],Rb_meas, sizeof(MAC_RLC_MEAS_T) ) ;
|
|
}
|
|
else
|
|
if ( memcmp(L2_id, &pItem->L2_id[1], sizeof(L2_ID) ) == 0 )
|
|
{
|
|
memcpy( &pItem->Rb_meas[1],Rb_meas, sizeof(MAC_RLC_MEAS_T) ) ;
|
|
}
|
|
}
|
|
|
|
}
|