查看: 4581|回复: 1

【Marvell ESPRESSObin】家用网络交换

[复制链接]
  • TA的每日心情
    奋斗
    2017-5-23 16:15
  • 签到天数: 12 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2017-4-29 14:10:10 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 cruelfox 于 2017-4-29 14:30 编辑

    ESPRESSObin 板子上有三个 RJ45 以太网口,是否等于它有三块网卡呢?从系统结构框图里看是这样的:
    diagram.png

    实际上 SOC 外面的连接只有一路 RGMII,连到了交换芯片上,然后交换芯片再出来三个 RJ45 网口。所以相当于是 SOC 有一个网卡,连到交换机上,交换机另外还有三个网口供连接外部的网络设备。我当成这样来理解,所以 Linux 下看到的 eth0 就是 SOC 的网口了,但是 ifconfig eth0 配置静态 IP 地址不能使用。所以这和单网口出来连个外部交换机还是有所差别的,之前已经有网友指出来了。

    在 Linux 下面查看 /sys 文件系统,可以发现网络设备有好几个:
    sys_class_net.png
    除了eth0, 还多出来了 lan0, lan1, wan  这三个,是属于dsa的,dsa是"Distributed Switching Architechure", 也就是那个交换芯片。Linux 竟然知道交换芯片上有三个网口。也难怪啊,SOC 和交换芯片之间还有其它数据通道,可以传输配置信息吧。我对网络协议不精通,物理上交换芯片的网口怎么边成逻辑上 Linux 的网络设备的,也就是相当于系统有三块以太网卡的?

    用 ifconfig 来配置 lan0, lan1 或 wan 都是可以的,这样就容易实现软路由了。我想在文件服务弄好之前还是先把 ESPRESSObin 当作交换机来用吧。拨号网络和路由功能还是由现在家中的路由器负责:
    homenet.PNG

    Wi-Fi 的部分使用 EPRESSObin 上的 mini PCI-e 接一个笔记本无线网卡。编译内核试了多次,终于把驱动搞定。也就是能识别出 wlan0 设备。为了搭建无线AP热点,需要先安装一些软件,有线网络设置好之后用 apt-get 下载即可。
    # apt-get install bridge-utils wireless-tools hostapd iw wpasupplicant

    为了实现网络交换,需要把 wan, lan0, lan1 这三个网口的包进行转发。和三块独立的网卡不同的是,ESPRESSObin 上这三个网口本来就是在交换机上的,交换机硬件自动转发就可以了,不需要 Linux 软件参与。不过也必须要先设置一下的。
    # brctl addbr br0
    这是创建一个网桥设备
    # brctl addif br0 wan
    # brctl addif br0 lan0
    # brctl addif br0 lan1

    这是把 wan, lan0, lan1 三个口添加到网桥当中,它们的包自动转发。如上图,PC和笔记本都通过路由器的DHCP来获得IP地址。而访问 ESPRESSObin 本身的网络服务,需要给 br0 分配一个IP地址,执行
    # dhclient br0

    这样有线网络的交换就可以工作了。无线部分,先要 wlan0 成为一个 Wi-Fi 热点,可以用 hostapd 这个软件服务。(wpa_supplicant也可以搭建Wi-Fi,也许更好,可惜我没能搞定)
    先编写一个 hostapd.conf 文件,例如
    1. interface=wlan0
    2. driver=nl80211
    3. ssid=ESPRESSO-wifi
    4. hw_mode=g
    5. channel=1
    6. wpa_passphrase=eeboard.com
    7. wpa=2
    8. wpa_pairwise=CCMP
    复制代码
    然后执行
    # hostapd -B hostapd.conf
    接下来在手机WLAN里面应该就能看到 ESPRESSO-wifi 这个热点了。但是还不能接入,不会分配 IP 地址。要把 wlan0 这个网络桥接到前面创建的 br0 中,由路由器的 DHCP 来分配IP地址。
    # brctl addif br0 wlan0
    这样,Wi-Fi的设备可以访问家庭网络中的任何服务器,和有线网的设备一样。也可以从路由器的 NAT 访问外部网络。

    目前有点问题,不知道是否是无线网驱动的原因。在我LP用Ipad无线上网看电视剧的时候,ESPRESSObin 会出现间歇性的卡死,SSH都不能操作,top看到 kworker某个进程占用大量的CPU
    top.PNG
    后来我检查 dmesg, 看到有异常:
    1. [ 3380.557985] INFO: rcu_preempt self-detected stall on CPU
    2. [ 3380.563320]  0-...: (1 GPs behind) idle=703/140000000000002/0 softirq=48882/48883 fqs=5239
    3. [ 3380.571949]   (t=5250 jiffies g=22228 c=22227 q=1232)
    4. [ 3380.577352] Task dump for CPU 0:
    5. [ 3380.577358] kworker/0:2     R  running task        0  1507      2 0x00000002
    6. [ 3380.577381] Workqueue: events_power_efficient phy_state_machine
    7. [ 3380.577387] Call trace:
    8. [ 3380.579562] [<ffffffc0000880a0>] dump_backtrace+0x0/0x118
    9. [ 3380.579571] [<ffffffc0000881cc>] show_stack+0x14/0x20
    10. [ 3380.579582] [<ffffffc0000c55fc>] sched_show_task+0xa4/0x108
    11. [ 3380.579590] [<ffffffc0000c7918>] dump_cpu_task+0x40/0x50
    12. [ 3380.579600] [<ffffffc0000ea4f0>] rcu_dump_cpu_stacks+0xa0/0xf0
    13. [ 3380.579609] [<ffffffc0000ee2b4>] rcu_check_callbacks+0x4cc/0x8c8
    14. [ 3380.579620] [<ffffffc0000f1d2c>] update_process_times+0x3c/0x70
    15. [ 3380.579629] [<ffffffc000100cb8>] tick_sched_handle.isra.6+0x40/0x50
    16. [ 3380.579637] [<ffffffc000100d0c>] tick_sched_timer+0x44/0x90
    17. [ 3380.579647] [<ffffffc0000f26d4>] __hrtimer_run_queues+0xec/0x170
    18. [ 3380.579656] [<ffffffc0000f2a68>] hrtimer_interrupt+0xa0/0x1d8
    19. [ 3380.579668] [<ffffffc0006c2f88>] arch_timer_handler_phys+0x30/0x40
    20. [ 3380.579679] [<ffffffc0000e3e18>] handle_percpu_devid_irq+0x78/0xa0
    21. [ 3380.579689] [<ffffffc0000df7dc>] generic_handle_irq+0x24/0x38
    22. [ 3380.579699] [<ffffffc0000dfadc>] __handle_domain_irq+0x5c/0xb8
    23. [ 3380.579707] [<ffffffc000080de0>] gic_handle_irq+0xb8/0x158
    24. [ 3380.579715] Exception stack(0xffffffc038dd2a60 to 0xffffffc038dd2b80)
    25. [ 3380.579725] 2a60: 0000000000000008 ffffffc0393fd480 ffffffc038dd2bb0 ffffffc00009a0d4
    26. [ 3380.579734] 2a80: 0000000080000145 ffffffc038dd0000 ffffffc038dd2c78 ffffffc038dd3008
    27. [ 3380.579743] 2aa0: 0000000000000000 ffffffc038dd2bf4 ffffffc0393fd500 000000000000000a
    28. [ 3380.579752] 2ac0: 0000000000001000 00000000f745c0e7 0000000000000018 0000000000000000
    29. [ 3380.579760] 2ae0: ffffffc000ba6800 0000000000000000 0000000000000800 0000000000000000
    30. [ 3380.579769] 2b00: 0000000000000001 ffffffc038d0f630 ffffffc00082eb18 0000000000000007
    31. [ 3380.579778] 2b20: 000000000000000e 0000000000000008 ffffffc0393fd480 ffffffc038dd2c78
    32. [ 3380.579787] 2b40: ffffffc0393fd500 0000000000000000 ffffffc038dd0000 ffffffc038dd2ff0
    33. [ 3380.579796] 2b60: ffffffc038dd2fe0 0000000000000008 00000000ffffffff ffffffc038dd2bb0
    34. [ 3380.579805] [<ffffffc000083da8>] el1_irq+0x68/0xd8
    35. [ 3380.579814] [<ffffffc000099f9c>] ccm_encrypt+0x1d4/0x1e0
    36. [ 3380.579825] [<ffffffc000822f00>] ieee80211_aes_ccm_encrypt+0x140/0x160
    37. [ 3380.579835] [<ffffffc0008149b4>] ieee80211_crypto_ccmp_encrypt+0x1d4/0x230
    38. [ 3380.579845] [<ffffffc00082f208>] invoke_tx_handlers+0xc08/0xcb8
    39. [ 3380.579855] [<ffffffc000830f74>] ieee80211_tx+0x74/0x110
    40. [ 3380.579863] [<ffffffc000831098>] ieee80211_xmit+0x88/0xb0
    41. [ 3380.579873] [<ffffffc000831a9c>] __ieee80211_subif_start_xmit+0x46c/0x5c0
    42. [ 3380.579882] [<ffffffc000831c00>] ieee80211_subif_start_xmit+0x10/0x20
    43. [ 3380.579894] [<ffffffc0007200c4>] dev_hard_start_xmit+0x244/0x308
    44. [ 3380.579904] [<ffffffc00073e150>] sch_direct_xmit+0x138/0x220
    45. [ 3380.579913] [<ffffffc000720624>] __dev_queue_xmit+0x324/0x4b0
    46. [ 3380.579923] [<ffffffc0007207c0>] dev_queue_xmit+0x10/0x18
    47. [ 3380.579934] [<ffffffc0007ae6cc>] br_dev_queue_push_xmit+0xfc/0x120
    48. [ 3380.579942] [<ffffffc0007ae804>] __br_forward+0x54/0x98
    49. [ 3380.579951] [<ffffffc0007aebe4>] br_forward+0x6c/0x80
    50. [ 3380.579960] [<ffffffc0007afafc>] br_handle_frame_finish+0x204/0x480
    51. [ 3380.579969] [<ffffffc0007afee8>] br_handle_frame+0x170/0x210
    52. [ 3380.579978] [<ffffffc00071afe0>] __netif_receive_skb_core+0x378/0x7d0
    53. [ 3380.579988] [<ffffffc00071d6d0>] __netif_receive_skb+0x18/0x78
    54. [ 3380.579997] [<ffffffc00071d754>] netif_receive_skb_internal+0x24/0xa8
    55. [ 3380.580006] [<ffffffc00071d7e4>] netif_receive_skb+0xc/0x18
    56. [ 3380.580017] [<ffffffc0007bcc48>] edsa_rcv+0x1c0/0x258
    57. [ 3380.580025] [<ffffffc0007b9618>] dsa_switch_rcv+0x18/0x30
    58. [ 3380.580034] [<ffffffc00071b280>] __netif_receive_skb_core+0x618/0x7d0
    59. [ 3380.580044] [<ffffffc00071d6d0>] __netif_receive_skb+0x18/0x78
    60. [ 3380.580053] [<ffffffc00071d754>] netif_receive_skb_internal+0x24/0xa8
    61. [ 3380.580062] [<ffffffc00071e008>] napi_gro_receive+0x98/0xf0
    62. [ 3380.580073] [<ffffffc000468200>] mvneta_poll+0x3e0/0x9c0
    63. [ 3380.580082] [<ffffffc00071ebb0>] net_rx_action+0x1c8/0x2a0
    64. [ 3380.580094] [<ffffffc0000a36c8>] __do_softirq+0xf8/0x218
    65. [ 3380.580103] [<ffffffc0000a3a78>] irq_exit+0x88/0xe0
    66. [ 3380.580113] [<ffffffc0000dfae0>] __handle_domain_irq+0x60/0xb8
    67. [ 3380.580121] [<ffffffc000080de0>] gic_handle_irq+0xb8/0x158
    68. [ 3380.580127] Exception stack(0xffffffc038dd38d0 to 0xffffffc038dd39f0)
    69. [ 3380.580135] 38c0:                                   ffffffc038dd3ab8 ffffffc03efcdc40
    70. [ 3380.580144] 38e0: ffffffc038dd3a20 ffffffc0008669b8 0000000040000145 ffffffc03efcdc00
    71. [ 3380.580154] 3900: ffffffc03efcdc00 0000000000000140 000000000000cf91 ffffffc0006c30b0
    72. [ 3380.580163] 3920: 0000000003333333 0000000000000020 003ab9bcb8000000 ffffffc038e5b8a8
    73. [ 3380.580171] 3940: 0000000000000001 7fffffffffffffff 0000000000000730 0000000000000000
    74. [ 3380.580180] 3960: ffffffffffffffff ffff000000000000 00000000381bd860 0000000000000000
    75. [ 3380.580189] 3980: ffffffc00082eb18 0000000000000007 000000000000000e ffffffc038dd3ab8
    76. [ 3380.580199] 39a0: ffffffc03efcdc40 0000000000000001 ffffffc03efcdc00 ffffffc03efcdc40
    77. [ 3380.580208] 39c0: ffffffc03efcdc00 ffffffc000bae6c0 ffffffc03efcdc00 0000000000000000
    78. [ 3380.580215] 39e0: 0000000000000000 ffffffc038dd3a20
    79. [ 3380.580223] [<ffffffc000083da8>] el1_irq+0x68/0xd8
    80. [ 3380.580233] [<ffffffc0000f24a4>] hrtimer_start_range_ns+0x1b4/0x2f8
    81. [ 3380.580245] [<ffffffc00086606c>] schedule_hrtimeout_range_clock+0x84/0x100
    82. [ 3380.580255] [<ffffffc0008660f8>] schedule_hrtimeout_range+0x10/0x18
    83. [ 3380.580264] [<ffffffc000865c04>] usleep_range+0x5c/0x68
    84. [ 3380.580274] [<ffffffc0004640e4>] orion_mdio_wait_ready.isra.2+0x11c/0x158
    85. [ 3380.580282] [<ffffffc0004641d4>] orion_mdio_read+0x3c/0xc0
    86. [ 3380.580292] [<ffffffc000459f70>] mdiobus_read_nested+0x50/0x78
    87. [ 3380.580301] [<ffffffc00045f4f4>] mv88e6xxx_reg_wait_ready+0x2c/0x68
    88. [ 3380.580310] [<ffffffc00045f758>] _mv88e6xxx_reg_write+0x90/0xf0
    89. [ 3380.580318] [<ffffffc0004608a8>] mv88e6xxx_mdio_read_indirect+0x28/0x60
    90. [ 3380.580327] [<ffffffc000462740>] mv88e6xxx_mdio_read+0xf8/0x100
    91. [ 3380.580336] [<ffffffc000459fe8>] mdiobus_read+0x50/0x78
    92. [ 3380.580346] [<ffffffc000458f98>] genphy_read_status+0x1b8/0x238
    93. [ 3380.580354] [<ffffffc0004579e0>] phy_state_machine+0x2a8/0x440
    94. [ 3380.580365] [<ffffffc0000b5668>] process_one_work+0x138/0x378
    95. [ 3380.580374] [<ffffffc0000b59cc>] worker_thread+0x124/0x498
    96. [ 3380.580384] [<ffffffc0000bb67c>] kthread+0xdc/0xf0
    97. [ 3380.580392] [<ffffffc000084450>] ret_from_fork+0x10/0x40
    复制代码
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-5-23 16:15
  • 签到天数: 12 天

    连续签到: 1 天

    [LV.3]偶尔看看II

     楼主| 发表于 2017-4-29 17:16:43 | 显示全部楼层
    测试了一下网口作为交换机的吞吐性能。我的工作小台机(Winxp)和笔记本电脑(Linux)都用网线连在 ESPRESSObin 上面,从 Linux 往 Windows 传送一个大文件,测试时间。

    随意产生一个大文件,放在 tmpfs 的目录下(实际是在内存里面,避免硬盘速度限制):
    [cruelfox@lfs tmp]$ tar cv kernel | hexdump -C >test.txt
    [cruelfox@lfs tmp]$ ls -l test.txt
    -rw-r--r--  1 cruelfox felix 1358032062 Apr 29 16:54 test.txt
    文件大小是 1358032062 字节。

    然后在 Windows 机器上 Cygwin 环境里面执行 netcat, 监听于 1994 端口。收到的数据并不写到磁盘。
    /tmp# nc -l 1994  >/dev/null

    在 Linux 机器上用 netcat 发送前面生成的大文件,用 time 命令统计时间。
    [cruelfox@lfs tmp]$ time cat test.txt | nc -c 10.9.4.219 1994


    real    0m13.264s
    user    0m0.937s
    sys     0m12.852s

    计算得到传输速率为 102384805 字节/秒,即 819Mbit/s
    若 netcat 用 UDP 模式传送,则时间缩短到 11.921 秒,对应 911Mbit/s. 这毕竟是数据 payload 的速率,在1Gbps以太网上很不错了。这个过程中 ESPRESSObin Linux中top工具看到的CPU负载并没有变化,可以肯定CPU是不会参与包的转发处理的。


    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-4-26 05:02 , Processed in 0.125239 second(s), 18 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.