Hello,
I am currently working with the nRF5340DK and the W5500 shield. Both work perfectly when using the dhcpv4_client application. However, when I attempt to use the recv function after creating a socket, it fails and returns a length of -1, with an error code of 134 (not supported), and I’m unsure how to resolve the issue.
Here's my main.c :
/* Networking DHCPv4 client */
/*
* Copyright (c) 2017 ARM Ltd.
* Copyright (c) 2016 Intel Corporation.
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/logging/log.h>
#include <zephyr/kernel.h>
#include <zephyr/linker/sections.h>
#include <errno.h>
#include <stdio.h>
#include <zephyr/net/net_if.h>
#include <zephyr/net/net_pkt.h>
#include <zephyr/net/net_core.h>
#include <zephyr/net/net_mgmt.h>
#include <zephyr/logging/log.h>
#include <zephyr/net/socket.h>
#ifdef IS_ENABLED(CONFIG_NET_L2_ETHERNET))
#include <zephyr/net/net_if.h>
#endif
LOG_MODULE_REGISTER(eth_sniffer, 4);
void main(void)
{
struct net_if *iface;
LOG_INF("Run dhcpv4 client");
iface = net_if_get_default();
net_if_set_promisc(iface);
LOG_INF("Starting IP-level sniffer");
int sock = socket(AF_INET, SOCK_RAW, IPPROTO_TCP);
if (sock < 0) {
LOG_ERR("Failed to create raw IP socket");
return;
}
LOG_INF("Raw socket created successfully");
struct sockaddr_in bind_addr = {
.sin_family = AF_INET,
.sin_port = htons(0),
.sin_addr.s_addr = htonl(INADDR_ANY),
};
LOG_DBG("Binding raw socket to INADDR_ANY");
if (bind(sock, (struct sockaddr *)&bind_addr, sizeof(bind_addr)) < 0) {
LOG_ERR("Failed to bind raw socket");
close(sock);
return;
}
LOG_INF("Raw socket bound to INADDR_ANY");
uint8_t buffer[512];
while (1) {
int len = recv(sock, buffer, sizeof(buffer), 0);
if (len < 0) {
LOG_ERR("recv failed , errno: %s", strerror(errno));
continue;
}
printk("Received %d bytes:\n", len);
for (int i = 0; i < len; i++) {
printk("%02x ", buffer[i]);
}
printk("\n===============================\n");
}
}
prj.conf :
CONFIG_MAIN_STACK_SIZE=8192 # Networking config CONFIG_NETWORKING=y # w5500 driver config CONFIG_SPI=y CONFIG_GPIO=y CONFIG_ETH_DRIVER=y CONFIG_NET_L2_ETHERNET=y CONFIG_ETH_W5500=y CONFIG_ETH_W5500_TIMEOUT=1000 CONFIG_NET_IPV4=y CONFIG_NET_IPV6=n CONFIG_NET_TCP=y CONFIG_NET_UDP=y # CONFIG_NET_DHCPV4=y # CONFIG_NET_DHCPV4_OPTION_CALLBACKS=y CONFIG_INIT_STACKS=y CONFIG_NET_SOCKETS=y # CONFIG_POSIX_API=y CONFIG_NEWLIB_LIBC=y CONFIG_NET_MGMT=y CONFIG_NET_MGMT_EVENT=y CONFIG_NET_SOCKETS_POSIX_NAMES=y CONFIG_NET_SOCKETS_OFFLOAD=y # CONFIG_ETH_DRIVER_RAW_MODE=y # CONFIG_IEEE802154_RAW_MODE=y CONFIG_NET_PROMISCUOUS_MODE=y CONFIG_NET_LOG=y CONFIG_LOG=y CONFIG_LOG_MODE_IMMEDIATE=y CONFIG_SLIP_STATISTICS=n CONFIG_NET_SHELL=y # Network address config CONFIG_NET_CONFIG_SETTINGS=y CONFIG_NET_CONFIG_MY_IPV4_ADDR="192.168.1.2" CONFIG_NET_CONFIG_MY_IPV4_NETMASK="255.255.255.0"