当前位置:  技术问答>linux和unix

一个网络驱动方面的问题!急,解决就给分!

    来源: 互联网  发布时间:2015-09-29

    本文导语:  请问各位大侠,网卡收到数据时,是通过函数netif_rx()把sk_buff送到上层的,那么我怎么在执行netif_rx()时,把sk_buff同时送给另一个函数? 我试了一下,在执行netif_rx()时是不可以访问sk_buff的. 请问有什么好的解决办法? ...

请问各位大侠,网卡收到数据时,是通过函数netif_rx()把sk_buff送到上层的,那么我怎么在执行netif_rx()时,把sk_buff同时送给另一个函数?
我试了一下,在执行netif_rx()时是不可以访问sk_buff的.
请问有什么好的解决办法?
接收的函数如下:
static void
e1000_clean_rx_irq(struct e1000_adapter *adapter)
{
struct e1000_desc_ring *rx_ring = &adapter->rx_ring;
struct net_device *netdev = adapter->netdev;
struct pci_dev *pdev = adapter->pdev;
struct e1000_rx_desc *rx_desc;
struct sk_buff *skb;
        
unsigned long flags;
uint32_t length;
uint8_t last_byte;
int i;
        int msgId;

        unsigned char payload[40]; // 16->36 &&&&&&&&&&& ->40 by Qifeng
int len = 40;
int error_code=0;

i = rx_ring->next_to_clean;
rx_desc = E1000_RX_DESC(*rx_ring, i);

while(rx_desc->status & E1000_RXD_STAT_DD) {

pci_unmap_single(pdev,
                 rx_ring->buffer_info[i].dma,
                 rx_ring->buffer_info[i].length,
                 PCI_DMA_FROMDEVICE);

skb = rx_ring->buffer_info[i].skb;
length = le16_to_cpu(rx_desc->length);

if(!(rx_desc->status & E1000_RXD_STAT_EOP)) {

/* All receives must fit into a single buffer */

E1000_DBG("Receive packet consumed multiple buffersn");

dev_kfree_skb_irq(skb);
memset(rx_desc, 0, sizeof(struct e1000_rx_desc));
mb();
rx_ring->buffer_info[i].skb = NULL;

i = (i + 1) % rx_ring->count;

rx_desc = E1000_RX_DESC(*rx_ring, i);
continue;
}

if(rx_desc->errors & E1000_RXD_ERR_FRAME_ERR_MASK) {

last_byte = *(skb->data + length - 1);

if(TBI_ACCEPT(&adapter->hw, rx_desc->status,
              rx_desc->errors, length, last_byte)) {

spin_lock_irqsave(&adapter->stats_lock, flags);

e1000_tbi_adjust_stats(&adapter->hw,
                       &adapter->stats,
                       length, skb->data);

spin_unlock_irqrestore(&adapter->stats_lock,
                       flags);
length--;
} else {

dev_kfree_skb_irq(skb);
memset(rx_desc, 0, sizeof(struct e1000_rx_desc));
mb();
rx_ring->buffer_info[i].skb = NULL;

i = (i + 1) % rx_ring->count;

rx_desc = E1000_RX_DESC(*rx_ring, i);
continue;
}
}

/* Good Receive */
skb_put(skb, length - ETHERNET_FCS_SIZE);
#if (LINUX_VERSION_CODE truesize = skb->len;
#endif

/* Receive Checksum Offload */
e1000_rx_checksum(adapter, rx_desc, skb);

#ifdef IANS
{
iANSsupport_t *ans = adapter->iANSdata;

if(ans->iANS_status == IANS_COMMUNICATION_UP) {
if(bd_ans_os_Receive(adapter, rx_desc, skb) == BD_ANS_FAILURE)
dev_kfree_skb_irq(skb);
else
netif_rx(skb);
} else {
#endif
skb->protocol = eth_type_trans(skb, netdev);
#ifdef NETIF_F_HW_VLAN_TX
if(adapter->vlgrp && (rx_desc->status & E1000_RXD_STAT_VP)) {
vlan_hwaccel_rx(skb, adapter->vlgrp,
(rx_desc->special & E1000_RXD_SPC_VLAN_MASK));
} else {
netif_rx(skb);
}
#else
netif_rx(skb);
#endif
#ifdef IANS
}
}
#endif
netdev->last_rx = jiffies;

memset(rx_desc, 0, sizeof(struct e1000_rx_desc));
mb();
rx_ring->buffer_info[i].skb = NULL;

i = (i + 1) % rx_ring->count;

rx_desc = E1000_RX_DESC(*rx_ring, i);
}

#ifdef MNG
        msgId = ioctl_send((struct send_param *)skb);(这边是我加的函数)
#endif
rx_ring->next_to_clean = i;

e1000_alloc_rx_buffers(adapter);
}



|
那么你在调用netif_rx()之前先使用skb_colone()或者skb_copy()等函数把这个skb备份一份出来再去交给你自己定义的函数不就OK了?

    
 
 

