Merge branch 'master' into mpr_rework
authorHenning Rogge <henning.rogge@fkie.fraunhofer.de>
Fri, 22 Jul 2016 10:58:07 +0000 (12:58 +0200)
committerHenning Rogge <henning.rogge@fkie.fraunhofer.de>
Fri, 22 Jul 2016 10:58:07 +0000 (12:58 +0200)
12 files changed:
1  2 
src-plugins/nhdp/constant_metric/constant_metric.c
src-plugins/nhdp/ff_dat_metric/ff_dat_metric.c
src-plugins/nhdp/mpr/mpr.c
src-plugins/nhdp/nhdp/nhdp_db.c
src-plugins/nhdp/nhdp/nhdp_domain.c
src-plugins/nhdp/nhdp/nhdp_domain.h
src-plugins/nhdp/nhdp/nhdp_reader.c
src-plugins/olsrv2/olsrv2/olsrv2.c
src-plugins/olsrv2/olsrv2/olsrv2.h
src-plugins/olsrv2/olsrv2/olsrv2_routing.c
src-plugins/olsrv2/olsrv2/olsrv2_writer.c
src-plugins/subsystems/os_linux/os_fd_linux.h

@@@ -98,17 -99,8 +98,15 @@@ DECLARE_OONF_PLUGIN(_nhdp_mpr_subsystem
  static struct nhdp_domain_mpr _mpr_handler = {
    .name = OONF_MPR_SUBSYSTEM,
    .update_mpr = _cb_update_mpr,
-   .mpr_start = false,
-   .mprs_start = false,
  };
  
 +enum oonf_log_source LOG_MPR;
 +
 +static void
 +_early_cfg_init(void) {
 +  LOG_MPR = _nhdp_mpr_subsystem.logging;
 +}
 +
  /**
   * Initialize plugin
   * @return -1 if an error happened, 0 otherwise
@@@ -985,24 -970,16 +987,25 @@@ _cb_link_heard(struct oonf_timer_instan
  
  /**
   * Callback triggered when link symmetric timer fires
-  * @param ptr nhdp link
+  * @param ptr timer instance that fired
   */
  static void
- _cb_link_symtime(void *ptr) {
-   struct nhdp_link *lnk = ptr;
+ _cb_link_symtime(struct oonf_timer_instance *ptr) {
+   struct nhdp_link *lnk;
 +  struct nhdp_neighbor_domaindata *data;
 +  struct nhdp_domain *domain;
  
-   OONF_DEBUG(LOG_NHDP, "Link Symtime fired: 0x%0zx", (size_t)ptr);
+   lnk = container_of(ptr, struct nhdp_link, sym_time);
+   OONF_DEBUG(LOG_NHDP, "Link Symtime fired: 0x%0zx", (size_t)lnk);
    nhdp_db_link_update_status(lnk);
 -  nhdp_domain_neighbor_changed(lnk->neigh);
 +
 +  list_for_each_element(nhdp_domain_get_list(), domain, _node) {
 +    data = nhdp_domain_get_neighbordata(domain, lnk->neigh);
 +    if (data->neigh_is_mpr) {
 +      nhdp_domain_recalculate_mpr(false);
 +      return;
 +    }
 +  }
  }
  
  /**
@@@ -1020,11 -998,15 +1024,13 @@@ _cb_naddr_vtime(struct oonf_timer_insta
  
  /**
   * Callback triggered when 2hop valitidy timer fires
-  * @param ptr nhdp 2hop address
+  * @param ptr timer instance that fired
   */
  static void
- _cb_l2hop_vtime(void *ptr) {
-   struct nhdp_l2hop *l2hop = ptr;
+ _cb_l2hop_vtime(struct oonf_timer_instance *ptr) {
+   struct nhdp_l2hop *l2hop;
 -  struct nhdp_neighbor *neigh;
+   l2hop = container_of(ptr, struct nhdp_l2hop, _vtime);
 -  neigh = l2hop->link->neigh;
  
    OONF_DEBUG(LOG_NHDP, "2Hop vtime fired: 0x%0zx", (size_t)ptr);
    nhdp_db_link_2hop_remove(l2hop);
@@@ -925,17 -903,16 +929,20 @@@ _recalculate_neighbor_metric
      struct nhdp_neighbor *neigh) {
    struct nhdp_link *lnk;
    struct nhdp_link_domaindata *linkdata;
 +  struct nhdp_l2hop *l2hop;
 +  struct nhdp_l2hop_domaindata *l2hopdata;
    struct nhdp_neighbor_domaindata *neighdata;
 -  struct nhdp_metric oldmetric;
 +  uint32_t old_outgoing;
 +  bool changed;
+ #ifdef OONF_LOG_DEBUG_INFO
+   struct netaddr_str nbuf;
+ #endif
  
    neighdata = nhdp_domain_get_neighbordata(domain, neigh);
 +  changed = false;
  
 -  /* copy old metric value */
 -  memcpy(&oldmetric, &neighdata->metric, sizeof(oldmetric));
 +    /* copy old metric value */
 +  old_outgoing = neighdata->metric.out;
  
    /* reset metric */
    neighdata->metric.in = RFC7181_METRIC_INFINITE;
    neighdata->best_link = NULL;
    neighdata->best_link_ifindex = 0;
  
+   OONF_DEBUG(LOG_NHDP, "Recalculate neighbor %s metrics (ext %u):",
+       netaddr_to_string(&nbuf, &neigh->originator), domain->ext);
    /* get best metric */
    list_for_each_element(&neigh->_links, lnk, _neigh_node) {
 +    if (lnk->status != NHDP_LINK_SYMMETRIC) {
 +      continue;
 +    }
 +
      linkdata = nhdp_domain_get_linkdata(domain, lnk);
      if (linkdata->metric.out < neighdata->metric.out) {
+       OONF_DEBUG(LOG_NHDP, "Link on if %s has better outgoing metric: %u",
+               lnk->local_if->os_if_listener.data->name,
+               linkdata->metric.out);
        neighdata->metric.out = linkdata->metric.out;
        neighdata->best_link = lnk;
      }
      if (linkdata->metric.in < neighdata->metric.in) {
+       OONF_DEBUG(LOG_NHDP, "Link on if %s has better incoming metric: %u",
+               lnk->local_if->os_if_listener.data->name,
+               linkdata->metric.in);
        neighdata->metric.in = linkdata->metric.in;
      }
 +
 +    /* check for changes in outgoing 2-hop metrics */
 +    avl_for_each_element(&lnk->_2hop, l2hop, _link_node) {
 +      l2hopdata = nhdp_domain_get_l2hopdata(domain, l2hop);
 +
 +      changed |= l2hopdata->metric.out != l2hopdata->_last_used_outgoing_metric;
 +      l2hopdata->_last_used_outgoing_metric = l2hopdata->metric.out;
 +    }
    }
  
    if (neighdata->best_link != NULL) {
+     OONF_DEBUG(LOG_NHDP, "Best link if: %s",
+         nhdp_interface_get_if_listener(neighdata->best_link->local_if)->data->name);
      neighdata->best_link_ifindex =
-         nhdp_interface_get_coreif(neighdata->best_link->local_if)->data.index;
+         nhdp_interface_get_if_listener(neighdata->best_link->local_if)->data->index;
    }
 -
 -  if (memcmp(&oldmetric, &neighdata->metric, sizeof(oldmetric)) != 0) {
 -    /* mark metric as updated */
 -    domain->neighbor_metric_changed = true;
 -  }
 +  return changed || neighdata->metric.out != old_outgoing;
  }
  
  /**
Simple merge
Simple merge
@@@ -271,13 -283,7 +280,9 @@@ _early_cfg_init(void) 
   */
  static int
  _init(void) {
-   _protocol = oonf_rfc5444_add_protocol(RFC5444_PROTOCOL, true);
-   if (_protocol == NULL) {
-     return -1;
-   }
 -  if (os_core_get_random(&_ansn, sizeof(_ansn))) {
++  _protocol = oonf_rfc5444_get_default_protocol();
 +
 +  if (olsrv2_writer_init(_protocol)) {
-     oonf_rfc5444_remove_protocol(_protocol);
      return -1;
    }
  
Simple merge
@@@ -88,10 -87,8 +88,11 @@@ static void _handle_nhdp_routes(struct 
  static void _add_route_to_kernel_queue(struct olsrv2_routing_entry *rtentry);
  static void _process_dijkstra_result(struct nhdp_domain *);
  static void _process_kernel_queue(void);
- static void _cb_trigger_dijkstra(void *);
 +
 +static void _cb_mpr_update(struct nhdp_domain *);
 +static void _cb_metric_update(struct nhdp_domain *);
 -static void _cb_nhdp_update(struct nhdp_neighbor *);
+ static void _cb_trigger_dijkstra(struct oonf_timer_instance *);
++
  static void _cb_route_finished(struct os_route *route, int error);
  
  /* Domain parameter of dijkstra algorithm */
@@@ -339,7 -339,8 +339,9 @@@ static INLINE in
  os_fd_event_socket_add(struct os_fd_select *sel, struct os_fd *sock) {
    struct epoll_event event;
  
+   memset(&event,0,sizeof(event));
 +  event.events = 0;
    event.data.ptr = sock;
    return epoll_ctl(sel->_epoll_fd, EPOLL_CTL_ADD, sock->fd, &event);
  }