名词map解释
------------------

====== ================================= ====================
缩略语 英文全名                          中文解释
====== ================================= ====================
PTP    Precision Time Protocol           精确时钟协议
PHC    PTP Hardware Clock                PTP时钟
TSN    Time-Sensitive Networking         时间敏感网络
CBS    credit-based shaper               基于信用的整形器机制
EST    Enhancements to Scheduled Traffic 增强型整形机制
FPE    Frame Preemption                  帧抢占
tc     traffic control                   流量控制
====== ================================= ====================

feature介绍
------------------

-  双网卡
-  支持SGMII
-  支持PPS out / extern PPS in
-  支持TSO功能
-  支持gPTP同步
-  支持多队列功能
-  支持AVB/TSN
-  支持C22及C45协议PHY

.. _network_config:

网络设置
---------------

uboot
~~~~~~~~~~~~~

-  IP

   命令如下：

   .. code:: shell

      setenv ipaddr x.x.x.x 
      setenv gatewayip x.x.x.x 
      setenv netmask x.x.x.x

-  VLAN

   命令如下：

   .. code:: shell

      setenv vlan xx

.. _mac_address:

-  MAC地址

   命令如下：

   .. code:: shell

      setenv ethaddr xx:xx:xx:xx:xx:xx          //设置eth mac地址
      env del -f ethaddr                        //删除mac地址

-  切换当前使用的eth

   命令如下：

   .. code:: shell

      setenv ethact eth0
      setenv ethact eth1

   如果uboot支持双网卡可以切换成功。单网卡切换无效

linux
~~~~~~~~~~~~~

-  VLAN

   一般项目中需要根据业务等级划分vlan及优先级，命令举例如下：

   .. code:: shell

      ip link add link eth0 name eth0.10 type vlan id 10                                //添加vlan id 10 
      ip link set eth0.10 type vlan egress 0:5 1:5 2:5 3:5 4:5 5:5 6:5 7:5          //配置vlan priority 5

-  IP

   命令举例如下：

   .. code:: shell

      ip addr add 192.168.1.10/24 dev eth0.10 //推荐

   or

   .. code:: shell

      ifconfig eth0.10 192.168.1.10 netmask 255.255.255.0

-  MAC

   在实车项目中，MAC地址都是固定的，在dts里配置即可。出外网可以通过网关

-  ARP

   当双网口接到同一交换机时建议配置，防止报文走非预期出端口

   .. code:: shell

      sysctl -w net.ipv4.conf.all.arp_ignore=1 
      sysctl -w net.ipv4.conf.all.arp_announce=1

防火墙
-------------

内核配置
~~~~~~~~~~~~~~~~

内核配置如下，默认已完成配置

.. code:: shell

   CONFIG_NETFILTER=y
   CONFIG_NF_CONNTRACK=m
   CONFIG_NF_CONNTRACK_EVENTS=y
   CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m
   CONFIG_NETFILTER_XT_TARGET_LOG=m
   CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m
   CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m
   CONFIG_NETFILTER_XT_MATCH_LIMIT=m
   CONFIG_NETFILTER_XT_MATCH_TIME=m
   CONFIG_NETFILTER_NETLINK_LOG=y
   CONFIG_IP_NF_IPTABLES=m
   CONFIG_IP_NF_FILTER=m
   CONFIG_IP_NF_TARGET_REJECT=m
   CONFIG_IP_NF_NAT=m
   CONFIG_IP_NF_TARGET_MASQUERADE=m
   CONFIG_IP_NF_MANGLE=m
   CONFIG_IP6_NF_IPTABLES=m
   CONFIG_IP6_NF_FILTER=m
   CONFIG_IP6_NF_TARGET_REJECT=m
   CONFIG_IP6_NF_MANGLE=m
   CONFIG_IP6_NF_NAT=m
   CONFIG_IP6_NF_TARGET_MASQUERADE=m

iptables命令
~~~~~~~~~~~~~~~~~~~~

-  查看规则

   测试命令：

   .. code:: shell

      iptables -L

-  添加删除规则

   测试命令：

   .. code:: shell

      iptables -A INPUT -s 192.168.32.23 -p tcp --dport 22 -j DROP //添加规则
      iptables -F                                               //删除全部规则
      iptables -D INPUT 2                                       //按序号删除规则

