/*!
*******************************************************************************
\brief  La fonction retire un element de la liste des voisins

\return  aucune valeur.
*/
void del_neighbor(
  neighbor_desc_t **neighbor_entry, ///< pointeur sur l'entree de la liste de voisinage
  L2_ID            *L2_id           ///< ID niveau 2 du voisin a detruire
)
{
  neighbor_desc_t *pCurrentItem = *neighbor_entry;
  neighbor_desc_t *pNextItem  ;
  neighbor_desc_t **ppPrevItem  = neighbor_entry ;

  if ( (pCurrentItem == NULL)  || (neighbor_entry==NULL))
    return ;

  while ( pCurrentItem != NULL ) {
    pNextItem =  pCurrentItem->next ;

    if ( L2_ID_cmp( &(pCurrentItem->L2_id),L2_id) == 0 ) {
      *ppPrevItem = pNextItem;

      RRM_FREE( pCurrentItem->Sensing_meas) ;
      RRM_FREE( pCurrentItem ) ;
      break ;
    }

    ppPrevItem   = &(pCurrentItem->next) ;
    pCurrentItem = pNextItem ;
  }

  PRINT_NEIGHBOR_DB( *neighbor_entry );
}
/*!
*******************************************************************************
\brief  This function read a buffer from a unix socket
\return the function returns a message pointer. If the pointeur is NULL, a error
is happened.
*/
char *recv_msg(
  sock_rrm_t *s  ///< socket descriptor
)
{
  /* Unix socket */
  char        *buf = NULL;
  char        *smsg = NULL;
  struct  msghdr    msghd ;
  struct  iovec     iov;
  int         size_msg ;
  msg_head_t      *head  ;
  int         ret ;

  int taille =  SIZE_MAX_PAYLOAD ;

  buf         = (char *)calloc(taille,sizeof(char));

  if ( buf == NULL ) {
    fprintf(stderr,"Buf null\n");
    return NULL ;
  }

  iov.iov_base      = (void *)buf;
  iov.iov_len       = taille ;
  msghd.msg_name      = (void *)&(s->un_dest_addr);
  msghd.msg_namelen   = sizeof(s->un_dest_addr);
  msghd.msg_iov       = &iov;
  msghd.msg_iovlen    = 1;
  msghd.msg_control   = NULL ;
  msghd.msg_controllen= 0 ;

  ret = recvmsg(s->s, &msghd , 0 ) ;

  if ( ret <= 0  ) {
    // non-blocking socket
    // perror("PB recvmsg_un");
    fprintf(stderr,"PB recvmsg_un\n");
    RRM_FREE(buf);
    return NULL ;
  }

  if (msghd.msg_flags != 0 ) {
    fprintf(stderr,"error recvmsg_un: 0x%02x\n", msghd.msg_flags) ;
    RRM_FREE(buf);
    return NULL ;
  }

  head    = (msg_head_t *) buf  ;
  size_msg  = sizeof(msg_head_t) + head->size ;

  smsg    = (char *)calloc(size_msg,sizeof(char)) ;

  if ( smsg != NULL )
    memcpy( smsg , buf , size_msg ) ;

  RRM_FREE( buf ) ;

  return smsg ;
}
Пример #3
0
/*!
*******************************************************************************
\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 );   
}
Пример #4
0
/*!
*******************************************************************************
\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 detruit la liste de type neighbor_list_t .

\return Aucune valeur
*/
void del_neighbor_list(
  neighbor_list_t **neighbor_list_entry ///< pointeur sur l'entree de la liste de voisinage
)
{
  neighbor_list_t *pCurrentItem = *neighbor_list_entry;
  neighbor_list_t *pNextItem  ;

  if ( (pCurrentItem == NULL)  || (neighbor_list_entry==NULL))
    return ;

  while ( pCurrentItem != NULL ) {
    pNextItem =  pCurrentItem->next ;

    RRM_FREE( pCurrentItem->rb_meas ) ;
    RRM_FREE( pCurrentItem ) ;

    pCurrentItem = pNextItem ;
  }

  *neighbor_list_entry = NULL ;
}
Пример #6
0
/*!
*******************************************************************************
\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 met a jour les informations de mesure de voisinage d'un noeud

\return aucune valeur
*/
void set_Sensing_meas_neighbor(
  neighbor_desc_t *neighbor_entry, ///< pointeur sur l'entree de la liste de voisinage
  L2_ID           *L2_id         , ///< ID du noeud
  unsigned int     nb_meas       , ///< Nombre de mesure associe au noeud
  SENSING_MEAS_T *sensing_meas     ///< Mesures de voisinage
)
{
  neighbor_desc_t *pCurrentItem = neighbor_entry;

  while ( pCurrentItem != NULL) {
    if ( L2_ID_cmp( &(pCurrentItem->L2_id),L2_id) == 0 ) {
      pCurrentItem->NB_neighbor = 0 ;

      RRM_FREE(pCurrentItem->Sensing_meas );

      if (  nb_meas > 0 ) {
        SENSING_MEAS_T *p   = RRM_MALLOC(SENSING_MEAS_T, nb_meas ) ;

        if ( p != NULL ) {
          int size = nb_meas * sizeof(SENSING_MEAS_T) ;
          memcpy( p,sensing_meas , size );
          pCurrentItem->NB_neighbor  = nb_meas ;
          pCurrentItem->Sensing_meas = p ;
        }
      }

      break ;
    }

    pCurrentItem = pCurrentItem->next ;
  }

  if (pCurrentItem==NULL) {
    fprintf(stderr,"ERROR: Unknown MR L2_id  :");
    print_L2_id(L2_id) ;
    fprintf(stderr,"\n");
  }

  PRINT_NEIGHBOR_DB( neighbor_entry );
}