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
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
[<c09559bc>] ath_tx_paprd_init+0x3d4/0x578 [ath_dev]
[<c094be00>] ath_tx_init+0xbc/0x18c [ath_dev]
[<c0a913e0>] __ath_attach+0xd4/0x288 [umac]
[<c0a91c94>] init_ahb+0x1c0/0x26c [umac]
[<c0ad9040>] init_module+0x40/0x6c [umac]
[<80002468>] _stext+0x68/0x1ec
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
sudo apt-get install libacl1-dev
P0 P1 P2-P5
CPU WAN LAN
*/
* Port map
* P0 P5 P1-P4
* CPU WAN LAN
*/
export INSTALL_ROOT_FOR_BOARD=$(TOPDIR)/rootfs.$(BOARD_TYPE)
rm -Rf $(INSTALL_ROOT_FOR_BOARD)
cp -Rf $(INSTALL_ROOT) $(INSTALL_ROOT_FOR_BOARD)
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 '
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 ))
#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)
mv y.tab.c cfparse.c
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 | 移除参数 |
{
skb->mark = CONVERT_PORT_ID (get_portid(vid));
}
{
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)])
{
for(;;)
{
ath_reg_wr(ATH_RESET, ATH_RESET_FULL_CHIP);
}
}
{
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);
}
2.屏蔽掉所有非IPv6的包。
约定:
wan口eth1
lan口eth0、wlan0、wlan1
依赖:
ebtables、birdge-utils
命令样例
- 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
$ 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)
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 */
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
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
echo "0" > /proc/sys/vm/oom-kill
vi /etc/sysctl.conf
vm.oom-kill = 0
echo 1 > /proc/sys/vm/drop_caches
{
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++] = '"';
}
{
buffer[j++] = '\''';
buffer[j++] = "%";
}
}
buffer[j] = 0;
return buffer;
}
[<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
[<c0e5d74c>] fat_write_begin+0x54/0x60 [fat]
[<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
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)
OutBuffer = (char *)malloc(BUFFER_SIZE + LARGE_WRITEX_HDR_SIZE + SAFETY_MARGIN);
[<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
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);
{
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];
}
}
svn merge -r HEAD:888 ./testsvn
svn ci -m "*)roll back to ver888"
#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
172.16.0.0~172.31.255.255
192.168.0.0~192.168.255.255
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
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
{
return (desc->bInterfaceClass == USB_CLASS_WIRELESS_CONTROLLER &&
desc->bInterfaceSubClass == 1 &&
desc->bInterfaceProtocol == 3);
}
0x02, 0x16),
.driver_info = (unsigned long)&cdc_ncm_info,
},
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); \
# echo 2 > /proc/sys/vm/drop_caches
To free pagecache, dentries and inodes:
echo 3 > /proc/sys/vm/drop_caches
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)
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
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);
# cat passwd
root:x:0:0:root:/root:/bin/sh
admin:x:500:500:admin:/tmp/dropbear:/bin/sh
842 FTP正常的时候
# cat passwd
root:x:0:0:root:/root:/bin/sh
nobody:x:65534:65534:nobody:/home:/bin/sh
bin:x:1:1:bin:/bin:/bin/sh
admin:x:500:500:admin:/home:/bin/sh
guest:x:500:500:guest:/home:/bin/sh
LAN_FACT_IF_NAME = eth0.1
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
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
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
3G USB的灯是GPIO26控制,高电平点亮。
USB电源使能用的GPIO8控制,高电平使能
(*p)++是先取出*p的值,让这个值++
*(P++)是先取出*p的值,让p++
所以,*p++等价于*(P++)
#define IF_RA_MANAGED 0x40
#define IF_RA_OTHERCONF 0x40
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
升级软件:apt-get upgrade
更新系统:apt-get dist-upgrade
2.3、安装基础编译环境
1 | apt-get install build-essential |
2.3、编译安装 Zlib 库 (可不装)
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 |
2.4、卸载旧版本 OpenSSL
1 2 | apt-get purge openssl rm -rf /etc/ssl #删除配置文件 |
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 ,
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
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
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权限
我们用dmesg 就可以看到 产生的内核信息啦,Hello world!
$(SCRIPT_DIR)/feeds update -a
$(SCRIPT_DIR)/feeds install -a
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
< --- & lt ;
> --- & gt ;
' --- & apos ;
" --- & quot ;
["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
var URL_UPNP_SERVICE = $.su.url("/admin/upnp?form=service"); //data/upnp.json
enable = {
["read"] = {cb = read_enable},
["write"] = {cb = write_enable}
},
service = {
[".super"] = {cb = get_clients}
}
}
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
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)
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)
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
{
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));
}
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);
CONFIG_GPIO_WIFI_SW_HOLD_TIME=3
ath_dev.ko ath_pktlog.ko
3
MemFree: 7972 kB
Buffers: 1504 kB
end
function _index()
return ctl._index(dispatch)
end
function index()
entry({"admin", "quick_setup"}, call("_index")).leaf = true
end
local dispatch_tbl = {
quick_setup = {
["read"] = {cb = read},
["write"] = {cb = write}
},
check_internet = {
[".super"] = {cb = check_internet}
},
check_router = {
[".super"] = {cb = check_router}
}
}
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
我们也遇到了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大小。
设备通过对外发送免费ARP报文来实现以下功能:
- 确定其它设备的IP地址是否与本机的IP地址冲突。当其它设备收到免费ARP报文后,如果发现报文中的IP地址和自己的IP地址相同,则给发送免费ARP报文的设备返回一个ARP应答,告知该设备IP地址冲突。
- 设备改变了硬件地址,通过发送免费ARP报文通知其它设备更新ARP表项。
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
单引号‘’:取消除单引号以外的任何字符的特殊含义。
如:echo ‘my name is $name’其结果为:my name is $name,此时$只作为一个普通字符使用了。
双引号“”:取消除双引号、$号以及_号以外的所有字符的特殊含义
单引号是强引用,引号里的值是什么,变量的值就是什么;
双引号是弱引用,引号里的值若再包含变量,那在赋值的时候,所有这些变量就被立即替换了。
802.11g也如a是一样的意思,只不过。由于802.11g只有1、6、11这3个信道,所以使用40M频宽的信道时只剩下了一个不重叠信道,所以在使用802.11ng时,不建议使用40MHz的频宽,使用默认的20MHz频宽即可
override BOARD_TYPE = board956x
export REAL_BOARD_TYPE := $(BOARD_TYPE)
endif
·在多径环境下,后一符号的前端有可能比前一符号的末端更快到达接收机,从而导致符号间产生干扰。保护间隔是前后符号间的一段空白时间,可以为延迟信号提供更长的缓冲时间。
·保护间隔长度根据多径状态选择,802.11a/g使用800ns的保护间隔,802.11n默认也采用800ns的保护间隔,但一定环境下可以采用400ns的保护间隔
{
u32 owner;
u16 type;
u16 length;
u8 data[0];
} __attribute ((packed)) UCM_MSG_BODY;
./hpAVCommon.o: could not read symbols: Bad value
例如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的。
$n 第n个参数值,n=1..9
$* 所有命令行参数
$@ 所有命令行参数,如果它被包含在引号里,形如”$@”,则每个参数也各自被引号包括
$# 命令行参数个数
$$ 当前进程的进程ID(PID)
$! 最近后台进程的进程ID
$? 最近使用命令的退出状态
make[3]: arm-uclibc-linux-2.6.36-strip: Command not found
(.text+0x2051c): undefined reference to `eraseRadioFlash'
@$(call makemod, $(TP_KERNEL_MODULES)/br_guest_filter, br_guest_filter.ko);
$(call mkrule, parentCtrl):
@$(call makemod, $(TP_KERNEL_MODULES)/parentCtrl, parentCtrl.ko);
ath_gpio_config_output (GPIO_LED_POWER);
//LOW LEVEL TURN ON ALL
ath_gpio_out_val(GPIO_LED_POWER, 1);//ZQQ
#endif
./include/wrn/wm/common/wmData.h:29: warning: useless type name in empty declaration
./include/wrn/wm/common/wmData.h:30: warning: useless type name in empty declaration
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'
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
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 '
[ 0.776000] [<800f02c8>] unlzma+0xfb4/0x118c
[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:
[usrcfg_error: usrconf_load:916]md5 verify error[ 3.088000] Now flash open!
MemTotal: 15384 kB
MemFree: 3420 kB
Buffers: 12 kB
Cached: 1544 kB
SwapCached: 0 kB
@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 $@
-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)
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
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;
(*fn)(gd->ram_size);
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
UINT32 CountryNum;
UINT8 IsoName[3];
char* pCountryName;
BOOL SupportABand;
UINT8 RegDomainNum11A;
BOOL SupportGBand;
UINT8 RegDomainNum11G;
} COUNTRY_CODE_TO_COUNTRY_REGION;
{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}
};
"AUTO",
"11B",
"11G",
"11NGHT20",
"11NGHT40",
"11NGHT40PLUS",
"11NGHT40MINUS",
"11A",
"11NAHT20",
"11NAHT40",
"11NAHT40PLUS",
"11NAHT40MINUS",
"11ACVHT20",
"11ACVHT40",
"11ACVHT40PLUS",
"11ACVHT40MINUS",
"11ACVHT80",
};
[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 )
[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
Wireless tools for Linux是一个Linux命令行工具包,用来设置支持Linux Wireless Extension的无线设备。
Wireless Tools (WT)就是用来操作Wireless Extensions的工具集,它包括以下工具:
iwconfig:设置基本无线参数
iwlist:扫描、列出频率,比特率,密钥等
iwspy:获取每个节点链接的质量
iwpriv:操作Wireless Extensions 特定驱动
{
int ret = 0;
ret = ucl_op_addUcMod(iModIndex, ucWifiInfo);
ret |= ucl_op_addMod(iModIndex, opWifiFun);
return ret;
}
#define WIFI_BAND_MODE_2G 1
#define WIFI_BAND_MODE_5G (1 << 1)
#define WIFI_BAND_MODE_CONCURRENT 3
WPA2 (WPA 第二版) 是 Wi-Fi 联盟对采用 IEEE 802.11i 安全增强功能的产品的认证计划。简单一点理解,WPA2是基于WPA的一种新的
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用于讯息完整性的运算
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
ath0 getmac:14:CC:20:16:FB:DA
14:CC:20:16:FB:DB
5250MHz-5350MHz
5470MHz-5725MHz
5725MHz-5850MHz
11n有两种频宽模式:HT(High Throughput)20和HT40。
HT20是出于兼容性考虑:比如,一个区域内存在11b/g信号,那么为了尽量减少对它们的干扰,需要设定为HT20,以减少频带的重叠。
HT40是出于高性能考虑:HT40相当于两个HT20的捆绑,一个是主,一个是辅。主信道发送beacon报文和部分数据报文,辅信道发送其他报文。
由于HT40所需带宽为40M,在一个蜂窝式无线覆盖区域最好不要在2.4GHz使用,最好在5GHz使用。
#define WIFI_CONFIG_GUEST_NETWORK (1 << 2)
#define WIFI_CONFIG_PARENT_CTRL (1 << 3)
#define WIFI_CONFIG_REGION (1 << 4)
[ 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
{
"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
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.am是一种比Makefile更高层次的规则。只需指定要生成什么目标,它由什么源文件生成,要安装到什么目录等构成。 表一列出了可执行文件、静态库、头文件和数据文件,四种书写Makefile.am文件个一般格式。
表 1Makefile.am一般格式
对于可执行文件和静态库类型,如果只想编译,不想安装到系统中,可以用noinst_PROGRAMS代替bin_PROGRAMS,noinst_LIBRARIES代替lib_LIBRARIES。 Makefile.am还提供了一些全局变量供所有的目标体使用:
表 2 Makefile.am中可用的全局变量
在Makefile.am中尽量使用相对路径,系统预定义了两个基本路径:
表 3Makefile.am中可用的路径变量
export INSTALL_ROOT_FOR_BOARD := $(IMAGEPATH)/rootfs.board
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: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
{
if (ll < MAX_NUM_OF_CHANNELS)
pChannelInfo->dirtyness[ll]++;
}
{
if (ll >= 0)
pChannelInfo->dirtyness[ll]++;
}
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);
}
[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 ...
OBJS = $(foreach dir,$(DIRS),$(wildcard $(dir)/*.o $(dir)/*.a $(dir)/*.bin))
clean:
@rm -f $(OBJS)
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
在执行是发现一个奇怪的现象,就是检查出头文件问题就停止了,并没有检查后面的代码,后来发现将头文件<string.h>屏蔽掉,就可以了
#include <string.h>
2017.4.11 周二
使用pc-lint检查wifi中mtk的代码,发现如果头文件中包含了<string.h>,则检查不能执行,解决方法是将:
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的起始地址。