-  白名单

   描述：只允许特定的报文通过

   测试命令：

   .. code:: shell

      iptables -P INPUT DROP
      iptables -A INPUT -s 192.168.32.23 -p tcp --dport 22 -j ACCEPT

-  黑名单

   描述：禁止特定报文通过

   测试命令：

   .. code:: shell

      iptables -P INPUT ACCEPT
      iptables -A INPUT -s 192.168.32.23 -p tcp --dport 22 -j DROP

-  流量限制

   描述：对报文流量或带宽进行控制

   测试命令：

   .. code:: shell

      iptables -A INPUT -p ICMP -s 192.168.32.23 -m limit --limit 1/m --limit-burst=1 -j ACCEPT 
      iptables -A INPUT -p ICMP -s 192.168.32.23 -j DROP

-  日志

   描述：保存防火墙拦截的日志动作等

   测试命令：

   .. code:: shell

      iptables -A INPUT -j LOG --log-prefix "iptables"

软件介绍
---------------

代码位置
~~~~~~~~~~~~~~~~

.. code:: shell

   uboot ETH代码位置
   drivers/net/hobot_j6_gmac.c
   drivers/net/hobot_j6_xpcs.c

   kernel ETH代码位置
   hobot-drivers/ethernet/hobot/hobot_eth_j6_main.c
   hobot-drivers/ethernet/hobot/hobot_eth_j6_mdio.c
   hobot-drivers/ethernet/hobot/hobot_eth_j6_ptp.c
   hobot-drivers/ethernet/hobot/hobot_eth_j6_tc.c
   hobot-drivers/ethernet/hobot/core/...
   hobot-drivers/ethernet/hobot/dma/...

网络Bringup
------------------

uboot ETH 开发
~~~~~~~~~~~~~~~~~~~~~~

硬件连接
^^^^^^^^^^^^^^^^^^

hsis配置
'''''''''''''''''''

配置hsis mode及参考时钟选择。

.. code:: shell

    hsis0: hsis0 {
        status = "okay";
        compatible = "hobot,j6-hsis";
        hsi-mode = <4>; /* 4:pcie x2 + gmac0/1; 8:pcie0 x1 + pcie1 x1 + GMAC0/1; */
        refclk-mode = <0>; /* 0:internal ref clock; 1:external ref clock; */
        #address-cells = <2>;
        #size-cells = <2>;
        ranges;
        /*hsis reg, XPCS0, XPCS1, ETH PHY, PCIE PHY*/
        reg = <0x0 0x33000000 0x0 0x10000>,
            <0x0 0x33200000 0x0 0x80000>,
            <0x0 0x33280000 0x0 0x80000>,
            <0x0 0x330e0000 0x0 0x10000>,
            <0x0 0x330d0000 0x0 0x10000>;
    };

PHY连接
'''''''''''''''''''

根据原理图确定复位的GPIO（有的客户会使用硬件复位，GPIO设置可忽略）及PHY的mdio地址。

.. code:: shell

   eth0: eth0 { 
       compatible = "hobot,j6-gmac";
       /*MAC, XPCS*/
       reg = <0x0 0x330f0000 0x0 0x10000>,
             <0x0 0x33200000 0x0 0x80000>;
       phy-mode = "sgmii";
       phy-handle = <&phy1>;
       managed = "in-band-status";
       pinctrl-names = "default";
       pinctrl-0 = <&peri_emac>;
       #address-cells = <1>;
       #size-cells = <0>;
       phy1: phy@1 {
           compatible = "ethernet-phy-ieee802.3-c45";
           reg = <0x3>;
        }
   };

managed in-band-status打开SGMII自协商功能


MAC2MAC
'''''''''''''''''''


在 MAC TO MAC直连时，需要配置fixed-link

.. code:: shell

   eth1: eth1 {
       compatible = "hobot,j6-gmac";
       /*MAC, XPCS*/
       reg = <0x0 0x33100000 0x0 0x10000>,
            <0x0 0x33280000 0x0 0x80000>;
       phy-mode = "sgmii";
       fixed-link {
           speed = <1000>;
           full-duplex;
       };
   };


命令介绍
^^^^^^^^^^^^^^^^^^

-  mii: phy读写命令(C22协议)
   执行网络命令(如ping)后初始化网络接口，否则mdio命令会执行异常

.. code:: shell

      mii info   <addr>                    //display MII PHY info
      mii read   <addr> <reg>              //read  MII PHY <addr> register <reg>

-  mdio: phy读写命令(C45)

