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

修改数据帧头的问题

    来源: 互联网  发布时间:2016-04-04

    本文导语:  您好,我刚刚接触Linux网络驱动方面,对驱动的各部分有了总体认识,但是有些细节不是很了解。  目前有以下几个问题:  1.看到网卡驱动中有skb buffer和ring buffer两种缓冲区。请问两个有什么区别,分别存放什么,...

您好,我刚刚接触Linux网络驱动方面,对驱动的各部分有了总体认识,但是有些细节不是很了解。 
目前有以下几个问题: 
1.看到网卡驱动中有skb buffer和ring buffer两种缓冲区。请问两个有什么区别,分别存放什么, 
  这两个缓冲区分别是在哪里申请的阿,比如说skb是在内存的物理映射区,那ring buffer呢? 
2.TX_ring_size和RX_ring_size以及MIN_MTU和MAX_MTU的值是怎么确定的?一个数据包的大小不是 
  46-1500字节吗?还有skb大小怎么定?缓冲区里可以容纳多少个数据包一次? 
3.netif_rx将数据包传给上层协议,这个过程是怎么进行的阿?是需要传给一个系统接口然后再传给 
  应用程序吗?那能不能让netif_rx直接把数据包传给应用程序阿?我们有个应用想通过驱动直接获取 
  并处理数据包,而不经过系统接口。 
4.在网卡驱动中,我想在数据发送前将目的MAC地址修改成想要的地址,这样的做法可行吗?即: 
  在hard_start_xmit函数的开始处添加代码: memcpy(eth->h_dest, change->daddr, dev->addr_len); 
  其中change_addr是我自己定义的。 
5.在数据接收时我想提前修改目的MAC地址和源MAC地址,那么我在net_rx函数的开头添加代码:  
  memcpy(eth->h_source, change->saddr, dev->addr_len); 
  memcpy(eth->h_dest, change->daddr, dev->addr_len); 
  这样能实现吗,可行吗?

|
看你的意思,可能想做一个二层的协议吧,你如果想将二层报文直接送到用户空间,可以尝试使用
linux的SOCK_PACKET或者Raw Socket。
SOCK_PACKET is linux specific way of getting packets at the dev level. 

环形队列是用在“轮询”收包技术中的,是一个包含sk_buff的双向循环列表,是用于DMA内存映射的。
1、首先,内核在主内存中为收发数据建立一个环形的缓冲队列(通常叫DMA环形缓冲区)。
2、内核将这个缓冲区通过DMA映射,把这个队列交给网卡;
3、网卡收到数据,就直接放进这个环形缓冲区了——也就是直接放进主内存了;然后,向系统产生一个中断;
4、内核收到这个中断,就取消DMA映射,这样,内核就直接从主内存中读取数据;[/color]
上述过程代码可以参考函数e100_rx_alloc_list与e100_rx_clean。

至于"中断"收包方式,中断收到skbuff的报文,netif_rx把报文入到队列input_pkt_queue中,然后又调用netif_rx_schedule把伪设备backlog_dev放入poll list队列,并触发软中断NET_RX_SOFTIRQ。软中断调用伪设备的poll函数process_backlog,process_backlog函数把报文出队列input_pkt_queue。交给上层(比如IP、ARP)处理。

所以如果想在收包以后修改报文的SMAC和DMAC,建议在netif_receive_skb函数中做修改。
如果想在发包的时候修改DMAC,建议在dev_queue_xmit函数中做修改。
因为这两个函数都是和网卡硬件无关的。再往下就和硬件相关了。


|
哈,点名提问呀,本人交斗胆先回答了

1 sk_buff是Linux内核中维护数据包数据用的,它的使用贯穿整个协议栈,sk_buff在接收到数据包的时候会被创建.而你说的ring buffer责是驱动自己维护的一个接收或者发送数据的缓冲,这些空间一般是在驱动启动的时候分配的.

2 TX/RX_ring_size是驱动定义的东西,它根据自己硬件特性定义的,在协议栈中并没有MIN_MTU和MAX_MTU的概念,只有MTU的概念,个人猜测它应该是这个设备的MTU可以被设置的一个范围吧.sk_buff的大小无论在接收的时候还是发送的时候都是知道数据包的大小的,只有这个2个时候创建sk_buff.
 不知道你说的这个缓冲区是指的哪个的缓冲区,一般来说网络设备的队列是1024,不过可以在驱动中设定,这个缓冲是问题3中要问答的

3 netif_rx会把sk_buff放入一个缓冲队列中,然后发出一个软中断,这个软中断用于处理sk_buff,这时就是进入了我们的协议栈了
  可以,不过不建议这么作,如果你需要可以注册一个对协议ETH_P_ALL的处理函数,那么你的这个函数就可以处理所有的数据包,至于怎么写,这个说了就太多了
  不通过系统接口,这不是个好主意,只能这个提议,因为不知道你们具体的需求.

