慢慢欣赏linux 网络协议栈四 sk_buff以及数据收发

简介: 慢慢欣赏linux 网络协议栈四 sk_buff以及数据收发以3c359x.c的网卡为例,因为这是《深入理解Linux网络技术内幕》里面的例子irqreturn_t vortex_interrupt(int irq, void *dev_id)vortex_rx(dev);=>int vor...

慢慢欣赏linux 网络协议栈四 sk_buff以及数据收发
以3c359x.c的网卡为例,因为这是《深入理解Linux网络技术内幕》里面的例子

irqreturn_t vortex_interrupt(int irq, void *dev_id)

vortex_rx(dev);
=>int vortex_rx(struct net_device *dev)
    struct vortex_private *vp = netdev_priv(dev);
    void __iomem *ioaddr = vp->ioaddr;
    short rx_status;
    while ((rx_status = ioread16(ioaddr + RxStatus)) > 0)
        int pkt_len = rx_status & 0x1fff;
        struct sk_buff *skb = dev_alloc_skb(pkt_len + 5);
        skb_reserve(skb, 2);    /* Align IP on 16 byte boundaries */
        if (vp->bus_master && ! (ioread16(ioaddr + Wn7_MasterStatus) & 0x8000)) 
            dma_addr_t dma = pci_map_single(VORTEX_PCI(vp), skb_put(skb, pkt_len), pkt_len, PCI_DMA_FROMDEVICE);
            iowrite32(dma, ioaddr + Wn7_MasterAddr);
            iowrite16((skb->len + 3) & ~3, ioaddr + Wn7_MasterLen);
            iowrite16(StartDMAUp, ioaddr + EL3_CMD);
            while (ioread16(ioaddr + Wn7_MasterStatus) & 0x8000)
                ;
            pci_unmap_single(VORTEX_PCI(vp), dma, pkt_len, PCI_DMA_FROMDEVICE);
        else 
            ioread32_rep(ioaddr + RX_FIFO, skb_put(skb, pkt_len), (pkt_len + 3) >> 2);
            
        iowrite16(RxDiscard, ioaddr + EL3_CMD); /* Pop top Rx packet. */
        skb->protocol = eth_type_trans(skb, dev);
        netif_rx(skb)
        =>int netif_rx(struct sk_buff *skb)
            if (queue->input_pkt_queue.qlen <= netdev_max_backlog)
                if (queue->input_pkt_queue.qlen)
        enqueue:
                    __skb_queue_tail(&queue->input_pkt_queue, skb);
                    return NET_RX_SUCCESS;
                    
                napi_schedule(&queue->backlog);
                =>inline void napi_schedule(struct napi_struct *n)
                    if (napi_schedule_prep(n))
                        __napi_schedule(n);
                        =>void __napi_schedule(struct napi_struct *n)
                            list_add_tail(&n->poll_list, &__get_cpu_var(softnet_data).poll_list);
                            __raise_softirq_irqoff(NET_RX_SOFTIRQ);//唤醒软中断
                goto enqueue;

收包软中断入口函数

void net_rx_action(struct softirq_action *h)

struct list_head *list = &__get_cpu_var(softnet_data).poll_list;
while (!list_empty(list))
    n = list_first_entry(list, struct napi_struct, poll_list);

    have = netpoll_poll_lock(n);

    weight = n->weight;
    
    n = list_first_entry(list, struct napi_struct, poll_list);

    have = netpoll_poll_lock(n);

    weight = n->weight;
    
    work = 0;
    if (test_bit(NAPI_STATE_SCHED, &n->state))
        work = n->poll(n, weight);
        =>int process_backlog(struct napi_struct *napi, int quota)
        
    budget -= work;

Linux 网络协议栈开发代码分析篇之数据收发(一) —— netif_receive_skb()函数
https://blog.csdn.net/zqixiao_09/article/details/79185800

Linux内核--网络栈实现分析(二)--数据包的传递过程(上)

https://blog.csdn.net/geekcome/article/details/7492423

作者:天麓
来源:CSDN
原文:https://blog.csdn.net/shipinsky/article/details/88923786
版权声明:本文为博主原创文章,转载请附上博文链接!

相关文章
|
14天前
|
Linux 网络性能优化 网络安全
Linux(openwrt)下iptables+tc工具实现网络流量限速控制(QoS)
通过以上步骤,您可以在Linux(OpenWrt)系统中使用iptables和tc工具实现网络流量限速控制(QoS)。这种方法灵活且功能强大,可以帮助管理员有效管理网络带宽,确保关键业务的网络性能。希望本文能够为您提供有价值的参考。
65 28
|
11天前
|
网络协议 Unix Linux
深入解析:Linux网络配置工具ifconfig与ip命令的全面对比
虽然 `ifconfig`作为一个经典的网络配置工具,简单易用,但其功能已经不能满足现代网络配置的需求。相比之下,`ip`命令不仅功能全面,而且提供了一致且简洁的语法,适用于各种网络配置场景。因此,在实际使用中,推荐逐步过渡到 `ip`命令,以更好地适应现代网络管理需求。
26 11
|
19天前
|
前端开发 小程序 Java
uniapp-网络数据请求全教程
这篇文档介绍了如何在uni-app项目中使用第三方包发起网络请求
37 3
|
1月前
|
Ubuntu Linux 开发者
Ubuntu20.04搭建嵌入式linux网络加载内核、设备树和根文件系统
使用上述U-Boot命令配置并启动嵌入式设备。如果配置正确,设备将通过TFTP加载内核和设备树,并通过NFS挂载根文件系统。
82 15
|
2月前
|
Ubuntu Unix Linux
Linux网络文件系统NFS:配置与管理指南
NFS 是 Linux 系统中常用的网络文件系统协议,通过配置和管理 NFS,可以实现跨网络的文件共享。本文详细介绍了 NFS 的安装、配置、管理和常见问题的解决方法,希望对您的工作有所帮助。通过正确配置和优化 NFS,可以显著提高文件共享的效率和安全性。
206 7
|
3月前
|
网络协议
网络通信的基石:TCP/IP协议栈的层次结构解析
在现代网络通信中,TCP/IP协议栈是构建互联网的基础。它定义了数据如何在网络中传输,以及如何确保数据的完整性和可靠性。本文将深入探讨TCP/IP协议栈的层次结构,揭示每一层的功能和重要性。
102 5
|
3月前
|
弹性计算 安全 容灾
阿里云DTS踩坑经验分享系列|使用VPC数据通道解决网络冲突问题
阿里云DTS作为数据世界高速传输通道的建造者,每周为您分享一个避坑技巧,助力数据之旅更加快捷、便利、安全。本文介绍如何使用VPC数据通道解决网络冲突问题。
152 0
|
9月前
|
网络协议 物联网 网络性能优化
物联网网络协议-MQTT协议的使用
物联网网络协议-MQTT协议的使用
296 2
|
7月前
|
网络协议 算法 安全
【网络协议基础】TCP/IP协议大全
TCP/IP协议是现代计算机网络通信的基础,是互联网及局域网广泛使用的一套协议。TCP/IP协议集采用分层模型,以便于网络的设计、实现和管理。
275 2