.. code:: shell

      mdio list                           //List MDIO buses
      mdio read <phydev> [<devad>.]<reg>  //read PHY register at <devad>.<reg>


-  md: 查看统计计数

   通过md命令读写寄存器查看报文统计计数用于调试

.. code:: shell

      md[.b, .w, .l, .q] address

linux ETH 开发
~~~~~~~~~~~~~~~~~~~~~~

DTS配置
^^^^^^^^^^^^^^^^^

sgmii
'''''''''''''''

.. code:: shell

   ethernet0: ethernet@0x330f0000 {
      status = "okay";
      compatible = "hobot,hobot_gmac";
      reg = <0 0x330f0000 0 0x10000>,
            <0x0 0x33200000 0x0 0x80000>;

      phy-mode = "sgmii";
      hobot,managed = "sgmii-autoneg";
   };

sgmii-autoneg：配置SGMII自协商。fixed-link以及上车不需要自协商配置，一般用于DEBUG网口或不支持强制配置SPEED的PHY

phy-mode     ：与PHY的连接方式。

SGMII J6X配置为MAC mode，switch/phy配置为PHY mode

fixed-link
''''''''''''''''''''''

mac2mac的连接方式使用fixed-link配置

-  子节点格式

.. code:: shell

      ethernet0: ethernet@0x330f0000 {
      status = "okay";
      compatible = "hobot,hobot_gmac";
      reg = <0 0x330f0000 0 0x10000>,
            <0x0 0x33200000 0x0 0x80000>;
      phy-less = <0x0>;
      phy-handle = <&phy1>;
      phy-mode = "sgmii";
      fixed-link {
          speed = <1000>;
          full-duplex;
      };
   };

子节点包含如下属性：

::

   a. speed（整型，必须），表示链接速率，可以设置为10、100、1000

   b. full-duplex（布尔型，可选），表示双工方式，缺省是半双工方式。

   c. pause（布尔型，可选），表示是否使能pause，缺省禁止pause。

   d. asym-pause（布尔型，可选），表示是否使能asym-pause，缺省禁止asym-pause

   e. link-gpio（gpio-list，可选），表示是否可以读取 gpio 以确定链接是否已启动。


PHY复位
'''''''''''''''''''


.. code:: shell

   ethernet0: ethernet@0x330f0000 {
      status = "okay";
      compatible = "hobot,hobot_gmac";
      reg = <0 0x330f0000 0 0x10000>,
            <0x0 0x33200000 0x0 0x80000>;
      phy-less = <0x0>;
      phy-handle = <&phy1>;
      phy-mode = "sgmii";
      mdio {
               #address-cells = <0x1>;
               #size-cells = <0x0>;
               reset = <&port1_a 12 GPIO_ACTIVE_LOW>;
               reset-delay-us = <30000>;
               reset-post-delay-us = <60000>;
               phy1: phy@0xe {
                  compatible = "marvell,88E1512","ethernet-phy-ieee802.3-c22";
                  reg = <0xe>;
               }
      }
   };

reset-delay-us：表示复位时间

reset-post-delay-us：表示解复位后延时时间(phy从解复位到完成初始化的时间)

PHY其他配置
'''''''''''''''''''''''

C22/C45协议

.. code:: shell

   ethernet0: ethernet@0x330f0000 {
      status = "okay";
      compatible = "hobot,hobot_gmac";
      reg = <0 0x330f0000 0 0x10000>,
            <0x0 0x33200000 0x0 0x80000>;
      phy-less = <0x0>;
      phy-handle = <&phy1>;
      phy-mode = "sgmii";
      mdio {
               #address-cells = <0x1>;
               #size-cells = <0x0>;
               phy1: phy@0 {
                  compatible = "ethernet-phy-ieee802.3-c45";
                  reg = <0x0>;
               }
      }
   };

mdio compatible：ethernet-phy-ieee802.3-c45或ethernet-phy-ieee802.3-c22


tso
'''''''''''''''

注释掉“hobot，tso” 关闭TSO功能。TSO开启后，GSO(Generic Segmentation
Offload)会自动开启



常用命令介绍
^^^^^^^^^^^^^^^^^^^^^^

ethtool
'''''''''''''''''''

ethtool: 查看统计计数，设置PHY等

测试命令：

.. code:: shell

   ethtool –S eth1

vconfig
'''''''''''''''''''

vconfig: 配置vlan（可用ip命令代替） 测试命令：