您可能感兴趣的文章:

  • 请有经验的朋友推荐一下Linux/Nnix下网络编程方面的书,急需学习
  • 搜集网络管理方面高手的QQ?来者有分!!
  • 哪位大哥能帮我找一些关于网络操作系统安全性能研究方面的论文
  • 谁能介绍个unix网络编程方面的QQ群?
  • 高分求网络编程方面的书籍
  • 哪里可以免费下载Linux下C网络编程方面的好书?
  • 关于网络架构方面
  • 想学linux,搞那方面比较好?网络?该看什么书?
  • 大家好,我想问一下,实际公司中网络这方面都做什么啊
  • 开始工作关于linux网络编程的工作,求大神推荐点这方面书籍
  • 请问再Linux下进行C/C++网络方面的编程 推荐使用哪个版本?
  • 冰天雪地裸体求一个linux和网络方面的小项目,要求不要太难,但能学点东西。
  • 今天第一个问题出炉....网络编程,传送文件方面的
  • 高手请进来(网络程序方面的问题),高分请教
  • 用linux做局域网服务器,结果上网很慢,怎样得知服务器网络方面的运行状态 --急急急在线等--
  • 想向linux方向的网络编程方面发展···请问应该具备什么知识啊?麻烦指点一下··
  • 来来来来来来! 高分,网络方面
  • 啊,小弟想用java做一个game,很简单那种网络飞机类game,不知道java 在图形方面的能力如何?请大虾指教指教.
  • 紧急求救!公司有2个宽带IP+一台装了linux的网络服务器,请教大家配置方面的问题。
  • Linux下编程有哪本比较好的书可以推荐下呢。本人看过鸟哥的私房菜了,linux基本操作了解了,现在想开始学linux 下的编程 。我以后打算往网络这方面去学习
  • 你们说的驱动是怎么回事啊,我觉得我都不用驱动,装好后,x-window,网络都可以用
  • 学习linux网络驱动开发有哪些比较好的书籍?
  • 弱智问题:搞内核能不能不学驱动编程啊?网络协议栈必须要谙熟驱动吗?
  • 各位设备驱动开发的朋友,请问,linux设备驱动开发和网络编程开发哪一样工资比较高呀?
  • 网络驱动程序
  • 流量优化的网络驱动程序 cFosSpeed
  • 如何调试linux的网络驱动?
  • Linux无线网络驱动 ndiswrapper
  • 在LINUX下编网络设备驱动到底用什么工具比较好?
  • 动态加载网络驱动程序问题
  • 求Linux下网络设备驱动资料!
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 网络虚拟化和智能化的解决方案 OpenContrail
  • 怎样解决REDHAT Enterprise 3网络邻居;乱码问题?
  • 社会化网络解决方案 AstroSPACES
  • 解决jsp页面使用网络路径访问图片的乱码问题
  • unix下网络编程如何解决粘包问题
  • redhat7.3安装网络打印机,,解决即给分!!!
  • 高分求救:我的solaris8如何进行网络配置?解决立即送分!
  • 请问,我在redhat9的网络服务器里,看到的windows的中文目录文件名都是乱码,怎么解决
  • 网络编程中的共享内存问题,哪位高手可以帮忙解决啊?
  • 网络可用性监测解决方案 GroundWork Monitor
  • windows server2012无法连接无线网络解决方法(windows无线连接)
  • 网络编程里解决bind绑定的问题?
  • 关于linux和网络的问题,解决立刻给分!还可以再加分!
  • 菜鸟问题: 请教网络浏览器占用大量资源的解决办法
  • 求高手解决国嵌视频中课程1-Linux系统管理,NFS网络配置问题?
  • linux下使用samba mount windows 网络共享盘后,拔掉网线linux死机该如何解决?
  • Linux 内核2.4.21使用mount命令挂载网络磁盘(windows)后,最多只能放2G文件。如何解决(急)
  • 服务器配置了IP,在网关外网络不同问题,解决注意
  • 嵌入式 linux开发中,加入网络通信代码后,ARM9启动后在超级终端打印出错误信息,请帮忙解决!谢谢
  • java网络编程高手请进!高分求教!问题解决一定给分!!!
  • Docker、Kubernetes、Neutron中的网络简介
  • 怎么用dos命令配置登陆网络,随便什么网络,举例就行~
  • 基于python实现的网络爬虫功能:自动抓取网页介绍
  • 系统网络问题之网络配置
  • 分布式CAP理论介绍:一致性(Consistency),可用性(Availability),容忍网络分区(Partition tolerance)
  • 网络爬虫/网络蜘蛛 larbin
  • 应对 Docker 网络功能难题的挑战与思考
  • 如何将运行dos的机子联入网络,或在dos下使用网络硬盘
  • Android及andriod无线网络Wifi开发的几点注意事项
  • linux不用命令方式读文件获取网络流量,如何使用C函数调用获取网络流量信息?
  • centos6网络配置及网卡设置相关命令及配置文件


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3