Skip to content

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:

  1. Gói đầu tiên gây IRQ, driver tắt IRQ của RX và gọi napi_schedule().
  2. Softirq gọi hàm poll() của driver, xử lý tối đa budget gói mỗi lượt.
  3. 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).

Xem thêm

  • Cấu hình interface từ user space đi qua Netlink.
  • Bỏ qua stack kernel để đạt hiệu năng cao: DPDK.