.. code:: shell

   vconfig add eth0 3

iperf3
''''''''''''''''''

iperf3: 带宽、丢包等测试

测试命令：

.. code:: shell

   server: iperf3 –s
   client tcp: iperf3 –c serverip –t 60
   client udp: iperf3 –c serverip –u –b 1G –l 8K –t 60

tcpdump
'''''''''''''''''''

tcpdump: 抓包

测试命令：

.. code:: shell

   tcpdump –i eth1 –e --过滤报文并输出到终端
   tcpdump –i eth1 –w eth1.pcap -- 过滤报文保存到文档，可以用wireshark分析

phytool
'''''''''''''''''''

phytool: 读取/设置 c22/c45 phy寄存器

.. code:: shell

   ADDR := C22 | C45
   C22 := <0-0x1f>
   C45 := <0-0x1f>:<0-0x1f>

格式：

.. code:: shell

   phytool read IFACE/ADDR/REG 
   phytool write IFACE/ADDR/REG <0-0xffff>

测试命令：

.. code:: shell

   root@hobot:~# phytool read eth0/0x7:1/2
   0x002b

   root@hobot:~# phytool read eth1/0xE/2
   0x0141


ETH PHC
--------------

PPS
~~~~~~~~~~~

PPS in
^^^^^^^^^^^^^^^^

pps in用于以太网PHC时间的snapshot的触发源。



PPS out
^^^^^^^^^^^^^^^^^

Eth pps只支持单个pps out;

测试命令：

.. code:: shell

   ethtool hobot_gmac --set-flex-pps eth0 index 0 fpps on interval 1000000000


PHC snapshot
~~~~~~~~~~~~~~~~~~~~

获取phc snapshot时间，用于计算时间差

+--------------------------------------------------------------+--------------------------------------------------+
| 函数调用                                                     | 功能                                             |
+--------------------------------------------------------------+--------------------------------------------------+
| phcfd = open(“/dev/ptp0”, O_RDWR);                           | 打开PHC设备                                      |
+--------------------------------------------------------------+--------------------------------------------------+
| struct ptp_extts_request extts_request;                      | 设置PHC的snapshot源                              |
|                                                              |                                                  |
| extts_request.index = phc_snapshot_source;                   |                                                  |
|                                                              |                                                  |
| extts_request.flags = PTP_ENABLE_FEATURE;                    |                                                  |
|                                                              |                                                  |
| ioctl(phcfd, PTP_EXTTS_REQUEST, &extts_request);             |                                                  |
+--------------------------------------------------------------+--------------------------------------------------+
| struct ptp_extts_event event;                                | 获取PHC时间                                      |
|                                                              |                                                  |
| read(phcfd, &event, sizeof(event));                          |                                                  |
|                                                              |                                                  |
| phctime->tv_sec = event.t.sec;                               |                                                  |
|                                                              |                                                  |
| phctime->tv_nsec = event.t.nsec;                             |                                                  |
+--------------------------------------------------------------+--------------------------------------------------+
| clockadj_step(FD_TO_CLOCKID(phcfd), offset);                 | 设置PHC时间，这个执行完毕，PHC时间会被加上offset |
+--------------------------------------------------------------+--------------------------------------------------+
| close(phcfd )                                                | 关闭PHC设备                                      |
|                                                              |                                                  |
+--------------------------------------------------------------+--------------------------------------------------+

时间同步gptp
~~~~~~~~~~~~~~~~~~~~~

应用层接口
^^^^^^^^^^^^^^^^^^^^^

.. image:: media/image26.jpg

时间同步步骤
^^^^^^^^^^^^^^^^^^^^^^^

Master
'''''''''''''''''''

测试命令：

.. code:: shell

   ptp4l -P -H -2 -i eth0 -p /dev/ptp0 -m

slave
''''''''''''''''''

测试命令：

.. code:: shell

   ptp4l -P -H -2 -i eth0 -p /dev/ptp0 -m -s -l 7

