我在Salira的800天(2009.5.20~2011.7.29)-二.工作篇

来源:互联网 发布:网络电视剧十大排行榜 编辑:程序博客网 时间:2024/05/16 09:25

本博客(http://blog.csdn.net/livelylittlefish )贴出作者(阿波)相关研究、学习内容所做的笔记,欢迎广大朋友指正!

Content
零.序
一.感谢篇
二.工作篇
1. 工作回顾
2. 重要任务
(1) DePON1.5产品设备系统IGMP模块V3版本开发(vxWorks, C)
(2) DePON1.5产品DServer系统Multicast模块开发(Linux, C++)
(3) ACE系统研究(Linux, C++)
(4) DePON1.5产品DServer系统QoS模块重构(Linux, C++)
(5) DPoE2.0系统QoS模块设计、开发(Linux, C++)
(6) 重度bug解决
(7) 其他小任务
3. 研究、培训任务
(1) OpenSAF架构研究/workshop
(2) <Effective C++>培训
(3) 单元测试和Mock研究
(4) GCC Coverage研究
4. 一些文档
5. 工作心得
三.研究与学习篇
四.总结篇

全文在线阅读

二.工作篇

关于2010年详细工作总结,可以参考2010年度总结。此处简单回顾两年多的时间所做的工作。

1. 工作回顾

首先介绍一下公司的产品(我经历/参与的产品及承担的任务)。

(1) SPON3.9:该版本主要是加入新类新的ONU,如ONU3350GDP/3350GR。在该项目中我的主要任务是对2层协议模块,例如IGMP、MSTP、VLAN、PIM、AM、SAL、SM等,加入对新类型ONU的支持。实际上,这项任务非常简单,代码的增加量和修改量都很小,但关键是要认真、仔细,才能保证新类型的ONU所有的协议模块都支持。该项任务也是在Salira开始上手的工作。

(2) SPON3.10:该版本稳定运行时间很长,改动较少,我的主要任务是IGMP(v1/v2)协议模块维护的工作,包括Bug fix。

(3) SPON3.11:该版本主要是加入Link Allocation的功能,以及新类型的ONU,如ONU4100等,我的主要任务仍然是IGMP(v1/v2)协议模块维护的工作,包括Bug fix。

(4) SPON3.12:该产品应该是修改了LC(Line Card)板卡的架构,更换了其中用到的NP(Network Processor)等芯片,其主要工作在Transport team的开发,2层协议的开发工作很少。且因IGMP模块已经很稳定,基本不会再有Bug出现,故该产品经历的很少了。

(5) DePON1.0:2009年加入Salira时该产品已经发布,没有参与该产品的开发。

(6) DePON1.5:该产品的研发,公司投入大量的人力、物力和财力,历时一年(半)吧,最终在2010年9月末release。该产品也是我在公司所经历的一个重要产品,且参与度最多的产品。虽然不知道该产品的市场如何、部署如何。在该项目中,主要承担Multicast模块开发、QoS(Qualityof Service)模块重构、AM(Authentication Module)模块与RadiusServer通信等开发工作。

(7) DPoE1.0:该产品实际上由DePON1.5发展而来,遵循DPoE规范(该规范由全球通信领域几家知名公司共同开发、制定,Salira是其中之一,且是第一个通过DPoE1.0测试的公司)。在该项目中,主要负责QoS模块新增MIB表(ManagementInformation Base管理信息表)的支持。

(8) DPoE2.0:该产品相较于DPoE1.0有很大的改变,除加入新的功能(主要表现为业务逻辑)外,有些模块,例如QoS需要完全重新(全新)设计。在该产品中,我的主要任务就是QoS模块的重新设计和实现,包括架构设计,TLV(Type Length Value)子模块、CM(CableModem)管理子模块、CMTS(Cable Modem TerminalSystem)管理子模块、SNMP Container(SimpleNetwork Management Protocol)子模块、L2VPN(Layer 2 VirtualPrivate Network)子模块的设计等。

其他的产品例如SAM系统(JaveWeb版设备管理/配置系统)没有参与,此处不再介绍。

注1:EPON(EthernetPassive Optical Network):以太无源光网络。OLT(Optical LineTerminal):光缆终端设备。ONU(Optical Network Unit):光网络单元。其他的会在用到的时候解释。

注2:SPON(StandardEPON)系统是我们公司的主打产品,在北美市场部署范围也很广泛,北美4大电视运营商是我们的主要客户,系统也稳定运行很长时间。上述SPON系统即指OLT设备及其上的软件系统。后文如不特别指出,一般指其上的软件系统(该软件属于VxWorks系统上的嵌入式软件)。

注3:DePON(DOCSISEPON)系统和DPoE(Deprovision Over EPON)系统实际上包括两部分:OLT设备及其上的软件系统(Vxworks,C,嵌入式软件)和DServer系统(Linux,C++,系统软件)。此处的”OLT设备及其上的软件系统”与SPON实际上是有一定区别的,主要区别在DePON系统中定义,此处不赘述。

2. 重要任务

(1) DePON1.5产品设备系统IGMP模块V3版本开发(vxWorks, C)

主要任务:在IGMPv1/v2基础上,加入对IGMPv3的支持。(IGMP属于OLT设备上的软件,属于嵌入式开发。)

关于IGMPv3(这是难点)

  • 对于IGMPv3的以下特点如何处理包?
  •         两种模式:Include/Exclude Mode
  •         6种GroupType:
  •                 MODE_IS_INCLUDE/MODE_IS_EXCLUDE
  •                 CHANGE_TO_INCLUDE_MODE/CHANGE_TO_EXCLUDE_MODE
  •                 ALLOW_NEW_SOURCES/BLOCK_OLD_SOURCES
  •         3种查询方式:GeneralQuery,Group-Specific Query, Group-and-Source-Specific Query
  • 如何正确地实现IGMPv3复杂的状态机?(关于状态机可参考协议原文RFC3376)该问题是重中之重。该状态机能否画出?如何理解每一个状态及状态转移?
  • 如何设计数据结构以保证Source/Group的timer的设定或修改?
  • 如何保证与IGMPv1/v2的兼容?(关于v1/v2可参考RFC2236/RFC1122)
  • 如何进行event上报(DePON系统中DServer)?以便DServer系统的Multicast模块的处理?
  • 如何向单个LC板卡发送ICC(InternalCard Communication)消息?又如何向所有其他LC板卡发送ICC消息?
  • 。。。

对于刚进公司的我来说,这是一个挑战(这里要再次感谢我的manager李岩波老大,将这个有一定挑战性的任务交给我)。这些问题都需要搞清楚,才能够写代码,也才能更清楚地理解设备工作原理、系统对数据的处理流程。最初的进展很慢,因为要边学习边coding。但经过坚持不懈的努力,终于在很短的时间里搞清楚所有问题并写完代码、完成测试。当然,最后的测试发现,该模块的Bug真的是很少。

因笔者的主要工作是二层协议的开发,有一些相关问题,如果能有些了解或者掌握,将会更好。此处可参考笔者总结或者翻译整理的一些文章,或者一些参考资料,如下。

关于协议

  • EPON系统架构,原理(可参考《无源光网络原理》)
  • IGMP协议原理(可参考如下文章)
  • IGMP技术总结(1)
  • IGMP技术总结(2)
  • MPCP协议原理(可参考如下文章)
  • IEEE802.3ah协议学习(1)——多点MAC控制简介
  • IEEE802.3ah协议学习(2)——多点MAC控制操作
  • IEEE802.3ah协议学习(3)——MPCP多点控制协议
  • TCP/IP协议架构、原理(可参考《TCP/IP详解》)
  • RPC协议(可参考RFC1050, RFC1057)等

对于IGMP模块来说,因系统对IGMP包处理的特殊性,需要重点掌握其原理。已有的系统,要重点掌握IGMPv2的状态机处理流程。具体来讲,需要彻底搞清楚如下问题。

关于IGMPv2

  • IGMP模块如何架构的?又有哪些子模块?这些子模块间如何通信?典型的通信流程是怎样的?
  • SPON系统和DePON系统中的IGMP模块各有什么不同?上层业务有多少差别?上层业务的差别导致IGMP模块实现上有区别吗?
  • 从DePON1.0到DePON1.5又增加或修改了哪些上层业务?这些变化导致IGMP模块中有各有什么不同的处理?
  • 对于IGMP Snooping和IGMPproxy两种模式,IGMP模块本身是如何设计这两种模式的?又是如何处理的?处理流程如何描述?即IGMP模块接收到这些报文后都要做什么?(这一点需要详细了解IGMP协议的状态机,需要对每一步都有较好的理解和掌握),亦即IGMP的状态机是如何实现的?能否画出v2的状态机?如何理解状态转移?
  • 对于两种不同的模式,IGMP协议报文在系统里如何流动?Query、Report、Leave报文各如何?TK(Teknovus)芯片、NP芯片如何处理,处理又有什么动作?
  • 对于这些报文,IGMP模块本身如何处理?如何触发的?两种不同模式的Group,IGMP模块有哪些相关数据结构,是如何组织这些数据的?
  • IGMP模块的定时器有哪些?分别做什么?区别在哪里?如何调试这些定时器?
  • 是否考虑过处理过程中的优化?如果有,如何优化的?能不能更好的优化?如果没有,又该怎样优化?
  • 如何实现CLI对IGMP模块相关数据的查询?查询过程中,是否有板间通信发生?有哪些消息流动?数据是如何流动的?有哪些相关操作?
  • 如何通过CLI对IGMP模块进行配置?如何处理这些配置命令?如何同CLI进行交互?
  • IGMP模块与其他模块,如SAL(Service Agreement Level),VLM(VirtualLAN Management)等,有无消息交互?有,交互流程如何?能否用时序图表示?
  • IGMP模块正常工作的基本配置又是怎样的?如何快速地链接并测试IGMP模块?
  • IGMP模块如何调试?有哪些调试命令?
  • ...

关于设备系统,要想很好的理解其工作原理和对数据的处理流程,仍有不少问题需要搞清楚(作为一个软件开发者,想要深入理解某个系统的工作原理,需要深入地思考问题的本质。要能解决工作中的问题,更要学会问问题。我想,这也应该是成为一个优秀的开发者需要具备的基本特质吧。),如下。

关于系统架构

  • 系统如何架构?系统又如何分层?层与层之间如何通信?
  • 系统如何启动?我们的系统采用的是分阶段启动,那么分几个阶段?每个阶段又spawn哪些任务?SCC(SystemControl Card)卡和LC卡有什么区别?
  • 系统有哪些模块?各个模块都有哪些任务(这些任务跑在VxWorks系统上)?这些模块的任务是如何定义的?
  • 如何查看这些任务?这些任务使用的CPU、栈大小、优先级、任务入口等信息如何知道?与LC上任务相关的这些信息是如何组织的?SCC卡和LC卡有什么区别?
  • 模块启动后如何初始化?初始化动作由谁触发?然后又如何restore?restoration动作又是如何触发的?

关于代码组织

  • 系统代码如何组织?如何自动构建(当然是通过makefile工程)?那么makefile工程如何组织的?
  • 如果想对某些模块进行改写,又如何修改相应的makefile?比如通过gcc得到一些调试信息、头文件依赖信息(header file dependency)等信息?
  • 各模块代码如何组织?有没有编码规范?要加入新的模块,如何做?

关于平台支持

  • 系统支持的LC类型有哪些?有什么区别?系统支持的ONU类新有哪些?有什么区别?
  • 系统有没有定时器?有,那么定时器如何工作?有哪些类型的定时器,如何使用这些定时器?
  • 板间如何通信?系统的Node有哪些类型?如何组织?如何识别?ICC(Internal Card Communication)模块是如何设计的?其基本原理是什么?如何实现的?又如何使用?
  • 系统在什么OS上运行?系统与OS间的接口怎样?如何交互?通过系统调用,还是其他?平台如何封装?

关于开发、编译、测试

  • 系统开发环境如何?编译环境如何搭建?
  • 代码如何管理?bug如何管理?开发流程如何?
  • 如何搭建简单的测试环境?测试系统如何进行基本的配置?
  • 如何上传sf(vxworks系统上的镜像文件)到LC的flash?有哪些方法(3中方法)?
  • LC启动的BootLine在哪里配置?如何配置?有无命令支持?

关于调试

  • 系统如何调试?如何跟踪?每个模块有没有帮助命令?
  • 系统的log信息如何查看?如何分析?每个模块的调试开关?

关于ONU上线、DDL(Device DependencyLayer)、包处理

  • ONU上线过程是怎样的?如何discovery links?谁负责discovery links?Discovery过程遵循什么协议?
  • LC上的TK芯片如何识别协议包类型?识别协议包后,TKD(TK芯片的driver)如何将该包checkout给相应的包处理程序?即这些callback如何触发?这些callback又如何注册?注册在何处?如何组织?
  • TK又如何处理这些包(当然,只需要对IGMP协议包的处理很清楚就可以了,也没有那么多精力搞清楚所有的事情)?处理完这些包之后如何交给NP(Network Processor)?
  • TKD有哪些相关任务?每个任务入口在哪里?任务中主要流程是什么?
  • TK有哪些消息类型?向TK芯片中写入规则,由谁触发?写入流程是什么?如何写入?有没有什么第三方工具可以直接查询?对与IGMP模块来说,其相关的规则有哪些?规则是如何定义的?规则的格式是什么?有无调试命令查看这些规则?如何跟踪规则写入过程?
  • NP如何识别从TK上来的包?NPD(NP芯片driver)如何将包checkout给相应的模块进行处理(如IGMP模块)?即上层协议callback如何触发?这些callback在NPD中如何注册?如何组织?
  • NPD有哪些相关任务?每个任务入口在哪里?任务中主要流程是什么?

关于其他模块

  • SAL、VLM、ICC、TMM(TimerManagement)等重要模块如何设计的?其基本工作原理是什么?
  • 这些模块对ONU上线、CLI命令等事件,其基本处理流程是什么?如遇到相关问题,能否做一些简单分析?

这些问题,有些属于系统架构问题,有些属于协议处理问题,有些属于平台相关问题,有些属于transport问题,甚至有些属于芯片级的问题。如果对这些基本问题都有一个较为清醒的认识和理解,对你后续的工作一定会有很好的帮助。对于芯片级的问题,或多或少地了解一些,也会对你深入理解系统有很多帮助。

上述问题都是笔者在完成工作任务之余的研究、思考、实践所得。因为,这是笔者对自己刚接触该领域的基本要求。

因此,在此建议公司同仁,对新招进来的员工,可以根据其个人实际情况,先试着培训一下新员工对系统的认识,因为有些新员工以前并不一定接触过这样的设备,对系统的原理可能没有多少概念。对于公司现在做的AMN6400的设备,也可以有这样的培训,这样会让新员工上手更快,理解更深刻。当然,这也要求新员工对设备有很好的理解,对软件、软件开发有很好的悟性。

所有这些问题你如果都搞清楚了,那么恭喜你,你对系统本身的工作原理应该有一个比较好的理解了,至于业务、协议等的理解,每种业务的实现都不尽相同,需要专门研究相应的官方文档,搞清楚一个协议的开发,例如IGMP,其他的也能举一反三、融会贯通。

上述几乎所有问题,笔者都有比较深入的理解,并做了大量相关实验,写了很多相关文档。笔者希望,此处提出的问题能对他人起到抛砖引玉的作用。

(2) DePON1.5产品DServer系统Multicast模块开发(Linux, C++)

主要任务:DServerMulticast开发、维护。该模块基于DOCSIS (Data Over CableService Interface Specifications)3.0规范,支持IPMulticast Join Authorization,支持CLI、RPC、LDB、SNMP(MIB)等。

关于Multicast模块

  • Multicast模块如何设计?又有哪些子模块?这些子模块间如何交互?怎样架构?
  • 该模块有哪些对象?对象间有什么关系?如何用OO思想来设计?
  • Multicast模块如何启动?如何关闭?由谁触发?怎样触发的?模块启动后有无restoration?restoration过程有哪些操作?
  • 如何处理CLI(Command LineInterface)的命令?每个命令的相关操作流程是什么?
  • 如何处理SNMP(Simple NetworkManagement Protocol)的命令?处理流程怎样?是否能清晰描述?
  • 如何支持第三方MIB工具,如MibBrowser,对MIBTable的读/写?
  • 是否需要同设备OLT/ONU交互?如何交互?交互过程是否能够清楚地描述?
  • 有哪些RPC消息?如何发送RPC消息?Stub代码如何编写?Skeleton代码又如何编写?
  • stub代码是否能自动生成?如果能,如何定义规则,如何自动?(关于自动生成的问题,笔者实现了自动生成的代码,并对Multicast模块和BVM模块定义了相应的规则,且验证了其自动生成。)
  • 对CM上线,该模块的处理流程是什么?即CM如何做restoration?
  • 如何处理设备系统中IGMP模块上报的event?有哪些event?
  • 如何保证LDB(Local Database)、MIB(ManagementInformation Base)、GDB(Global Database)、内部数据的一致性?
  • 如何有效地同步LDB、设备GDB、MIB之间的数据?何时同步?如何触发同步过程?
  • 在该模块中,对哪些数据的访问可能会引起竞争条件?如何保护?
  • 该模块如何调试?有哪些调试方法?

同样地,与设备(软件)系统一样,关于DServer系统,也有类似的问题需要搞清楚,才能对DePON整个系统(包括设备和DServer)的工作原理、数据处理流程、软件架构等有深入的理解。此处,只列出关于系统架构的补充问题,其他相关问题省略,可参考前文设备系统的相关问题。

关于系统架构(补充问题)

  • 系统如何架构?该架构如何分层?层与层之间如何通信?
  • 模块间有没有依赖?依赖程度如何?如何分析依赖程度?如何尽可能地减少模块间的依赖?
  • 常用的代码静态分析工具有哪些?都是代码什么方面的静态分析?
  • DServer系统和设备之间如何通信?RPC模块的线程如何处理消息?如何触发RPC线程?
  • RPC消息处理流程是怎样的?RPC模块是多线程吗?如何设计?
关于代码组织
关于平台支持
关于开发、编译、测试
关于调试

关于CM上线

  • CM上线流程?有哪些模块参与?CMM(Cable Modem Management)模块主要做什么?该模块有哪些任务?任务线程如何启动?有哪些消息交互?
  • CM上线过程,其配置文件(Configuration File)解析及根据配置将port装入vlan的流程?该流程有哪些模块参与?能否画出时序图?这期间与OLT有哪些交互?OLT上又有哪些模块被触发?被触发的模块又有哪些动作?

关于事件上报

  • 动态转发表DFDB(Dynamic ForwardingDatabase)事件上报流程?该流程有哪些模块参与?能否画出时序图?这期间有哪些消息传递?对消息又如何处理?

关于CMTS/CM的interface

  • 系统中CMTS和CM各有哪些类型的Interface(CMGE/PON/FE, CMTS PON/GE)?
  • 如何初始化这些接口?何时初始化?这些接口信息保存在哪儿?如何管理这些接口?如何设计的?能否改进(重构)?

关于其他模块

  • DServer系统的其他模块,如RPC(Remote Procedure Call)、TMM(TimerManagement)、SC(System Controller)、BVM(BridgeVLAN Management)、CMM(Cable ModemManagement)、QoS(Quality of Service)等重要模块如何设计的?其基本工作原理是什么?
  • 这些模块对CM上线、CLI命令等事件,其基本处理流程是怎样的?消息如何传递?模块间如何交互?如遇到相关问题,能否做一些简单分析和调试?
  • 关于DServer的常用工具类,比如Lock,MD5等小模块,如何设计?基本原理如何?如何使用?
  • 如何使用ACE的主动任务ACE_Task来管理DServer系统上的某些子任务?如何使用ACE_Thread来管理DServer上的线程?与POSIX提供的pthread库有什么区别?究竟该如何选择?

关于DServer系统,笔者同样也做了大量相关实验,写了很多相关文档,对这些问题也有比较深入的理解。笔者同样希望,此处提出的问题能对他人起到抛砖引玉的作用。

(3) ACE系统研究(Linux, C++)

主要任务:

  • AM(AuthenticationModule)模块和Radius Server间通信子任务开发;
  • 研究ACE(AdaptiveCommunication Environment)系统,并将ACE_Reactor框架应用到AM模块中;
  • 将ACE_Task/ACE_Event_Handler框架应用到MCAST、BVM模块;
  • 研究Glibc, msvccrt, Linuxkernel关于ACE_Reactor/ACE_Event_Handler的handle_events, select原理;
  • 编写ACE demo代码,测试ACE_Reactor,handle_events, select等,并研究Expect, TCL,编写自动测试脚本以自动测试所有demos。

注:后两个任务是笔者的学习计划。

ACE系统是一个优秀的、高性能、跨平台、开源的通信中间件系统,是用C++编写的面向对象的工具开发包,它实现了通信软件的基本设计模式。它面向在Unix/Win32平台上开发高性能通信服务的开发人员,简化了面向对象的网络应用程序和服务的开发,这些程序和服务用到了进程间通信,事件分离,直接动态链接和并发机制等。ACE通过在运行时动态链接服务到应用程序和在一个或多个进程或线程中执行这些服务自动完成系统配置和重新配置。ACE的分层设计思想也非常值得借鉴。

关于ACE涉及的设计模式可参考POSA(Pattern Oriented Software Architecture)系列书籍,想学习就Google一下吧。笔者在任务中使用的相关部分可参考第2卷第3章和第5章。其他ACE资料,如<C++网络编程,卷1-运用ACE和模式消除复杂性>、<C++ 网络编程,卷2-基于ACE和框架的系统化复用>、<ACE程序员指南>等,都是很好的参考资料。

除完成工作任务,在工作之余,笔者重点研究了以下内容,希望能从中学习。

关于ACE Overview

  • ACE是什么?做什么?有哪些应用?
  • ACE系统代码如何组织的?如何编译?如何安装(Linux平台和win32平台)?如何调试?如何跟踪?

关于ACE系统架构

  • ACE系统架构是怎样的?如何分层?如何做到跨平台?
  • ACE系统日志子系统如何设计的?如何在客户自己编写的代码中使用日志记录,如何分析ACE系统的动作流程?

关于主动任务ACE_Task

  • ACE系统的任务ACE_Task有什么特点?如何设计的?如何实现的?又如何使用?ACE_Task::putq()有什么特点?队列满了怎么办?
  • 跟任务相关的ACE_Message,ACE_Message_Block, ACE_Data_Block等有何特点?如何设计并实现的?

关于反应器ACE_Reactor

  • ACE系统的反应器ACE_Reactor有什么特点?如何设计的?如何实现的?其设计模式是什么?
  • 如何识别事件?又如何对事件进行分发?其handle_events流程是怎样的?
  • 在Linux平台上的ACE_Select_Reactor是如何设计的?又是如何实现的?如何使用该版本的Reactor?在Linux平台上,其handle_events流程又是怎样的?和Linux Kernel又有哪些交互?如何交互的?
  • 在Win32平台上,又是怎样的?

关于ACE的设计模式

  • ACE系统的设计模式有哪些?Half Sync/Half Async(半同步/半异步模式)的原理?在ACE中如何应用的?Leader/Follower(领导者/追随者)模式的原理?在ACE中如何应用的?
  • ACE的OS_Wrapper层如何封装的?使用什么设计模式?

其他问题

  • ACE系统对TCP、UDP如何封装的?如何设计并实现的?如何封装网络的基本功能?
  • ACE_OS中有哪些主要功能?ACE如何实现Lock、Thread等OS的基本功能?
  • ACE_OS::send是如何送出消息的?又将消息送到了哪里?(ACE_Pipe结构的管道中)
  • ......

关于ACE_Reactor的细节问题,可以参考笔者的2010年度总结中的叙述。

对于ACE_Reactor,要想有深刻的理解,在Linux平台上,还需要搞清楚Linux kernel中相关的一些问题。

  • 在Linux平台上如何识别事件,即如何实现?(select系统调用)Linux上select如何实现的?从ACE所在的UserSpace如何到Glibc、又如何到Kernel Space实现睡眠(没有事件发生时)?Linuxkernel中线程如何睡眠?
  • 什么是系统调用?Linux kernel系统调用是如何实现的?内核2.6.18之前和之后实现上有什么差别?系统调用是如何进入Linux Kernel的?
  • LinuxKernel睡眠是如何实现的?futex (Fast UserspaceMutex)在Linux Kernel中是如何实现的?有哪些papers可以参考?

关于ACE_Task::putq()结合LinuxKernel的futex的分析,可参考笔者的一篇文章Linux平台调用ACE_Task::putq分析(timeout=0,队列满),或者下载该文档Analysis of ACE_Task-putq with timeout=0 whenqueue is full on Linux platform。

当然,有几个问题笔者现在还不能回答,例如设计模式有哪些,这需要对ACE系统有比较详尽的了解。关于ACE的学习,笔者也做了大量实验,分析了大量的ACE代码,并写了很多相关文档,笔者希望以后能抽时间重新整理该专题,并发布到blog上。

(4) DePON1.5产品DServer系统QoS模块重构(Linux, C++)

主要任务:

  • 深入理解QoS模块功能、架构、设计思想、程序结构、数据结构等,列出所有的不合理,对其全面重构;
  • 重构包括删除重复代码,抽取函数,重新设计对象,字段转移,重新设计数据结构,重新设计程序结构,数据优化,性能优化等,数据结构和程序结构等采用面向对象思想设计;例如,
  •         重新设计MIB Container, PostConfiguration, RPC Generator & Sender等子模块的数据结构和程序结构;
  •         采用多态处理CPU-less和CPU-based的CM,non-L2VPN和L2VPN(L2VPN又有多个类型),upstream和downstream;
  •         将Boost::multi_index_container应用到MIB数据的存储中,简化了数据结构和代码编写,并提高了程序效率;
  •         重新对待访问数据的竞争条件,重新设计访问同步;

要做好QoS重构,务必非常熟悉QoS模块代码本身,对其功能、架构、设计思想、程序结构、数据结构等必须非常熟悉。关于重构的其他问题如下,也务必非常清楚。

  • QoS模块代码到底有哪些不合理的地方?(深刻理解该问题是进行重构的前提)能否列举出来?(要求列举力求全面、客观)
  • 针对这些不合理,如何设计你的重构过程?通过哪些步骤进行重构?每个步骤要做哪些重构?
  • 如何保证重构的正确性?合理性?重构过程中如何测试?
  • 引入哪些设计模式?如何设计、实现?
  • 如何重新架构QoS模块?如何重新设计QoS的子模块,如TLV, CM/CMTS Service,CM/CMTS Object Management等;
  • 重新设计的子模块间如何交互信息?对数据的访问有无竞争条件?如何保护?

(5) DPoE2.0系统QoS模块设计、开发(Linux, C++)

主要任务:

  • 与另一个同事合作对QOS模块采用面向对象的思想进行完全的重新设计、开发;
  • 撰写详细设计文档。

新的设计采用层次结构,将QoS模块所需的数据按照处理过程分层,并设计子模块,且所有处理完全面向对象,应用了一些设计模式,如工厂模式、strategy模式、组合模式等。保存数据的链表采用模板设计,并加入Iterator(迭代器)将对链表的访问接口统一。设计的同时,考虑扩展性、稳定性的同时,考虑模块的可测试性。

很多问题在QoS的重构中已经考虑,但要重新设计且支持新功能、新业务的情况下,仍需考虑以下几个问题。

关于设计

  • QoS要处理哪些数据?处理的过程是怎样的?如何划分、设计子模块?数据在QoS模块内如何流动?每一个子模块对数据又有怎样的处理?如何重新架构QoS模块?
  • 如何重新设计TLV parsing?CLI?TLVCM Objects?CM Objects?CMTSObjects?SNMP Objects?MIBContainer?CM L2VPN?等。以及这些对象的管理器Manager?如CM Objects Manager, CMTSObjects Manager, SNMP Objects Manager等。采用什么设计模式?如何正确地将面向过程的设计改为面向对象的设计?
  • 他们的数据结构和程序结构如何?如何用模板设计带索引的链表结构?如何为该链表模板提供Iterator?
  • 如何考虑代码的可测试性?

(6) 重度bug解决

关于笔者负责的IGMP模块(不同产品的IGMP模块,如SPON系列,DePON系列)、Multicast模块,修正bug大概30多个,其中的疑难bug,笔者均写有详细的重现、分析、解决文档。其他模块相关的重度bug如下。

  • CFM(ConnectivityFault Management)模块栈溢出导致LC不停重启。
  • SCM模块ONU在restoration阶段由于没有清除内存导致的内存泄漏,从而导致LC重启,然后死掉。
  • DFDB事件上报(MACoverride模式)时,事件太多导致ICC消息发送缓冲区溢出,从而导致RPC消息丢失。
  • QoS模块插入map结构,因编译单元include不同的lock定义,导致同一个对象在不同编译单元有不同的内存结构,从而导致系统core dump。
  • AM模块与RadiusServer通信线程调度问题导致在AM与RadiusServer之间没有交互时AM的任务仍然运行等待事件发生,这个等待多少让人感觉任务的不自然。建议修改为需要AM与RadiusServer的通信任务时,再打开,如交互完成,该通信任务便退出,从而更好的利用资源。

以上bug,例如CFM模块的bug,当时并无可考经验或文档,笔者所能得到的信息,只有call stack、每一步调用的返回地址、stack dump(16进制数据)、相关寄存器的值,笔者结合源代码、PPC汇编代码和寄存器当前值研究、分析stack dump内容,最终发现rootcause是该模块的任务栈溢出导致call stack的最后一个调用的返回地址被改写,从而导致系统的异常行为。关于该问题,笔者写了详细的说明文档<Analysisof OLT3540 & OLCDV auto-reboot because of CFM stack overflow during Y1731test>。实际上,如果一开始就能猜到是栈溢出,修改栈的大小,就能一下子解决问题,但笔者在该过程中积累了stack dump数据分析,汇编代码分析等经验。关于这些问题,可以参考的笔者的文章有过程调用与栈帧,《深入理解计算机系统》3.38题解——缓冲区溢出攻击实例。

关于DFDB事件上报的问题,笔者让系统长时间运行并进行了大量的实验,得到大量的统计数据,最终发现是因ICC消息发送队列溢出,从而导致RPC消息丢失。

其他bug不再赘述。笔者从这些bug中,进一步理解系统的工作原理、数据流程和业务等。

(7) 其他小任务

这些任务均在1~3天的时间完成。

如DServer系统加密算法合并,如MD5算法、HMAC算法,RPCStub代码自动生成,读写锁实验等问题。DPoE1.0系统QOS模块新增MIB表的支持,主要涉及QOS支持的新增MIB table代码开发,修改SNMP模块相关代码等。

3. 研究、培训任务

(1) OpenSAF架构研究/workshop

主要任务:对OpenSAF系统进行研究,主要从上层架构、设计原理、如何提供服务等方面考虑。做好PPT后在公司做workshop,做一些架构等方面的介绍。

关于该研究任务,笔者主要考虑以下问题。

  • 服务可用性联盟(SAF, ServiceAvailability Forum) ,服务可用性接口(SAI, ServiceAvailability Interface),应用接口规范(AIS, ApplicationInterface Specification)都是什么?他们有什么关系?
  • SAI如何定义高可用性(High Availability)? 服务连续性(ServiceContinuity)?如何利用平均无故障时间MTBF( Mean Time BetweenFault)、平均维修时间MTTR(Mean Time BetweenRepair)计算可用性?
  • SAI如何定义故障(Fault),错误(Error), 失效(Failure),冗余(Redundancy)?
  • AIS是什么?AIS如何架构?AIS有哪几种类型的服务?
  • AMF(AvailabilityManagement Framework)是什么?
  • 集群服务CLM(Cluster MembershipService)是什么?有哪些节点?节点间如何通信?
  • HPI(HardwarePlatform Interface)是什么?HPI是如何架构的?
  • OpenSAF是什么?有哪些应用?可以在哪些环境下工作?
  • OpenSAF的架构是怎样的?有哪些组件?由谁开发?如何开发?如何组织代码/文档等?
  • OpenSAF如何提供五个99.999(99.999%)的可用性?又如何提高系统可靠性?
  • Node节点有哪些种类?各有什么特点?Master和Cluster分别负责做什么?
  • OPenSAF提供哪些服务?这些服务之间有何联系?服务之间如何通信?借助第三方?还是自己开发?
  • 全局锁服务LCK(Global Lock Service) 有哪些特点?如何提供锁服务?
  • 检查点服务CKPT(Checkpoint Service)是什么?基本原理是什么?
  • 持久序列化(PersistentSerialization)是什么?基本原理是什么?
  • 事件服务EVT(Event Service)原理是什么?
  • 消息服务MSG(Message Service)如何提供?
  • 日志服务LOG(Log Service)底层设计原理是什么?
  • 通知服务NTF(Notification Service)如何工作?
  • OpenSAF架构中有哪些方面值得我们借鉴?是否能将其中比如持久序列化(Persistent Serialization)引入我们的DServer系统中?
  • 其他框架与模型,如可用性管理框架AMF(AvailabilityManagement Framework)、信息管理模型IMM(InformationManagement Model)特点?

OpenSAF相关资料,可参考官方网站OpenSAF,SAForum。

(2) <Effective C++>培训

针对teammember的培训,几个人轮流培训,该书55讲笔者大概讲20个Item。认真做好培训材料,并整理为文章,如下。(该系列文章已整理出多篇,持续写作、整理中)

  • 重读经典-《EffectiveC++》Item0:基本概念
  • 重读经典-《EffectiveC++》Item1:视C++为一个语言联邦
  • 重读经典-《EffectiveC++》Item2:尽量以const,enum,inline替换#define
  • 重读经典-《EffectiveC++》Item3:尽可能使用const
  • 重读经典-《EffectiveC++》Item4:确定对象被使用前已先被初始化

(3) 单元测试和Mock研究

关于该专题的学习,笔者主要关注以下问题。

  • 软件测试基本概念?单元测试的基本概念?常用单元测试工具有哪些?
  • XUnit家族的测试工具,其基本原理是什么?
  • TestSuite,TestCase,Test之间有什么关系?如何组织这些case?如何run这些测试?
  • 如何快速地使用某种单元测试工具?如CUnit, GoogleTest。
  • Mock的基本概念,什么是Mock?Mock什么?如何Mock?
  • Mock的目的?使用笨重的方法如何mock?如何通过编译(选项)进行mock?这种方法有什么优缺点?
  • 常用的Mock工具有哪些?适用于什么平台?其基本思想是什么?如CMock,其基本原理?CMock本身如何设计的?由什么写成的框架?(Ruby)
  • 嵌入式软件领域常用的单元测试工具和Mock工具有什么?如CUnit+Unity,CUnit+CMock。如何结合使用?一般步骤有哪些?

该专题的学习,写成文章如下,基本上都是使用方法的介绍,原理性的介绍较少。

  • google test简介
  • 如何编译googletest的例子?
  • 如何使用googletest写单元测试?
  • Linux平台如何编译使用Google test写的单元测试?
  • Win32平台如何编译使用Google test编写的单元测试?
  • 使用GoogleTest的一个简单例子
  • Cunit简介
  • Mock的基本概念和方法(续)
  • MOCK object-第7章
  • Mock的基本概念和方法

关于CMock的原理,可参考Functionality and Designof the CMock framework等,其他的参考资料,可参考笔者的文章Reference,或者google一下。

(4) GCC Coverage研究

该专题主要针对GCC-4.1.2版本,研究其覆盖率测试工具(gcov/gcov-dump/lcov)的设计、原理、实现与应用,并写成如下文章,共计11篇文章。同时,也将GCC-4.1.2代码中的gcov/gcov-dump代码抽取出来,并进行一些修改,成为独立的gcov/gcov-dump程序。笔者在研究中考虑的问题可参考具体文章,此处不再赘述。相关资料可参考文章Reference。

  • Linux平台代码覆盖率测试工具GCOV简介
  • Linux平台代码覆盖率测试工具GCOV的前端工具LCOV简介
  • Linux平台代码覆盖率测试工具GCOV相关文件分析
  • Linux平台代码覆盖率测试-GCC如何编译生成gcov/gcov-dump程序及其bug分析
  • Linux平台代码覆盖率测试-从GCC源码中抽取gcov/gcov-dump程序
  • Linux平台代码覆盖率测试-gcov-dump原理分析
  • Linux平台代码覆盖率测试-.gcda/.gcno文件及其格式分析
  • Linux平台代码覆盖率测试-GCC插桩前后汇编代码对比分析
  • Linux平台代码覆盖率测试-编译过程自动化及对链接的解释
  • Linux平台代码覆盖率测试-GCC插桩基本概念及原理分析
  • Linux平台代码覆盖率测试-基本块图、插桩位置及桩代码执行分析

合集请参考<深入浅出Linux平台代码覆盖率测试——原理、工具、分析(v1)>(66页)。(提供下载)

gcov/gcov-dump程序代码已经打包并上传到CSDN的资源频道,地址如下。

  • gcov-dump-1.0.tar.gz : http://download.csdn.net/source/3235106
  • gcov-1.0.tar.gz        : http://download.csdn.net/source/3235119
  • gcov-tools-1.0.tar.gz: http://download.csdn.net/source/3235127

该研究内容计划写作15篇文章,还有4篇需要持续完成。

以上(3)、(4)两个研究任务主要针对公司未来Hitachi TND(Telecommunication Network Division)项目AMN6400等系统实施单元测试所作的研究。

4. 一些文档

关于SPON系统,DePON系统(包括DServer系统)的学习,笔者写了一系列的文档或文章,总结如下。

  • <SPON arthitecture>
  • <SPON study note>
  • <VLAN Experiments using SmartBits>
  • <IGMP Snooping Experiment>
  • <IGMP Proxy experiment>
  • <Link Aggregation experiment>
  • <IGMP log analysis during restoration from 3.4on>

  • <Analysis of OLT3540 & OLCDV auto-rebootbecause of CFM stack overflow during Y1731 test>
  • <Multicast-SNMP interface analysis>
  • <why not error since the same name'MD5Init'?>
  • <DFDB(Dynamic Forwarding DataBase) eventreport process>
  • <The process of ONU configuration file parsing& installing port to vlan>
  • <The process of requesting ONU dynamic DFDBsnotification in cmmEventTftpCm>
  • <CMTS interfaces and CM interfaces in DServerSystem>
  • ...

5. 工作心得

关于2010年工作心得,可以参考2010心得。

“你要随时想着自己所做的事情是否能为公司带来价值,这是你能在这个公司长久发展的基础。”这是我老婆曾经给我说过的一句话,记录于此,也算作我的工作心得吧。同时也希望自己在未来的工作中时刻思考自己的工作方向和目标,做对公司有意义的事情。

凡事懂得感恩,要感恩给我提供平台的Salira公司,要感恩父母,感恩曾帮助过我的每个人;更要怀着感恩的心并用积极的态度面对工作,面对生活,面对未来。也应该感恩我的老婆,因为她的善良,更因为她那颗金子般的心。也要感谢上帝,让我们一起携手创造未来。

上一节 下一节 全文在线阅读

原创粉丝点击