网络子系统8_netpoll机制

本文详细介绍了Linux内核网络子系统中的netpoll机制,它用于在网络和I/O不可用时仍能收发数据包,主要用于网络控制台和远程通信。netpoll需要驱动程序支持,其运行条件包括以太网介质、特定的协议栈配置。在协议栈中,netpoll在netif_receive_skb处介入,处理符合特定条件的数据包,涉及arp响应和数据接收流程。
摘要由CSDN通过智能技术生成
//	1.netpoll的作用:
//		用于让内核在网络和I/O子系统尚不能完整可用时,依然能发送和接收数据包,主要用于网络控制台和远程。

//	2.netpoll机制需要驱动程序的支持:
//		使外部通过软件方式调用驱动程序的中断处理程序。
//		大部分poll_controller定义如下:
//			void this_controller(struct net_device *dev)
//			{
//				disable_dev_interrupt(dev);	
//				call_interrupt_handler(dev->irq, dev);
//				enable_device_interrupt(dev);
//			}

//	3.netpoll运行条件:
//		3.1 以太网介质
//		3.2 本机l2地址,或者l2广播地址
//		3.3 l3协议为ip协议
//		3.4 ip数据包没有分片,且有效
//		3.5 l4协议为udp协议,且有效

//	4.netpoll在协议栈中的切入点为netif_receive_skb

//	5.static atomic_t trapped;
//	trapped用于指示在netpoll_rx执行之后,netif_receive_skb是否丢弃该封包。



//	函数任务:
//		1. 如果入口封包为arp封包,且开启了trapped模式,则处理入口arp,并返回。
//		2. 检查入口skb是否可以被处理。
//		3. 在关中断的情况下,遍历已经注册的netpoll控制块,向其传递skb。
//	调用路径:netif_receive_skb->netpoll_rx
1.1 int netpoll_rx(struct sk_buff *skb)
{
	int proto, len, ulen;
	struct iphdr *iph;//ip头
	struct udphdr *uh;//udp头
	struct netpoll *np;//netpoll描述符
	struct list_head *p;
	unsigned long flags;
	//netpoll只适用以太网设备
	if (skb->dev->type != ARPHRD_ETHER)
		goto out;

	//trapped被设置,则由netpoll机制处理入口arp
	if (skb->protocol == __constant_htons(ETH_P_ARP) &&
	    atomic_read(&trapped)) {
		arp_r
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值