其他
'''''''''''''''''

更详细配置参见第三方工具linuxptp源码中的
automotive-master.cfg，automotive-slave.cfg，比如减少ptp同步完成时间


TSN
-----------

基本概念
~~~~~~~~~~~~~~~~~

TSN组成
^^^^^^^^^^^^^^^^^^

TSN由一系列技术标准构成，其主要分为时钟同步、数据调度（即整形器）以及系统配置三个部分相关通用标准

TSN-VLAN
^^^^^^^^^^^^^^^^^^^

TSN在IEEE 802.1Q仅指ISO/OSI参考模型的第二层数据链路层的标准。

TSN是IEEE
802.1Q标准的VLAN，该标准在标准以太网帧中插入4个字节用于定义其特征，TSN的标签位定义下图所示：

.. image:: media/image15.png

对TSN网络而言，不同优先级或服务等级（class of
service，CoS）的服务对应上图中的PCP码。优先级代码（prioritycode
point，PCP）由3位代码构成；3位PCP码定义了0（最低）～7（最高）这8个优先级，传输类型分别对应
基础、最大努力、卓越努力、严苛应用、延时和抖动小于100ms的视频、延时和抖动小于10ms的音频、内部网络控制、网络控制。



多列队
~~~~~~~~~~~~~~~

VLAN优先级以及多个协议需要多个队列来承接，多队列是实现TSN的基础。数据包与队列的映射关系由网卡驱动中的ndo_select_queue方法实现。

数据调度（整形器）
~~~~~~~~~~~~~~~~~~~~~~~~~~~

基于信用的整形器机制（CBS）（IEEE 802.1-Qav）
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

每个队列设置一定的信用值，根据信用值对应带宽，CBS将队列分为Class
A（Tight delay bound）和Class B（Loose delay bound）。

增强型整形机制（ EST）（IEEE 802.1Qbv-2015）
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

EST由IEEE 802.1Qbv定义，也叫TAS（Time Awareness
Shaper）。是基于预先设定的周期性门控制列表，动态地为出口队列提供开/关控制的机制。Qbv定义了一个时间窗口，是一个时间触发型网络（Time-trigged），这个窗口在这个机制中是被预先确定的，同时这个门控制列表被周期性的扫描，并按预先定义的次序为不同的队列开放传输端口。

.. image:: media/image16.jpg

IEEE
802.1Qbv规范的框图，说明了门控制列表如何根据为每个事件提供的时间表来管理门关闭（C-close）和打开（O-open）事件。

GCL有以下两部分:

时间间隔：定义时间，以纳秒为单位，在从列表中读取下一个门控制项之前，门控制项是有效的。

门控：定义每个TC的门的逻辑1表示的开（O-open）或逻辑0表示的关（C-close）状态。

帧抢占（ FPE）（IEEE 802.1Qbu-2016）
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

为了解决EST的保护带宽的浪费以及优先级反转问题，引入了抢占标准。因此，TSN的802.1Qbu和IEEE
802.3工作组共同开发了IEEE
802.3br，即可抢占式MAC机制，由可被抢占MAC（pMAC-Preemptable
MAC）和快速MAC（eMAC-express
MAC）组成。pMAC可以被eMAC抢占。通过抢占，保护带宽可以被减少至最短低优先级帧片段。

.. image:: media/image17.png

Note: 由于抢占改变了帧的格式，所以对接交换机时也需要对端支持FPE.

配置验证
^^^^^^^^^^^^^^^^^^^

tc
'''''''''''''''

linux自带高级流控，用于Linux内核的流量控制，当带offload参数时会由硬件网卡来完成。

支持如下几种方式：

::

   SHAPING（限制）、 SCHEDULING（调度）、POLICING（策略）、DROPPING（丢弃）

**CBS**

-  命令格式：

   .. code:: shell

      tc qdisc ... dev dev parent classid [ handle major: ] cbs idleslope <idleslope> sendslope <sendslope> hicredit <hicredit> locredit <locredit> [ offload 0|1 ]

-  验证：

   .. code:: shell

      //配置CBS qdisc，将队列1的带宽设置为 40Mbps，测试带宽
      root@hobot:~# tc qdisc add dev eth1 parent root handle 6666 mqprio num_tc 2 map 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 queues 1@0 1@1 hw 0

      root@hobot:~# tc qdisc replace dev eth1 parent 6666:2 cbs idleslope 40000 sendslope -960000 hicredit 60 locredit -1440 offload 1

      root@hobot:~# tperf eth1 10000 1
      sending 10000 packets: prio=0x1 (class B)
      10000 packets: 9.708405 MB in 2044712 us
      39.829567 Mbps

**EST**

