原创 【Linux4.1.12源碼分析】二層報文發送之dev_queue_xmit

報文到此階段,已經完成了MAC頭封裝,在調用驅動發送報文前還有一些工作要做:1)流量控制; 2)報文GSO分段;3)check sum計算; 1、dev_queue_xmit函數 static inline int dev_queue_x

原创 【Linux4.1.12源碼分析】二層報文發送之報文GSO分段(MAC層)

報文GSO分段的入口函數是skb_gso_segment函數,是在validate_xmit_skb函數中被調用。 1、skb_gso_segment函數 static inline struct sk_buff *skb_gso_se

原创 【Linux4.1.12源碼分析】二層報文發送之qdisc實現分析

二層發送中,實現qdisc的主要函數是__dev_xmit_skb和net_tx_action,本篇將分析qdisc實現的原理,但是不涉及qdisc內部的算法,僅對框架進行分析。 1、__dev_xmit_skb函數 static inl

原创 【Linux4.1.12源碼分析】vxlan報文發送之udp_tunnel_xmit_skb

udp_tunnel_xmit_skb函數是OVS2.5發送UDP報文的內核入口,在調用該函數之前,headroom空間需要準備完成,且vxlan頭已經創建,skb結構體的data指向vxlan頭的首地址。 1、udp_tunnel_xm

原创 【Linux4.1.12源碼分析】二層報文發送之報文GSO分段(UDP)

UDP報文GSO分段的入口函數是udp4_ufo_fragment,由udpv4_offload常量中定義。 1、udp4_ufo_fragment函數 static struct sk_buff *udp4_ufo_fragment(s

原创 【OVS2.5.0源碼分析】vxlan端口創建流程分析

vxlan端口是通過ovs-vsctl命令創建的,整個調用流程如下: bridge_reconfigure->bridge_add_ports->bridge_add_ports__->iface_create->iface_do_cre

原创 【Linux4.1.12源碼分析】協議棧gro收包之UDP處理

UDP offload爲udpv4_offload static const struct net_offload udpv4_offload = { .callbacks = { .gso_segment = udp4_ufo_f

原创 【Linux4.1.12源碼分析】收包軟中斷和NAPI

不講概念,直接上收包軟中斷處理代碼。  net_rx_action函數 static void net_rx_action(struct softirq_action *h) { struct softnet_data *sd = th

原创 【Linux4.1.12源碼分析】VXLAN之csum和remcsum實現分析(發包)

vxlan報文的csum處理邏輯由VXLAN_F_UDP_CSUM、VXLAN_F_REMCSUM_TX、VXLAN_F_REMCSUM_RX、VXLAN_F_REMCSUM_NOPARTIAL等等標記決定,本篇從發包流程來看實現邏輯:

原创 【Linux4.1.12源碼分析】UDP層csum計算

我們以發包和收包兩個方向,分析UDP層的csum計算,發包方向,以vxlan封包流程中的UDP頭封裝作爲例子來進行分析。 udp_set_csum函數(封裝UDP頭時調用) void udp_set_csum(bool nocheck,

原创 【Linux4.1.12源碼分析】virtio_net之NAPI機制

在虛擬化場景,中斷的開銷更大,所以要儘可能的少用中斷,我們從中斷處理函數開始看。 skb_recv_done函數 static void skb_recv_done(struct virtqueue *rvq) { struct vir

原创 【Linux4.1.12源碼分析】VXLAN之remcsum實現分析

根據之前VXLAN之csum和remcsum實現分析(發包)的分析,由csum配置決定發送端是否計算UDP層的csum。 remcsum會在vxlan頭中保存相關信息,然後在接收端進行處理,先看發送端如何構造vxlan頭信息。 vxlan

原创 【Linux4.1.12源碼分析】協議棧報文接收之傳輸層處理分析(UDP)

UDP報文的處理入口是udp_rcv函數,該函數是在ip_local_deliver_finish函數中被調用的。 1、udp_rcv函數 int udp_rcv(struct sk_buff *skb) { return __udp4

原创 【Linux4.1.12源碼分析】協議棧gro收包之TCP處理

TCP gro實現定義在tcpv4_offload對象 static const struct net_offload tcpv4_offload = { .callbacks = { .gso_segment = tcp4_gso

原创 【Linux4.1.12源碼分析】virtio_net之中斷註冊

virtio_net作爲虛擬網卡驅動,最主要的就是實現網路報文收發,對比物理網卡,當收到網絡報文時會產生中斷,由中斷處理函數接收網絡報文,這一點可以類比到virtio_net。實際上,virtio_net設備的中斷註冊是在驅動的probe