关闭

【Linux4.1.12源码分析】virtio_net之NAPI机制

在虚拟化场景,中断的开销更大,所以要尽可能的少用中断,我们从中断处理函数开始看。 skb_recv_done函数 static void skb_recv_done(struct virtqueue *rvq) { struct virtnet_info *vi = rvq->vdev->priv; struct receive_queue *rq = &vi->rq[vq2rxq(r...
阅读(535) 评论(0)

【Linux4.1.12源码分析】virtio_net之中断注册

virtio_net作为虚拟网卡驱动,最主要的就是实现网路报文收发,对比物理网卡,当收到网络报文时会产生中断,由中断处理函数接收网络报文,这一点可以类比到virtio_net。实际上,virtio_net设备的中断注册是在驱动的probe函数中完成的。 virtnet_probe函数 static int virtnet_probe(struct virtio_device *vdev) ...
阅读(909) 评论(0)

【Linux4.1.12源码分析】收包软中断和NAPI

不讲概念,直接上收包软中断处理代码。  net_rx_action函数 static void net_rx_action(struct softirq_action *h) { struct softnet_data *sd = this_cpu_ptr(&softnet_data); unsigned long time_limit = jiffies + 2; //定义了处理s...
阅读(964) 评论(0)

【Linux4.1.12源码分析】VXLAN之remcsum实现分析

根据之前VXLAN之csum和remcsum实现分析(发包)的分析,由csum配置决定发送端是否计算UDP层的csum。 remcsum会在vxlan头中保存相关信息,然后在接收端进行处理,先看发送端如何构造vxlan头信息。 vxlan_xmit_skb函数(片段,发送方向) if (type & SKB_GSO_TUNNEL_REMCSUM) { //配置remcsum场景...
阅读(422) 评论(0)

【Linux4.1.12源码分析】UDP层csum计算

我们以发包和收包两个方向,分析UDP层的csum计算,发包方向,以vxlan封包流程中的UDP头封装作为例子来进行分析。 udp_set_csum函数(封装UDP头时调用) void udp_set_csum(bool nocheck, struct sk_buff *skb, __be32 saddr, __be32 daddr, int len) { struct udphd...
阅读(412) 评论(0)

【Linux4.1.12源码分析】VXLAN之csum和remcsum实现分析(发包)

vxlan报文的csum处理逻辑由VXLAN_F_UDP_CSUM、VXLAN_F_REMCSUM_TX、VXLAN_F_REMCSUM_RX、VXLAN_F_REMCSUM_NOPARTIAL等等标记决定,本篇从发包流程来看实现逻辑: vxlan_xmit_skb函数,还包括iptunnel_handle_offloads函数,实现功能如下图: 总结下: 1)如果报文是gso报文,...
阅读(1051) 评论(0)

【OVS2.5.0源码分析】vxlan端口创建流程分析

vxlan端口是通过ovs-vsctl命令创建的,整个调用流程如下: bridge_reconfigure->bridge_add_ports->bridge_add_ports__->iface_create->iface_do_create->ofproto_port_add->port_add(ofproto_class)->dpif_port_add->dpif_netlink_port...
阅读(1063) 评论(1)

【Linux4.1.12源码分析】VXLAN报文内核协议栈处理

4.1.12内核已经支持vxlan报文的gro功能,意味着vxlan报文交给协议栈之前,已经被聚合过了,而在早期的内核中聚合逻辑是在encap_rcv函数之后实现的。 之前分析的UDP报文处理中,可以知道如果udp_sock定义了encap_rcv函数,将会把报文交给该函数处理,而不是传统的保存到sock队列,唤醒进程收包。 udp_sock定义的encap_rcv函数是在vxlan_sock...
阅读(1229) 评论(0)

【Linux4.1.12源码分析】协议栈gro收包之完整流程分析

前面几篇分析了不同协议层的gro实现,本篇分析报文提交协议栈的完整逻辑,其他逻辑例如csum等不深入分析。 本文分析重点是逻辑,功能执行主体可能是有不一致的。 MAC层逻辑 1、网卡设备不支持GRO,提交当前报文到协议栈; 2、当前报文为GRO,提交报文到协议栈; 3、当前报文已已聚合过(frag_list不为空),提交当前报文到协议栈; 4、当前报文csum_bad置为1,提交当前报文...
阅读(407) 评论(0)

【Linux4.1.12源码分析】协议栈gro收包之VXLAN处理

VXLAN gro处理不是通过定义常量实现的,而是通过动态注册的实现的,在UDP层处理时我们知道是注册到udp_offload_base全局变量中,我们先看下注册过程 vxlan_socket_create函数 /* Create new listen socket if needed */ static struct vxlan_sock *vxlan_socket_create(str...
阅读(1298) 评论(0)

【Linux4.1.12源码分析】协议栈gro收包之TCP处理

TCP gro实现定义在tcpv4_offload对象 static const struct net_offload tcpv4_offload = { .callbacks = { .gso_segment = tcp4_gso_segment, .gro_receive = tcp4_gro_receive, .gro_complete = tcp4_gro_complete...
阅读(954) 评论(0)

【Linux4.1.12源码分析】协议栈gro收包之UDP处理

UDP offload为udpv4_offload static const struct net_offload udpv4_offload = { .callbacks = { .gso_segment = udp4_ufo_fragment, .gro_receive = udp4_gro_receive, .gro_complete = udp4_gro_complete...
阅读(388) 评论(0)

【Linux4.1.12源码分析】协议栈gro收包之IP层处理

IP层的offload定义是ip_packet_offload static struct packet_offload ip_packet_offload __read_mostly = { .type = cpu_to_be16(ETH_P_IP), .callbacks = { .gso_segment = inet_gso_segment, .gro_receive = in...
阅读(395) 评论(0)

【Linux4.1.12源码分析】协议栈gro收包之MAC层处理

网卡驱动接收到报文后,通过netif_receive_skb提交报文到协议栈处理,由于网络设备MTU一般都设置为1500,对于TCP报文如果收到报文后就提交给协议栈处理是非常低效的,一般是通过聚合后再提交给协议栈,可以极大的降低内核的开销。 内核提供了napi_gro_receive函数,通过该函数可以实现报文聚合后再提交给协议栈。 1、napi_gro_receive函数 gro_resul...
阅读(604) 评论(0)

【Linux4.1.12源码分析】IP层csum计算

从收包和发包来看IP层的csum是如何计算的,是如何进行校验的。csum值为2个字节长度。 发包流程如下所示,在__ip_local_out_sk函数中调用ip_send_check函数进行csum计算。 ip_local_out->ip_local_out_sk->__ip_local_out->__ip_local_out_sk ip_send_check函数 /* Gener...
阅读(297) 评论(0)
88条 共6页1 2 3 4 5 ... 下一页 尾页
    个人资料
    • 访问:81173次
    • 积分:1611
    • 等级:
    • 排名:千里之外
    • 原创:88篇
    • 转载:0篇
    • 译文:0篇
    • 评论:13条
    最新评论