-  命令格式：

   .. code:: shell

      tc qdisc ... dev dev parent classid [ handle major: ] taprio num_tc tsc  map P0 P1 P2 ...  queues count1@offset1 count2@offset2 ...  base-time base-time clockid clockid
      sched-entry <command 1> <gate mask 1> <interval 1>
      sched-entry <command 2> <gate mask 2> <interval 2>
      sched-entry <command 3> <gate mask 3> <interval 3>
      sched-entry <command N> <gate mask N> <interval N>
      ...
      flags  number

-  验证：

   .. code:: shell

      //队列3每100ms循环发送一次，一次发送10ms
      root@hobot:~# ptp4l -P -H -2 -i eth1 -p /dev/ptp1 -m &

      root@hobot:~# tc qdisc replace dev eth1 parent root handle 100 taprio num_tc 4 map 0 1 2 3 queues 1@0 1@1 1@2 1@3 base-time 1000 sched-entry S 8 10000000 sched-entry S 0 10000000 sched-entry S 0 10000000 sched-entry S 0  10000000 sched-entry S 0  10000000 sched-entry S 0  10000000 sched-entry S 0  10000000 sched-entry S 0  10000000 sched-entry S 0  10000000 sched-entry S 0  10000000 flags 2

      root@hobot:~# tc qdisc show dev eth1
      qdisc taprio 100: root refcnt 9 tc 4 map 0 1 2 3 0 0 0 0 0 0 0 0 0 0 0 0
      queues offset 0 count 1 offset 1 count 1 offset 2 count 1 offset 3 count 1
      clockid invalid flags 0x2       base-time 1000 cycle-time 100000000 cycle-time-extension 0
            index 0 cmd S gatemask 0x8 interval 10000000
            index 1 cmd S gatemask 0 interval 10000000
            index 2 cmd S gatemask 0 interval 10000000
            index 3 cmd S gatemask 0 interval 10000000
            index 4 cmd S gatemask 0 interval 10000000
            index 5 cmd S gatemask 0 interval 10000000
            index 6 cmd S gatemask 0 interval 10000000
            index 7 cmd S gatemask 0 interval 10000000
            index 8 cmd S gatemask 0 interval 10000000
            index 9 cmd S gatemask 0 interval 10000000

      root@hobot:~# tperf eth1 10000 3
      sending 10000 packets: prio=0x3 (class A)
      10000 packets: 9.708405 MB in 896210 us
      90.871559 Mbps

   wireshark抓包如下图：

   .. image:: media/image27.png


测试
------------


功能测试
~~~~~~~~~~~~~~~~~

-  ping测试

   测试步骤：ping xx.xx.xx.xx

-  ssh

   测试步骤：ssh root\@xx.xx.xx.xx

稳定性测试
~~~~~~~~~~~~~~~~~~~

reboot测试
^^^^^^^^^^^^^^^^^^^^^

测试步骤：secureCRT -> 脚本 ->执行->RebootScript.vbs

参考RebootScript.vbs：

.. code:: shell

   #$language = "VBScript"
   #$interface = "1.0"

   crt.Screen.Synchronous = True

   ' This automatically generated script may need to be
   ' edited in order to work correctly.

   Sub Main
       For i = 1 To 1000
           crt.Screen.Send "ping 192.168.1.10 -c 10" & chr(13)  'IP根据硬件适配
           crt.Screen.WaitForString "10 packets received"
           crt.Screen.Send "reboot" & chr(13)
           crt.Screen.WaitForString "root@hobot"                'WaitForString根据日志适配
           crt.Screen.Send "#++++++++++times:"  & i & "++++++++++" & chr(13)
           crt.Screen.Send "sleep 3" & chr(13)
       Next
   End Sub

上下电测试
^^^^^^^^^^^^^^^^^^^^^

使用继电器进行循环上下电，检查J6X网络是否正常开启。

iperf3 24小时测试
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tcp测试
''''''''''''''''''''

.. code:: shell

   Server:iperf3 -s
   Client:iperf3 -c x.x.x.x -t 86400

udp测试
''''''''''''''''''''

.. code:: shell

   Server:iperf3 -s
   Client:iperf3 -c x.x.x.x -t 86400 -u -b 1G -l 8K

up/down循环测试
^^^^^^^^^^^^^^^^^^^^^^^^^^

使用脚本循环up/down网卡，确保零失败，参考测试脚本如下：

