免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1871 | 回复: 9
打印 上一主题 下一主题

关于桥接代码的一处疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-10-29 09:31 |只看该作者 |倒序浏览
看过linux内核桥接代码的朋友应该知道,数据包经过桥需要走两次netif_receive_skb
第一次skb->dev是物理设备,第二次是桥设备
于是我有个疑问,在handle_bridge之前会向所有注册在ptype_all上的结构发送一份数据包
而第二次进入netif_receive_skb的时候又会向ptype_all发送一份
这样看来我如果在有桥设备的主机上注册一个AF_PACKET的套接字,岂不是会收到两次经过桥端口发往本地的数据包?
不知道是不是这样?

另外,我想配置一个桥写个程序试一下,用以下命令:
brctl addbr br0
brctl addif br0 eth0
但是这样就无法上网了,抓包发现arp请求能正常发出,回来的arp也被tcpdump抓到,但是没有进入arp缓存,会不停的发送arp请求,不知道怎么回事。

论坛徽章:
0
2 [报告]
发表于 2009-10-29 09:45 |只看该作者
可以稍微看下这贴.
http://linux.chinaunix.net/bbs/viewthread.php?tid=1136185
一般注册一个AF_PACKET的套接字是匹配设备的,比如br0.

论坛徽章:
0
3 [报告]
发表于 2009-10-29 10:00 |只看该作者
原帖由 epegasus 于 2009-10-29 09:45 发表
可以稍微看下这贴.
http://linux.chinaunix.net/bbs/viewthread.php?tid=1136185
一般注册一个AF_PACKET的套接字是匹配设备的,比如br0.


这么快就回复了:wink:
但是AF_PACKET套接字好像可以不bind,这时dev就等于NULL,相当于匹配所有设备,
可以试下这个程序

  1. #include <unistd.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <sys/types.h>
  5. #include <sys/socket.h>
  6. #include <netpacket/packet.h>
  7. #include <net/ethernet.h>
  8. #include <errno.h>

  9. #define err(str)\
  10.     do{\
  11.         perror(str);\
  12.         exit(EXIT_FAILURE);\
  13.     }while(0);

  14. int main()
  15. {
  16.     int i,fd;
  17.     size_t recvlen;
  18.     unsigned char buf[2000];
  19.     struct sockaddr_ll addr;

  20.     fd = socket(AF_PACKET, SOCK_DGRAM, htons(ETH_P_ALL));
  21.     if(fd < 0)
  22.         err("socket");

  23.     while(1)
  24.     {   
  25.         recvlen = recv(fd, buf, 2000, 0);
  26.         if(recvlen < 0)
  27.             err("recv");

  28.         printf("%d bytes received\n", recvlen);
  29.     }   

  30.     return 0;
  31. }
复制代码

论坛徽章:
0
4 [报告]
发表于 2009-10-29 10:05 |只看该作者

回复 #3 peimichael 的帖子

对,是的,所以,不绑定的情况下,我觉得应该有2份.可以试下.

论坛徽章:
0
5 [报告]
发表于 2009-10-29 10:10 |只看该作者
原帖由 epegasus 于 2009-10-29 10:05 发表
对,是的,所以,不绑定的情况下,我觉得应该有2份.可以试下.


我想试来着,可是该死的桥配不好...:em11:
我再查查看怎么配置桥的。。

论坛徽章:
0
6 [报告]
发表于 2009-10-29 10:13 |只看该作者

回复 #5 peimichael 的帖子

不是br0上放IP,ETH0取消IP么?

论坛徽章:
0
7 [报告]
发表于 2009-10-29 10:19 |只看该作者
是的是的,原来我少了两步配置ip的过程
现在成功了
不管发送接收,都统统是双份。
觉得有点,估计设计者想的是把br0和eth0当作两个设备看
收到了数据包算两个都收到。

谢谢楼上啦

论坛徽章:
0
8 [报告]
发表于 2009-10-29 10:25 |只看该作者

回复 #7 peimichael 的帖子

是2份了,系统看到的br0还是虚拟网络设备.
而且通常做法还是指定网络设备的,比如我们的抓包工具,就是这样.
有时间还可以讨论下这个问题..
http://linux.chinaunix.net.fastc ... ad-1124710-1-1.html

论坛徽章:
0
9 [报告]
发表于 2009-10-29 10:45 |只看该作者
ls这个帖子我不知道为什么不能回复,
就在这里讨论把,

  1. static inline int should_deliver(const struct net_bridge_port *p,
  2.                                  const struct sk_buff *skb)
  3. {
  4.         return (skb->dev != p->dev && p->state == BR_STATE_FORWARDING);
  5. }
复制代码


这里一个should_deliver中skb->dev != p->dev就可以防止把数据包从源端口回射回去阿
ls是不是看漏了?

论坛徽章:
0
10 [报告]
发表于 2009-10-29 11:03 |只看该作者
晕死,经常出现不能回复的问题,删除所有文件,重登陆就好了.
确实是看漏了...
不过我漏的不是这地方,而是没发现 prev = p;这个也是归if (should_deliver(p, skb)) 管的.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP