2013.8.21
今天是第一天搬到5栋,新的环境,新的面孔。工作上暂时没有安排,可以先看看资料,早上把iptables重新看了一下,整理了一下链和表的关系,并且在MR3080上进行了实验。
2013.8.27
项目移交整理,发现很多项目的状态不清楚,平时要注意整理啊。
无线学习;
2013.8.30
香 港的E3276 modem出现了问题,和俄罗斯的不一样,产品部的人提出异议,导致要挖svn的版本问题。后来通过抓包分析,发现拨号参数不一样的,而且可能获取 DHCP IP的方式也不一样。对LTE获取IP的方式还是有一定的疑惑,是通过分析AT^DHCP的结果,还是发DHCP request呢?看代码,AT^DHCP的结果是没有被使用的,WAN口的网关和DNS是DHCP reply后的执行的操作。
IPv6的疑问,主要RADVD的问题,这个放了很久了,记忆有点模糊了,要翻看邮件。
2013.9.1
协助手机组解决香港E3276的问题,分析了报文,给了意见。阅读无线web_server上层设置的代码。
了解TP OEM的升级问题,每个OEM都有一个OEM ID,这个ID写入到机型的conf文件中的PRODUCT_VERSION字段中,如乌克兰KS版软件的conf文件中:
PRODUCT_VERSION = 0x00790001
2013.9.3
741 ks 乌克兰语版本准备提测,昨天更新了代码,jenkins上的代码选项需要修改;
看了无线的管理帧的作用,内容很多,不能全部记住,只能知道有这么一个帧,具体的内容用到的时候再查
晚上加班看了一下cdc_ncm驱动,特别是对比了3.11版本,发现修改很大,ncm_dev中增加了好几个modem设备,修改了2.6.31的cdc_ncm.c编译了一个软件发给香港协助测试;
2013.9.4
工 作遗漏,原来的TL-MR3220(RU) 2.0还没有进行金线换铜线切换,对比过代码,发现该版本在去年1月22号拉出来的独立分支,而金线换铜线是在3月开始的,完成后并没有进行代码的合并。 俄语版和通用版分支的代码页很久没有合并了,这个后续需要整理一下。NEXXT的OEM软件需要马上准备,本周5前需要提交测试。分析了英国IDNET用 户反馈的PPPoEv6 接入方式的IP地址获取方式,发现时通过RADVD进行获取的。
2013.9.5
编译pw-3g401d的代码,还有在此基础上制作OEM ARN01154U4 1.0的软件,jinkens上OEM的权限必须使用root,否则出现创建设备节点错误导致软件不能启动,使用Slave.VmLinux节点编译OEM软件。
调试了软件无线设备启用的问题,发现现在的函数接口很怪,通过设置两个全局变量进行判断是被是否生效,是否up,将这个函数修改并测试;
下午将软件发送给OEM课,和黄宜谊沟通过,需要准备铜线版软件。
2013.9.6
上午协助测试了GMT时间获取失败的问题,下午和新员工开了个小会议,了解一下新员工当前的学习情况和有什么问题。
2013.9.9
看了powerpc的ipv6部分的代码和客户反馈回来的需求
2013.9.10
昨天和产品部邮件讨论了TL-WR710N(EU) 2.0 TL-WR710N(UK) 2.0和具体要求,发现和立项报告中描述的不一样,定下了具体的处理细节。
下午完成了ISP支持IPv6接入技术要求.doc并发出了产品部同事,接下来看是否有需求继续晚上这些接入方式。
华为的E3276还在解,但是没有一个质的飞跃,还是在debug解决,方法并不多,这个由点悲剧了。
741KS版和3220RU还有proware 3g401d需要提测了,本周内完成。
2013.9.11
提测,无线学习;
2013.9.12
无线学习,协助mobile组解决E3276,提测;
2013.9.13
整理维护的项目,新立项TL-WD1023 2.0俄语版,准备pw-3g401d的提测工作。
2013.9.14
加班回来看了几款IPv6路由器的界面,和我司ADSL组的界面设置。验证了在IP盘地址修改后接口会发送RS报文。
和boss聊工作,如何教导新员工,个人定位问题;
第一:提高自己的威望(技术能力,组织能力);
第二:引导新员工思考分析问题,而不是手把手教导;
第三:利用自己的经验对项目的风险进行评估,安排员工的工作进度;
第四:项目评估,引入某个功能,对性能的影响,距离,icache;
第五:进入新的领域,沟通和讨论的重要性;
2013.9.16
今天主要是参与qifan博士的无线培训课程,刚开始讲得很细致,从无线传输的电波的波形开始,到OFDM,BPSK,QPSK,16QAM等,偏理论。下午讲11n的MAC和PHY,不是很懂,要看PPT和书;
2013.9.17
上 午继续参与培训,802.11ac,下午整理IPv6的接入方式,并且编码实现。第一个是slaac的或的前缀和长度,需要传送到用户态空间,可以利用 addrconf.c中邻居发现的参数。晚上开始调试,发现powerpc的编译出现问题,没有编译成功,原因是无线驱动中的app没有权限。这个我自己 也有问题,想偷懒,全部编译代码,
不要太懒,踏踏实实做好每一步都调试。
2013.9.22
跟踪工厂反馈的RU 版长按RESET/WPS键会出现死机现象,跟踪过代码,是因为进入了TFTP Recovery功能。
配置svn的权限,开通了ap136的代码权限。台风,下午5点就下班了,来深圳第一次遇到这种事情。
2013.9.24
提测软件,编写SLAAC的代码
2013.9.25
杂事比较多,对乌克兰新标案的评估,回复bugzilla,整理手上的OEM和特制项目;
2013.9.26
今天要做的事情
整理培训的问题
准备710 的提测
IPv6模块编码和测试
2013.9.27
无线培训一天
2013.10.10
上午调试IPv6,SLAAC已经ok,下午筛简历和开会,boss分派了一个新的任务TL-WR820ND(RU) 2.0.参考机型ZyXEL的Kennetic系列。
2013.10.12
上午解决3220遗留的bug,准备提测
下午调试4900的ipv6,slaac基本完成,正在调试dhcpv6;
和讨论AC/AP的项目背景,产品形态,组网方式,相关技术等问题。
2013.10.14 星期一
上午解决401d测试反馈的bug,下午刷了一下简历,解答测试部和产品部关于4G自动检测网络的问题。工作效率还是很低啊。
2013.10.15
2013.10.16 星期三
修改ipv6代码,修改bug 40781,修改switch寄存器,使帧长度是1518字节,增加了802.1q vlan的正常必须是这个长度。
2013.10.17 星期四
上午修改ipv6代码,下午筛简历还有处理生产检验标准和ap136 russia编译问题。
2012.10.21
开会讨论了842 RU的软件定制功能,安排工作人员;
修改IPv6的代码框架,使用番茄时间管理方法。
2013.10.22
昨晚没休息好,早上没什么精神。整理842的任务,发了出去,到4楼测试部看一个问题,741跑LAN->LAN smartbit的时候,ping LAN 发现不能同。
2013.10.23
IPv6重构最终没有进行下去,因为ppp要支持ipcp和ipv6cp,这样下去时间估计要很长,还原到原来的样子。这样有一个惨痛的教训,当初做的时候没有进行备份,导致需要花时间进行还原。这个错误不是第一次犯了,一时之快导致后续的痛苦。
在hornet_linux_hornet上合并了兼容Freebox的代码,等待工厂的样机进行调试;
2013.10.24
下午请假陪妈妈去医院
2013.10.25
上午调试ipv6的slaac
给mobile组oem的目录,多次反复,给批;
下午开会了解关于Freebox的问题,测试,发现原来的版本RE端可以ping通RootAP,LAN端PCping不通RootAP,升级修改的软件,发现两者都不通,我日个悲剧了。
2013.10.28
上午测试了wa730re,跟踪extender模式下的收发包函数,和freebox的兼容问题已经解决;
下午指定842ru的软件计划,boss看过原来的说太简单,没有详细的时间计划安排;
2013.10.29
处理邮件,修改842ru的问题,沟通乌克兰标案的进度;
下午处理IPv6的LAN端行为;
2013.11.1
参考dlink的页面设计,修改pppoe web的设计,重新整理LAN的地址分配方式,还没完成,很多页面和RPM的参数都要修改 。
2013.11.7
修改pppd和webserver中的ppp拨号部分,支持ipv6和ipv4同时共享一个连接,测试可以IPv6和IPv4拨号,但是获取IP和拨号状态还存在问题。
2013.11.8 周五
修改LAN端的地址配置方式,测试。
2013.11.11 周一
调试了pppd的新创建session接入方式,发现在ppp拨号成功后出现设置默认网关失败,原因是system调用返回1,但是在串口中调用命令设置成功;
PW-MN401D 2.0 TCL版出现问题,测试结束后没有及时出ECO更新ERP系统中的BOM,导致工厂使用了旧软件生产导致返工,这事情惊动了boss,要找原因。很明显是在推动项目的时候疏忽了,没有将完整的软件流程走完。
2013.11.12 周二
pppd出现两个默认网关,一个是eth0.2,原因是ra报文会影响eth0.2。
pppd默认网关,如果发送RA,因为要将LLA地址删除在添加,所以原来设置的默认网关也会删除。将添加网关放在发送RA之后执行;
另外,system的命令行多余的/r/n导致软件执行system失败。2B啊~~~
2013.11.13 周三
今天主要解决正在测试的项目,包括3220 ru 3220un 710uk等遗留的bug,并且安排提测。在解决quick setup中MAC clone的时候,没有看清楚一个参数,就调用toupper函数,导致不支持该对象,太粗心了,浪费了时间。
2013.11.14 周四
今天将3220 ru遗留的bug都解决了,dhcpc增加option 50的选项,修复无线的问题,明天准备提测。
2013.11.15 周五
今天上午提测3220ru版软件,下午条是IPv6,功能没什么问题,主要是搞页面的逻辑好RPM的逻辑问题;
2013.11.18 周一
上午帮解决虚拟机和XP不能互通的问题,将NAT模式恢复设置,使用默认的IP地址就好了;
调试ppp接入方式,页面的逻辑还有断开的操作;
2013.11.19 周二
评估741 5.0 GPIO修改方案,优化IPv6拨号状态。
2013.11.20 周三
上午开会讨论701 2.0的smart ip功能的修改,下午答辩,有一个介绍Lua脚本语言的,蛮有意思的,回去search下;
2013.11.21 周四
上午组内预答辩,下午处理项目安排,移植IPv6到741,发现,模块耦合太大,在4900上没有考虑功能的可插拔性,没有做好模块独立,在移植过程中需要考虑这个问题并做好模块独立;
2013.11.22 周五
先记录bug 41846,44485
移植到741上,串口输出
vlan init params fail.
sys_init_module: 'athrs_gmac'->init suspiciously returned 1, it should follow 0/-E convention
sys_init_module: loading module anyway…
Call Trace:
[<801e5b48>] dump_stack+0x8/0x34
[<80046acc>] sys_init_module+0x150/0x214
[<8000d984>] stack_done+0x20/0x3c
vlan初始化失败。
重新编译以太网驱动,问题解决。
2013.11.25 周一
pppoev6FormatCmd函数打开sprintf(buf + strlen(buf), " lcp-echo-failure 5 lcp-echo-interval 10 ");两个参数后,httpd挂了。
原因:IPV6_ECHO宏中的问题,这里传入的buf是1024,里面的可变参数
设置无线最大可关联的数量:
在函数ieee80211_vap_setup中 vap->iv_max_aid = IEEE80211_AID_DEF;进行设置
修改后出现问题:
Kernel bug detected[#1]:
Cpu 0
$ 0 : 00000000 00000074 0000007c 00000001
$ 4 : 80248350 00001e95 00000001 00001e95
$ 8 : 0000000a 00000000 00000001 20646576
$12 : 000000cd 00000032 00000001 00000000
$16 : 00000200 81f90840 80ccc000 00000000
$20 : 80ccfca0 80ccfc88 00437a8c 00000002
$24 : 00000002 c0875be0
$28 : 81c86000 81c87d38 0000003a 80166d50
Hi : 00000000
Lo : 1efac000
epc : 80166d50 skb_put+0x74/0x90
Tainted: P
ra : 80166d50 skb_put+0x74/0x90
Status: 1000ff03 KERNEL EXL IE
Cause : 10800024
PrId : 00019374 (MIPS 24Kc)
Modules linked in: umac(+) ath_dev(P) ath_rate_atheros(P) ath_hal(P) asf(P) adf nf_nat_sip nf_conntrack_sip nf_nat_rtsp nf_conntrack_rtsp nf_nat_h323 nf_nat_tftp nf_conntrack_tftp nf_nat_ftp nf_conntrack_ftp nf_nat_pptp nf_conntrack_pptp tp_domain athrs_gmac statistics wlan_warn pptp pppol2tp br_filter ts_kmp cls_fw cls_basic sch_sfq sch_prio sch_htb ipt_TRIGGER ipt_REJECT ipt_REDIRECT ipt_MASQUERADE iptable_nat iptable_filter ip_tables nf_nat_proto_gre nf_nat nf_conntrack_ipv4 nf_defrag_ipv4 xt_state xt_conntrack nf_conntrack_h323 nf_conntrack_proto_gre nf_conntrack ipt_multiurl xt_time xt_string xt_multiport xt_mac xt_iprange xt_comment xt_TCPMSS xt_MARK xt_tcpudp x_tables
Process insmod (pid: 395, threadinfo=81c86000, task=81c84a18, tls=00000000)
Stack : 00000040 c09559bc 00000e10 00000708 81f99043 81f99020 81f99e30 81f99840
802238ac 00000200 00000000 c09559bc 80ccc000 c09585e8 80ccfca0 c095d66c
00000003 00000001 00000001 00000001 00000001 c07ee690 00000200 00000000
00000001 80ccc000 c09382b4 00436ef8 00437a8c 00000002 0000003a c094be00
c0ad5000 81c87e10 80ccfb84 c095c474 00000008 00000001 00000001 00000001
…
Call Trace:
[<80166d50>] skb_put+0x74/0x90
[
[
[
[
[
[<80002468>] _stext+0x68/0x1ec
重新编译kernel,但是出现squashfs的问题,原因是因为mtd devices中的刷flash的方法给周斌修改过,具体修改的原理不清楚,回退到11572版本后没问题。
mtd驱动修改了写flash的方式,对应地,httpd也要修改写flash的方法。
2013.11.26 星期二
上午收到工厂那边要定报废芯片责任问题,扯皮了很久,发现时因为软件因为其他原因没有及时更新。
下午提测增加到31 sta的软件。杂事很多。
2013.11.27 周三
早上回来找蔡导讨论freescale的事情,向工厂咨询芯片产生不良的原因和经过,并提测是否可以在不良的芯片中找可以用的,这两可以减低废品量
下午解决743的bug问题,代码中ppp部分增加了IPV6的兼容,导致软件有见问题卷积了。看来要狠心点,快刀砍乱码。
2013.11.28 周四
上午调试了IPv6的帮助,编译软件,测试在原来的基础上升级到beta版是否有问题,出现升级带uboot后软件,板子变砖了。
重新烧Flash后发现串口不能登入,原因是需要重新烧校准数据。
2013.11.29 周五
昨天下午说明天的考试我也要参加,所以今天复习一下,处理完项目的状态就开始看书复习了。重新看c语言基础,还有数据结构,算法,
算法很多都忘记了,如果要靠排序算法,等GG吧。
2013.12.2 周一
周五的考试考的不好,树的访问和逻辑运算做的不好,代码编写缺乏总体把握度,第一题没看清楚题目,写道最后才改了改。据说这次考试是裁员用的,准备舍生成仁吧。
上午安排了ISP Configuration的任务,和测试部同事/产品部同事协商了IPv6的测试,我的意思是想提测一版,毕竟修改了很多。
下午测试了PPP的连通性,从LAN端PING WAN端,整理代码,一些逻辑上的还需要整理一下。
2013.12.03 周二
(none) login: Now flash open!
vlan init params fail.
sys_init_module: 'athrs_gmac'->init suspiciously returned 1, it should follow 0/-E convention
sys_init_module: loading module anyway…
Call Trace:
[<801e5b48>] dump_stack+0x8/0x34
[<80046acc>] sys_init_module+0x150/0x214
[<8000d984>] stack_done+0x20/0x3c
2013.12.04 周三
今天是QCA的培训,上午讲了QCA的一些芯片的历史,命令和无线驱动的调试方法,通过命令可以进行无线功能的配置。
下午介绍了一些概念性的东西。
使用编译命令:
make httpd_build WEB_SERVER=web_server_VNM VLAN_IPTV_IGMP_SNOOPING=1 PID=74104ipv6
编译出的httpd 可以执行
原来出现问题的是因为没有VLAN_IPTV_IGMP_SNOOPING=1这个宏
晚上继续调试ppp拨号,计划周5提测。
2013.12.05 周四
调试ppp,安排ISP configuration事情
2013.12.06 周五
早上会讨论RTT和art2产测的事情,下午检查SLAAC,发现kernel不能设置默认网关 ,原因是web_server设置accept_ra为2,到kernel不生效,
ndisc_router_discovery函数没有设置默认网关就跳出。
该参数可能被kernel里面的某个地方修改了。
原因是执行ip -6 addr del fe80::e02:22ff:fe0a:241/64 dev eth1删除eth1的LLA地址后,
cat: /proc/sys/net/ipv6/conf/eth1/forwarding: No such file or directory 这个文件不见了,在添加这个地址后,值变成1. 这种表现形式和kernel的版本有关系,powerpc的2.6.35的版本不会表现成这样。
2013.12.9 周一
调 试了DHCP,遇到3个小问题,第一个同6号发现的是一样的,网关的获取问题,已经解决,第二个是有时候出现system错误,这个在调用dhcp6c的 时候遇到,重启后问题消失,第三个偶然出现IPC:this msg is not for dhcpc,这个很可能是在busybox里面打印出现了,添加了打印信息,这个问题偶然造成dhcp6server反回的信息,httpd不能获取。
2013.12.10 周二
IPv6 终于提测了。下午收到产品部说要整理这个模块的需求然后再讨论,早干什么去了。boss咨询了一下WR748项目,这个是vx平台使用PNE2.2协议栈的项 目,不是我维护的,一头雾水啊。下午看了俄罗斯VLAN tag的实现原理,网桥的使用和802.1Q,晚上加班解决了dhcp option50 字段的bug。
2013.12.11 周三
设置共享网络,但是先要删除NAT转换协议,在控制台下输入命令
netsh routing ip nat uninstall
删除已经存在的连接
net use * /delete
字符集选择UTF-8 安装3.50.72版本的sourceinsight, ok
在ubuntu上编译代码,工作主机可以空闲出来了,爽。在编译无线工具时提示没有uuencode工具,需要安装sharutils。
acl.h找不到,需要安装:
sudo apt-get install libacl1-dev
sudo apt-get install uuid-dev
2013.12.12 周四
开始完整移植IPv6到 1043
1)kernel
kernel要修改
a.Z:\branch_ap136\ap136\linux\kernels\mips-linux-2.6.31\net\ipv6\Kconfig 曾加SLAAC的传参选项;
b.修改Z:\branch_ap136\ap136\linux\kernels\mips-linux-2.6.31\net\ipv6\addrconf.c
c. 修改Z:\branch_ap136\ap136\linux\kernels\mips-linux-2.6.31\net\ipv6\ndisc.c
d. 修改 Z:\branch_ap136\ap136\linux\kernels\mips-linux-2.6.31\include\net\ndisc.h
e. 修改Z:\branch_ap136\ap136\linux\kernels\mips-linux-2.6.31\include\linux\ipv6.h
kernel修改完成
2)更新Z:\branch_ap136\apps\ipv6_tools\wide-dhcpv6
3)更新pppd
4)修改Makefile.apps,使用ppp-2.4.3目录,而不使用ppp-2.4.3_ipv6目录S
export CONFIG_IPV6=y
5)修改Makefile ,根据OPTIONI选项是否包含_IPV增加export CONFIG_IPV6 = y
6)更新ipv6_tools中的radvd-1.7目录
OEM产品工程师反馈Bug28593(在4900上已经解决)在RU版本软件中没有更新,影响俄罗斯客户使用IPTV,这个需要和Soft Recovery功能一起更新,先在MR3220RU上更新。
ISP Auto Configuration问题第二连接需要确定静态IP参数,给出的表是没有的。
2013.12.13 周五
上 午讨论了ISP Confguration实现的细节问题,还好有这次的沟通,原来我自己的想法是偏复杂的,实际的实现和我的想法不是一样的,从这一点我想到了IPv6的 实现,很多时候都是由我一个人去想,按照自己的理解去定义这个模块的功能,这样做现在看来是有风险和局限性的。下次IPv6功能定义的会议应要讨论好需求 问题;
俄罗斯业务反馈今年的业绩,给我们研发施加压力,842的进度要加快一下了。boss的意思还是让我先负责这一部分的工作内容。先做好这个项目吧。
2013.12.16 周一
上午合并了无线组播LEAVE报文没有转发的patch,下午搞了卡巴斯基出了问题,恢复,天气很冷,而且下雨,很冷,没有加班,回家休息;
2013.12.17 周二
上午编译了软件,自测了无线组播的问题,还有dhcp option 50的问题,准备提测。IPv6越南反馈测试的结果,PPPoEv6有问题,但是没有详细的说明。
下午移植IPv6到ap123,先熟悉ap123的代码结构,和ap121又是不一样的东西。在移植wide-dhcpv6时,获得了前缀也要设置状态成功,这个应该就是西班牙反馈的问题。
移植ppp的时候发现信号量需要变动:PHASE_RUNNING_IPV6CP 18
ap123的编译目录架构
Makefile.modules用于定义Makefile全局变量,
在\build\product_config\wr842ndv2_ru\modules.config文件中定义模块的参数,决定这个模式是否编译到软件中;
build目录下的Makefile.modules下定义了系统包含的驱动和apps,这些驱动和apps都是根据模块的参数决定是否编译到软件中的;
在product_config目录下存在多个机型的配置目录,一个目录对应一个机型,目录中包括配置文件:basic.config,busybox.config,kernel.conf,model.conf,modules.conf。
要定义usb_debug,否则没有usb_core.ko这个库;
kernel_modules编译不过,
2013.12.18 周三
art编译不过,原来的编译项没有指定BOARD_TYPE,指定BOARD_TYPE=ap123后也不行;
export INSTALL_ROOT=$(TOPDIR)/rootfs.build.$(KERNELVER)
export INSTALL_ROOT_FOR_BOARD=$(TOPDIR)/rootfs.$(DEV_NAME)
apxxfus_fs_prep :
cp -Rf $(INSTALL_ROOT) $(INSTALL_ROOT_FOR_BOARD)
拷贝为每个机型拷贝一份目录
Bug 33181
radvd进程退出方式错误,现在的方式是发送kill 9 信号,杀死进程,应该发送kill 15,让进程终止。暂不修改。
2013.12.19 周四
分析解决dhcp6c 调用失败的问题
2013.12.20 周五
管理者答辩大会,学习别人的管理和处事的经验
2013.12.23 周一
上午重新测试741 ipv6,检查isp auto config的代码,编译,上传代码。和song协商842的项目推进方式,先不提测带IPv6的。
1043 ru的问题,是以为3220 ru和1043 ru的方案是不一样的,所以两者的VLAN划分不一样,明天讨论一下这个问题。
2013.12.24 周二
上午主要跟进项目进度,讨论PW-3G401D 2.0上开发OpenWRT的问题,分配正在测试项目的bug。
下午调试ISP AUTO CONFIG 功能,讨论IPv6 接入的问题,ADSL有新的样机,有时间拿来参考
2013.12.25 周三
圣诞节
上午给产品部催1043的问题,发现这个项目开始的时候就走了错误的地方,将hornet那套东西拿过来,但是这个是scopion方案的,和hornet不一样,支持硬件NAT。
后来经过讨论,发现和4300ru的无论TagVlan和Bridge都是和我司产品一样的,但是划分VLAN的方式不一样,HNAT和VLAN Tag不能共存的问题是因为在HNAT中写固定了VLAN Tag ID。
在ubuntu下多过载一个NTFS的分区,这下可够硬盘空间下载代码了。
在project目录下新创建disk目录
#mkdir disk
然后挂载NTFS格式分区
#sudo mount /dev/sda5 /home/project/disk/ -t ntfs
2013.12.26 周四
上午:整理项目,安排自测740RU,讨论842RU的3G模块的设计,产品部需要改变当前的功能形态;743测试结束,处理提交的bug。
下午:阅读HNAT的PPT,阅读4300的HNAT的代码;过来找我讨论842RU 2.0 3G/4G模块调整的问题,给了一个初步的方案,但是代码修改比较大;
越南IPv6测试已经回复,分析WAN的抓包,发现对端不支持IPv6CP;
4300的代码有点多,一时之间看不过来,先重点看寄存器和IGMP部分。
/* Port map
P0 P1 P2-P5
CPU WAN LAN
*/
P0:CPU
P1:WAN
P2~P5:LAN1~LAN4
4300的划分VLAN的函数是athrs17_vlan_config,参数的最低0~6是设置VLAN的值,位图是:
P6 P5 P4 P3 P2 P1 P0
0 0 0 0 0 0 0
LAN4 LAN3 LAN2 LAN1 WAN CPU
拿一位置为1,表示可以和该Port通信,就是说把frame发送到该端口。
但是1043是不一样的,分配如下:
/*
* Port map
* P0 P5 P1-P4
* CPU WAN LAN
*/
SVID和CVID
两者都是12bit,这个和802.1Q 4Byte中的12bit ID是一致的。
athrs17_reg_init_wan寄存器初始化
2013.12.27 周五
讨论IPv6功能问题,需要参考现有的其他厂家的机型;解决743项目剩余的bug。
2014.1.6 周一
这段时间请了4天的假期,家里发生了很多很多事情,回家处理。
请假的这段时间,在忙自己的事情的时候,也想通了很多的问题。
回 到公司第一件事情就是看邮件,主要的邮件还是俄罗斯的两个项目,第一个是1043RU的项目,这个发哥处理的不错,已经解决好驱动和HNAT和 TagVLAN的问题;第二个就是842RU的问题,产品工程师需要修改3G Prefer/WAN Prefer的机制,需要修改成1.0的方式,这个是我一直不同意的。
下午在740/741ru上合并了组播退出问题并且自测。给力奖出来了,榜上有名,高兴之余感觉受之有愧。
2014.1.7 周二
提测了740 ru版本软件
测试ASUS的3G 备份的方式,但是尝试了3个modem都不能拨号成功,后来宋阳用MA180进行测试并提供了backup的方法;
下午测试netgear IPv6的接入方式。
重感冒,晚上没有加班,回家去了。
2014.1.8 周三
上午继续测试netgear的ipv6模块,将自动检测/自动配置两种方式在WAN端开启不同服务器的行为测试了一下,并且在文档中记录下来;
整理了一下测试过程中的项目,743已经出ECO,还有3220ru也是可以的,快结束吧。
下午热心的测试了华为3331的modem卡,和俄罗斯的yota类似,modem是一个router,有自己的dhcp,通过http请求进行控制。
2014.1.13 周一
上午查看项目进度,分配和回复bugzilla的bug
下午整理ipv6的pppoe模块
2014.1.14 周二
2014.1.15 周三
上午查看了DLINK的DSL-2890AL样机的IPv6功能,功能比较完善,但是没有WAN口进行抓包分析;
解决3220 的无线灯在无线功能被按钮关闭后,LED灯还是亮的问题。注意无线驱动中的ar7240_gpio_out_val函数,当设置1时是灯灭,0时为亮,这样处理的原因是无线开启时,无线灯常亮,当有数据传输时,咩一下,然后保存常亮。
/proc/simple_config/wlan_led这个文件的被宏MODE_APC_ROUTER包裹着了,这个宏决定的是WISP模式,3220不支持WISP模式。
下午看了4G 的代码,重新查看因为设备名称而导致拨号失败的问题
2014.1.16 周四
上午开会讨论C8上使用新UI的问题,邮件讨论了Modem同步的问题;
下 午看了QCA提供的patch和分析方法,原因是DUT对device返回的ACK包识别问题,看patch,通过函数hub_port_status查 看port的状态,如果失败,则清除先前的SOF(start of frame)寄存器,并且等待下一个SOF,并且重新reset USB的PHY寄存器。
晚上调试了842RU的ISP Auto Configuration,成功,上传代码。
2014.1.17 周五
2014.1.20 周一
上午回复了邮件,看了项目的进度
下午将IPv6的pppoe 的SLAAC和DHCP合并在一个选项中,但是调试时又再出现dhcpc 返回255的问题,后来重启了路由器和服务器这个问题消息,如鬼魅般。这个问题余楚伟跟过,
httpd通过system启动dhcp6s之后,dhcp6s执行到yyparse函数里就退出了,我猜是发生段错误之类的。如果是手工启动dhcp6s的话就很正常。
应该是httpd进程本身的环境影响到dhcp6s,导致该问题的产生。
【解 决方法】由httpd启动dhcp6s就会出现该问题,如果在串口手工启动dhcp6s就正常,这很大概率是由于进程环境继承造成的。再考虑到httpd 中是将stdout/stdin/stderr关闭的,而手工启动dhcp6s的话stdout/stdin/stderr是打开的,由此猜测 dhcp6s会往stdout/stdin/stderr写出数据,但由httpd启动的话fork出来的dhcp6s中stdout/stdin /stderr是关闭的,从而导致了段错误的产生。
往这个方向去分析代码和进一步确认,结果证明我的猜测是对的。
将cftoken.l中有关DP/DECHO/DNOECHO的定义改为空就可以了
Plto 回我邮件了,说了datasheet上寄存器地址和时间代码中地址的转换规则,看了see mips runs,datashee中的地址偏移从0开始,就是kuseg段的地址,需要映射到uncacheed地址中,所以需 要+0xA000.0000,plto的邮件说这是个cached地址,可能说错了,已经发Email咨了。
2014.1.21
今天上午想实现将IPv6协议栈中的WAN口设备的名字通过proc文件系统和用户态进行通信,但是在设置了proc之后,加载驱动后发现所有的网络设备的LLA地址都生成失败。
下午申购的电脑都了,换电脑。
2014.1.22
换电脑,重装所有的软件,还有就是想在虚拟机中安装ubuntu,但是失败了,还是使用另外一台电脑作为编译电脑吧,浪费了这么好的配置了。
2014.1.26 周日
前 两天合并了IPv6的代码,正在调试,整个模块的功能还不是很明确,感觉为了存在而设计的模块,今天调试pppoev4和v6的拨号问题,发现如果开机的 时候同时选择v4和v6有很大的几率导致httpd挂起,这个问题还没有解决。IPV6_ECHO在输出的时候出现一个错误,导致httpd挂起,出现 core文件。
代码已经上传svn,年后在仔细调试一下了,下午先编译一个beta软件给业务。
2014.2.7 周五
马年第一天上班,节后综合症还不算明显。
年前将代码上传了SVN但是页面上没有显示IPv6的功能,原因是menu部分的修改没有上传,上传后编译软件测试,系统日志有问题,明天需要测试3G 和IPv6拨号是否存在干扰的问题。
2014.2.8 周六
使用svn比较文件的某两个历史版本
svn diff -r25813:26015,这个命令比较版本26015和25813的差异;
2014.2.10 周一
天气很冷,下着雨上班就是一种折磨
上午将正在测试的项目整理了一下,3220 ru出了ECO,planet的也已经出了ECO,做好记录。兼容E3331的软件已经发给赵越,让他给客户。
下午检查842的IPv6功能,出现过从PPPoEv6切换到DHCPv6出现core文件,httpd挂起,但是重新编译了web_server后一直没有出现;
wide-dhcp增加了log_to_web的输出,原来出现的dhcpc进程启动失败,很可能是函数cfparse导致的。
2014.2.11 周二
看了GuestNetwork的设计文档,了解了在bridge层的ebtables和Guest Network的实现原理。
2014.2.12 周三
上午看iptables,在iptables里面可以增加自己的一个模块,用于修改ip报文的参数,参看xt_TCPMSS.c
下午整理了hornet平台遗留的bug,分配解决人。
2014.2.13 周四
分析kcodes的打印机驱动在1043 RU上不能挂载的问题,因为这个驱动是在1043 1.0的kernel基础上进行编译的,后来增加IPv6的驱动,修改了配置文件盒kernel的配置,需要重新编译。这个问题在已经提测的2.0 UN上也存在;
分 析IPv6 西班牙841 DHCP的问题,和4900相比,两个差异,一个是网络接口的LLA地址,841不是通过EUI64格式构造的LLA地址,第二个DHCP报文的格 式,841多了两个字段Fully Qualitifed Domain Name和 Vendor Class.
2014.2.14 周五 元宵节
上午在wide-dhcp中查看了多出来的两个字段是如何加入到option中的,回复了业务的邮件告诉两个报文之间的差异。
回复了PW-3G401D的bug,需要将该项目结束掉,下午测试部反馈bug已经全部回复,准备出ECO;
哈沙克斯坦反馈 K3272有在3220上有的板子OK,有的不行,原因是:
Host 发出了SETUP Token,但是对于device返回的ACK,识别失败,Host继续发送SETUP Token,第二个SETUP Token报文可以识别,然后Host发送IN Token报文,但是Device返回NAK,多次返回NAK后,modem重启。
修改方式:在usb/core/hub.c中的hub_port_reset函数中,通过 hub_port_status()获得端口状态,根据状态判断在Port完成reset的时候,判断枚举是否失败,如果失败则等待一个SOF后,Reset USB PHY.
2014.2.17 周一
翻阅邮件,以前在4300上反馈过一个关于DUID中LLA地址和源MAC地址不一致导致DHCPv6 服务器不回复请求的bug,所以841上遇到的很可能是这个问题;
突然翻4900的旧账,说出了一个beta版本,但是4900的代码都给我删掉了。
842自测,上午测试了WLAN->LAN的throughput,只能达到94Mbps,原因是路由器的是百兆switch,坑爹的设计;
2014.2.18 周二
上午技术交流会,主要是Switch和HNAT相关,介绍了VLAN划分,HNAT的实现原理,和一些debug的案例,包括:
丢包;
MAC克隆导致的问题;
切换速率双工导致端口状态异常,没有对寄存器的写操作进行保护;
收包残留;
向所有口发送流控帧
PPPoE WAN口收到的帧的VID 2
HNAT读写寄存器的时间
下 午调试IPv6的RA,和YY讨论IPv6的设计问题。遇到一个问题,WAN是SLAAC的时候ping LAN地址不通,因为RA的前缀给转到LAN,而WAN又根据这个前缀配置了一个地址,导致LAN和WAN有一个相同前缀的地址,在路由表中,WAN口 IP对应的路由条目的metric比LAN 的小,所以默认的包都发到WAN了
解决方法,将WAN的RA构造的IP删掉。
2014.2.19 周四
在检查842 RU的时候,PPPoE偶然出现了kernel Panic的错误,跟进到kernel中,原因是在pppoe_device_event中有一个BUG_ON的宏,如果device设备指针为空的话,这里要出现panic的提示。
2014.2.20周五
准备IPv6开会的资料,在认证论官网上下载了最新的CE_Router的文档,大概看了一下,是用来测试CE router行为和属性的测试用例和说明,很适合。
下午开会,boss和boss也去了,初步定了哪些功能要实现,然后后续的工作还是以CE_Router研究为主。
2014.2.24 周一
看了网桥的资料,还有咨询对于IPv6 bridge模式的实现,看了ip6tables的手册。更新了提测项目的bugzilla信息。
2014.2.25周二
上午分析了dhcp中的client DUID生成方式,发现在841发出的包中,这个DUID中的LLA不是WAN口设备的地址,修改函数get_duid,使获得的接口是WAN口设备的MAC地址。
下午合并了1043的RTSP的bug,配置VLC不成功,软件已经发给业务,等测试同事回来咨询一下如何设置VLC server。
发布了710 UK版本。
kcodes反馈了新的driver,但是发现在英文版的还是不能用,查看原因,是两者的kernel配置中的 CONFIG_MODVERSIONS项设置不一样。
2014.2.26 周三
上午收到了1043 rtsp的测试结果,ok,我在本地陪失败的原因是,只能用554端口,默认的5544端口不行。
产品部要求制作Beta软件,但是发现现在的beta软件的水印没有了,只是在软件的版本后面加了BETA字样,还在咨询产品部最终的做法。
下午按照产品部的要求添加水印,在编译软件的时候发现libmsglog.so没有拷贝到文件系统中,执行这个拷贝动作实在msglogd目录中的makefile执行的,不是在build目录下
export INSTALL_ROOT=$(TOPDIR)/rootfs.build.$(KERNELVER)_$(BOARD_TYPE)
export INSTALL_ROOT_FOR_BOARD=$(TOPDIR)/rootfs.$(BOARD_TYPE)
最终打包的文件是INSTALL_ROOT_FOR_BOARD里面的文件
apxxfus_fs_prep:
rm -Rf $(INSTALL_ROOT_FOR_BOARD)
cp -Rf $(INSTALL_ROOT) $(INSTALL_ROOT_FOR_BOARD)
GPL_NetUSB: version magic '2.6.31--LSDK-9.2.0_U6.616 mod_unload modversions MIPS32_R2 32BIT ' should be '2.6.31--LSDK-9.2.0_U6.616 mod_unload MIPS32_R2 32BIT '
NetUSB: version magic '2.6.31--LSDK-9.2.0_U6.616 mod_unload modversions MIPS32_R2 32BIT ' should be '2.6.31--LSDK-9.2.0_U6.616 mod_unload MIPS32_R2 32BIT '
2014.2.27 周四
头痛。
上午分析1043 UN版kcodes挂载不上的问题,应该是ip协议栈RU和UN不一样,导致使用RU的SDK编译出来的NetUSB.ko认为socket的 API版本不一样,咨询了kcodes的工程师;
第二个就是按测试部的需求制作一个测试IPv6用的842软件,指导员工,检查代码。
2014.2.28 周五
天黑
早上回来,天黑黑的,估计要下雨,今晚踢球悲剧了。
上午回来先合并了最新公布的4G modem的驱动,并且更新了模式切换命令库文件。对于qmi_wwan_core驱动,有时间要看看工作原理,
特别是product_id中的数据结构。
合并完后阅读VLAN的资料,到现在还是不明白VLAN划分和最终发送port的关系。再看资料,搞不清楚再问侯哥。
下午跟进几个正在进行中项目的事情,第一个是Hexa第二次提测,第二个是740RU的bug的跟进,UPNP在L2TP拨号模式下多次开关的问题没有复现,
抓包发现,在刷新网络邻居的时候,会发M-Search报文,在Enable状态下有回包,Disable无。还有另外一个问题,不管是Disable或者Enable,都会发送SSDP报文。
下午,天没雨,庆幸啊!
2014.3.3 周一
早上回来回复了740 ru的bug,上周5的upnp的问题是在XP系统上设置一个UPNP条码,测试用例上没说清楚,不过在我的XP系统上按照测试同事的说明没有找到添加的位置,该问题咱是不修复先。
重新编译一个842 的IPv6的软件给PP用于认证的测试;
下 午发现740 RU在Jenkins上编译,然后通过web升级uboot.bin到开发板时,发现uboot挂起,uboot按理只修改了tftp部分,检查修复的代 码,有两个地方有点问题,一个是函数没有参数,但是实用的时候输入了参数,第二个是函数声明,但是修改后,问题依旧。
尝试在jenkins上指定到第三次提测的uboot版本也是出现这个问题。问题没定位到!
拿到一分双uboot调试uboot的文档。
2014.3.4 周二
上 午回来,PP说842的ping6 app不能运行,跟踪发现因为实用的是4900的,而makefile中没有清空而没有重新编译,这里的makefile很奇怪,在外城已经清空了*.o 文件,但是因为ping6 app没有清空,iputil没有重新编译,必须要将ping6清空;
740 ru的uboot编译问题,现在跟踪到是因为在jenkins上编译的uboot.bin是经过lzma压缩的,但是在开发板上运行的时候,解压缩失败,而在本地编译的是没问题的。
在uboot中想打开go命令, uboot中支持的命令在文件\include\configs\ap121.h中定义。如定义支持命令则通过宏
#define CONFIG_COMMANDS (( CONFIG_CMD_DFL | CFG_CMD_DHCP | CFG_CMD_ELF | CFG_CMD_PCI | \
CFG_CMD_MII | CFG_CMD_PING | CFG_CMD_NET | CFG_CMD_JFFS2 | CFG_CMD_ENV | \
CFG_CMD_FLASH | CFG_CMD_LOADS | CFG_CMD_RUN | CFG_CMD_LOADB | CFG_CMD_ELF | CFG_CMD_ETHREG ))
2014.3.5 周三
帮助匡同学分析L2TP按需拨号失败的问题,发现是因为L2TP的进行xl2tpd中调用的pppd是没有传uint参数,在pppd中使用了默认值-1,所以生成了ppp-1.pid文件,而在httpd中读取的是ppp0.pid,出错;
下午向大黄了解uboot中的点灯事情,路由器启用时的亮灯仪式,是由路由器中的ar7240_all_led_on函数执行的,这个函数中
gpio = MY_READ(0xb8040008);
#ifdef CONFIG_PID_MR302001
SETBITVAL(gpio, GPIO_JUMPSTART_LED_BIT, GPIO_JUMPSTART_LED_ON);
SETBITVAL(gpio, GPIO_INTERNET_LED_BIT, GPIO_INTERNET_LED_ON);
SETBITVAL(gpio, GPIO_WLAN_LED_BIT, GPIO_WLAN_LED_ON);
SETBITVAL(gpio, 17, 0)
看datasheet,18040008控制所有GPIO的使能,32位 的寄存器表示32个GPIO,每一个bit表示一位,然后通过LED_BIT来指定哪个GPIO(这个要和硬件的原理图相 关), GPIO_JUMPSTART_LED_ON表示高电频还是低电频有效。
2014.3.6 周四
早上开会,一个惊人的消息,我司要上央视的315晚会曝光漏洞问题,现在需要做的就是将所有的软件要重新排查一次CSRF漏洞问题。上午就是挖坟,将一些不知道什么时候做,谁在维护的机型统统挖出来,然后一个个查料号。
下午西班牙841的问题反馈回来了,服务器可以分配IP了,但是多10分钟就断开,分析数据包应该不是DHCP的问题,具体问题还需要等待路由器的Log
2014.3.7 周五
早上找以前的邮件和重新测试741的软件,下午了解网桥和VLAN的工作原理和Linux的实现方法。
2014.3.10 周一
令人忧伤的一个周末,马航MH370飞机去哪儿了?天佑!
周 一回来先将现有的842RU 的bug先分派,然后分析841 西班牙反馈的抓包,这次很奇怪ICMP包发到路由器后,又重新转发到主机,然后到路由器,就是一个死循环,TTL不断减少,当ttl=0后,包丢了,看样 子是路由器的WAN口默认路由失效了,后面或者要打印一下路由表看看。
下午协助小晗搞MFC的Utility,添加一个页面。
uboot board里面有个芯片方案的的定义文件,如果要修改LED的GPIO,这个文件也要关注;
2014.3.11 周二
修改841 DHCP中的DUID的类型,发了debug软件;
协助调试uboot里面的tftp问题,宏要传入到net目录下,要修改net中的makefile;
2014.3.14 周五
修复Bugzilla上的问题,dhcp6c和dhcp6s还是存在问题,系统调用的时候失败,但是在串口输入命令可以。
Win7不支持RADVD的RDNS选项,所以还是需要dhcp进行DNS地址的公告。WIN7获取不到DNS地址,会设置三个默认的值:
fec0:0:0:ffff::1 fec0:0:0:ffff::2 fec0:0:0:ffff::3
2014.3.18 周二
解决842提测的bug
2014.3.19 周三
解决dhcp进行启动时出现的255问题,
分析,是在cfparse.c中的yyparse函数存在的问题,这个文件是通过bison 解析得到cfparse.y
bison -y -d cfparse.y /*得到文件y.tab.c和y.tab.h*/
mv y.tab.c cfparse.c
cfparse.y文件是对配置文件每一个option的解析语法,bison就是用于自动生成 语法分析器程序,实际上可用于所有常见的操作系统。Bison把 LALR形式的 上下文无关文法描述转换为可做语法分析的 C或 C++程序
在实际测试的时候,如果dhcp6s进程是由httpd调用,则yyparse函数没有执行完毕(日志中看到只执行到if (yychar == YYEMPTY)),就返回,system提示返回出错。
2014.3.20 周四
写了一个发送Router solicitation报文的函数,分析出问题的WAN口报文,应该路由器中丢失了转到br0的路由条目导致的。
2014.3.21 周五
今天回复业务的技术问题,分配bug,然后将842和1043的debug跟踪了一下,确认下次提测的时间。
讨论了841出问题的原因。
2014.3.24
2014.3.25 周二
在TR069中增加OpenSSL,在编译了ssl后,需要将头文件拷贝到交叉编译工具链中,否则编译其他文件引用不到。
编译后,发现openssl的库超过了文件系统允许的范围,
OpenAgent 支持SSL需要增加(单位:Byte):
libcrypto.so 1063376
libssl.so 220556
httpd 在OpenAgent打开USE_SSL宏后编译,增加:2168542 - 1948500 = 220042
跟中dhcp6s调用失败的问题,发现只有选择WAN是PPPoE,保持,重启DUT后,必然出现这个问题,而其他方式如动态,静态则不会。
2014.3.26 周三
会议,boss给我们开会,主要是如何处理事情。
1)鼓励工程师走出去;
2)OEM项目优先级放低,保证TP品牌项目进度;
3)预算周期(时间,人力,风险评估);
4)新平台开发,旧平台代码收敛;
5)契约进行,对自己有要求,项目不能delay太长;
6)组长角色,承上启下,不是满上欺下;
7)积极交流,电话,有问题主动提,不要等;
8)项目反馈,过程和结果,不要忽略过程;
9)工作预期,给人家一个预算;
10)安排工程师工作,新员工最多同时进行2个项目;
11)平等交流;
12)产品质量,研发,测试,生产;
13)校招新员工安排工作不需要太复杂。
晚上继续debug,发现时因为PPPoE方式和DHCP方式在初始化的时候差异导致,跟踪哪些函数调用了swGetWanType函数,发现最大的差异是PPPoE方式时,调用了pppIpMaskGet函数,然后跟踪该函数,发现时通过ioctl获取ppp0接口。屏蔽ioctl调用后,发现可以调用。那么问题就是ioctl影响到dhcp6s中的yyparse函数了。
2014.3.31周一
修复1043的bug,增加对修改无线配置免重启的支持,br0 MAC地址的获取各个产品都可能存在差异。
TR069中支持的参数和对应的处理函数在param_fun_lst中定义,发现WAN口不支持PPPoE方式下的IP地址获取,增加上后需要测试。
2014.4.1 周二
今天上午准备1043的提测,下午解答了dhcp6c的一些疑问,晚上看了下网桥转发的流程。IPTV就是通过网桥将LAN和WAN 进行
2014.4.2 周三
dhcp6c发送release是通过dhcp6ctl release命令进行,通过kill命令杀死dhcp6c进程是不会发送release报文的。
使用RAW 套接字发送RS报文的时候需要制定该报文发送的网络设备,可以通过查找"/proc/net/if_inet6"查找。
2014.4.8 周二
TR069 中在wan_dev.c中提供参数的RPC函数调用,从反馈的日志上看,获取IP失败,分析过代码发现当前WAN只支持DHCP和 PPPoE,web_server中通过ipConnectionType和pppConnectionType进行类型的配置,但是该参数不会被改变。
2014.4.9中三
查看RFC7083,修改了INF_MAX_RT和SOL_MAX_RT值,由120s修改成3600秒,原因是在一些情况下,这两个值会导致大量的聚集数据传输到到到服务器上。
以 太网线路上按“Big Endian”字节序传送报文(也就是最高字节先传送,关于字节序请参考相关文档),而比特序是”Little Endian”(也就是最低位先传送)。一个十六进制表示法表示的MAC地址01-80-C2-00-00-00,传送时的bit顺序就是:1000 0000 0000 0001 0100 0011 0000 0000 0000 0000 0000 0000,如下面的图(从最左边开始传送):
2014.4.11 周5
导 致问题出现的原因是路由器中的tr069客户端收到服务器返回的XML格式的报文后,通过函数mxmlLoadString 将XML中的参数读出并使用XML node tree数据结构存储这些参数,但是因为指向XML报文的指针发生偏位,导致数据包被截断(XML对大小写和格式都有严格要 求),mxmlLoadString 函数返回空,参数解析失败,这时候代码逻辑错误认为是内存不足,调用函数handle_termination 将tr069的收发包线程终止。 修改指向收包buffer的指针后,通过抓包和cpe.log日志分析,XML解析成功,tr069的收发包线程正常,客户端可以向服务器发送Content-Length参数为0的POST报文
2014.4.15 周二
哥伦比亚返回错误,说数据包中出现9002错误,查看过这个是内部错误,是我们的客户端不支持ISP的RPC调用。从cpe.log中可以看到是dev_LAN_ConfigPassword参数和dev_IPPing_DataBlockSize调用。
gen_param_struct读取服务器要求的参数值。
int dev_LAN_Hosts_Host_AddressSource(int opt_flag, void *mthdval_struct, int locate[])
一下函数读时返回-1
dev_Time_LocalTimeZone
dev_LAN_Hosts_Host_IPAddress
dev_LAN_Hosts_Host_AddressSource
dev_LAN_Hosts_Host_MACAddress
dev_LAN_Hosts_Host_LeaseTimeRemaining
dev_WLAN_Assoc_DeviceIPAddress
dev_Layer3_DefaultConnectionService 该函数全部返回-1
dev_Layer3_ForwardNumberOfEntries
dev_ManageServer_Username
dev_WANCommon_If_TotalPacketsSent
dev_WAN_Ethstats_BytesSent
dev_WAN_Ethstats_BytesReceived
dev_WAN_Ethstats_PacketsSent
dev_WAN_Ethstats_PacketsReceived
dev_WANIPConnection_ExternalIPAddress
dev_WANIPConnection_SubnetMask
dev_WANIPConnection_DefaultGateway
dev_WANIPConnection_DNSEnabled
dev_WANIP_PortMap_PortMappingEnabled
dev_WANIPConnectStats_EthernetBytesSent
dev_WANIPConnectStats_EthernetBytesSent
dev_WANIPConnectStats_EthernetPacketsReceived
dev_WANPPP_DNSServers
dev_WANPPP_MACAddress
dev_WANPPP_TransportType
dev_WANPPP_PPPoEACName
dev_WANPPP_PPPoEServiceName
dev_WANPPP_ConnectionTrigger
dev_obj_forward
dev_obj_IPInterface返回1和-1
dev_obj_wanconndev返回1和-1
dev_obj_pppportmap
dev_WANIPConnection_ExternalIPAddress不支持PPPoE
init_list_member初始化
收 包函数func_recv收到数据包后,通过sem_post(&SEM_RECV);想处理数据包的线程发送消息,但是处理包的线程通过 sem_wait(&SEM_RECV);接受消息,但是没有收到,知道func_recv将buf耗尽后,才收到。
GPN
GetParameterNames
用来取得装置上的数据名称
GPV
GetParameterValues
可以取得一个或多个数值,也可以取得完整径或部份路径的数值
SPV
SetParameterValues
用来设定参数数值
GPA
GetParameterAttributes
用来取得参数的特性:只读或可读写,以及主被动回报
SPA
SetParameterAttributes
用来设定参数的特性:只读或可读写,以及主被动回报
-
Download
用以指示 CPE 下载档案处理作为固件更新(FIrmware Upgrade)、设定更新(Config Upgrade),或其它特定的档案处理
-
Upload
用以指示 CPE 上传档案处理作为设定备份(Config Export),或其它特定的档案处理(例如 System log export)
ADD
AddObject
新增参数
DEL
DeleteObject
移除参数
2014.4.18 周五
看泰国TOT IPv6接入方式,DHCPv6只公告DNS,状态码是6,NoPrefixAvail。
1043 RU的option50问题呗重新打开了,原因是Makefile.app的文件没有更新到svn服务器上,大意啊,jenkins上编译的和本地编译的不一定一致,提测软件上一定要检查修复的问题。相同的还有L2TP 不发送STOP CDN问题。
2014.4.21 周一
编译软件的shell中宏加错了地方,应该加在:
make BOARD_TYPE=ap135_hnat dut_type=wr1043v2 BUILD_OPTION=_IPV6 MODULE_DHCP_REQUEST_SAME_IP=y linux_build_all
而不是
make BOARD_TYPE=ap135_hnat dut_type=wr1043v2 BUILD_OPTION=_IPV6 wr1043v2_ru INCLUDE_ISP_AUTO_CONF=1
还有就是busybox中lastip在release的时候不能reset为0
2014.4.22 周二
上午哥伦比亚又返回了TR069的问题,怀疑是设置的问题;
下午测试部反馈L2TP和PPTP断开流程问题,L2TP是不发L2TP CDN的,这个确认,PPTP因为ap136下使用的是pppd_ipv6的源码,坑爹啊。现在搭建一个win2003进行测试。
2014.4.23 周三
boss找谈话,工作的问题,不要放太多时间和精力在OEM上,按流程走。OK,解放
2014.4.24 周四
在Linux上安装了pelnx_730.tar.gz,这是endpoint的Linux版,可以跑IPv6的吞吐量了,good
2014.4.25周五
离别的季节,很多熟悉的同事都离开了。
jenkins上编译ipv6_tools不通过,原因是一些库找不到,修改Makefile,使用0.9.8a的Openssl库,-lcrypto是在指定的目录中找一个libcrypto.so的文件,所以一般要使用ln -sf 进行连接,
比如 ln -sf libcrypto.so.0.9.8 libcrypto.so
2014.4.28 周一
会议讨论分组的事情,项目合并
2014.5.4 周日
节后的第一天,1043和842都返回了bug,主要是IGMP的问题。在看skb->mark的计算方式,代码中:
/*如果是多播包,则根据报文中的vlan ID查找对应的收包接口*/
if (IS_MULTICAST_ADDR (skb->data))
{
skb->mark = CONVERT_PORT_ID (get_portid(vid));
}
如果是组播包,则找skb->mark的值
static uint32_t port_id_array[32] =
{
0x00000001, 0x00000002, 0x00000004, 0x00000008,
0x00000010, 0x00000020, 0x00000040, 0x00000080,
0x00000100, 0x00000200, 0x00000400, 0x00000800,
0x00001000, 0x00002000, 0x00004000, 0x00008000,
0x00010000, 0x00020000, 0x00040000, 0x00080000,
0x00100000, 0x00200000, 0x00400000, 0x00800000,
0x01000000, 0x02000000, 0x04000000, 0x08000000,
0x10000000, 0x20000000, 0x40000000, 0x80000000
};
#define CONVERT_PORT_ID(nr) (port_id_array[(nr)])
2014.5.5 周一
开会讨论3G备份接入的问题,要做回原来的样子,坑啊;
2014.5.6 周二
修复741俄语版的问题,阅读交换机HNAT的文档;
2014.5.7 周三
整理项目,开会移交,哎,感觉没我什么事情了;
2014.5.12 周一
看书,跟进842的问题
2014.5.13 周二
开始在越南版上移植IPv6
跟踪一个modem时,发现一类新的额设备,ttyHS,主设备号是245,2.6.31中已经支持这类设备,但是配置上存在问题。
2014.5.14 周三
今天主要是跟踪842RU升级后出现的squashfs读错误的问题,原因是当升级了软件后,原来在flash中的文件系统已经被更新了,这时候通过读取RAM中的文件节点表去夺取flash中的文件(可能是一些库)这是后就谁失败。
现 在的解决方法是在文件\ap123\linux\kernels\mips-linux-2.6.31\drivers\mtd\devices \ath_flash_ioctl.c中写flash完成后增加一个定时器,当15秒后,如果用户态调用swreboot失败,那么定时器通过设置寄存器 令cpu重启。
static void tp_reset_cpu_force()
{
for(;;)
{
ath_reg_wr(ATH_RESET, ATH_RESET_FULL_CHIP);
}
}
static int tp_wdt_reset_setting (int timeout)
{
static struct timer_list wdt_timer;
init_timer(&wdt_timer);
wdt_timer.expires = jiffies + timeout*HZ;
wdt_timer.function = tp_reset_cpu_force;
wdt_timer.data = 1;
add_timer(&wdt_timer);
}
实现起来也非常简单。
1.桥接wan口lan口。
2.屏蔽掉所有非IPv6的包。
约定:
wan口eth1
lan口eth0、wlan0、wlan1
依赖:
ebtables、birdge-utils
命令样例
brctl addbr br-lan
ifconfig br-lan up
brctl addif br-lan eth0
brctl addif br-lan eth1
brctl addif br-lan wlan0
brctl addif br-lan wlan1
ebtables -t broute -A BROUTING -p ! ipv6 -j DROP
2015.5.15
特别的日子,奔33了。
tp9343 dragonfly
ap124 AR9344 WASP
ap143 QCA9533 HoneyBee
ap151 TP9343,Dragonfly 对应内部代号QCA956x,目前正在开发940NV3/941NDV6,单芯片450M 3*3。
ap123 AR9341 WASP
服务器中先运行tomcat
service tomcatd start
然后在其他主机上访问:
http://192.168.1.102:8080/jenkins/
2014.5.16
删除了workspace/jenkins目录后,需要新建回这个目录
然后修改这个目录的账号权限
#chown tomcat.tomcat jenkins
然后重启tomcatd
#service tomcatd restart
在服务器上编译ffmpeg出错,原因是./configure 是检测出有ALSA驱动,并且把这个设备写到config.mak中。
在服务器上去掉alsi驱动
先rpm -qa | grep alsa 然后在rpm -e 软件包名称。
2014.5.19
使用iptables将访问80端口的包转发到8080(这个规则是修改发包时的目的端口,在client上设置)
iptables -t nat -I OUTPUT -p tcp --dport 80 -j REDIRECT --to-port 8080
在服务器上应该
iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
然后保存配置
service iptables save
重启服务
service iptables restart
查看服务
service iptables status
重启服务器后,要设置服务器的域名和DNS地址
iptables的配置文件路径:cat /etc/sysconfig/iptables
2014.5.20
组内编译服务器的域名
域名:sohoici.rd.tp-link.net
ip:172.29.88.143
841V9 使用ap143 honeybee方案,解压工具使用参数-t lz4-ap143
如:./mkfirmware -x wr841nv9_Cambodia_3_15_9_up\(140519\).bin -t lz4-ap143
2015.5.26 周一
移植741越南版的IPv6,inet_pton不支持的问题,需要跟新uclibc库。
842反馈IPv6拨号失败的问题,原因是采用了3的IA类型,获取不了虚拟接口的MAC地址,这时候必须获取实际的WAN的接口地址,这
2014.5.28 周三
查看nat session数量
/proc/sys/net/netfilter/ip_conntrack_max 7系列是5120
/proc/sys/net/netfilter/ip_conntrack_udp_timeout UDP session的老化时间
个问题没有提起前验证,造成又要重新提交一次测试,浪费时间。
2014.5.30
Cpu 0
$ 0 : 00000000 00000000 c0d0f09c 00000000
$ 4 : 81421ca0 81f7c000 81f6b420 81f7c000
$ 8 : 0000000c 00000002 00000002 ffffffff
$12 : 0000000f c0380000 c0380000 00000000
$16 : 00000000 00000001 81421ca0 81f7c000
$20 : 81421cc4 81421ca0 81f6b420 c0d435b0
$24 : 00000000 8011dd2c
$28 : 817c2000 817c3c68 801f0000 8011dad8
Hi : 00000733
Lo : 00179845
epc : c0d0f0d8 ath_netdev_hardstart+0x3c/0x284 [umac]
Tainted: P
ra : 8011dad8 dev_hard_start_xmit+0x244/0x328
Status: 1000ff03 KERNEL EXL IE
Cause : 80800008
BadVA : 0000001c
PrId : 00019374 (MIPS 24Kc)
./mkfirmware -x wr841nv9_vietnam_viettel_ipv6_3_15_9_up\(140522\).bin -t lz4-ap143
文件if_ath.c
if (txctl->ismcast) {
txctl->mcast_rate = vap->iv_mcast_rate;
/* wangqun 2014-02-24 15:53:55
*
* for Bug 48543, dut以11M速率对mDNS(bonjour)报文进行转发,
* 建议使用1M
*
*/
if (unlikely(wbuf_is_bonjour(wbuf))) {
txctl->use_minrate = 1;
txctl->mcast_rate = 1000; //1/* 1Mbps */
2014.6.3周二
841V9 viettel ipv6版本软件烧写MAC地址失败,原因是使用了ssh登录,将这个功能在配置文件关闭就可以了;
提供这个软件来回了3次,第一次是无线驱动空指针的问题,这个需要校准后,无线设备起来才能发现,情有可原,但是写MAC可以自己测试一下就可以发现,这个还是做事不够细心导致;
2014.6.4 周三
中断将定期发生,搞好是每秒HZ次,HPET(High Precision Event Timer,高精度事件定时器)。
HZ=250是大多默认值,较高的HZ具有较好的交互性能和响应速度,但是一般性开销也会增多。
do_time负责全系统范围,全局性的任务:更新jiffies值,处理进程统计。
jiffies和jiffies_64的低32位是重合的,指向同一块内存或者寄存器。jiffies提供内核中一种简单形式的低分辨率时间管理方式。
定时器管理
内 核创建不同的组,根据定时器的到期时间进行分类,分类的基础是一个主数组,有5个数组项,都是数组,主数组的5个位置根据到期的时间对定时器进行粗略的分 类,第一个组是0~255个时钟周期,第二个组是256~2^14-1个始终周期,第三个组是2^14~2^20-1个始终周期,如此类推,第一个组的数 组有256个数组项,其余的是64个。
编译kernel时,指定配置文件,修改kernel中的script\kconfig\Makefile
%_defconfig: $(obj)/conf
ifneq ($(TP_CONFIG_FILE),)
@echo "--------Use new kernel config file dir!----------"
$(Q)$< -D $(TP_CONFIG_FILE) $(Kconfig)
else
$(Q)$< -D arch/$(SRCARCH)/configs/$@ $(Kconfig)
endif
2014.6.6
ucWlanCfg.pAdv->uPower = WLAN_ADV_TX_POWER_DEF;
该参数在multissid,webserver和驱动配合有问题。
2014.6.10
3420 RU 反馈当使用4G modem 访问youtobe 或者speedtest产生大流量时,出现重启,看串口,出现了
“ swapper: page allocation failure. order:4, mode:0x20”信息。
Linux 提供了这样一个参数min_free_kbytes,用来确定系统开始回收内存的阀值,控制系统的空闲内存。值越高,内核越早开始回收内存,空闲内存越高。
[root@zyite-app01 root]# cat /proc/sys/vm/min_free_kbytes
163840
echo 963840 > /proc/sys/vm/min_free_kbytes
其他可选的临时解决方法:
关闭oom-killer
cat /proc/sys/vm/oom-kill
echo "0" > /proc/sys/vm/oom-kill
vi /etc/sysctl.conf
vm.oom-kill = 0
2. 清空cache (可选)
echo 1 > /proc/sys/vm/drop_caches
2014.6.12
842RU的生产问题,因为进度上的把控,被隐含得批评了。
华为的一款4G modem的管理是使用web进行管理的,这样增加了对pin码操作的复杂度。
2014.6.17
特殊字符窜问题,在构造命令是遇到特殊的字符串,可以使用反斜杠进行转义
UINT8 *pppStrToChars(UINT8 *string, UINT8 *buffer)
{
int i, j;
UINT8 *pStr = string;
int len = strlen(pStr);
for (i = 0, j = 0; i < len; i++)
{
if (pStr[i] == '\'') /*如果是单引号,要加上双引号*/
{
buffer[j++] = '"';
buffer[j++] = '\'';
buffer[j++] = '"';
}
else if( pStr[i] == '%'' )
else /*其他的字符加单引号*/
{
buffer[j++] = '\''';
buffer[j++] = "%";
buffer[j++] = "%";
buffer[j++] = '\''';
}
}
buffer[j] = 0;
return buffer;
}
设置无线支持sta的命令
iwpriv ath0 maxsta 5
显示无线支持最大sta的命令
iwpriv ath0 get_maxsta
2014.6.18
加拿大反馈一个3600的bug,对比D-Link的抓包结果,发现dhcp是不分配地址的,这是用也应该让路由器可以设置IP。
另外,西班牙在3600上测试IPv6时,发现DHCP的Reply报文的T1和T2都是0;
2014.6.19
验证TR069 设置CPE的更新周期出现的重启问题,原来在每个RPC函数被调用后,根据返回值决定路由器是否重启,返回1重启,返回0不重启;
后续要检查一下所有的节点,第一看看能不能支持,第二是否重启;
跟踪两个modem,MF182使用remote NDIS base Device,通过webgui进行设置。
2014.6.24
传输大文件的时候,smbd被kill掉,串口信息:
Call Trace:
[<801d2fdc>] dump_stack+0x8/0x34
[<8004fa40>] oom_kill_process+0x70/0x200
[<80050030>] __out_of_memory+0x170/0x1a8
[<800500dc>] out_of_memory+0x74/0xa0
[<80052fb0>] __alloc_pages_nodemask+0x440/0x55c
[<8004cd20>] grab_cache_page_write_begin+0x88/0xf4
[<80093c94>] block_write_begin+0x60/0x144
[<800940ec>] cont_write_begin+0x374/0x3e4
[
[<8004d9b0>] generic_file_buffered_write+0x114/0x38c
[<8004e2f8>] __generic_file_aio_write_nolock+0x454/0x4b0
[<8004eeec>] generic_file_aio_write+0x8c/0x12c
[<8006e130>] do_sync_write+0xd4/0x130
[<8006ed30>] vfs_write+0xac/0x140
[<8006ee28>] sys_pwrite64+0x64/0x9c
[<8000e204>] stack_done+0x20/0x3c
Mem-Info:
Normal per-cpu:
CPU 0: hi: 0, btch: 1 usd: 0
Active_anon:332 active_file:1842 inactive_anon:404
inactive_file:2122 unevictable:29 dirty:1 writeback:2126 unstable:0
free:190 slab:1664 mapped:779 pagetables:73 bounce:0
Normal free:760kB min:720kB low:900kB high:1080kB active_anon:1328kB inactive_anon:1616kB active_file:7368kB inactive_file:8488kB unevictable:116kB present:32512kB pages_scanned:16096 all_unreclaimable? no
lowmem_reserve[]: 0 0
Normal: 10*4kB 0*8kB 1*16kB 2*32kB 0*64kB 1*128kB 0*256kB 1*512kB 0*1024kB 0*2048kB 0*4096kB = 760kB
3993 total pagecache pages
8192 pages RAM
692 pages reserved
4943 pages shared
2969 pages non-shared
Out of memory: kill process 980 (smbd) score 177 or a child
Killed process 980 (smbd)
共享内存的大小
#define SHMEM_SIZE 102400
#define BUFFER_SIZE (128*1024)
InBuffer = (char *)malloc(BUFFER_SIZE + LARGE_WRITEX_HDR_SIZE + SAFETY_MARGIN);
OutBuffer = (char *)malloc(BUFFER_SIZE + LARGE_WRITEX_HDR_SIZE + SAFETY_MARGIN);
修改后发现也是会出现进程被杀死的问题
通过修改参数打开smbd的debug功能,查看出现问题时的log,暂时无太多的发现,估计要跟一跟整个流程了。
NTFS格式硬盘出现的问题
Call Trace:
[<801d2fdc>] dump_stack+0x8/0x34
[<8004fa40>] oom_kill_process+0x70/0x200
[<80050030>] __out_of_memory+0x170/0x1a8
[<800500dc>] out_of_memory+0x74/0xa0
[<80052fb0>] __alloc_pages_nodemask+0x440/0x55c
[<800553f4>] __do_page_cache_readahead+0xe0/0x23c
[<8005557c>] ra_submit+0x2c/0x38
[<8004d1d0>] filemap_fault+0x1f8/0x408
[<8005d4dc>] __do_fault+0x70/0x44c
[<8005ec88>] handle_mm_fault+0x32c/0xb5c
[<800101b0>] do_page_fault+0x100/0x300
[<80006480>] ret_from_exception+0x0/0xc
查看函数调用,发现__alloc_pages_nodemask调用了__alloc_pages_may_oom,__alloc_pages_may_oom又调用了out_of_memory。
而申请页的时候:
/* First allocation attempt */
page = get_page_from_freelist(gfp_mask|__GFP_HARDWALL, nodemask, order,
zonelist, high_zoneidx, ALLOC_WMARK_LOW|ALLOC_CPUSET,
preferred_zone, migratetype);
if (unlikely(!page))
page = __alloc_pages_slowpath(gfp_mask, order,
zonelist, high_zoneidx, nodemask,
preferred_zone, migratetype);
进入__alloc_pages_slowpath是一个unlink小几率时间。
To free pagecache, use echo 1>/proc/sys/vm/drop_caches;
to free dentries and inodes, use echo 2> /proc/sys/vm/dorp_caches
to free pagecache, dentries and inodes, use echo 3> /proc/sys/vm/dorp_caches
2014.6.27
编码大意,将
int wlanGetIntRate(int index)
{
int nBoardType = swGetBoardType();
switch (nBoardType)
{
case BOARD_PB92:
case BOARD_AP151:
return wlanIntRateTable_450M[index];
case BOARD_AP123:
case BOARD_AP143:
/* added by ZQQ, support ap121, 09Jun14 */
case BOARD_AP121:
return wlanIntRateTable_150M[index];
/* by ZQQ, 09Jun14 */
default:
return wlanIntRateTable_300M[index];
}
}
这样做导致AP123和AP143的都变成了150M的了,太大意了。
2014.6.27
代码中使用BOOL write_through = BITSETW(inbuf+smb_vwv7,0);这个是协议中的一个值,控制是否需要sync,但是该值一直是0.
2014.7.2 周三
svn 版本回退:
回退svn版本,假设要将working copy版本从head version回退到版本888
svn merge -r HEAD:888 ./testsvn
svn ci -m "*)roll back to ver888"
阅读usbserial驱动的代码,主要是查看驱动初始化的流程
模块的初始化函数usb_serial_init
首先是申请usb_serial_tty_driver 的内存
usb_serial_tty_driver = alloc_tty_driver(SERIAL_TTY_MINORS);
然后注册usb_serial_bus_type
result = bus_register(&usb_serial_bus_type);
2014.7.7 周一
昨天去和一个资深同事聊天,关于一些技术问题给鄙视了。他的要求就是专做杯子,但是做一个安全,可靠,容易扩展,容易维护的杯子,所以会花30%的时间去做 杯子,但是要花70%的时间去测试这个杯子的安全性,稳定性。另外,每做一件事情,要深入了解当中的细节地方,技术就体现在了解程度的深浅。
2017.7.8 周二
调试dyndns的问题,出现select出错,返回Interrupted system call,看资料是select被中断信号打断。
可以通过函数int sigprocmask检查或者设置信号屏蔽字段,详细的解析见UNIX 环境高级编程 P258.
在代码中使用sigprocmask 和sigismember读出当前屏蔽的信号,发现SIGINT是当前屏蔽的信号成员,这就奇怪了,难道是服务器返回了FIN而不是数据包??
QCA分支上的解决方式是设置了一个计算器,循环5次select,在842RU上测试发现第4次的时候就可以登录上。
2014.7.14 周一
计划:
1)TL-WR1043(RU) 2.0的自测,并在上午提交测试,这任务必须在上午完成;
2)写绩效;
3)讨论代码合并的事情;
完成情况
上午完成了TL-WR1043(RU) 2.0的提测,写绩效总结,然后阅读了TR069模块的代码,下午分析波兰反馈4G modem解PIN码失败的问题,讨论了基准路由器工作的开展。
2014.7.15 周二
计划
1)阅读TR069模块代码;
2)跟进TL-WR740/741 RU项目,修复bug
3)基准路由器工作计划;
完成情况:将TR069的代码架构阅读了一次,将立项报告中不支持的方式列了出来。跟进RU项目的进度。
2014.7.16 周三
计划:
1)跟进当前提测项目进度;
2)完善QCA上的IPv6功能;
一种debug方式的宏
#ifdef DEBUG
#define devdbg(hw_cdc_net, fmt, arg…) \
printk(KERN_DEBUG "%s: " fmt "\n" , (hw_cdc_net)->net->name , ## arg)
#else
#define devdbg(hw_cdc_net, fmt, arg…) do {} while(0)
#endif
2014.7.17 周四
上午4*4 11AC的培训,下午开始创建用于基准路由器软件项目
2014.7.18 周五
台风来了。
上午修复741RU的问题和自测,下午准备提测,搬位置。今天是武爷TP最后一天,中午boss请大家搓一顿。
2014.7.21周一
开始执行基准路由器的移植,今天主要是完成SLAAC的修改。
现在知道两个问题,一个是SLAAC的生效时间,这个要接收RA包,定期更新网关的有效时间,软件中的ACCEPT_RA参数不能关闭了,但是会出现如果前端有两个RADVD服务器公告前缀,会出现两条默认网关。
反馈的LAN->WAN不通的问题,是因为nf-contract模块配置不一样,ar9331的不支持mark参数导致iptables没有执行完毕导致的;
2014.7.22 周二
上午花时间将3420的问题处理一下,要准备提测,解决4G路由重启问题;
下午将RA的M/Obit实现了,Obit 设置成1的情况下,使用DHCP方式,在代码里面之间将运行时的wan
Type参数修改,这个逻辑有点乱。
2014.7.23 周三
上 午看tr069的代码,增加无线的节点,然后想在本地通过3g路由器搭建测试环境,但是失败,看日志是绑定本地socket失败,可能是因为WAN的IP 是私有IP的缘故,下午去测试房搭建环境,注意,ACS的url末尾不能有空格,否则,解析失败。登录ACS服务器上后,可以设置ACS登录CPE的账号 和密码。
2014.7.23 周四
在ACS服务器上发现了VNPT的一版软 件,发现上面是支持无线节点的,鉴于这个版本的代码和AZ的代码是一样的,只是param.xml不一样,然后将这个文件替换,发现还是没有,想到可能是 因为ACS服务器上挂载设备的问题,重新unmount和mount一下后,可以了,无线的节点都支持了。
仔细参看节点发现两个问题,支持4组的无线节点,咨询过忠,是以为以前要求支持4组VAP,qca的已经删除了。
第二个问题,修改无线参数路由器重启。
2014.7.29 周一
上午终于将需要的节点添加进去了,在ACS上可以获取一个节点下的子节点名称。
2014.7.30 周二
上午去24栋开会,关于RU版软件功能定义,研发和测试遇到的问题和沟通方式。下午跟进德国LV100的问题。
2014.7.30周三
跟进ISP反馈的问题,初步是初始化首发包队列中的buffer太小导致的;
2014.7.31周四
检查所有的节点,整理无线节点的参数意义和对应页面的位置,删除param.xml不支持的节点,导致9002错误。
ACS测试比较麻烦,经常被人剔除。
2014.8.4 周一
今 天遇到一个奇怪的问题,pppoev6在使用共用session的时候,httpd挂起,分析core文件,发现是pc指针在调用 pppoev6FormatCmd函数返回后,值变为NULL,导致挂起,分析是因为pppoev6FormatCmd中调用了 swGetPppoeCfg,奇怪的是这儿接口在其他的机型都有用到,怎么只有在这个841越南版才出现。暂时通过增加获取用户名和密码的接口,而不用 swGetPppoeCfg可以绕开这个问题。
2014.8.5 周二
今天 再841上反馈了一个TR069通过ACS升级的问题,测试部反馈是出现9002错误,我在本地自测发现出现两种情况,一是出现过9010错误,下载文件 失败,二是出现httpd挂起现象。第二种现象出击的记录比较高,跟踪问题,发现是因为接收函数sock_recv使用的buffer,边界赋值导致的。 该函数传参是buffer的长度MAX_DATA_SIZE,但是在接收到包的时候,会赋值buffer[recv_ret_value]= '\0',当recv_ret_value = MAX_DATA_SIZE的时候,就出现地址越界了。
修改方法:传入sock_recv的长度为MAX_DATA_SIZE - 1即可;
2014.8.6 周三
今天主要是编写TR069模块的代码阅读和测试过程文档。ADSL给了OpenACS的资料,并且他们组自己用pyhon写了一个ACS的服务器。
2014.8.7 周四
上午请假去搞户口的事情,下午回来继续写文档,将文档发给了smb。
2014.8.8 周五
88节?
今天上午测试复现客户反馈的TR069问题,没复现出来,编译了软件给用户去测试。
下 午将benchmark的代码上传,然后讨论了CE-Router的测试。后来处理Buildserver OEM编译的问题,发现现在我们没有OEM build server的虚拟机,是不能通过root权限进行编译的,现在内销那边的做法是使用一个虚拟机,然后在虚拟机上使用root权限进行编译。这样可以解决 创建文件失败的问题。
2014.8.11 周一
请假,回家办理户口的事情。悲剧,不能迁回老家了。
2014.8.12 周二
早上处理了TR069反馈的问题,看日志是获取LAN PC IP的时候,是通过/proc/net/arp 文件读出的IP地址,但是获取为空,返回-1,出现内部错误。修改使不返回-1就可以了。
下午处理了项目的进度问题,842RU和740RU都测试结束了,反馈的bug 都不严重,等来处理。
jenkins的OEM编译节点需要一台PC担当,已经反馈了。
2014.8.12 周四
私有IP:
10.0.0.0~10.255.255.255
172.16.0.0~172.31.255.255
192.168.0.0~192.168.255.255
又酱油了一天!
2014.8.15 周五
今天上午了解了jenkins如何构建一个节点。
下 调试Guestnetwork 时间调度出现的问题和VLAN arp转发的问题,VLAN ARP转发是因为我们路由的VLAN划分和交换机的不一样,路由器中所有的VLAN都划分了VLAN ID,而功能需要,在收包函数中虚拟出多个设备进行收包,并且把这些设备放在不同的桥中。
# brctl show
bridge name bridge id STP enabled interfaces
brIPPHONE 8000.00037fffffff no eth0.263
eth1.263
brMutliIPTV 8000.00037fffffff no eth0.1110
eth1.1110
brIPTV 8000.00037fffffff no eth0.4000
eth1.4000
br0 8000.000aeb130919 no eth0.1257
eth0
ath0
2014.8.18 周一
和 我设想的一样,switch的PVLAN通过设置switch的寄存器,将PORT划分不同的VLAN,由这个port收到的包,如果没有804.1q字 段的话,交换机在收包时将VLAN ID写入到802.1q字段中,在以太网驱动层,驱动根据这个VLAN ID识别是从哪个端口上来的包,并根据具体的需求,使用虚拟的收包设备替换实际的收包设备。这些收包设备加入不同的网桥,这样可以实现不经过NAT就可以 转发数据。
下午调试TR069的interval 时间立即生效的事情,代码中使用了定时器进行定时发送,而时间间隔通过select实现。因为select是阻塞的,所以如果一开始就select一个长 时间的话修改不能生效。后来通过将长时间的select修改成短时间的多次select,在每次select结束后判断时间是否被修改。然后修改 timer的select值。
2014.8.19 周二
今天解决一个巴基斯坦反馈的ZTZ AC3635,这个modem的信息:
T: Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 4 Spd=480 MxCh= 0
D: Ver= 2.00 Cls=ef(misc ) Sub=02 Prot=01 MxPS=64 #Cfgs= 1
P: Vendor=19d2 ProdID=1403 Rev=f0.18
S: Manufacturer=ZTE,Incorporated
S: Product=ZTE CDMA Technologies MSM
S: SerialNumber=AC6000ZTED000000
C:* #Ifs= 3 Cfg#= 1 Atr=c0 MxPwr=500mA
A: FirstIf#= 0 IfCount= 2 Cls=e0(wlcon) Sub=01 Prot=03
I:* If#= 0 Alt= 0 #EPs= 1 Cls=e0(wlcon) Sub=01 Prot=03 Driver=rndis_host
E: Ad=81(I) Atr=03(Int.) MxPS= 64 Ivl=2ms
I:* If#= 1 Alt= 0 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=rndis_host
E: Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=4ms
I:* If#= 2 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=(none)
E: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=83(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
出现了一个新的类型,e0,网上查找资料是一个叫btusb的驱动,这个是蓝牙驱动,但是查找rndis_host驱动发现这个驱动也可以支持这类设别,
static int is_wireless_rndis(struct usb_interface_descriptor *desc)
{
return (desc->bInterfaceClass == USB_CLASS_WIRELESS_CONTROLLER &&
desc->bInterfaceSubClass == 1 &&
desc->bInterfaceProtocol == 3);
}
驱动挂载失败的原因是作为rndis设备,它的管理字段acm->bmCapabilities需要为0,尝试将这部分代码隐藏,发现OK,驱动挂载上并且可以访问modem的管理页面。
在cdcusb11.pdf文档中的5.2.3.2中可以看到这个字段的意思,只支持某些功能。这个modem的值为2,表示设备可以使用CDC data 接口接收和发送管理信息。
rndis驱动主要是实现rndis协议,驱动中主要完成3个事情,bind,rx_fixup,tr_fixup.
bind:绑定主要是和modem端的设备进行rndis协议的通信,协商版本,MTU等信息;这里值得关注的是指针union的用法,很巧妙;
*x_fixup:主要是添加和去除rndis包头;
usbnet_generic_cdc_bind:cdc 类设备(cdc_ether.c)必须调用的一个函数,作用是探测控制接口,获得数据接口,收集bulk端点(usbnet_get_endpoints),激活接口,设置MTU。
2014.8.20 周三
上午调试PL的3220 PIN码的问题,已经发出Beta软件,并整理了项目对应的SVN路径。
下午继续看cdc 类驱动的代码。
不同的cdc 设备类使用的驱动是通过类,子类和协议三个参数决定的,一般通过宏
USB_INTERFACE_INFO定义,如:
{ USB_INTERFACE_INFO(USB_CLASS_VENDOR_SPEC,
0x02, 0x16),
.driver_info = (unsigned long)&cdc_ncm_info,
},
cdc_ncm_rx_fixup:读取skb_in 中的cdc_ncm包头,并做判断,如果没问题,则去除这个包头,然后上交到协议栈(usbnet_skb_return);
2014.8.21 周四
优化PL解PIN的代码,阅读usb驱动代码。
对 于qmi的驱动,bind函数qmi_wwan_cdc_bind调用usbnet_cdc_bind进行cdc设备的检查后,会初始化一个 cdc_enc的设备,并在这个设备中添加一个client,而这个client作为qmi_wwan_state的成员指针,而APN和认证方式等参数 在这个client中赋值。
连接通过函数qmi_wds_start实现,这个函数先将参数转换成tlv格式,然后通过qmi_send_msg函数进行发送,qmi_send_msg先将数据转成
小端字节顺序,然后调用cdc_enc_send_sync发送到modem。
2014.8.22 周五
上午学习VIM的的使用,这个工具要熟练使用啊。
下午开始合并soho5和merge分支代码。协助测试TR069,开户解决工厂反馈的7系列功率偏低的问题。
2014.8.25 周一
又是新一周的开始,上午哥伦比亚客户反馈软件没问题,准备提测,但是在检查修改要求时,发现时区也需要改,咨询业务,说需要和客户确定一下,我丢了个去。
软件已经搞定了,就差这儿时区问题,等一等吧。
下午研究了一下川哥的那个路由器,貌似很强大,openwrt平台,提供很多功能。
julian 反馈842和两个modemE3272和E3276的问题,一个是100M一个是150M,在32M的样机上重启,子啊64M的样机上OK,明显内存问 题,modem采用cdc_ncm驱动,在驱动中有检测速率的参数,我改了一下,主要Makefile是个坑,编译kernel_module不会将 usb相关的驱动拷贝,要编译usb_net.
2014.8.26 周二
cdc_ncm_setup配置ncm参数,包括rx/tx,最大数据长度max_datagram_size,mtu。
cdc_ncm_tx_fixup:调用cdc_ncm_fill_tx_frame添加上ncm包头;
经过俄罗斯同事测试,发现3272和3276可以通过Utility将modem设置成3G模式,并且在32M的DUT上运行不down机,但是下行5M上行1M。
下午去了金融基地开会,将3020/3040接回来,早知如此,何必当初。
2014.8.27 周三
开始合并30x0的代码,这个代码是使用git进行管理的,先学习了一下git是如何使用的,传输中的github也是使用该神奇管理代码。
2014.8.28 周四
2014.8.29 周五
今天开会要开户讨论CCA认证的事情,分配了每个芯片方案的人员,我负责WASP的方案,ap121做过,3020上已经通过,mobile组有些经验。
第一步是将软件中隐藏的测试用的URL打开,在buildserver上添加一个宏用于编译过认证当然廉,主要是修改makefile。
#added by ZQQ, 2014.8.31 for busybox, if to build a certification software, enable the ethreg in busybox
ifeq ($(CONFIG_WIRELESS_CERTIFICATION), 1)
sed 's/# CONFIG_ETHREG is not set/CONFIG_ETHREG=y/' $(TOPDIR)/apps/$(BUSYBOX)/.config > $(TOPDIR)/apps/$(BUSYBOX)/.config.tmp; \
rm -f $(TOPDIR)/apps/$(BUSYBOX)/.config && mv $(TOPDIR)/apps/$(BUSYBOX)/.config.tmp $(TOPDIR)/apps/$(BUSYBOX)/.config
endif
cd $(TOPDIR)/apps/$(BUSYBOX); \
然后是在busybox中要穷ethreg工具,这个工具是用来读写寄存器的,出现奇怪的问题,编译busybox出现错误:
crt1.o: No suc Lh file: No such file or directory
2014.9.1周一
今天主要了解CCA认证软件方面的修改,这个认证主要是修改无线天线的信号强度,修改 ni 文件中 0x9e20 、 0x1e20 、 0xbe20 三个寄存器,分别代表三根天线(只有一根天线改一个就好),这里面保存的是触发 CCA 的信号强度,这个值需要调试。
2014.9.2 周二
2014.9.3 周三
上午给人打了小报告,邮件抄送给了boss,要紧急处理,下午了解CCA认证的背景和测试方法,协助硬件工程师。
2014.9.4 周四
今天调试USB 驱动占用内存的问题,发现如果先插入硬盘,在插入4G卡,modem设备不能识别。
另外的是如果先插入硬盘,在移除,发现内存空余量达到12M,而系统开启的时候才7M.
发现是挂载NTFS格式的移动硬盘的时候,执行了ntfs-3g前后的可用内存居然相差7M,我靠,这是神马回事啊??
比对结果是ntfs-3g将cache里面的内存归还到free buffer当中,
在Linux下,可是使用下面方法释放cache
To free pagecache:
# echo 1 > /proc/sys/vm/drop_caches
To free dentries and inodes:
# echo 2 > /proc/sys/vm/drop_caches
To free pagecache, dentries and inodes:
echo 3 > /proc/sys/vm/drop_caches
增加 /proc/sys/vm/min_free_kbytes 的大小
2014.9.4 周四
上午准备CCA认证的软件,搭建测试拓扑,除了知道修改寄存器0xb8109e20 (ch0) 和0xb810ae20 (ch1)外,还需要在驱动中添加qca的patch。
测试原理大概是:通过调整寄存器天线的bb_minCCApwr_thr阈值,当该信道发现有其他设备使用时,停止发送beacon帧,这个值相当于检测到其他设备使用该信道的最大能量值;
下午调试E3272的问题,发现现在对于判断是4G或者是3G Ether这个处理机制是有问题的,首先里面的处理方法就不严谨,通过接口的类,子类和协议进行判断,但是这些参数不同的厂家可以设置不一样,特别是协议属性,这个方法要改改。
另外发现 echo 1 > /proc/sys/vm/drop_caches可以free出很大一段内存,从meminfo文件看,这段内存应该是从caches而来,看来对Linux的内存管理还要看一看。
2014.9.5 周5
快放假了,坚持!
上午通过频谱仪测试941两根天线控制不发beacon的寄存器值,结果:
天线 寄存器 修改值 原来值
ch0 0xb8109e20 0x39c 0x3ce
ch1 0xb810ae20 0x1bc 0x1ce
比原来的值小和很多, 测试的时候通过ethreg -g 0xb8109e20 0x39c设置寄存器的值,可以发现beacon帧每次设置都可以停止。
2014.9.9 周二
几天上午要完成的事情
1)提测3420UN 版;修复740哥伦比亚版并提测;修复842RU的bug并提测;741RU提测,740越南27045版本提测;
上午开会安排了一下本周工作的内容,1043UN的nas和IPv6要跟进一下,还有就是CC认证要加快一些。
关于清除cache的问题,boss问我问题了,我也按照书的解析和我自己的理解回答,没有下文,julian反馈了测试结果,稳定性可以,但是4G->WLAN的速率有点低,只有直连PC的1/4一左右。
下午调试740哥伦比亚反馈的问题,傻×问题,页面中多了一组动态数组参数,所以显示有问题,看log,是自己添加的,晕死一片。
2014.9.10 周三
教师节,惯例,向她发去节日的问候。
检 查了现在正在测试的几个项目的bug,都不多,要尽快安排测试。然后和廷勇讨论CCA究竟如何测试,按照大家的讨论结果,上周我测试的数据时有问题的,这 个值太小,会导致天线将一些干扰报文都视作为外部信号源,所以按照廷勇的意思是,只需要调试到硬件能检测到外部源信号,不发beacon帧就可以,至于不 能长时间不发beacon,是软件的问题,要向A公司提交case。还比对了8419.0 honeybee方案的patch和wasp的代码,发现两者是有差异的。
下午测试,发现本地的配置文件basic.conf中没有更新,导致无线驱动中的TP_FEATURE_SUPPORT_CCA没有打开
2014.9.11 周四
上午继续调试,发现ch0的只需要设置成0x3a才能生效,这个值太小,会令一些干扰信号也作为外部发射源,后来发现是因为智能天线的问题,通过命令iwpriv wifi0 setSmartAntenna 0将智能天线功能关闭,然后选择最右边的天线,OK。
主要要设置国家码是英国,信道是6。
2014.9.12 周五
今天调试MR3420,使用开发板测试又问题,换了一个工厂借来的样机,该机型是不大外置LNA的,逐步减少寄存器的值,最终确定寄存器值:
0xb810ae20=0x1a1;
0xb8109e20=0x3a5
然后将这个值写入ini文件,编译一版软件,发现一个问题,DUT大概在2分支左右,频谱仪才检测到beacon帧不发送。
在驱动中看到驱动版本是:#define ATH_DRIVER_VERSION "9.2.0_U10.1020"
2014.9.15 周一
上午测试了NAS的速率,上次反馈的bug,设置了一个sync的参数,当传输到256个包后,sync一次,原因就是一位memory问题。现在初始化时清cache,可用的memory增大了。
另外修改了先插入磁盘,再插入4G modem后识别问题,原因是设备类型没有重新初始化;
下午继续3040的CCA认证测试,修改代码,增加ethreg工具,但是发现有问题,后来对比和沟通发现是mobile组给错了代码,我日,挖了个坑让我跳啊!
2014.9.16 周二
台风,暴雨!
上午回来后更新了代码,修改以太网驱动和busybox,测试,发现原来的9e20参数是0x3a9,拿到测试房测试,发现这个值不行,
测试3420出现:
ath_bstuck_tasklet: stuck beacon; resetting (bmiss count 9)
ath_bstuck_tasklet: stuck beacon; resetting (bmiss count 9)
ath_bstuck_tasklet: stuck beacon; resetting (bmiss count 9)
ath_bstuck_tasklet: stuck beacon; resetting (bmiss count 9)
ath_bstuck_tasklet: stuck beacon; resetting (bmiss count 9)
ath_bstuck_tasklet: stuck beacon; resetting (bmiss count 9)
然后在开机2分钟后出现interference detected信息。已经将该问题截图并且上传到qca的sf系统。
2014.9.17 周三
今天合并3220的代码分支,并且编译软件用于CCA测试,OK,让硬件同事提交预扫。
2014.9.18 周四
测试842的CCA认证
大黄反馈一个modem有多个配置的问题,get_modem_info函数会有问题,暂时没时间看。
2014.9.19 周五
上午回来发现jenkins出先异常了,以前的编译产物全部不见了ssh登录后发现外挂的硬盘不能访问,填单,签名,进入机房,将服务器拆了,重新插硬盘,内存后,ok,但是一个上午就过去了。
下午跟进842RU的问题,tftp在我的win7上测试是OK的,如果升级镜像放在虚拟机的文件系统中并通过samba进行共享,这种情况下比较容易出现问题。
2014.9.22 周一
上午回来会议讨论上周工作的内容和本周工作的重点,上午本来就没什么精神,开会整理一下思路还是有用的,以前我对会议一向鄙视,但是简短有效的会议,特别是在周一,还是有效的。这点以后要学习一下;
下午调试1043en 2.0 的NAS和IPv6,IPv6的kernel部分的修改需要同步,NAS 在model.conf中需要将参数设置成1.
测试,没问题。
2014.9.23 周二
今天上午检查了842RU的问题,下午参加了无线AP抓包器的预答辩,然后在基准路由上添加TR069 SSL的支持。先是修改makefile,增加宏用于控制SSL,web_server需要增加3个库,-ldl -lcrypto -lssl。
LDFLAGS= -L$(INSTALL_ROOT)/lib -L./web_s/wireless -L./msglogd -L. -lpthread -lc -lrt -lmsglog -lutil -lwpa_ctrl -ldl -lcrypto -lssl -allow-shlib-undefined
晚上加班,看makefile的语法
- 表示忽略错误,继续执行
@ 表示不输出显示命令
如果make执行时,带入make参数“-n”或“--just-print”,那么其只是显示命令,但不会执行命令,这个功能很有利于我们调试我们的Makefile,看看我们书写的命令是执行起来是什么样子的或是什么顺序的。
2014.9.24 周三
今天回来开始调试TR069的SSL,第一个错误就是没有证书和key,在网上找到一些资料,通过命令
openssl genrsa -out prvtkey.pem 1024/2038
openssl req -new -x509 -key prvtkey.pem -out cacert.pem -days 1095
生成证书,主要,不要打开密码保护,负责SSL_CTX_use_PrivateKey_file函数会造成httpd 挂掉;
生成后,发现SSL_connect失败,经过抓包发现是客户端返回一个Unknow CA的信息给服务器。
Wed Jan 1 01:17:19 2014,comm.c[148](verify_cb): issuer = /OU=TP-LINK Root/O=TP-LINK/CN=TP-LINK CA/ST=Internet/C=CN/L=Net
Wed Jan 1 01:17:19 2014,comm.c[151](verify_cb): subject = /OU=TP-LINK Branch/O=ACS/CN=192.168.1.100/ST=Internet/C=CN/L=Net
Wed Jan 1 01:17:19 2014,comm.c[153](verify_cb): err 20:unable to get local issuer certificate
2014.9.25 周四
设置客户端不认证SSL_VERIFY_NONE,httpd挂起。
2014.9.26 周五
调试了SSL的问题,但是始终没有找到问题的原因,对比了原版的代码和openssl里面的demo server和client,发现都没有不使用证书的方式。问ADSL要他们的修改方法,始终不贵,真是吐血了;
2014.9.28 周日
国庆钱的调整工作日,要上班;
今天回来先搞定730RE的CCA认证,然后和QCA的FAE讨论了一下那个信号检测延后的问题,然后就是准备MR3220的提测,因为前段时间30x0的问题,自己太心急合并了代码,导致引入了很多问题。下午就是将代码复原然后在进行bug的更新,自己给自己挖的坑;
另外了解了一个新的Linux漏洞,bash,在coolshell.cn上有详细的描述。这个漏洞的简单原理是:
通过脚本想bash注入一个环境变量,值是一个函数:
#env VAR='() { :;}; echo BASN is vulerable!' bash -c "echo bash test"
这个代码先设置一个环境变量,主要这个环境变量是bash父进程的,然后在通过bash -c 进行一个子进程,子进程继承了父进程的环境变量(并执行),所以导致作为环境变量的脚本被执行。
经过测试,我厂的路由器使用的是msh,不是bash,所以没有这个问题。
2014.9.29 周一
和 pluto讨论cca的问题,提及到一个底噪的问题,按照他的解析,寄存器0xb8109e1c的20-28bit是板子底噪(noice floor)值,这个值描述的是整个板子噪音的总和,这个噪音受板子的设计,外界的问题等的影响。而cca认证的原理就是通过检测外部输入的信号强度对 nf的影响,读取这个值和设定的阈值进行比较,如果这个值大于阈值,就认为是外部干扰信号。
2014.9.30 周二
今天上午主要是解决WR1045的IPv6 DNS地址的问题,这个默认值是否需要替换还需要仔细考虑,后面需要在qca上进行解决;
下午搭建jenkins的soho5的OEM buildserver,遇到配置问题,和soho6的不一样,最后搞定;
解决cca的问题,发现增加一个天线,可以马上检测到干扰信号,但是如果不加,还是有延时效应。
2014.10.8 周三
7天长假,意犹未尽,开始工作。
上午查看wasp中产生延迟的原因,发现是重复调用ar9300Calibration函数进行NF的校验,这个函数是注册在一个定时器中的,促发原因暂时没有搞清楚。
发布842ND(RU)软件,申请料号;
下午主要是考虑30x0的代码合并问题,解答中兴M730 modem的问题,这个modem很奇怪,是一个虚拟以太网的设备,分配到IP后,当ping网关,或者访问网站,modem会产生remove时间。
将jenkins上的soho5_qca_trunk_prep分支按照芯片方案进行整理。
2014.10.9周四
上午将所有机型按照芯片方案划分了不同的job,编译成功;
下 午对比了M730在842和8970上的行为,发现在8970上没问题,8970是broadcom方案的,从串口上看,usb hub是OHCI类型,而842是wasp方案的,usb hub是EHCI类型,在842上使用了12v 2.5A的电源,保证USB供电,但是还有问题。现象有两个
1)路由器重启后,获取IP,ping外网主机,大概90s后出现usb被移除现象;
2)然后重新识别,但是dhcp不能获得IP。
从串口上看到,usb_disconnect函数被调用了。
2014.10.10 周五
检查升级页面进度条没有显示问题,阅读RFC 7084
2014.10.13 周一
上 午阅读RFC 6177,这个是RFC对ISP分配地址的建议,最原始的是RFC 3177,6177是对3177的重新定义。在这份RFC中,规定了ISP不需要强制分配地址前缀是48/64/128,对于站点,可以分配48~64的 长度,比如56,理论上可以分配64长度,但是站点必须要留足足够的地址空间,这一点我怎么也不明白。对于独立接入的设备,如 PC,则可以直接分配一个128的地址。
2014.10.14 周二
请假学车和办理住房公积金
2014.10.15 周三
工 厂反馈升级出现空白页的问题,抓包分析,是因为页面请求css_main.css和common.js时服务器没有返回导致显示的空白页。问题出现在 9.16提测的版本中,往前的版本没有,曾经怀疑是增加了drop_cache引入的问题,但是在10.13重新提测版本中没发现这个问题。
在代码中,为了防止升级出现squashfs问题,在升级前将css,js文件拷贝到/tmp目录下。这里需要注意一下的就是,升级线程被设置了 SCHED_RR实时级优先级。
struct sched_param param;
pthread_attr_t attr2;
param.sched_priority = sched_get_priority_max(SCHED_RR);
pthread_attr_init(&attr2);
pthread_attr_setschedpolicy(&attr2,SCHED_RR);
pthread_attr_setschedparam(&attr2,¶m);
2014.10.16周四
测试4个软件的CCA值,编译软件,提测,值得注意的是,如果软件启用了session/MD5需要将这两个功能disable掉。
协助分析俄罗斯一个运营商的TR069问题,发现是登录的认证包头结构不一样,在cpe的确认包头中(函数verify_conn_req)需要增加digest auth信息。
2014.10.17 周五
和并3220的代码到qca分支,编译,简单测试。OK
下午阅读以太网驱动代码,高清LAN和WAN设备是如何划分的
2014.10.20 周一
工厂反馈MR3420RU 出现校准是EVM出现异常,今天通过svn版本回退进行问题定位;在本地编译好软件后,拿到测试房进行测试,观察IQView里面的EVM图,问题的现象是测试会出现Fail项,EVM图出现大量的散点;
2014.10.21 周二
进过版本定位,发现是清理cache引起的问题,但是为什么会引起这个问题,暂时不清楚;同时测试反馈在VCT线使用GT4800测试的时候出现丢包现象。这两个问题都是执行了设置drop cache引起的。
2014.10.22 周三
今天反馈TR069说CPE对HoldRequests处理错误导致连接一致保存大概60秒,ACS不能连续修改CPE的参数。关于这个字段的处理,可以参考TR069简体中文版3.7.1.3
下午测试EVM在正常情况下对无线吞吐率的影响,发现正常状态下,无线不会持续使用150M速率发包,EVM的异常出现几率很低,即使出现散点,误差也没有校准模式的大,对无线速率影响不大。
发现 /proc/sys/vm/drop_caches只能写一次,第二次echo进程会block住,而且奇怪的是用cat命令访问,也会使清理cache生效。
下午boss召集大家会议,主要要点:
1)项目早期关注方案的性能,多测试demo;
2)稳定性;
3)将有问题,困难的事情先做;
4)项目推动;
5)项目质量;
6)独立模块重点考虑内存使用,CPU占用量;
7)向上协助,横向请求;
8)自我发展;
9)把握项目质量,从以下几方面:模块偶和度,内存使用量,CPU占用量,性能,容量限值,系统自我保护;
2014.10.23 周四
跟进EVM重测率过高的问题,在初始化路由的时候设置了drop_cache导致,导致多个机型出现这个问题,从这个事情上,要考虑到两个事情,对系统的修改要考虑各方面的影响,如果没把握,把影响控制到最小;
第二个可以考虑将产测的用例也纳入自测的范围之内;
2014.10.24 周五
今天自测1043UN 2.0在代码整合之后进行自测,发现FTP不能登录,和842对比后,应该是登录信息导致的问题,1043支持ssh登录,在登录信息文件中admin指定了默认的登录路径,但是该路径不是FTP设置的登录后的主目录路径;登录信息文件如下:
1043 FTP出现问题的时候
# cat passwd
root❌0:0:root:/root:/bin/sh
admin❌500:500:admin:/tmp/dropbear:/bin/sh
842 FTP正常的时候
# cat passwd
root❌0:0:root:/root:/bin/sh
nobody❌65534:65534:nobody:/home:/bin/sh
bin❌1:1:bin:/bin:/bin/sh
admin❌500:500:admin:/home:/bin/sh
guest❌500:500:guest:/home:/bin/sh
2014.10.27周一
调试后发现是因为dropbear在初始化的时候使用fopen,以w的方式打开了/tmp/passwd,这种方式如果文件存在会被写成空,应该改成a方式。
另外,如果文件中存在了root和admin条目,就不增加了。
2014.10.28 周二
今天重新制作了预扫失败的3个软件,还有处理哥伦比亚TR069反馈的问题;
2014.10.29 周三
今天研究PC-Lint工具的使用,配置和测试该工具,很好很强大。
采用默认的配置,发现工具会检查标准库头文件中的错误,晕死,一大堆。后来修改配置文件
设置了wlib(0)这样就可以不检查标准库文件。
第二个就是头文件的引用,老是提示找不到文件,需要在std.lnt中注明文件的引用范围。
msg.txt是错误的说明。
2014.10.30 周五
今天阅读ap136和qca VLAN tag模块的代码,发现两者差异巨大,从数据结构和函数api都存在很大的差异。以太网驱动接收的参数不一样,
LanModeSet函数用于将保存到flash中的参数做一次格式转换,转换成vlan初始化使用的数据格式;
ucVlanCfg_getParam4EthDrv用于构造传入到ap136以太网驱动的参数;
execFormatCmd("vconfig set_egress_map %s 0 %d", getWanStaticIpIfName(), ucGetInetPri());
execFormatCmd("echo \"%d\" > /proc/net/tp_mroute/wan_name", ucGetInetVid());
2014.11. 3周一
今 天继续合并代码,在合并代码的过程中发现有些成员变量的命名和宏还是按照旧式的方法,比如CONIFG_VLAN_FOR_RUSSIA,我想马上改成 CONFIG_VLAN,但是后来想一想,这两个分支的代码差异太大,宏的名字还会影响其他机型,所以暂不修改为好,先把功能合并了,调试没问题后,后续 再进行宏的修改。
1043中可以使用ssdk_sh命令,这个模式下提供了调试VLAN Tag的命令,第一次用,还不是很清楚。
2014.11.4周二
今天调试VLAN的问题,发现LanBrMask和LanIptvMask,QCA和branch_ap135方案的顺序不一样,QCA的mask,LAN1对应的最低位,而branch_ap135是最高位,
另外,应为scorpion方案只有一个gmac,LAN和WAN 是虚拟出来的网络设备,和QCA的上的方案不一样,要注意网络设备的名称是不一样的,这个设备名称可以通过在配置文件中设置。
WAN_STATIC_IP_IF_NAME = eth0.2
LAN_FACT_IF_NAME = eth0.1
2014.11.5 周三
测试合并后的代码
2014.11.6 周四
测试VLAN功能,检查代码,准备上传svn服务器。
2014.11.7 周五
上传代码,研究IPv6 的apps大小,编译最新的busybox,导致系统的/bin目录下的文件被删除,需要重新安装coretuils,但是脚本dpkg-reconfigure报错,系统要重装。
2014.11.10 周一
上午重装编译代码用的Ubuntu系统,花了点时间;
下午合并1043 MS版的代码,这个代码可以视作是在1043RU上的一个特制版,只需要增加配置文件就可以了。
boss咨询IPv6的一个问题,没有给出关键的数据和结论,有点模凌两可的样子。
2014.11.11 周二
跟 进710 对IPhone 充电的问题,更新了ipad_charge代码,发现iphone充电是出现设备断开,又移除的现象,对比过 hornet usb的驱动,有些诧异,但是不是主要。路由器带充电线启动时,该问题没有出现,当路由器初始化完毕后,再插入设备,就会出现这个问题。
2014.11.12 周三
上午调试710充电的问题,发现如果仅用了/sbin/hotplug,这个现象可以降低,同时在usb驱动中选择苹果设置的配置是4,这点也有点作用。
下午看710的代码,准备合并代码。
CONFIG_NEW_LAN_WAN_SWAP
2014.11.13 周四
今天主要看了710和qca关于模式的定义和实现,还有的就是LAN&WAN swap的实现,在web层,主要是在驱动中是否在挂载以太网驱动是将phy_swap参数传入到驱动中。
2014.11.14周五
net use * /del /y删除已经创建的连接
上午提交了842和901的CCA软件,下午继续合并代码,代码比较凌乱,对于nas部分,有些机型在kernel中将一些ko配置成y,有些配置成m,导致出现了两个nas_copy的编译目标。
MODULE_SINGLE_USB_COMPLEX这个宏也是比较坑爹,这个宏表示USB接口作为多用途接口,既可以支持3G又支持NAS等功能。
2014.11.17 周一
几 天debug710的软件,编译完成后,打包文件,发现体积超出,对比发现多出了几个文件还有ntfs-3g的体积也不一样,最重要的一点是,从 rootfs.2.6.31拷贝来的lib目录中的so文件没有经过sstrip。经过sstrip后发现总体减少了4.5M。又是一个重要的发现。通过 du 命令可以查看目录下各个子目录的大小,然后和原代码分支进行比对,发现是lib增加大了。
2014.11.18 周二
代码合并编译OK,但是发现NAS功能有问题,刚开始发现/proc/bus/usb下面没有文件,后来发现是以为文件系统中/etc/rc.d/rcS没有增加
mount -t usbfs none /proc/bus/usb 这个命令
这个命令是通过脚本
if grep 'mount -t usbfs none /proc/bus/usb' $(INSTALL_ROOT_FOR_BOARD)/etc/rc.d/rcS > /dev/null 2>&1 ; then \
echo "rcS already have mount -t usbfs none /proc/bus/usb" ;\
else \
sed 's/mount -t ramfs -n none \/var/mount -t ramfs -n none \/var\nmount -t usbfs none \/proc\/bus\/usb/' $(INSTALL_ROOT_FOR_BOARD)/etc/rc.d/rcS > $(INSTALL_ROOT_FOR_BOARD)/etc/rc.d/rcS.tmp && \
mv -f $(INSTALL_ROOT_FOR_BOARD)/etc/rc.d/rcS.tmp $(INSTALL_ROOT_FOR_BOARD)/etc/rc.d/rcS && \
chmod 755 $(INSTALL_ROOT_FOR_BOARD)/etc/rc.d/rcS ; \
fi
添加的,这个脚本原来只在编译3g_tools选项才有,这个脚本在编译nas_package时调用的shell中执行。
插入U盘后,在串口中发现设备不断枚举,断开,再枚举,感觉就是USB接口不停被上电断电或者复位。
2014.11.19 周三
默默地继续查找这个问题,怀疑是usb驱动的问题,对比过两者的差异,在LED灯和patch存在差异,但是将710的usb驱动放在soho5的里面,问题继续,
一不做二不休,将整个kernel替换,问题消失了,我晕死,是kernel里面的某个存在的问题,下午再慢慢找吧。
替换了gpio,仍然出现问题;
2014.11.20 周四
编译kernel的配置文件在文件\mips-linux-2.6.31\scripts\kconfig\Makefile中定义
%_defconfig: $(obj)/conf
ifneq ($(TP_CONFIG_FILE),)
@echo "--------Use new kernel config file dir!----------"
$(Q)$< -D $(TP_CONFIG_FILE) $(Kconfig)
else
$(Q)$< -D arch/$(SRCARCH)/configs/$@ $(Kconfig)
endif
对比了3220的配置文件,发现710多了几个硬件额换模式的GPIO,将这些GPIO去掉后,USB正常。这个很值得怀疑的地方,但是具体是那个配置暂时没有定位到。
晕死,driver还是710的driver,换成soho5的driver问题依旧
ipv6工具的安装将编译后的工具copy到rootfs.build.2.6.31中去,导致编译其他4M的软件打包失败。
跟踪到时scsi.c中USB LED灯的控制出现的问题,在代码中通过写GPIO8控制LED的,但是奇怪的是在配置文件中写明GPIO8是用于控制USB power。
看gpio的makefile,发现可以通过宏给单个文件的目标传入宏
ifdef ATH_SUPPORT_LED
CFLAGS_gpio.o += -DATH_SUPPORT_LED=$(ATH_SUPPORT_LED)
CFLAGS_gpio.o += -DGPIO_PIN_FUNC_0=$(GPIO_PIN_FUNC_0)
CFLAGS_gpio.o += -DGPIO_PIN_FUNC_1=$(GPIO_PIN_FUNC_1)
CFLAGS_gpio.o += -DGPIO_PIN_FUNC_2=$(GPIO_PIN_FUNC_2)
endif
2014.11.24 周一
发现是在scsi.c中的对USB LED的控制导致的问题,咨询了硬件工程师,GPIO的设计:
710N机型上面只有一个LED灯,使用的芯片管脚为B44, GPIO27 / LED7 低电平点亮
3G USB的灯是GPIO26控制,高电平点亮。
USB电源使能用的GPIO8控制,高电平使能
小组会议讨论接下来的工作内容,主要是更新软件。
2014.11.25 周二
setmntent
getmntent
statfs
2014.11.26 周三
分析ipv6占用flash超大的问题,原因是在ping6命令中使用了md5算法,导致要增加整个libssl,其实这个算法就两个文件,在webserver中也用到,将这两个文件静态链接到ping6中,可以不需要依赖libssl。
这个问题一直依赖是IPV6不能做到4M的原因,当时没有分析ping6的代码,也不知道md5可以实现是这么简单,导致加入了超大的libssl库。这个事情给我的教训就是:要弄清楚事情的来龙去脉,问题的基本原因,然后从根本点考虑问题的解决方法。
2014.11.27 周四
分 析俄罗斯TR069问题,比对数据包,发现CPE认证返回的数据包格式不一样,在正常的数据包中,需要返回Digest , qop, nonce, opaque四个参数,前三个都可以找到,但是第四个不知道是如何生成的。认证请求包中也存在这些参数,但是值和返回的数据包不一样。
2014.11.28 周五
Build出现堆溢出问题,调整堆的大小
在文件/usr/local/tomcat/bin/catalina.sh 中第一行下面添加:JAVA_OPTS='-server -Xms1024m -Xmx2048m -XX:PermSize=256M -XX:MaxPermSize=512M'
conn_req_ser监听来自服务器端的连接,有连接的话调用函数str_process进行处理,str_process调用verify_conn_req对来自ACS端的连接进行验证。
*p++是先取出*p的值,然后让p++
(*p)++是先取出*p的值,让这个值++
*(P++)是先取出*p的值,让p++
所以,*p++等价于*(P++)
2014.12.5 周四
日志漏了几天,因为这几天没有什么特别的事情做。
今 天根据电信反馈的数据包调整SLAAC和DHCPv6的拨号方式,从数据包上看,上级的路由器通过RA报文公告了prefix和O 设置为1的报文,这个prefix用于WAN口设置IP,O bit 说明通过DHCP6c获取前缀,而这个前缀是给LAN端用的,kernel中定义的
#define IF_RA_OTHERCONF 0x80
#define IF_RA_MANAGED 0x40
从抓包的数据看,应该是相反才对,
#define IF_RA_MANAGED 0x80
#define IF_RA_OTHERCONF 0x40
2014.12.8周一
今天去了香港电信盈科测试IPv6的接入问题,和负责IPv6接入的工程师沟通。
2014.12.9 周二
整理周一测试的数据,写文档。发给boss,但是没有将重要的结论在邮件中列举出来进行讨论,主要一下,领导要知道的结果,讨论的也是结果,过程的细则是不太关心的。
2014.12.10 周三
查看RFC 4861 关于M/O bit的处理方式,哥伦比亚反馈TR069出现问题,反馈我们的软件断开的时候没有发送空的post包,还有就是ACS 操作CPE重启的时候,路由器没有重启,原因是线程先退出后调用swReboot命令。
gen_http_header 函数用于构造一个http包头,而从这个信息看,应该需要构造一个空的http post包头。
2014.12.11 周四
今天会议讨论合并后代码刷新计划,还有新平台下的项目开发;新平台下是参考openwrt的代码结构,和qca完全不一样,我负责843的项目,这个是一个新机型的任务,因为新平台分工比较细,所以后面有很多需要和其他组交流。
2014.12.12 周五
今天编写shell脚本对qca下多有的机型机型编译,买了书但是不看,终于知道书到用时方很少。
#!/bin/bash
TRUNK_DIR=../
SCRIPT_DIR=$TRUNK_DIR/build/build_products
CONFIG_DIR=$TRUNK_DIR/build/products_config
i=0
mkdir $TRUNK_DIR/build/allimages
find $SCRIPT_DIR -type f -print |
while read LINE
do
#echo "Build For " $LINE
if ` echo $LINE | grep ".svn" > /dev/null `; then
# skip for svn
continue;
fi
if ` echo $LINE | grep "build_all_products.sh" > /dev/null `; then
# skip for ourself
continue;
fi
foldername=`echo $LINE | awk -F/ '{print substr($NF,7,length($NF) - 9)}'`
echo $foldername
if test -d $CONFIG_DIR/$foldername
then
echo $CONFIG_DIR/$foldername "exist, build it"
#chmod u+x $LINE
#/bin/bash $LINE
let i++
echo $i
else
echo $CONFIG_DIR/$foldername "not exist, skip it"
fi
echo "Build Done For " $LINE
done
echo "Build" $i products
回去好好消化一下。
jenkins上的两个路径
显示编译产物路径:/workspace/jenkins/jobs/soho5_qca_trunk_prep/lastSuccessful/archive/images
服务器上代码路径:/workspace/jenkins/workspace/soho5_qca_trunk_prep/
2014.12.15
下载ipf的代码,编译,发现编译不过,原因
1)不能使用root权限下载代码;
2)需要先安装git工具,apt-get install git-svn, 安装ocaml: apt-get install ocaml-native-compilers;安装g++: apt-get install g++;
3)编译make[4]: Leaving directory `/home/project/IPlatform/board/model_qca_qca953x/sdk/ILQ_1_2_CS/tools/coccinelle'失败
必须安装ocaml-3.12.zip,安装方法:
1)先解压文件unzip ocaml-3.12.zip;
2)进入ocaml-3.12, 执行./confiugre ,然后make world, 然后make opt,最后make install。
3)检查ocaml 版本, ocaml -v
2014.12.16
昨天boss开会讨论843 2.0的项目问题,对这个项目的需求理解错误,这个只是个2模式的产品,router 和wisp client router。
还有的就是对立项报告没有仔细看清楚记清楚里面的要求。
2014.12.17
重装了ubuntu 14.04.因为权限问题,创建文件夹需要root权限,但是文件中的目录不能用root权限,通过chown -R zhouqiqiu:zhouqiqiu /home/project 修改
然后通过smbpasswd -a zhouqiqiu添加用户
2014.12.18
重新安装12.04,昨天的那个问题可能是应为编译qca时没有使用root权限。在12.04上使用非root编译qca,提示configure使用一个更新版本的shell,但是查看已经是安装了bash。转换到root后没有问题。
更新源:apt-get update
升级软件:apt-get upgrade
更新系统:apt-get dist-upgrade
1
apt-get install build-essential
1
2
3
4
5
wget http://zlib.net/zlib-1.2.5.tar.gz
tar -zxf zlib-1.2.5.tar.gz
cd zlib-1.2.5/
./configure --prefix=/usr/localmake && make install
1
2
apt-get purge openssl
rm -rf /etc/ssl #删除配置文件
找不到crypt,原因是放的目录不对,做一个连接即可
sudo ln -s /usr/lib/i386-linux-gnu/libcrypt
删除某一条连接
net use \\192.168.0.1\volume1 /delete
2014.12.19
今 天在测试nas功能,通过Guest network 访问NAS 存储设备,发现可以访问主网络共享的设备,在跟进smb-TP,在makefile中可以打开_DEBUG,还要httpd中修改 samba_global_section变量中的level和logsize
OpenConfFile:打开配置文件
2014.12.23 周二
调试IPv6的问题,在本地编译的时候发现ipv6的bin文件经过两次strip后会出现变成400字节的问题。
今天解决了2个问题,第一个是6to4地址生成的问题,一定要设置位宽;
第二个是在ap136上实现MO bit的方式,这个是去香港测试的结论,先实现M=0,O=1这种情况
2014.12.25 周四
增加DHCP M=0,O=1的方式,去掉SLAAC的,然后在PPPoE中也增加这种方式的处理。遇到Dibber-server没有回应,原因是因为配置问题,要加入local
下面是配置方式:
vim /etc/ppp/pppoe.conf
修改下面几个值,其他的不要动
ETH=eth0 #根据服务网卡设定
USER=zhaosan
LINUX_PLUGIN=/etc/ppp/plugins/rp-pppoe.so
vim /etc/ppp/pppoe-server-options
下面是全部内容
require-chap
login
lcp-echo-interval 10
lcp-echo-failure 2
vim /etc/ppp/chap-secrets
"zhaosan" * "123456" *
vim options
local
ipv6 ,
第二个问题是wide中,get_duid 获取MAC地址,当时ppp拨号的时候,设备时ppp1或者ppp0,这时候会出现获取MAC地址失败的现象。
原来的修改方式是定义了一个宏,但是这样就出现了硬编码的问题,1043的WAN口是eth0.2,而其他一般是eth1。这种情况要注意。
修改,在命令通过-I 参数将WAN设备的名称传入
RS的回包RA不是马上就回,有一点的间隔,而且不是确定。
2014.12.26周五
今天测试中国电信的IPv6接入,有两点要注意:
1)使用一个ppp session同时实现v4和v6的连接,DUID采用的是MAC+时间,但是我使用MAC也是可以的;
2)接口要注意,虚拟接口和实际接口,在get_duid函数中如果获取ppp的MAC是失败的,所以在dhcpc中要将实际的接口地址也要传入;
3)服务器不主动回复RS报文,所以需要永远打开ACCEPT_RA的控制;
2014.12.29周一
今天抓包发现,RS包没有走ppp0接口,报文中没有ppp包头,只有以太网包头,在发包函数中指定了发包设备的id,对于pppoe来说,是虚拟的ppp0设备。但是数据包还是没有走ppp协议栈,导致RS只走了以太网协议。
/proc/net/if_inet6
ndisc_router_discovery 1185 dev name = eth0.2
in6_dev->cnf.forwarding = 1, in6_dev->cnf.accept_ra = 1
ndisc_router_discovery 1210 not accept, return
ndisc_router_discovery 1185 dev name = br0
ar9300_handle_radar_bb_panic: BB status=0x04008009 rifs=1 - disable
ar9300_reset[4523]: ar9300_stop_dma_receive failed
ndisc_router_discovery 1185 dev name = eth0.2
in6_dev->cnf.forwarding = 1, in6_dev->cnf.accept_ra = 1
ndisc_router_discovery 1210 not accept, return
ndisc_router_discovery 1185 dev name = ppp0
in6_dev->cnf.forwarding = 1, in6_dev->cnf.accept_ra = 1
ndisc_router_discovery 1210 not accept, return
ndisc_router_discovery 1185 dev name = ppp0
in6_dev->cnf.forwarding = 1, in6_dev->cnf.accept_ra = 1
ndisc_router_discovery 1210 not accept, return
ndisc_router_discovery 1185 dev name = ppp0
in6_dev->cnf.forwarding = 1, in6_dev->cnf.accept_ra = 1
ndisc_router_discovery 1210 not accept, return
ndisc_router_discovery 1185 dev name = ppp0
in6_dev->cnf.forwarding = 1, in6_dev->cnf.accept_ra = 1
ndisc_router_discovery 1210 not accept, return
2014.12.31 周三
843 2.0项目计划:
软件第一轮提测:2015.1.31;
解bug和第二轮提测:2015.2.13; (测试时间预留一周,测试和解bug可同步进行)
解bug和第三轮提测:2015.3.6 (考虑14日开始部分同事放假,2.25春节结束,上班)
解bug和第四轮提测:2015.3.17 (测试验证bug,研发和产品评估bug)
2015.3.24 发布软件。
调试发现,ppp0 作为ra中的收包设备而不是eth,radvd 和dhcp服务器需要在ppp接口创建后起来,radvd才能走ppp协议栈。
另外发现RA会定时发布,默认网关中有通过RA由内核设置,上层不用管的。
# ip -6 route
240e:fa:2060:fc00::/64 dev br0 metric 1024 mtu 1500 advmss 1440 hoplimit 0
fe80::/64 dev eth0.2 proto kernel metric 256 mtu 1500 advmss 1440 hoplimit 0
fe80::/64 dev br0 proto kernel metric 256 mtu 1500 advmss 1440 hoplimit 0
fe80::/64 dev eth0 proto kernel metric 256 mtu 1500 advmss 1440 hoplimit 0
fe80::/64 dev wifi0 proto kernel metric 256 mtu 1500 advmss 1440 hoplimit 0
fe80::/64 dev eth0.1 proto kernel metric 256 mtu 1500 advmss 1440 hoplimit 0
fe80::/64 dev ath0 proto kernel metric 256 mtu 1500 advmss 1440 hoplimit 0
fe80::/64 dev ppp0 proto kernel metric 256 mtu 1480 advmss 1420 hoplimit 0
fe80::/10 dev ppp0 metric 1 mtu 1480 advmss 1420 hoplimit 0
fe80::/10 dev ppp0 proto kernel metric 256 mtu 1480 advmss 1420 hoplimit 0
ff00::/8 dev eth0.2 metric 256 mtu 1500 advmss 1440 hoplimit 0
ff00::/8 dev br0 metric 256 mtu 1500 advmss 1440 hoplimit 0
ff00::/8 dev eth0 metric 256 mtu 1500 advmss 1440 hoplimit 0
ff00::/8 dev wifi0 metric 256 mtu 1500 advmss 1440 hoplimit 0
ff00::/8 dev eth0.1 metric 256 mtu 1500 advmss 1440 hoplimit 0
ff00::/8 dev ath0 metric 256 mtu 1500 advmss 1440 hoplimit 0
ff00::/8 dev ppp0 metric 256 mtu 1480 advmss 1420 hoplimit 0
default via fe80::452c:96b1:b99b:966a dev ppp0 metric 255 mtu 1480 advmss 1420 hoplimit 0
default via fe80::452c:96b1:b99b:966a dev ppp0 proto kernel metric 1024 expires 672sec mtu 1480 advmss 1420 hoplimit 64
在 实验室里面测试,发现在ppp起立后,就会收到第一个RA,但是这时候wan_interface还没有设置,所以RA的收包函数会丢掉这个 包,然后httpd发送RS,但是这个包没有走PPP协议层,只走了ethernet协议,导致服务器没有收到RS也不会发送RA, 因为发送RS发送16次,每次两秒,所以在这个时间内,如果有RA包到,内核是可以收到的
解决方法可以;
1)在ppp中接口一起来就设置wan_interface;
2) 在kernel中只将br0的RA包过滤,WAN口的不做过滤,但是这个严格来说有问题的;
3)解决为什么RS没有走PPP协议层,这个才是关键;
2015.1.4 周日
新 一年上班的第一天,今天主要就绝1043遗留的bug,ipv6编译到kernel后,DAD没有执行,跟入到函数addrconf_dad_timer 中,发现最后调用ndisc_send_skb函数发包,只是通过NF_HOOK函数挂载到LOCAL_OUT钩子中。
2015.1.7 周三
今天开会讨论新平台3G/4G的问题,根据反馈的信息,现在3.14kernel已经支持qmi驱动,并且有更新,需要研究一下如何更新这个驱动;
晚上解决1043的bug。
2015.1.9 周五
编写一个kernel模块的makefile
编写Makefile 文件,与hello.c 放在同一个目录里
obj-m := hello.o
KERNELBUILD :=/lib/modules/$(shell uname -r)/build
default:
make -C $(KERNELBUILD) M=$(shell pwd) modules
clean:
rm -rf *.o *.ko *.mod.c .*.cmd *.markers *.order *.symvers .tmp_versions
(注意makefile里面要求的tab)
KERNELBUILD :=/lib/modules/$(shell uname -r)/build是编译内核模块需要的Makefile的路径,Ubuntu下是
/lib/modules/2.6.31-14-generic/build
make -C $(KERNELBUILD) M=$(shell pwd) modules 编译内核模块。-C 将工作目录转到KERNELBUILD,调用该目录下的Makefile,并向这个Makefile传递参数M的值是$(shell pwd) modules。
3. 编译模块
#sudo make (调用第一个命令default)
这时,在hello.c 所在文件夹就会有 hello.ko ,这个就是我们需要的内核模块啦
#sudo make clean
清理编译垃圾,hello.ko 也会清理掉。
4. 插入模块,让其工作。注意必须是root权限
#sudo insmod ./hello.ko
我们用dmesg 就可以看到 产生的内核信息啦,Hello world!
2015.1.12 周一
今 天上午主要是补充上后5提测的资料,下午调试841ru的tr069问题,从反馈的日志看,mxmlLoadString函数返回了null,而进入的提 示信息是内存不足,但是看了这个函数的作用,可能是对数据包的到mxl tree的转换过程出错了,可能是数据包的格式有问题。
2015.1.13 周二
上午在看IPF build目录下842V3的配置文件,
partition.conf是flash的分区配置文件;除了MAC和PIN外,分区中可以存放一些配置文件;
product.mk用于生成软件;
iplatform_prep: 拷贝文件,然后编译make package/symlinks
2015.1.20 周二
打开NF debug :
#iwpriv wifi0 HALDbg 0x181
IPF:
工具软件代码:Z:\svn\IPlatform\board\model_qca_qca953x\iplatform\opensource
页面文件:Z:\svn\IPlatform\board\model_qca_qca953x\iplatform\private\webpages\src
Z:\svn\IPlatform\platform\Makefile
package/symlinks:
$(SCRIPT_DIR)/feeds update -a
$(SCRIPT_DIR)/feeds install -a
busybox : /home/project/svn/IPlatform/board/model_qca_qca953x/sdk/ILQ_1_2_CS/build_dir/target-mips_r2_uClibc-0.9.33.2/busybox-1.19.4
2015.1.21 周三
白天MTP培训
晚上加班裁剪busybox,发现如果使用命令
make package/busybox/clean V=s 编译,原来的busybo的目录会整个被删除,
在编译make package/busybox/compile V=s时会从
Z:\svn\IPlatform\board\model_qca_qca953x\iplatform\opensource\busybox拷贝一份
make[3]: Entering directory `/home/project/svn/IPlatform/board/model_qca_qca953x/iplatform/opensource/busybox'
mkdir -p /home/project/svn/IPlatform/board/model_qca_qca953x/sdk/ILQ_1_2_CS/build_dir/target-mips_r2_uClibc-0.9.33.2/busybox-1.19.4
cp -fpR ./src/* /home/project/svn/IPlatform/board/model_qca_qca953x/sdk/ILQ_1_2_CS/build_dir/target-mips_r2_uClibc-0.9.33.2/busybox-1.19.4
文件系统所在的目录:
Z:\svn\IPlatform\board\model_qca_qca953x\sdk\ILQ_1_2_CS\build_dir\target-mips_r2_uClibc-0.9.33.2\root-ar71xx
pppd路径:Z:\svn\IPlatform\board\model_qca_qca953x\sdk\ILQ_1_2_CS\build_dir\target-mips_r2_uClibc-0.9.33.2\pppd-2.4.3\
2015.1.23 周五
QCA的FAE过来分析TL-WR1043 CCA的问题,给出了几个建议
1)在1和13信道将干扰源的输入功率放大;
2)QCA内部确认一下是否需要测试11B模式;
3)在进行CCA认证时,需要跑ixchariot;
4)将干扰信号通过1分3功分器进入;
5)干扰信号要停,DUT要重启;
寄存器值的计算方式:
0xb8109e1c,0xb810ae1c,0xb810be1c 对应ch0,ch1,ch2三个值,先读出这个寄存器的值,其20~28bit是噪音水平(NF)使用这个值减去512,就是对应的阈值,阈值设置对应的 寄存器0xb8109e20,0xb810ae20,0xb810be20.
2015.1.26 周一
今天上午开会讨论了特制单的事情,然后收到邮件所哥伦比亚的TR069问题已经解决,但是看看代码,发现代码在重装系统的时候没有备份下来,我晕死啊,看笔记看邮件知道如何改,先改了,但是改的代码不是用户确认的代码。
下午看了俄罗斯反馈的TR069问题,发现是认证和解析post帧都有问题,重新给了一个软件。
晚上加班看1043的bug,media server 不支持特殊字符的问题在db120改过,具体是将页面的特殊字符转出实际的字符
& --- & amp ;
< --- & lt ;
> --- & gt ;
' --- & apos ;
" --- & quot ;
2015.1.28 周三
今天在解决TL-WR1043ND(UN) 3.0的bug,发现在ipv6初始化的时候,sleep函数是无效的,LAN端设置了前缀,然后重启,路由器并没有DAD,但是如果在起来后,修改前缀,则会,怀疑是eth0.1没有加入到br0中。
2015.1.29 周四
IPv6还是有很多问题
整理了打印服务器的问题反馈给kcodes,制作740v5带IPv6和SNMP功能的软件,正在自测
2015.1.30
SLAAC: RA提供网关;RA提供前缀用于WAN口自动生成IP; DHCPv6 请求前缀用于LAN端代理;DHCPv6请求DNS用于LAN;
2015.2.3日
昨天又犯了一个低级错误,测试部测试反馈了一个USB LED灯的问题,但是在本地编译软件没有出现,然后提测后又出现了,原因是tphotplug的代码被改了,但是我本地的代码没有更新。
DHCPv6: RA提供网关;DHCPv6请求IP用于WAN,前缀用于LAN端代理,DNS用于LAN端;
2015.2.6 日周五
今天测试TR069,发现原来写入的发送空的post http包中没有经buffer挂到发送队列中,导致用光了,不能收,不能发;太大意了。
下午boss面谈,要来的终于来了,第一是不用再挂组长的头衔,第二个是写的代码令人不适很放心,这两个真是打击啊;也许今年是离开的时候了。
2015.2.7 周六
下午回来搞TL-WR1043的问题,发现如果URL参数中如果有+,是会被转掉的,在函数httpParseArgs中解析参数,httpLineUnescape这个函数中会将+号转成空格。
SLAAC在重启后也是不会重连成功,抓包发发现发NS包很晚,在发NS包前已经执行完了拨号的动作,但是进入页面点击连接,是可以的。
2015.2.9 周一
看lua资料
1)模块声明, module("luci.test", packet.seeall);
2)引用其他模块, local network = require "luci-network"
3)控制脚本,存在一个全局函数index,作为页面请求入口函数;
4)控制脚本特有的函数,_index 函数,dispatch函数和dispatch_tbl函数;
local dispatch_tbl = {
["provider"] = {
["read"] = { cb = provider_get }
},
["dyndns"] = {
["read"] = { cb = dyndns_get },
["write"] = { cb = dyndns_set },
["login"] = { cb = dyndns_login },
["logout"] = { cb = dyndns_logout },
["refresh"] = { cb = dyndns_refresh }
},
["noip"] = {
["read"] = { cb = noip_get },
["write"] = { cb = noip_set },
["login"] = { cb = noip_login },
["logout"] = { cb = noip_logout },
["refresh"] = { cb = noip_refresh }
}
}
function dispatch(http_form)
return ctl.dispatch(dispatch_tbl, http_form)
end
function _index()
return ctl._index(dispatch)
end
function index()
entry({"admin", "ddns"}, call("_index")).leaf = true
end
页面存放的位置:Z:\svn\IPlatform\board\model_qca_qca953x\iplatform\private\webpages\src\pages\userrpm
lua-app存放位置:Z:\svn\IPlatform\board\model_qca_qca953x\iplatform\private\luci-apps\src
在页面中:
var URL_UPNP_ENABLE = $.su.url("/admin/upnp?form=enable"); //data/upnp.rule.json
var URL_UPNP_SERVICE = $.su.url("/admin/upnp?form=service"); //data/upnp.json
指定了通过control中的哪个lua脚本进行处理,这些lua脚本放在:
Z:\svn\IPlatform\board\model_qca_qca953x\iplatform\private\luci-apps\src\controller\admin 中
在 upnp.lua脚本中,local enable = uci_r:get("upnpd", "config", "enable_upnp")从配置文件中将该参数读出来,dispatch表,注册对应form=enable和form=service请求中的 read和write操作,http_form是处理函数的参数。
local dispatch_tbl = {
enable = {
["read"] = {cb = read_enable},
["write"] = {cb = write_enable}
},
service = {
[".super"] = {cb = get_clients}
}
}
function write_enable(http_form)
local sys = require "luci.sys"
local ctypes = require "luci.model.checktypes"
local enable = http_form["enable"]
if not ctypes.check_onoff(enable) then
return false, "invalid args"
end
if read_enable().enable ~= enable then
uci_r:set("upnpd", "config", "enable_upnp", enable == "on" and "1" or "0") --[[设置enable_upnp参数]]--
uci_r:commit("upnpd") --[[保存参数,写入flash]]--
sys.fork_exec(enable == "on" and UPNP_SH_ENABLE or UPNP_SH_DISABLE) --[[执行脚本]]--
end
return {
enable = enable
}
end
2015.2.10 周二
今天上午看了lua的脚本,请教了同事lua脚本是如何将参数传到flash中的。下午1043和3420的bug继续袭来,reopen的bug很令人失去信心,心情也变得浮躁。
晚上加班,但是精力不能集中,胡乱看了下书,看到递归调动次数的计算。
有时候自己心里太浮躁了,感觉事情要一下子做完最好,但是这样往往忽略了很多细节的问题,解决问题也考虑不够全面
export TERM=vt100
export TERMINFO=/usr/share/terminfo
心情浮躁的时候,表现在脸上,可能显得很严肃。
2015.2.11 周三
早上开会讨论IPF的裁剪,主要是讨论各个模块现在还有哪些可以裁剪的空间,主要的目标还是无线模块。这种会议最关键就是确立方向,安排人员和如何跟进,否则会议白开了。我负责pppd和xl2tp。要趁这个机会仔细看看ppp和xl2tp的代码
下午主要是对1043一些bug的确认,剩下的bug都是需要评估后不解决的bug,包括DHCPv6重启后拨号的问题。
2015.2.25 周三
新年第一天上班,boss发了个大红包!
今天要看WISP的代码逻辑和测试功能。从界面上看,和client模式类似,虚拟出一个ath7作为sta vap,这个stavap 使用和WAN一样的MAC地址,survey 到前端的RootAP后,分配到一个IP,
ath7 Link encap:Ethernet HWaddr 00:0A:EB:13:09:1A
inet addr:192.168.0.100 Bcast:192.168.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:20 errors:0 dropped:0 overruns:0 frame:0
TX packets:148 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:3765 (3.6 KiB) TX bytes:9206 (8.9 KiB)
然后ping前端RootAP LAN端的一台PC,可以ping通。
然后修改WAN的拨号方式是的PPPoE,RootAP LAN 端端PC 开启PPPoE Server服务器,发现可以拨号成功。
# ifconfig ath7
ath7 Link encap:Ethernet HWaddr 00:0A:EB:13:09:1A
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:886 errors:0 dropped:0 overruns:0 frame:0
TX packets:300 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:227757 (222.4 KiB) TX bytes:26312 (25.6 KiB)
# ifconfig ppp0
ppp0 Link encap:Point-Point Protocol
inet addr:192.168.5.103 P-t-P:192.168.5.101 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1480 Metric:1
RX packets:18 errors:0 dropped:0 overruns:0 frame:0
TX packets:40 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:3
RX bytes:738 (738.0 B) TX bytes:2183 (2.1 KiB)
# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.5.101 * 255.255.255.255 UH 0 0 0 ppp0
192.168.1.0 * 255.255.255.0 U 0 0 0 br0
239.0.0.0 * 255.0.0.0 U 0 0 0 br0
default 192.168.5.101 0.0.0.0 UG 0 0 0 ppp0
void wlanWorkingWisp(WLAN_BAND_TYPE type)
{
WLAN_BASIC_CFG wlanBasicCfg;
swWlanBasicCfgGet(type, &wlanBasicCfg);
if (!wlanBasicCfg.bBridgeEnable)
{
PRINTF_ECHO("ERROR: APC Router ==> wlanBasicCfg.bBridgeEnable Not TRUE !!!");
return;
}
wlanMakeVap(type, ATH_VAP_AP, swWlanGetRealIdxByVidx(type, 0));
wlanSecurityInit(type, swWlanGetRealIdxByVidx(type, 0), 0);
wlanMacFiltInit(type, swWlanGetRealIdxByVidx(type, 0));
wlanWpsUp(type, swWlanGetRealIdxByVidx(type, 0));
wlanMakeVap(type, ATH_VAP_STA, wlanGetSTANum(type));
execFormatCmd("iwpriv %s vap_ind 0", wlanGetApDevName(type));
execFormatCmd("iwpriv ath%d vap_ind 0", wlanGetSTANum(type));
wlanWispFinalConf(type);
execFormatCmd("ifconfig %s down", wlanGetApDevName(type));
execFormatCmd("ifconfig %s down", wlanGetSTADevName(type));
sleep(3);
execFormatCmd("ifconfig %s up", wlanGetApDevName(type));
execFormatCmd("ifconfig %s up", wlanGetSTADevName(type));
}
加密方式通过hostapd(注意宏WIRELESS_USE_ATHR_HOSTAPD)进行设置;在函数wlanBasicCommonDynSet中进行重新拨号和调用函数vapAllUp 使能所有vap
无线相关工具
iwconfig
iwpriv
wlanconfig
2015.2.26 周四
无线驱动中使用的断言:
#define adf_os_assert(expr) do {\
if(unlikely(!(expr))) { \
printk(KERN_ERR "Assertion failed! %s:%s %s:%d\n", \
#expr, __FUNCTION__, __FILE__, __LINE__); \
panic("Take care of the assert first\n"); \
} \
}while(0);
assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行
ipf的配置所有模块的配置文件以xml树的形式存放,放在:
2015.2.27 周五
看无线驱动代码
无线收包函数,ath_netdev_hardstart_generic
osif_ioctl_create_vap 创建虚拟的vap,
ATH_INIT_TQUEUE(&osdev->intr_tq, (adf_os_defer_fn_t)ath_tasklet, (void*)dev); 创建一个tasklet用于收无线包;
ATH_HTC_SET_CALLBACK_TABLE(sc->sc_ath_ops); 初始化softc的操作;当中包括tx_init和rx_init函数。
ath_ar_ops定义了无线驱动中的会调函数,包括tx和rx,其中tx对应的函数是ath_tx_start
ath_wbuf.c中的ADF_SUPPORT这个宏是被定义了。
无线初始化流程:
ieee80211_priv_handlers 定义了iwpriv命令支持的参数。
Z:\svn\IPlatform\board\model_qca_qca953x\build\product_configs\842v3_un\defaultconfig.xml 中
2015.3.4 周三
ap136 的gpio 通过Z:\soho5_qca_trunk_prep\ap136\linux\kernels\mips-linux-2.6.31\arch\mips\atheros中的gpio.c文件实现,
参数配置在kernel.config定义:
CONFIG_GPIO_WIFI_SWITCH_BIT=17
CONFIG_GPIO_WIFI_SW_HOLD_TIME=3
在文件中会转换成宏WIFI_SW_HOLD_TIME使用,在函数wifi_sw_irq中处理。
2015.3.5 周四
在kernel中增加了DAD结果的处理,并返回到httpd, radvd在选择静态IP后,设置了手动前缀,重启后radvd不能起来,然后发现在命令中加入 -d 参数后可以。
radvd -d 1 -C /tmp/radvd_br0.conf -p /tmp/radvd.pid
2015.3.11 周二
开始在IPF上添加843v2软件的配置文件,第一步是添加配置文件目录,还有就是在uboot中添加机型的配置文件
uboot的配置文件路径:Z:\svn\IPlatform\board\model_qca_qca953x\sdk\ILQ_1_2_CS\package\qca-legacy-uboot
机型的配置文件:Z:\svn\IPlatform\board\model_qca_qca953x\build\product_configs\
uboot源码路径:Z:\svn\IPlatform\board\model_qca_qca953x\sdk\ILQ_1_2_CS\qca\src\qca-legacy-uboot
kernel代码路径:Z:\svn\IPlatform\board\model_qca_qca953x\sdk\ILQ_1_2_CS\qca\src\linux
在编译了第一次make后,代码进行了拷贝,编译使用的是拷贝后的代码:
编译时kernel的代码:/home/project/svn/IPlatform/board/model_qca_qca953x/sdk/ILQ_1_2_CS/build_dir/linux-ar71xx_generic/linux-3.3.8/
无线驱动代码:Z:\svn\IPlatform\board\model_qca_qca953x\sdk\ILQ_1_2_CS\qca\feeds\wlan_10_2
开源的apps: Z:\svn\IPlatform\board\model_qca_qca953x\iplatform\opensource
lua 脚本:Z:\svn\IPlatform\board\model_qca_qca953x\iplatform\private\luci-apps\src
web 代码:Z:\svn\IPlatform\board\model_qca_qca953x\iplatform\private\webpages
无线脚本: Z:\svn\IPlatform\board\model_qca_qca953x\iplatform\private\luci-apps\src\model
文件系统路径:Z:\svn\IPlatform\board\model_qca_qca953x\sdk\ILQ_1_2_CS\build_dir\target-mips_r2_uClibc-0.9.33.2\root-ar71xx\
在编译uboot前,需要先clean:
make package/qca-legacy-uboot/clean PRODUCT_NAME=wr843nv2_un V=s
再编译:
make package/qca-legacy-uboot/compile PRODUCT_NAME=wr843nv2_un V=s
无线编译:
compile wireless:
make package/feeds/wlan_10_2/qca-wifi/compile V=s
make package/feeds/wlan_10_2/qca-wifi/install
下载无线校准:tftp -gr 841v11.bin 192.168.0.104 -l /dev/caldata
make firmware的处理在文件:product_configs/wr843nv2_un/product.mk
修改了配置文件,一定要先make iplatform_prep,更新一下配置文件。
Z:\svn\IPlatform\board\model_qca_qca953x\iplatform\private
Z:\svn\IPlatform\board\model_qca_qca953x\sdk\ILQ_1_2_CS\package\feeds\iplatform\ledctrl\src 是前面的链接
make package/feeds/iplatform/ledctrl/clean PRODUCT_NAME=wr843nv2_un V=s
make package/feeds/iplatform/ledctrl/compile PRODUCT_NAME=wr843nv2_un V=s
使用命令make package/feeds/iplatform/ledctrl/install PRODUCT_NAME=wr843nv2_un V=s会将结果拷贝到:
/home/project/svn/IPlatform/board/model_qca_qca953x/sdk/ILQ_1_2_CS/build_dir/target-mips_r2_uClibc-0.9.33.2/root-ar71xx/usr/bin
编译kernel :
make target/linux/compile PRODUCT_NAME=wr843nv2_un V=s
make target/linux/install PRODUCT_NAME=wr843nv2_un V=s
nvrammanager -s 查看分区表
3f7000是partion分区表的偏移地址,在uboot中对应的地址就是9f3f7000
2015.3.13 周五
重新提测WR1043ND(UN) 3.0发现重启的时候还是不会发送DAD NS报文
2015.3.16 周一
挂载无线驱动
ath79_wdt.ko ath_hal.ko ath_rate_atheros.ko
ath_dev.ko ath_pktlog.ko
时发现串口出现kernel不足的问题:
[ 51.480000] Normal free:272kB min:720kB low:900kB high:1080kB active_anon:4508kB inactive_anon:320kB active_file:4952kB inactive_file:4224kB unevictable:0kB isolated(anon):0kB isolated(file):76kB present:32512kB mlocked:0kB dirty:0kB writeback:0kB mapped:1520kB shmem:592kB slab_reclaimable:1324kB slab_unreclaimable:8036kB kernel_stack:416kB pagetables:448kB unstable:0kB bounce:0kB writeback_tmp:0kB pages_scanned:4 all_unreclaimable? no
当前的
root@TL-WR843Nv2:/# cat /proc/sys/vm/min_free_kbytes
721
root@TL-WR843Nv2:/# cat /proc/sys/vm/drop_caches
3
去除一些ko后,内存使用量:
MemTotal: 29192 kB
MemFree: 7972 kB
Buffers: 1504 kB
2015.3.17 周二
今天继续分析无线驱动不能起来的问题,和几个同事交流后,测量出无线起来需要大概的内存量为9140KByte,而843v2的板上空余大概是7690KB,严重不足,而且webserver起来居然需要12752KB,这个太惊人了。
在串口可以通过/etc/init.d/wireless重启无线。
将这些数据发了出来,得到的一个消息是32M的DDR1比64M 的DDR2还贵,希望能换成64M的DDR2吧。
2015.3.18
Z:\svn\IPlatform\board\model_qca_qca953x\iplatform\private\luci-apps\src\model\wireless.lua
该文件定义了无线参数请求的处理脚本,定义了Apcfg类:Apcfg = utl.class(),在这个类中定义了成员函数
Z:\svn\IPlatform\board\model_qca_qca953x\iplatform\private\luci-apps\src\controller\admin\wireless.lua
定义请求的处理函数。
Z:\svn\IPlatform\board\model_qca_qca953x\build\product_configs\wr843nv2_un\default-config.xml
样机中声明需要这个参数,类似uc层,但是一个样机的所有参数都定义在这个文件中;
Z:\svn\IPlatform\board\model_qca_qca953x\iplatform\private\webpages\src
机型配置页面
在文件Z:\svn\IPlatform\board\model_qca_qca953x\sdk\ILQ_1_2_CS\qca\src\qca-legacy-uboot\include\configs\board953x.h中定义内存的大小
console=ttyS0,115200 board=AP143 rootfstype=squashfs init=/etc/preinit mtdparts=spi0.0:64k(u-boot),960k(uImage),3008k(rootfs),64k(ART) mem=64M rootfstype=squashfs
2015.3.19 日周四
ES File 文件管理工具,安卓平台上使用的一个apps,反馈通过这个工具访问samba失败,原因是这个工具使用CIFS,但是我们现在的samba-TP对功能进行过裁剪,这部分功能所在的nsswitch目录是不存在的,所以不提供这个功能。
SPNEGO 是一种认证协议,现在的samba-TP把这个协议去掉了。新版的3.0.20上支持这个协议。
2015.3.20 周五
阅读lua和web的脚本,对于web,请求一次quick_seup的时候,lua脚本将所有各个步骤的脚本的数据进行遍历,第一步,数据请求:
从 数据请求中可以看到是请求admin/quick_setup这个路径,而这个路径在lua代码中对应的是iplatform\private \luci-apps\src\controller\admin\quick_setup.lua,就是说对这个请求的处理在 quick_setup.lua中,进入这个文件,
function dispatch(http_form)
return ctl.dispatch(dispatch_tbl, http_form)
end
function _index()
return ctl._index(dispatch)
end
function index()
entry({"admin", "quick_setup"}, call("_index")).leaf = true
end
最终需要遍历表dispatch_tbl,而这个表主要是读写函数:
local dispatch_tbl = {
quick_setup = {
["read"] = {cb = read},
["write"] = {cb = write}
},
check_internet = {
[".super"] = {cb = check_internet}
},
check_router = {
[".super"] = {cb = check_router}
}
}
而read函数主要是遍历ext_dispatch_tbl,在这个表中,定义了要读取的每个form的名字,而这些form,是一种数据类型,可以在其他模块中定义。
function read(http_form)
local data = {}
-- Wire type
data.wire_type = get_wire_type()
local success = true
for _, dsp in pairs(ext_dispatch_tbl) do
local target = require(dsp.controller)[dsp.target]
target = (type(target) == "function") and target
if target then
for _, v in pairs(dsp.forms) do
local form = {
form = v.form,
operation = "read"
}
local ret = target(form)
if ret.success then
updateonly_and_prefix(data, ret.data, v.prefix)
else
success = false
end
end
end
end
return success and data
end
2015.3.23
我们也遇到了fat32系统拷贝单个大文件(或压缩包)时出现延迟或者拷贝失败的情况。
这个是由于samba在拷贝之前对文件进行了ftruncate,而linux下vfat对ftruncate的支持是存在问题的,导致返回时间过长或者返回失败。
之前有考虑过两种解决办法,
1、修改samba,在拷贝之前,不进行扩展。这样对ntfs和vfat都不会进行扩展,其结果是,在拷贝开始时,无法知道存储设备是否有足够的可用空间。(拷贝时,刷新客户端,发现文件是逐渐变大的)
2、修改vfat文件系统,使其不进行扩展;而ntfs仍然进行扩展。这个修改了文件系统,存在一定风险。
4900现在使用和ADSL一样的处理方法,在fs/fat/file.c中直接跳过fat_cont_expand 函数
2015.3.24 周二
IPF的权限问题,在samba中如果编译过一些在编译软件过程中被删除的目录,会提示被禁止,因为samba是通过root权限登录的,如果修改过文件,那么这个文件所在的目录所有者发生变化,变成root,这时候用非root账号删除,没有权限。
开会讨论IPF裁剪,我要负责ledctrl、switch_led、led_cli、ntpd
添加了WISP的修改,文件系统变大了,partition中定义是2d0000大小。
CI 是OpenWRT为实现配置集中化而引入的一个软件包, 通过修改UCI,可以实现对OpenWRT的绝对部分配置的修改.LUCI(OpenWRT 的WEB配置界面)也是通过读UCI配置文件的操作来实现用户对路由的配置的。通过掌握UCI的API的使用,可以方便地将您的软件的配置接口集成到 LUCI中.
LUCI配置文件简介
LUCI的配置文件一般存储在 /etc/config目录下。比如网络配置文件则是 /etc/config/network 无线的配置文件是 /etc/config/wireless. 跟多配置文件的含义参考官方 WIKI
基本概念
UCI上下文: struct uci_context *
包(Package): 一个包对应一个UCI格式的文件.类型是 struct uci_package *
节(Section): 一个配置文件的节点. 类型是 struct uci_list *
值(Value):一个节下面可能包含多个值 一个值具有一个名字.
UCI配置文件的基本操作.
首先您需要引入头文件
#include
#include
#include
#include
ledctrl通过配置文件/etc/config/ledctrl 对各个led灯进行控制
root@TL-WR843Nv2:/etc/init.d# cat /etc/config/ledctrl
config rule 'USB1_ON'
option ledname 'USB1'
option style 'default'
option ledon '1'
config rule 'USB1_OFF'
option ledname 'USB1'
option style 'default'
option ledon '0'
config rule 'WIFI2G_ON'
option ledname 'WIFI_2G'
option style 'default'
option ledon '1'
config rule 'WIFI2G_OFF'
option ledname 'WIFI_2G'
option style 'default'
option ledon '0'
config rule 'WAN0_ON'
option ledname 'WAN_LINK'
option style 'default'
option ledon '1'
config rule 'WAN0_OFF'
option ledname 'WAN_LINK'
option style 'default'
option ledon '0'
config rule 'WAN1_ON'
option ledname 'WAN_INET'
option style 'default'
option ledon '1'
config rule 'WAN1_OFF'
option ledname 'WAN_INET'
option style 'default'
option ledon '0'
config rule 'STATUS_ON'
option ledname 'STATUS'
option style 'default'
option ledon '1'
config rule 'STATUS_OFF'
option ledname 'STATUS'
option style 'default'
option ledon '0'
config rule 'STATUS_BLINK'
option ledname 'STATUS'
option style 'blink'
option delayon '350'
option delayoff '350'
config rule 'WPS_ON'
option ledname 'WPS'
option style 'default'
option ledon '1'
config rule 'WPS_OFF'
option ledname 'WPS'
option style 'default'
option ledon '0'
config rule 'WPS_SUCCESS'
option ledname 'WPS'
option style 'blink'
option delayon '300000'
option delayoff '0'
option duration '300000'
config rule 'WPS_ERROR'
option ledname 'WPS'
option style 'blink'
option delayon '250'
option delayoff '250'
option duration '60000'
config rule 'WPS_OVERLAP'
option ledname 'WPS'
option style 'mix'
option delayon '250'
option delayoff '250'
option delaylast '2000'
option interval '500'
option duration '30000'
config rule 'WPS_INPROGRESS'
option ledname 'WPS'
option style 'blink'
option delayon '2000'
option delayoff '1000'
option duration '120000'
config rule 'WPS_LED'
option start 'on'
option style 'auto'
option apps 'wps_led'
在文件/etc/profile.d/profile中定义了支持哪些LED灯
config ledctrl
list ledname 'USB1'
list ledname 'WIFI_2G'
list ledname 'WPS'
list ledname 'WAN_LINK'
list ledname 'WAN_INET'
list ledname 'STATUS'
Private RSS: 映射到内存中的页面, 这些页面仅由进程单独使用. 这也是我们最关心地方: 进程实际占用的内存数,该功能通过宏 CONFIG_PROC_PAGE_MONITOR控制。
RSS : "Resident Set Size", 实际驻留"在内存中"的内存数
# cat /proc/568/maps
00008000-0036a000 r-xp 00000000 00:0e 236 /home/hik/hicore
00372000-003a5000 rw-p 00362000 00:0e 236 /home/hik/hicore
003a5000-00e28000 rwxp 003a5000 00:00 0 [heap]
40000000-40005000 r-xp 00000000 01:00 94 /lib/ld-uClibc.so.0
416db000-41770000 rw-s c2005000 00:0f 68 /dev/mem
b51fc000-b5200000 rwxp b51fc000 00:00 0
…….
be1fc000-be200000 rwxp be1fc000 00:00 0
be93b000-be950000 rwxp befeb000 00:00 0 [stack]
第一行:从r-xp可知其权限为只读、可执行,该段内存地址对应于执行文件的代码段,程序的代码段需加载到内存中才可以执行。由于其只读,不会被修改,所以在整个系统内共享。
第二行:从rw-p可知其权限为可读写,不可执行,该段内存地址对应于执行文件的数据段,存放执行文件所用到的全局变量、静态变量。
第三行:从rwxp可知其权限是可读写,可执行,地址空间向上增长,而且不对应文件,是堆段,进程使用malloc申请的内存放在堆段。每个进程只有一个 堆段,不论是主进程,还是不同的线程申请的内存,都反映到到进程的堆段。堆段向上增长,最大可以增长到1GB的位置,即0x40000000,如果大于 1GB,glibc将采用mmap的方式,为堆申请一块内存。
第四行:是程序连接的共享库的内存地址。
第五行:是以mmap方式映射的虚拟地址空间。
第六、七行:是线程的栈区地址段,每个线程的栈大小都是16K。
第八行:是进程的栈区。关于栈段,每个线程都有一个,如果进程中有多个线程,则包含多个栈段。
2015.12.04周五
昨天错误的操作,导致最近大半年的笔迹都给清了,备份只能备份到3月的。
今天跟踪一个免费ARP的问题,超找过免费ARP的作用:
免费 ARP 报文是一种特殊的 ARP 报文,该报文中携带的发送端 IP 地址和目标 IP 地址都是本机 IP 地址,报文源 MAC 地址是本机 MAC 地址,报文的目的 MAC 地址是广播地址。更换IP时,如果节点发送一个发往自己IP地址的ARP请求,结果收到ARP回应,这样就可以判断有另外一个机器使用与自己更换的IP地址相同的IP地址。如果发送了3个免费ARP后,都没有收到ARP回应,机器就假定此IP地址在此网络段中是唯一的。---地址冲突检测
设备通过对外发送免费ARP报文来实现以下功能:
2015.12.9 周三
今天检查了软件中关于字节序隐藏的问题,发现好几个地方都没有处理字节序,qca9533 2.0使用的是大端的字节训,MTK使用小端字节顺序,这个会存在问题。
下午认证跟踪了时区显示的问题,发现是数组 gnTimeZoneValue的长度宏 HTTP_TIME_ZONE_NUM少了1,导致遍历时最后一个元素没有遍历到。
2015.12.10 周四
今天要跟进4230P CCA问题,找回以前读写寄存器的命令:
ethreg -g addr或ethreg -g addr=value
获取国家码(国家码表allCountry):
iwpriv ath0 get_countrycode
ath0 get_countrycode:276
设置信道命令:iwconfig ath0 channel 6
设置工作模式和频率:iwconfig ath0 mode master freq 6
xp添加MAC地址绑定
arp -s 192.168.0.254 60-E3-27-F1-49-88
2015.12.15 周二
设置guest network的SSID 对- 和‘ 这两个字符生效,但是对主网络是没问题的
3.单引号和双引号的区别
单引号‘’:取消除单引号以外的任何字符的特殊含义。
如:echo ‘my name is $name’其结果为:my name is $name,此时$只作为一个普通字符使用了。
双引号“”:取消除双引号、$号以及_号以外的所有字符的特殊含义
单引号是强引用,引号里的值是什么,变量的值就是什么;
双引号是弱引用,引号里的值若再包含变量,那在赋值的时候,所有这些变量就被立即替换了。
2015.12.16 周三
通过python函数调用生成,命令行中输入python,回车后输入以下命令:
import random
int(random.uniform(100000, 999999))
wifi克隆只是将rootap的ssid和加密方式进行了克隆,但是不能进行无线连接,所以实际使用的组网必须PLC网线连接到前端的RootAP。另外,PLC必须设置网关为RootAP的LAN IP,否则PLC上层的包转发不出去,比如GMT时间的NTP包;
2015.12.21 周一
11na_ht20代表802.11na的20兆频宽,连接速率有130M,11na_ht40代表802.11na的40兆频宽,连接速率有300M。由于802.11n有个特性是40M频宽,该频宽是通过以前的两个20M信道叠加起来后生成的,并且叠加时两信道一个是主信道一个是副信道,这里的plus和minus都是针对主信道说的,所以11na_ht40plus代表40M频宽时的2个信道叠加向上加的叠加,例如当前信道是149,配成40M频宽需要叠加另外一个信道,就是149+153两个信道组成的40MHz频宽,11na_ht40minus代表信道叠加时是向下减的叠加,例如配了这个,信道161,就等于是161+157组成了40M频宽的新信道。
802.11g也如a是一样的意思,只不过。由于802.11g只有1、6、11这3个信道,所以使用40M频宽的信道时只剩下了一个不重叠信道,所以在使用802.11ng时,不建议使用40MHz的频宽,使用默认的20MHz频宽即可
2015.12.22 周二
特殊字符转ascii码,在特殊字符前加\,对其他常规字符没有影响。
iwpriv ath0 hide_ssid 1 隐藏ssid命令
无线RPM的初始化入口函数httpWirelessInit
2015.12.23
在文件prereq.mk中,将BOARD_TYPE的值进行修改,编译脚本BOARD_TYPE=ap152,在这里进行更换:
ifneq (,$(findstring $(BOARD_TYPE),ap151-020 ap151 ap152 cus249 tb753 tb754 tb755 dragonflyemu))
override BOARD_TYPE = board956x
export REAL_BOARD_TYPE := $(BOARD_TYPE)
endif
GI:(Guard Interval)
保护间隔(Short Guard Interval):是OFDM符号中用于减少符号间干扰的时间。
·在多径环境下,后一符号的前端有可能比前一符号的末端更快到达接收机,从而导致符号间产生干扰。保护间隔是前后符号间的一段空白时间,可以为延迟信号提供更长的缓冲时间。
·保护间隔长度根据多径状态选择,802.11a/g使用800ns的保护间隔,802.11n默认也采用800ns的保护间隔,但一定环境下可以采用400ns的保护间隔
static const struct ath_hal_private ar9300hal 定义了hal层的函数,
ath_desc 用于hal层发送数据 , 用于硬件发送时送交硬件。
2015.12.25 周五
ucLite 是一个独立的进程,用于处理UI或者app提交到DUT的请求,其中 ucm_msgTaskCreate函数用于创建接收来自httpd的请求,接收通过TCP套接字, _ucmMsgTask就是这个动作的全过程。
一个消息体的格式:
typedef struct _UCM_MSG_BODY
{
u32 owner;
u16 type;
u16 length;
u8 data[0];
} __attribute ((packed)) UCM_MSG_BODY;
所有模块的初始化函数都在表uclOpModInitArray中,这个表主要是一个index和一个函数指针,这个函数指针中包含了该模块的setup函数。setup函数只是将表中列好的模块按照实际的调用顺序进行排序,放在pOpapiData-> pOpModArray中。
2015.12.28
今天将LinuxPlat QCA平台的代码移植到plc_platform中,两者差异甚大。plc_platform 代码中
1)在board 目录下存在三个芯片方案的目录,但是这个目录的名称是公司名+芯片名称,感觉不合理;
2)每个机型都有自身的Makefile.***;
2015.12.29
今天和锋哥讨论关于board 目录是否应该带方案的问题,个人觉得不带为好,但是bcm和mkt的都带了,所以qca的暂时也带方案名称。
在Makefile.kernelmodules文件中定义了编译模块的函数。但是这些模块不完整,可以和LinuxPlat比较。
ipv4_module下cp *.ko出错的
Z:\plc_platform\tp-software\develop\private\apps\common\util\util.c中增加头文件
*** [_dir_/home/project/plc_platform/tp-software/develop/private/apps/uclite/modules/uclite-ledschedule] Error 2
先执行clean操作。
Z:\plc_platform\tp-software\develop\private\apps\uclite的Makefile中修改:
uclite.o: clean uclite_prep subdirs
/home/project/plc_platform/board/model_qca_apxxx/toolchain/gcc-4.3.3/build_mips/staging_dir/usr/bin/../lib/gcc/mips-linux-uclibc/4.3.3/../../../../mips-linux-uclibc/bin/ld: cannot find -lplcapi
kernel_modules_%:printf_echo $(addsuffix _%, $(kernel_modules_target))
make 提示kernel_modules_ 找不到目标,其实是后面的$(addsuffix _%, $(kernel_modules_target)) 找不到目标,在Makefile.kernelmodules中增加每个驱动的编译目标。
can not be used when making a shared object; recompile with -fPIC
./hpAVCommon.o: could not read symbols: Bad value
can not be used when making a shared object; recompile with -fPIC
Makefile 中的CFLAGS没有
/home/project/plc_platform/board/model_qca_apxxx/build/../../../util/fakeroot: line 166: 16247 Segmentation fault FAKEROOTKEY=$FAKEROOTKEY LD_LIBRARY_PATH="$PATHS" LD_PRELOAD="$LIB" "$@"
2015.12.30
fakeroot 可以用来模拟 root 权限,以便建立特定权限与档案拥有者的压缩文件案(tar, ar, .deb 等)。透过 LD_PRELOAD 的 dynamic loader 功能,用户不必实际拥有 root 权限。fakeroot最初是为了创建debian包使用的。
例如Debian在生成package的时候,编译完之后,不能立刻在当前环境执行make install,需要执行make install DESTDIR=$(pwd)/debian/tmp把生成的文件安装到build目录的里面$(pwd)/debian/tmp。然后使用那个目录里面的全部内容生成Debian包(实际上包里面还会包含control和maintainer script等)。这个包里面的文件所有者必须是root,所以需要以root来执行打包命令。但是应该避免在制作Debian包的时候使用root权限。为了解决这个矛盾,fakeroot被开发出来了。在fakeroot环境中,操作文件就像使用root操作文件一样。但是,实际上系统中文件的权限还是原来的权限。这个包里面的文件所有者必须是root,所以需要以root来执行打包命令。
fakeroot与sudo的区别编辑
fakeroot不能获得root的权限,sudo可以。
fakeroot只是伪装成root,它不能改变需要root权限才能改变的文件,它只是让程序执行时按照有root权限的情况来运行,而对文件的操作实际上是在普通用户下进行的。
1 fakeroot tar cvf /tmp/local.tar /usr/local
2 sudo tar cvf /tmp/local.tar /usr/local
上面两条命令都会在/tmp下建立local.tar,tar内的文件名都会以/开头,但前一条命令生成的文件属于当前用户,后一条命令生成的文件是root的。
2015.12.31 周四
测试反馈: 样机经过校准后,DUT不断电,测试发送功率,可以达到12.5dBm(目标是13dBm,正负1.5dBm正常),但是DUT重启后,在一个测试功率的拓扑(LAN->WLAN)下测试,发现功率只有-12dBm
将qca移植到plc的新平台后,烧写uboot,样机挂了。
2016.1.4 周一
放假回来第一日上班,今天主要合并QCA代码到PLC代码分支,原来锋哥给的代码是RE组的代码,和LinuxPlat的不一样,经过尝试和评估,觉得还是将LinuxPlat的代码合并到PLC分支比较好,可以保证SDK代码的和makefile结构的完整,uboot出现问题会导致板子变砖。主要的修改是上层的apps的代码路径的makefile组织代码。
2016.1.5 周二
今天跟进了4220反馈的在veriwave上测试的问题,该测试工具使用card进行硬件接口管理,上午测试了UDP的丢包使用的是waveApp,下午测试了throughput,使用的是waveQoE,在waveQoE中,服务器端只能配置成有线,这点和技术支持反馈回来的不一样。
2016.1.6 周三
今天跟进4230p无线发射功率低的问题,FAE对比了ini文件后发现现在使用的是 QCA9561 (Dragonfly ap151) 的无线驱动,而不是horny BEE 2.0的驱动。另外,晚上尝试将qca的驱动编译到4230上,但是发现编译的驱动不生效。还有配置文件中校准数据的位置错了,正确的是: AH_CAL_LOCATIONS_AHB=0xbf7f0000
2016.1.12 周二
今天解决4230的bug,PLC在组网后出现LAN灯灭掉的现象,原因是在 blinkAllLeds中对所有的灯进行亮灭操作,这个是8630的要求,而4230是不需要的。
2016.1.18 周一
shell脚本参数可以任意多,但只有前9各可以被访问,使用shift命令可以改变这个限制。参数从第一个开始,在第九个结束。
$0 程序名字
$n 第n个参数值,n=1..9
$* 所有命令行参数
$@ 所有命令行参数,如果它被包含在引号里,形如”$@”,则每个参数也各自被引号包括
$# 命令行参数个数
$$ 当前进程的进程ID(PID)
$! 最近后台进程的进程ID
$? 最近使用命令的退出状态
sed -i '/^Tolstoy/d' shell.txt 删除以Tolstoy开头的第一行;
sed -i 's/zhouqiqiu/ZQQ/g' shell.txt 用ZQQ替换所有zhouqiqiu
2016.1.20 周三
plc_platform 的busybox中有两个版本的busybox代码,一个是1.01,另外一个是1.19.4,需要在makefile中区分不同的项目使用的busybox版本。
需要将libmsglogd放在apps目录下
arm-uclibc-linux-2.6.36-strip -s --remove-section=.note --remove-section=.comment busybox
make[3]: arm-uclibc-linux-2.6.36-strip: Command not found
在文件./include/config.h 中定义了#define CROSS_COMPILER_PREFIX "arm-uclibc-linux-2.6.36-"
将LinuxPlat中的busybox 拷贝到plc_platform中,然后修改Makefile,注意busybox的目录层次。
2016.1.22 周五
/home/project/plc_platform/tp-software/develop/private/apps/uclite/modules/uclite-wifiSched/uclite-wifiSched.h:5:22: error: tp_linux.h: No such file or directory
2016.1.25 周一
RPT_FLASH_PARTITION_TABLE_IN_SRC 必须在配置文件中定义,而且Z:\plc_platform\tp-software\develop\private\apps\uclite\public\opt.h文件要删除,配置才能重新写入文件。
/home/project/plc_platform/board/model_qca_apxxx/toolchain/buildroot-2009.08/build_mips/staging_dir/usr/bin-ccache/../lib/gcc/mips-linux-uclibc/4.3.3/../../../../mips-linux-uclibc/bin/ld: cannot find -lz
INSTALL_ROOT 在rules.mk中重新赋值了,路径是错误的。
uclite.o: In function `opTddp_eraseRadio':
(.text+0x2051c): undefined reference to `eraseRadioFlash'
在basic.config中定义RPT_PLATFORM_QCA
./include/wrn/wm/common/wmData.h:241: error: two or more data types in declaration specifiers
修改一下这个文件,重新编译即可
make[1]: *** No rule to make target `/home/project/plc_platform/tp-software/develop/private/apps/wifid/src/qca/wifi_cmd_qca.o', needed by `wifi'. Stop.
plc_platform\tp-software\develop\private\apps\wifid\src\qca 这个目录是空的,
/home/project/plc_platform/board/model_qca_qca95xx/sdk/ap143/apps/wrapd/main.c:144: undefined reference to `wpa_ctrl_open'
make: *** No rule to make target `kernel_modules_build', needed by `everything_build'. Stop.
其实是Makefile.kernelmodules中缺了两个编译目标,添加就可以了:
$(call mkrule, br_guest_filter):
@$(call makemod, $(TP_KERNEL_MODULES)/br_guest_filter, br_guest_filter.ko);
$(call mkrule, parentCtrl):
@$(call makemod, $(TP_KERNEL_MODULES)/parentCtrl, parentCtrl.ko);
2015.1.28 周四
跟踪MTD驱动中分析分区信息的代码
2015.1.29 周五
编译后的8730软件需要整个flash进行烧录,
setenv serverip 192.168.1.104
tftp 80800000 wpa8730v1_eu-flash-ver1-0-0-P1[20160307-rel63124].bin
erase 9f000000 +800000
cp.b 80800000 9f000000 800000
烧写后发现DUT的网络不通,而看lsmod驱动已经加载,进一步跟进,发现是KERNEL_MODULES_TARGET_COMMON中的驱动被屏蔽了,使用的驱动不是编译而来的,打开参数后编译,可以Ping通。
2016.2.14 周日
农历新年后的第一天上班。
#define PRINT_ERR(fmt, args…) printf("[Err] %s(%d): "fmt, __FILE__, __LINE__, ##args)
所有LED的控制灯通过一个CONFIG_HAVE_LED_POWER_CTRL宏进行控制,该宏可以
2016.2.19
1. 加载ath_pktlog.ko,insmod /lib/modules/2.6.31/net/ath_pktlog.ko
2. pktlogconf -a wifi1 -s 0 (缓存清零) //pktlogconf -a wifi1 -s 10000000 (将缓存设置为10M)
3. pktlogconf -a wifi1 -e (开始记录)
4. pktlogconf -d wifi1 (停止记录)
5. cd /proc/ath_pktlog
6. tftp -p -l wifi1 -r pktlog 192.168.0.100 (把pktlog导出来)
7. 安装perl解析工具,安装包放在了\\file.tp-link.net\Public\z周建兴\ActivePerl-5.12.2.1202-MSWin32-x86-293621.rar
8. 如果是11n的数据,使用附件的pktlogdecoder.pl对pktlog进行解析,如果是11ac,请使用pktlogdecoder_11ac.pl:在cmd命令行,执行命令pktlogdecoder.pl -R pktlog(pktlogdecoder.pl和pktlog需要在同一文件夹下,cmd路径也要在此目录下,-R是看rate统计,pktlog是导出来的文件名)
9. 如果想查看其他统计信息,请使用pktlogdecoder.pl -h查看帮助。
2016.2.22 周一
工作安排:
1.跟进4230P测试进程,安排提测;
2.新平台无线部分;
3.无线驱动学习;
2016.2.23 周二
上无准备样机提测,发现测试无线WLAN->LAN的时候 throughput只有80MBps,而且波动幅度非常大,怀疑是屏蔽箱中其他信号干扰的问题,需要到屏蔽房中测试。
样机需要重新烧PLC的bin和无线校准。
下午看无线驱动手册,硬件工程师将样机拿去烧PLC的bin和无线校准了。
2016.2.24 周三
上午提测,出现了一个低级错误,测试申请单中的硬件配置表,硬件工程师反馈了一份,我也更新都本地了,但是没有检查OA上的是否更新,结果OA上用的还是旧的,太不小心了。多检查一下就发现的问题,导致重新提交。
文档反馈一个版本问题,顺带检查软件的版本,发现是1.0.0,经过讨论后,应该是1.2.0,而bugzilla上反馈的目录也是1.2.0,这个其实我之前发现,但是没有追究是什么原因。修改后软件重编,但是build server卡死了,重启后提示工程locked,下载后要重新编译toolchain。晕死~~~
2016.2.26 周五
今天调试4220的GPIO问题,power control 被拉低了,导致所有灯不亮,在Uboot中修改了代码
#ifdef CONFIG_HAVE_LED_POWER_CTRL
ath_gpio_config_output (GPIO_LED_POWER);
//LOW LEVEL TURN ON ALL
ath_gpio_out_val(GPIO_LED_POWER, 1);//ZQQ
#endif
可以量,但是一旦修改了manage_led后,又不亮了。
2016.2.29 周一
今天调试gpio,看了datasheet中关于GPIO的操作,修改,调试,发现问题依旧,后来在系统日志中发现有个打印将LED灯打开,跟进后发现有个定时器会定期调用函数setLedAccordingToCfg将LED由关闭到打开, 使用的方法是文件操作fopen打开文件和 fputc写入字符 ,奇怪的这个写入和echo的写入不一样,后者可以打印出write函数中打印信息,前者不可以。
2016.3.1 周二
上午调试4220的灯的控制问题,该机型的灯的控制0/1和其他机型不一样,0表示亮,1表示灭;
下午协助调试TATA反馈IPv6拨号后PC不能访问IPv6网站的问题,通过tracet 看包的发送路径,不能到达ISP的路由器,可能是IP地址错误或者路由的问题,对比其他机型,发现WAN口的IP地址前缀是128bit,设置了WAN IP地址是128bit后,ok!
2016.3.2 周三
2016.3.3 周四
上午跟进测试部反馈LAN->WLAN性能偏低的问题,PC连接无线,3个以太网口分别连接PC,在使用10个pairs测试时,速率只能达到120Mbps,但是增加paris数目或者使用high_performance_throughput.src可以提高性能。
2016.3.4 周五
发布软件
2016.3.7 周一
./include/wrn/wm/common/wmData.h:29: error: two or more data types in declaration specifiers
./include/wrn/wm/common/wmData.h:29: warning: useless type name in empty declaration
./include/wrn/wm/common/wmData.h:30: error: two or more data types in declaration specifiers
./include/wrn/wm/common/wmData.h:30: warning: useless type name in empty declaration
重复的定义,将tpyedef 修改成#defined 可以解决
2016.3.8 周二
上无web server自动化测试的介绍,下午看新平台的web server代码。web 模块的初始化入口函数: web_Web_Start
httpRpmInit注册各种RPM函数
WRP_TRANS_START uclite发送读或者写的消息;
WRP_TRANS_COMMIT 发送命令并检查返回的结果;
apps/wifid下没有qca对应的实现部分。
2016.3.9 周三
编译新平台的web server遇到编译出错
/home/project/plc_platform/tp-software/develop/private/apps/web_server/rpm/wps/httpWps.c:41: undefined reference to `utl_bandMode_bandMode2band'
rpm/wps/httpWps.o: In function `_writeWifiCloneJson':
/home/project/plc_platform/tp-software/develop/private/apps/web_server/rpm/wps/httpWps.c:67: undefined reference to `utl_bandMode_band2bandMode'
原因是在Z:\plc_platform\board\model_qca_qca95xx\images\wpa8730v1\rootfs.build\lib中存在libutil.so和libutil.a两个文件,而实际要使用的是libutil.a,这里编译命令-lutil应该优先匹配了libutil.so
将libutil.so换个名字。
2016.3.10 周四
make[1]: *** No rule to make target `/home/project/plc_platform/tp-software/develop/private/apps/gpio/src/gpio_qca/gpio_qca_wpa8730v1.o', needed by `gpiod'. Stop.
850re 2.0使用的是horneybee 2.0的方案,和8730一样,暂时先使用这个接口文件,但是发现有很多宏没有定义。
GPIO_LED_PORT_WIFI_SIGNAL1 这些宏在机型的config中定义,暂时去掉函数中的实现。
wpsd.c:(.text+0x26c): undefined reference to `g_wpsd_ops' , 在wpsd中暂时没有qca的实现,先屏蔽这个app
8730的kernel配置中很多kernel的模块都配置成y,导致拷贝ko出错,在拷贝的shell脚本中增加对被拷贝文件的判断:
export makemod = if [ -z "$(@:%_install=)" ]; then \
cd $(1) && (if test -f $(2); then cp -f $(2) $(if $(3), $(3), $(LINUX_MODULES_INSTALL));fi); \
elif [ -z "$(@:%_clean=)" ]; then $(MAKEMODULES) clean SUBDIRS=$(strip $(1)); \
else $(MAKEMODULES) SUBDIRS=$(strip $(1)) modules; fi
2016.3.11 周五
无线的app使用了原来ap143的,不是board956x的。因为使用board956x出现问题:/src/drivers/driver_atheros.c:46:32: error: ieee80211_external.h: No such file or directory
需要配置config.athr_supplicant和config.athr_hostapd两个文件,同时如果支持wpa2的话,是要编译Z:\plc_platform\board\model_qca_qca95xx\sdk\board956x\wlan\apps\wpa2下的hostapd和wpa_supplicant,而这两个的编译配置,通过文件Z:\plc_platform\board\model_qca_qca95xx\sdk\board956x\wlan\apps\wpa2\common\Makefile.common进行。
export PERF_PWR_OFFLOAD_DIR_PATH=$(TOPDIR)/target/$(BOARD_TYPE)/wlan/drivers/firmware 这个宏是干什么的?
2016.3.14 周一
adf: version magic '2.6.31 mod_unload MIPS32_R2 32BIT ' should be '2.6.31--LSDK-9.2.0_U5.508 mod_unload MIPS32_R2 32BIT '
wifid[wifi_exec_cmd:1182]: insmod /lib/modules/2.6.31/net/asf.ko
asf: version magic '2.6.31 mod_unload MIPS32_R2 32BIT ' should be '2.6.31--LSDK-9.2.0_U5.508 mod_unload MIPS32_R2 32BIT '
wifid[wifi_exec_cmd:1182]: insmod /lib/modules/2.6.31/net/ath_hal.ko
TL-WPA8730 mips #1 Fri Jan 29 16:18:24 HKT 2016 (none)
TL-WPA8730 login: ath_hal: version magic '2.6.31 mod_unload MIPS32_R2 32BIT ' should be '2.6.31--LSDK-9.2.0_U5.508 mod_unload MIPS32_R2 32BIT '
wifid[wifi_exec_cmd:1182]: insmod /lib/modules/2.6.31/net/ath_rate_atheros.ko
ath_rate_atheros: version magic '2.6.31 mod_unload MIPS32_R2 32BIT ' should be '2.6.31--LSDK-9.2.0_U5.508 mod_unload MIPS32_R2 32BIT '
wifid[wifi_exec_cmd:1182]: insmod /lib/modules/2.6.31/net/ath_dfs.ko
ath_dfs: version magic '2.6.31 mod_unload MIPS32_R2 32BIT ' should be '2.6.31--LSDK-9.2.0_U5.508 mod_unload MIPS32_R2 32BIT '
wifid[wifi_exec_cmd:1182]: insmod /lib/modules/2.6.31/net/ath_dev.ko
ath_dev: version magic '2.6.31 mod_unload MIPS32_R2 32BIT ' should be '2.6.31--LSDK-9.2.0_U5.508 mod_unload MIPS32_R2 32BIT '
wifid[wifi_exec_cmd:1182]: insmod /lib/modules/2.6.31/net/umac.ko
umac: version magic '2.6.31 mod_unload MIPS32_R2 32BIT ' should be '2.6.31--LSDK-9.2.0_U5.508 mod_unload MIPS32_R2 32BIT '
Z:\LinuxPlat\target\board956x\linux\kernels\mips-linux-2.6.31\include\config\kernel.release文件中包含kernel的实际版本。这个版本必须驱动和kernel一致,否则出现上边的问题。
2016.3.15
make ARCH=mips CROSS_COMPILE=mips-linux-uclibc- EXTRAVERSION=--LSDK-10.2-00082-4 wpa8730v1_defconfig
2016.3.16
尝试更换新旧平台的squashfs文件系统,发现需要找lib下的zlib驱动,又尝试整个kernel更换,发现编译以太网驱动失败,头文件找不到。
跟踪出错打印的函数调用栈,发现在unlzma出错,研究make_flash源码:
[ 0.776000] Call Trace:
[ 0.776000] [<800f02c8>] unlzma+0xfb4/0x118c
2016.3.17
终于知道问题所在,新平台的文件打包工具使用的压缩方式是gzip,而不是lzma,在文件buildFS_LZ中:
$RPT_TOPDIR/util/mksquashfs4.0 $INSTALL_ROOT_FOR_BOARD $IMAGEPATH/$BOARD_TYPE-squashfs -noappend -always-use-fragments -all-root -b 1048576
关键是Z:\plc_platform\util目录下的 mksquashfs4是不支持lzma的,更换为旧平台的 mksquashfs4.0就可以了。
2016.3.18 周五
read tp partition address:0x00610100 partition_used_len:0xffffffff len:0x0
[NM_Error](nm_api_readPtnFromNvram) 00133: partition name not found([ 3.140000] Now flash open!
name:device-id).[ 3.140000] Erase from 0X630000 to 0X630460:
failed to read device id from flash
分区表中增加device-id分区。
read tp partition address:0x00610200 partition_used_len:0xffffffff len:0x0
[usrcfg_error: usrconf_load:916]md5 verify error[ 3.088000] Now flash open!
2016.3.21 周一
MD5错误,dut不断重启
原因是写默认设置是,没有将配置文件的长度作为头进行写入,这部分在drivers\mtd\devices\ath_flash_ioctl.c中机型操作,处理方式是将RE850的这部分代码移植过来。但是出现另外一个问题:
# cat /proc/meminfo
MemTotal: 15384 kB
MemFree: 3420 kB
Buffers: 12 kB
Cached: 1544 kB
SwapCached: 0 kB
内存大小不对。
2016.3.22 周二
昨天反馈产测软件缺少了CTL表和目标功率表。CTL是限制功率,是指符合各认证标准下的发射功率,目标功率是 产品无线发射性能够好情况下的功率,超过这个功率值,无线发射信号质量下降,影响产品性能。这个值一般参考 Atheros DEMO 的数据,性能余量很大的机型,增加发射功率,性能仍然能够满足要求。
现在的处理方法是重新提测产测软件。
新平台的wifid编译失败,但是还是需要先解决内存大小问题,
prom_init kernel中解析uboot传过来参数的解析参数
do_bootm_linux :uboot调用thekernel跳入到kernel的的函数
2016.3.25 周五
测试反馈产测标准中发现LAN2WLAN双向速率不对,对于产测标准要求的130Mbps,后来在我的位置上测试,发现ixchariot在统计速率的时候会出现一个方向的速率数据没有统计到,需要关闭再打开才可以,后来测试的数据是150+Mbps,符合要求。
新平台内存问题,是应为少了mem参数,uboot向kernel传参比较有意思,初步看是通过环境变量进行传参。在函数do_bootm_linux中调用函数theKernel (linux_argc, linux_argv, linux_env, 0);传入环境变量的参数。
2016.3.28 周一
要注意文件系统挂载的是哪个设备,一些机型的MTD分区,将uboot的64K分为两个32K,所以文件系统对应的设备号是32:3,
而如果只是128的uboot,文件系统挂载的mtd设备是31:2
就是宏:
#define MTDPARTS_DEFAULT "mtdparts=ath-nor0:128k(u-boot),1024k(uImage),6912k(rootfs),64k(mib0),64k(ART)"
define ATH_ROOT_DEV "31:02"
定义的值。
bootstrap_board_init_f 在文件start_bootstarp.S中被调用。
uboot文件生成过程
1.u-boot:由各目录的.a文件链接而成,最后通过命令
mips-linux-uclibc-objcopy --gap-fill=0xff -O binary u-boot u-boot.bin 设置各个section之间的值为0xff后输出为u-boot.bin,注意-Ttext 0x80010000,这个地址是内存的虚拟地址,所以这部分代码是在内存中运行的;
2.bootstrap.bin : 编译汇编文件start_bootstrap.S,编译libbootstrap.a(当中包括了lzma的解压缩文件),然后链接这些库,注意-Ttext 地址是0x9f000000,所以说这些代码是在flash中运行的。这部分相当于引导uboot.bin的前导文件;
3.tuboot.bin 这个文件通过bootstrap.bin和经过lzma压缩后的u-boot.bin并凑而成,其中
u-boot.lzimg: $(obj)u-boot.bin System.map
@echo ===$(obj)u-boot.bin===
@$(LZMA) e $(obj)u-boot.bin u-boot.bin.lzma
@./tools/mkimage -A mips -T firmware -C lzma \
-a 0x$(shell grep "T _start" $(TOPDIR)/System.map | awk '{ printf "%s", $$1 }') \
-e 0x$(shell grep "T _start" $(TOPDIR)/System.map | awk '{ printf "%s", $$1 }') \
-n 'u-boot image' -d $(obj)u-boot.bin.lzma $@
Usage: ./mkimage -l image
-l ==> list image header information
./mkimage [-x] -A arch -O os -T type -C comp -a addr -e ep -n name -d data_file[:data_file…] image
-A ==> set architecture to 'arch'
-O ==> set operating system to 'os'
-T ==> set image type to 'type'
-C ==> set compression type 'comp'
-a ==> set load address to 'addr' (hex)
-e ==> set entry point to 'ep' (hex)
-n ==> set image name to 'name'
-d ==> use image data from 'datafile'
-x ==> set XIP (execute in place)
System.map文件:
00000101 A num_got_entries
80010000 T _start
80010030 T relocate_code
80010094 t in_ram
80010100 T ath_set_tuning_caps
800101a0 T do_go
800102c0 T print_image_hdr
800106c8 T do_bootd
80010718 T fake_image_header
800107f0 T do_bootm
800109c0 T flash_sect_erase
80010bc8 T do_flerase
80011000 T test_algorithm_t
800113ac T do_mem_mct
80011820 T do_mem_mtest
80011a04 T cmd_get_data_size
uboot中image_header定义
typedef struct image_header {
uint32_t ih_magic; /* Image Header Magic Number */
uint32_t ih_hcrc; /* Image Header CRC Checksum */
uint32_t ih_time; /* Image Creation Timestamp */
uint32_t ih_size; /* Image Data Size */
uint32_t ih_load; /* Data Load Address */
uint32_t ih_ep; /* Entry Point Address */
uint32_t ih_dcrc; /* Image Data CRC Checksum */
uint8_t ih_os; /* Operating System */
uint8_t ih_arch; /* CPU architecture */
uint8_t ih_type; /* Image Type */
uint8_t ih_comp; /* Compression Type */
uint8_t ih_name[IH_NMLEN]; /* Image Name */
} image_header_t;
image_header_t大小是64字节。
打开u-boot.lzimg文件,可以看到文件开头就是这个头的内容:
两个阶段:第一个是在引导阶段,主要在start_bootstrap.S中,两个关键函数:
bootstrap_board_init_f:初始化c执行环境
bootstrap_board_init_r函数中会读取这个头,并判断当中的参数并解压uboot
i = lzma_inflate ((unsigned char *)data, len, (unsigned char*)ntohl(hdr->ih_load), &destLen); 就是说要解压到内存地址ih_load指向的地方,就是0x80010000这个地址。
fn = ntohl(hdr->ih_load);
(*fn)(gd->ram_size);
跳到0x80010000内存开始执行,
80010000 T _start
80010030 T relocate_code
80010094 t in_ram
80010100 T ath_set_tuning_caps
800101a0 T do_go
800102c0 T print_image_hdr
800106c8 T do_bootd
80010718 T fake_image_header
800107f0 T do_bootm
800109c0 T flash_sect_erase
80010bc8 T do_flerase
这个表只是函数地址的编码表,并不是执行的顺序表,注意。
第二阶段 在汇编文件start.S中,第一个调用是board_init_f,board_init_f函数主要是根据配置对全局信息结构体gd进行初始化
relocate_code:在start.S中定义;
in_ram: 在start.S中定义;
然后跳到board_init_r中开始c代码环境的第一函数执行;这个函数初始化和好多东西,可以仔细看看
main_loop中调用了parse_string_outer 通过执行命令bootm 0x9f010000 进入到函数do_bootm;
2016.3.30 周三
整理uboot启动流程分析文档,新平台使用Linuxplat wlan apps,但是发现编译失败,缺少文件:
/src/drivers/driver_atheros.c:46:32: error: ieee80211_external.h: No such file or directory
在apps\athr-hostap\hostapd\.config中有CFLAG的定义,其中有ATHEROSPATH这个变量
在配置文件config.wpa8730v1 中增加:export ATHEROSPATH=$(BOARD_TOPDIR)/sdk/$(BOARD_NAME)/wlan/drivers/wlan_modules_$(BOARD_TYPE)即可
Z:\LinuxPlat\target\board956x\wlan\drivers\wlan_modules_ap135\os\linux\configs\.config.wlan.all 无线的配置文件
#define DECLARE_GLOBAL_DATA_PTR register volatile gd_t *gd asm ("k0")
2016.4.1 星期五
#define WIFI_REGION_CHANNEL_INFO "/tmp/region.channel.info"
#define WIFI_CLIENTS_INFO "/tmp/clients.info"
#define WIFI_STATUS_INFO "/tmp/wifi.status.info"
#define WIFI_INTERFACE_INFO "/tmp/wifi.interface.info"
对wifid中qca目录,要实现对参数的读操作,参考mtk方案的数据格式和api,实现qca的api。
2016.4.5 星期二
wifi_register_ops 定义了无线驱动的初始化接口
2016.4.6 星期二
添加wifi_platform_qca.c中的函数接口。
2016.4.7 星期三
新平台需要在8630p上做,所以要移植ap152的无线驱动,真是日了狗了。
在编译board_type ap152时,出现: error: ol_txrx_osif_api.h: No such file or directory
./drivers/firmware/host/include/ol_txrx_osif_api.h
需要打开PERF_PWR_OFFLOAD_DIR_PATH的定义编译ok;
新平台的busybox使用1.19.4,旧平台使用1.01
以太网驱动的配置文件:Z:\plc_platform\board\model_qca_qca95xx\sdk\board956x\linux\drivers\ethernet\include\config.h
uboot的配置文件:Z:\plc_platform\board\model_qca_qca95xx\sdk\board956x\boot\u-boot\include
2016.4.8 星期五
在8630p上重新移植ap152无线驱动,uboot和kernel已经ok,无线可以看到wifi0设备,但是没有设置ath0,在/etc/rc.d/rcS中调用了脚本进行初始化,这个要看看无线是如何进行初始化操作的。
2016.4.10周日
wlanBootupAll 函数中对无线进行初始化,调用wlanWorkingNormalAp函数,
1.设置国家码(qca_wd_setup_cc);
iwpriv wifi0 setCoutryID %d
国家码由一个数组定义,region是这个数组的下标,
typedef struct CountryCodeToCountryRegion {
UINT32 CountryNum;
UINT8 IsoName[3];
char* pCountryName;
BOOL SupportABand;
UINT8 RegDomainNum11A;
BOOL SupportGBand;
UINT8 RegDomainNum11G;
} COUNTRY_CODE_TO_COUNTRY_REGION;
COUNTRY_CODE_TO_COUNTRY_REGION allCountry[] = {
{8, "AL", "ALBANIA" , TRUE, A_BAND_REGION_7, TRUE, G_BAND_REGION_1},
{12, "DZ", "ALGERIA" , TRUE, A_BAND_REGION_7, TRUE, G_BAND_REGION_1},
{32, "AR", "ARGENTINA" , TRUE, A_BAND_REGION_7, TRUE, G_BAND_REGION_1},
{51, "AM", "ARMENIA" , TRUE, A_BAND_REGION_2, TRUE, G_BAND_REGION_1},
{533, "AW", "ARUBA" , TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
{36, "AU", "AUSTRALIA" , TRUE, A_BAND_REGION_7, TRUE, G_BAND_REGION_1},
{40, "AT", "AUSTRIA" , TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
{31, "AZ", "AZERBAIJAN" , TRUE, A_BAND_REGION_2, TRUE, G_BAND_REGION_1},
{44, "BS", "BAHAMAS" , TRUE, A_BAND_REGION_7, TRUE, G_BAND_REGION_1},
{48, "BH", "BAHRAIN" , TRUE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1},
{50, "BD", "BANGLADESH" , TRUE, A_BAND_REGION_7, TRUE, G_BAND_REGION_1},
{52, "BB", "BARBADOS" , TRUE, A_BAND_REGION_7, TRUE, G_BAND_REGION_1},
{112, "BY", "BELARUS" , TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
{56, "BE", "BELGIUM" , TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
{84, "BZ", "BELIZE" , TRUE, A_BAND_REGION_4, TRUE, G_BAND_REGION_1},
{60, "BM", "BERUMUDA" , TRUE, A_BAND_REGION_7, TRUE, G_BAND_REGION_0},
{68, "BO", "BOLIVIA" , TRUE, A_BAND_REGION_4, TRUE, G_BAND_REGION_1},
{70, "BA", "BOSNIA AND HERZEGOVINA" , TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
{76, "BR", "BRAZIL" , TRUE, A_BAND_REGION_7, TRUE, G_BAND_REGION_1},
{96, "BN", "BRUNEI DARUSSALAM" , TRUE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1},
{100, "BG", "BULGARIA" , TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
{116, "KH", "CAMBODIA" , TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
{124, "CA", "CANADA" , TRUE, A_BAND_REGION_7, TRUE, G_BAND_REGION_0},
{152, "CL", "CHILE" , TRUE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1},
{156, "CN", "CHINA" , TRUE, A_BAND_REGION_4, TRUE, G_BAND_REGION_1},
{170, "CO", "COLOMBIA" , TRUE, A_BAND_REGION_7, TRUE, G_BAND_REGION_0},
{188, "CR", "COSTA RICA" , TRUE, A_BAND_REGION_7, TRUE, G_BAND_REGION_1},
{191, "HR", "CROATIA" , TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
{196, "CY", "CYPRUS" , TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
{203, "CZ", "CZECH REPUBLIC" , TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
{208, "DK", "DENMARK" , TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
{214, "DO", "DOMINICAN REPUBLIC" , TRUE, A_BAND_REGION_7, TRUE, G_BAND_REGION_0},
{218, "EC", "ECUADOR" , TRUE, A_BAND_REGION_7, TRUE, G_BAND_REGION_1},
{818, "EG", "EGYPT" , TRUE, A_BAND_REGION_2, TRUE, G_BAND_REGION_1},
{222, "SV", "EL SALVADOR" , TRUE, A_BAND_REGION_7, TRUE, G_BAND_REGION_1},
{233, "EE", "ESTONIA" , TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
{246, "FI", "FINLAND" , TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
{250, "FR", "FRANCE" , TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
{268, "GE", "GEORGIA" , TRUE, A_BAND_REGION_2, TRUE, G_BAND_REGION_1},
{276, "DE", "GERMANY" , TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
{300, "GR", "GREECE" , TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
{304, "GL", "GREENLAND" , TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
{308, "GD", "GRENADA" , TRUE, A_BAND_REGION_7, TRUE, G_BAND_REGION_0},
{316, "GU", "GUAM" , TRUE, A_BAND_REGION_7, TRUE, G_BAND_REGION_0},
{320, "GT", "GUATEMALA" , TRUE, A_BAND_REGION_7, TRUE, G_BAND_REGION_0},
{332, "HT", "HAITI" , TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
{340, "HN", "HONDURAS" , TRUE, A_BAND_REGION_7, TRUE, G_BAND_REGION_1},
{344, "HK", "HONG KONG" , TRUE, A_BAND_REGION_7, TRUE, G_BAND_REGION_1},
{348, "HU", "HUNGARY" , TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
{352, "IS", "ICELAND" , TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
{356, "IN", "INDIA" , TRUE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1},
{360, "ID", "INDONESIA" , TRUE, A_BAND_REGION_5, TRUE, G_BAND_REGION_1},
{364, "IR", "IRAN" , TRUE, A_BAND_REGION_4, TRUE, G_BAND_REGION_1},
{372, "IE", "IRELAND" , TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
{376, "IL", "ISRAEL" , TRUE, A_BAND_REGION_2, TRUE, G_BAND_REGION_1},
{380, "IT", "ITALY" , TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
{388, "JM", "JAMAICA" , TRUE, A_BAND_REGION_7, TRUE, G_BAND_REGION_1},
{392, "JP", "JAPAN" , TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_5},
{400, "JO", "JORDAN" , TRUE, A_BAND_REGION_6, TRUE, G_BAND_REGION_1},
{398, "KZ", "KAZAKHSTAN" , TRUE, A_BAND_REGION_4, TRUE, G_BAND_REGION_1},
{404, "KE", "KENYA" , TRUE, A_BAND_REGION_4, TRUE, G_BAND_REGION_1},
{408, "KP", "NORTH KOREA" , TRUE, A_BAND_REGION_20, TRUE, G_BAND_REGION_1},
{412, "KR", "KOREA REPUBLIC" , TRUE, A_BAND_REGION_20, TRUE, G_BAND_REGION_1},
{414, "KW", "KUWAIT" , TRUE, A_BAND_REGION_2, TRUE, G_BAND_REGION_1},
{428, "LV", "LATVIA" , TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
{422, "LB", "LEBANON" , TRUE, A_BAND_REGION_4, TRUE, G_BAND_REGION_1},
{438, "LI", "LIECHTENSTEIN" , TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
{440, "LT", "LITHUANIA" , TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
{442, "LU", "LUXEMBOURG" , TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
{446, "MO", "MACAU SAR" , TRUE, A_BAND_REGION_7, TRUE, G_BAND_REGION_1},
{807, "MK", "MACEDONIA, FYRO" , TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
{458, "MY", "MALAYSIA" , TRUE, A_BAND_REGION_7, TRUE, G_BAND_REGION_1},
{470, "MT", "MALTA" , TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
{480, "MU", "MAURITIUS" , TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
{484, "MX", "MEXICO" , TRUE, A_BAND_REGION_7, TRUE, G_BAND_REGION_1},
{492, "MC", "MONACO" , TRUE, A_BAND_REGION_2, TRUE, G_BAND_REGION_1},
{504, "MA", "MOROCCO" , TRUE, A_BAND_REGION_10, TRUE, G_BAND_REGION_1},
{524, "NP", "NEPAL" , TRUE, A_BAND_REGION_4, TRUE, G_BAND_REGION_1},
{528, "NL", "NETHERLANDS" , TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
{554, "NZ", "NEW ZEALAND" , TRUE, A_BAND_REGION_7, TRUE, G_BAND_REGION_1},
{558, "NI", "NICARAGUA" , TRUE, A_BAND_REGION_7, TRUE, G_BAND_REGION_0},
{578, "NO", "NORWAY" , TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
{512, "OM", "OMAN" , TRUE, A_BAND_REGION_7, TRUE, G_BAND_REGION_1},
{586, "PK", "PAKISTAN" , TRUE, A_BAND_REGION_4, TRUE, G_BAND_REGION_1},
{591, "PA", "PANAMA" , TRUE, A_BAND_REGION_7, TRUE, G_BAND_REGION_0},
{598, "PG", "PAPUA NEW GUINEA" , TRUE, A_BAND_REGION_7, TRUE, G_BAND_REGION_1},
{600, "PY", "PARAGUAY" , TRUE, A_BAND_REGION_7, TRUE, G_BAND_REGION_1},
{604, "PE", "PERU" , TRUE, A_BAND_REGION_7, TRUE, G_BAND_REGION_1},
{608, "PH", "PHILIPPINES" , TRUE, A_BAND_REGION_7, TRUE, G_BAND_REGION_1},
{616, "PL", "POLAND" , TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
{620, "PT", "PORTUGAL" , TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
{630, "PR", "PUERTO RICO" , TRUE, A_BAND_REGION_7, TRUE, G_BAND_REGION_0},
{634, "QA", "QATAR" , TRUE, A_BAND_REGION_4, TRUE, G_BAND_REGION_1},
{642, "RO", "ROMANIA" , TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
{643, "RU", "RUSSIA" , TRUE, A_BAND_REGION_22, TRUE, G_BAND_REGION_1},
{646, "RW", "RWANDA" , TRUE, A_BAND_REGION_4, TRUE, G_BAND_REGION_1},
{682, "SA", "SAUDI ARABIA" , TRUE, A_BAND_REGION_7, TRUE, G_BAND_REGION_1},
{688, "RS", "REPUBLIC OF SERBIA" , TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
{499, "ME", "MONTENEGRO" , TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
{702, "SG", "SINGAPORE" , TRUE, A_BAND_REGION_7, TRUE, G_BAND_REGION_1},
{703, "SK", "SLOVAKIA" , TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
{705, "SI", "SLOVENIA" , TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
{710, "ZA", "SOUTH AFRICA" , TRUE, A_BAND_REGION_7, TRUE, G_BAND_REGION_1},
{724, "ES", "SPAIN" , TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
{144, "LK", "SRI LANKA" , TRUE, A_BAND_REGION_7, TRUE, G_BAND_REGION_1},
{752, "SE", "SWEDEN" , TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
{756, "CH", "SWITZERLAND" , TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
{760, "SY", "SYRIAN ARAB REPUBLIC" , TRUE, A_BAND_REGION_23, TRUE, G_BAND_REGION_1},
{158, "TW", "TAIWAN" , TRUE, A_BAND_REGION_23, TRUE, G_BAND_REGION_0},
{834, "TZ", "TANZANIA" , TRUE, A_BAND_REGION_4, TRUE, G_BAND_REGION_1},
{764, "TH", "THAILAND" , TRUE, A_BAND_REGION_7, TRUE, G_BAND_REGION_1},
{780, "TT", "TRINIDAD AND TOBAGO" , TRUE, A_BAND_REGION_7, TRUE, G_BAND_REGION_1},
{788, "TN", "TUNISIA" , TRUE, A_BAND_REGION_2, TRUE, G_BAND_REGION_1},
{792, "TR", "TURKEY" , TRUE, A_BAND_REGION_2, TRUE, G_BAND_REGION_1},
{800, "UG", "UGANDA" , TRUE, A_BAND_REGION_21, TRUE, G_BAND_REGION_1},
{804, "UA", "UKRAINE" , TRUE, A_BAND_REGION_24, TRUE, G_BAND_REGION_1},
{784, "AE", "UNITED ARAB EMIRATES" , TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
{826, "GB", "UNITED KINGDOM" , TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
{841, "US", "UNITED STATES" , TRUE, A_BAND_REGION_9, TRUE, G_BAND_REGION_0},
{858, "UY", "URUGUAY" , TRUE, A_BAND_REGION_7, TRUE, G_BAND_REGION_1},
{860, "UZ", "UZBEKISTAN" , TRUE, A_BAND_REGION_7, TRUE, G_BAND_REGION_0},
{862, "VE", "VENEZUELA" , TRUE, A_BAND_REGION_7, TRUE, G_BAND_REGION_1},
{704, "VN", "VIET NAM" , TRUE, A_BAND_REGION_2, TRUE, G_BAND_REGION_1},
{887, "YE", "YEMEN" , TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
{716, "ZW", "ZIMBABWE" , TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
{999, "", "", 0, 0, 0, 0}
};
设置tx queue的长度: ifconfig wifi0 txqueuelen 1000;
2.创建vap(wlanApVapSetup);
1)构造vap 名称wlanApVapName;wlanconfig ath0 create wlandev wifi0 wlanmode ap
2)设置vap模式wlanSetWirelessMode;iwpriv ath0 mode %s, 这里的模式是字符串,通过计算下标,从下面的数组中取值
static char *QCAwlanMode[] = {
"AUTO",
"11B",
"11G",
"11NGHT20",
"11NGHT40",
"11NGHT40PLUS",
"11NGHT40MINUS",
"11A",
"11NAHT20",
"11NAHT40",
"11NAHT40PLUS",
"11NAHT40MINUS",
"11ACVHT20",
"11ACVHT40",
"11ACVHT40PLUS",
"11ACVHT40MINUS",
"11ACVHT80",
};
3)配置ap参数wlanApConfig a.配置channel ,自动选择信道: iwpriv ath0 blockdfschan 1; 设置信道: iwconfig ath0 freq 1;
b.设置SSID, iwconfig ath0 essid zhouqiqiu1982
c.设置高级参数, 设置是否隐藏ID: iwpriv ath0 hide\_ssid 0; 设置传输功率: iwpriv ath0 tpscale 1;设置
shortgi, iwpriv ath0 shortgi 1;设置wmm: iwpriv ath0 wmm 1;设置加密方式: iwpriv ath0 htweptkip 0;启用多播snoop iwpriv ath0 mcastenhance 2
4) 将vap添加到bridge: brctl addif br0 ath0
5)无线MAC地址过滤初始化wlanMacFiltInit;a. 删除旧的acl, iwpriv ath maccmd 3; b.设置模式 iwpriv ath0 maccmd 0, 0 disable,1,allow, 2, deny;c:插入mac条目:iwpriv ath0 addmac %s;
6)安全设置wlanApSecuritySetup;
有4中安全模式:
a)WEP ,密钥方式2种, open sys: iwpriv ath0 authmode 1; share key:iwpriv ath0 authmode 2; default :iwpriv ath0 authmode 4
b)WPA/WPA2,通过hostapd进程实现,参数配置主要通过配置文件的方式生效而不是使用iwpriv设置,hostapd -B -dd /tmp/wpa-wpa2.conf_ath0;
c)PSK, 和WPA/WEP2一样,也是通过hostapd实现,参数配置主要通过配置文件的方式生效而不是使用iwpriv设置, hostapd -B -dd /tmp/psk-psk2.conf_ath0
d)无加密: 空,不需做任何处理;
7)生效vap netdevActivate;ifconfig ath0 up
8)生效wps wlanWpsUp; 设置pin :iwpriv ath0 WscVendorPinCode=%s
wps设置比较复杂,后面在看
3.设置guestnetwork(wlanGuestApSetup);
4.设置WPS的vap (wlanWdsVapSetup);
2016.4.12 周二
无线mode错误导致连接失败,要注意get_channel_mode中的模式值计算。
iwpriv ath0 mode 11NGHT20
2016.4.13 周三
分析RPM处理web发出请求的流程:
httpRpmWlan处理read和write请求,read调用_httpRpmWlanGet,write调用_httpRpmWlanSet,
wrpOpGrpDo函数发送请求给ucm,
ucm_msgTaskCreate 这个是uclite中监听51237的函数。
uclite-wifi.c中实现对无线参数的处理,包括reset,读,写。
wrpSockSendRequest 发送请求
串口打印信息:
/tmp # ====>>>>[opWifi_AP_saveCfg:1150]0 != 680 Inconsist inMsgLen!
[WRP][_wrpOpDo:81]Inconsist outMsgLen! opid = b0001 0 != 140
====>>>>[opWifi_AP_saveCfg:1150]0 != 680 Inconsist inMsgLen!
[WRP][_wrpOpDo:81]Inconsist outMsgLen! opid = b0001 0 != 140
====>>>>[opWifi_AP_saveCfg:1150]0 != 680 Inconsist inMsgLen!
[WRP][_wrpOpDo:81]Inconsist outMsgLen! opid = b0001 0 != 140
[17770.792000] FWLOG: [18201195] WHAL_ERROR_RESET_CHANNF1 ( )
[17770.800000] FWLOG: [18201195] WHAL_ERROR_RESET_ERRID ( 0x1 )
[18071.816000] FWLOG: [18509419] WHAL_ERROR_RESET_CHANNF1 ( )
[18071.820000] FWLOG: [18509419] WHAL_ERROR_RESET_ERRID ( 0x1 )
貌似是发送的信息长度是0.跟踪发送函数,看发送的长度。
[util.c:60:utl_file2json]utl_file2json 60 open file = /tmp/device.info
[util.c:60:utl_file2json]utl_file2json 60 open file = /tmp/region.channel.info
[util.c:62:utl_file2json]ERROR 0>(fd = open(filename, 00)) fail
EXPORT_SYMBOL(name);
EXPORT_SYMBOL_GPL(name);
2016.4.14 周四
#define qca_echom(cmd, …) qca_echo("[%s:%s:%d]"cmd, __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__)
svn添加二进制文件so,需要使用svn add --force
2016.4.15 周五
Wireless Extension (WE)是一组通用的API,能在用户空间对通用Wireless LANs进行配置和统计。它的好处在于仅通过一组单一的工具就能对各种各样的Wireless LANs进行管理,不过它们是什么类型,只要其驱动支持Wireless Extension就行;另一个好处就是不用重启驱动或Linux就能改变这些参数。
Wireless tools for Linux是一个Linux命令行工具包,用来设置支持Linux Wireless Extension的无线设备。
Wireless Tools (WT)就是用来操作Wireless Extensions的工具集,它包括以下工具:
iwconfig:设置基本无线参数
iwlist:扫描、列出频率,比特率,密钥等
iwspy:获取每个节点链接的质量
iwpriv:操作Wireless Extensions 特定驱动
2016.4.18 周一
今天感觉很累,可能是昨晚踢球造成的
今天主要是看QCA无线参数设置部分,发现现在的无线参数设置不能生效,是因为qca中缺少了这部分的处理。在代码中通过wifi restart是无线参数重新生效,而wifid中需要实现restart的响应部分。
2016.4.19 周二
opWifi_init(UCL_MOD_INDEX iModIndex)
{
int ret = 0;
ret = ucl_op_addUcMod(iModIndex, ucWifiInfo);
ret |= ucl_op_addMod(iModIndex, opWifiFun);
return ret;
}
nm_api_readPtnFromNvram 函数读取分区信息
#define WIFI_BAND_MODE_SELECTIVE 0
#define WIFI_BAND_MODE_2G 1
#define WIFI_BAND_MODE_5G (1 << 1)
#define WIFI_BAND_MODE_CONCURRENT 3
ifrename: 基于各种静态标准命名接口
bandmode和band是不一样的含义,bandmode是设置的模式,1表示2G,2表示5G,band是数据结构中数组的下标,0表示2G,1表示5G。
使用时需要转换一下。
2016.4.20 周三
整理了Linuxplat无线初始化的过程,整理详细后写成blog,wifi版上的无线是不能连接的,样机的可以。
2016.4.21 周四
上传了代码。
Channal With分为20MHz和40MHz,这个选择直接影响无线的Bit Rate参数,20MHz对应是144.4Mb/s,40MHz对应是300Mb/s
2016.4.22 日 周五
今天继续添加qca的无线部分功能,增加stop,和准备添加5G的支持。加密暂时先不添加。
重新看了uboot的实现,昨晚看了协处理器和在汇编中初始化的过程,今天将流程整理了一下,很多原来不明白的地方也弄明白了,后面写个文档。
2016.4.25 周一
实现WEP加密,测试。WEP加比较简单,首先 通过iwpriv ath0 authmode 1 设置认证方式,
WEP_AUTH_OPEN_SYS 1
WEP_AUTH_SHARED_KEY 2
WEP_AUTH_AUTO 4
然后通过命令iwconfig 命令设置密钥,密钥分为16进制和ACS码,两种格式命令不一样
16机制密钥:iwconfig %s key [%d] %s
ACS密钥:iwconfig %s key [%d] s:%s
最后设置key的 index
iwconfig %s key [%d]
2016.4.26 周二
2016.4.27 周三
DFS 需要计算信道,大概需要1分钟,这样导致5G的bit rate在这1分钟内为0;可以通过Makefile中的DFS宏进行控制。
WPA2 有两种风格:WPA2 个人版和 WPA2 企业版。WPA2 企业版需要一台具有 IEEE 802.1X 功能的 RADIUS (远程用户拨号认证系统) 服务器。没有 RADIUS 服务器的 SOHO 用户可以使用 WPA2 个人版,其口令长度为 20 个以上的随机字符,或者使用 McAfee 无线安全或者 Witopia Secure MyWiFi 等托管的 RADIUS 服务。
2016.4.28 周四
WEP用以保护数据的RC4秘密(cipher)属于对称性流密码,流密码用到称之为密钥流的位流,密钥流随后和信息结合,产生密文。为了还原原始信息,接收端会以相同的密钥流处理密文。RC4会利用异或(XOR)运算结合密钥流和密文。
流密码的与做方式通常是选用一把较短的密钥,然后将之展开成和信息等长的伪随机密码流。伪随机数生成器(pseudoradom number generator,PRNG)是一组用来将密钥展开为密钥流的规则。为了还原数据,收发双方必须拥有相同的密钥,并且使用相同的算法将密钥展开为伪随机数序列。
简单的过程就是:
Source Data---->Keystream---->Cipher stream---->Keystream---->Received data.
而Keystrem 是通过key 和Cipher PRNG生成的。
RC4加密算法是大名鼎鼎的 RSA 三人组中的头号人物Ron Rivest在1987年设计的密钥长度可变的流加密算法簇。只有授权才能使用RSA RC4的源代码。现在主要的无线芯片厂家取得RSA RC4的算法授权,并且将其继承到802.11芯片组,就是说该算法已经有硬件实现,上层的软件不需要担心授权问题。所以实现比较简单
EAP: 802.1X的基础是EAP(Extensible Authentication Protocol),EAP是一种框架协议,EAP本身未规范如何识别用户,但是允许协议设计人员打造自己的EAP认证方式。EAP是一种简单的封装方式,可以运行与任何的链路层,协议号是0xC227。
1)设置身份认证方式
iwpriv %s authmode 1, 1是开放是系统,2是共享密钥;
2)设置key,key分为acs码和16进制数两种
16进制:iwconfig %s key [%d] %s 接口名称,key序号,key值
ACS码:iwconfig %s key [%d] s:%s
3)设置生效的key
iwconfig %s key [%d]
WPA (Wi-Fi Protected Access, Wi-Fi 保护访问)
WPA2 (WPA 第二版) 是 Wi-Fi 联盟对采用 IEEE 802.11i 安全增强功能的产品的认证计划。简单一点理解,WPA2是基于WPA的一种新的
TKIP:Temporal Key Integrity Protocol(临时密钥完整性协议),被设计来尽可能强化pre-802.11i硬件安全性。TKIP保留了WEP的基本结构和操作方式,因为它本来就是一个设计来升级基于WEP的解决方案的软件;可以理解TKIP是对WEP的增强版;
AES:Advanced Encryption Standard(高级加密标准),安全性比 TKIP 好,推荐使用。
加密方式。
WPA = IEEE 802.11i draft 3 =IEEE802.1X/EAP+WEP(选择性项目)/TKIP WPA2 = IEEE 802.11i = IEEE802.1X/EAP+WEP(选择性项目)/TKIP/CCMP
CCMP(Counter CBC-MAC Protocol) 计数器模式密码块链消息完整码协议。CCMP主要是两个算法所组合而成的,分别是CTR mode以及CBC-MAC mode。CTR mode为加密算法,CBC-MAC用于讯息完整性的运算
WPA的实现需要适应开源软件hostapd
hostapd 是一个用户态用于AP和认证服务器的 守护进程 。它实现了IEEE 802.11相关的接入管理,IEEE 802.1X/WPA/WPA2/EAP 认证, RADIUS客户端,EAP服务器和RADIUS 认证服务器
需要构造hostapd的配置文件:
interface=ath0
bridge=br0
driver=atheros
logger_syslog=-1
logger_syslog_level=2
logger_stdout=-1
logger_stdout_level=2
dump_file=/tmp/hostapd.dump
ctrl_interface=/var/run/hostapd
ctrl_interface_group=0
ssid=TP-LINK_7B00_1111
max_num_sta=255
ignore_broadcast_ssid=0
wmm_enabled=1
wmm_ac_bk_cwmin=4
wmm_ac_bk_cwmax=10
wmm_ac_bk_aifs=7
wmm_ac_bk_txop_limit=0
wmm_ac_bk_acm=0
wmm_ac_be_aifs=3
wmm_ac_be_cwmax=10
wmm_ac_be_cwmin=4
wmm_ac_be_txop_limit=0
wmm_ac_be_acm=0
wmm_ac_vi_aifs=2
wmm_ac_vi_cwmax=4
wmm_ac_vi_cwmin=3
wmm_ac_vi_txop_limit=94
wmm_ac_vi_acm=0
wmm_ac_vo_aifs=2
wmm_ac_vo_cwmax=3
wmm_ac_vo_cwmin=2
wmm_ac_vo_txop_limit=47
wmm_ac_vo_acm=0
auth_algs=1 /*以上是公共部分*/
wpa=3
wpa_pairwise=CCMP
rsn_pairwise=CCMP
wpa_key_mgmt=WPA-PSK
wpa_passphrase=12345670
wpa_group_rekey=0
然后调用hostapd服务就可以了:hostapd -B -dd %s
%s是配置文件路径。
wifi macreload
# iwpriv ath0 getmac
ath0 getmac:14:CC:20:16:FB:DA
14:CC:20:16:FB:DB
2016.4.29 周五
主要MAC地址两种格式的转换,一个是MAC[6] 6字节的格式,一种是字符串格式。
2016.5.5 周四
LinuxPlat中athrs27_phy_is_up 中设置LED的的up/down状态,但是model_qca中通过
export GMAC_QCA953x=1 该宏决定以太网中使用那个95xx.c文件,在LinuxPlat中,通过scrip目录中的board953x目录文件config.board953x进行设置,而这个script目录在prereq.mk脚本中通过编译命令中的board_type进行映射。
2016.5.6周五
5G 频率分为4个band, (Band 1 ,Band 2,Band 3,Band 4),
5150MHz-5250MHz
5250MHz-5350MHz
5470MHz-5725MHz
5725MHz-5850MHz
每个band对应的信道范围不一样,band1是36,40,44,48,band2 band3需要DFS认证,band1和band4不需要;
2016.5.9 周一
网桥设备br0如果没有通过ifconfig 命令设置MAC地址,那么其MAC地址使用最后加入网桥的设备的MAC地址;
hostapd 会修改ssid。
2016.5.10 周二
2016.5.11周三
根据国家的ISO简写在qca_allCountry中查找该国家11AC支持的band值,不同国家不同的band值不同,得到band值后在wlan5GChannelTable中获取对应的信道数组;
11n有两种频宽模式:HT(High Throughput)20和HT40。
HT20是出于兼容性考虑:比如,一个区域内存在11b/g信号,那么为了尽量减少对它们的干扰,需要设定为HT20,以减少频带的重叠。
HT40是出于高性能考虑:HT40相当于两个HT20的捆绑,一个是主,一个是辅。主信道发送beacon报文和部分数据报文,辅信道发送其他报文。
由于HT40所需带宽为40M,在一个蜂窝式无线覆盖区域最好不要在2.4GHz使用,最好在5GHz使用。
在2.4G使用HT40,则有效通道有3~13,非重叠的只有3,11
2016.5.13 周五
11N 11GN 11BGN都使用模式11NGHT40PLUS,然后根据信道,大于等于6选择下偏,小于6信道上偏;
2016.5.16 周一
#define WIFI_CONFIG_MAC_FILTER (1 << 1)
#define WIFI_CONFIG_GUEST_NETWORK (1 << 2)
#define WIFI_CONFIG_PARENT_CTRL (1 << 3)
#define WIFI_CONFIG_REGION (1 << 4)
wifi命令由发送changecfg的命令,并且该命令会将cfg的类型作为status发送,但是接收的qca_event_handler并没有对changecfg命令类型的处理。
2016.5.20 周五
_ucWifi_cfg2Json中构造一个wifi.config文件,这个文件的格式是一个json。文件中的每一节用cJSON结构表示,包括字节和根,根需要申请
cJSON *root = cJSON_CreateObject();
然后各个字节添加到跟中
cJSON_AddItemToObject(root, "2G_Cfg", bandCfg[band]);
cJSON_AddItemToObject(root, "5G_Cfg", bandCfg[band]);
允许在字节中添加:
cJSON_AddItemToObject(bandCfg[band], "advCfg", advCfg[band])
对于长度为的数组,在gcc手册中,有如下一段代码片段:
struct line {
int length;
char contents[0];
};
struct line *thisline = (struct line *)malloc (sizeof (struct line) + this_length);
thisline->length = this_length;
这段代码的主要含义是定义了一个结构体,并对其进行初始化,上面结构体的第二个成员变量contents[0]事实上是不占内存空间的,因此整个结构体的长度sizeof(struct line)为4。当采用malloc为其申请内存空间时,如上所示,申请了一段长度为结构体长度加可变长度的内存空间给结构体类型的指针,这时contents就指向申请的可变长度的内存空间。由于是一次申请的,所以这段可变长度的内存空间和前面的结构体长度的内存空间是连续的。对于这段可变长度的内存空间,可以采用数组的方式对其进行访问。对于整个结构体,当不再使用时,可以使用free函数一次性对其进行释放,而不必像指针那样分别释放。
2016.5.23 周一
测试4220无线部分功能,阅读9533 2.0 datasheet。
在kernel驱动中,linux\kernels\mips-linux-2.6.31\arch\mips\include\asm\mach-atheros定义了寄存器地址。
2016.5.24 周二
上午例会,TR069的介绍。下午测试4220的无线,出4230的ECO.
2016.5.25 周三
2016.5.26 周四
测试访客网络,发现sta和sta之间的禁止和允许互访有问题,原因是设置参数时需要通过iwpriv ath1 ap_bridge 1 进行设置连接到同一ap之间的sta是否允许互相访问
另外,在br_guest_filter中要禁止来自guest network的sta对local network的访问。(这一点不能实现,因为有可能LAN端了解外网的Router)
[ 96.912000] eth0: received packet with own address as source address
[ 98.760000] eth0: received packet with own address as source address
[ 104.768000] eth0: received packet with own address as source address
[ 111.776000] eth0: received packet with own address as source address
[ 116.936000] eth0: received packet with own address as source address
[ 120.784000] eth0: received packet with own address as source address
2015.5.30 周一
跟踪wifi sched 功能时发现勾选有客户端连接时,不允许关闭wifi功能有问题,发现从jason中读取的参数有问题
~ # cat /config/wifiSched.config
{
"enable": 1,
"type": 1,
"entrySize": 1,
"Entry": [{
"stime": 0,
"etime": 1,
"days": 127,
"enable": 1
}]
}
~ # ====>>>>[/home/project/plc_platform/tp-software/develop/private/apps/wifiSched/src/wifiSched.c:_mainloop:946][_mainloop:946] call wifiSched_mainProc
====>>>>name = enable, node->valueint = 1
====>>>>name = type, node->valueint = 1
====>>>>[wifiSched_conf.c:_WifiSched_getData_fromJson:135][_WifiSched_getData_fromJson:135] wifiSchedCfg->offType = 0, wifiSchedCfg->enabled = 1
====>>>>[wifiSched_conf.c:_WifiSched_getData_fromJson:137][_WifiSched_getData_fromJson:137] wifiSchedCfg->offType = 0, wifiSchedCfg->enabled = 1
文件中的offType是1,但是读到结构中的是0,
原因是_get_jsonNumber中的参数发送了强制转换,
_get_jsonNumber(cJSON *data, const char *name, int *cfgEntry), int *cfgEntry参数如果传入的是UINT8,那么在函数调用是进行了强制类型转换,UINT8型指针转成int32 型指针,qca是大端,所以负责到int指针的内存最高8bit,函数返回是,指针是内存的低8位,并没有赋值。
BOOL _get_jsonNumber(cJSON *data, const char *name, int *cfgEntry)调用时的一个bug,如果使用这个函数直接读取jason中一个UINT8类型的变量,会出现在大端字节顺序下因为强制类型转换而参数读取错误的问题。
具体是,读取wifi_sched中 offType字段
typedef struct {
BOOL enabled;
UINT8 offType;
TIME_CTRL_ENTRY entry[TIME_CTRL_ENTRY_MAX_SIZE];
int timeCtrlEntrySize;
} WIFI_SCHED_MOD_DATA;
时,直接使用如下方法:
_get_jsonNumber(data, "type", &wifiSchedCfg->offType); 调用时参数类型进行了强制转换,在函数_get_jsonNumber内部,是int的指针,大端顺序下赋值是对内存的最高8bit进行赋值,函数返回后,指针变回UINT8,指向低8bit。所以参数没有读出来。
可以通过临时变量读取
int tmp = 0;
_get_jsonNumber(data, "type", tmp);
wifiSchedCfg->offType = tmp;
一个数据结果定义如下:
typedef struct {
int enabled;
unsigned char type;
int size;
unsigned char name[8]
} MY_STRUCT;
然后定义一函数接口,本意是对MY_STRUCT中的int类型和string进行读取,这里函数接口的作者忽视了unsigned char,视为int类型
_get_my_struct_data( MY_STRUCT *pD ata, char *pName, int * cfgEntry )
{
…
* cfgEntry = pD ata->type;
…
}
然后调用:
MY_STRUCT cfg;
_get_my_struct_data(&initCfg , "type", & cfg. type ); /*initCfg是一个全局的变量,initCfg.type = 1,这个并不是关键,关键是第三个参数 & cfg. type */
printf(" cfg. type = %d\r\n ", cfg. type ); 发现值为0,而不是1;
为什么?
首先说明的 是这代码在大端字节顺序的cpu上运行,第三个参数 & cfg. type的地址原来是一个unsigned char类型,而到了函数内部变成了int类型,假设这个地址是a,那么在函数内部,由于大端字节顺序,数据高位置,放在内存低处,
所以内存分布如下:
+++++++++++++++++++
| a | a+1 |a+2| a+3 |
+++++++++++++++++++
赋值 * cfgEntry = pD ata->type;只对a+3 写入设置1,其他的还是0;而函数返回后打印是unsigned char类型,只是地址a的值,该数值是0;
如何避免这种不细心的函数参数类型强制变化导致的错误,第一,在函数接口定义和使用的时候要严格按照类型进行,第二,不要忽视编译过程的警告
warning: passing argument 3 of ' _get_my_struct_data ' from incompatible pointer type
或者在编译中使用 Werror参数将编译警告视作错误
2016.5.31
excess elements in struct initializer
discards qualifiers from pointer target type
struct in_addr tmpAddr;
tmp.s_addr = dhcpcCfg.ulIp;
inet_ntoa(tmpAddr);
2016.6.1
-Os 对生成文件大小进行优化。它会打开 -O2 开的全部选项,除了会那些增加文件大小的。
assignment discards qualifiers from pointer target type: 参数类型不一样
incompatible implicit declaration of built-in function 'strncpy'
ath_beacon_tasklet(sc, &needmark);发送becon的任务;
ath_pci_driver 设备驱动,当中的ath_pci_probe用于探测当前总线上挂载的设备。
ath_pci_probe:创建网络设备wifi0, dev = alloc_netdev(sizeof(struct ath_pci_softc), "wifi%d", ether_setup);然后就是调用 __ath_attach函数进行绑定;
__ath_attach: 绑定处理函数接口,初始化中断:error = request_irq(dev->irq, ath_isr, SA_SHIRQ | SA_SAMPLE_RANDOM, dev->name, dev);
最后调用ath_hal_probe
__ath_attach中调用了 ath_attach,然后
ath_beaconq_setup:设置beacon的发送队列。
Remote Authentication Dial-In User Service ( RADIUS ) is a networking protocol that provides centralized Authentication, Authorization, and Accounting ( AAA or Triple A) management for users who connect and use a network service
2016.6.12 周日
端午后第一次上班,解决无线6信道上偏问题,原因是使用了配置中的无线信道参数进行mode的选择,而不是计算后的随机信道。cca问题还没有确定。
2016.6.14 周二
在软件中增加ethreg的命令,busybox版本不一样,新平台使用的busybox版本是1.19.4,而旧平台是1.01,暂时将旧平台的替换,只能本地搞搞。
编译4220eu,通过宏RELEASE=us进行区分,buildserver的编译脚本要重新写,调试很慢;
使用 wlanconfig ath0 list查看关联到ap上的sta,发现sta关联后如果直接关闭wifi,ap中还保留sta信息一段时间,然后老化,这个后面看看驱动总如何管理node
2016.6.17 周五
上午遇到一个字符串赋值并保存的问题,一般我们印象中的字符串是可见的字符串,就是通过printf可以打印出来的。但是有时候我们通过字符串存储的并不一定是可见字符,比如:
str3[0] = 0;
str3[1] = 1; 这中方式的赋值
简单地,尝试打印ascii表,发现只能从31开始输出可见字符
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
2016.6.20 周一
在函数ieee80211_ifattach 中初始化定时器:
OS_INIT_TIMER(ic->ic_osdev, &(ic->ic_inact_timer), ieee80211_inact_timeout, (void *) (ic));该定时器15秒触发一次;
2016.6.21 周二
指针数组的长度
const char * hwmode_2g[5]= {"b","g","n","gn","ng"};
printf("%s %d: size = %d, num = %d\r\n", __FUNCTION__, __LINE__, sizeof(hwmode_2g), sizeof(hwmode_2g)/sizeof(const char*));
结果是:main 278: size = 20, num = 5
在无线设置页面中增加11b和11g的选项,需要修改wireless.region.json文件,这个文件是用来初始化页面选项的;还有webserver中hwmode_2g指针数组,这个是返回数据的。
断开连接但是DUT的驱动没有注销node,是因为网卡使用的是抓包的驱动,DUT中的调用free node的函数条件不成立。
if (ieee80211_node_dectestref(ni)) 这个条件不成立,导致没有调用_ieee80211_free_node函数
2016.6.23 周四
4220提测前编译软件,在buildserver上编译,发现很慢,原因是代码检查时需要检查MTK和BCM的代码,后面需要将这3个分开;
更新了checklist,重新自测,发现PLC部分修改网络名字失败,已经反馈;自测了Wi-Fi克隆,没什么问题。
当无线驱动绑定后,驱动会为这些设备请求一个中断并且注册一个中断服务例程,驱动同时初始化一个叫ath_tasklet的任务队列用于处理下半部。这个中断首先通过扫描来之无线硬件的不确定的中断检测是否是无线硬件的中断,一旦中断被确认是一个无线中断,他就会调度任务队列延迟处理通过中断状态寄存器。有一些时序严格要求的处理程序比如软件beacon警告处理和UAPSD触发处理需要在ISP上下文处理外。一些这些时序严格要求的处理函数可以通过编译时间选项要求可以在任务队列中执行。在中断例程的最后,如果tasklet被调度,所有的无线设备中断将会被禁止除了那些时序严格要求的服务例程的中断;
2016.6.24 周五
今天提测了4220,剩下的时间就是看无线驱动文档和代码,发现有时候很难长时间集中精力。
2016.6.27 周一
MLME: MLME是 MAC Sublayer Management Entity,MAC子层管理实体。物理层(PHY)MAC状态机就位于MLME中。
在函数osif_vap_setup中调用函数wlan_vap_register_event_handlers(vap,&common_evt_handler);注册common_evt_handler,在common_evt_handler收发数据包的函数;
ni = ieee80211_find_txnode(vap, daddr); 根据目的地址查找该包发送到的目的node。
2016.6.29 周三
上午讨论关于iptables中关于NAT表执行优先级的问题,在prerouting链中,DNAT是在最后执行的,在conntrack中会根据连接跟踪的转台进行包的处理。
下午看新平台mtk的无线部分的代码,发现iwpriv命令和qca的完全不一样,而且支持的参数很少,传输功率的页面实现和实际设置的值是否对应上,这个要注意一下,测试了速率,WLAN2LAN可以到达87Mbps,还可以。
2016.6.30 周四
1)4530的信道选择auto,代码中使用命令设置为自动iwpriv %s%d set AutoChannelSel=2
2)开启了telnet功能;
3)无线传输功率的默认值错误,默认是middle,应该为high;
4)wifi-clone不会克隆前端Rootap的信道;
5)wifi-clone后,Rootap和DUTAP使用相同的SSID,但是无线客户单接入时,接入到的是RootAP的SSID;
6)连接到同一sta的访客网络的guest,如果不允许相互间的访问,是通过命令设置无线驱动,qca通过:iwpriv %s ap_bridge %d mtk通过:iwpriv %s%d set NoForwarding=%d,然后不同guest间的通过br_guest_filter.ko中实现。
2016.7.4 周一
在buid server上编译MTK的机型4530时,发现在编译云平台是,configure文件出现错误,但是奇怪的是在本地编译和在buildserver后台编译也是没问题的,在buildserver上编译qca也没有问题。而错误出现的地方:
Running make clean…
yes
./configure: line 28921: syntax error near unexpected token `done'
./configure: line 28921: `done'
也很奇怪,在configure文件中这一行的内容并不是done。编译过程中实际的configure文件并不是svn上的文件,而是通过auto config生成的文件
Generated by GNU Autoconf 2.63 for wolfssl 3.9.0.
Makefile.am是一种比Makefile更高层次的规则。只需指定要生成什么目标,它由什么源文件生成,要安装到什么目录等构成。
表一列出了可执行文件、静态库、头文件和数据文件,四种书写Makefile.am文件个一般格式。
对于可执行文件和静态库类型,如果只想编译,不想安装到系统中,可以用noinst_PROGRAMS代替bin_PROGRAMS,noinst_LIBRARIES代替lib_LIBRARIES。
Makefile.am还提供了一些全局变量供所有的目标体使用:
在Makefile.am中尽量使用相对路径,系统预定义了两个基本路径:
2016.7.5 日
今天在buildserver上跟进MTK编译的问题,发现直接checkout后,直接编译是会出现configure退出问题,但是如果编译一次失败,然后修改svn的源码管理为none,编译第二次,发现是可以的。
2016.7.6 日
以太网的收发包buf的大小居然在wireless.conf中定义, busybox中没有定义btctl,而文件系统中的brctl是一个完整的bin。文件系统是由build拷贝到board
export INSTALL_ROOT := $(IMAGEPATH)/rootfs.build
export INSTALL_ROOT_FOR_BOARD := $(IMAGEPATH)/rootfs.board
@cp -Rf $(INSTALL_ROOT) $(INSTALL_ROOT_FOR_BOARD)
2016.7.8 日周五
准备4225(FR)项目的编译选项,该项目和4220是一样的方案,所以image目录下可以共用,但是需要修改文件名字;测试发现备份功能和升级功能页面打不开,咨询王成君,是应为文案存在缺漏,导致缺少一些字段;
2016.7.13 周三
今天验证4220无线双LAN到WLAN速率刚开始时出现的速率骤降问题,对比过4230,也发现类似的问题,考虑单LAN口到WLAN没有,怀疑是打开流控导致的问题,另外可以使用high throughput脚本进行测试。
2016.7.20 周三
今天准备提测4220,但是发现svn上日志的提交时间比实际上传的时间早了1小时,导致buildserver更新不到最近一小时内的修改。
2016.7.21 周四
今天将uboot的初始化过程重新整理了一下,编写文档。
2016.7.25 周一
MIPS 起始地址是0xbfc00000,会有4Mbyte的大小限制,但一般MIPS芯片都会采取一些方法解决这个问题。
MIPS24K 起始地址改到了0xbf000000,现在有16Mbyte的空间了。
2016.7.26 周二
EU和UK的软件共用要考虑硬件(主要是灯)是否有做兼容设计,插座方向是反的。
2016.7.27 周三
11n有两种频宽模式:HT(High Throughput)20和HT40。
HT20是出于兼容性考虑:比如,一个区域内存在11b/g信号,那么为了尽量减少对它们的干扰,需要设定为HT20,以减少频带的重叠。
HT40是出于高性能考虑:HT40相当于两个HT20的捆绑,一个是主,一个是辅。主信道发送beacon报文和部分数据报文,辅信道发送其他报文。
由于HT40所需带宽为40M,在一个蜂窝式无线覆盖区域最好不要在2.4GHz使用,最好在5GHz使用。
在2.4G使用HT40,则有效通道有3~13,非重叠的只有3,11.
11na_ht20代表802.11na的20兆频宽,连接速率有130M,11na_ht40代表802.11na的40兆频宽,连接速率有300M。由于802.11n有个特性是40M频宽,该频宽是通过以前的两个20M信道叠加起来后生成的,并且叠加时两信道一个是主信道一个是副信道,这里的plus和minus都是针对主信道说的,所以11na_ht40plus代表40M频宽时的2个信道叠加向上加的叠加,例如当前信道是149,配成40M频宽需要叠加另外一个信道,就是149+153两个信道组成的40MHz频宽,11na_ht40minus代表信道叠加时是向下减的叠加,例如配了这个,信道161,就等于是161+157组成了40M频宽的新信道。
802.11g也如a是一样的意思,只不过。由于802.11g只有1、6、11这3个信道,所以使用40M频宽的信道时只剩下了一个不重叠信道,所以在使用802.11ng时,不建议使用40MHz的频宽,使用默认的20MHz频宽即可。
2016.8.2 周二
在函数wmnetTcpAccept中accept的socket设置了FD_CLOEXEC,表示对于这个socket,在执行exec函数时是关闭的。
mudConnPeek 接收数据包函数
httpServerRequestHandler 处理请求的函数
2016.8.8 周一
使用pktlog抓包步骤:
1.加载ath_pktlog.ko;
2.pktlogconfig -a wifi0 -s 0 清空缓存;
3.设置缓存大小pktlogconfig -a wifi0 -s 10485760 (10M) 这个内存太小,只能抓几秒的包;
4.关闭原有的统计功能 iwpriv wifi0 disablestats 0;
5.pktlogconfig -a wifi0 -e 开始抓包
6.pktlogconfig -d wifi0 停止抓包
7.进入目录cd /proc/ath_pktlog
8.tftp -p -l wifi0 -r pktlog 192.168.0.100
后面就用脚本分析pktlog文件。
2016.8.11 周四
测试家长控制对有线和无线的限制
1)登录的管理界面的主机不能设置控制自己的MAC
2)对于有线的主机,可能控制访问DUT的管理IP,但是不能管控外网的访问;
3)对无线的主机,可以管控访问DUT和访问外网;
2016.8.12 周五
uclOpModInitArray 模块初始化表,定义各个模块的初始化函数和序号;
2016.8.17 周三
uclited 中的_msgDoUi 函数处理http发来的请求
2016.8.18 周四
iwpriv wifi0 disp_tpc 1 查看发送功率
2016.8.24 周三
ahCmnRegDomainPairs根据国家码编号,确定2.4G和5G使用什么标准,其中world 对应的ETSI标准,就是CE的标准;
RTMPDeQueuePacket
2016.9.20 周二
跟进无线关联不上的问题,bug 135026发现是因为在11信道时,无线网卡在认证关联后,DUT 没有发出EAPOL key包,导致4次握手超时,问题反馈给MTK。
在MTK的驱动中,函数RTMPSetProfileParameters用于解析/tmp/wireless/RT2860.dat配置文件,当中有参数AutoChannelSkipList用于表示自动信道时跳过的信道列表,最多可以支持10个信道。
2016.9.21 周三
无线自动选择信道需要时间,大概6s
[2016:09:21:11:44:17]wifid[wifi_exec_cmd:491]: insmod /lib/modules/2.6.36.x/kernel/MT7610_ap.ko
[2016:09:21:11:44:19]ESW: Link Status Changed - Port3 Link UP
[2016:09:21:11:44:19]wifid[wifi_exec_cmd:491]: ifconfig ra0 up
[2016:09:21:11:44:20][PLCD_LOG][main:627]: start plcd OK!
[2016:09:21:11:44:20]ESW: Link Status Changed - Port1 Link UP
[2016:09:21:11:44:25]0x1300 = 00064300
[2016:09:21:11:44:25]wifid[wifi_exec_cmd:491]: brctl addif br0 ra0
在驱动初始化是调用pAd->CommonCfg.Channel = AP_AUTO_CH_SEL(pAd, pAd->ApCfg.AutoChannelAlg);自动选择信道;
2016.9.22周四
MTK的自动信道选择有两种方法,一种以信道上存在多少个AP和和脏数据,选取最少干扰的信道(SelectClearChannelApCnt ),另外一种是根据和RSSI计算dirtyness( SelectClearChannelCCA ),
SelectClearChannelApCnt:2.4G 下偏信道,2.4G信道每个信道的带宽是5M,如果带宽是40MHz,避免信道干扰的偏移值是8M,4M主信道+4M第二信道;如果是20M带宽,则是4MHz。
下偏:
for (ll = channel_index + 1; ll < (channel_index + ChanOffset + 1); ll++)
{
if (ll < MAX_NUM_OF_CHANNELS)
pChannelInfo->dirtyness[ll]++;
}
上偏:
for (ll = channel_index - 1; ll > (channel_index - ChanOffset - 1); ll--)
{
if (ll >= 0)
pChannelInfo->dirtyness[ll]++;
}
选择规则:1)选取dirtyness 为 0 的信道;2)如果选不到,选取没有干扰的信道 dirtyness=30;3)如果选不到,选取最小干扰的信道,dirtynes=31或者32,如果有多个,选取最小RSSI的;4)如果选不到,随机选取;
SelectClearChannelCCA:
接收灵敏度 Rssi,高 > -50dbm, 低 < -80dbm, 中: -80dmb ~-50dbm;
检查相邻信道并计算dirtyness
/* check neighbor channel */
for (loop = (channel_idx+1); loop <= (channel_idx+AboveBound); loop++)
{
if (loop >= MAX_NUM_OF_CHANNELS)
break;
if (pAd->ChannelList[loop].Channel - pAd->ChannelList[loop-1].Channel > 4)
break;
pChannelInfo->dirtyness[loop] +=
((9 - (loop - channel_idx)) * 4);
}
/* check neighbor channel */
for (loop=(channel_idx-1); loop >= (channel_idx-BelowBound); loop--)
{
if (loop < 0)
break;
if (pAd->ChannelList[loop+1].Channel - pAd->ChannelList[loop].Channel > 4)
continue;
pChannelInfo->dirtyness[loop] +=
((9 - (channel_idx - loop)) * 4);
}
选择规则1)在False_CCA小于100的范围内,选择最小dirtyness的信道;2)在False_CCA > 100的范围内,选在falsecca最小的信道;3)如果选不到,随机选择;
在执行设置无线自动信道的时候,有5s时间是终止了MSDU的,所以在这个时间段内无线是无法响应sta的请求的。
[2016:09:22:17:21:56]~ # iwpriv ra0 set AutoChannelSel=2
[2016:09:22:17:21:56]APMlmeScanReqAction 1370 call RTMPSuspendMsduTransmission
[2016:09:22:17:21:56]RTMPSuspendMsduTransmission 2344 SCANNING, suspend MSDU transmission …
[2016:09:22:17:22:01]~ # RTMPResumeMsduTransmission 2395 SCAN done, resume MSDU transmission …
2016.9.23 周五
kernel中去掉
CONFIG_LBDAF=y
CONFIG_XFRM=y
CONFIG_INET_TUNNEL=y
CONFIG_FUSE_FS=y
后,kernel使用内存大小为:9072KB,省了84KB;
2016.10.8 周六
堆内存优化
1.堆内存最小单位16字节,尽量减少小块内存的申请,避免内存浪费;
2.调整M_MMAP_THRESHOLD,降低mmap的门槛,降低内存存在风洞的风险,但是会增加系统调用,性能减低;
3.调整M_TRIM_THRESHOLD,减少堆顶连续内存门槛,释放更多堆顶内存;
4.使用mtrace来跟踪内存的调度,使用hook函数以及backtrace函数,找到大内存的分配;
除了strip外,可以通过objcopy -R 命令将不需要的session去除,达到程序瘦身的目标。比如:
objcopy -R .comment -R .note.ABI-tag -R .gnu.version app app1 这个命令将app中的.commemt .note.ABI-tag-R .gnu.version三个session去掉。
减少数据段的方法:
1.将只读的全局变量,加上const,从而使其转移到代码段;
2.去除该全局变量;
3.减少全局变量的尺寸;
减少死代码,编译时带上-Wall 选项,去除unused variable 'i'之类的警告,有助于减少代码段占用的内存;
编译成库文件
gcc -fPIC -shared a.c -o liba.so
线程退出后,进程需要调用函数pthread_join结束,否则为每个线程分配的栈空间不会释放;
Linux内核中文件预读算法:对于每个文件的第一个请求,系统读入所请求的页面并读入紧随其后的少数几个页面,一般是3个;这个预读成为同步预读,对于第二次请求,如果所读页面不在Cache中,既是不在前次预读的group中,则表明文件访问不是顺序访问,系统继续采用同步预读; 如果所读页面在cache中,则表明预读命中,操作系统把预读group扩大一倍,并杨底层文件系统读入group中剩下不在Cache中的文件数据块,这是的预读成为异步预读。
内存回收过程中还有两个重要的方法,一个是LMR(Low on memory reclaiming),另外一个是OMK(Out of Memory Killer)。当分配内存失败的时候LMR会将会起作用,失败的原因是kswapd不能提供足够的空余内存,这时LMR每次释放1024个垃圾页直到内存分配成功。当LMR不能快速释放内存的时候,OMK就开始起作用,OMK会采用一个选择算法来杀死某些今晨。当选定进程时,就会发送SIGKILL信号,这就会使内存立即被释放。OMK选择进程的方法:
1)进程占用大量的内存;
2)进程只会损失小量工作;
3)进程具有低的静态优先级;
4)进程不属于root用户;
2016.10.13 周四
连接运算符##可以把两个独立的字符串连接成一个字符串。
#define SORT(X) sort_functon ## X
SORT(3)(array, elements, element_size); 展开后等于:sort_function3(array, elements,element_size);
将main函数的参数复制,当中使用了二维指针,值得学习
new_argv = (char **) calloc(argc + 1, sizeof(char*));
for (i = 0; i < argc; i++)
{
new_argv[i] = (char*)malloc(strlen(argv[i] +1));
strcpy(new_argv[i], argv[i]);
}
栈是存放函数所有动态局部变量和函数调用和返回的有关信息的一块内存;堆是供malloc,calloc和realloc等函数获取内存空间的一块内存;
把数组传给函数时,有值传递和地址传递两种方式,在值传递方式中,在说明和定义函数时,要在数组参数的尾部加上一对方括号([]),调用函数只需要将数组的地址(数组名)传递给函数。
void byval_func(int[]);
void main(void)
{
int x[10];
int y;
for (y = 0; y < 10; y++)
{
x[y] = y;
}
byval_func(x);
}
void byval_func(int i[])
{
int y;
….
}
数组名不能被放在赋值运算符的左边,一个数组是一个对象,数组名就是指向这个对象的第一个元素的指针。
2016.10.20
在jenkins中svn链接中增加@HEAD,可以不用理会服务器时间,直接更新到最新的版本
例如 https://192.168.0.100:18080/svn/WEB/trunk/项目名称@HEAD
2016.10.24
802.11b
+--- FHSS/DSSS: 1Mbps,2Mbps
+--- CCK: 5.5Mbps,11Mbps
802.11a/g/n/ac
+--- OFDM:
+--- HT MIX: 兼容11b/a/g 这些11n协议之前的设备
+--- GREEN Field: 只支持 11n 设备,不兼容 11b/a/g 这些老协议
2016.10.26
802.11n标准中采用A-MPDU聚合帧格式,即将多个MPDU聚合为一个A-MPDU,只保留一个PHY头,删除其余MPDU的PHY头,减少了传输每个MPDU的PHY头的附加信息,同时也减少了ACK帧的数目,从而降低了协议的负荷,有效的提高网络吞吐量
2016.10.28
1、wildcard : 扩展通配符
2、notdir : 去除路径
3、patsubst :替换通配符
Makefile 下删除目录中所有的某类型文件
DIRS :=$(shell find . -type d)
OBJS = $(foreach dir,$(DIRS),$(wildcard $(dir)/*.o $(dir)/*.a $(dir)/*.bin))
clean:
@rm -f $(OBJS)
2016.11.4
一个DMA映射是要分配的DMA缓冲区与为该缓冲区生成的,设备可访问地址的组合;建立流式DMA映射,必须告诉内核数据流动的方向,DMA_TO_DEVICE和DMA_FROM_DEVICE,如果数据被发送到设备,应当使用DMA_TO_DEVICE,如果数据被发送到CPU,则使用DMA_FROM_DEVICE,如果数据可以双向流动,则使用DMA_DIDIRECTIONAL;
2016.11.7
注册中断响应
error = request_irq(dev->irq, ath_isr, IRQF_DISABLED, dev->name, dev);
调用的函数接口:
OS_SYNC_SINGLE在文件osdep_adf.h OS_SYNC_SINGLE 839 中定义;
bus_dma_sync_single在文件if_bus.c bus_dma_sync_single 30 中定义
关键的ath_rx_intr_aponly函数,调用了:
OS_SYNC_SINGLE(sc->sc_osdev,
bf->bf_buf_addr[0], sc->sc_rxstatuslen, BUS_DMA_FROMDEVICE,
OS_GET_DMA_MEM_CONTEXT(bf, bf_dmacontext));
然后调用retval = ath_hal_rxprocdescfast(ah, NULL, 0, NULL, rxs, wbuf_raw_data(wbuf));
在OS_SYNC_SINGLE宏中,最后调用dma_cache_sync(devhandle->bdev, (void *)addr, size,
(direction == BUS_DMA_TODEVICE)? DMA_TO_DEVICE : DMA_FROM_DEVICE);
dma_cache_sync在linux\kernels\mips-linux-2.6.31\arch\mips\mm\dma-default.c中定义
void dma_cache_sync(struct device *dev, void *vaddr, size_t size,
enum dma_data_direction direction)
{
BUG_ON(direction == DMA_NONE);
plat_extra_sync_for_device(dev);
if (!plat_device_is_coherent(dev))
__dma_sync((unsigned long)vaddr, size, direction);
}
在kernel的配置文件中CONFIG_DMA_NONCOHERENT=y设置成y
static inline void __dma_sync(unsigned long addr, size_t size, enum dma_data_direction direction)
{
switch (direction) {
case DMA_TO_DEVICE:
dma_cache_wback(addr, size);
break;
case DMA_FROM_DEVICE:
dma_cache_inv(addr, size);
break;
case DMA_BIDIRECTIONAL:
dma_cache_wback_inv(addr, size);
break;
default:
BUG();
}
}
对于DMA_TO_DEVICE方向,就是说要发送到设备,cache内容要写回到DMA 内存;对于BUS_DMA_FROMDEVICE,从device读取数据,要将cache置为无效;如果是双向,先设置成无效,再写回;
a、DMA_TO_DEVICE:把cache的数据刷回内存里,用于使能dma传输到外设之前。因为dma传输只会从内存拿数据,所以必须把cache的数据全部刷回到内存中;
b、DMA_FROM_DEVICE:把cache的数据置无效,用于dma已经传输完毕产生中断之后,准备从内存读取到驱动的buffer中。如果不把cache的数据置无效,
那么cpu就会直接从cache中取出旧的数据,不会到内存中去拿新的数据;
c、DMA_BIDIRECTIONAL跟DMA_TO_DEVICE的效果一样。
ath_edma_attach进行edma的绑定,当中初始化函数 ath_rx_edma_init中为两个队列HAL_RX_QUEUE_LP和HAL_RX_QUEUE_HP初始化buffer,然后进行dma映射
bf->bf_buf_addr[0] = wbuf_map_single(sc->sc_osdev, wbuf, BUS_DMA_FROMDEVICE,
OS_GET_DMA_MEM_CONTEXT(bf, bf_dmacontext));
wbuf_map_single调用了函数dma_map_single(devhandle->bdev, ptr, size,
(direction == BUS_DMA_TODEVICE)? DMA_TO_DEVICE : DMA_FROM_DEVICE);
参考DMA-API.txt可以看到,函数dma_map_single用于映射处理的一段虚拟地址使得硬件设备可以直接访问并返回这段地址的物理地址;就是说经过映射后的这段地址
Maps a piece of processor virtual memory so it can be accessed by the
device and returns the physical handle of the memory.
dma_addr_t dma_map_single(struct device *dev, void *ptr, size_t size,
enum dma_data_direction direction)
{
unsigned long addr = (unsigned long) ptr;
if (!plat_device_is_coherent(dev))
__dma_sync(addr, size, direction);
return plat_map_dma_mem(dev, ptr, size);
}
linux/kernels/mips-linux-2.6.31/arch/mips/include/asm/mach-generic/dma-coherence.h
static inline dma_addr_t plat_map_dma_mem(struct device *dev, void *addr,
size_t size)
{
return virt_to_phys(addr);
}
rxedma->rxfifo = (wbuf_t *)OS_MALLOC(sc->sc_osdev, bsize, GFP_KERNEL); 这个是申请指针的数组,
/* push this buffer in the MAC Rx fifo */
ath_hal_putrxbuf(ah, bf->bf_buf_addr[0], qtype);
通过这个函数将物理地址bf->bf_buf_addr[0]写到寄存器AR_HP_RXDP中,AR_HP_RXDP寄存器用于设置MAC用于接收高优先级队列指针地址;
void ar9300_set_rx_dp(struct ath_hal *ah, u_int32_t rxdp, HAL_RX_QUEUE qtype)
{
HALASSERT((qtype == HAL_RX_QUEUE_HP) || (qtype == HAL_RX_QUEUE_LP));
if (qtype == HAL_RX_QUEUE_HP) {
OS_REG_WRITE(ah, AR_HP_RXDP, rxdp);
} else {
OS_REG_WRITE(ah, AR_LP_RXDP, rxdp);
}
}
概述:
无线驱动的收包过程是基于中断的处理方式。在准备接收数据之前,驱动需要先进行初始化接收数据使用到的相关结构( sc_rxbuf和rxfifo )。当数据包到达时,硬件会首先进行 DMA,完成以后产生Rx中断。中断处理过程又分为两个部分,首先是立即执行的上半段处理,负责将数据包从软件接收缓冲队列中取出,并补全接收缓冲区,以便继续接收数据;然后就是一个 tasklet机制的调度,进行数据包的分析处理,在 LMAC层中进行接收状态的分析和填充,在 UMAC层中对数据包本身进行分析,包括重组和包头转换等,最后将其转换为以太网帧的形式提交到 bridge上去。
中断开始
内核活动中有硬件中断和软件中断,对于无线网卡收包的第一步,是硬件中断,对于中断,内核中执行专门的例程,又叫中断处理程序,执行中断发生时的动作。中断处理可通过request_irq进行注册。
跟踪无线收包流程,就从中断处理开始:
error = request_irq(dev->irq, ath_isr, IRQF_DISABLED, dev->name, dev);
然后主要的目光集中在中断处理函数ath_isr中:
可以按照这个函数调用轨迹去看处理的过程,不详细说,重点集中在函数ath_rx_intr_aponly中
void
ath_rx_intr_aponly(ath_dev_t dev, HAL_RX_QUEUE qtype)
{
struct ath_softc *sc = ATH_DEV_TO_SC(dev);
struct ath_rx_edma *rxedma;
wbuf_t wbuf;
struct ath_buf *bf;
struct ath_rx_status *rxs;
HAL_STATUS retval;
struct ath_hal *ah = sc->sc_ah;
int frames;
#if !ATH_RESET_SERIAL
if(atomic_read(&sc->sc_in_reset))
return;
#endif
rxedma = &sc->sc_rxedma[qtype];
do {
printk("%s %d receive packet %d \r\n", __func__, __LINE__, rxedma->rxfifoheadindex);
wbuf = rxedma->rxfifo[rxedma->rxfifoheadindex];
if (unlikely(wbuf == NULL))
break;
bf = ATH_GET_RX_CONTEXT_BUF(wbuf);
/*清理一下cache,则个是cache一致性问题后续说 */
OS_SYNC_SINGLE(sc->sc_osdev,
bf->bf_buf_addr[0], sc->sc_rxstatuslen, BUS_DMA_FROMDEVICE,
OS_GET_DMA_MEM_CONTEXT(bf, bf_dmacontext));
bf->bf_status |= ATH_BUFSTATUS_SYNCED;
rxs = bf->bf_desc;
#ifdef CONFIG_COMCERTO_CUSTOM_SKB_LAYOUT
if (wbuf->mspd_data) {
__memcpy(wbuf->data, wbuf->mspd_data, sc->sc_rxstatuslen + sizeof(struct ieee80211_qosframe) + ATH_COMCERTO_CUSTOM_SKB_OFFSET);
wbuf->mspd_ofst = sc->sc_rxstatuslen + sizeof(struct ieee80211_qosframe) + ATH_COMCERTO_CUSTOM_SKB_OFFSET;
}
#endif
retval = ath_hal_rxprocdescfast(ah, NULL, 0, NULL, rxs, wbuf_raw_data(wbuf));
/*ath_hal_rxprocdescfast = ar9300_proc_rx_desc_fast*/
#ifdef ATH_RX_DESC_WAR
if (unlikely(HAL_EINVAL == retval)) {
struct ath_buf *next_bf;
wbuf_t next_wbuf;
u_int32_t next_idx = rxedma->rxfifoheadindex;
bf->bf_status |= ATH_BUFSTATUS_WAR;
INCR(next_idx, rxedma->rxfifohwsize);
next_wbuf = rxedma->rxfifo[next_idx];
if (next_wbuf == NULL)
break;
next_bf = ATH_GET_RX_CONTEXT_BUF(next_wbuf);
next_bf->bf_status |= ATH_BUFSTATUS_WAR;
DPRINTF(sc, ATH_DEBUG_RX_PROC, "%s: Marking first DP 0x%x for drop\n",
__func__, (unsigned) bf->bf_buf_addr[0]);
DPRINTF(sc, ATH_DEBUG_RX_PROC, "%s: Marking second DP 0x%x for drop\n",
__func__, (unsigned) next_bf->bf_buf_addr[0]);
}
#endif
/* XXX Check for done bit in RxS */
if (HAL_EINPROGRESS == retval) {
break;
}
/* add this ath_buf for deferred processing, 将包放入到rxqueue,下半段部再处理*/
TAILQ_INSERT_TAIL(&rxedma->rxqueue, bf, bf_list);
/* clear this element before advancing */
rxedma->rxfifo[rxedma->rxfifoheadindex] = NULL;
/* advance the head pointer */
INCR(rxedma->rxfifoheadindex, rxedma->rxfifohwsize); /*处理下一个包*/
if (unlikely(rxedma->rxfifodepth == 0))
printk("ath_rx_intr: depth 0 PANIC\n");
rxedma->rxfifodepth--;
} while (TRUE);
/*将ath_bufs 从空闲的链表移到rxedma的rxfifo */
frames = rxedma->rxfifohwsize - rxedma->rxfifodepth;
if (frames > 0)
ath_rx_addbuffer_aponly(sc, qtype, frames);
}
这个函数主要做的就是将数据包从rxfifo中收上来,然后放入rxqueue,然后在空闲队列中找一个ath_bufs放回到rxfifo。
rxfifo
sc中对应的rxfifo 有两个,分别对应于硬件的两个不同优先级的队列( High-Priority和Low-Priority ,HP长队16,LP长度128);
这两个参数在函数ar9300_fill_capability_info中的:
p_cap->hal_rx_hp_depth = HAL_HP_RXFIFO_DEPTH;
p_cap->hal_rx_lp_depth = HAL_LP_RXFIFO_DEPTH;
赋值;
通过枚举变量:
enum RX_FIFO_DEPTH {
HAL_HP_RXFIFO_DEPTH = 16,
HAL_LP_RXFIFO_DEPTH = 128,
};定义
rxfifo是指针的数组,在函数中申请了空间。
static int ath_rxfifo_alloc(struct ath_softc *sc, HAL_RX_QUEUE qtype)
{
struct ath_rx_edma *rxedma;
int bsize, error;
rxedma = &sc->sc_rxedma[qtype];
error = ath_hal_getrxfifodepth(sc->sc_ah, qtype, &rxedma->rxfifohwsize);
if (error)
return error;
bsize = sizeof(wbuf_t) * rxedma->rxfifohwsize;
printk("%s %d rxedma->rxfifohwsize = %d, bsize = %d\r\n", __func__, __LINE__, rxedma->rxfifohwsize, bsize);
/*
上面在串口中打印结果是:
[2016:11:10:14:55:09][ 10.804000] ath_rxfifo_alloc 128 rxedma->rxfifohwsize = 16, bsize = 64
[2016:11:10:14:55:09][ 10.812000] ath_rxfifo_alloc 128 rxedma->rxfifohwsize = 128, bsize = 512
*/
rxedma->rxfifo = (wbuf_t *)OS_MALLOC(sc->sc_osdev, bsize, GFP_KERNEL); /*所以这里申请的是存放指针的数组空间,这些指针就用来执行可用的ath_buf*/
if (rxedma->rxfifo == NULL)
return -ENOMEM;
rxedma->rxfifoheadindex = 0;
rxedma->rxfifotailindex = 0;
rxedma->rxfifodepth = 0;
OS_MEMZERO(rxedma->rxfifo, bsize);
TAILQ_INIT(&rxedma->rxqueue);
ATH_RXQ_LOCK_INIT(rxedma);
return 0;
}
sc->sc_rxbuf
sc_rxbuf是整个驱动中,收包所使用的缓冲池,其中初始化了 512个ath_buf 的对象。该结构为 LMAC层提供空白的ath_buf结构。在在函数ath_rx_edma_init中初始化
int ath_rx_edma_init(ath_dev_t dev, int nbufs)
{
…
printk("%s %d: nbufs = %d, sc->sc_rxbufsize = %d\r\n", __func__, __LINE__, nbufs, sc->sc_rxbufsize);
/*串口输出: [2016:11:10:14:55:09][ 10.828000] ath_rx_edma_init 216: nbufs = 256, sc->sc_rxbufsize = 3900*/
for (i = 0; i < nbufs; i++, bf++, rxs++) {
wbuf = ath_rxbuf_alloc(sc, sc->sc_rxbufsize);
if (wbuf == NULL) {
error = -ENOMEM;
break;
}
bf->bf_mpdu = wbuf;
bf->bf_buf_addr[0] = wbuf_map_single(sc->sc_osdev, wbuf, BUS_DMA_FROMDEVICE,
OS_GET_DMA_MEM_CONTEXT(bf, bf_dmacontext));
/*bf_buf_addr[0] 是物理地址,物理地址,物理地址,重要事情说三次, 这个地址在函数ath_rx_buf_link_aponly中写入MAC的寄存器:
ath_hal_putrxbuf(ah, bf->bf_buf_addr[0], qtype); /*ar9300_set_rx_dp*/
*/
ATH_SET_RX_CONTEXT_BUF(wbuf, bf);
bf->bf_desc = (void *)rxs;
TAILQ_INSERT_TAIL(&sc->sc_rxbuf, bf, bf_list); /*然后将bf加入到sc_rxbuf链的后面,就是说sc_rxbuf是有256个wbuf的链,这些buf就是free buf,用来接收数据包的*/
}
…
}
DMA是一种硬件机制,允许外围设备和主存之间直接传输他们的IO数据,而不需要系统处理器的参与。一个DMA映射就是要分配的DMA缓冲区与该缓冲器生成的,设备可访问的地址组合。分为两种映射
一致性DMA映射和流式DMA映射,而无线驱动中使用的是流式DMA映射。
回到代码中,在初始化时使用了wbuf_map_single,其中的参数是BUS_DMA_FROMDEVICE
bf->bf_buf_addr[0] = wbuf_map_single(sc->sc_osdev, wbuf, BUS_DMA_FROMDEVICE,
OS_GET_DMA_MEM_CONTEXT(bf, bf_dmacontext));
wbuf_map_single调用了函数dma_map_single(devhandle->bdev, ptr, size, (direction == BUS_DMA_TODEVICE)? DMA_TO_DEVICE : DMA_FROM_DEVICE);
参考DMA-API.txt可以看到,函数dma_map_single用于映射处理的一段虚拟地址使得硬件设备可以直接访问并返回这段地址的物理地址;
Maps a piece of processor virtual memory so it can be accessed by the
device and returns the physical handle of the memory.
dma_addr_t dma_map_single(struct device *dev, void *ptr, size_t size,
enum dma_data_direction direction)
{
unsigned long addr = (unsigned long) ptr;
if (!plat_device_is_coherent(dev)) /*在kernel的配置文件中CONFIG_DMA_NONCOHERENT=y设置成y*/
__dma_sync(addr, size, direction);
return plat_map_dma_mem(dev, ptr, size);
}
linux/kernels/mips-linux-2.6.31/arch/mips/include/asm/mach-generic/dma-coherence.h
static inline dma_addr_t plat_map_dma_mem(struct device *dev, void *addr, size_t size)
{
return virt_to_phys(addr); /*这里返回的是物理地址*/
}
cache一致性
__dma_syn
a、DMA_TO_DEVICE:把cache的数据刷回内存里,用于使能dma传输到外设之前。因为dma传输只会从内存拿数据,所以必须把cache的数据全部刷回到内存中;
b、DMA_FROM_DEVICE:把cache的数据置无效,用于dma已经传输完毕产生中断之后,准备从内存读取到驱动的buffer中。如果不把cache的数据置无效,
那么cpu就会直接从cache中取出旧的数据,不会到内存中去拿新的数据;
c、DMA_BIDIRECTIONAL跟DMA_TO_DEVICE的效果一样
在函数ath_common_intr_aponly中关闭所有的中断,除了 RXEOL, RXORN, SWBA。
软中断 处理函数do_ath_handle_intr
ieee80211_input->ieee80211_iter_input_all->ieee80211_input_all->ath_net80211_rx_aponly ->ath_rx_indicate_aponly->ath_rx_process_aponly->ath_rx_handler_aponly->do_ath_handle_intr
注册tasklet
ATH_INIT_TQUEUE(&osdev->intr_tq, (adf_os_defer_fn_t)ath_tasklet, (void*)dev);
tasklet的实现函数
ath_tasklet(TQUEUE_ARG data)
{
struct net_device *dev = (struct net_device *)data;
struct ath_softc_net80211 *scn = ath_netdev_priv(dev);
do_ath_handle_intr(scn->sc_dev);
}
ath_rx_handler_aponly 是一个do …while(true)的大循环,不断调用ath_rx_process_aponly,
#endif
2016.11.16
1)toolchain buildroot-gcc463重新编译zlib失败,原来的RPT_Platform中zlib包含了.o文件,解压后没有重新编译,所以编译没有提示出错;
2)buildroot-gcc463中/usr/bin/aclocal中脚本执行失败;
提示:
Can't locate Autom4te/ChannelDefs.pm in @INC (@INC contains: /opt/buildroot-gcc463/usr/share/autoconf /etc/perl /usr/local/lib/perl/5.14.2 /usr/local/share/perl/5.14.2 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.14 /usr/share/perl/5.14 /usr/local/lib/site_perl .) at /project/build/../toolchain/buildroot-gcc463/./usr/bin/autoreconf line 40.
代码中是:
use Autom4te::ChannelDefs;
use Autom4te::Channels;
use Autom4te::Configure_ac;
use Autom4te::FileUtils;
use Autom4te::General;
将toolchain里面的相关脚本工具删除,应该使用系统安装的脚本工具。
2016.11.18
流写入函数fwrite多次调用的时候,是在末尾续写内容,而不是重头覆盖。
2016.11.23
ieee80211_recv_asreq 处理收到的请求关联报文;
ieee80211_node_join:处理加入到基础结构型网络的sta
一个umac的ieee80211_node需要一个lmac的ath_node对应;
[ 12.056000] ath_net80211_node_alloc 1539 sizeof ath_node_net80211 is: 2992
2016.11.28
osif_vap_hardstart_aponly 发包函数
ath_tx_start_aponly调用__wbuf_map_sg_aponly尽心dma映射
2016.11.30
ath_tx_txqaddbuf:发送数据包
最后是调用hal层的发包函数ar9300_start_tx_dma,但是这个函数只是返回了true。
2016.12.2
beacon报文有ath_beacon_tasklet 发送,该函数在收包中断ath_handle_intr中执行
WME有四种流类型,分别是:
/* WME stream classes */
#define WME_AC_BE 0 /* best effort */
#define WME_AC_BK 1 /* background */
#define WME_AC_VI 2 /* video */
#define WME_AC_VO 3 /* voice */
struct ath_txq 是LMAC 层用于对应硬件层队列的数据结构,就是说这个数据结构是硬件层队列在LMAC层的抽象。因此该数据结构的实例和硬件队列是1对1对应的关系。在数据结构ath_softc中,ath_txq的维度是10,定位为sc_txq[HAL_NUM_TX_QUEUES]。这个数据结构在LMAC层的代码中引用成txq。
在struct ath_txq中axq_minfree变量是每种数据流需要保证的最小可用buffer数量,在函数ath_txq_setup中设置。
[2016:12:02:17:19:08][ 11.064000] ath_txq_setup 383 qtype = 3 subtype = 0
[2016:12:02:17:19:08][ 11.068000] ath_txq_setup 383 qtype = 1 subtype = 0
[2016:12:02:17:19:08][ 11.072000] ath_txq_setup 383 qtype = 1 subtype = 1
[2016:12:02:17:19:08][ 11.080000] ath_txq_setup 383 qtype = 1 subtype = 2
[2016:12:02:17:19:08][ 11.084000] ath_txq_setup 383 qtype = 1 subtype = 3
[2016:12:02:17:19:08][ 11.088000] ath_txq_setup 383 qtype = 4 subtype = 0
[2016:12:02:17:19:08][ 11.092000] ath_txq_setup 383 qtype = 7 subtype = 0
wlan_acs_find_best_channel查找最佳的channel,但是是通过ic->ic_acs中的ic_flags进行判断,而这个ic_flags的赋值地方好多,不知道是如何决定的这个值的。
2016.12.6
NetBIOS提供的三个基本功能:
名称服务。在 TCP/IP 网络中,计算机具有供人们使用的名称,但计算机通常使用 IP 地址和硬件地址进行通信。在 NetBEUI 中,没有使用 IP 地址,只使用名称和硬件地址。因此,NBT 负责创建 IP 地址,但这在使用 NetBIOS 和 NetBEUI 网络的 SMB/CIFS 上是不需要的。本文的上半部分专门将讨论这个主题。
数据报服务。这是一种网络通信类型,它不会创建永久连接。在 TCP/IP 中,它大致相当于 UDP,所以 NBT 对需要数据报服务的特性使用 UDP,如在本文下半部分中所描述的浏览器选举。
会话服务。NetBIOS 事务为大部分数据传输请求(例如,用户装载文件共享)提供更长时间的连接。这种服务类型逻辑映射到 TCP/IP 协议的 TCP 部分,因此,NBT 对这种连接使用 TCP。
End-nodes support NetBIOS service interfaces and contain
applications.
Three types of end-nodes are part of this standard:
- Broadcast ("B") nodes
- Point-to-point ("P") nodes
- Mixed mode ("M") nodes
10.1 Broadcast (or "B") nodes communicate using a mix of UDP datagrams
(both broadcast and directed) and TCP connections. B nodes may
freely interoperate with one another within a broadcast area. A
broadcast area is a single MAC-bridged "B-LAN". (See Appendix A for
a discussion of using Internet Group Multicasting as a means to
extend a broadcast area beyond a single B-LAN.)
10.2. POINT-TO-POINT (P) NODES
Point-to-point (or "P") nodes communicate using only directed UDP
datagrams and TCP sessions. P nodes neither generate nor listen for
broadcast UDP packets. P nodes do, however, offer NetBIOS level
broadcast and multicast services using capabilities provided by the
NBNS and NBDD.
P nodes rely on NetBIOS name and datagram distribution servers.
These servers may be local or remote; P nodes operate the same in
either case.
10.3. MIXED MODE (M) NODES
Mixed mode nodes (or "M") nodes are P nodes which have been given
certain B node characteristics. M nodes use both broadcast and
unicast. Broadcast is used to improve response time using the
assumption that most resources reside on the local broadcast medium
rather than somewhere in an internet.
M nodes rely upon NBNS and NBDD servers. However, M nodes may
continue limited operation should these servers be temporarily
unavailable.
2016.12.8
_addIpAndDevName2Data 添加Dev name和IP,该IP是通过get_client模块在br_bridge中加的钩子函数解析的。
Base64是一种基于64个可打印字符来表示二进制数据的表示方法。Base64是一种编码方式;Base64主要用于将二进制数据转换为文本数据,方便使用HTTP协议等,是可逆的。处理文本数据的场合,表示、传输、存储一些二进制数据。包括MIME的email,email via MIME,在XML中存储复杂数据
2017.1.13
暂时修改factoryLanMac的默认值;
2017.1.22
#define NM_DEBUG(fmt, args…) \
printf("[NM_Debug](%s) %05d: "fmt"\r\n", __FUNCTION__, __LINE__, ##args)
#define NM_ERROR(fmt, args…) \
printf("[NM_Error](%s) %05d: "fmt"\r\n", __FUNCTION__, __LINE__, ##args)
#define NM_INFO(fmt, args…) \
printf(fmt, ##args)
2017.2.6
NB 0x0020 NetBIOS general Name Service Resource Record
NBSTAT 0x0021 NetBIOS NODE STATUS Resource Record (See NODE
STATUS REQUEST)
1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| NAME_TRN_ID |1| 0x0 |1|0|0|0|0 0|0| 0x0 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0x0000 | 0x0001 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0x0000 | 0x0000 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
/ RR_NAME /
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| NBSTAT (0x0021) | IN (0x0001) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0x00000000 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| RDLENGTH | NUM_NAMES | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +
| |
+ +
/ NODE_NAME ARRAY /
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
/ STATISTICS /
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
The NODE_NAME ARRAY is an array of zero or more NUM_NAMES entries
of NODE_NAME records. Each NODE_NAME entry represents an active
name in the same NetBIOS scope as the requesting name in the
local name table of the responder. RR_NAME is the requesting
name.
2017.2.15 周三
升级文件用一个错误的文件升级,发现cache不断增加,多升级几次后内存不足出错。原因是打开的文件描述符没有关闭,而单单把文件给删除,导致kernel中cached不断增大。
2017.2.20 周一
MTK 的FAE 到公司测试,测试时发现他们的公板对LAN->LAN, wlan->LAN 这种情况, WLAN到LAN可以跑起来,而LAN到LAN不可以
2017.2.21 周二
重新验证bug,确定必定出现的显现。MTK提供了demo软件,我们也提供了demo软件给他,但是关键的plc->lan这个他们那边应该测试部出来。
2017.2.22 周三
IEEE802.3X标准定义了一种新方法,在全双工环境中去实现流量控制,交换机产生一个pause帧,pause帧利用一个保留的组播地址:01-80-c2-00-00-01,它将发送给正在发送的站,站点收到该帧后,就会暂停或者停止发送帧。
pause帧利用了一个保留的组播地址,所以不会被交换机或者网桥转发,这样就不会导致额外的数据量。
2017.2.28
升级时,malloc一个升级文件大小的buffer,malloc提示成功,但是写入这内存是出现内存耗尽。就是说malloc成功实际上不是成功分配可以的物理地址。
malloc函数分配是从memfree和cached两者之和分配内存,但是cached的不能全部被释放,只能释放部分,这个能释放的值不确定,所以malloc还是以Memfree的为关键值。
/tmp # cat /proc/meminfo
MemTotal: 29952 kB
MemFree: 6728 kB
Buffers: 232 kB
Cached: 9608 kB
SwapCached: 0 kB
Active: 3708 kB
Inactive: 10756 kB
Active(anon): 2408 kB
Inactive(anon): 2256 kB
Active(file): 1300 kB
Inactive(file): 8500 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 0 kB
Writeback: 0 kB
AnonPages: 4672 kB
Mapped: 2248 kB
Shmem: 0 kB
Slab: 4920 kB
SReclaimable: 212 kB
SUnreclaim: 4708 kB
KernelStack: 416 kB
PageTables: 272 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 14976 kB
Committed_AS: 8876 kB
VmallocTotal: 1048372 kB
VmallocUsed: 3340 kB
VmallocChunk: 1041856 kB
/tmp # ./testd 20000
main 222 malloc 20000 Kbyte
main 227 malloc error
/tmp # ./testd 15000
main 222 malloc 15000 Kbyte
main 231 malloc 15000 Kbyte
main 232 memcpy begin
wirte 1 M
wirte 2 M
/tmp # ./testd 16000
main 222 malloc 16000 Kbyte
main 227 malloc error
/tmp # ./testd 15000
main 222 malloc 15000 Kbyte
main 231 malloc 15000 Kbyte
main 232 memcpy begin
wirte 1 M
临界值:
/tmp # cat /proc/meminfo
MemTotal: 29952 kB
MemFree: 6784 kB
Buffers: 192 kB
Cached: 9608 kB
SwapCached: 0 kB
Active: 5924 kB
Inactive: 8536 kB
Active(anon): 4660 kB
Inactive(anon): 0 kB
Active(file): 1264 kB
Inactive(file): 8536 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 0 kB
Writeback: 0 kB
AnonPages: 4672 kB
Mapped: 2252 kB
Shmem: 0 kB
Slab: 4900 kB
SReclaimable: 172 kB
SUnreclaim: 4728 kB
KernelStack: 416 kB
PageTables: 276 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 14976 kB
Committed_AS: 8876 kB
VmallocTotal: 1048372 kB
VmallocUsed: 3340 kB
VmallocChunk: 1041856 kB
/tmp # ./testd 15660
main 222 malloc 15660 Kbyte
main 227 malloc error
/tmp #
/tmp # ./testd 15659
main 222 malloc 15659 Kbyte
main 231 malloc 15659 Kbyte
main 232 memcpy begin
wirte 1 M
/tmp # cat /proc/sys/vm/min_free_kbytes
721
/tmp #
2017.3.2
当前文件夹中结合使用grep和xargs来处理文件名: ls | grep -v keep | xargs rm #删除keep文件之外的所有文件,删除除了syslog和msgcenter外的其他目录:ls | grep -v 'syslog\|msgcenter'
例7:删除匹配行和之后两行
$sed '/Storage/,+2d' thegeekstuff.txt
if test "$(BOARD_TYPE)" = "ralink"; then \
cd $(GPL_LINUX_KERNEL_DIR)/ralink && sed -i '/raeth/d' Kconfig && sed -i '/wireless/d' Kconfig; \
cd $(GPL_LINUX_KERNEL_DIR)/drivers/net && sed -i '/wireless/d' Kconfig; \
else \
cd $(GPL_LINUX_KERNEL_DIR)/ralink && sed -i '/wireless/d' Kconfig.source; \
fi;
\后面不能有空格
2017.3.7 周二
将生成gpl的代码独立编写成Makefile.gpl,在主Makefile中include这个Makefile,然后上传两个template文件。
2017.38 周三
国家码标准:https://www.iso.org/obp/ui/#search
MTKiwpriv命令
1.CountryRegion 2.4GHz的国家地区码,不同的地区码信道选择范围不一样,范围是0~7,31~33
iwpriv ra0 set CountryRegion=5
2.CountryRegionABand 5G的国家地区码
3.CountryCode 无线国家码
国家码简写标准:https://www.iso.org/obp/ui/#search
iwpriv ra0 set CountryCode=cn
4.ChannelGeography:信道地理类型
0:Outdoor 1:Indoor 2:Both
5.SSID 无线SSID,1~32 ASCII码
iwpriv ra0 set SSID="AAA"
6.WirelessMode 无线模式
1. legacy 11B only;2.legacy 11A only;3.legacy 11a/b/g mixed;4.legacy 11G only;5.11ABGN mixed
6.11N only in 2.4G; 7.11GN mixed;8.11AN mixed; 9.11BGN mixed; 10.11AGN mixed;11.11N only in 5G;
14.11A/AN/AC mixed 5G band only;15. 11AN/AC mixed 5G band only.
7.Channel 无线channel
Channel=0; 0表示自动扫描;
8.BasicRate 无线支持的基本速率集
1. 1Mbps;2.2Mbps;3.1Mbps,2Mbps;4.5.5Mbps;15.1Mbps,2Mbps,5.5Mbps,11Mbps;
9.Beacon Period Beacon帧的周期
iwpriv ra0 set BeaconPeriod=100
10.DtimPeriod duratin time 1~255
iwpriv ra0 set DtimPeriod=64
11.TxPower 传输功率,0~100
iwpriv ra0 set TxPower=99
12.DisableOLBC
13.BGProtection 启用/禁用 无线11B or 11G保护
0:auto;1:on;2:off
14.MaxStaNum 最大sta连接数量
0:disable 1~32
15.TxAntenna 配置Tx天线数量
iwpriv ra0 set TxAntenna=1
16.RxAntenna 配置Rx天线数量
17.TxPreamble 启用/禁用Tx 前导码
iwpriv ra0 set TxPreamble=0
18.RTSThreshold 设置RTS 阈值 1~2347
19.FragThreshold 设置分片包阈值,256~2346
iwpriv ra0 set FragThreshold=1024
20.TxBurst 启用/禁用Tx burst,0:disable;1:enable
iwpriv ra0 set TxBurst=1
21.PktAggregate 启用/禁用 Tx 帧聚合,0:disable,1:enable
22.NoForwarding 启用或禁用不同的sta的包在相同的SSID转发,0:disable;1:enable
iwpriv ra0 set NoForwarding=0
23.NoForwardingBTNBSSID,禁用或启用在每个BSSID之间不转发0:disable;1:enable
24.NoForwardingMBCast,禁用或启用不抓发组播/多播包
25.HideSSID,禁用或启用隐藏SSID,0:disable;1:enable
iwpriv ra0 set HideSSID=0
26.StationKeepAlive禁用或启用周期性自动检测活跃的sta,0:disable;1:enable
iwpriv ra0 set StationKeepAlive=1
27.ShortSlot,禁用或启用short slot time,0:disable;1:enable
iwpriv ra0 set ShortSlot=1
28.AutoChannelSelect,启用禁用信道自动选则,0,disable;1:旧算法,2:新算法;
29.Debug 设置WLAN debug等级(0~5) 0:off;1:Error;2:Warning;3:Trace;4:Info;5:Loud
iwpriv ra0 set Debug=3
30.DriverVersion 检测无线驱动版本
iwpriv ra0 set DriverVersion=0
31.AccessPolicy 配置访问控制规则,0:允许访问AP,1:禁止访问AP
iwpriv ra0 set AccessPolicy=0
32.ResetCounter,重设计算器
iwpriv ra0 set ResetCounter=1
33.SiteSurvey 请求动作做站点测量
iwpriv ra0 set SiteSurvey=
被动扫描:空串,iwpriv ra0 set SiteSurvey=
主动扫描:目的SSID,iwpriv ra0 set SiteSurvey=Target_SSID
34.CountryString 设置国家
iwpriv ra0 set CountryString=China
35.FixedTxMode设置发送调制模式,CCK OFDM HT
iwpriv ra0 set FixedTxMode=CCK
36.DisConnectSta断开一个指定的STA
iwpriv ra0 set DisConnectSta=00:11:22:33:44:55
37.DisConnectAllSta 断开所有sta
iwpriv ra0 set DisConnectAllSta=1
38.McastPhyMode 设置多播物理模式,0:Disable; 1:CCK;2:OFDM;3:HTMIX
iwpriv ra0 set McastPhyMode=0
39.McastMcs设置多播包的MCS,0~15
iwpriv ra0 set McastMcs=0
40.MaxStaNum 现在每一个BSS可以管理sta的最大值 1~32
iwpriv ra0 set MaxStaNum=0
0:禁用限制
41.AutoFallBack 启用/禁用自动降低速率功能。0:disable; 1:enable
iwpriv ra0 set AutoFallBack=1
42.MBSSWirelessMode 设置MBSS 无线物理方式
iwpriv ra0 set MBSSWirelessMode=1
0:802.11B/G mixed
1:802.11B only
2:801.11A only
4:801.11G only
6:801.11N only
7:801.11G/N mixed
8:801.11A/N mixed
9:801.11B/G/Nmixed
10:801.11A/G/N mixed
11:801.11N in 5G band only
43.HtBw HT信道带宽设置, 0:20MHz;1:20/40 MHz
iwpriv ra0 set HtBw=1
44.HtMcs 设置无线调制编码策略, 0~15,32:fix MCS rate, 33,自动适配
iwpriv ra0 set HtMcs=33
45.HtGi 设置无线guard 间隔,0:长间隔;1短间隔
iwpriv ra0 set HtGi=1
46.HtOpMode 设置HT操作模式,0:HT混合模式,1:HT greenfield模式
iwpriv ra0 set HtOpMode=0
47.HtBaWinSize 设置Block Ack 窗口大小,1~64
iwpriv ra0 set HtBaWinSize=64
48.HtTxBASize 设置一次传输burst中AMPDU聚合包的个数,1~64
iwpriv ra0 set HtBASize=64
49.HtAmsdu 启用禁用A-MSDU,0 禁用,1启用
iwpriv ra0 set HtAmsdu=0
50.HtAutoBa 启用禁用自动block ack,0 禁用,1启用
iwpriv ra0 set HtAutoBa=1
51.HtMimoPs 启用禁用HT MIMMO power save 模式,1:enable,0:disable
iwpriv ra0 set HtMimoPs=1
52.AP2040Rescan 触发HT20/40 coexistence重新扫描,1:触发
iwpriv ra0 set AP2040Rescan=1
53.HtBssCoex 启用禁用HT BSS coexistence,0 禁用,1启用
iwpriv ra0 set HtBssCoex=1
54.AssocReqRssiThres设置关联请求时接收灵敏度的阈值,使拒绝STA的关联请求在弱信号的情况下
iwpriv ra0 set AssocReqRssiThres=-88
0:关闭
0~-100RSSI的值
55.stat 显示无线统计信息
iwpriw ra0 stat
或者:
while [ 1 ]; do iwpriv ra0 set ResetCounter=1; sleep 1; iwpriv ra0 stat; done;
56.get_site_survey 获取扫描信息
iwpriv ra0 get_site_survey
执行该命令前先执行iwpriv ra0 set SiteSurvey=
57.get_mac_table 获取连接到AP的sta的mac地址信息
iwpriv ra0 get_mac_talbe
58.get_ba_table 显示BlackACK table
iwpriv ra0 get_ba_table
59.show 显示信息
iwpriv ra0 show [parameter]
[parameter list]
1. driverinfo
2.stat
3.stainfo
4.stacountinfo
5.stasecinfo
6.bainfo
7.connStatus
8.reptinfo
9.wdsinfo
10.igmpinfo
11.mbss
12.blockch
2017.3.16 周四
这两天一直在跟踪RootAP修改LAN IP后,DUT 不能检测到前端RootAP IP变动的问题。开始反馈这个问题的时候我和测试部
同事验证这个问题,发现没有复现,后来在其他项目上测试时复现了,抓包发现,当RootAP修改了LAN IP后,DHCP server地址池也修改,收到续约包后Dhcpsever返回一个NAK,而这时候正常来说DHCP client要重新发Discover,但是实际上没有发。比较两个拓扑的差异,差异在于一个内网,一个外网。分析原因是因为外网PPPoE拨号,成功后DUT的NTP时间更新了,而内网则不会更新NTP。而在busybox的udhcpc中,会根据当前的时间和上一次发送DHCP Discover报文的时间差,决定是否再次发送Discover包。由于第一次发送DHCP Discover系统时间是默认时间2017.6.1,而NTP更新后,变成2017.3.16,所以不会发送。
2017.3.17 周五
先从flash的配置文件分区config中读出文件,然后MD5校验,解密,解压,然后将解压后的字符串解析成json格式,根root = cJSON_Parse(pRawDataBuf); 然后遍历uclOpModInitArray数组,根据模块名,调用模块的jsonTodata函数指针pEntry->jsonToData(module);,将函数将模块对应的json格式的参数转成模块参数数据结构格式;如果pEntry->jsonToData 为NULL,说明这个模块没有json格式的默认配置,那么则调用pEntry->reset(); 所有模块都处理完之后,调用
函数_usrconf_save保持,_usrconf_save函数中,先构造一个root的json数据跟节点,然后遍历所有模块,调用dataTojson将各个模块的配置信息加入到root中,然后进行压缩,加密,MD5处理,最后调用函数writeConfigFlash写入到到user-config分区。
usrconf_init 函数执行各个模块的初始化,该函数中调用usrconf_load将配置参数(json结构)从用户配置区读出来,然后调用pEntry->jsonToData(module) 将json格式的参数转成模块数据结构格式保持在各个模块的全局地址变量中。 然后调用usrconf_execute_init函数执行各个模块的初始化工作。
对于页面修改某个模块参数后点击保存,则通过ucl_op_processMessage函数中调用usrconf_save进行保存。
2.4g的无线启动时间需要6s
2017.3.20 周一
查看无线的初始化,发现当中设置了br0的mac地址,然后进行down和up的操作。如果没有经这一步,则原来的无线参数在文件rcS中通过脚本进行设置。
无线需要写MAC地址后,SSID生成规则马上生效。
2017.3.24 周五
网桥可以进行MAC地址学习,通过MAC学习建立MAC-PORT的对应关系表。
1.MAC学习:学习MAC地址,起初,网桥是没有任何地址与端口的对应关系的,它发送数据,还是得想HUB一样,但是每发送一个数据,它都会关心数据包的来源MAC是从自己的哪个端口来的,由于学习,建立地址-端口的对照表(CAM表)。
2. 报文转发:每发送一个数据包,网桥都会提取其目的MAC地址,从自己的地址-端口对照表(CAM表)中查找由哪个端口把数据包发送出去。
通过命令brctl showmacs可以查看
~ # brctl showmacs br0
port no mac addr is local? ageing timer
1 00:0a:eb:13:7b:00 no 1.22
1 00:42:20:30:10:38 yes 0.00
1 00:42:20:30:10:39 no 5.78
3 02:42:20:30:10:38 yes 0.00
2 14:cc:20:16:fb:da no 0.56
1 40:61:86:cf:1d:3c no 0.70
1 6c:62:6d:f5:aa:c4 no 128.76
1 ec:17:2f:bb:49:70 no 2.88
40:61:86:cf:1d:3c和ec:17:2f:bb:49:70分别是连接到DUT switch的连个PC有线网卡。 14:cc:20:16:fb:da是连接到DUT的无线网卡。
进入桥的数据报文分为几个类型,桥对应的处理方法也不同:
1. 报文是本机发送给自己的,桥不处理,交给上层协议栈;
2. 接收报文的物理接口不是网桥接口,桥不处理,交给上层协议栈;
3. 进入网桥后,如果网桥的状态为Disable,则将包丢弃不处理;
4. 报文源地址无效(广播,多播,以及00:00:00:00:00:00),丢包;
5. 如果是STP的BPDU包,进入STP处理,处理后不再转发,也不再交给上层协议栈;
6. 如果是发给本机的报文,桥直接返回,交给上层协议栈,不转发;
7. 需要转发的报文分三种情况:
1) 广播或多播,则除接收端口外的所有端口都需要转发一份;
2) 单播并且在CAM表中能找到端口映射的,只需要网映射端口转发一份即可;
3) 单播但找不到端口映射的,则除了接收端口外其余端口都需要转发;
msgcenter通过两个套接字进行信息的转发,一个套接字是udp,绑定的IP是环回ip127.0.0.1,一个是域套接字,绑定文件/tmp/msgcenter
static os_s32 create_udp(void)
{
os_s32 s = 0;
os_s32 send_buf = 0;
os_s32 recv_buf = 0;
//struct timeval tv;
socklen_t buf_len = 0;
struct sockaddr_in server;
if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
log_show("failed to create udp socket: %s", strerror(errno));
return os_err;
}
if (mc_setnonblocking(s) < 0)
{
goto bad;
}
bzero(&server, sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(MC_PORT_SERVER);
if (inet_pton(AF_INET, MC_BIND_UDP_ADDR, &server.sin_addr) <= 0)
{
log_show("failed to inet_pton: %s", strerror(errno));
goto bad;
}
/*
tv.tv_sec = 1;
tv.tv_usec = 0;
if (setsockopt(s, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv)) < 0)
{
log_show("failed setsockop SO_SNDTIMEO: %s", strerror(errno));
goto bad;
}
*/
buf_len = sizeof(os_s32);
if (getsockopt(s, SOL_SOCKET, SO_SNDBUF, &send_buf, &buf_len) < 0)
{
log_show("failed getsockop SO_SNDBUF: %s", strerror(errno));
goto bad;
}
log_info("udp send_buf: %d", send_buf);
send_buf <<= 2;
if (setsockopt(s, SOL_SOCKET, SO_SNDBUF, &send_buf, sizeof(os_s32)) < 0)
{
log_show("failed setsockop SO_SNDBUF: %s", strerror(errno));
goto bad;
}
buf_len = sizeof(os_s32);
if (getsockopt(s, SOL_SOCKET, SO_RCVBUF, &recv_buf, &buf_len) < 0)
{
log_show("failed getsockop SO_RCVBUF: %s", strerror(errno));
goto bad;
}
log_info("udp recv_buf: %d", recv_buf);
recv_buf <<= 2;
if (setsockopt(s, SOL_SOCKET, SO_RCVBUF, &recv_buf, sizeof(os_s32)) < 0)
{
log_show("failed setsockop SO_RCVBUF: %s", strerror(errno));
goto bad;
}
if (bind(s, (struct sockaddr*)&server, sizeof(server)) < 0)
{
log_show("failed to bind: %s", strerror(errno));
goto bad;
}
return s;
bad:
close(s);
return os_err;
}
static os_s32 create_unix(void)
{
os_s32 s = 0;
struct sockaddr_un server;
if ((s = socket(AF_LOCAL, SOCK_DGRAM, 0)) < 0)
{
log_show("failed to create unix socket: %s", strerror(errno));
return os_err;
}
if (mc_setnonblocking(s) < 0)
{
goto bad;
}
unlink(MC_BIND_UNIX_ADDR);
bzero(&server, sizeof(server));
server.sun_family = AF_LOCAL;
strcpy(server.sun_path, MC_BIND_UNIX_ADDR);
if (bind(s, (struct sockaddr*)&server, sizeof(server)) < 0)
{
log_show("failed to bind: %s", strerror(errno));
goto bad;
}
return s;
bad:
close(s);
return os_err;
}
域套接字收到的包类型包括注册,注销和数据包,如果是数据包,则用udp发送到udp server。mc_deliver_data函数将数据包发送到每一个attach的client上。
2017.3.29 周三
周二和周三在整理autoip的问题分析文档,用户使用时发现了这个问题,要求给出问题存在的原因。于是老大要求写份文档分析整个模块的结构问题存在的原因解决方法经验教训等。
为了写这份文档,将DHCP的RFC 2131看了一下,重点是数据包类型和状态机,然后是busybox中的udhcpc的实现,发现和RFC中的描述是有出入的,比如T1/T2的描述,代码中直接的T/2的方式。最后是经验教训,个人写的格局不够高,这个以后要注意一下。
2016.4.7 周五
今天尝试安装和使用pc-lint,安装好工具后,第一步先测试头文件搜索路径
root@vickytong:/toolchain/usr/bin# ./mipsel-linux-gcc-4.6.3 -c -v empty.c
Using built-in specs.
COLLECT_GCC=./mipsel-linux-gcc-4.6.3
COLLECT_LTO_WRAPPER=/toolchain/usr/bin/../libexec/gcc/mipsel-buildroot-linux-uclibc/4.6.3/lto-wrapper
Target: mipsel-buildroot-linux-uclibc
Configured with: /home/ralink/buildroot-2012.11.1/output/toolchain/gcc-4.6.3/configure --prefix=/opt/buildroot-gcc463/usr --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=mipsel-buildroot-linux-uclibc --enable-languages=c,c++ --with-sysroot=/opt/buildroot-gcc463/usr/mipsel-buildroot-linux-uclibc/sysroot --with-build-time-tools=/opt/buildroot-gcc463/usr/mipsel-buildroot-linux-uclibc/bin --disable-__cxa_atexit --enable-target-optspace --disable-libgomp --with-gnu-ld --disable-libssp --disable-multilib --disable-tls --disable-shared --with-gmp=/opt/buildroot-gcc463/usr --with-mpfr=/opt/buildroot-gcc463/usr --with-mpc=/opt/buildroot-gcc463/usr --disable-nls --enable-threads --disable-decimal-float --with-float=soft --with-abi=32 --with-tune=mips32r2 --with-pkgversion='Buildroot 2012.11.1' --with-bugurl=http://bugs.buildroot.net/
Thread model: posix
gcc version 4.6.3 (Buildroot 2012.11.1)
COLLECT_GCC_OPTIONS='-c' '-v' '-mtune=mips32r2' '-mabi=32' '-msoft-float' '-mllsc' '-mno-synci' '-mno-shared'
/toolchain/usr/bin/../libexec/gcc/mipsel-buildroot-linux-uclibc/4.6.3/cc1 -quiet -v -iprefix /toolchain/usr/bin/../lib/gcc/mipsel-buildroot-linux-uclibc/4.6.3/ -isysroot /toolchain/usr/bin/../mipsel-buildroot-linux-uclibc/sysroot empty.c -quiet -dumpbase empty.c -mtune=mips32r2 -mabi=32 -msoft-float -mllsc -mno-synci -mno-shared -auxbase empty -version -o /tmp/ccT99qPW.s
GNU C (Buildroot 2012.11.1) version 4.6.3 (mipsel-buildroot-linux-uclibc)
compiled by GNU C version 4.4.3, GMP version 5.0.5, MPFR version 3.1.1, MPC version 1.0.1
warning: GMP header version 5.0.5 differs from library version 5.0.2.
warning: MPFR header version 3.1.1 differs from library version 3.1.0-p3.
warning: MPC header version 1.0.1 differs from library version 0.9.
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
ignoring duplicate directory "/toolchain/usr/bin/../lib/gcc/../../lib/gcc/mipsel-buildroot-linux-uclibc/4.6.3/include"
ignoring nonexistent directory "/toolchain/usr/bin/../mipsel-buildroot-linux-uclibc/sysroot/usr/local/include"
ignoring duplicate directory "/toolchain/usr/bin/../lib/gcc/../../lib/gcc/mipsel-buildroot-linux-uclibc/4.6.3/include-fixed"
ignoring duplicate directory "/toolchain/usr/bin/../lib/gcc/../../lib/gcc/mipsel-buildroot-linux-uclibc/4.6.3/../../../../mipsel-buildroot-linux-uclibc/include"
#include "…" search starts here:
#include <…> search starts here:
/toolchain/usr/bin/../lib/gcc/mipsel-buildroot-linux-uclibc/4.6.3/include
/toolchain/usr/bin/../lib/gcc/mipsel-buildroot-linux-uclibc/4.6.3/include-fixed
/toolchain/usr/bin/../lib/gcc/mipsel-buildroot-linux-uclibc/4.6.3/../../../../mipsel-buildroot-linux-uclibc/include
/toolchain/usr/bin/../mipsel-buildroot-linux-uclibc/sysroot/usr/include
End of search list.
GNU C (Buildroot 2012.11.1) version 4.6.3 (mipsel-buildroot-linux-uclibc)
compiled by GNU C version 4.4.3, GMP version 5.0.5, MPFR version 3.1.1, MPC version 1.0.1
warning: GMP header version 5.0.5 differs from library version 5.0.2.
warning: MPFR header version 3.1.1 differs from library version 3.1.0-p3.
warning: MPC header version 1.0.1 differs from library version 0.9.
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: 803a9f797010d160a1bef2d33c25729e
COLLECT_GCC_OPTIONS='-c' '-v' '-mtune=mips32r2' '-mabi=32' '-msoft-float' '-mllsc' '-mno-synci' '-mno-shared'
/toolchain/usr/bin/../lib/gcc/mipsel-buildroot-linux-uclibc/4.6.3/../../../../mipsel-buildroot-linux-uclibc/bin/as -EL -no-mdebug -mabi=32 -mno-shared -mtune=mips32r2 -KPIC -o empty.o /tmp/ccT99qPW.s
COMPILER_PATH=/toolchain/usr/bin/../libexec/gcc/mipsel-buildroot-linux-uclibc/4.6.3/:/toolchain/usr/bin/../libexec/gcc/:/toolchain/usr/bin/../lib/gcc/mipsel-buildroot-linux-uclibc/4.6.3/../../../../mipsel-buildroot-linux-uclibc/bin/
LIBRARY_PATH=/toolchain/usr/bin/../lib/gcc/mipsel-buildroot-linux-uclibc/4.6.3/:/toolchain/usr/bin/../lib/gcc/:/toolchain/usr/bin/../lib/gcc/mipsel-buildroot-linux-uclibc/4.6.3/../../../../mipsel-buildroot-linux-uclibc/lib/:/toolchain/usr/bin/../mipsel-buildroot-linux-uclibc/sysroot/lib/:/toolchain/usr/bin/../mipsel-buildroot-linux-uclibc/sysroot/usr/lib/
COLLECT_GCC_OPTIONS='-c' '-v' '-mtune=mips32r2' '-mabi=32' '-msoft-float' '-mllsc' '-mno-synci' '-mno-shared'
root@vickytong:/toolchain/usr/bin#
#include <…> search starts here:显示的就是编译器搜索系统文件的路径,将这些路径在文件options.lnt中记录下来:
-i"Z:\mtk\toolchain\buildroot-gcc463\usr\bin\..\lib\gcc\mipsel-buildroot-linux-uclibc\4.6.3\include"
-i"Z:\mtk\toolchain\buildroot-gcc463\usr\bin\..\lib\gcc\mipsel-buildroot-linux-uclibc\4.6.3\include-fixed" -i"Z:\mtk\toolchain\buildroot-gcc463\usr\bin\..\lib\gcc\mipsel-buildroot-linux-uclibc\4.6.3\..\..\..\..\mipsel-buildroot-linux-uclibc\include"
-i"Z:\mtk\toolchain\buildroot-gcc463\usr\mipsel-buildroot-linux-uclibc\sysroot\usr\include"
-i"Z:\mtk\toolchain\buildroot-gcc463\usr\mipsel-buildroot-linux-uclibc\sysroot\usr\include\linux"
此外,非系统头文件的查找路径也需要在该文件中定义
-i"Z:\apps\develop\private\apps\wifid\include"
-i"Z:\apps\develop\private\apps\wifid\include\mtk"
第二步: gcc -E -dM empty.c >co-gcc.h 查看编译器中定义了哪些宏
# ./mipsel-linux-gcc-4.6.3 -E -dM empty.c > /home/project/co-gcc.h
将文件co-gcc.h放在lint目录下。
第三步:
修改lnt目录下面的文件
首先是std.lnt
// Gnu C/C++ (version 2.95.3 or later), -si4 -sp4, lib-w32.lnt
// Standard lint options
D:\tools\pclint\lnt\co-gcc.lnt
D:\tools\pclint\lnt\lib-w32.lnt
D:\tools\pclint\lnt\options.lnt -si4 -sp4
然后是co-gcc.lnt,在该文件中主要要把库文件的报错屏蔽,-wlib(0)并且显示warming以下的信息-w2
第四步:执行命令测试
D:\tools\pclint>lint-nt -i"D:\tools\pclint\lnt" -u std.lnt Z:\apps\develop\private\apps\wifid\src\mt k\wifi_cmd_mtk.c
在执行是发现一个奇怪的现象,就是检查出头文件问题就停止了,并没有检查后面的代码,后来发现将头文件
#include
2017.4.11 周二
使用pc-lint检查wifi中mtk的代码,发现如果头文件中包含了
Z:\/mtk\toolchain\buildroot-gcc463\usr\mipsel-buildroot-linux-uclibc\sysroot\usr\include\中的string.h重新命令为其他名字,则可以顺利检查。
2017.4.12 周三
使用pc-link检查wifi_platform_mtk.c和wifi_cmd_mtk.c两个文件并且上传svn。过程中对错误信息更加了解,对宏的代码检查经常报错,也许是因为该工具是静态检查代码,而宏的替换在预编译执行的。
2017.4.13 周四
pc-lint检查文件,发现对已一些宏,如CJSON_GETINTOBJITEM(tmp, pnode, "filterRule", (int)pAcl->filterRule),报错误:
Error 63: Expected an lvalue
将这个宏展开后,则没有错误。
2017.4.18 周二
sed 's/.$//' 该命令去除DOS 格式文件中行尾CR/LF 为 UNIX的LF.
2017.4.19 周三
2017.4.20 周四
~ # brctl show
bridge name bridge id STP enabled interfaces
br0 8000.50c7bfa05abc no eth1
eth0
ath0
分析这个问题,需要查看switch的状态
2017.4.21 周五
查看datasheet,发现switch寄存器和主芯片寄存器是不一样的,对于主芯片,寄存器是统一的编程地址,GMAC是主芯片的一部分,所以对GMAC的配置的寄存器也是通过统一编程地址实现,而对于switch,可以视作独立的硬件,对它的配置和访问,还有PHY,通常则是通过媒体无关接口RGMII/SGMII传址和传值。
从代码上看,在头文件athrs27_phy.h中进行定义,如:
这部分是交换机的寄存器,对应datasheet中的8.18章
#define S27_MASK_CTL_REG 0x0000
#define S27_OPMODE_REG0 0x0004
#define S27_OPMODE_REG1 0x0008
#define S27_OPMODE_REG2 0x000C
#define S27_PWRSTRAP_REG 0x0010
#define S27_GLOBAL_INTR_REG 0x0014
#define S27_GLOBAL_INTR_MASK_REG 0x0018
#define S27_FLD_MASK_REG 0x002c
#define S27_FLCTL_REG0 0x0034
#define S27_FLCTL_REG1 0x0038
#define S27_ARL_TBL_FUNC_REG0 0x0050
#define S27_ARL_TBL_FUNC_REG1 0x0054
#define S27_ARL_TBL_FUNC_REG2 0x0058
#define S27_ARL_TBL_CTRL_REG 0x005c
#define S27_TAGPRI_REG 0x0070
#define S27_CPU_PORT_REGISTER 0x0078
#define S27_MDIO_CTRL_REGISTER 0x0098
而读的函数接口
unsigned int athrs27_reg_read(unsigned int s27_addr) 和void athrs27_reg_write(unsigned int s27_addr, unsigned int s27_write_data)中,使用的是物理地址和寄存器地址。
而对于读写phy,则通过写固定的phy信息数组athrPhyInfo进行访问。
unsigned int s27_rd_phy(int ethUnit,unsigned int phy_addr, unsigned int reg_addr) 这里的reg_addr就是datasheet中说明的地址。
/*****************/
/* PHY Registers */
/*****************/
#define S27_PHY_CONTROL 0
#define S27_PHY_STATUS 1
#define S27_PHY_ID1 2
#define S27_PHY_ID2 3
#define S27_AUTONEG_ADVERT 4
#define S27_LINK_PARTNER_ABILITY 5
#define S27_AUTONEG_EXPANSION 6
#define S27_NEXT_PAGE_TRANSMIT 7
#define S27_LINK_PARTNER_NEXT_PAGE 8
#define S27_1000BASET_CONTROL 9
#define S27_1000BASET_STATUS 10
#define S27_MMD_CTRL_REG 13
#define S27_MMD_DATA_REG 14
#define S27_PHY_FUNC_CONTROL 16
#define S27_PHY_SPEC_STATUS 17
#define S27_PHY_INTR_ENABLE 18
#define S27_PHY_INTR_STATUS 19
#define S27_PHY_EXTEND_PHY_SPEC 20
#define S27_DEBUG_PORT_ADDRESS 29
#define S27_DEBUG_PORT_DATA 30
这部分是PHY的寄存器,对应datasheet中的8.20
2017.4.24 周一
MTK中,判断是否存在雷达信号的函数是SWRadarCheck,检查函数有tasklet进行调度,函数实现共600多行。
预先设定了雷达的参数,不同的认证标准参数值不同,然后这些参数和PRADAR_DETECT_STRUCT pRadarDetect = &pAd->CommonCfg.RadarDetect中检测到的参数进行比较,得出是否存在雷达信号。
2017.4.25 周二
MTK的无线设备是PCI总线的设备,设备的数据结构是rt_pci_driver,通过函数pci_register_driver(&rt_pci_driver)进行调用。在设备的成员函数中有成员函数probe: rt_pci_probe,,该函数是一个探针函数,在挂载设备的驱动时,调用rt_pci_probe探针函数进行设备的初始化。
探针函数rt_pci_probe调用函数RtmpPhyNetDevInit,RtmpPhyNetDevInit中注册了发包函数:
pNetDevHook->xmit = rt28xx_send_packets;
2017.4.26 周三
函数首部代码占用另外一个寄存器的值s8(通常的别名是fp),把它设置为sp刚开始的值。
fp 帧指针寄存器(frame pointer):CPU通用寄存器($30),有是用来表示一个栈帧的基址。
栈帧:一个具有函数所有的栈空间的片段;在一些函数中,栈空间的大小是位置的,比如用定义可变长度的数组,这时候通过栈帧指针记录变化后的栈空间,这时栈帧指针可能会比栈指针大。如果发生栈溢出,那么可能出现栈帧指针被改写。
2017.4.27 周四
MTK无线MAC/BBP寄存器使用的映射地址是从1030.0000到103F.FFFF开始,映射到MIP上的位置是从0XB030.0000到0xB03F.0000,这个地址umapped
,uncached的地址,在代码中,函数rt2880_module_init的初始化时就给赋值基地址。
#define RTMP_MAC_CSR_ADDR 0xB0300000
#define RTMP_MAC_IRQ_NUM 4
csr_addr = (unsigned long)RTMP_MAC_CSR_ADDR;
dev_irq = RTMP_MAC_IRQ_NUM;
网络设备通过RTMP_DRIVER_MAIN_INF_CREATE(pAd, &net_dev);(该宏其实是封装了的函数RtmpPhyNetDevMainCreate)创建一个以太网类型的网络设备,通过设备的私有数据区关联一个无线设备。
pDevNew = RtmpOSNetDevCreate((INT32)MC_RowID, (UINT32 *)&IoctlIF,
INT_MAIN, 0, sizeof(struct mt_dev_priv), dev_name);
以太网设备的私有数据结构:
struct mt_dev_priv{
void *sys_handle;
void *wifi_dev;
unsigned long priv_flags;
UCHAR sniffer_mode;
}; 当中的wifi_dev就是无线设备的指针。
RtmpOSFileOpen 在内核态中打开无线的配置文件,其实现函数是filp_open,该函数返回 strcut file*结构指针,供后续操作使用。如读取文件内容:
int RtmpOSFileRead(RTMP_OS_FD osfd, char *pDataPtr, int readLen)
{
/* The object must have a read method */
if (osfd->f_op && osfd->f_op->read) {
return osfd->f_op->read(osfd, pDataPtr, readLen, &osfd->f_pos);
} else {
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("no file read method\n"));
return -1;
}
}
然后初始化pNetDevHook,该pNetDevHook 通过函数RtmpOSNetDevAttach赋值给网络设备。
pNetDevHook->open = MainVirtualIF_open;
pNetDevHook->stop = MainVirtualIF_close;
pNetDevHook->xmit = rt28xx_send_packets;
2017.5.2 周二
Lex Lex 是一种生成扫描器的工具。扫描器是一种识别文本中的词汇模式的程序
Yacc 代表 Yet Another Compiler Compiler。 Yacc 的 GNU 版叫做 Bison。它是一种工具,将任何一种编程语言的所有语法翻译成针对此种语言的 Yacc 语 法解析器。它用巴科斯范式(BNF, Backus Naur Form)来书写。按照惯例,Yacc 文件有 .y 后缀
2017.5.4 周四
函数sock_open(const char *ifname, unsigned short etherType)
ifname 是设备的名称,这里是br0; etherType是包类型,这里是0x8f83。就是说这个函数直接打开了监听br0设备并且包类型是0x8f83的数据包。
关键是bind的实现
static int wc_bind(int sockfd, int ifindex, unsigned short protocol, char *errbuf)
{
struct sockaddr_ll sll;
memset(&sll, 0, sizeof(sll));
sll.sll_family = AF_PACKET;
sll.sll_ifindex = ifindex;
sll.sll_protocol = htons(protocol);
if (-1 == bind(sockfd, (struct sockaddr *)&sll, sizeof(sll)))
{
return -1;
}
return 0;
}
因为是直接发送二层包,所以需要判断要发送的数据包长度是否超过MTU,如果超过,需要多次发送,见函数_sendBigPkt。
一个简单实用的条件判断宏:
#define JUDGE_ERROR(string, condition, operation) \
do { \
if (condition) \
{ \
printf("%s\n", string); \
operation; \
} \
}while(0)
2017.5.10 周三
跟踪uboot升级软件出现的问题,发现原来是刷用户配置区的函数中使用了malloc 64KByte字节长度,但是malloc失败,导致升级错误。但是奇怪的是重新烧一次flash后,问题消失了。
2017.5.11 周四
关于关于fe_reset导致DUT重启卡死的问题,反馈是要先关闭DMA,然后再注销收包的tasklet:
int ei_close(struct net_device *dev)
{
…
fe_reset(); ç 搬到 tasklet kill 前做,將 FE 先停住
//tasklet_kill(&ei_local->tx_tasklet); ç remove it
tasklet_kill(&ei_local->rx_tasklet);
…
}
2017.5.12 周五
raeather.c中配置MAC地址,MAC地址共6字节,其中高2字节写入一个寄存器中,低4字节写入另外一个寄存器中,通过2个寄存器进行MAC地址的配置;
收包模式三种,一个是NAPI,一个是tasklet,一个是workqueue。现在驱动中使用的是tasklet,以太网驱动版本是v3.1。
在ei_open函数中注册中断处理函数:
err = request_irq( dev->irq, ei_interrupt, IRQF_DISABLED, dev->name, dev); // try to fix irq in open
中断函数主要读取中断状态寄存器的值,然后通过函数tasklet_hi_schedule(&ei_local->rx_tasklet);调度tasklet,
tasklet执行的函数通过tasklet_init(&ei_local->rx_tasklet, ei_receive, 0);进行注册。
2017.5.26 周五
和测试部讨论小米6导致DUT死机的问题,使用最新的MIUI版本8.2.23重新测试,没出现问题,查看出问题的小米miui版本是8.2.22,就是说更新了一版解决了这个问题。
2017.5.27 周六
看DMA使用的函数接口,特别是dma_map_single,pci_alloc_consistent的使用方法。
下午查阅到一个如何调试死机,连串口都唔反应的bug调试方法。通过JTAG工具,查看死机是cpu运行的位置和调用栈信息;然后通过反汇编得到这个位置所属的代码片段;最后查阅代码是wportal.ko中对TCP选项解析出现问题,TCP选项中EOL和NOP只有TYPE,没有长度,所以当收到这种包时,解析的while循环中当前指针位置按长度向前解析下一个option,但是EOL和NOP长度为0,所以指针不会移动,那么就出现死循环。
myModule: version magic '2.6.36+ mod_unload MIPS32_R2 32BIT ' should be '2.6.36 mod_unload MIPS32_R2 32BIT '
2017.5.31 周三
先解释一下task_pt_regs,在前面的描述中,内核栈高地址部分压入了通用寄存器及用户栈指针信息,这些寄存器作为一个整体pt_regs存放在栈高地址部分(内核struct pt_regs结构)。task_pt_regs返回的就是pt_regs的起始地址。
手机扫一扫
移动阅读更方便
你可能感兴趣的文章