Linux Networking Stack¶
Đường đi của gói tin¶
flowchart LR
NIC[NIC / MAC] -->|IRQ + DMA| DRV[netdev driver<br/>NAPI poll]
DRV --> GRO[GRO]
GRO --> L2[L2: bridge, VLAN]
L2 --> IP[IP: netfilter, routing]
IP --> TCP[TCP / UDP]
TCP --> SOCK[socket buffer]
SOCK --> APP[User space]
Chiều gửi đi ngược lại: socket, TCP/UDP, IP, qdisc, ndo_start_xmit() của driver, DMA ring, NIC.
sk_buff¶
struct sk_buff (skb) là cấu trúc đại diện cho một gói tin trong kernel. Dữ liệu được xử lý bằng cách dịch con trỏ (skb_push, skb_pull, skb_reserve) thay vì copy, để thêm hoặc bỏ header ở mỗi tầng.
net_device và driver¶
Driver Ethernet đăng ký một struct net_device cùng bảng hàm net_device_ops:
| Callback | Việc |
|---|---|
ndo_open / ndo_stop |
Bật/tắt interface, cấp phát ring, đăng ký IRQ |
ndo_start_xmit |
Nhận skb từ stack, đặt vào TX ring |
ndo_set_rx_mode |
Cập nhật bộ lọc MAC, multicast, promiscuous |
ndo_eth_ioctl |
ioctl như đọc/ghi thanh ghi PHY |
Driver SoC thường là platform driver nạp theo Device Tree; xem Platform Device và Device Tree.
NAPI¶
Nếu mỗi gói tin gây một ngắt thì ở tốc độ cao CPU bị ngập trong interrupt. NAPI chuyển sang chế độ lai:
- Gói đầu tiên gây IRQ, driver tắt IRQ của RX và gọi
napi_schedule(). - Softirq gọi hàm
poll()của driver, xử lý tối đabudgetgói mỗi lượt. - Khi ring rỗng, driver gọi
napi_complete_done()và bật lại IRQ.
Hệ quả khi tối ưu: CPU bận ở ksoftirqd, cần cân nhắc IRQ affinity, RPS/RFS, và isolcpus cho hệ real-time.
Bridge, VLAN, bonding¶
# Bridge hai cổng
ip link add br0 type bridge
ip link set eth0 master br0
ip link set eth1 master br0
ip link set br0 up
# VLAN 100 trên eth0
ip link add link eth0 name eth0.100 type vlan id 100
ip addr add 192.168.100.2/24 dev eth0.100
ip link set eth0.100 up
Bonding gộp nhiều cổng thành một (chế độ active-backup thường dùng để dự phòng).