Skip to content

# 9.1. 名词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 | 流量控制

# 9.2. feature介绍

- 双网卡

- 支持SGMII

- 支持PPS out / extern PPS in

- 支持TSO功能

- 支持gPTP同步

- 支持多队列功能

- 支持AVB/TSN

- 支持C22及C45协议PHY

# 9.3. 网络设置

## 9.3.1. uboot

- IP

  命令如下：

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

- VLAN

  命令如下：

      setenv vlan xx

- MAC地址

  命令如下：

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

- 切换当前使用的eth

  命令如下：

      setenv ethact eth0
      setenv ethact eth1

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

## 9.3.2. linux

- VLAN

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

      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

  命令举例如下：

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

  or

      ifconfig eth0.10 192.168.1.10 netmask 255.255.255.0

- MAC

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

- ARP

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

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

# 9.4. 防火墙

## 9.4.1. 内核配置

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

    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

## 9.4.2. iptables命令

- 查看规则

  测试命令：

      iptables -L

- 添加删除规则

  测试命令：

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

- 白名单

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

  测试命令：

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

- 黑名单

  描述：禁止特定报文通过

  测试命令：

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

- 流量限制

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

  测试命令：

      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

- 日志

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

  测试命令：

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

# 9.5. 软件介绍

## 9.5.1. 代码位置

    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/...

# 9.6. 网络Bringup

## 9.6.1. uboot ETH 开发

### 9.6.1.1. 硬件连接

#### 9.6.1.1.1. hsis配置

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

    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>;
    };

#### 9.6.1.1.2. PHY连接

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

    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自协商功能

#### 9.6.1.1.3. MAC2MAC

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

    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;
        };
    };

### 9.6.1.2. 命令介绍

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

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

- mdio: phy读写命令(C45)

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

- md: 查看统计计数

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

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

## 9.6.2. linux ETH 开发

### 9.6.2.1. DTS配置

#### 9.6.2.1.1. sgmii

    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

#### 9.6.2.1.2. fixed-link

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

- 子节点格式

       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 以确定链接是否已启动。

#### 9.6.2.1.3. PHY复位

    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从解复位到完成初始化的时间)

#### 9.6.2.1.4. PHY其他配置

C22/C45协议

    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

#### 9.6.2.1.5. tso

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

### 9.6.2.2. 常用命令介绍

#### 9.6.2.2.1. ethtool

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

测试命令：

    ethtool –S eth1

#### 9.6.2.2.2. vconfig

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

    vconfig add eth0 3

#### 9.6.2.2.3. iperf3

iperf3: 带宽、丢包等测试

测试命令：

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

#### 9.6.2.2.4. tcpdump

tcpdump: 抓包

测试命令：

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

#### 9.6.2.2.5. phytool

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

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

格式：

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

测试命令：

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

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

# 9.7. ETH PHC

## 9.7.1. PPS

### 9.7.1.1. PPS in

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

### 9.7.1.2. PPS out

Eth pps只支持单个pps out;

测试命令：

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

## 9.7.2. PHC snapshot

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

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

## 9.7.3. 时间同步gptp

### 9.7.3.1. 应用层接口

### 9.7.3.2. 时间同步步骤

#### 9.7.3.2.1. Master

测试命令：

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

#### 9.7.3.2.2. slave

测试命令：

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

#### 9.7.3.2.3. 其他

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

# 9.8. TSN

## 9.8.1. 基本概念

### 9.8.1.1. TSN组成

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

### 9.8.1.2. TSN-VLAN

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

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

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

## 9.8.2. 多列队

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

## 9.8.3. 数据调度（整形器）

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

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

### 9.8.3.2. 增强型整形机制（ EST）（IEEE 802.1Qbv-2015）

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

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

GCL有以下两部分:

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

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

### 9.8.3.3. 帧抢占（ 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抢占。通过抢占，保护带宽可以被减少至最短低优先级帧片段。

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

### 9.8.3.4. 配置验证

#### 9.8.3.4.1. tc

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

支持如下几种方式：

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

CBS

- 命令格式：

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

- 验证：

      //配置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

- 命令格式：

      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

- 验证：

      //队列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抓包如下图：

# 9.9. 测试

## 9.9.1. 功能测试

- ping测试

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

- ssh

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

## 9.9.2. 稳定性测试

### 9.9.2.1. reboot测试

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

参考RebootScript.vbs：

    #$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

### 9.9.2.2. 上下电测试

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

### 9.9.2.3. iperf3 24小时测试

#### 9.9.2.3.1. tcp测试

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

#### 9.9.2.3.2. udp测试

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

### 9.9.2.4. up/down循环测试

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

    #!/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

## 9.9.3. 性能测试分析

### 9.9.3.1. 拓扑

J6_1 <—–> Switch <—–> J6_2

### 9.9.3.2. napi独立线程化

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

    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

# 9.10. DEBUG

## 9.10.1. Log

### 9.10.1.1. 系统日志

dmesg、pstore日志分析

### 9.10.1.2. 内存检查

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

## 9.10.2. Ringbuf

### 9.10.2.1. Tx ringbuf

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

举例：

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

### 9.10.2.2. Rx ringbuf

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

举例：

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

## 9.10.3. 统计计数

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

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

## 9.10.4. 开发常见问题排查

### 9.10.4.1. EQOS_DMA_MODE_SWR stuck

- 描述：emac软复位失败

  1. uboot日志如下：EQOS_DMA_MODE_SWR stuck。

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

    [ 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是否使能

### 9.10.4.2. phy link不上

故障排除

- 使用mdio/mii/phytool命令能否正常读写phy寄存器

- 检查PHY时钟、phy 复位、PHY供电等

- 检查变压器等

### 9.10.4.3. 发送异常

故障排除

- 检查phy link是否UP

- 检查工作模式（速率，双工等）

- 确认transmit接口是否被调用

- 确认发送统计计数

- 对端查看是否错包等

- 使用环回定位故障点

### 9.10.4.4. 接收异常

故障排除

- 测量phy tx时钟

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

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

### 9.10.4.5. 大量错包

故障排除

- 检查clk是否符合要求

- 条件允许的话，测下信号的眼图

- 降速测试（100M或10M）

# 9.11. FAQ

## 9.11.1. 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）

## 9.11.2. PHY

问：J6适配过哪些PHY？

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

## 9.11.3. PHC与gptp

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

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

## 9.11.4. 网络环境

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

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

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

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

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

## 9.11.5. uboot调试与升级

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

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

问：uboot无法读写phy

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

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

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

检查MAC的配置，配置命令参考 MAC地址

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

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

检查防火墙是否关闭