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.

[参考译文] AM5726:AM572x 上的 NDK 2.26.00.08—广播洪水问题

Guru**** 2536790 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1549772/am5726-ndk-2-26-00-08-on-am572x-broadcast-flood-issue

器件型号:AM5726


工具/软件:

您好:

我 在 AM572x 上使用 NDK 2.26.00.08。 是在 RTOS 环境中

问题: 广播回复耗尽了网络缓冲区、似乎整个网络都卡住了。 不确定如何增加 pktNumFrameBufs(或替代调优方法)

目标是接收广播并发送一个作为回报。

我将分享一段关于如何初始化和如何发送的信息。

只要对 send 函数进行注释、一切都正常。 我发送超过 9k 的数据(在 1024x9512x18 或 1400x7...中)。 网络堆栈(TCP/IP 或其它方面)似乎已崩溃。 从另一个线程访问网络将导致应用崩溃。

我认为这是一个配置问题 — 但到目前为止我还没有找到“魔法要点“...

static int initBroadcastSocket (socket* SOCK_OUT){
结构 sockaddr_in addr;
INT optval = 1;

套接字 sock = socket (AF_INET、SOCK_DGRAM、IPPROTO_UDP);
if (sock == INVALID_SOCKET){
ip_print(“ip scanner - socket faile\n“);
返回–1;
}

setsockopt (sock、SOL_SOCKET、SO_BROADCAST、&optval、sizeof (optval));
setsockopt (sock、SOL_SOCKET、SO_REUSEADDR、&optval、sizeof (optval));

memset (&addr、0、sizeof (addr));
Addr.sin_family = AF_INET;
Addr.sin_port = htons (MULTICASTPORT_S);
addr.sin_addr.s_addr = htonl (addr_any);

if (OSAL_SOCKET_UDP_BIND (SOCK、&addr、sizeof (addr))< 0){
ip_print(“IP 扫描仪 — 绑定失败\n“);
OSAL_SOCKET_CLOSE (SOCK);
返回–1;
}

*SOCK_OUT = SOCK;
返回 0;
}

struct in_addr ip_addr = client_addr->sin_addr;
struct in_addr subnet_mask;
subnet_mask.s_addr = htonl (0xFFFFFF00);

结构体 in_addr BROADCAST_addr;
broadcast_addr.s_addr = ip_addr.s_addr |~subnet_mask.s_addr;

struct sockaddr_in replice_addr ={0};
Replice_addr.sin_family = AF_INET;
replice_addr.sin_port = htons (request->response_port);
Replice_addr.sin_addr = BROADCAST_addr;

