summaryrefslogtreecommitdiffstats
path: root/ffd/ffd.c
diff options
context:
space:
mode:
Diffstat (limited to 'ffd/ffd.c')
-rw-r--r--ffd/ffd.c52
1 files changed, 41 insertions, 11 deletions
diff --git a/ffd/ffd.c b/ffd/ffd.c
index c4ddb5b..879d710 100644
--- a/ffd/ffd.c
+++ b/ffd/ffd.c
@@ -51,14 +51,11 @@ static char *mesh = "bat0";
int sockfd;
struct timespec now;
-ffd_iface_t *iface_list = NULL;
+ffd_node_id_t self;
-static ffd_neigh_t self;
-//static ffd_orig_t own_data;
+ffd_iface_t *iface_list = NULL;
-/* neighs and origs that have been changed must be moved to front */
-//static ffd_neigh_t *neigh_data = NULL;
-//static ffd_orig_t *orig_data = NULL;
+ffd_announce_t *announce_list = NULL;
static inline bool use_netif(const char *ifname) {
@@ -87,13 +84,27 @@ static bool init_self() {
if (is_eth_addr_unspec(&primary_addr))
return false;
- memset(&self, 0, sizeof(self));
- //memset(&own_data, 0, sizeof(own_data));
+ self.id[0] = primary_addr.d[0]^0x02;
+ self.id[1] = primary_addr.d[1];
+ self.id[2] = primary_addr.d[2];
+ self.id[3] = 0xff;
+ self.id[4] = 0xfe;
+ self.id[5] = primary_addr.d[3];
+ self.id[6] = primary_addr.d[4];
+ self.id[7] = primary_addr.d[5];
+
+ ffd_announce_t *announce = announce_list = calloc(1, sizeof(ffd_announce_t));
+
+ announce->node = self;
+ announce->type = 1;
+ announce->key = 1337;
+ announce->interval = 6000;
- //self.addr = own_data.addr = primary_addr;
+ ffd_nexthop_t *nexthop = announce->nexthop_list = malloc(sizeof(ffd_nexthop_t));
- //random_bytes(&self.rev, sizeof(self.rev));
- //random_bytes(&own_data.rev, sizeof(own_data.rev));
+ nexthop->addr = ETH_ADDR_UNSPEC;
+ nexthop->metric_seqno.metric = 0;
+ nexthop->metric_seqno.seqno = 0;
return true;
}
@@ -246,6 +257,21 @@ static void handle_tlv_ihu(const ffd_tlv_ihu_t *tlv_ihu, size_t len, const eth_a
fprintf(stderr, "debug: accepted IHU, txcost is %u, cost is %u now.\n", neigh->txcost, ffd_neigh_get_cost(neigh));
}
+static void handle_tlv_announce_req(const ffd_tlv_announce_req_t *tlv_req, size_t len, const eth_addr_t *addr, ffd_iface_t *iface) {
+ if (len < sizeof(ffd_tlv_announce_req_t)) {
+ fprintf(stderr, "warn: received short announce request TLV.\n");
+ return;
+ }
+
+ ffd_announce_t *announce = NULL;
+
+ if (!ffd_is_node_id_unspec(&tlv_req->node)) {
+ announce = NULL;
+ }
+
+ ffd_send_update(iface, ffd_neigh_get(iface, addr), announce);
+}
+
static void handle_tlv(ffd_tlv_type_t type, const void *data, size_t len, void *arg) {
const struct sockaddr_ll *from = arg;
const eth_addr_t *addr = (const eth_addr_t*)from->sll_addr;
@@ -263,6 +289,10 @@ static void handle_tlv(ffd_tlv_type_t type, const void *data, size_t len, void *
handle_tlv_ihu(data, len, addr, iface);
return;
+ case TLV_ANNOUNCE_REQ:
+ handle_tlv_announce_req(data, len, addr, iface);
+ return;
+
default:
fprintf(stderr, "debug: received unknown TLV %u on %s.\n", type, iface->name);
return;