4 可以,只是兼容性问题,如果换了别的网卡呢?
5 net_rx是什么?我暂且把它当作是你要打netif_rx吧,这个也是可以的
  4和5合起来说吧,只要确定好eth就没问题.

希望不是太难看懂

|
建议在软中断后的函数内改;
4:在dev_queue_xmit后改更合适,需要考虑arp报文问题.
5:很别扭,做实验就罢了.

|
3.传递给应用程序,可不可以这样做呢?先通过读取PP_RxLength获取数据长度,然后读取到一个由kmalloc申请的缓冲区中,接着使用copy_to_user()拷贝到用户区。

1楼的,他那个net_rx可能是一个数据接收子程序吧,中断的时候调用的,里面使用了netif_rx(skb);

|
2 楼的说的清楚


    
 
 

您可能感兴趣的文章:

  • sharepoint 2010中item.Update()和item.SystemUpdate 修改数据版本问题解决
  • 对数据库的查询结果resultset进行修改后,怎么将修改的信息传回给数据库
  • 本来可以修改skb里tcp数据的,突然不能修改了,为什么?
  • sql数据库如何查询修改数据库恢复模式?
  • 如何在方法内部对外部数据进行操作,不用返回值:而外部数据已经被修改。
  • 如何修改内存数据
  • mysql数据库修改数据表引擎的方法
  • sql数据库修改数据库用户
  • sql数据库多用户模式修改方法
  • 修改数据库为多用户模式
  • 怎么修改linux centOS的mysql 的数据存储路径
  • SecureCRT如何修改数据量大的文件?
  • 如何修改linux内核来捕获入侵检测的数据,各位大虾多多赐教。
  • sql 批量修改数据库表
  • QT编程中能否用TextEdit 读取修改 存储数据?
  • 新手:用WEB页面修改数据库中的表?
  • 数据库修改历史记录工具 dbdeploy
  • mysql字符集和数据库引擎修改方法分享
  • 修改数据库文件及日志文件增量的sql语句
  • 有关结果数据集的修改-java和ORACLE数据库
  • 如何修改mysql数据库的max_allowed_packet参数
  • 修改配置真正解决php文件上传大小限制问题(nginx+php)
  • ◆◆◆◆遇到这样一个问题,请帮忙修改修改.
  • 修改配置真正解决php文件上传大小限制问题(apache+php)
  • linux修改用户密码出现问题,当密码修改为2011042109时,我可以用2011042108或2011042112等只要前8位一样后面任意输入都可以登录
  • 修改数据库文件及日志文件增量的sql语句 iis7站长之家
  • 关于root登录修改locale的问题?
  • 修改口令问题
  • 问一个修改权限问题
  • 使用SSH修改linux密码的问题
  • 用ioctl修改网卡接口eth0的ip地址的问题,请~
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 修改Windows硬盘分区名称
  • unix 下 C++实现 ftp 到另一台主机上 修改文件内容 !能不能直接在主机上修改 还是只能get下来本地修改完后 在put上去
  • mysql中如何查看最大连接数(max_connections)和修改最大连接数
  • 高手帮帮忙!!! 在线等!!outlook的附件修改且保存后,再次打开发现是修改之前的原件
  • 通过docker commit命令保存对docker容器的修改
  • 修改ip地址的话应该修改/ect下哪个文件里的内容?
  • linux/Centos下查看和修改网卡Mac地址(ifconfig命令)
  • 原密码被人恶意修改,如何修改suse系统的超级用户密码(急)
  • linux/Centos/ubuntu下如何使用umask命令修改新建文件时的默认权限
  • 有什么命令可以修改整个目录下文件的最后修改时间?
  • windows/windows 7/windows 8 下打开查看、修改及保存超大(GB级)文本文件及其它类型文件的工具-PilotEdit
  • 请教一下,如何修改ubuntu命令,使其可以直接修改kvm虚拟机配置
  • shell 程序监控网站网页是否被修改,如果被修改停止服务器的运行?
  • 请教下关于root密码忘记了怎么修改(除了去现场单用户修改)
  • [fedora]下怎么修改MAC地址,并且要重新动的时候还是修改后的值。
  • 哪个DOS命令可以修改指定文件的时间(修改时间)?
  • 急,请问如何修改网络接口eth为其它名称,如网络接口为abc0, abc1,要修改哪个配置文件?
  • 用touch命令修改访问时间时,却发现连修改时间和状态时间也改了.疑惑
  • BIOS是在ROM中的,如果修改了BIOS项,那么修改的东西是放在哪呢
  • 简单了,请问怎样修改runlevel?我现在的runlevel是5,想修改成3,怎么办?
  • 请问如何修改网卡的速率,如强制100M,强制10M,怎么实现的,是不是要修改驱动?


  • 站内导航:


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

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

    浙ICP备11055608号-3