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.

TDA4VM: Socket bind() failed in TIOVX User Kernels (R5F)

Part Number: TDA4VM
Other Parts Discussed in Thread: SYSBIOS

Hello, there.

I use PSDK RTOS and PSDK QNX. And I added my TIOVX custom kernels to ${PSDK_RTOS_PATH}/vision_apps/kernels using PyTIOVX as follows:

from tiovx import *

code = KernelExportCode("my_custom_kernel", "r5f", "CUSTOM_APPLICATION_PATH")

code.setCoreDirectory("r5f")

kernel = Kernel("my_custom_kernel")

kernel.setParameter(Type.USER_DATA_OBJECT, Direction.INPUT, ParamState.REQUIRED, "configuration", ['my_custom_kernel_input_t'])
kernel.setParameter(Type.USER_DATA_OBJECT, Direction.OUTPUT, ParamState.REQUIRED, "recognition_result", ['my_custom_kernel_output_t'])

kernel.setTarget(Target.IPU2)

code.export(kernel)

And I confirmed that the module was loaded and the Create(), Process(), Delete() callbacks were executed normally.
After OSPI flashing in SD boot mode, the sample app was executed in OSPI boot mode.
And I tried to bind the socket server as in the following code, but it failed.
(Build success, but run-time failure)
1. vision_apps/kernels/my_custom_kernel/r5f/vx_my_custom_kernel_target.c
// ...

#include <ti/net/bsd/arpa/inet.h>
#include <ti/net/bsd/netinet/in.h>
#include <ti/net/bsd/sys/socket.h>
#include <ti/net/slneterr.h>
#include <ti/net/slnetif.h>

// ...

static vx_status VX_CALLBACK tivxMyCustomKernelProcess(tivx_target_kernel_instance kernel,
                                                       tivx_obj_desc_t* obj_desc[],
                                                       uint16_t num_params, void* priv_arg) {

    // ...
  
    int server_fd;
    int client_fd;
    int result;
    struct sockaddr_in server_addr;
    
    result = SlNetSock_init(0);
    printf("SlNetSock_init(): %d\n", result);
    
    server_fd = socket(AF_INET, SOCK_STREAM, 0);
    printf("socket: %d\n", server_fd);
    memset(&server_addr, 0, sizeof(server_addr));
    
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    server_addr.sin_port = htons(2000);
    
    result = bind(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr));
    printf("bind: %d\n", result);
    
    result = listen(server_fd, 10);
    printf("listen: %d\n", result);
    
    client_fd = accept(server_fd, (struct sockaddr*)NULL, NULL);
    
    printf("accept: %d\n", client_fd);
    close(client_fd);
    close(server_fd);
  
    // ...
}
2. vision_apps/kernels/my_custom_kernel/r5f/concerto.mak
# ...

IDIRS       += $(NS_PATH)/source
IDIRS       += $(NS_PATH)/source/ti/net/bsd

# ...
3. vision_apps/apps/basic_demos/app_tirtos/tirtos_qnx/mcu3_0/concerto.mak
# ...

LDIRS += $(NS_PATH)/source/ti/net/lib/ccs/r5f/

# ...

ADDITIONAL_STATIC_LIBS += slnetsock_$(TARGET_BUILD).a

