From 14f32dfc31b65b730fe72d56c28d30222d3e7f2f Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sun, 24 Mar 2013 02:17:05 +0100 Subject: Add sending of updates --- src/babel.h | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'src/babel.h') 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); -- cgit v1.2.3