sgw: remove struct costs_weights and max_cost_etx_max from the costs API
[olsrd.git] / src / gateway_costs.c
1 #include "gateway_costs.h"
2 #include "olsr_cfg.h"
3
4 #ifdef __cplusplus
5 extern "C" {
6 #endif /* __cplusplus */
7
8 #define SCALING_SHIFT_CLASSIC 31
9 #define SCALING_SHIFT 23
10 #define MAX_SMARTGW_SPEED 320000000
11
12 int64_t gw_costs_weigh(bool up, uint32_t path_cost, uint32_t exitUk, uint32_t exitDk) {
13   int64_t costU;
14   int64_t costD;
15   int64_t costE;
16
17   if (!up) {
18     /* interface is down */
19     return INT64_MAX;
20   }
21
22   if (!olsr_cnf->smart_gw_divider_etx) {
23     /* only consider path costs (classic behaviour) (but scale to 64 bit) */
24     return ((int64_t) path_cost) << SCALING_SHIFT_CLASSIC;
25   }
26
27   if (!exitUk || !exitDk) {
28     /* zero bandwidth */
29     return INT64_MAX;
30   }
31
32   if ((exitUk >= MAX_SMARTGW_SPEED) //
33       && (exitDk >= MAX_SMARTGW_SPEED) //
34       && (path_cost < olsr_cnf->smart_gw_path_max_cost_etx_max)) {
35     /* maximum bandwidth AND below max_cost_etx_max: only consider path costs */
36     return path_cost;
37   }
38
39   costU = (((int64_t) (1000      * olsr_cnf->smart_gw_weight_exitlink_up  )) << SCALING_SHIFT) / exitUk;
40   costD = (((int64_t) (1000      * olsr_cnf->smart_gw_weight_exitlink_down)) << SCALING_SHIFT) / exitDk;
41   costE = (((int64_t) (path_cost * olsr_cnf->smart_gw_weight_etx          )) << SCALING_SHIFT) / olsr_cnf->smart_gw_divider_etx;
42
43   return (costU + costD + costE);
44 }
45
46 #ifdef __cplusplus
47 }
48 #endif /* __cplusplus */