/home/tai/chorist/xian-1.2/src/usei-functions.c

Go to the documentation of this file.
00001 
00023 /************************************************************************************************//*
00024  * This file provides functions to help the calculation of metrics.
00025  * @file usei-functions.c
00026  * @authors THALES Communications
00027 ****************************************************************************************************/
00028 
00029 #include <stdlib.h>
00030 #include <stdio.h>
00031 #include "include/usi.h"
00032 #include "include/usei.h"
00033 #include "include/usei-functions.h"
00034 
00035 /*************************************************************************************************************/
00041 void
00042 print_error (unsigned int error_type) 
00043 {
00044   switch (error_type) 
00045     {
00046     case NO_ERRORS:
00047       //    printf("Identified Error: No errors reported\n");
00048       break;
00049     case DEV_NOT_FOUND:
00050       printf("Identified Error: Device interface not found\n");
00051       break;
00052     case DEV_NAME_NOT_DEFINED:
00053       printf("Identified Error: Device interface name not defined\n");
00054       break;
00055     case MAC_ADDR_NOT_DEFINED:
00056       printf("Identified Error: Mac Adress not defined\n");
00057       break;
00058     case NEIGHBOR_NOT_FOUND:
00059       printf("Identified Error: Neighbor not found\n");
00060       break;
00061     case UNKNOW_QUERY:
00062       printf("Identified Error: Unkown Query specified in Cross-Layer Message\n");
00063       break;
00064     case UNKNOW_METRIC:
00065       printf("Identified Error: Unkown Metric specified in Cross-Layer Message\n");
00066       break;
00067     case INVALID_MAC_ADDR:
00068       printf("Identified Error: Invalid MAC Address\n");
00069       break;
00070     case NOT_A_QUERY_MSG:
00071       printf("Identified Error: The expected Message Type is not a Query Type\n");
00072       break;
00073     case COULD_NOT_OPEN_UNIX_DEV:
00074       printf("Identified Error: Could not open Unix Device\n");
00075       break;
00076     case COULD_NOT_READ_UNIX_DEV:
00077       printf("Identified Error: Could not read Unix Device\n");
00078       break;
00079     default:
00080       printf("Identified Error: Unknown error type!!!\n\n");
00081       break;
00082     }
00083   return;
00084 }
00085 
00086 
00087 /*************************************************************************************************************/
00096 struct qos_metric_measurement 
00097 get_qos_metric(unsigned int type, 
00098                char * macaddr, 
00099                char * dev_name, 
00100                unsigned int * code_err)
00101 {
00102   struct qos_metric_measurement qos_metric;
00103   unsigned char metric_8;
00104   //  unsigned int  metric_32;
00105   unsigned long long metric_64;
00106 
00107   switch (type)
00108     {
00109     case LINK_RSSI_ADD : 
00110         metric_8 = get_node_rssi(macaddr, dev_name, code_err);      
00111         qos_metric.metric_unit = metric_8;
00112         qos_metric.metric_sub_unit = 0;
00113         qos_metric.type = LINK_RSSI_ADD;
00114         return qos_metric;
00115         break;
00116 
00117         
00118     case LINK_AVG_DELTA_OCCUPANCY_ADD :
00119         metric_64 = get_node_avg_delta_occupancy(macaddr, dev_name, code_err);
00120         qos_metric.metric_unit = metric_64;
00121         qos_metric.metric_sub_unit = 0;
00122         qos_metric.type = LINK_AVG_DELTA_OCCUPANCY_ADD;
00123         return qos_metric;
00124         break;
00125 
00126 
00127     case LINK_AVG_DELTA_OCCUPANCY_MAX :
00128         metric_64 = get_node_avg_delta_occupancy(macaddr, dev_name, code_err);
00129         qos_metric.metric_unit = metric_64;
00130         qos_metric.metric_sub_unit = 0;
00131         qos_metric.type = LINK_AVG_DELTA_OCCUPANCY_MAX;
00132         return qos_metric;
00133         break;  
00134         
00135 
00136     case LINK_FAILURE_RATE_MAX :
00137         metric_64 = get_node_avg_tx_failure_rate(macaddr, dev_name, code_err);
00138         qos_metric.metric_unit = metric_64;
00139         qos_metric.metric_sub_unit = 0;
00140         qos_metric.type = LINK_FAILURE_RATE_MAX;
00141         return qos_metric;
00142         break;          
00143         
00144     case LINK_FAILURE_RATE_MUL :
00145         metric_64 = get_node_avg_tx_failure_rate(macaddr, dev_name, code_err);
00146         qos_metric.metric_unit = metric_64;
00147         qos_metric.metric_sub_unit = 0;
00148         qos_metric.type = LINK_FAILURE_RATE_MUL;
00149         return qos_metric;
00150         break;
00151 
00152     case LINK_AVG_RSSI :
00153         metric_64 = get_node_avg_rssi(macaddr, dev_name, code_err);
00154         qos_metric.metric_unit = metric_64;
00155         qos_metric.metric_sub_unit = 0;
00156         qos_metric.type = LINK_AVG_RSSI;
00157         return qos_metric;
00158         break;
00159     default :
00160       printf("usei-functions.c : default in function get_qos_metric()");
00161     } 
00162   return qos_metric;   
00163 }
00164 
00165 
00166 /*************************************************************************************************************/
00174 unsigned int
00175 metrics_operation(struct qos_metric_measurement qos_metric_1, 
00176                   struct qos_metric_measurement qos_metric_2,
00177                   struct qos_metric_measurement * qos_metric_result)
00178 {
00179   if (qos_metric_1.type == qos_metric_2.type)
00180     {
00181       switch (qos_metric_1.type)
00182         {
00183         case LINK_RSSI_ADD                            :                  
00184         case LINK_AVG_DELTA_OCCUPANCY_ADD             :        // Operation = addition
00185           qos_metric_result->metric_unit = qos_metric_1.metric_unit + qos_metric_2.metric_unit;
00186           qos_metric_result->metric_sub_unit = qos_metric_1.metric_sub_unit + qos_metric_2.metric_sub_unit;
00187           qos_metric_result->type = qos_metric_1.type;
00188           return 1;
00189           break;
00190           
00191         case LINK_FAILURE_RATE_MAX              :
00192         case LINK_AVG_DELTA_OCCUPANCY_MAX            :        // Operation = max
00193           if (qos_metric_1.metric_unit > qos_metric_2.metric_unit)
00194             {
00195               qos_metric_result->metric_unit = qos_metric_1.metric_unit;
00196               qos_metric_result->metric_sub_unit = qos_metric_1.metric_sub_unit;
00197               qos_metric_result->type = qos_metric_1.type;
00198               return 1;
00199             }
00200           if (qos_metric_1.metric_unit < qos_metric_2.metric_unit)
00201             {
00202               qos_metric_result->metric_unit = qos_metric_2.metric_unit;
00203               qos_metric_result->metric_sub_unit = qos_metric_2.metric_sub_unit;
00204               qos_metric_result->type = qos_metric_1.type;
00205               return 1;
00206             }
00207           if (qos_metric_1.metric_unit == qos_metric_2.metric_unit)
00208             {
00209               qos_metric_result->metric_unit = qos_metric_1.metric_unit;
00210               if (qos_metric_1.metric_sub_unit > qos_metric_2.metric_sub_unit)
00211                 {
00212                   qos_metric_result->metric_sub_unit = qos_metric_1.metric_sub_unit;
00213                   qos_metric_result->type = qos_metric_1.type;
00214                 }
00215               else
00216                 {
00217                   qos_metric_result->metric_sub_unit = qos_metric_2.metric_sub_unit;
00218                   qos_metric_result->type = qos_metric_1.type;
00219                 }
00220               return 1;
00221             }
00222           break;
00223 
00224         case LINK_FAILURE_RATE_MUL           :        // Operation = multiplication
00225           qos_metric_result->metric_unit = (unsigned long long) (((float) qos_metric_1.metric_unit 
00226                                                                   * (float) qos_metric_2.metric_unit)/ 10000.0);
00227           qos_metric_result->metric_sub_unit = 0;
00228           qos_metric_result->type = qos_metric_1.type;
00229           return 1;
00230           break;
00231 
00232         case LINK_AVG_RSSI: // OPERATION TO BE DEFINED!!!!! Currently Addition
00233           qos_metric_result->metric_unit = qos_metric_1.metric_unit + qos_metric_2.metric_unit;
00234           qos_metric_result->metric_sub_unit = qos_metric_1.metric_sub_unit + qos_metric_2.metric_sub_unit;
00235           qos_metric_result->type = qos_metric_1.type;
00236           return 1;
00237           break;
00238         }    
00239     }
00240   return 0;
00241 }
00242 
00243 
00244 /*************************************************************************************************************/
00252 unsigned int
00253 is_relevant_metric(struct qos_metric_measurement qos_metric_new, 
00254                    struct qos_metric_measurement qos_metric_old)
00255 {
00256   if (qos_metric_new.type == qos_metric_old.type)
00257     {
00258       float new_float_metric_unit;
00259       float old_float_metric_unit;
00260 
00261       switch (qos_metric_new.type)
00262         {
00263         case LINK_RSSI_ADD :
00264           new_float_metric_unit = (float) qos_metric_new.metric_unit;
00265           old_float_metric_unit = (float) qos_metric_old.metric_unit;
00266           
00267           if ((new_float_metric_unit > old_float_metric_unit * 1.15) 
00268               || (new_float_metric_unit < old_float_metric_unit * 0.85))
00269             return 1; 
00270           return 0;
00271           break;
00272 
00273         
00274         case LINK_AVG_DELTA_OCCUPANCY_ADD :
00275           new_float_metric_unit = (float) qos_metric_new.metric_unit;
00276           old_float_metric_unit = (float) qos_metric_old.metric_unit;
00277           
00278           if ((new_float_metric_unit > old_float_metric_unit * 1.30) 
00279               || (new_float_metric_unit < old_float_metric_unit * 0.70))
00280             return 1;
00281           return 0;
00282           break;
00283         
00284 
00285         case LINK_AVG_DELTA_OCCUPANCY_MAX :
00286           new_float_metric_unit = (float) qos_metric_new.metric_unit;
00287           old_float_metric_unit = (float) qos_metric_old.metric_unit;
00288           
00289           if ((new_float_metric_unit > old_float_metric_unit * 1.30) 
00290               || (new_float_metric_unit < old_float_metric_unit * 0.70))
00291             return 1;
00292           return 0;
00293           break;        
00294         
00295 
00296         case LINK_FAILURE_RATE_MAX :
00297           new_float_metric_unit = (float) qos_metric_new.metric_unit;
00298           old_float_metric_unit = (float) qos_metric_old.metric_unit;
00299           
00300           if ((new_float_metric_unit > old_float_metric_unit * 1.15) 
00301               || (new_float_metric_unit < old_float_metric_unit * 0.85))
00302             return 1;
00303           return 0;
00304           break;                
00305           
00306         case LINK_FAILURE_RATE_MUL :
00307           new_float_metric_unit = (float) qos_metric_new.metric_unit;
00308           old_float_metric_unit = (float) qos_metric_old.metric_unit;
00309           
00310           if ((new_float_metric_unit > old_float_metric_unit * 1.15) 
00311               || (new_float_metric_unit < old_float_metric_unit * 0.85))
00312             return 1;
00313           return 0;
00314           break;
00315 
00316         case LINK_AVG_RSSI :
00317           new_float_metric_unit = (float) qos_metric_new.metric_unit;
00318           old_float_metric_unit = (float) qos_metric_old.metric_unit;
00319           
00320           if ((new_float_metric_unit > old_float_metric_unit * 1.15) 
00321               || (new_float_metric_unit < old_float_metric_unit * 0.85))
00322             return 1; 
00323           return 0;
00324           break;
00325         }
00326     }
00327   return 0;
00328 }

Generated on Mon Jan 21 12:31:46 2008 for XIAN by  doxygen 1.5.3