搜索
bottom↓
回复: 11

lwip双网卡移植问题

[复制链接]

出0入0汤圆

发表于 2013-5-19 03:54:55 | 显示全部楼层 |阅读模式
最近用STM32+LWIP,由于同时需要WIFI和RJ45,所有搞了个双网卡驱动,看LWIP好像支持多个网卡比较简单,的确移植过程也很快完了。
测试过后发现有个问题。就是route的问题:由于数据发送的时候查找路由表的时候
  1. struct netif *
  2. ip_route(struct ip_addr *dest)
  3. {
  4.   struct netif *netif;

  5.   /* iterate through netifs */
  6.   for(netif = netif_list; netif != NULL; netif = netif->next) {
  7.     /* network mask matches? */
  8.     if (netif_is_up(netif)) {
  9.       if (ip_addr_netcmp(dest, &(netif->ip_addr), &(netif->netmask))) {
  10.         /* return netif on which to forward IP packet */
  11.         return netif;
  12.       }
  13.     }
  14.   }
  15.   if ((netif_default == NULL) || (!netif_is_up(netif_default))) {
  16.     LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip_route: No route to 0x%"X32_F"\n", dest->addr));
  17.     IP_STATS_INC(ip.rterr);
  18.     snmp_inc_ipoutnoroutes();
  19.     return NULL;
  20.   }
  21.   /* no matching netif found, use default netif */
  22.   return netif_default;
  23. }
复制代码
ip_route使用目的地址作为查找路由表的依据,由此判断该哪个网卡发送数据,如果两个网卡和目的地址在同一个网段。那么数据是从第一个路由表发出。如果两个网卡和目的地址不在同一个网段。数据由默认网卡发出。
我的设备是作为服务器来使用,希望哪张网卡收到数据便由哪张网卡发出。现在这样是有问题的。
现在能想到的办法就是在数据接收的时候给个标志,发送的时候判断这个标志。但个人觉得方法好像有点笨。
不知道各位有没有比较优化的方法来解决这个问题。

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2013-7-6 22:19:19 | 显示全部楼层
可以通过源地址来判断,。。。

出870入263汤圆

发表于 2013-7-7 10:53:59 | 显示全部楼层
唯一办法是随心所欲改造lwip,达到你自己的要求。开源软件这个优点必须利用啊,如果你感觉自己修改的足够灵活(可配置),足够稳定(各种配置下都可工作),就把修改请求提交到lwip维护组,使之成为lwip的固有特性。这样你以后得到的官方升级也会有你所需的功能了!

出0入0汤圆

发表于 2013-12-24 17:58:35 | 显示全部楼层
我公司产品是双网口,原来的程序是自己写的TCP/IP协议栈,因为只是简单实现了ARP和TCP、UDP的最简单情况,所以有时候在公网上会遇到问题。



后来在单网口的产品中移植了LWIP,轻量级TCP/IP协议栈,觉得一定程度上解决了问题,所以双网卡的产品也要用LWIP这个协议栈来实现。这个工作就落到了我的头上。



单网卡的移植我不赘述,只描述从单网卡向双网卡移植过程中遇到的问题以及解决方法。



首先,我看了下单网卡移植中所作的改动。



硬件启动时初始化硬件,调用my_lwip_init(),这个函数中创建任务,添加网卡配置。

low_level_init()函数中设置本网卡初始化时MAC地址的设置。

low_level_output()函数处理输出信息。

low_level_input()函数处理输入信息。

ethernetif_input()函数是区分接受到的数据包怎么处理。

由此,可以知道我所需要做的主要改动就是针对这几个函数,及其相关的函数。



多创建一个netif块,硬件初始化时在mylwip_init()函数中多添加一个netif_add,并调用netif_set_up().

在low_level_init()中,区分两个网卡的MAC地址并且填充到netif块中。[由此代码可见,硬件mac地址修改后程序必须重新设置netif链表才能正确执行。]

在low_level_output()中,判断返回的数据是要发送到哪个网卡,将数据拷贝到网卡发送缓冲区,然后发送。

在low_level_input()中,判断是哪个网卡接受到了数据,并将网卡接受缓冲区中的数据拷贝到netif块的payload数据处。

在进行完这几步骤以后,ping程序已经可以通了,但是出现了一些奇怪的现象,同一个网口竟然能通讯两个Ip地址的内容[在一个网口ping两个网卡都能通],所以又在ethernetif_input()函数中判断加入目标地址是本网卡再进入TCP/IP的处理。到这时也解决了。



然后出现了一个让人啼笑皆非的问题,ping net1 OK,ping net 2 OK,TCP net1 Error,TCP net2 OK。而且只有一个网卡时,net1和net2都正常。所以怀疑是路由这块出了问题,查看lwip的文档才发现,ip_route()函数的规则是目标地址处于本网卡的网段则认为本网卡的数据,否则走默认路由配置。由于我们的模块是为了做数据热备或者多通讯口才设置的双网卡,所以两个网卡都是一个网段的配置,这时ip_route()函数找到默认的一个路由表中的第一个路由就直接返回了。无奈之下,我写了ip_route2(),以比较源地址的方式来确定是由哪个网卡来发送数据。



到此为止,测试OK,开心之极,赶紧记录下来。

出0入0汤圆

发表于 2013-12-24 19:58:43 | 显示全部楼层
ljt80158015 发表于 2013-12-24 17:58
我公司产品是双网口,原来的程序是自己写的TCP/IP协议栈,因为只是简单实现了ARP和TCP、UDP的最简单情况, ...

赞一个,谢谢分享

出0入0汤圆

发表于 2013-12-24 20:37:15 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2013-12-25 15:44:25 | 显示全部楼层
ljt80158015 发表于 2013-12-24 17:58
我公司产品是双网口,原来的程序是自己写的TCP/IP协议栈,因为只是简单实现了ARP和TCP、UDP的最简单情况, ...

说实话,没看懂。手头有一个别人做的双口版lwip,在ethernetif.c里面竟有low_level_input0和low_level_input1

出0入0汤圆

发表于 2014-8-4 21:21:20 | 显示全部楼层
ljt80158015 发表于 2013-12-24 17:58
我公司产品是双网口,原来的程序是自己写的TCP/IP协议栈,因为只是简单实现了ARP和TCP、UDP的最简单情况, ...

也木有看懂,,,,求指教

出0入0汤圆

发表于 2014-11-3 21:34:34 | 显示全部楼层
ljt80158015 发表于 2013-12-24 17:58
我公司产品是双网口,原来的程序是自己写的TCP/IP协议栈,因为只是简单实现了ARP和TCP、UDP的最简单情况, ...

问楼主几个问题,wifi网卡部分如何解决加密的问题?是否做了WPA_supplication的移植?
LWIP中ethernet_input()如何处理EAP数据帧(或其它加密数据帧)?原来只有对ARP,IP,PPPOE_DISC,PPPOE,这些都是去头给上层?
加密数据帧在这里的处理有什么不同?

出0入0汤圆

发表于 2014-11-4 08:37:35 | 显示全部楼层
lwip 双网卡 移植

出0入0汤圆

发表于 2017-6-17 17:48:49 | 显示全部楼层
你好,想请问下 你用的硬件是什么?最近也有这样的应用 要实现webserver

出100入101汤圆

发表于 2017-6-18 00:58:56 | 显示全部楼层
LZ和4楼分享的经验都不错!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-24 16:59

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表