This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP432E401Y:使用以太网和 PPP 建立连接

Guru**** 2866460 points

Other Parts Discussed in Thread: MSP432E401Y

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1633949/msp432e401y-establishing-connections-using-ethernet-and-ppp

器件型号: MSP432E401Y

我已在 MSP432E401Y 上使用了以太网接口、  现在我正在尝试通过调制解调器添加对 PPP 连接的支持。  我已经做了很多在线阅读,并有它的大部分工作.

我移植了 TM4C129 示例中的代码。  我编写了处理调制解调器初始化和建立连接的例程。  然后、我将句柄传递到接收数据并将数据包推入堆栈的任务中。  这将启动成功的 PPP 协商、并分配 IP 地址。  然后使用连接的 IP 地址调用 netIPAddrHook 函数、就像以太网接口一样。  在 hook 函数中、我初始化 SlNet、并使用以下命令添加 PPP 接口:

status = SlNetIf_add(SLNETIF_ID_3, "ppp0",(const SlNetIf_Config_t *)&SlNetIfConfigNDKSec,8);

此时、我看到堆栈定期发送一个小数据包、串行接收任务接收和验证有效数据包并将其推入堆栈。  我认为这是一条大约每秒运行一次的 LCP 状态消息。

当我尝试打开套接字时、堆栈使用以太网接口、因为它的优先级更高。  当我拔下以太网电缆时、插槽出现故障、堆栈不会切换到调制解调器连接。  我还尝试使用 SlNetIf_setState 禁用以太网接口、并交换了两个接口的优先级。  这些更改都不会导致调制解调器连接上出现任何其他活动、我仍然看到 LCP 状态消息定期移动。

我找到了一些有关使用 STKEVENT_SIGNAL 发送链路建立消息并在接收任务中实现该消息的信息。  它在检测到一堆有效数据包已被解码后发出 LinkUp 信号。

我注意到调用 SlNetIf_getConnectionStatus 从不返回调制解调器连接的已连接状态。  我在代码中跟随了这一步骤、发现 PPP 驱动程序未实现 IOCTL 函数。  SlNetIf_getConnectionStatus 使用此值来获取接口的连接状态、因此不会通过该函数报告为已连接。  堆栈是否使用此函数?  这可能是它不切换的原因吗?

我还尝试了仅包含 PPP 接口的构建、获得相同的基本响应。  已建立 PPP 连接并分配了 IP 地址、但我无法创建任何套接字连接。

什么是我的缺失?  

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Robert:

    您是否尝试过模拟  SlNetIf_getConnectionStatus 中实现的功能 并添加 IOCTL 来检查此功能? 这将是我的下一步、

    谢谢、

    -Eric Rentschler

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我的下一步是实现所需的 IOCTL 函数。 我实现了一些粗略的内容、并能够让栈开始使用 PPP 接口。 通过一些额外的工作、我实现了一个使用 PPP 状态标志来确定状态的更好的解决方案。 这是非常便于携带的,只需要对 NIMUPPP.C.

    在更多测试过程中、我发现 STKEVENT_SIGNAL 可以用于发送链路建立、但这只会导致堆栈触发网络初始化时定义的 NetUpHook 回调。 它不会通知栈该接口已准备好使用。

    还有一个问题需要解决。 在 JTAG 调试下一切正常工作后、发布版本并未完成 PPP 协商。 我在代码中经常使用 Display_printf() 函数来调试连接问题。 Display 函数不会在发行版本中执行、因此时序会略有变化。 我发现在处理 PPP 协商的两个状态之间的转换时存在竞争条件。 我无法找到根本问题、但它导致堆栈永远不会启动与 PPP 服务器的 CHAP 协商。 我能够通过在 PPP 协商期间添加一些延迟来解决这个问题。 这可以解决问题、但不能解决竞争条件。

    根据当前连接以实现回退功能的设备、让 SlNet 在以太网和 PPP 接口之间切换时仍有一些问题、但堆栈已启动并在 PPP 接口上运行。