/*! ******************************************************************************* \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 ; }
/*! ******************************************************************************* \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 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 ; }
/*! ******************************************************************************* \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 ); }