网络子系统21_传输接收软中断的触发

简介:

//参考 深入理解linux网络技术内幕

//设备接收数据的调度
//在由驱动程序提供的数据接收中断中:
//	1.非napi设备使用netif_rx向上传递skb
//	2.napi设备使用netif_rx_schedule


//设备发送数据的调度
//	调度只针对具有队列规则的设备,在qdisc_run中如果无法获得xmit_lock锁,则通过规则队列重新入队skb,在net_tx_action中,获取queue_lock失败,调度设备
//	对于不使用队列规则的设备,直接通过dev_queue_xmit调用驱动的hard_start_xmit完成传输
//调度发生的路径
//	dev_queue_xmit->qdisc_run->netif_schedule
//	net_tx_action->netif_schedule

//调度设备发送数据,将设备链接到per-cpu的softnet_data->output_queue中,触发软中断
1.1 static inline void netif_schedule(struct net_device *dev)
{
	//如果设备没有关闭传输
	if (!test_bit(__LINK_STATE_XOFF, &dev->state))
		//执行实际的调度设备操作
		__netif_schedule(dev);
}

//netif_schedule->__netif_schedule
1.2 static inline void __netif_schedule(struct net_device *dev)
{
	//设备没有被调度
	if (!test_and_set_bit(__LINK_STATE_SCHED, &dev->state)) {
		unsigned long flags;
		struct softnet_data *sd;
		//关本cpu中断
		local_irq_save(flags);
		sd = &__get_cpu_var(softnet_data);
		//将设备挂在到softnet_data的output_queue上
		dev->next_sched = sd->output_queue;
		sd->output_queue = dev;
		//触发传输软中断
		raise_softirq_irqoff(NET_TX_SOFTIRQ);
		local_irq_restore(flags);
	}
}


//napi、非napi接收数据时的调度区别



                         

//非napi设备接收中断中使用,将skb向上传输
2.1 int netif_rx(struct sk_buff *skb)
{
	int this_cpu;
	struct softnet_data *queue;
	unsigned long flags;
	//处理netpoll
	if (skb->dev->netpoll_rx && netpoll_rx(skb)) {
		kfree_skb(skb);
		return NET_RX_DROP;
	}
	//更新数据接收到的时间戳
	if (!skb->stamp.tv_sec)
		net_timestamp(&skb->stamp);

	//关中断
	local_irq_save(flags);
	this_cpu = smp_processor_id();
	queue = &__get_cpu_var(softnet_data);//获取当前cpu的softnet_data

	__get_cpu_var(netdev_rx_stat).total++;//增加收到数据包的统计变量
	if (queue->input_pkt_queue.qlen <= netdev_max_backlog) {//接收队列有空闲空间
		if (queue->input_pkt_queue.qlen) {
			if (queue->throttle)//队列处于拥塞状态
				goto drop;

enqueue:
			dev_hold(skb->dev);
			__skb_queue_tail(&queue->input_pkt_queue, skb);//挂载skb到非NAPI设备专用的输入队列

			local_irq_restore(flags);//开中断
			return queue->cng_level;//返回拥塞等级
		}

		if (queue->throttle)//输入队列中没有skb,但是上次被标记为拥塞
			queue->throttle = 0;//重新开启数据接收

		netif_rx_schedule(&queue->backlog_dev);//运行到此处,说明输入队列中的skb个数为0,调度积压设备,入列skb
		goto enqueue;
	}
	//当发生拥塞时,会暂停数据的接收,直到input_pkt_queue为空之后,才重新开启数据的接收
	if (!queue->throttle) {
		queue->throttle = 1;
		__get_cpu_var(netdev_rx_stat).throttled++;
	}

drop:
	__get_cpu_var(netdev_rx_stat).dropped++;
	local_irq_restore(flags);

	kfree_skb(skb);
	return NET_RX_DROP;
}

//napi设备接收中断中使用,链接设备到softnet->poll_list上
3.1 static inline void netif_rx_schedule(struct net_device *dev)
{
	if (netif_rx_schedule_prep(dev))//检测设备是否已经被调度
		__netif_rx_schedule(dev);//调度设备
}