int SENT = sendto (sock、json_buffer、sizeof (json_buffer)、0、&reply_addr、 sizeof (replice_addr);

可以看到、json_buffer 只是一个随机的 json 可以正常工作、并且有一个客户端接收它。

在同一个系统上,我也有一个运行相同版本的代码的 Linux(适应 Linux ),但没有发生。

我还会提到、该应用正在运行 TCP 协议栈而没有出现任何问题。

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

    您好、Itzhak、

    我会将您的问题重新分配给我们的网络工程师之一。

    -Josue

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

    我想补充一下我学到的知识。

    硬件/软件上下文:

    • SoC: AM572x (仅在 A 上为 A15 定制板)

    • 项目:NIMU_BasicHelloWorldExample_idkAM572x_armExampleproject(除了板层外,没有应用程序更改)

    • 在两条 SDK 线上复制:

      1. Processor SDK RTOS 04.03.00.05

        • PDK am57xx 1.0.10. 、NDK 2.26.00.08 、SYS/BIOS 6.52.00.12 , GCC 6-2017q1, CCS 8.

      2. processor_sdk_rtos_am57xx_09_03_00_00

        • PDK am57xx 1.0.21 、SYS/BIOS 6.76.03.01. 、XDC 3.55.02.22、GCC 7-2018q2、CCS 9.3

    我正在使用服装板,我唯一的改变是板库。

    对于两个 SDK、我确认了工程可以通过 ping 进行通信 192.168.57.100 。 -健全性检查

    以下命令会 无限期运行并运行:

    void runBroadcastServerTask()

    #define IP_PRINT UART_printf

    fdOpenSession (Task_self ());
    TASK_SLEEP (5000);

    INT optval = 1;
    套接字 sock = socket (AF_INET、SOCK_DGRAM、IPPROTO_UDP);
    if (sock == INVALID_SOCKET){
    ip_print(“套接字失败\n“);
    返回;
    }

    setsockopt (sock、SOL_SOCKET、SO_REUSEADDR、&optval、sizeof (optval));

    // 1) 绑定到要使用的接口的本地 IP(如果不同,请进行调整)
    struct sockaddr_in src ={0};
    INet.sin_family = AF_INET src;
    htons.sin_port = src (0);//临时本地端口
    NIC.sin_addr.s_addr = inet_addr(“192.168.57.100")“);//<--该子网上的 src IP
    if (bind (sock、(struct sockaddr*)& src、sizeof (src))< 0){
    int err = fdError();
    ip_print(“ip scanner — 绑定失败,错误=%d\n“,错误);
    fdClose (sock);//或 OSAL_SOCKET_CLOSE (sock)(如果栈中的操作正确)
    返回;
    }

    // 2) 连接到对等设备、以便报告路由/ARP 错误
    struct sockaddr_in dst ={0};
    dst.sin_family = AF_INET;
    dst.sin_port = htons (6667);
    dst.sin_addr.s_addr = inet_addr(“192.168.57.105")“);

    if (connect (sock、(struct sockaddr*)&dst、sizeof (dst))< 0){
    int err = fdError();
    ip_print(“connect failed err=%d(route/ARP 问题?)\n“、err);
    fdClose (sock);
    返回;
    }

    char json_buffer[1024]=“Hello world“;
    while (1){

    int SENT = sendto (sock、(void *) json_buffer、1400 + 1、0、
    (struct sockaddr*)&dst、sizeof (dst));
    if (sent < 0){
    int err = fdError();
    ip_print(“send failed err=%d\n“、err);
    }其他{
    ip_print(“[服务器【服务器】已发送%d\n“,已发送);
    }

    TASK_SLEEP (500);
    }
    }

    以下 操作不能正常工作。

    void runBroadcastServerTask_B()

    #define IP_PRINT UART_printf

    fdOpenSession (Task_self ());
    TASK_SLEEP (5000);

    INT optval = 1;
    套接字 sock = socket (AF_INET、SOCK_DGRAM、IPPROTO_UDP);
    if (sock == INVALID_SOCKET){
    ip_print(“套接字失败\n“);
    返回;
    }

    //允许重新绑定和广播
    setsockopt (sock、SOL_SOCKET、SO_REUSEADDR、&optval、sizeof (optval));
    setsockopt (sock、SOL_SOCKET、SO_BROADCAST、&optval、sizeof (optval)); //<-需要广播

    //绑定到要发送的接口(与您的代码一样保留)
    struct sockaddr_in src ={0};
    INet.sin_family = AF_INET src;
    htons.sin_port = src (0);//临时本地端口
    NIC.sin_addr.s_addr = inet_addr(“192.168.57.100")“);//该子网上的 src IP
    if (bind (sock、(struct sockaddr*)& src、sizeof (src))< 0){
    int err = fdError();
    ip_print(“ip scanner — 绑定失败,错误=%d\n“,错误);
    fdClose (sock);
    返回;
    }

    //广播目标:/24 定向广播(或使用 255.255.255.255)
    struct sockaddr_in bcast ={0};
    bcast.sin_family = AF_INET;
    bcast.sin_port = htons (6667);
    bcast.sin_addr.s_addr = inet_addr(“192.168.57.255")“);//或“255.255.255.255"</s>“

    //有效负载(未更改)
    char json_buffer[1024]=“Hello world“;

    while (1){

    int SENT = sendto (sock、(void *) json_buffer、1400 + 1、0、(struct sockaddr*)&bcast、sizeof (bcast);

    if (sent < 0){
    int err = fdError();
    ip_print(“send failed err=%d\n“、err);
    }其他{
    ip_print(“[服务器【服务器】已发送%d\n“,已发送);
    }

    TASK_SLEEP (500);
    }
    }

    在两个 SDK 上:

    • Wireshark 仅看到第一个 ~6 个广播帧 (总共发送~8.5–9KB,确切计数取决于有效载荷长度)。

    • 之后、 网络流量停止 从电路板端:无法 ping、ARP 停止响应。 CPU 仍在运行(也没有例外)、但堆栈出现卡滞。

    • 相同的测试 单播 永远运行。 -工作版本。

    我还尝试改变有效载荷长度(100–1024 字节);停止前的总字节始终在 8.5–9KB 左右。 失速会重现。

    问题/请求

    • 是否有 已知问题 在 AM572x CPSW/NDK 中 广播 TX 缓冲区回收(不返回 PBM/Tx 描述符)?

    • 都有 所需的套接字选项 以便在该堆栈上广播或 建议使用 CFG 正在调谐 ?

    • 不限 补丁或示例 在 AM572x CPSW 上可靠广播的代码?

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

    e2e.ti.com/.../Broadcast-fail.mp4

    在广播版本上使用 Wireshark 添加短剪辑

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

    您好、

    对延迟深表歉意。

    问题似乎与您现有的缓冲区数量有关、似乎它们没有尽快释放。 是否可以用更长的睡眠时间对此进行测试。 这将确认这是否与释放缓冲区有关。

    由于这是使用更旧的栈 (NDK)、因此我需要一些时间对此进行检查。 我将在下周结束时回复您。

    此致、
    Tanmay

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

    嗨、

    感谢您的答复。 我想记下 2 件事:

    1.我已经用最新的堆栈重新创建了它(上面提到的剪辑和代码都在 2 个 SDK 上)

    2.我尝试了一个较大的睡眠 — 我发送了 3 分钟,等待 10 分钟,然后被卡住在同一个地方。