Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

实现多网卡自动切换功能 #2628

Merged
merged 4 commits into from
May 1, 2019
Merged

实现多网卡自动切换功能 #2628

merged 4 commits into from
May 1, 2019

Conversation

HubertXie
Copy link
Contributor

@HubertXie HubertXie commented Apr 28, 2019

拉取/合并请求描述:(PR description)

[
设备有多个联网途径时(多网卡),当前网卡断网后,实现自动切换到其他联网的网卡。
]

以下的内容不应该在提交PR时的message修改,修改下述message,PR会被直接关闭。请在提交PR后,浏览器查看PR并对以下检查项逐项check,没问题后逐条在页面上打钩。
The following content must not be changed in submitted PR message. Otherwise, the PR will be closed immediately. After submitted PR, please use web browser to visit PR, and check items one by one, and ticked them if no problem.

当前拉取/合并请求的状态 Intent for your PR

必须选择一项 Choose one (Mandatory):

  • 本拉取/合并请求是一个草稿版本 This PR is for a code-review and is intended to get feedback
  • 本拉取/合并请求是一个成熟版本 This PR is mature, and ready to be integrated into the repo

代码质量 Code Quality:

我在这个拉取/合并请求中已经考虑了 As part of this pull request, I've considered the following:

  • 已经仔细查看过代码改动的对比 Already check the difference between PR and old code
  • 代码风格正确,包括缩进空格,命名及其他风格 Style guide is adhered to, including spacing, naming and other style
  • 没有垃圾代码,代码尽量精简,不包含#if 0代码,不包含已经被注释了的代码 All redundant code is removed and cleaned up
  • 所有变更均有原因及合理的,并且不会影响到其他软件组件代码或BSP All modifications are justified and not affect other components or BSP
  • 对难懂代码均提供对应的注释 I've commented appropriately where code is tricky
  • 本拉取/合并请求代码是高质量的 Code in this PR is of high quality

创建sock时,默认网卡联网时才优先使用
根据family查找netdev时,优先查找family匹配并且已经联网的网卡
再查找family匹配但是未联网的网卡
格式化代码
@Lawlieta
Copy link
Contributor

socket 创建和 link_up 状态没有直接关系吧,网卡自动切换的功能也不应该在 netdev 中实现,应该是应用层检测到网络断开只有切换默认网卡。

@armink
Copy link
Member

armink commented Apr 28, 2019

或者 netdev 中选配一个默认网卡自动切换功能?

当默认网卡 link_down 时,自动切换默认网卡至其他 link_up 的网卡

@HubertXie
Copy link
Contributor Author

系统内部能做的就不要交给用户做吧!

@Lawlieta
Copy link
Contributor

可以考虑在 netdev 内部当 link_down 的时候使用 do_work 方式切换默认网卡,

但是你这种改法还是觉得有些问题,link_down 状态下应该也能创建 socket,只是在 connect 、send 等函数中会产生错误。

@HubertXie
Copy link
Contributor Author

现在的改动也允许link_down下创建socket,只是优先使用link_up的网卡,如果不成功再使用link_down的网卡

@Lawlieta
Copy link
Contributor

如果只有一个网卡的情况且是 link_down 呢,这样的改动会造成 socket 创建失败,你可以使用 adb 软件包测试,软件包在网卡初始化 link_up 完成之前就开始创建socket 并等待accept,这时候可能会创建失败,正常情况应该是创建成功,accept 函数等待接收。

@HubertXie
Copy link
Contributor Author

我没试过adb,我用telnet软件包测试过,工作是正常的,应该adb差不多吧。
只有一个网卡,在没有link_up之前,不会创建socket失败。你可以测试一下。
我这个方法可能不是很好,期待有更好的方法来实现这个功能。

@Lawlieta
Copy link
Contributor

单网卡模式,注册的网卡即为默认网卡,当该网卡在 link_down 情况下执行 socket 创建,会出现下面情况错误,
图片

我之前的实现方式和你现在改动的一样,已经复现付过上述问题,后来改为现在的实现方式,你可以看一下这个 #2626 PR 改动

@HubertXie
Copy link
Contributor Author

netdev_get_by_family为什么会不通过?

@Lawlieta
Copy link
Contributor

图片
你上面的改动,netdev_get_by_family 中也加了 link_up 的判断,所以会不通过

@HubertXie
Copy link
Contributor Author

你没看到两个循环查找吗?这都是你原来的代码?两个for循环,我只是把第一个for循环加了link_up判断,第二个for循环我没改,你有测试过这个pr吗?讲这么多都没用,运行起来试试再说吧!

@BernardXiong
Copy link
Member

@Lawlieta "讲这么多都没用,运行起来试试再说吧!" Please try it on the board.

@Lawlieta
Copy link
Contributor

OK,不好意思我刚看错了,试过了好使,我没问题了 @HubertXie

@BernardXiong BernardXiong merged commit c2244a5 into RT-Thread:master May 1, 2019
@armink
Copy link
Member

armink commented May 1, 2019

这个 pr 是在 SAL 层面实现了 link_up 网卡自动切换的功能,但其实是跟我们 netdev 抽象出来的初衷有些背离。 netdev 负责对网卡进行管理,SAL 比 netdev 高一层,在 netdev 之上未来还会有更多网络组件,比如:wlan/tls 抽象等等,他们都跟 SAL 无关,那不用在这些组件上也都得实现一遍网卡自动切换吧。所以这是我觉得放在最底层 netdev 上做的第一个原因。

再者,对于 BSD socket 的使用,用户创建 socket 时,这个其实都是纯软件层面的工作,没有必要去检查链路的 link_up 状态,lwip 也是这样做的。否则你给用户做了干涉,当出现一些用户不需要自动切换的场景下,用户也会不太习惯。

@BernardXiong
Copy link
Member

是的,socket层面实际上并不需要关心底层链路层的断开/连接情况,可以对比下应用层在Linux下的使用情况。这里的修改为什么是叫做多网卡自动切换功能?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

4 participants