慢慢欣赏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
版权声明:本文为博主原创文章,转载请附上博文链接!

相关文章
|
5天前
|
监控 安全 Linux
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景,包括 ping(测试连通性)、traceroute(跟踪路由路径)、netstat(显示网络连接信息)、nmap(网络扫描)、ifconfig 和 ip(网络接口配置)。掌握这些命令有助于高效诊断和解决网络问题,保障网络稳定运行。
18 2
|
17天前
|
域名解析 网络协议 安全
|
23天前
|
运维 监控 网络协议
|
5天前
|
存储 网络协议 安全
30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场
本文精选了 30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场。
18 2
|
16天前
|
网络协议 安全 Go
Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
【10月更文挑战第28天】Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
44 13
|
16天前
|
存储 安全 网络安全
云计算与网络安全:保护数据的新策略
【10月更文挑战第28天】随着云计算的广泛应用,网络安全问题日益突出。本文将深入探讨云计算环境下的网络安全挑战,并提出有效的安全策略和措施。我们将分析云服务中的安全风险,探讨如何通过技术和管理措施来提升信息安全水平,包括加密技术、访问控制、安全审计等。此外,文章还将分享一些实用的代码示例,帮助读者更好地理解和应用这些安全策略。
|
19天前
|
存储 Ubuntu Linux
2024全网最全面及最新且最为详细的网络安全技巧 (三) 之 linux提权各类技巧 上集
在本节实验中,我们学习了 Linux 系统登录认证的过程,文件的意义,并通过做实验的方式对 Linux 系统 passwd 文件提权方法有了深入的理解。祝你在接下来的技巧课程中学习愉快,学有所获~和文件是 Linux 系统登录认证的关键文件,如果系统运维人员对shadow或shadow文件的内容或权限配置有误,则可以被利用来进行系统提权。上一章中,我们已经学习了文件的提权方法, 在本章节中,我们将学习如何利用来完成系统提权。在本节实验中,我们学习了。
|
20天前
|
安全 网络安全 数据安全/隐私保护
网络安全与信息安全:从漏洞到加密,保护数据的关键步骤
【10月更文挑战第24天】在数字化时代,网络安全和信息安全是维护个人隐私和企业资产的前线防线。本文将探讨网络安全中的常见漏洞、加密技术的重要性以及如何通过提高安全意识来防范潜在的网络威胁。我们将深入理解网络安全的基本概念,学习如何识别和应对安全威胁,并掌握保护信息不被非法访问的策略。无论你是IT专业人士还是日常互联网用户,这篇文章都将为你提供宝贵的知识和技能,帮助你在网络世界中更安全地航行。
|
23天前
|
存储 安全 网络安全
云计算与网络安全:如何保护您的数据
【10月更文挑战第21天】在这篇文章中,我们将探讨云计算和网络安全的关系。随着云计算的普及,网络安全问题日益突出。我们将介绍云服务的基本概念,以及如何通过网络安全措施来保护您的数据。最后,我们将提供一些代码示例,帮助您更好地理解这些概念。
|
27天前
|
Ubuntu Linux 虚拟化
Linux虚拟机网络配置
【10月更文挑战第25天】在 Linux 虚拟机中,网络配置是实现虚拟机与外部网络通信的关键步骤。本文介绍了四种常见的网络配置方式:桥接模式、NAT 模式、仅主机模式和自定义网络模式,每种模式都详细说明了其原理和配置步骤。通过这些配置,用户可以根据实际需求选择合适的网络模式,确保虚拟机能够顺利地进行网络通信。