summaryrefslogtreecommitdiffstats
path: root/src/babel.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/babel.h')
-rw-r--r--src/babel.h33
1 files changed, 33 insertions, 0 deletions
diff --git a/src/babel.h b/src/babel.h
index 3385ec1..5870364 100644
--- a/src/babel.h
+++ b/src/babel.h
@@ -29,11 +29,16 @@
#include "types.h"
+
+#define GP_BABEL_INFINITY 0xffff
+
#define GP_BABEL_PACKET_MAX 1000
#define GP_BABEL_HELLO_INTERVAL 400
#define GP_BABEL_IHU_INTERVAL (3*GP_BABEL_HELLO_INTERVAL)
+#define GP_BABEL_UPDATE_INTERVAL 3000
+
#define GP_BABEL_HELLO_TIMEOUT(interval) (16*(interval))
#define GP_BABEL_IHU_TIMEOUT(interval) ((interval)*7/2)
@@ -110,11 +115,39 @@ static inline gp_babel_iface_t* gp_babel_get_iface(gmrf_context_t *ctx, gmrf_ifa
}
+static inline bool gp_babel_is_metric_better(gp_babel_metric_seqno_t ms1, gp_babel_metric_seqno_t ms2) {
+ if (ms1.metric == GP_BABEL_INFINITY)
+ return false;
+
+ if (ms2.metric == GP_BABEL_INFINITY)
+ return true;
+
+ int16_t seqno_diff = ms2.seqno - ms1.seqno;
+
+ if (seqno_diff < 0)
+ return true;
+ if (seqno_diff == 0 && ms1.metric < ms2.metric)
+ return true;
+
+ return false;
+}
+
+static inline bool gp_babel_is_feasible(const gp_babel_announce_t *announce, gp_babel_metric_seqno_t ms) {
+ if (ms.metric == GP_BABEL_INFINITY)
+ return true;
+
+ return gp_babel_is_metric_better(ms, announce->feasibility_distance);
+}
+
+
void gp_babel_handle_packet(gmrf_t *gmrf, gmrf_context_t *ctx, gp_babel_iface_t *iface, const gmrf_addr_t *source, const gp_babel_packet_t *packet);
void gp_babel_send_ack(gmrf_t *gmrf, gmrf_context_t *ctx, gp_babel_neigh_t *neigh, uint16_t nonce);
void gp_babel_send_hellos(gmrf_t *gmrf, gmrf_context_t *ctx);
+void gp_babel_send_update(gmrf_t *gmrf, gmrf_context_t *ctx, gp_babel_iface_t *iface, gp_babel_neigh_t *neigh, gp_babel_announce_t *announce, bool with_data);
+
+
gp_babel_announce_t* gp_babel_announce_new(gmrf_t *gmrf, gmrf_context_t *ctx);
gp_babel_announce_t* gp_babel_announce_find(gmrf_t *gmrf, gmrf_context_t *ctx, const gp_babel_node_id_t *node, uint16_t type, uint16_t key);
gp_babel_announce_t* gp_babel_announce_get(gmrf_t *gmrf, gmrf_context_t *ctx, const gp_babel_node_id_t *node, uint16_t type, uint16_t key);