# ...
4. UART terminal output
[MCU3_0]      5.809413 s: SlNetSock_init(): 0
[MCU3_0]      5.809477 s: socket: 0
[MCU3_0]      5.809518 s: bind: -1
[MCU3_0]      5.809544 s: listen: -1
[MCU3_0]      5.809584 s: accept: -1
Please answer about my question. :)
  • Hello,

    Which SDK version are you using for both PSDK RTOS and PSDK QNX?

    Regards,

    Lucas

  • Hello,

    I'm using PSDK RTOS and PSDK QNX as follows:

    PSDK Linux - 07.01.00.10 (20 Nov 2020):
    software-dl.ti.com/.../ti-processor-sdk-linux-j7-evm-
    07_01_00_10-Linux-x86-Install.bin

    PSDK RTOS - 07.01.00.11 (20 Nov 2020):
    software-dl.ti.com/.../ti-processor-sdk-rtos-j721e-evm-
    07_01_00_11-linux-x64-installer.run

    PSDK QNX - 07.01.01.00 (09 Dec 2020):
    software-dl.ti.com/.../ti-processor-sdkqnx_07_01_01.tar.gz

    As already I mentioned above, I'm also trying to use NS(Network Services) APIs.

    And I found that it doesn't work as a client either. (connect() function error)

    Could you help me to solve this problem?

    Regards,

    Myeongheum

  • Hi,

    Could you also print the value of errno when bind() has failed? That should give us some more info about the actual error, instead of just -1.

    #include <errno.h>

    result = bind(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr));
    printf("bind: %d, errno %d\n", result, errno);

    Regards,
    -Misa

  • Could you please try with below initialization steps:

    int32_t ti_net_SlNet_initConfig()
    {
      int32_t status = ENET_SOK;

      status = SlNetIf_init(0);
      if (status == ENET_SOK)
      {
        status = SlNetSock_init(0);
      }

      if (status == ENET_SOK)
      {
        SlNetUtil_init(0);
      }

      /* add CONFIG_SLNET_0 interface */
      if (status == ENET_SOK)
      {
        status = SlNetIf_add(SLNETIF_ID_2,
                             "eth0",
                             (const SlNetIf_Config_t *)&SlNetIfConfigNDK,
                             5);
      }

      ...
      <your existing code>
      ...
    }

    I suspect what you are missing is the SlNetIf_add() call. Others like SlNetUitls_init() might not be needed.

    Regards,
    -Misa

  • I added your code and I got the following result:

    [MCU3_0] 5.426308 s: SlNetSock_init(): 0
    [MCU3_0] 5.426394 s: socket: 0
    [MCU3_0] 5.426447 s: bind: -1, errno 9
    [MCU3_0] 5.426481 s: listen: -1, errno 9
    [MCU3_0] 5.426525 s: accept: -1, errno -2025

    Do you have any clues that might be helpful?

  • I tried adding the SlNetIf_add() to my code, but I got the following build error.

     undefined        first referenced                                                                                                                                                            
      symbol              in file                                                                                                                                                                  
     ---------        ----------------                                                                                                                                                            
     SlNetIfConfigNDK /home/psdk/ti-processor-sdk-rtos-j721e-evm-07_01_00_11/vision_apps/out/J7/R5F/SYSBIOS/release/vx_target_kernels_my_custom_r5f.lib<vx_my_custom_kernel_target.obj>

    error: unresolved symbols remain
    error: errors encountered during linking;
    Do I need to add not only NS library but also NDK library to my project? If so, how can I link it?
  • Hello,

    Yes, it looks like you will need to add the NDK library to your project as well.  Can you please add the NDK library to the file vision_apps/apps/basic_demos/app_tirtos/concerto_r5f_inc.mak?

    Regards,

    Lucas

  • I built successfully using the below code. And I got the log as below. And I connected the board with a PC via LAN cable, and I tried to connect to the MCU2_0 server with the connect() in the PC application, but unfortunately the accept() is not called. It looks like the accept() function is blocking.

    // ...
    
    #include <ti/ndk/slnetif/slnetifndk.h>
    #include <ti/net/bsd/arpa/inet.h>
    #include <ti/net/bsd/netinet/in.h>
    #include <ti/net/bsd/sys/socket.h>
    #include <ti/net/slnet.h>
    #include <ti/net/slneterr.h>
    #include <ti/net/slnetif.h>
    
    // ...
    
    static vx_status VX_CALLBACK tivxMyCustomKernelProcess(tivx_target_kernel_instance kernel,
                                                           tivx_obj_desc_t* obj_desc[],
                                                           uint16_t num_params, void* priv_arg) {
    
        // ...
      int server_fd;
        int client_fd;
        int status = 0;
        char message[] = "Hello, World!";
        struct sockaddr_in server_addr;
        struct sockaddr_in client_addr;
        socklen_t clnt_addr_size;
    
        status = SlNetIf_init(0);
        printf("SlNetIf_init: %d\n", status);
    
        status = SlNetSock_init(0);
        printf("SlNetSock_init: %d\n", status);
    
        status = SlNetUtil_init(0);
        printf("SlNetUtil_init: %d\n", status);
    
        status = SlNetIf_add(SLNETIF_ID_1, "eth0", (const SlNetIf_Config_t*)&SlNetIfConfigNDK, 5);
    
        server_fd = socket(AF_INET, SOCK_STREAM, 0);
        printf("socket: %d\n", server_fd);
        memset(&server_addr, 0, sizeof(server_addr));
    
        server_addr.sin_family = AF_INET;
        server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
        server_addr.sin_port = htons(9997);
    
        status = bind(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr));
        printf("bind: %d, errno %d\n", status, errno);
    
        status = listen(server_fd, 10);
        printf("listen: %d, errno %d\n", status, errno);
    
        client_fd = accept(server_fd, (struct sockaddr*)&client_addr, &clnt_addr_size);
        printf("accept: %d, errno %d\n", status, errno);
    
        if (client_fd != -1) {
            status = send(client_fd, message, sizeof(message), 0);
            printf("send: %d, errno %d\n", status, errno);
        }
    
        close(client_fd);
        close(server_fd);
    
        // ...
      
        // ...
    }

    [MCU2_0]     27.438139 s: SlNetIf_init: 0
    [MCU2_0]     27.438202 s: SlNetSock_init: 0
    [MCU2_0]     27.438324 s: SlNetUtil_init: 0
    [MCU2_0]     27.438543 s: socket: 0
    [MCU2_0]     27.438627 s: bind: 0, errno 0
    [MCU2_0]     27.438708 s: listen: 0, errno 0

    In OSPI boot mode, I used `netstat -a` command. As you can see, there is not TCP port 9997 in the result.

    # netstat -a
    Active Internet connections (including servers)
    Proto Recv-Q Send-Q  Local Address          Foreign Address        State
    tcp        0      0  10.16.32.0.65535       10.16.16.0.13592       SYN_SENT
    tcp        0      0  10.16.32.0.12408       10.16.0.0.12408        ESTABLISHED
    tcp        0      0  *.12408                *.*                    LISTEN
    tcp        0      0  10.16.32.0.12404       10.16.0.0.12404        ESTABLISHED
    tcp        0      0  *.12404                *.*                    LISTEN
    tcp        0      0  *.13402                *.*                    LISTEN
    tcp        0      0  *.13404                *.*                    LISTEN
    tcp        0      0  *.telnet               *.*                    LISTEN
    tcp        0      0  *.ftp                  *.*                    LISTEN
    udp        0      0  *.*                    *.*

    Do I need an additional hardware connection or software setup? 

    I would be grateful if you could reply further detailed guidance as soon as possible. (From hardware configuration to software setup)

    Please answer about my question.

    Regards,

    Myeongheum Park