More work on DLEP and layer2 database
authorHenning Rogge <henning.rogge@fkie.fraunhofer.de>
Thu, 21 Sep 2017 08:05:45 +0000 (10:05 +0200)
committerHenning Rogge <henning.rogge@fkie.fraunhofer.de>
Thu, 21 Sep 2017 08:05:45 +0000 (10:05 +0200)
20 files changed:
src-plugins/generic/dlep/dlep_extension.c
src-plugins/generic/dlep/dlep_reader.c
src-plugins/generic/dlep/dlep_writer.c
src-plugins/generic/dlep/ext_base_ip/ip.c
src-plugins/generic/dlep/ext_l1_statistics/l1_statistics.c
src-plugins/generic/dlep/router/dlep_router_interface.c
src-plugins/generic/eth_listener/eth_listener.c
src-plugins/generic/layer2_config/layer2_config.c
src-plugins/generic/layer2_generator/layer2_generator.c
src-plugins/generic/layer2info/layer2info.c
src-plugins/generic/link_config/link_config.c
src-plugins/generic/nl80211_listener/nl80211_get_interface.c
src-plugins/generic/nl80211_listener/nl80211_get_station_dump.c
src-plugins/generic/nl80211_listener/nl80211_get_wiphy.c
src-plugins/generic/nl80211_listener/nl80211_listener.c
src-plugins/generic/nl80211_listener/nl80211_listener.h
src-plugins/nhdp/ff_dat_metric/ff_dat_metric.c
src-plugins/nhdp/neighbor_probing/neighbor_probing.c
src-plugins/subsystems/oonf_layer2.c
src-plugins/subsystems/oonf_layer2.h

index 5b22ce9..3cb6a07 100644 (file)
@@ -275,9 +275,9 @@ dlep_extension_radio_write_session_init_ack(
     l2data = &l2net->neighdata[ext->neigh_mapping[i].layer2];
 
 
-    if (!oonf_layer2_has_value(l2data)) {
+    if (!oonf_layer2_data_has_value(l2data)) {
       oonf_layer2_data_set_int64(l2data, session->l2_origin,
-          oonf_layer2_get_neigh_metadata(ext->neigh_mapping[i].layer2),
+          oonf_layer2_neigh_metadata_get(ext->neigh_mapping[i].layer2),
           ext->neigh_mapping[i].default_value);
     }
   }
@@ -290,9 +290,9 @@ dlep_extension_radio_write_session_init_ack(
 
     l2data = &l2net->data[ext->if_mapping[i].layer2];
 
-    if (!oonf_layer2_has_value(l2data)) {
+    if (!oonf_layer2_data_has_value(l2data)) {
       oonf_layer2_data_set_int64(l2data, session->l2_origin,
-          oonf_layer2_get_net_metadata(ext->if_mapping[i].layer2),
+          oonf_layer2_net_metadata_get(ext->if_mapping[i].layer2),
           ext->if_mapping[i].default_value);
     }
   }
index c906a22..b15bb6a 100644 (file)
@@ -515,7 +515,7 @@ dlep_reader_map_l2neigh_data(struct oonf_layer2_data *data,
     map = &ext->neigh_mapping[i];
 
     if (map->from_tlv(&data[map->layer2],
-        oonf_layer2_get_neigh_metadata(map->layer2), session, map->dlep)) {
+        oonf_layer2_neigh_metadata_get(map->layer2), session, map->dlep)) {
       return -(i+1);
     }
   }
@@ -542,7 +542,7 @@ dlep_reader_map_l2net_data(struct oonf_layer2_data *data,
     map = &ext->if_mapping[i];
 
     if (map->from_tlv(&data[map->layer2],
-        oonf_layer2_get_net_metadata(map->layer2), session, map->dlep)) {
+        oonf_layer2_net_metadata_get(map->layer2), session, map->dlep)) {
       return -(i+1);
     }
   }
index cbad0d1..12998ed 100644 (file)
@@ -396,17 +396,17 @@ dlep_writer_map_identity(struct dlep_writer *writer,
     /* bad data type */
     return -1;
   }