.. code:: shell

   #!/bin/sh
   echo 14 4 1 7 > /proc/sys/kernel/printk
   i=0
   times=10000000000000
   ifconfig eth0 down
   dmesg -c
   while [ $i -le $times ];do
       echo "test times : $i"
       i=$(($i+1))
       echo "~~~~~new begin~~~~~"
       ifconfig eth0 up
       sleep 2
       note=$(dmesg -c | grep "Link is Up" | wc -l)
       echo $note
       if [ 1 -ne $note ]
       then
           echo "!!!error!!, while break!!!!"
           break
       fi
       ifconfig eth0 down
   done

性能测试分析
~~~~~~~~~~~~~~~~~~~~~

拓扑
^^^^^^^^^^^^^^^

J6_1 <—–> Switch <—–> J6_2


napi独立线程化
^^^^^^^^^^^^^^^^^^^^^^^^^

linux网络任务由ksoftirqd/n处理，默认任务优先级相对较低，独立后可提高CPU利用率以及TSN的相关的控制。丢包率在空负载的情况下可以达到0丢包，在大负载情况下可以通过规划项目整体任务的优先级达到性能平衡。

.. code:: shell

   root@hobot:~# echo 1 > /sys/class/net/eth0/threaded
   root@hobot:~# ps | grep napi
   1705 root 19 0 0 SW [napi/eth0-260]
   1706 root 19 0 0 SW [napi/eth0-259]
   1707 root 19 0 0 SW [napi/eth0-258]
   1708 root 19 0 0 SW [napi/eth0-257]
   1710 root 19 0 3584 S grep napi
   root@hobot:~# iperf3 -s
   -----------------------------------------------------------
   Server listening on 5201
   -----------------------------------------------------------
   Accepted connection from 192.168.1.249, port 58418
   [ 5] local 192.168.1.249 port 5201 connected to 192.168.1.249 port 55021
   [ ID] Interval Transfer Bitrate Jitter Lost/Total Datagrams
   [ 5] 0.00-1.00 sec 98.0 MBytes 822 Mbits/sec 0.022 ms 0/12544 (0%)
   [ 5] 1.00-2.00 sec 108 MBytes 907 Mbits/sec 0.015 ms 0/13841 (0%)
   [ 5] 2.00-3.00 sec 103 MBytes 865 Mbits/sec 0.019 ms 0/13200 (0%)
   [ 5] 3.00-4.00 sec 113 MBytes 947 Mbits/sec 0.019 ms 0/14452 (0%)
   [ 5] 4.00-5.00 sec 114 MBytes 956 Mbits/sec 0.023 ms 0/14586 (0%)
   [ 5] 5.00-6.00 sec 111 MBytes 931 Mbits/sec 0.028 ms 0/14211 (0%)
   [ 5] 6.00-7.00 sec 114 MBytes 953 Mbits/sec 0.020 ms 0/14539 (0%)
   [ 5] 7.00-8.00 sec 105 MBytes 879 Mbits/sec 0.018 ms 0/13410 (0%)
   [ 5] 8.00-9.00 sec 112 MBytes 939 Mbits/sec 0.016 ms 0/14331 (0%)
   [ 5] 9.00-10.00 sec 113 MBytes 946 Mbits/sec 0.024 ms 0/14429 (0%)
   [ 5] 10.00-10.00 sec 112 KBytes 947 Mbits/sec 0.033 ms 0/14 (0%)
   - - - - - - - - - - - - - - - - - - - - - - - - -
   [ ID] Interval Transfer Bitrate Jitter Lost/Total Datagrams
   [ 5] 0.00-10.00 sec 1.06 GBytes 915 Mbits/sec 0.033 ms 0/139557 (0%) receiver


DEBUG
-------------

Log
~~~~~~~~~~~~

系统日志
^^^^^^^^^^^^^^^^^^^

dmesg、pstore日志分析

内存检查
^^^^^^^^^^^^^^^^^^^

检查内存是否有泄露导致网络包内存无法分配

Ringbuf
~~~~~~~~~~~~~~~~

Tx ringbuf
^^^^^^^^^^^^^^^^^^^^^

查看/sys/class/net/<interface>/descriptors/dump_tx_desc

举例：

.. code:: shell

   cat /sys/class/net/eth0/descriptors/dump_tx_desc
   cat /sys/class/net/eth1/descriptors/dump_tx_desc

Rx ringbuf
^^^^^^^^^^^^^^^^^^^^^

查看/sys/class/net/<interface>/descriptors/dump_rx_desc

举例：

