diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2012-10-02 23:13:00 +0200 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2012-10-02 23:13:00 +0200 |
commit | 4a4482017978e360a0ae1ca7645e5e9e084c92b4 (patch) | |
tree | 2805b517bff7182ab3b180c6d68bca789df036ae /ffd/ffd.c | |
parent | e03169f8594f890162be16f72ea7000f802a252e (diff) | |
download | ffd-4a4482017978e360a0ae1ca7645e5e9e084c92b4.tar ffd-4a4482017978e360a0ae1ca7645e5e9e084c92b4.zip |
Add data structures to store announcements and partly implement updates
Diffstat (limited to 'ffd/ffd.c')
-rw-r--r-- | ffd/ffd.c | 52 |
1 files changed, 41 insertions, 11 deletions
@@ -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; |