01 net/core 核心机制与实现详解
1. 地位
net/core/(约 57 文件)是 所有协议族的公共底座:没有它,ipv4、bridge、mac80211 无法共享 sk_buff 与 net_device 语义。
2. 数据面主干:sk_buff
skbuff.c 管理:
- 分配/释放(
alloc_skb、kfree_skb); skb_clone/pskb_copy(广播、转发、Netfilter);- 队列:
skb_queue_tail、sk_receive_queue; - 头部推拉:
skb_push/skb_pull(各层加解封装); - offload 标记:
skb->ip_summed、hw_features。
RK3588 千兆/2.5G 驱动性能调优常看 GRO/LRO 与 skb 分配 NUMA(netdev_alloc_skb)。
3. 控制面:socket 与 sock
sock.c(core 部分)与顶层 socket.c 分工:
| 层 | 文件 | 职责 |
|---|---|---|
| 系统调用 | net/socket.c |
SYSCALL_DEFINE、fd 与 struct socket |
| 协议无关 | net/core/sock.c |
锁、队列、回调、diag |
struct sock 通过 struct proto_ops 挂接 inet_stream_ops 等。
4. 网络设备:dev.c
dev.c 核心能力:
register_netdev/unregister_netdev;dev_queue_xmit发送入口;netif_receive_skb/__netif_receive_skb_core接收入口;- NAPI:
netif_napi_add、napi_schedule(详见 09-NAPI收包轮询机制与实现详解.md); netdev_rx_handler(bridge、vlan、macvlan);- 统计:
dev->stats、RTNL 查询。
与驱动边界:ndo_open/stop/xmit 在驱动,队列调度与 qdisc 在 core/sched。
5. 路由与邻居
| 文件 | 作用 |
|---|---|
| dst.c | dst_entry 缓存、过期、回调到 neighbour |
| neighbour.c | 通用邻居表;ARP/ND 在 ipv4/ipv6 子模块注册 |
| fib_notifier.c | FIB 变更通知(BPF、IOAM 等订阅) |
6. 用户态配置:rtnetlink
rtnetlink.c 实现 NETLINK_ROUTE(建立在 net/netlink/ 框架上,详见 10-netlink内核用户通信机制与实现详解.md):
- 链路增删(
RTM_NEWLINK); - 地址(
RTM_NEWADDR); - 路由(
RTM_NEWROUTE); - 与 iproute2(
ip link/ip route)一一对应。
网络命名空间:struct net 隔离 RTNL 表项。
7. 性能路径:GRO / XDP / flow_offload
| 机制 | 文件 | 说明 |
|---|---|---|
| GRO | gro.c |
合并小包减中断开销 |
| XDP | xdp.c |
驱动早丢弃/转发;与 net/xdp AF_XDP 配合 |
| flow_offload | flow_offload.c |
硬件流表卸载(switchdev、DSA) |
| TSO | tso.c |
TCP 分段 offload |
8. BPF 挂钩(core 内)
CONFIG_BPF_SYSCALL 时:
- sock_map.c — BPF map 与 socket 绑定;
- bpf_sk_storage.c — per-socket BPF 存储;
- filter.c — 经典 BPF socket filter。
完整 BPF 指令集在 kernel/bpf/ + net/bpf/ 测试桩。
9. 小结
net/core = skb + dev + dst + neighbour + rtnl + NAPI/GRO/XDP。RK3588 网络问题(丢包、延迟、软中断 CPU)多数需结合 core 统计与 驱动 NAPI 同看。
正在加载留言…