Routing 如何在RPL协议中选择最差的父级作为首选父级?

Routing 如何在RPL协议中选择最差的父级作为首选父级?,routing,network-programming,contiki,cooja,Routing,Network Programming,Contiki,Cooja,我是contiki和cooja的新手,非常感谢您的努力。我想我必须详细说明我的问题。因此,我知道邻居集的一部分是父集,并且根据RPL规范选择其中一个作为首选父集,那么如何从contiki中的该部分集中选择最差的一个呢?我试图更改src文件rpl dag.c和rpl mrhof.c中的代码,我希望每次节点向邻居集中添加父节点时,它都会将新的父节点与当前首选的父节点进行比较,并选择错误的父节点,但这并没有起到应有的作用!!节点选择父节点0,即从DODAG分离。节点1是接收器-UDP服务器-其余是UD

我是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

mrhof.c


我完全忘记了,如果一个节点有两个父节点提供相同的秩/路由度量,那么它必须选择这两个节点中的任何一个,我相应地修改了代码

我完全忘记了,如果一个节点有两个父节点提供相同的秩/路由度量,那么它必须选择其中一个,我相应地修改了代码

你到底想改变什么?你确定在RPL中使用了MRHOF目标函数吗?我主要围绕一个条件进行讨论,如果一个父项有更好的度量,然后选择另一个。是的,RPL DODAG是使用MrHoff构建的。如果您不想得到答案,请发布您的代码。所以需要一个。谢谢你的更新。那么这个问题解决了吗?你到底想改变什么?你确定在RPL中使用了MRHOF目标函数吗?我主要围绕一个条件进行讨论,如果一个父项有更好的度量,然后选择另一个。是的,RPL DODAG是使用MrHoff构建的。如果您不想得到答案,请发布您的代码。所以需要一个。谢谢你的更新。那么这个问题解决了吗?长话短说,我花了时间修正错误,但直到现在我才得到预期的结果&我非常绝望和失望。我想模拟的是,使其中一个节点的行为如下:它选择提供最差路由信息的最差父节点作为其首选父节点,而不是像所有其他正常节点一样,即破坏目标函数,然后更新其父节点集并再次选择最差父节点。我怎么能这么做?!你能确切地描述一下我需要使用/修改哪些函数或src文件来实现这一点吗?请给我一些提示长话短说,我花了时间修正错误,但直到现在我才得到我所期望的&我非常绝望和失望。我想模拟的是,使其中一个节点的行为如下:它选择提供最差路由信息的最差父节点作为其首选父节点,而不是像所有其他正常节点一样,即破坏目标函数,然后更新其父节点集并再次选择最差父节点。我怎么能这么做?!你能确切地描述一下我需要使用/修改哪些函数或src文件来实现这一点吗?请给我一些提示
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_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;
}