Implement ACK request handling

This commit is contained in:
Matthias Schiffer 2013-03-21 03:07:51 +01:00
parent e099bddc24
commit 2d369f16e4
3 changed files with 52 additions and 0 deletions

View file

@ -87,6 +87,8 @@ static inline gp_babel_iface_t* gp_babel_get_iface(gmrf_context_t *ctx, gmrf_ifa
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_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_hellos(gmrf_t *gmrf, gmrf_context_t *ctx);
#endif /* _GMRF_PROTO_BABEL_BABEL_H_ */ #endif /* _GMRF_PROTO_BABEL_BABEL_H_ */

View file

@ -31,6 +31,30 @@
#include "tlv_types.h" #include "tlv_types.h"
static inline bool send_neigh(gmrf_t *gmrf, const gp_babel_neigh_t *neigh, const gp_babel_packet_t *packet) {
if (!neigh->iface)
return false;
if (!gmrf_iface_send(gmrf, neigh->iface->gmrf_iface, packet, gp_babel_packet_size(packet), &neigh->addr)) {
gmrf_logf(gmrf, LOG_WARNING, "gmrf_iface_send: %m");
return false;
}
return true;
}
void gp_babel_send_ack(gmrf_t *gmrf, gmrf_context_t *ctx, gp_babel_neigh_t *neigh, uint16_t nonce) {
gp_babel_packet_t *packet = alloca_packet(GP_BABEL_PACKET_MAX);
gp_babel_tlv_ack_t *ack = gp_babel_tlv_add(packet, GP_BABEL_PACKET_MAX, TLV_ACK, sizeof(gp_babel_tlv_ack_t));
if (!ack)
return;
ack->nonce = htons(nonce);
send_neigh(gmrf, neigh, packet);
}
static void add_ihus(gmrf_t *gmrf, gp_babel_packet_t *packet, size_t max_len, const gp_babel_iface_t *iface) { static void add_ihus(gmrf_t *gmrf, gp_babel_packet_t *packet, size_t max_len, const gp_babel_iface_t *iface) {
const gp_babel_neigh_t *neigh; const gp_babel_neigh_t *neigh;

View file

@ -43,6 +43,24 @@ static inline gp_babel_neigh_t* get_tlv_neigh(handle_tlv_arg_t *arg) {
return gp_babel_neigh_get(arg->iface, arg->source); return gp_babel_neigh_get(arg->iface, arg->source);
} }
static void handle_tlv_ack_req(gmrf_t *gmrf, gmrf_context_t *ctx, const gp_babel_tlv_ack_req_t *tlv_req, size_t len, handle_tlv_arg_t *arg) {
if (len < sizeof(gp_babel_tlv_ack_req_t)) {
gmrf_logf(gmrf, LOG_WARNING, "received short acknowledement request TLV.");
return;
}
gp_babel_send_ack(gmrf, ctx, get_tlv_neigh(arg), ntohs(tlv_req->nonce));
}
static void handle_tlv_ack(gmrf_t *gmrf, gmrf_context_t *ctx, const gp_babel_tlv_ack_t *tlv_ack, size_t len, handle_tlv_arg_t *arg) {
if (len < sizeof(gp_babel_tlv_ack_t)) {
gmrf_logf(gmrf, LOG_WARNING, "received short acknowledement TLV.");
return;
}
//gp_babel_ack_handle(ntohs(tlv_ack->nonce));
}
static void handle_tlv_hello(gmrf_t *gmrf, gmrf_context_t *ctx, const gp_babel_tlv_hello_t *tlv_hello, size_t len, handle_tlv_arg_t *arg) { static void handle_tlv_hello(gmrf_t *gmrf, gmrf_context_t *ctx, const gp_babel_tlv_hello_t *tlv_hello, size_t len, handle_tlv_arg_t *arg) {
if (len < sizeof(gp_babel_tlv_hello_t)) { if (len < sizeof(gp_babel_tlv_hello_t)) {
gmrf_logf(gmrf, LOG_WARNING, "received short hello TLV."); gmrf_logf(gmrf, LOG_WARNING, "received short hello TLV.");
@ -122,6 +140,14 @@ static void handle_tlv(gmrf_t *gmrf, gmrf_context_t *ctx, gp_babel_tlv_type_t ty
handle_tlv_arg_t *tlv_arg = arg; handle_tlv_arg_t *tlv_arg = arg;
switch (type) { switch (type) {
case TLV_ACK_REQ:
handle_tlv_ack_req(gmrf, ctx, data, len, tlv_arg);
return;
case TLV_ACK:
handle_tlv_ack(gmrf, ctx, data, len, tlv_arg);
return;
case TLV_HELLO: case TLV_HELLO:
handle_tlv_hello(gmrf, ctx, data, len, tlv_arg); handle_tlv_hello(gmrf, ctx, data, len, tlv_arg);
return; return;