저는 Linux가 모든 장치를 통해 수신 및 송신 패킷을 처리하는 방법을 이해하려고 노력하고 있습니다.
veth 쌍(예: veth1 및 veth2)을 예로 들면, 패킷이 veth1을 통해 전송되면 veth2에서 수신됩니다. 이제 veth에는 자체 커널 모듈이 있으므로 veth1을 통해 전송하기 위해 커널은 xmit()를 호출합니다.기능패킷을 veth2로 전달합니다.
dev_forward_skb()
코드 및 통화 보기netif_rx_internal()
기능, 패킷을 보관하는 데 사용되는 메모리 측면에서 볼 때, veth2 장치가 수행하는 유일한 역할은 enqueue_to_backlog()
추가 처리를 위해 패킷을 대기열에 배치해야 하는 CPU를 알려주는 것입니다. 함수 process_backlog()
는 계속해서 네트워크 스택에 패킷을 보냅니다.
내 질문은: 장치 veth2에 실제로 패킷(수신 또는 송신용)을 보유하는 자체 대기열이 있습니까, 아니면 장치가 사용할 CPU를 알려주는 것입니까? 나는 보았다구조 netdev_rx_queue
, 그러나 지금까지는 맵 및 플로우 테이블 멤버를 사용하는 코드만 찾았습니다.
이 문제는 루프백, tun/tap 및 eth와 같은 다른 장치로도 확장됩니다.