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"