目前专门为LoWPAN设计的路由协议(RPL协议)尚在制定完善中,很有可很成为6LoWPAN中使用的标准路由协议”

一  RPL处理数据包:

1 代码流程:

Ieee802.15.4mac层

\/

\/

6lowpan子系统,

\/

\/

Ipv6-->ipv6_rcv():

---->ip6_input()--->ip6_input_finish(){

….

nexthdr = skb_network_header(skb)[nhoff];//取出ipv6包头,判断出要使用那个上层协议(tcp,udp,icmp6等)

raw= raw6_local_deliver(skb, nexthdr);

if((ipprot = rcu_dereference(inet6_protos[nexthdr])) != NULL) {

ret = ipprot->handler(skb);---传递给上一层协议(tcp,udp,icmp6等)处理

\/

\/

2 下面是icmp6模块:

首先注册协议到inet6_protos[]

int __initicmpv6_init(void)

{

interr;

err= register_pernet_subsys(&icmpv6_sk_ops);

if(err < 0)

returnerr;

err= -EAGAIN;

if(inet6_add_protocol(&icmpv6_protocol, IPPROTO_ICMPV6)< 0)

gotofail;

其次,handler定义:

static const structinet6_protocol icmpv6_protocol = {

.handler        =        icmpv6_rcv,

.err_handler        =        icmpv6_err,

.flags                =        INET6_PROTO_NOPOLICY|INET6_PROTO_FINAL,

};

补充认识icmp6:

功能:ICMPv6向源节点报告关于目的地址传输IPv6包的错误和信息,具有差错报告、网络诊断、邻节点发现和多播实现等功能。在IPv6中,ICMPv6实现IPv4中ICMP、ARP和IGMP的功能。ND和NI协议也是基于ICMPv6。

ND协议定义了5种ICMPV6报文类型,包括RS、RA、NS、NA和Redirect报文:

icmpv6_rcv(){

….

caseNDISC_ROUTER_SOLICITATION://RS

case NDISC_ROUTER_ADVERTISEMENT:

caseNDISC_NEIGHBOUR_SOLICITATION:

caseNDISC_NEIGHBOUR_ADVERTISEMENT:

case NDISC_REDIRECT:

ndisc_rcv(skb);

…..

3  RPL是通过icmpv6来接受数据包:参考RPL协议规范定义,如下图:

下面分析代码

icmpv6_rcv(){

完成icmp的处理之后。

…..

#ifdefCONFIG_IPV6_RPL//linux_rpl

caseICMPV6_RPL:

rpl_rcv(skb);

break;

#endif /*CONFIG_IPV6_RPL */

rpl_rcv(){}------》rpl_rx_worker()----》_rpl_rcv(rw->dev,skb){

…..

根据RPL组网过程基本原理,其基本消息处理如下:

//处理如下消息:DIS、DIO、DAO

switch(msg->icmp6_code){

caseICMPV6_RPL_DIS:

rpl_recv_dis(dev,skb);

break;

caseICMPV6_RPL_DIO:

rpl_recv_dio(dev,skb);

break;

caseICMPV6_RPL_DAO:

rpl_recv_dao(dev,skb);

break;

caseICMPV6_RPL_DAO_ACK:

//rpl_recv_dao_ack();

break;

caseICMPV6_RPL_CC:

//rpl_recv_cc();

break;

caseICMPV6_RPL_SEC_DIS:

caseICMPV6_RPL_SEC_DIO:

caseICMPV6_RPL_SEC_DAO:

caseICMPV6_RPL_SEC_DAO_ACK:

……

…...

}

逐个函数分析:

1)rpl_recv_dis(dev,skb);

{

//step1.找到节点信息,就是找路由信息。

icmpv6_rpl_find_option()

//step2:新节点,则加入

rpl_dag_inconsistent()---》trickle_hear_inconsistent()---》_trickle_start()---》trickle_threadfn()

------》trickle->trickle_fn(trickle->trickle_fn_arg);----》rpl_dag_dio_timer_handler()

{

发送出DIO:rpl_send_dio(dag,NULL,NULL,true,false);----dag处理---icmp处理---》dst_output()--》

ipV6:rt->dst.output  =ip6_output;

---->ip6_finish_output()---->ip6_finish_output2()----->

ND系统---mac层---》物理层

}

dio timer什么时候建立?

Dio timer是基于The Trickle Algorithm算法的定时器,参考rfc6206.pdf

当检测到netdev和netevent的时候

static structnotifier_block rpl_netdev_notifier = {

.notifier_call= rpl_netdev_event,

};

static structnotifier_block rpl_netevent_notifier = {

.notifier_call= rpl_netevent_event,

};

…/…./….--->rpl_dag_start_root()----…/….--->rpl_dag_dio_timer_reset(dag);

2rpl_recv_dio(dev,skb);

这里只关注更新节点更新“自身邻居表”,并选择合适的节点发送数据包

rpl_dag_update_upward_routes()---

-1)rpl_node_set_default_route()

-2)rpl_node_unset_default_route()

首先调用rt6_get_dflt_router()获取ipv6的路由缓存表信息

其次dst_neigh_lookup()更新自身的(ipv6)邻居表。---->….----->ip6_neigh_lookup();

3rpl_recv_dao(dev,skb);

父节点更新了自身的路由表后,再向”父节点的父节点““发DAO”,最后到达sink点后双向链路最终形成。

//for each target intargets

rpl_recv_dao(dev,skb)

{

…..

rpl_dag_add_target()

{

..

..

rpl_target_check_routes()---->rpl_add_route_nexthop()

{

interr = -EINVAL;

intpref = 0;

structfib6_config cfg;

//FIXMEcheck expires!!

memset(&cfg,0, sizeof(cfg));

cfg.fc_table        = RT6_TABLE_DFLT;

cfg.fc_metric        =IP6_RT_PRIO_USER;

cfg.fc_ifindex        =dev->ifindex;

cfg.fc_flags        =RTF_GATEWAY | RTF_PREF(pref);

cfg.fc_nlinfo.portid= 0;

cfg.fc_nlinfo.nlh= NULL;

cfg.fc_nlinfo.nl_net= dev_net(dev);

cfg.fc_dst= *prefix;

cfg.fc_dst_len= prefix_len;

cfg.fc_gateway= *next_hop;

err =ip6_route_add(&cfg);//增加路由表项

returnerr;

}

路由协议之:WSN网络的RPL路由协议 for 6LOWPAN相关推荐

  1. m基于马尔科夫随机场和Gardner环的WSN网络时间同步matlab仿真

    目录 1.算法仿真效果 2.MATLAB核心程序 3.算法涉及理论知识概要 4.完整MATLAB 1.算法仿真效果 matlab2022a仿真结果如下: RBS算法的累积误差在50us大于80%:ER ...

  2. 计算机网络 实验三 网络互联与路由协议配置

    如果对我的内容感兴趣,可以考虑一下我的计算机网络实验专栏 计算机网络实验专栏链接 目录 1.实验目的 2.实验内容 3.基本要求 4. 实验步骤 1.实验目的 理解路由器转发分组的机制. 理解路由表的 ...

  3. 网络笔记(9) 路由协议:西出网关无故人,敢问路在何方

    俗话说得好,在家千日好,出门一日难.网络包一旦出了网关,就像玄奘西行一样踏上了江湖漂泊的路. 上一节我们描述的是一个相对简单的情形.出了网关之后,只有一条路可以走.但是,网络世界复杂得多,一旦出了网关 ...

  4. 内部网关路由协议--OSPF路由协议和RIP路由协议的详细讲解

    文章目录 1.OSPF的介绍 1.1 OSPF路由器的分类 1.2 OSPF区域的分类 1.2.1 OSPF区域的划分 1.2.2 虚链路的介绍 1.3 OSPF的LSA的类别 1.4 ospf的包类 ...

  5. rip路由协议计算机网络实验报告,RIP 动态路由协议的配置(实验报告).doc

    学 生 实 训 报 告 实训课名称________ 计 算 机 网 络_______ 实训内容 RIP 动态路由协议的配置 学 院 数信学院 年级 050711 专 业 数学与应用数学 学 生 姓 名 ...

  6. 使用java实现路由协议_如果使用OSPF作为路由协议,那么( )【选两项】

    [判断题]在一般情况下,规则.政策和程序三者很难区分开,因为它们共同构成组织的制度,都隐藏在制度之中. [单选题]某发电机的一个接线柱标注有 " D+ " 符号,表示该接线柱为( ...

  7. RPL协议、6blr边界路由和6lowpan技术解释

    无线传感器网络协议 6Lo WPAN协议是IETF推出的物联网标准协议,其目的是在低功耗无线个域网上使用IPv6技术实现万物互联,该协议完全适合于资源受限传感器节点构成的无线传感器网络.在无线传感器网 ...

  8. 无线Mesh网络技术

    无线mesh网,即无线网状网,也称为无线多跳网,它可以和多种宽带无线接入技术如802.11.802.16.802.20以及3G移动通信等技术相结合,组成一个含有多跳无线链路的无线网状网络.这种无线网状 ...

  9. flooding matlab仿真,无线传感器网络flooding路由协议MATLAB仿真.doc

    PAGE 摘 要 无线传感器网络是计算机科学技术的一个新的研究领域,是传感器技术.嵌入式计算技术.分布式信息处理技术和无线通信技术相结合的产物.与传统网络相比,无线传感器网络具有造价低.功耗低.布局灵 ...

最新文章

  1. ccache编译器缓存使用方法
  2. 你真的懂select Socket模型吗?
  3. JDBC之应用程序分层
  4. 看完这篇学会Ansible
  5. 为什么在大型 Angular 应用里我们需要使用 ngrx
  6. 我在项目中对 MySQL 做的优化
  7. 教你Python字符串的基本操作:拆分和连接
  8. 排序算法(7)----桶排序
  9. 三次元的世界里,机械臂的手活儿也无敌了
  10. 串口通信中ReadFile和WriteFile的超时详解!
  11. Intellij IDEA 14.x 菜单项中Compile、Make和Build的区别
  12. spring实战(第四版)读书笔记 附电子书网盘链接
  13. kux格式怎么转换成mp3_优酷kux1080转码工具 1080p kux格式转换mp4|优酷kux格式转换成MP4格式...
  14. linux phy fixed-link
  15. 【verilog】 FPGA倒计时器设计
  16. repost ubuntu 16.04安装TP-LINK TL-WDN5200H无线USB网卡驱动
  17. GameJam线下48小时极限游戏开发体验
  18. 百度搜索之site 使用
  19. JS逆向之巨量创意signature签名
  20. Anaconda配置新环境

热门文章

  1. 比亚迪王传福眼中的绿色工业时代:技术是改变世界的源动力
  2. linux系统旋转屏幕命令,Archlinux 实现屏幕旋转
  3. 软件质量管理体系 type:pdf_荆门医疗器械软件注册价格,三类医疗器械注册_上海峦灵...
  4. Big Faceless Java PDF Library[BFO]
  5. STM32学习笔记——通用定时器的PWM介绍及配置
  6. 曾国藩《挺经》卷十七藏锋
  7. kafka指定偏移量拉取与偏移量半自动提交
  8. 【斜率优化】特别行动队
  9. excel如何在单元格内换行
  10. 2020,不一样的春节假期