Linux Kernel方式和dpdk方式实现1588协议

本文详细介绍了IEEE1588(PTP)精确时间协议的原理及其实现过程,包括Linux内核协议栈中UDP数据包发送流程,并探讨了在nxp设备上配置DPDK环境以实现更高精度的时间同步。

一、1588协议说明
1、IEEE1588 ( PTP ) 协议简介
IEEE1588 协议,又称 PTP( precise time protocol,精确时间协议),可以达到亚微秒级别时间同步精度,于 2002 年发布 version 1,2008 年发布 version 2
2、IEEE1588 协议的同步原理,所提出的 Delay Request-Response Mechanism(延时响应机制)如 下图所示:
在这里插入图片描述

二、Linux 内核协议栈方式
1、下载1588协议代码
2、x86服务器测试验证
3、arm64板子测试验证
三、应用层协议到Linux内核处理udp发送数据包的过程
1、应用层通过sendto进行发送
2、Linux内核调用udp_sendmsg进行发送。。
3、。。
4、网络设备驱动函数注册
5、通过 ndo_start_xmit 发送数据

这里我在做测试验证的时候 发现无法找到设备文件ptp
于是ls -lh /dev/ptp* 后 果然没有ptp0 或者ptp1 设备文件
4、于是开始查看Linux 内核协议栈驱动程序
nxp 的设备驱动 是通过先创建dprc contianer
dprc container是作为root根节点 也就是链表的头指针
后续手动创建的dprtc 才会被挂到dprc的链表上
创建成功dprc后
驱动程序是先做一个匹配 匹配到dprtc后才是 创建ptp设备文件
然后才是进行probe操作 注册读写函数等

二、DPDK接管网卡 使用DPDK的协议栈实现1588时间同步

1、nxp 板卡配置DPDK环境说明:
修改uboot 环境变量
setenv othbootargs default_hugepagesz=1024m hugepagesz=1024m hugepages=2 pci=pcie_bus_perf isolcpus=1-8 iommu.passthrough=1

cross-compile-dpdk

export RTE_SDK=/home/zhanghh/16.latest-dpdk/dpdk
export export RTE_TARGET=build/

  1. make config T=arm64-dpaa2-linuxapp-gcc
  2. 修改 build/.config 将kernel相关module disable掉 #CONFIG_RTE_KNI_KMOD=y
  3. make -j CROSS=aarch64-linux-gnu- RTE_KERNELDIR=/home/zhanghh/05.nxp-code-with-git/flexbuild_lsdk1906/packages/linux/linux/
  4. build 出来的image在:build/路径下
Linux 内核中,网络包的转发(Packet Forwarding)是网络子系统的重要功能,主要用于路由器、网关或 NAT 设备等场景。内核转发包的方式主要涉及 **路由决策** **包处理流程**,以下是关键机制实现方式: --- ### **1. 转发核心机制** #### **(1) 路由子系统(Routing Subsystem)** - **路由表(Routing Table)**:内核通过 `FIB`(Forwarding Information Base)决定包的下一跳。 - 使用 `ip route` 或 `route -n` 查看路由表。 - 关键字段:目标网络、网关、网卡接口(如 `eth0`)。 - **策略路由(Policy Routing)**:通过 `ip rule` 定义多路由表(如基于源IP、TOS等)。 #### **(2) 包转发流程** 1. **入口(Ingress)**: - 网卡驱动接收包 → 交给内核网络栈(`netif_receive_skb`)。 - 检查目标IP: - 如果是本机IP → 交给上层协议栈(如TCP/UDP)。 - 如果不是本机IP → 进入转发逻辑(需启用 `net.ipv4.ip_forward=1`)。 2. **转发决策**: - 查询路由表确定出口网卡下一跳。 - 执行 NAT(如配置了 `iptables/nftables` 规则)。 3. **出口(Egress)**: - 通过 `dev_queue_xmit` 发送到目标网卡。 - 可能触发 QoS(如 `tc` 流量控制)。 --- ### **2. 关键内核组件** #### **(1) Netfilter 框架** - **钩子点(Hook Points)**:在转发路径上插入处理逻辑: - `NF_INET_PRE_ROUTING`:路由前处理(如DNAT)。 - `NF_INET_FORWARD`:转发专用钩子。 - `NF_INET_POST_ROUTING`:路由后处理(如SNAT)。 - **工具**:`iptables`/`nftables` 用于配置规则。 #### **(2) eBPF/XDP** - **eBPF**:在内核态动态加载程序,可拦截或修改转发逻辑。 - **XDP(eXpress Data Path)**:在网卡驱动层直接处理包,高性能转发。 #### **(3) 快速路径(Fast Path)** - 内核优化(如 `CONFIG_IP_ROUTE_CLASSID`)可跳过部分检查。 - 硬件加速(如 DPDK)绕过内核协议栈。 --- ### **3. 配置与管理** #### **(1) 启用转发** ```bash # IPv4 转发 echo 1 > /proc/sys/net/ipv4/ip_forward # 或永久生效(/etc/sysctl.conf) net.ipv4.ip_forward = 1 # IPv6 转发 net.ipv6.conf.all.forwarding = 1 ``` #### **(2) 查看转发统计** ```bash cat /proc/net/stat/nf_conntrack # 连接跟踪 ip -s route show # 路由统计 ``` #### **(3) 调试工具** - `tcpdump`/`wireshark`:抓包分析。 - `conntrack -L`:查看NAT会话。 - `tracepath`/`mtr`:路径追踪。 --- ### **4. 性能优化** - **连接跟踪(Conntrack)**: - 避免过度使用 `iptables` 规则(影响吞吐量)。 - 可禁用无关模块(如 `nf_conntrack` 若不需NAT)。 - **多队列网卡**:绑定CPU亲性减少锁竞争。 - **内核参数调优**: ```bash net.core.netdev_max_backlog = 10000 # 提高接收队列 net.ipv4.tcp_max_syn_backlog = 8192 ``` --- ### **5. 典型应用场景** - **路由器**:基于路由表转发。 - **NAT网关**:通过 `iptables` 修改源/目标IP。 - **负载均衡**:结合 `ipvs` 或 eBPF 实现
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

echo-niuben

你的鼓励是我创作的巨大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值