Как выбрать худшего родителя в качестве предпочтительного родителя в протоколе RPL?

Я совершенно новичок в contiki и cooja, поэтому ваши усилия высоко ценятся. Я думаю, что мне нужно подробно описать мою проблему. Итак, я знаю, что часть набора соседей является родительским набором, и один из них выбирается в качестве предпочтительного родителя на основе спецификации RPL, так как же я могу выбрать худший из этого частичного набора в contiki? Я попытался изменить код в файле src rpl-dag.c и rpl-mrhof.c и ожидал, что каждый раз, когда узел добавляет родителя в набор соседей, он сравнивает новый с текущим предпочтительным родителем и выбирает плохой один, но это не сработало, как должно было быть!! узел выбирает родителя 0, т.е. он отсоединяется от DODAG. узел 1 является приемником - UDP-сервером, а остальные - UDP-клиентами. Изменены коды узлов 8 rpl-dag.c и rpl-mrhof.c. Я думал, что узел 8 изменит своего предпочтительного родителя с узла 7 на узел 6.

rpl-mrhof.c

static rpl_parent_t *
best_parent(rpl_parent_t *p1, rpl_parent_t *p2)
{
  rpl_dag_t *dag;
  rpl_path_metric_t min_diff;
  rpl_path_metric_t p1_metric;
  rpl_path_metric_t p2_metric;

  dag = p1->dag; /* Both parents are in the same DAG. */

  min_diff = RPL_DAG_MC_ETX_DIVISOR /
             PARENT_SWITCH_THRESHOLD_DIV;

  p1_metric = calculate_path_metric(p1);
  p2_metric = calculate_path_metric(p2);

  /* Maintain stability of the preferred parent in case of similar ranks. */
  if(p1 == dag->preferred_parent || p2 == dag->preferred_parent) {
    if(p1_metric < p2_metric + min_diff &&
       p1_metric > p2_metric - min_diff) {
      PRINTF("RPL: MRHOF hysteresis: %u <= %u <= %u\n",
             p2_metric - min_diff,
             p1_metric,
             p2_metric + min_diff);
      return dag->preferred_parent;
    }
  }
  return p1_metric > p2_metric ? p1 : p2;
}

rpl-dag.c

rpl_parent_t *
rpl_select_parent(rpl_dag_t *dag)
{
  rpl_parent_t *p, *worse;

  best = NULL;

  //p = nbr_table_head(rpl_parents);
    p= nbr_table_head(ds6_neighbors);
  while(p != NULL) {
    if(p->rank == INFINITE_RANK) {
      /* ignore this neighbor */
    } else if(worse == NULL) {
      worse = p;
    } else {
      worse = dag->instance->of->best_parent(worse, p);
    }
    //p = nbr_table_next(rpl_parents, p);
    p = nbr_table_next(ds6_neighbors, p);
  }

  if(worse != NULL) {
    rpl_set_preferred_parent(dag, worse);
  }

  return worse;
}

введите здесь описание изображения

введите здесь описание изображения


person akalthubaity    schedule 29.11.2017    source источник
comment
Что именно вы пытались изменить? А вы уверены, что в РПЛ используется целевая функция MRHOF?   -  person kfx    schedule 30.11.2017
comment
Я играл в основном с условием, если у родителя метрика лучше, чем выбрать другую. Да, RPL DODAG построен с использованием MRHOF.   -  person akalthubaity    schedule 30.11.2017
comment
Пожалуйста, опубликуйте свой код, если вы не хотите ответа. SO нужен минимальный воспроизводимый пример.   -  person kfx    schedule 30.11.2017
comment
Спасибо за обновление. Тогда это решается?   -  person kfx    schedule 02.12.2017


Ответы (1)


Я совершенно забыл, что если у узла 2 родителя обеспечивают одинаковую метрику ранга/маршрутизации, тогда он должен выбрать любой из 2, и я соответствующим образом исправил код!!

person akalthubaity    schedule 01.12.2017
comment
Короче говоря, я потратил время на исправление ошибок, однако до сих пор не получил того, чего ожидал, и я очень отчаялся и разочарован. Что я хочу смоделировать, так это то, что один из узлов действует следующим образом: он выбирает наихудший родитель, который предоставляет наихудшую информацию о маршрутизации, поскольку его предпочтительный родитель не похож на все другие нормальные узлы, т.е. ломает целевую функцию, а затем обновляет свой родительский набор и снова выбирает худшего родителя. Как мне это сделать?! Не могли бы вы описать мне, какие именно функции или какие файлы src мне нужно использовать/изменить для этого? пожалуйста, дайте мне несколько советов - person akalthubaity; 28.12.2017