路由协议之:WSN网络的RPL路由协议 for 6LOWPAN
“目前专门为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);
2)rpl_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();
3)rpl_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相关推荐
- m基于马尔科夫随机场和Gardner环的WSN网络时间同步matlab仿真
目录 1.算法仿真效果 2.MATLAB核心程序 3.算法涉及理论知识概要 4.完整MATLAB 1.算法仿真效果 matlab2022a仿真结果如下: RBS算法的累积误差在50us大于80%:ER ...
- 计算机网络 实验三 网络互联与路由协议配置
如果对我的内容感兴趣,可以考虑一下我的计算机网络实验专栏 计算机网络实验专栏链接 目录 1.实验目的 2.实验内容 3.基本要求 4. 实验步骤 1.实验目的 理解路由器转发分组的机制. 理解路由表的 ...
- 网络笔记(9) 路由协议:西出网关无故人,敢问路在何方
俗话说得好,在家千日好,出门一日难.网络包一旦出了网关,就像玄奘西行一样踏上了江湖漂泊的路. 上一节我们描述的是一个相对简单的情形.出了网关之后,只有一条路可以走.但是,网络世界复杂得多,一旦出了网关 ...
- 内部网关路由协议--OSPF路由协议和RIP路由协议的详细讲解
文章目录 1.OSPF的介绍 1.1 OSPF路由器的分类 1.2 OSPF区域的分类 1.2.1 OSPF区域的划分 1.2.2 虚链路的介绍 1.3 OSPF的LSA的类别 1.4 ospf的包类 ...
- rip路由协议计算机网络实验报告,RIP 动态路由协议的配置(实验报告).doc
学 生 实 训 报 告 实训课名称________ 计 算 机 网 络_______ 实训内容 RIP 动态路由协议的配置 学 院 数信学院 年级 050711 专 业 数学与应用数学 学 生 姓 名 ...
- 使用java实现路由协议_如果使用OSPF作为路由协议,那么( )【选两项】
[判断题]在一般情况下,规则.政策和程序三者很难区分开,因为它们共同构成组织的制度,都隐藏在制度之中. [单选题]某发电机的一个接线柱标注有 " D+ " 符号,表示该接线柱为( ...
- RPL协议、6blr边界路由和6lowpan技术解释
无线传感器网络协议 6Lo WPAN协议是IETF推出的物联网标准协议,其目的是在低功耗无线个域网上使用IPv6技术实现万物互联,该协议完全适合于资源受限传感器节点构成的无线传感器网络.在无线传感器网 ...
- 无线Mesh网络技术
无线mesh网,即无线网状网,也称为无线多跳网,它可以和多种宽带无线接入技术如802.11.802.16.802.20以及3G移动通信等技术相结合,组成一个含有多跳无线链路的无线网状网络.这种无线网状 ...
- flooding matlab仿真,无线传感器网络flooding路由协议MATLAB仿真.doc
PAGE 摘 要 无线传感器网络是计算机科学技术的一个新的研究领域,是传感器技术.嵌入式计算技术.分布式信息处理技术和无线通信技术相结合的产物.与传统网络相比,无线传感器网络具有造价低.功耗低.布局灵 ...
最新文章
- ccache编译器缓存使用方法
- 你真的懂select Socket模型吗?
- JDBC之应用程序分层
- 看完这篇学会Ansible
- 为什么在大型 Angular 应用里我们需要使用 ngrx
- 我在项目中对 MySQL 做的优化
- 教你Python字符串的基本操作:拆分和连接
- 排序算法(7)----桶排序
- 三次元的世界里,机械臂的手活儿也无敌了
- 串口通信中ReadFile和WriteFile的超时详解!
- Intellij IDEA 14.x 菜单项中Compile、Make和Build的区别
- spring实战(第四版)读书笔记 附电子书网盘链接
- kux格式怎么转换成mp3_优酷kux1080转码工具 1080p kux格式转换mp4|优酷kux格式转换成MP4格式...
- linux phy fixed-link
- 【verilog】 FPGA倒计时器设计
- repost ubuntu 16.04安装TP-LINK TL-WDN5200H无线USB网卡驱动
- GameJam线下48小时极限游戏开发体验
- 百度搜索之site 使用
- JS逆向之巨量创意signature签名
- Anaconda配置新环境
热门文章
- 比亚迪王传福眼中的绿色工业时代:技术是改变世界的源动力
- linux系统旋转屏幕命令,Archlinux 实现屏幕旋转
- 软件质量管理体系 type:pdf_荆门医疗器械软件注册价格,三类医疗器械注册_上海峦灵...
- Big Faceless Java PDF Library[BFO]
- STM32学习笔记——通用定时器的PWM介绍及配置
- 曾国藩《挺经》卷十七藏锋
- kafka指定偏移量拉取与偏移量半自动提交
- 【斜率优化】特别行动队
- excel如何在单元格内换行
- 2020,不一样的春节假期