How to use `nrf_socket` to implement PING function on nrf9160?

I tried to use NRF_SOCK_RAW and NRF_IPPROTO_RAW to create socket, but found `modem fault`!

//this is my wrapper

socket_create(true, AF_INET, SOCK_RAW, IPPROTO_RAW, NULL, NULL, NULL)

{
    sockfd = socket(family, type, protocol);
    if (sockfd < 0) {    
         snprintf(buf, sizeof(buf), "Failed to create socket: %s\r\n", strerror(errno));
    }
}



[<---] [2026-03-04 17:39:29:874] [INF][Hub] <SOCKET> Ping src <192.168.153.6> -> dst <www.baidu.com> ...
[<---] [2026-03-04 17:39:29:880] [INF][Hub] <SOCKET> [DNS] Standard query 0x4c7f A www.baidu.com
[<---] [2026-03-04 17:39:29:945] [INF][Hub] <SOCKET> [DNS] Standard query response 0x4c7f A www.baidu.com A 183.2.172.177
[<---] [2026-03-04 17:39:29:985] [DBG][Hub] <SOCKET> Create RAW socket
[<---] [2026-03-04 17:39:29:991] [ERR][Hub] <SOCKET> Failed to create socket: Can't send after socket shutdown
[<---] [2026-03-04 17:39:29:998] [ERR][Hub] <SOCKET> Ping Failed to socket error!
[<---] [2026-03-04 17:39:29:998] ret: 0.
[<---] [2026-03-04 17:39:30:007] [ERR][Unknown] <NETINT> =======================================================
[<---] [2026-03-04 17:39:30:014] [ERR][Unknown] <NETINT> [MODEM FAULT] PC <0x000D3314> REASON <0x010>
[<---] [2026-03-04 17:39:30:020] [ERR][Unknown] <NETINT> =======================================================
[<---] [2026-03-04 17:39:30:027] [INF][Unknown] <NETSRV> [EXCE]: REBOOT

Parents
  • Please help check how to conect to dst ip?


    1.socket cant find dst addr

    sockfd = socket_create(true, AF_PACKET, SOCK_RAW, IPPROTO_IP /*or IPPROTO_RAW*/, NULL, NULL, NULL);
    send(sockfd, &pkt, PING_PKT_SIZE, 0);


    [<---] [2026-03-05 17:13:56:279] [DBG][Hub] <SOCKET> Create RAW socket
    [<---] [2026-03-05 17:13:56:285] [DBG][Hub] <SOCKET> [_FD_7_] Create success: type=3, protocol=255, block=1
    [<---] [2026-03-05 17:13:56:295] [INF][Hub] <SOCKET> [_FD_7_] Failed to send ping packet: Address family not supported by protocol family


    2. socket cant support AF_PACKET protocol family
    sockfd = socket_create(true, AF_PACKET, SOCK_RAW, IPPROTO_IP, NULL, NULL, NULL);

    struct sockaddr_in addr_in = {0}; or
    addr_in.sll_family = AF_PACKET;
    struct sockaddr_ll addr_ll = {0};
    addr_ll.sll_family = AF_PACKET;
    sendto(sockfd, &pkt, PING_PKT_SIZE, 0, (struct sockaddr *)&addr_ll /* or &addr_in*/sizeof(addr_ll));


     

Reply
  • Please help check how to conect to dst ip?


    1.socket cant find dst addr

    sockfd = socket_create(true, AF_PACKET, SOCK_RAW, IPPROTO_IP /*or IPPROTO_RAW*/, NULL, NULL, NULL);
    send(sockfd, &pkt, PING_PKT_SIZE, 0);


    [<---] [2026-03-05 17:13:56:279] [DBG][Hub] <SOCKET> Create RAW socket
    [<---] [2026-03-05 17:13:56:285] [DBG][Hub] <SOCKET> [_FD_7_] Create success: type=3, protocol=255, block=1
    [<---] [2026-03-05 17:13:56:295] [INF][Hub] <SOCKET> [_FD_7_] Failed to send ping packet: Address family not supported by protocol family


    2. socket cant support AF_PACKET protocol family
    sockfd = socket_create(true, AF_PACKET, SOCK_RAW, IPPROTO_IP, NULL, NULL, NULL);

    struct sockaddr_in addr_in = {0}; or
    addr_in.sll_family = AF_PACKET;
    struct sockaddr_ll addr_ll = {0};
    addr_ll.sll_family = AF_PACKET;
    sendto(sockfd, &pkt, PING_PKT_SIZE, 0, (struct sockaddr *)&addr_ll /* or &addr_in*/sizeof(addr_ll));


     

Children
No Data
Related