3.2 static inline void __netif_rx_schedule(struct net_device *dev)
{
	unsigned long flags;

	local_irq_save(flags);
	dev_hold(dev);
	list_add_tail(&dev->poll_list, &__get_cpu_var(softnet_data).poll_list);//将设备链接到softnet_data->poll_list上
	if (dev->quota < 0)
		dev->quota += dev->weight;//分配设备此次调度的配置
	else
		dev->quota = dev->weight;
	__raise_softirq_irqoff(NET_RX_SOFTIRQ);//触发软中断
	local_irq_restore(flags);
} 



目录
相关文章
|
2月前
|
运维 架构师 安全
二层协议透明传输:让跨域二层协议“无感穿越”多服务商网络
简介:本文详解二层协议透明传输技术,适用于企业网工、运营商及架构师,解决LLDP/LACP/BPDU跨运营商传输难题,实现端到端协议透传,提升网络韧性与运维效率。
|
8月前
|
存储 运维 监控
阿里云飞天洛神云网络子系统“齐天”:超大规模云网络智能运维的“定海神针”
阿里云飞天洛神云网络子系统“齐天”:超大规模云网络智能运维的“定海神针”
321 3
|
安全 搜索推荐 网络安全
HTTPS协议是**一种通过计算机网络进行安全通信的传输协议
HTTPS协议是**一种通过计算机网络进行安全通信的传输协议
354 11
|
网络协议 网络安全 网络虚拟化
本文介绍了十个重要的网络技术术语,包括IP地址、子网掩码、域名系统(DNS)、防火墙、虚拟专用网络(VPN)、路由器、交换机、超文本传输协议(HTTP)、传输控制协议/网际协议(TCP/IP)和云计算
本文介绍了十个重要的网络技术术语,包括IP地址、子网掩码、域名系统(DNS)、防火墙、虚拟专用网络(VPN)、路由器、交换机、超文本传输协议(HTTP)、传输控制协议/网际协议(TCP/IP)和云计算。通过这些术语的详细解释,帮助读者更好地理解和应用网络技术,应对数字化时代的挑战和机遇。
1021 3
|
网络协议 算法 网络性能优化
计算机网络常见面试题(一):TCP/IP五层模型、TCP三次握手、四次挥手,TCP传输可靠性保障、ARQ协议
计算机网络常见面试题(一):TCP/IP五层模型、应用层常见的协议、TCP与UDP的区别,TCP三次握手、四次挥手,TCP传输可靠性保障、ARQ协议、ARP协议
|
网络协议 网络虚拟化
接收网络包的过程——从硬件网卡解析到IP
【9月更文挑战第18天】这段内容详细描述了网络包接收过程中机制。当网络包触发中断后,内核处理完这批网络包,会进入主动轮询模式,持续处理后续到来的包,直至处理间隙返回其他任务,从而减少中断次数,提高处理效率。此机制涉及网卡驱动初始化时注册轮询函数,通过软中断触发后续处理,并逐步深入内核网络协议栈,最终到达TCP层。整个接收流程分为多个层次,包括DMA技术存入Ring Buffer、中断通知CPU、软中断处理、以及进入内核网络协议栈等多个步骤。
|
网络协议 网络架构
【第三期】计算机网络常识/网络分层模型与数据包封装传输过程
【第三期】计算机网络常识/网络分层模型与数据包封装传输过程
435 0
|
11月前
|
SQL 安全 网络安全
网络安全与信息安全:知识分享####
【10月更文挑战第21天】 随着数字化时代的快速发展,网络安全和信息安全已成为个人和企业不可忽视的关键问题。本文将探讨网络安全漏洞、加密技术以及安全意识的重要性,并提供一些实用的建议,帮助读者提高自身的网络安全防护能力。 ####
264 17
|
11月前
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将从网络安全漏洞、加密技术和安全意识三个方面进行探讨,旨在提高读者对网络安全的认识和防范能力。通过分析常见的网络安全漏洞,介绍加密技术的基本原理和应用,以及强调安全意识的重要性,帮助读者更好地保护自己的网络信息安全。
223 10
|
11月前
|
存储 SQL 安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将介绍网络安全的重要性,分析常见的网络安全漏洞及其危害,探讨加密技术在保障网络安全中的作用,并强调提高安全意识的必要性。通过本文的学习,读者将了解网络安全的基本概念和应对策略,提升个人和组织的网络安全防护能力。