-  if (!oonf_layer2_has_value(data)) {
+  if (!oonf_layer2_data_has_value(data)) {
     /* no data available */
     return 0;
   }
 
   switch (oonf_layer2_data_get_type(data)) {
     case OONF_LAYER2_INTEGER_DATA:
-      l2value64 = oonf_layer2_get_int64(data);
+      l2value64 = oonf_layer2_data_get_int64(data);
       break;
     case OONF_LAYER2_BOOLEAN_DATA:
-      l2value64 = oonf_layer2_get_boolean(data) ? 1 : 0;
+      l2value64 = oonf_layer2_data_get_boolean(data) ? 1 : 0;
       break;
     default:
       return -1;
@@ -460,12 +460,12 @@ dlep_writer_map_l2neigh_data(struct dlep_writer *writer,
     map = &ext->neigh_mapping[i];
 
     ptr = &data[map->layer2];
-    if (!oonf_layer2_has_value(ptr) && def) {
+    if (!oonf_layer2_data_has_value(ptr) && def) {
       ptr = &def[map->layer2];
     }
 
     if (map->to_tlv(writer, ptr,
-        oonf_layer2_get_neigh_metadata(map->layer2),
+        oonf_layer2_neigh_metadata_get(map->layer2),
         map->dlep, map->length)) {
       return -(i+1);
     }
@@ -493,7 +493,7 @@ dlep_writer_map_l2net_data(struct dlep_writer *writer,
     map = &ext->if_mapping[i];
 
     if (map->to_tlv(writer, &data[map->layer2],
-        oonf_layer2_get_net_metadata(map->layer2),
+        oonf_layer2_net_metadata_get(map->layer2),
         map->dlep, map->length)) {
       return -(i+1);
     }
index 5d6c1a6..ab81ceb 100644 (file)
@@ -192,26 +192,19 @@ void _cb_session_init(struct dlep_session *session) {
   struct oonf_layer2_net *l2net;
   struct dlep_local_neighbor *dlep_neighbor;
 
-  struct netaddr_str nbuf;
-
-  fprintf(stderr, "1\n");
   l2net = oonf_layer2_net_get(session->l2_listener.name);
   if (!l2net) {
     return;
   }
 
-  fprintf(stderr, "2\n");
-  avl_for_each_element(&l2net->local_peer_ips, l2net_ip, _node) {
+  avl_for_each_element(&l2net->local_peer_ips, l2net_ip, _net_node) {
     _add_prefix(&session->_ip_prefix_modification, &l2net_ip->ip, true);
-    fprintf(stderr, "3: %s\n", netaddr_to_string(&nbuf, &l2net_ip->ip));
   }
 
   avl_for_each_element(&l2net->neighbors, l2neigh, _node) {
     dlep_neighbor = dlep_session_add_local_neighbor(session, &l2neigh->addr);
-    fprintf(stderr, "4: %s\n", netaddr_to_string(&nbuf, &l2neigh->addr));
     if (dlep_neighbor) {
-      avl_for_each_element(&l2neigh->remote_neighbor_ips, l2neigh_ip, _node) {
-        fprintf(stderr, "5: %s\n", netaddr_to_string(&nbuf, &l2neigh_ip->ip));
+      avl_for_each_element(&l2neigh->remote_neighbor_ips, l2neigh_ip, _neigh_node) {
         _add_prefix(&dlep_neighbor->_ip_prefix_modification, &l2neigh_ip->ip, true);
       }
     }
index 260d1a3..0bef244 100644 (file)
@@ -317,7 +317,7 @@ dlep_reader_map_array(struct oonf_layer2_data *data,
   /* copy into signed integer and set to l2 value */
   memcpy(&l2value, &tmp64[0], 8);
   oonf_layer2_data_set_int64(data, session->l2_origin,
-      oonf_layer2_get_net_metadata(l2idx), l2value);
+      oonf_layer2_net_metadata_get(l2idx), l2value);
 
   if (value->length == 16) {
     switch (l2idx) {
@@ -411,15 +411,14 @@ dlep_writer_map_array(struct dlep_writer *writer,
         return -1;
     }
 
-    if (oonf_layer2_has_value(data2)) {
-      l2value = oonf_layer2_get_int64(data2);
+    if (!oonf_layer2_data_read_int64(&l2value, data2)) {
       memcpy(&tmp64[1], &l2value, 8);
       tmp64[1] = htobe64(tmp64[1]);
       length = 16;
     }
   }
 
-  l2value = oonf_layer2_get_int64(data);
+  l2value = oonf_layer2_data_get_int64(data);
   memcpy(&tmp64[0], &l2value, 8);
   tmp64[0] = htobe64(tmp64[0]);
 
index bb58a5b..95201a7 100644 (file)
@@ -108,7 +108,7 @@ dlep_router_interface_init(void) {
 
   _shutting_down = false;
 
-  oonf_layer2_add_origin(&_l2_origin);
+  oonf_layer2_origin_add(&_l2_origin);
 }
 
 /**
@@ -128,7 +128,7 @@ dlep_router_interface_cleanup(void) {
   dlep_base_ip_cleanup();
   dlep_router_session_cleanup();
   dlep_extension_cleanup();
-  oonf_layer2_remove_origin(&_l2_origin);
+  oonf_layer2_origin_remove(&_l2_origin);
 }
 
 /**
index a82c104..ba831d0 100644 (file)
@@ -144,14 +144,14 @@ _init(void) {
   }
 
   oonf_timer_add(&_transmission_timer_info);
-  oonf_layer2_add_origin(&_l2_origin);
+  oonf_layer2_origin_add(&_l2_origin);
 
   return 0;
 }
 
 static void
 _cleanup(void) {
-  oonf_layer2_remove_origin(&_l2_origin);
+  oonf_layer2_origin_remove(&_l2_origin);
 
   oonf_timer_stop(&_transmission_timer);
   oonf_timer_remove(&_transmission_timer_info);
@@ -227,9 +227,9 @@ _cb_transmission_event(struct oonf_timer_instance *ptr __attribute((unused))) {
         isonumber_from_s64(&ibuf, ethspeed, "bit/s", 0, false, false));
 
     oonf_layer2_data_set_int64(&l2net->neighdata[OONF_LAYER2_NEIGH_RX_BITRATE],
-        &_l2_origin, oonf_layer2_get_neigh_metadata(OONF_LAYER2_NEIGH_RX_BITRATE), ethspeed);
+        &_l2_origin, oonf_layer2_neigh_metadata_get(OONF_LAYER2_NEIGH_RX_BITRATE), ethspeed);
     oonf_layer2_data_set_int64(&l2net->neighdata[OONF_LAYER2_NEIGH_TX_BITRATE],
-        &_l2_origin, oonf_layer2_get_neigh_metadata(OONF_LAYER2_NEIGH_TX_BITRATE), ethspeed);
+        &_l2_origin, oonf_layer2_neigh_metadata_get(OONF_LAYER2_NEIGH_TX_BITRATE), ethspeed);
   }
 }
 
index df15e3b..d998c83 100644 (file)
@@ -224,8 +224,8 @@ static struct oonf_timer_class _reconfigure_timer = {
  */
 static int
 _init(void) {
-  oonf_layer2_add_origin(&_l2_origin_current);
-  oonf_layer2_add_origin(&_l2_origin_old);
+  oonf_layer2_origin_add(&_l2_origin_current);
+  oonf_layer2_origin_add(&_l2_origin_old);
 
   oonf_class_extension_add(&_l2net_listener);
   oonf_class_extension_add(&_l2neigh_listener);
@@ -251,8 +251,8 @@ _cleanup(void) {
   oonf_class_extension_remove(&_l2net_listener);
   oonf_class_extension_remove(&_l2neigh_listener);
 
-  oonf_layer2_remove_origin(&_l2_origin_current);
-  oonf_layer2_remove_origin(&_l2_origin_old);
+  oonf_layer2_origin_remove(&_l2_origin_current);
+  oonf_layer2_origin_remove(&_l2_origin_old);
 }
 
 /**
@@ -371,7 +371,7 @@ _cb_validate_l2netdata(const struct cfg_schema_entry *entry,
 
   /* search for network metadata index */
   for (idx = 0; idx < OONF_LAYER2_NET_COUNT; idx++) {
-    if ((ptr = str_hasnextword(value, oonf_layer2_get_net_metadata(idx)->key))) {
+    if ((ptr = str_hasnextword(value, oonf_layer2_net_metadata_get(idx)->key))) {
       break;
     }
   }
@@ -386,8 +386,8 @@ _cb_validate_l2netdata(const struct cfg_schema_entry *entry,
   /* test if second word is a human readable number */
   if (cfg_validate_int(out, section_name, entry->key.entry, ptr,
       INT64_MIN, INT64_MAX, 8,
-      oonf_layer2_get_net_metadata(idx)->fraction,
-      oonf_layer2_get_net_metadata(idx)->binary)) {
+      oonf_layer2_net_metadata_get(idx)->fraction,
+      oonf_layer2_net_metadata_get(idx)->binary)) {
     return -1;
   }
   return 0;
@@ -411,7 +411,7 @@ _cb_validate_l2defdata(const struct cfg_schema_entry *entry,
 
   /* search for network metadata index */
   for (idx = 0; idx < OONF_LAYER2_NEIGH_COUNT; idx++) {
-    if ((ptr = str_hasnextword(value, oonf_layer2_get_neigh_metadata(idx)->key))) {
+    if ((ptr = str_hasnextword(value, oonf_layer2_neigh_metadata_get(idx)->key))) {
       break;
     }
   }
@@ -426,8 +426,8 @@ _cb_validate_l2defdata(const struct cfg_schema_entry *entry,
   /* test if second word is a human readable number */
   if (cfg_validate_int(out, section_name, entry->key.entry, ptr,
       INT64_MIN, INT64_MAX, 8,
-      oonf_layer2_get_neigh_metadata(idx)->fraction,
-      oonf_layer2_get_neigh_metadata(idx)->binary)) {
+      oonf_layer2_neigh_metadata_get(idx)->fraction,
+      oonf_layer2_neigh_metadata_get(idx)->binary)) {
     return -1;
   }
   return 0;
@@ -453,7 +453,7 @@ _cb_validate_l2neighdata(const struct cfg_schema_entry *entry,
 
   /* search for network metadata index */
   for (idx = 0; idx < OONF_LAYER2_NEIGH_COUNT; idx++) {
-    if ((ptr = str_hasnextword(value, oonf_layer2_get_neigh_metadata(idx)->key))) {
+    if ((ptr = str_hasnextword(value, oonf_layer2_neigh_metadata_get(idx)->key))) {
       break;
     }
   }
@@ -469,8 +469,8 @@ _cb_validate_l2neighdata(const struct cfg_schema_entry *entry,
   ptr = str_cpynextword(sbuf.buf, ptr, sizeof(sbuf));
   if (cfg_validate_int(out, section_name, entry->key.entry, sbuf.buf,
       INT64_MIN, INT64_MAX, 8,
-      oonf_layer2_get_neigh_metadata(idx)->fraction,
-      oonf_layer2_get_neigh_metadata(idx)->binary)) {
+      oonf_layer2_neigh_metadata_get(idx)->fraction,
+      oonf_layer2_neigh_metadata_get(idx)->binary)) {
     return -1;
   }
 
@@ -551,7 +551,7 @@ _parse_l2net_config(struct l2_config_data *storage, const char *value) {
 
   /* search for network metadata index */
   for (idx = 0; idx < OONF_LAYER2_NET_COUNT; idx++) {
-    if ((ptr = str_hasnextword(value, oonf_layer2_get_net_metadata(idx)->key))) {
+    if ((ptr = str_hasnextword(value, oonf_layer2_net_metadata_get(idx)->key))) {
       break;
     }
   }
@@ -560,7 +560,7 @@ _parse_l2net_config(struct l2_config_data *storage, const char *value) {
     return -1;
   }
 
-  meta = oonf_layer2_get_net_metadata(idx);
+  meta = oonf_layer2_net_metadata_get(idx);
   storage->data_idx = idx;
 
   return oonf_layer2_data_parse_string(&storage->data, meta, ptr);
@@ -593,7 +593,7 @@ _parse_l2neigh_config(struct l2_config_data *storage, const char *value) {
 
   /* search for network metadata index */
   for (idx = 0; idx < OONF_LAYER2_NEIGH_COUNT; idx++) {
-    if ((ptr = str_hasnextword(value, oonf_layer2_get_neigh_metadata(idx)->key))) {
+    if ((ptr = str_hasnextword(value, oonf_layer2_neigh_metadata_get(idx)->key))) {
       break;
     }
   }
@@ -606,7 +606,7 @@ _parse_l2neigh_config(struct l2_config_data *storage, const char *value) {
 
   /* convert number */
   ptr = str_cpynextword(sbuf.buf, ptr, sizeof(sbuf));
-  if (oonf_layer2_data_parse_string(&storage->data, oonf_layer2_get_neigh_metadata(idx), sbuf.buf)) {
+  if (oonf_layer2_data_parse_string(&storage->data, oonf_layer2_neigh_metadata_get(idx), sbuf.buf)) {
     return -1;
   }
 
@@ -677,7 +677,7 @@ _configure_if_data(struct l2_config_if_data *if_data) {
       switch (entry->type) {
         case L2_NET:
           oonf_layer2_data_set(&l2net->data[entry->data_idx],
-              &_l2_origin_current, oonf_layer2_get_net_metadata(entry->data_idx), &entry->data);
+              &_l2_origin_current, oonf_layer2_net_metadata_get(entry->data_idx), &entry->data);
           break;
         case L2_NET_IP:
           oonf_layer2_net_add_ip(l2net,
@@ -685,13 +685,13 @@ _configure_if_data(struct l2_config_if_data *if_data) {
           break;
         case L2_DEF:
           oonf_layer2_data_set(&l2net->neighdata[entry->data_idx],
-              &_l2_origin_current, oonf_layer2_get_neigh_metadata(entry->data_idx), &entry->data);
+              &_l2_origin_current, oonf_layer2_neigh_metadata_get(entry->data_idx), &entry->data);
           break;
         case L2_NEIGH:
           l2neigh = oonf_layer2_neigh_add(l2net, &entry->mac);
           if (l2neigh) {
             oonf_layer2_data_set(&l2neigh->data[entry->data_idx],
-                &_l2_origin_current, oonf_layer2_get_neigh_metadata(entry->data_idx), &entry->data);
+                &_l2_origin_current, oonf_layer2_neigh_metadata_get(entry->data_idx), &entry->data);
           }
           break;
         case L2_NEIGH_IP:
@@ -736,7 +736,7 @@ _cb_valhelp_l2net(const struct cfg_schema_entry *entry __attribute((unused)),
 
   for (i=0; i<OONF_LAYER2_NET_COUNT; i++) {
     abuf_appendf(out, "        %s\n",
-        oonf_layer2_get_net_metadata(i)->key);
+        oonf_layer2_net_metadata_get(i)->key);
   }
 
   abuf_puts(out, "    <value> is an numeric value (with optional iso prefix)\n");
@@ -780,7 +780,7 @@ _create_neigh_help(struct autobuf *out, bool mac) {
 
   for (i=0; i<OONF_LAYER2_NEIGH_COUNT; i++) {
     abuf_appendf(out, "        %s\n",
-        oonf_layer2_get_neigh_metadata(i)->key);
+        oonf_layer2_neigh_metadata_get(i)->key);
   }
 
   abuf_puts(out, "    <value> is an numeric value (with optional iso prefix)\n");
index b3c74d7..3b3c325 100644 (file)
@@ -160,7 +160,7 @@ static int
 _init(void) {
   memset(&_l2gen_config, 0, sizeof(_l2gen_config));
 
-  oonf_layer2_add_origin(&_origin);
+  oonf_layer2_origin_add(&_origin);
   oonf_timer_add(&_l2gen_timer_info);
   oonf_timer_start(&_l2gen_timer, 5000);
   return 0;
@@ -171,7 +171,7 @@ _init(void) {
  */
 static void
 _cleanup(void) {
-  oonf_layer2_remove_origin(&_origin);
+  oonf_layer2_origin_remove(&_origin);
   oonf_timer_stop(&_l2gen_timer);
   oonf_timer_remove(&_l2gen_timer_info);
 }
@@ -215,11 +215,11 @@ _cb_l2gen_event(struct oonf_timer_instance *ptr __attribute((unused))) {
 
   for (net_idx=0; net_idx<OONF_LAYER2_NET_COUNT; net_idx++) {
     oonf_layer2_data_set_int64(&net->data[net_idx], &_origin,
-        oonf_layer2_get_net_metadata(net_idx), event_counter);
+        oonf_layer2_net_metadata_get(net_idx), event_counter);
   }
   for (neigh_idx=0; neigh_idx<OONF_LAYER2_NEIGH_COUNT; neigh_idx++) {
     oonf_layer2_data_set_int64(&net->neighdata[neigh_idx], &_origin,
-        oonf_layer2_get_neigh_metadata(neigh_idx), event_counter);
+        oonf_layer2_neigh_metadata_get(neigh_idx), event_counter);
   }
 
   if (oonf_layer2_net_commit(net)) {
@@ -243,7 +243,7 @@ _cb_l2gen_event(struct oonf_timer_instance *ptr __attribute((unused))) {
 
   for (neigh_idx = 0; neigh_idx < OONF_LAYER2_NEIGH_COUNT; neigh_idx++) {
     oonf_layer2_data_set_int64(&neigh->data[neigh_idx], &_origin,
-        oonf_layer2_get_neigh_metadata(neigh_idx), event_counter);
+        oonf_layer2_neigh_metadata_get(neigh_idx), event_counter);
   }
   oonf_layer2_neigh_commit(neigh);
 }
@@ -263,10 +263,10 @@ _cb_config_changed(void) {
       _l2gen_config.active ? "active" : "inactive", _l2gen_config.interface);
   
   if (!oonf_layer2_origin_is_added(&_origin) && _l2gen_config.active) {
-    oonf_layer2_add_origin(&_origin);
+    oonf_layer2_origin_add(&_origin);
   }
   else if (oonf_layer2_origin_is_added(&_origin) && !_l2gen_config.active) {
-    oonf_layer2_remove_origin(&_origin);
+    oonf_layer2_origin_remove(&_origin);
   }
   
   /* set new interval */
index 44aaae1..3b98724 100644 (file)
@@ -346,7 +346,7 @@ _init(void) {
     _tde_if_data[i].string = true;
 
     abuf_puts(&_key_storage, KEY_IF_PREFIX);
-    abuf_puts(&_key_storage, oonf_layer2_get_net_metadata(i)->key);
+    abuf_puts(&_key_storage, oonf_layer2_net_metadata_get(i)->key);
     abuf_memcpy(&_key_storage, "\0", 1);
 
     _tde_if_origin[i].key =
@@ -355,7 +355,7 @@ _init(void) {
     _tde_if_origin[i].string = true;
 
     abuf_puts(&_key_storage, KEY_IF_PREFIX);
-    abuf_puts(&_key_storage, oonf_layer2_get_net_metadata(i)->key);
+    abuf_puts(&_key_storage, oonf_layer2_net_metadata_get(i)->key);
     abuf_puts(&_key_storage, KEY_ORIGIN_SUFFIX);
     abuf_memcpy(&_key_storage, "\0", 1);
   }
@@ -367,7 +367,7 @@ _init(void) {
     _tde_neigh_data[i].string = true;
 
     abuf_puts(&_key_storage, KEY_NEIGH_PREFIX);
-    abuf_puts(&_key_storage, oonf_layer2_get_neigh_metadata(i)->key);
+    abuf_puts(&_key_storage, oonf_layer2_neigh_metadata_get(i)->key);
     abuf_memcpy(&_key_storage, "\0", 1);
 
     _tde_neigh_origin[i].key =
@@ -376,7 +376,7 @@ _init(void) {
     _tde_neigh_origin[i].string = true;
 
     abuf_puts(&_key_storage, KEY_NEIGH_PREFIX);
-    abuf_puts(&_key_storage, oonf_layer2_get_neigh_metadata(i)->key);
+    abuf_puts(&_key_storage, oonf_layer2_neigh_metadata_get(i)->key);
     abuf_puts(&_key_storage, KEY_ORIGIN_SUFFIX);
     abuf_memcpy(&_key_storage, "\0", 1);
   }
@@ -432,7 +432,7 @@ _initialize_if_values(struct oonf_layer2_net *net) {
   snprintf(_value_if_index, sizeof(_value_if_index), "%u", os_if->index);
   strscpy(_value_if_ident, net->if_ident, sizeof(_value_if_ident));
   netaddr_to_string(&_value_if_local_addr, &os_if->mac);
-  strscpy(_value_if_type, oonf_layer2_get_network_type(net->if_type), IF_NAMESIZE);
+  strscpy(_value_if_type, oonf_layer2_net_get_type_name(net->if_type), IF_NAMESIZE);
   strscpy(_value_if_dlep, json_getbool(net->if_dlep), TEMPLATE_JSON_BOOL_LENGTH);
 
   if (net->last_seen) {
@@ -484,8 +484,8 @@ _initialize_if_origin_values(struct oonf_layer2_data *data) {
   memset(_value_if_origin, 0, sizeof(_value_if_origin));
 
   for (i=0; i<OONF_LAYER2_NET_COUNT; i++) {
-    if (oonf_layer2_has_value(&data[i])) {
-      strscpy(_value_if_origin[i], oonf_layer2_get_origin(&data[i])->name, IF_NAMESIZE);
+    if (oonf_layer2_data_has_value(&data[i])) {
+      strscpy(_value_if_origin[i], oonf_layer2_data_get_origin(&data[i])->name, IF_NAMESIZE);
     }
   }
 }
@@ -547,8 +547,8 @@ _initialize_neigh_origin_values(struct oonf_layer2_data *data) {
   memset(_value_neigh_origin, 0, sizeof(_value_neigh_origin));
 
   for (i=0; i<OONF_LAYER2_NEIGH_COUNT; i++) {
-    if (oonf_layer2_has_value(&data[i])) {
-      strscpy(_value_neigh_origin[i], oonf_layer2_get_origin(&data[i])->name, IF_NAMESIZE);
+    if (oonf_layer2_data_has_value(&data[i])) {
+      strscpy(_value_neigh_origin[i], oonf_layer2_data_get_origin(&data[i])->name, IF_NAMESIZE);
     }
   }
 }
@@ -572,7 +572,7 @@ static int
 _cb_create_text_interface(struct oonf_viewer_template *template) {
   struct oonf_layer2_net *net;
 
-  avl_for_each_element(oonf_layer2_get_network_tree(), net, _node) {
+  avl_for_each_element(oonf_layer2_get_net_tree(), net, _node) {
     _initialize_if_values(net);
     _initialize_if_data_values(template, net->data);
     _initialize_if_origin_values(net->data);
@@ -593,10 +593,10 @@ _cb_create_text_interface_ip(struct oonf_viewer_template *template) {
   struct oonf_layer2_net *net;
   struct oonf_layer2_peer_address *peer_ip;
 
-  avl_for_each_element(oonf_layer2_get_network_tree(), net, _node) {
+  avl_for_each_element(oonf_layer2_get_net_tree(), net, _node) {
     _initialize_if_values(net);
 
-    avl_for_each_element(&net->local_peer_ips, peer_ip, _node) {
+    avl_for_each_element(&net->local_peer_ips, peer_ip, _net_node) {
       _initialize_if_ip_values(peer_ip);
 
       /* generate template output */
@@ -616,7 +616,7 @@ _cb_create_text_neighbor(struct oonf_viewer_template *template) {
   struct oonf_layer2_neigh *neigh;
   struct oonf_layer2_net *net;
 
-  avl_for_each_element(oonf_layer2_get_network_tree(), net, _node) {
+  avl_for_each_element(oonf_layer2_get_net_tree(), net, _node) {
     _initialize_if_values(net);
 
     avl_for_each_element(&net->neighbors, neigh, _node) {
@@ -642,13 +642,13 @@ _cb_create_text_neighbor_ip(struct oonf_viewer_template *template) {
   struct oonf_layer2_neigh *neigh;
   struct oonf_layer2_net *net;
 
-  avl_for_each_element(oonf_layer2_get_network_tree(), net, _node) {
+  avl_for_each_element(oonf_layer2_get_net_tree(), net, _node) {
     _initialize_if_values(net);
 
     avl_for_each_element(&net->neighbors, neigh, _node) {
       _initialize_neigh_values(neigh);
 
-      avl_for_each_element(&neigh->remote_neighbor_ips, remote_ip, _node) {
+      avl_for_each_element(&neigh->remote_neighbor_ips, remote_ip, _neigh_node) {
         _initialize_neigh_ip_values(remote_ip);
 
         /* generate template output */
@@ -669,7 +669,7 @@ static int
 _cb_create_text_default(struct oonf_viewer_template *template) {
   struct oonf_layer2_net *net;
 
-  avl_for_each_element(oonf_layer2_get_network_tree(), net, _node) {
+  avl_for_each_element(oonf_layer2_get_net_tree(), net, _node) {
     _initialize_if_values(net);
     _initialize_neigh_data_values(template, net->neighdata);
     _initialize_neigh_origin_values(net->neighdata);
@@ -691,7 +691,7 @@ _cb_create_text_dst(struct oonf_viewer_template *template) {
   struct oonf_layer2_neigh *neigh;
   struct oonf_layer2_net *net;
 
-  avl_for_each_element(oonf_layer2_get_network_tree(), net, _node) {
+  avl_for_each_element(oonf_layer2_get_net_tree(), net, _node) {
     _initialize_if_values(net);
 
     avl_for_each_element(&net->neighbors, neigh, _node) {
index 53991ba..dcfeecb 100644 (file)
@@ -166,7 +166,7 @@ _early_cfg_init(void) {
 
   for (i=0; i<ARRAYSIZE(_link_config_if_entries); i++) {
     entry = &_link_config_if_entries[i];
-    entry->key.entry = oonf_layer2_get_neigh_metadata(
+    entry->key.entry = oonf_layer2_neigh_metadata_get(
         (enum oonf_layer2_neighbor_index)
         entry->validate_param[0].i32[0])->key;
   }
@@ -178,8 +178,8 @@ _early_cfg_init(void) {
  */
 static int
 _init(void) {
-  oonf_layer2_add_origin(&_l2_origin_current);
-  oonf_layer2_add_origin(&_l2_origin_old);
+  oonf_layer2_origin_add(&_l2_origin_current);
+  oonf_layer2_origin_add(&_l2_origin_old);
 
   oonf_class_extension_add(&_l2net_listener);
   oonf_class_extension_add(&_l2neigh_listener);
@@ -200,8 +200,8 @@ _cleanup(void) {
   oonf_class_extension_remove(&_l2net_listener);
   oonf_class_extension_remove(&_l2neigh_listener);
 
-  oonf_layer2_remove_origin(&_l2_origin_current);
-  oonf_layer2_remove_origin(&_l2_origin_old);
+  oonf_layer2_origin_remove(&_l2_origin_current);
+  oonf_layer2_origin_remove(&_l2_origin_old);
 }
 
 /**
@@ -251,8 +251,8 @@ _cb_validate_linkdata(const struct cfg_schema_entry *entry,
   ptr = str_cpynextword(sbuf.buf, value, sizeof(sbuf));
   if (cfg_validate_int(out, section_name, entry->key.entry, sbuf.buf,
       INT64_MIN, INT64_MAX, 8,
-      oonf_layer2_get_neigh_metadata(idx)->fraction,
-      oonf_layer2_get_neigh_metadata(idx)->binary)) {
+      oonf_layer2_neigh_metadata_get(idx)->fraction,
+      oonf_layer2_neigh_metadata_get(idx)->binary)) {
     return -1;
   }
 
@@ -296,17 +296,17 @@ _parse_strarray(struct strarray *array, const char *ifname,
   strarray_for_each_element(array, entry) {
     ptr = str_cpynextword(hbuf.buf, entry, sizeof(hbuf));
     if (isonumber_to_s64(&value, hbuf.buf,
-        oonf_layer2_get_neigh_metadata(idx)->fraction,
-        oonf_layer2_get_neigh_metadata(idx)->binary)) {
+        oonf_layer2_neigh_metadata_get(idx)->fraction,
+        oonf_layer2_neigh_metadata_get(idx)->binary)) {
       continue;
     }
 
     if (ptr == NULL) {
       /* add network wide data entry */
       if (!oonf_layer2_data_set_int64(&l2net->neighdata[idx], &_l2_origin_current,
-          oonf_layer2_get_neigh_metadata(idx),value)) {
+          oonf_layer2_neigh_metadata_get(idx),value)) {
         OONF_INFO(LOG_LINK_CONFIG, "if-wide %s for %s: %s",
-            oonf_layer2_get_neigh_metadata(idx)->key, ifname, hbuf.buf);
+            oonf_layer2_neigh_metadata_get(idx)->key, ifname, hbuf.buf);
       }
       continue;
     }
@@ -324,9 +324,9 @@ _parse_strarray(struct strarray *array, const char *ifname,
       }
 
       if (!oonf_layer2_data_set_int64(&l2neigh->data[idx], &_l2_origin_current,
-          oonf_layer2_get_neigh_metadata(idx),value)) {
+          oonf_layer2_neigh_metadata_get(idx),value)) {
         OONF_INFO(LOG_LINK_CONFIG, "%s to neighbor %s on %s: %s",
-            oonf_layer2_get_neigh_metadata(idx)->key, nbuf.buf, ifname, hbuf.buf);
+            oonf_layer2_neigh_metadata_get(idx)->key, nbuf.buf, ifname, hbuf.buf);
       }
     }
   }
@@ -369,8 +369,8 @@ _cb_config_changed(void) {
     /* detect changes and relabel the origin */
     avl_for_each_element_safe(&l2net->neighbors, l2neigh, _node, l2neigh_it) {
       for (idx = 0; idx < OONF_LAYER2_NEIGH_COUNT; idx++) {
-        if (oonf_layer2_get_origin(&l2neigh->data[idx]) == &_l2_origin_current) {
-          oonf_layer2_set_origin(&l2neigh->data[idx], &_l2_origin_old);
+        if (oonf_layer2_data_get_origin(&l2neigh->data[idx]) == &_l2_origin_current) {
+          oonf_layer2_data_set_origin(&l2neigh->data[idx], &_l2_origin_old);
           commit = true;
         }
       }
@@ -383,8 +383,8 @@ _cb_config_changed(void) {
     commit = false;
     /* detect changes and relabel the origin */
     for (idx = 0; idx < OONF_LAYER2_NET_COUNT; idx++) {
-      if (oonf_layer2_get_origin(&l2net->neighdata[idx]) == &_l2_origin_current) {
-        oonf_layer2_set_origin(&l2net->neighdata[idx], &_l2_origin_old);
+      if (oonf_layer2_data_get_origin(&l2net->neighdata[idx]) == &_l2_origin_current) {
+        oonf_layer2_data_set_origin(&l2net->neighdata[idx], &_l2_origin_old);
         commit = true;
       }
     }
index 6757bfb..bf72194 100644 (file)
@@ -116,6 +116,8 @@ nl80211_process_get_interface_result(struct nl80211_if *interf,
     struct nlmsghdr *hdr) {
   struct genlmsghdr *gnlh;
   struct nlattr *tb_msg[NL80211_ATTR_MAX + 1];
+  struct oonf_layer2_neigh *l2neigh;
+  uint64_t mc_rate;
 
   gnlh = nlmsg_data(hdr);
   nla_parse(tb_msg, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
@@ -179,6 +181,16 @@ nl80211_process_get_interface_result(struct nl80211_if *interf,
         OONF_LAYER2_NET_BANDWIDTH_1, bandwidth[0]);
     interf->ifdata_changed |= nl80211_change_l2net_data(interf->l2net,
         OONF_LAYER2_NET_BANDWIDTH_2, bandwidth[1]);
+
+    if (bandwidth[0] > 0 && nl80211_create_broadcast_neighbor()) {
+      /* calculate multicast rate */
+      mc_rate = 6000000ull * 20000000ull / (bandwidth[0] + bandwidth[1]);
+
+      l2neigh = oonf_layer2_neigh_add(interf->l2net, &NETADDR_MAC48_BROADCAST);
+      if (l2neigh) {
+        nl80211_change_l2neigh_data(l2neigh, OONF_LAYER2_NEIGH_TX_BITRATE, mc_rate);
+      }
+    }
   }
 }
 
index 92a044a..482fa21 100644 (file)
@@ -257,15 +257,13 @@ _handle_traffic(struct oonf_layer2_neigh *l2neigh,
   static const uint64_t UPPER_32_MASK = 0xffffffff00000000ull;
   static const uint64_t LOWER_32_MASK = 0x00000000ffffffffull;
   struct oonf_layer2_data *data;
-  uint64_t old_value, new_value;
+  int64_t old_value, new_value;
 
   new_value = 0;
   old_value = 0;
 
   data = &l2neigh->data[idx];
-  if (oonf_layer2_has_value(data)) {
-    old_value = oonf_layer2_get_int64(data);
-  }
+  oonf_layer2_data_read_int64(&old_value, data);
 
   new_value = old_value & UPPER_32_MASK;
   new_value |= (new_32bit & LOWER_32_MASK);
@@ -273,9 +271,9 @@ _handle_traffic(struct oonf_layer2_neigh *l2neigh,
   OONF_DEBUG(LOG_NL80211, "new32: 0x%08x old: %016"PRIx64 " new: %016"PRIx64,
       new_32bit, old_value, new_value);
 
-  if (new_value + 0x80000000ull < old_value) {
+  if (new_value + 0x80000000ll < old_value) {
     /* handle 32bit counter overflow */
-    new_value += 0x100000000ull;
+    new_value += 0x100000000ll;
     OONF_DEBUG(LOG_NL80211, "Overflow, new: %016"PRIx64, new_value);
   }
 
index 00164b0..a44f563 100644 (file)
@@ -284,15 +284,15 @@ _get_max_bitrate(struct nl80211_if *interf, uint8_t *mcs, bool ht20_sgi, bool ht
 
   /* get layer2 bandwidth */
   data = &interf->l2net->data[OONF_LAYER2_NET_BANDWIDTH_1];
-  if (!oonf_layer2_has_value(data)) {
+  if (!oonf_layer2_data_has_value(data)) {
     /* we don't know the bandwidth of the channel */
     return 0;
   }
-  bandwidth = oonf_layer2_get_int64(data);
+  bandwidth = oonf_layer2_data_get_int64(data);
 
   data = &interf->l2net->data[OONF_LAYER2_NET_BANDWIDTH_2];
-  if (oonf_layer2_has_value(data)) {
-    bandwidth += oonf_layer2_get_int64(data);
+  if (oonf_layer2_data_has_value(data)) {
+    bandwidth += oonf_layer2_data_get_int64(data);
   }
 
   if (bandwidth == 20000000) {
index aeec94b..0b50fb7 100644 (file)
@@ -91,6 +91,9 @@
 struct _nl80211_config {
   /*! interval between two series of netlink probes */
   uint64_t interval;
+
+  /*! true if plugin should set multicast rate in the l2 db */
+  bool report_multicast_rate;
 };
 
 /**
@@ -128,8 +131,9 @@ struct _nl80211_query {
  * Index number for nl80211 configuration entries
  */
 enum _nl80211_cfg_idx {
-  IDX_INTERVAL,  //!< IDX_INTERVAL
-  IDX_INTERFACES,//!< IDX_INTERFACES
+  IDX_INTERVAL,
+  IDX_INTERFACES,
+  IDX_MC_RATE,
 };
 
 /**
@@ -209,6 +213,8 @@ static struct cfg_schema_entry _nl80211_entries[] = {
   [IDX_INTERFACES] = CFG_VALIDATE_PRINTABLE_LEN("if", "",
       "List of additional interfaces to read nl80211 data from",
       IF_NAMESIZE, .list=true),
+  [IDX_MC_RATE] = CFG_MAP_BOOL(_nl80211_config, report_multicast_rate, "report_mc_rate", "false",
+      "Activate to write the multicast/broadcast speed into the layer2 database"),
 };
 
 static struct cfg_schema_section _nl80211_section = {
@@ -321,8 +327,8 @@ _init(void) {
   avl_init(&_nl80211_if_tree, avl_comp_strcasecmp, false);
 
   /* get layer2 origin */
-  oonf_layer2_add_origin(&_layer2_updated_origin);
-  oonf_layer2_add_origin(&_layer2_data_origin);
+  oonf_layer2_origin_add(&_layer2_updated_origin);
+  oonf_layer2_origin_add(&_layer2_data_origin);
 
   oonf_timer_add(&_transmission_timer_info);
   return 0;
@@ -337,8 +343,8 @@ _cleanup(void) {
   avl_for_each_element_safe(&_nl80211_if_tree, interf, _node, it_if) {
     _nl80211_if_remove(interf);
   }
-  oonf_layer2_remove_origin(&_layer2_updated_origin);
-  oonf_layer2_remove_origin(&_layer2_data_origin);
+  oonf_layer2_origin_remove(&_layer2_updated_origin);
+  oonf_layer2_origin_remove(&_layer2_data_origin);
 
   oonf_timer_stop(&_transmission_timer);
   oonf_timer_remove(&_transmission_timer_info);
@@ -373,7 +379,7 @@ bool
 nl80211_change_l2net_data(struct oonf_layer2_net *l2net,
     enum oonf_layer2_network_index idx, uint64_t value) {
   return oonf_layer2_data_set_int64(&l2net->data[idx], &_layer2_updated_origin,
-      oonf_layer2_get_net_metadata(idx), value);
+      oonf_layer2_net_metadata_get(idx), value);
 }
 
 /**
@@ -387,7 +393,7 @@ bool
 nl80211_change_l2net_neighbor_default(struct oonf_layer2_net *l2net,
     enum oonf_layer2_neighbor_index idx, uint64_t value) {
   return oonf_layer2_data_set_int64(&l2net->neighdata[idx], &_layer2_updated_origin,
-      oonf_layer2_get_neigh_metadata(idx), value);
+      oonf_layer2_neigh_metadata_get(idx), value);
 }
 
 /**
@@ -411,7 +417,15 @@ bool
 nl80211_change_l2neigh_data(struct oonf_layer2_neigh *l2neigh,
     enum oonf_layer2_neighbor_index idx, uint64_t value) {
   return oonf_layer2_data_set_int64(&l2neigh->data[idx], &_layer2_updated_origin,
-      oonf_layer2_get_neigh_metadata(idx), value);
+      oonf_layer2_neigh_metadata_get(idx), value);
+}
+
+/**
+ * @return true if plugin should create a broadcast entry neighbor
+ */
+bool
+nl80211_create_broadcast_neighbor(void) {
+  return _config.report_multicast_rate;
 }
 
 /**
index ceb5cad..7eb1d2d 100644 (file)
@@ -101,6 +101,7 @@ bool nl80211_change_l2net_neighbor_default(struct oonf_layer2_net *l2net,
 void nl80211_cleanup_l2neigh_data(struct oonf_layer2_neigh *l2neigh);
 bool nl80211_change_l2neigh_data(struct oonf_layer2_neigh *l2neigh,
     enum oonf_layer2_neighbor_index idx, uint64_t value);
+bool nl80211_create_broadcast_neighbor(void);
 
 /**
  * @param interf nl80211 interface
index d5dc0ec..2c76bf6 100644 (file)
@@ -588,7 +588,7 @@ _get_raw_rx_linkspeed(const char *ifname, struct nhdp_link *lnk) {
   rx_bitrate_entry = oonf_layer2_neigh_query(
       ifname, &lnk->remote_mac, OONF_LAYER2_NEIGH_RX_BITRATE);
   if (rx_bitrate_entry) {
-    return oonf_layer2_get_int64(rx_bitrate_entry);
+    return oonf_layer2_data_get_int64(rx_bitrate_entry);
   }
 
   l2net = oonf_layer2_net_get(ifname);
@@ -601,8 +601,8 @@ _get_raw_rx_linkspeed(const char *ifname, struct nhdp_link *lnk) {
   avl_for_each_element(&l2net->neighbors, l2neigh, _node) {
     if (oonf_layer2_neigh_get_ip(l2neigh, &lnk->if_addr)) {
       rx_bitrate_entry = &l2neigh->data[OONF_LAYER2_NEIGH_RX_BITRATE];
-      if (oonf_layer2_has_value(rx_bitrate_entry)) {
-        return oonf_layer2_get_int64(rx_bitrate_entry);
+      if (oonf_layer2_data_has_value(rx_bitrate_entry)) {
+        return oonf_layer2_data_get_int64(rx_bitrate_entry);
       }
     }
   }
@@ -952,7 +952,7 @@ _shall_process_packet(struct nhdp_interface *nhdpif, struct ff_dat_if_config *if
     /* accept for unicast-only interfaces marked in layer2-data */
     l2data = &l2net->data[OONF_LAYER2_NET_RX_ONLY_UNICAST];
 
-    if (oonf_layer2_has_value(l2data) && oonf_layer2_get_boolean(l2data)) {
+    if (oonf_layer2_data_has_value(l2data) && oonf_layer2_data_get_boolean(l2data)) {
       return true;
     }
   }
index 88ebd7b..d8bdc0b 100644 (file)
@@ -252,11 +252,12 @@ _cb_link_removed(void *ptr) {
 static bool
 _check_if_type(struct oonf_layer2_net *net) {
   struct oonf_layer2_data *l2data;
+  bool value;
 
   l2data = &net->data[OONF_LAYER2_NET_MCS_BY_PROBING];
-  if (oonf_layer2_has_value(l2data)) {
+  if (!oonf_layer2_data_read_boolean(&value, l2data)) {
     /* we got a direct setting reported for the interface for probing */
-    return oonf_layer2_get_boolean(l2data);
+    return value;
   }
   if (net->if_dlep) {
     /* use configuration for DLEP that does not report if probing is necessary */
@@ -320,8 +321,8 @@ _cb_probe_link(struct oonf_timer_instance *ptr __attribute__((unused))) {
       /* get layer2 data */
       l2neigh = oonf_layer2_neigh_get(l2net, &lnk->remote_mac);
       if (l2neigh == NULL
-          || !oonf_layer2_has_value(&l2neigh->data[OONF_LAYER2_NEIGH_RX_BITRATE])
-          || !oonf_layer2_has_value(&l2neigh->data[OONF_LAYER2_NEIGH_TX_FRAMES])) {
+          || !oonf_layer2_data_has_value(&l2neigh->data[OONF_LAYER2_NEIGH_RX_BITRATE])
+          || !oonf_layer2_data_has_value(&l2neigh->data[OONF_LAYER2_NEIGH_TX_FRAMES])) {
         OONF_DEBUG(LOG_PROBING, "Drop link %s (missing l2 data)",
             netaddr_to_string(&nbuf, &lnk->remote_mac));
         continue;
@@ -332,7 +333,7 @@ _cb_probe_link(struct oonf_timer_instance *ptr __attribute__((unused))) {
 
       /* fix tx-packets */
       last_tx_packets = ldata->last_tx_traffic;
-      ldata->last_tx_traffic = oonf_layer2_get_int64(&l2neigh->data[OONF_LAYER2_NEIGH_TX_FRAMES]);
+      ldata->last_tx_traffic = oonf_layer2_data_get_int64(&l2neigh->data[OONF_LAYER2_NEIGH_TX_FRAMES]);
 
       /* check if link had traffic since last probe check */
       if (last_tx_packets != ldata->last_tx_traffic) {
index 20bbad8..45b5778 100644 (file)
@@ -151,6 +151,8 @@ static struct avl_tree _oonf_layer2_net_tree;
 
 static struct avl_tree _oonf_originator_tree;
 
+static struct avl_tree _local_peer_ips_tree;
+
 /**
  * Subsystem constructor
  * @return always returns 0
@@ -165,6 +167,7 @@ _init(void) {
 
   avl_init(&_oonf_layer2_net_tree, avl_comp_strcasecmp, false);
   avl_init(&_oonf_originator_tree, avl_comp_strcasecmp, false);
+  avl_init(&_local_peer_ips_tree, avl_comp_netaddr, true);
   return 0;
 }
 
@@ -191,7 +194,7 @@ _cleanup(void) {
  * @param origin layer2 originator
  */
 void
-oonf_layer2_add_origin(struct oonf_layer2_origin *origin) {
+oonf_layer2_origin_add(struct oonf_layer2_origin *origin) {
   origin->_node.key = origin->name;
   avl_insert(&_oonf_originator_tree, &origin->_node);
 }
@@ -201,7 +204,7 @@ oonf_layer2_add_origin(struct oonf_layer2_origin *origin) {
  * @param origin originator
  */
 void
-oonf_layer2_remove_origin(struct oonf_layer2_origin *origin) {
+oonf_layer2_origin_remove(struct oonf_layer2_origin *origin) {
   struct oonf_layer2_net *l2net, *l2net_it;
 
   if (!avl_is_node_added(&origin->_node)) {
@@ -311,6 +314,7 @@ oonf_layer2_net_add(const char *ifname) {
   /* initialize tree of neighbors, ips and proxies */
   avl_init(&l2net->neighbors, avl_comp_netaddr, false);
   avl_init(&l2net->local_peer_ips, avl_comp_netaddr, false);
+  avl_init(&l2net->remote_neighbor_ips, avl_comp_netaddr, true);
 
   /* initialize interface listener */
   l2net->if_listener.name = l2net->name;
@@ -338,13 +342,13 @@ oonf_layer2_net_cleanup(struct oonf_layer2_net *l2net,
 
   for (i=0; i<OONF_LAYER2_NET_COUNT; i++) {
     if (l2net->data[i]._origin == origin) {
-      oonf_layer2_reset_value(&l2net->data[i]);
+      oonf_layer2_data_reset(&l2net->data[i]);
       changed = true;
     }
   }
   for (i=0; i<OONF_LAYER2_NEIGH_COUNT; i++) {
     if (l2net->neighdata[i]._origin == origin) {
-      oonf_layer2_reset_value(&l2net->neighdata[i]);
+      oonf_layer2_data_reset(&l2net->neighdata[i]);
       changed = true;
     }
   }
@@ -406,14 +410,14 @@ oonf_layer2_net_commit(struct oonf_layer2_net *l2net) {
   }
 
   for (i=0; i<OONF_LAYER2_NET_COUNT; i++) {
-    if (oonf_layer2_has_value(&l2net->data[i])) {
+    if (oonf_layer2_data_has_value(&l2net->data[i])) {
       oonf_class_event(&_l2network_class, l2net, OONF_OBJECT_CHANGED);
       return false;
     }
   }
 
   for (i=0; i<OONF_LAYER2_NEIGH_COUNT; i++) {
-    if (oonf_layer2_has_value(&l2net->neighdata[i])) {
+    if (oonf_layer2_data_has_value(&l2net->neighdata[i])) {
       oonf_class_event(&_l2network_class, l2net, OONF_OBJECT_CHANGED);
       return false;
     }
@@ -439,18 +443,18 @@ oonf_layer2_net_relabel(struct oonf_layer2_net *l2net,
   size_t i;
 
   for (i=0; i<OONF_LAYER2_NET_COUNT; i++) {
-    if (oonf_layer2_get_origin(&l2net->data[i]) == old_origin) {
-      oonf_layer2_set_origin(&l2net->data[i], new_origin);
+    if (oonf_layer2_data_get_origin(&l2net->data[i]) == old_origin) {
+      oonf_layer2_data_set_origin(&l2net->data[i], new_origin);
     }
   }
 
   for (i=0; i<OONF_LAYER2_NEIGH_COUNT; i++) {
-    if (oonf_layer2_get_origin(&l2net->neighdata[i]) == old_origin) {
-      oonf_layer2_set_origin(&l2net->neighdata[i], new_origin);
+    if (oonf_layer2_data_get_origin(&l2net->neighdata[i]) == old_origin) {
+      oonf_layer2_data_set_origin(&l2net->neighdata[i], new_origin);
     }
   }
 
-  avl_for_each_element(&l2net->local_peer_ips, peer_ip,_node) {
+  avl_for_each_element(&l2net->local_peer_ips, peer_ip,_net_node) {
     if (peer_ip->origin == old_origin) {
       peer_ip->origin = new_origin;
     }
@@ -487,8 +491,11 @@ oonf_layer2_net_add_ip(struct oonf_layer2_net *l2net,
     l2addr->l2net = l2net;
 
     /* add to tree */
-    l2addr->_node.key = &l2addr->ip;
-    avl_insert(&l2net->local_peer_ips, &l2addr->_node);
+    l2addr->_net_node.key = &l2addr->ip;
+    avl_insert(&l2net->local_peer_ips, &l2addr->_net_node);
+
+    l2addr->_global_node.key = &l2addr->ip;
+    avl_insert(&_local_peer_ips_tree, &l2addr->_global_node);
   }
 
   l2addr->origin = origin;
@@ -508,7 +515,8 @@ oonf_layer2_net_remove_ip(
     return -1;
   }
 
-  avl_remove(&ip->l2net->local_peer_ips, &ip->_node);
+  avl_remove(&ip->l2net->local_peer_ips, &ip->_net_node);
+  avl_remove(&_local_peer_ips_tree, &ip->_global_node);
   oonf_class_free(&_l2net_addr_class, ip);
   return 0;
 }
@@ -531,7 +539,7 @@ oonf_layer2_net_get_best_neighbor_match(const struct netaddr *addr) {
 
   avl_for_each_element(&_oonf_layer2_net_tree, l2net, _node) {
     avl_for_each_element(&l2net->neighbors, l2neigh, _node) {
-      avl_for_each_element(&l2neigh->remote_neighbor_ips, l2addr, _node) {
+      avl_for_each_element(&l2neigh->remote_neighbor_ips, l2addr, _neigh_node) {
         if (netaddr_is_in_subnet(&l2addr->ip, addr)
             && netaddr_get_prefix_length(&l2addr->ip) < prefix_length) {
           best_match = l2addr;
@@ -551,7 +559,7 @@ oonf_layer2_net_get_best_neighbor_match(const struct netaddr *addr) {
  */
 struct oonf_layer2_neigh *
 oonf_layer2_neigh_add(struct oonf_layer2_net *l2net,
-    struct netaddr *neigh) {
+    const struct netaddr *neigh) {
   struct oonf_layer2_neigh *l2neigh;
 
   if (netaddr_get_address_family(neigh) != AF_MAC48
@@ -598,7 +606,7 @@ oonf_layer2_neigh_cleanup(struct oonf_layer2_neigh *l2neigh,
 
   for (i=0; i<OONF_LAYER2_NEIGH_COUNT; i++) {
     if (l2neigh->data[i]._origin == origin) {
-      oonf_layer2_reset_value(&l2neigh->data[i]);
+      oonf_layer2_data_reset(&l2neigh->data[i]);
       changed = true;
     }
   }
@@ -632,7 +640,7 @@ oonf_layer2_neigh_remove(struct oonf_layer2_neigh *l2neigh,
     }
   }
 
-  avl_for_each_element_safe(&l2neigh->remote_neighbor_ips, l2ip, _node, l2ip_it) {
+  avl_for_each_element_safe(&l2neigh->remote_neighbor_ips, l2ip, _neigh_node, l2ip_it) {
     if (oonf_layer2_neigh_remove_ip(l2ip, origin) == 0) {
       changed = true;
     }
@@ -664,7 +672,7 @@ oonf_layer2_neigh_commit(struct oonf_layer2_neigh *l2neigh) {
   }
 
   for (i=0; i<OONF_LAYER2_NEIGH_COUNT; i++) {
-    if (oonf_layer2_has_value(&l2neigh->data[i])) {
+    if (oonf_layer2_data_has_value(&l2neigh->data[i])) {
       oonf_class_event(&_l2neighbor_class, l2neigh, OONF_OBJECT_CHANGED);
       return false;
     }
@@ -689,12 +697,12 @@ oonf_layer2_neigh_relabel(struct oonf_layer2_neigh *l2neigh,
   size_t i;
 
   for (i=0; i<OONF_LAYER2_NEIGH_COUNT; i++) {
-    if (oonf_layer2_get_origin(&l2neigh->data[i]) == old_origin) {
-      oonf_layer2_set_origin(&l2neigh->data[i], new_origin);
+    if (oonf_layer2_data_get_origin(&l2neigh->data[i]) == old_origin) {
+      oonf_layer2_data_set_origin(&l2neigh->data[i], new_origin);
     }
   }
 
-  avl_for_each_element(&l2neigh->remote_neighbor_ips, neigh_ip, _node) {
+  avl_for_each_element(&l2neigh->remote_neighbor_ips, neigh_ip, _neigh_node) {
     if (neigh_ip->origin == old_origin) {
       neigh_ip->origin = new_origin;
     }
@@ -733,8 +741,10 @@ oonf_layer2_neigh_add_ip(struct oonf_layer2_neigh *l2neigh,
     l2addr->l2neigh = l2neigh;
 
     /* add to tree */
-    l2addr->_node.key = &l2addr->ip;
-    avl_insert(&l2neigh->remote_neighbor_ips, &l2addr->_node);
+    l2addr->_neigh_node.key = &l2addr->ip;
+    avl_insert(&l2neigh->remote_neighbor_ips, &l2addr->_neigh_node);
+    l2addr->_net_node.key = &l2addr->ip;
+    avl_insert(&l2neigh->network->remote_neighbor_ips, &l2addr->_net_node);
   }
 
   l2addr->origin = origin;
@@ -754,7 +764,8 @@ oonf_layer2_neigh_remove_ip(
     return -1;
   }
 
-  avl_remove(&ip->l2neigh->remote_neighbor_ips, &ip->_node);
+  avl_remove(&ip->l2neigh->remote_neighbor_ips, &ip->_neigh_node);
+  avl_remove(&ip->l2neigh->network->remote_neighbor_ips, &ip->_net_node);
   oonf_class_free(&_l2neigh_addr_class, ip);
   return 0;
 }
@@ -837,14 +848,14 @@ oonf_layer2_neigh_query(const char *ifname,
   l2neigh = oonf_layer2_neigh_get(l2net, l2neigh_addr);
   if (l2neigh != NULL) {
     data = &l2neigh->data[idx];
-    if (oonf_layer2_has_value(data)) {
+    if (oonf_layer2_data_has_value(data)) {
       return data;
     }
   }
 
   /* look for network specific default */
   data = &l2net->neighdata[idx];
-  if (oonf_layer2_has_value(data)) {
+  if (oonf_layer2_data_has_value(data)) {
     return data;
   }
   return NULL;
@@ -857,18 +868,18 @@ oonf_layer2_neigh_query(const char *ifname,
  * @return pointer to linklayer data, NULL if no value available
  */
 const struct oonf_layer2_data *
-oonf_layer2_neigh_get_value(const struct oonf_layer2_neigh *l2neigh,
+oonf_layer2_neigh_get_data(const struct oonf_layer2_neigh *l2neigh,
     enum oonf_layer2_neighbor_index idx) {
   const struct oonf_layer2_data *data;
 
   data = &l2neigh->data[idx];
-  if (oonf_layer2_has_value(data)) {
+  if (oonf_layer2_data_has_value(data)) {
     return data;
   }
 
   /* look for network specific default */
   data = &l2neigh->network->neighdata[idx];
-  if (oonf_layer2_has_value(data)) {
+  if (oonf_layer2_data_has_value(data)) {
     return data;
   }
   return NULL;
@@ -880,7 +891,7 @@ oonf_layer2_neigh_get_value(const struct oonf_layer2_neigh *l2neigh,
  * @return metadata object
  */
 const struct oonf_layer2_metadata *
-oonf_layer2_get_neigh_metadata(enum oonf_layer2_neighbor_index idx) {
+oonf_layer2_neigh_metadata_get(enum oonf_layer2_neighbor_index idx) {
   return &_oonf_layer2_metadata_neigh[idx];
 }
 
@@ -890,7 +901,7 @@ oonf_layer2_get_neigh_metadata(enum oonf_layer2_neighbor_index idx) {
  * @return metadata object
  */
 const struct oonf_layer2_metadata *
-oonf_layer2_get_net_metadata(enum oonf_layer2_network_index idx) {
+oonf_layer2_net_metadata_get(enum oonf_layer2_network_index idx) {
   return &_oonf_layer2_metadata_net[idx];
 }
 
@@ -900,7 +911,7 @@ oonf_layer2_get_net_metadata(enum oonf_layer2_network_index idx) {
  * @return text representation
  */
 const char *
-oonf_layer2_get_network_type(enum oonf_layer2_network_type type) {
+oonf_layer2_net_get_type_name(enum oonf_layer2_network_type type) {
   return oonf_layer2_network_type[type];
 }
 
@@ -909,7 +920,7 @@ oonf_layer2_get_network_type(enum oonf_layer2_network_type type) {
  * @return network tree
  */
 struct avl_tree *
-oonf_layer2_get_network_tree(void) {
+oonf_layer2_get_net_tree(void) {
   return &_oonf_layer2_net_tree;
 }
 
@@ -937,7 +948,7 @@ _net_remove(struct oonf_layer2_net *l2net) {
   }
 
   /* free all attached peer addresses */
-  avl_for_each_element_safe(&l2net->local_peer_ips, l2peer, _node, l2peer_it) {
+  avl_for_each_element_safe(&l2net->local_peer_ips, l2peer, _net_node, l2peer_it) {
     oonf_layer2_net_remove_ip(l2peer, l2peer->origin);
   }
 
@@ -966,7 +977,7 @@ _neigh_remove(struct oonf_layer2_neigh *l2neigh) {
   }
 
   /* free all attached neighbor addresses */
-  avl_for_each_element_safe(&l2neigh->remote_neighbor_ips, l2addr, _node, l2addr_it) {
+  avl_for_each_element_safe(&l2neigh->remote_neighbor_ips, l2addr, _neigh_node, l2addr_it) {
     oonf_layer2_neigh_remove_ip(l2addr, l2addr->origin);
   }
 
index 291c1e3..78eac6b 100644 (file)
@@ -284,6 +284,9 @@ struct oonf_layer2_net {
   /*! tree of IP addresses/prefixes of local radio/modem */
   struct avl_tree local_peer_ips;
 
+  /*! global tree of all remote neighbor IPs */
+  struct avl_tree remote_neighbor_ips;
+
   /*! absolute timestamp when network has been active last */
   uint64_t last_seen;
 
@@ -310,8 +313,11 @@ struct oonf_layer2_peer_address {
   /*! origin of this address */
   const struct oonf_layer2_origin *origin;
 
-  /*! node for tree of ip addresses */
-  struct avl_node _node;
+  /*! node for global tree of network IP addresses */
+  struct avl_node _global_node;
+
+  /*! node for tree of ip addresses in network */
+  struct avl_node _net_node;
 };
 
 /**
@@ -353,8 +359,11 @@ struct oonf_layer2_neighbor_address {
   /*! origin of this address */
   const struct oonf_layer2_origin *origin;
 
+  /*! (interface) global tree of neighbor IP addresses */
+  struct avl_node _net_node;
+
   /*! node for tree of ip addresses */
-  struct avl_node _node;
+  struct avl_node _neigh_node;
 };
 
 /**
@@ -374,8 +383,8 @@ struct oonf_layer2_destination {
   struct avl_node _node;
 };
 
-EXPORT void oonf_layer2_add_origin(struct oonf_layer2_origin *origin);
-EXPORT void oonf_layer2_remove_origin(struct oonf_layer2_origin *origin);
+EXPORT void oonf_layer2_origin_add(struct oonf_layer2_origin *origin);
+EXPORT void oonf_layer2_origin_remove(struct oonf_layer2_origin *origin);
 
 EXPORT int oonf_layer2_data_parse_string(union oonf_layer2_value *value,
     const struct oonf_layer2_metadata *meta,
@@ -404,9 +413,10 @@ EXPORT int oonf_layer2_net_remove_ip(
     struct oonf_layer2_peer_address *ip, const struct oonf_layer2_origin *origin);
 EXPORT struct oonf_layer2_neighbor_address *oonf_layer2_net_get_best_neighbor_match(
     const struct netaddr *addr);
+EXPORT struct avl_tree *oonf_layer2_net_get_remote_ip_tree(void);
 
 EXPORT struct oonf_layer2_neigh *oonf_layer2_neigh_add(
-    struct oonf_layer2_net *, struct netaddr *l2neigh);
+    struct oonf_layer2_net *, const struct netaddr *l2neigh);
 EXPORT bool oonf_layer2_neigh_cleanup(struct oonf_layer2_neigh *l2neigh,
     const struct oonf_layer2_origin *origin);
 EXPORT bool oonf_layer2_neigh_remove(
@@ -430,15 +440,17 @@ EXPORT void oonf_layer2_destination_remove(struct oonf_layer2_destination *);
 EXPORT const struct oonf_layer2_data *oonf_layer2_neigh_query(
     const char *ifname, const struct netaddr *l2neigh,
     enum oonf_layer2_neighbor_index idx);
-EXPORT const struct oonf_layer2_data *oonf_layer2_neigh_get_value(
+EXPORT const struct oonf_layer2_data *oonf_layer2_neigh_get_data(
     const struct oonf_layer2_neigh *l2neigh, enum oonf_layer2_neighbor_index idx);
 
-EXPORT const struct oonf_layer2_metadata *oonf_layer2_get_neigh_metadata(
+EXPORT const struct oonf_layer2_metadata *oonf_layer2_neigh_metadata_get(
     enum oonf_layer2_neighbor_index);
-EXPORT const struct oonf_layer2_metadata *oonf_layer2_get_net_metadata(
+EXPORT const struct oonf_layer2_metadata *oonf_layer2_net_metadata_get(
     enum oonf_layer2_network_index);
-EXPORT const char *oonf_layer2_get_network_type(enum oonf_layer2_network_type);
-EXPORT struct avl_tree *oonf_layer2_get_network_tree(void);
+EXPORT const char *oonf_layer2_net_get_type_name(enum oonf_layer2_network_type);
+
+EXPORT struct avl_tree *oonf_layer2_get_net_tree(void);
+EXPORT struct avl_tree *oonf_layer2_get_peer_ip_tree(void);
 EXPORT struct avl_tree *oonf_layer2_get_origin_tree(void);
 
 /**
@@ -459,7 +471,18 @@ oonf_layer2_origin_is_added(const struct oonf_layer2_origin *origin) {
 static INLINE struct oonf_layer2_net *
 oonf_layer2_net_get(const char *ifname) {
   struct oonf_layer2_net *l2net;
-  return avl_find_element(oonf_layer2_get_network_tree(), ifname, l2net, _node);
+  return avl_find_element(oonf_layer2_get_net_tree(), ifname, l2net, _node);
+}
+
+/**
+ * Get a layer-2 ip address object from the database
+ * @param ip ip address of local radio/modem
+ * @return layer-2 ip address object, NULL if not found
+ */
+static INLINE struct oonf_layer2_peer_address *
+oonf_layer2_get_net_ip(const struct netaddr *addr) {
+  struct oonf_layer2_peer_address *l2ip;
+  return avl_find_element(oonf_layer2_get_peer_ip_tree(), addr, l2ip, _global_node);
 }
 
 /**
@@ -472,7 +495,7 @@ static INLINE struct oonf_layer2_peer_address *
 oonf_layer2_net_get_ip(const struct oonf_layer2_net *l2net,
     const struct netaddr *addr) {
   struct oonf_layer2_peer_address *l2ip;
-  return avl_find_element(&l2net->local_peer_ips, addr, l2ip, _node);
+  return avl_find_element(&l2net->local_peer_ips, addr, l2ip, _net_node);
 }
 
 /**
@@ -511,7 +534,20 @@ static INLINE struct oonf_layer2_neighbor_address *
 oonf_layer2_neigh_get_ip(const struct oonf_layer2_neigh *l2neigh,
     const struct netaddr *addr) {
   struct oonf_layer2_neighbor_address *l2ip;
-  return avl_find_element(&l2neigh->remote_neighbor_ips, addr, l2ip, _node);
+  return avl_find_element(&l2neigh->remote_neighbor_ips, addr, l2ip, _neigh_node);
+}
+
+/**
+ * Get a layer-2 ip address object from the database
+ * @param l2net layer-2 network object
+ * @param ip ip address of remote router
+ * @return layer-2 ip address object, NULL if not found
+ */
+static INLINE struct oonf_layer2_neighbor_address *
+oonf_layer2_net_get_neigh_ip(const struct oonf_layer2_net *l2net,
+    const struct netaddr *addr) {
+  struct oonf_layer2_neighbor_address *l2ip;
+  return avl_find_element(&l2net->remote_neighbor_ips, addr, l2ip, _net_node);
 }
 
 /**
@@ -519,7 +555,7 @@ oonf_layer2_neigh_get_ip(const struct oonf_layer2_neigh *l2neigh,
  * @return true if object contains a value, false otherwise
  */
 static INLINE bool
-oonf_layer2_has_value(const struct oonf_layer2_data *l2data) {
+oonf_layer2_data_has_value(const struct oonf_layer2_data *l2data) {
   return l2data->_type != OONF_LAYER2_NO_DATA;
 }
 
@@ -533,7 +569,7 @@ oonf_layer2_data_get_type(const struct oonf_layer2_data *l2data) {
  * @return value of data object
  */
 static INLINE int64_t
-oonf_layer2_get_int64(const struct oonf_layer2_data *l2data) {
+oonf_layer2_data_get_int64(const struct oonf_layer2_data *l2data) {
   assert (l2data->_type == OONF_LAYER2_INTEGER_DATA);
   return l2data->_value.integer;
 }
@@ -543,17 +579,45 @@ oonf_layer2_get_int64(const struct oonf_layer2_data *l2data) {
  * @return value of data object
  */
 static INLINE bool
-oonf_layer2_get_boolean(const struct oonf_layer2_data *l2data) {
+oonf_layer2_data_get_boolean(const struct oonf_layer2_data *l2data) {
   assert (l2data->_type == OONF_LAYER2_BOOLEAN_DATA);
   return l2data->_value.boolean;
 }
 
+/**
+ * @param buffer pointer to int64 data storage
+ * @param l2data layer-2 data object
+ * @return 0 if value was read, -1 if it was the wrong type
+ */
+static INLINE int
+oonf_layer2_data_read_int64(int64_t *buffer, const struct oonf_layer2_data *l2data) {
+  if (l2data->_type != OONF_LAYER2_INTEGER_DATA) {
+    return -1;
+  }
+  *buffer = l2data->_value.integer;
+  return 0;
+}
+
+/**
+ * @param buffer pointer to boolean data storage
+ * @param l2data layer-2 data object
+ * @return 0 if value was read, -1 if it was the wrong type
+ */
+static INLINE int
+oonf_layer2_data_read_boolean(bool *buffer, const struct oonf_layer2_data *l2data) {
+  if (l2data->_type != OONF_LAYER2_BOOLEAN_DATA) {
+    return -1;
+  }
+  *buffer = l2data->_value.boolean;
+  return 0;
+}
+
 /**
  * @param l2data layer-2 data object
  * @return originator of data value
  */
 static INLINE const struct oonf_layer2_origin *
-oonf_layer2_get_origin(const struct oonf_layer2_data *l2data) {
+oonf_layer2_data_get_origin(const struct oonf_layer2_data *l2data) {
   return l2data->_origin;
 }
 
@@ -563,7 +627,7 @@ oonf_layer2_get_origin(const struct oonf_layer2_data *l2data) {
  * @param origin originator of data value
  */
 static INLINE void
-oonf_layer2_set_origin(struct oonf_layer2_data *l2data,
+oonf_layer2_data_set_origin(struct oonf_layer2_data *l2data,
     const struct oonf_layer2_origin *origin) {
   l2data->_origin = origin;
 }
@@ -585,14 +649,14 @@ static INLINE int
 oonf_layer2_net_data_to_string(char *buffer, size_t length,
     const struct oonf_layer2_data *data, enum oonf_layer2_network_index idx, bool raw) {
   return oonf_layer2_data_to_string(buffer, length, data,
-      oonf_layer2_get_net_metadata(idx), raw);
+      oonf_layer2_net_metadata_get(idx), raw);
 }
 
 static INLINE int
 oonf_layer2_neigh_data_to_string(char *buffer, size_t length,
     const struct oonf_layer2_data *data, enum oonf_layer2_neighbor_index idx, bool raw) {
   return oonf_layer2_data_to_string(buffer, length, data,
-      oonf_layer2_get_neigh_metadata(idx), raw);
+      oonf_layer2_neigh_metadata_get(idx), raw);
 }
 
 /**
@@ -633,7 +697,7 @@ oonf_layer2_net_data_from_string(
     struct oonf_layer2_data *data, enum oonf_layer2_network_index idx,
     struct oonf_layer2_origin *origin, const char *input) {
   return oonf_layer2_data_from_string(
-      data, origin, oonf_layer2_get_net_metadata(idx), input);
+      data, origin, oonf_layer2_net_metadata_get(idx), input);
 }
 
 static INLINE int
@@ -641,7 +705,7 @@ oonf_layer2_neigh_data_from_string(
     struct oonf_layer2_data *data, enum oonf_layer2_neighbor_index idx,
     struct oonf_layer2_origin *origin, const char *input) {
   return oonf_layer2_data_from_string(
-      data, origin, oonf_layer2_get_neigh_metadata(idx), input);
+      data, origin, oonf_layer2_neigh_metadata_get(idx), input);
 }
 
 /**
@@ -649,7 +713,7 @@ oonf_layer2_neigh_data_from_string(
  * @param l2data layer-2 data object
  */
 static INLINE void
-oonf_layer2_reset_value(struct oonf_layer2_data *l2data) {
+oonf_layer2_data_reset(struct oonf_layer2_data *l2data) {
   l2data->_type = OONF_LAYER2_NO_DATA;
   l2data->_origin = NULL;
 }