.. code:: shell

   cat /sys/class/net/eth0/descriptors/dump_rx_desc
   cat /sys/class/net/eth1/descriptors/dump_rx_desc


统计计数
~~~~~~~~~~~~~~~~~

ethtool -S <interface> 查看报文mmc统计信息，以及其他的统计信息

netstat 查看协议栈相关的信息。如协议栈报文计数及tcp/udp状态信息等


开发常见问题排查
~~~~~~~~~~~~~~~~~~~~~~~~~

EQOS_DMA_MODE_SWR stuck
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

-  描述：emac软复位失败

   1. uboot日志如下：EQOS_DMA_MODE_SWR stuck。


   2. linux日志：device or resource busy。dmesg日志如下：

.. code:: shell

   [ 21.720702] hobot_gmac 330f0000.ethernet eth0: init_dma_engine: Failed to reset dma
   [ 21.720717] hobot_gmac 330f0000.ethernet eth0: hw_setup, DMA engine initilization failed
   [ 21.720723] hobot_gmac 330f0000.ethernet eth0: eth_netdev_open, Hw setup failed

-  故障排除

   1. 检查SGMII参考时钟是否提供，若使用内部时钟检查clock是否使能

phy link不上
^^^^^^^^^^^^^^^^^^^^^^^

故障排除

-  使用mdio/mii/phytool命令能否正常读写phy寄存器
-  检查PHY时钟、phy 复位、PHY供电等
-  检查变压器等

发送异常
^^^^^^^^^^^^^^^^^^^

故障排除

-  检查phy link是否UP
-  检查工作模式（速率，双工等）
-  确认transmit接口是否被调用
-  确认发送统计计数
-  对端查看是否错包等
-  使用环回定位故障点

接收异常
^^^^^^^^^^^^^^^^^^^

故障排除

-  测量phy tx时钟
-  mac环回，若正常收包。可判定phy tx时钟 与 MAC rx接收配合问题

查看是否有错包，如果有ECC错包可推断是信号质量问题

大量错包
^^^^^^^^^^^^^^^^^^^

故障排除

-  检查clk是否符合要求
-  条件允许的话，测下信号的眼图
-  降速测试（100M或10M）


FAQ
-----------

TSN
~~~~~~~~~~~~

问：J6X支持哪些TSN标准\ ？

答\ ：基于信用的整形器机制（credit-based shaper，CBS）(IEEE
802.1-Qav)

增强型整形机制（Enhancements to Scheduled Traffic，EST）（IEEE
802.1Qbv-2015）

帧抢占（Frame Preemption，FPE）（IEEE 802.1Qbu-2016）


PHY
~~~~~~~~~~~~

问：J6适配过哪些PHY\ ？

答\ ：Marvell 88E1512、Marvell 88Q2121、Marvell 88Q2220、TI dp83867。

PHC与gptp
~~~~~~~~~~~~~~~~~~

问：gptp 在同步的时候，会影响到 输出给lpwm的PPS吗

答：使用fix mode,跟随秒进位输出PPS。可用于CAM/Lidar融合

网络环境
~~~~~~~~~~~~~~~~~

问：J6X无法ping通Windwons，Windwons可以ping通J6X

答\ ：检查Windwons的防火墙是否关闭，windwons自带防火墙如下图：

.. image:: media/image24.png

问：外部为什么可以ping通 J6X已经down掉的网口

答\ ：双网口时 Linux IP协议内部路由，非问题。可以通过如下命令关闭

.. code:: shell

   sysctl -w net.ipv4.conf.all.arp_ignore=1
   sysctl -w net.ipv4.conf.all.arp_announce=1

uboot调试与升级
~~~~~~~~~~~~~~~~~~~~~~~~

问：uboot网络自协商失败或协商成千兆后无法PING通

答\ ：检查网络是否线6类线。5类线或超5类线目前只能降速到100M。如果不降速PHY和对端可能在百兆或千兆之间切换，导致mac与phy之间的速率不匹配。

问：uboot无法读写phy


答\ ：检查phy是否解复位，软件使用的mdio地址与硬件配置是否一致

问：uboot升级失败（ping不通）


答\ ：检查IP的配置，serverip，使用小局域网或直连PC

检查MAC的配置，配置命令参考 :ref:`MAC地址 <mac_address>`

检查使用的网口是否为期望的网口

检查网线是否为6类线，如果不是，在PC端降速到100M通信

检查防火墙是否关闭

