00001
00023
00024
00025
00026
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
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
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 :
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 :
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 :
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:
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 }