/*******************************************************************************
    OpenAirInterface
    Copyright(c) 1999 - 2014 Eurecom

    OpenAirInterface is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.


    OpenAirInterface is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with OpenAirInterface.The full GNU General Public License is
   included in this distribution in the file called "COPYING". If not,
   see <http://www.gnu.org/licenses/>.

  Contact Information
  OpenAirInterface Admin: openair_admin@eurecom.fr
  OpenAirInterface Tech : openair_tech@eurecom.fr
  OpenAirInterface Dev  : openair4g-devel@eurecom.fr

  Address      : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06410 Biot Sophia Antipolis cedex, FRANCE

 *******************************************************************************/

/*!
*******************************************************************************

\file       pusu_msg.h

\brief      Fichier d'entete contenant les declarations des types, des defines ,
            et des fonctions relatives aux messages RRM->PUSU.

            Les fonctions servent à créer le buffer de message, remplir l'entete
            et copier les parametres de fonction. Chaque fonction retourne le
            message qui pourra être envoye sur le socket.

\author     BURLOT Pascal

\date       29/08/08


\par     Historique:
            $Author$  $Date$  $Revision$
            $Id$
            $Log$

*******************************************************************************
*/

#ifndef PUSU_MSG_H
#define PUSU_MSG_H

#ifdef __cplusplus
extern "C" {
#endif

//! Definition de la taille de l'identification niveau 2
#define IEEE80211_MAC_ADDR_LEN 8


/*!
*******************************************************************************
\brief  Enumeration des messages entre le RRM et PUSU
*/
typedef enum {
  RRM_PUBLISH_IND = 0     , ///< Annonce de nouveau service
  PUSU_PUBLISH_RESP       , ///< Reponse de PUSU_PUBLISH_IND
  RRM_UNPUBLISH_IND       , ///< Annonce de retrait d'un service
  PUSU_UNPUBLISH_RESP     , ///< Reponse de PUSU_UNPUBLISH_IND
  RRM_LINK_INFO_IND       , ///< Info sur un lien (oriente)
  PUSU_LINK_INFO_RESP     , ///< Reponse de PUSU_LINK_INFO_IND
  RRM_SENSING_INFO_IND    , ///< Info sur un voisin (oriente)
  PUSU_SENSING_INFO_RESP  , ///< Reponse de RRM_SENSING_INFO_IND
  RRM_CH_LOAD_IND         , ///< Info sur la charge d'un cluster
  PUSU_CH_LOAD_RESP       , ///< Reponse de PUSU_CH_LOAD_IND
  NB_MSG_RRM_PUSU           ///< Nombre de message de l'interface
}
MSG_RRM_PUSU_T ;

/*!
*******************************************************************************
\brief  Enumeration des services entre le RRM et PUSU
*/
typedef enum {
  PUSU_RRM_SERVICE = 0xAA      ///< service d'un information RRM vers le TRM
} SERVICE_RRM_PUSU_T ;

/*!
*******************************************************************************
\brief  Definition de publish/unpublish
*/
typedef struct {
  int service_type ;  ///< type de service
} pusu_publish_t ,  pusu_unpublish_t ;

/*!
*******************************************************************************
\brief  Definition des informations remontees au TRM relatives a un lien
*/
typedef struct {
  L2_ID         noeud1       ;  ///< L2_ID du noeud 1
  L2_ID         noeud2       ;  ///< L2_ID du noeud 2
  RB_ID         rb_id        ;  ///< identification du lien
  unsigned char rssi         ;  ///< metrique RSSI
  unsigned char spec_eff     ;  ///< metrique Efficacite spectrale
} pusu_link_info_t;

/*!
*******************************************************************************
\brief  Definition des informations remontees au TRM relatives a un voisin
        sans notion de lien etabli obligatoirement
*/
typedef struct {
  L2_ID         noeud1       ;  ///< L2_ID du noeud 1
  L2_ID         noeud2       ;  ///< L2_ID du noeud 2
  unsigned char rssi         ;  ///< metrique RSSI
} pusu_sensing_info_t;

/*!
*******************************************************************************
\brief  Definition de la structure d'information de charge du cluster remontee
        au TRM
*/
typedef struct {
  unsigned char load         ;  ///< la charge du cluster
} pusu_ch_load_t;

#ifdef TRACE
extern const char *Str_msg_pusu_rrm[NB_MSG_RRM_PUSU] ;
#endif

msg_t *msg_rrm_publish_ind(Instance_t inst, int service, Transaction_t Trans_id  );
msg_t *msg_rrm_unpublish_ind(Instance_t inst, int service, Transaction_t Trans_id  );
msg_t *msg_rrm_link_info_ind(Instance_t inst, L2_ID noeud1, L2_ID noeud2, RB_ID rb_id, unsigned char rssi ,unsigned char spec_eff, Transaction_t Trans_id ) ;
msg_t *msg_rrm_sensing_info_ind(Instance_t inst, L2_ID noeud1, L2_ID noeud2, unsigned char rssi, Transaction_t Trans_id ) ;
msg_t *msg_rrm_ch_load_ind(Instance_t inst, unsigned char load, Transaction_t Trans_id  );
msg_t *msg_pusu_resp(Instance_t inst, MSG_RRM_PUSU_T response, Transaction_t Trans_id );

#ifdef __cplusplus
}
#endif

#endif /* PUSU_MSG_H */