samples: net: socket: packet: Add SOCK_DGRAM support

If user has enabled SOCK_DGRAM support for AF_PACKET type, then
use that in the packet sample application instead of SOCK_RAW.
This simplifies the application as we do not need to handle
the Ethernet frame when sending or receiving the packets.

Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
This commit is contained in:
Jukka Rissanen 2020-08-13 15:12:20 +03:00 committed by Jukka Rissanen
parent e6672f848a
commit 0bac136604
2 changed files with 41 additions and 4 deletions

View file

@ -13,4 +13,19 @@ config NET_SAMPLE_SEND_WAIT_TIME
If set to 0, then the packets are sent as fast as possible, which
will stress test the network stack.
config NET_SAMPLE_ENABLE_PACKET_DGRAM
bool "Use AF_PACKET with SOCK_DGRAM"
depends on NET_SOCKETS_PACKET_DGRAM
default y
help
This will strip Ethernet header from received packets
and insert Ethernet header to sent packets.
config NET_SAMPLE_DESTINATION_ADDR
string "Destination Ethernet MAC address"
depends on NET_SOCKETS_PACKET_DGRAM
default "00:11:22:33:44:55"
help
Where to send the Ethernet frames.
source "Kconfig.zephyr"

View file

@ -73,12 +73,18 @@ static void quit(void)
static int start_socket(int *sock)
{
struct sockaddr_ll dst;
struct sockaddr_ll dst = { 0 };
int ret;
*sock = socket(AF_PACKET, SOCK_RAW, ETH_P_ALL);
*sock = socket(AF_PACKET,
IS_ENABLED(CONFIG_NET_SAMPLE_ENABLE_PACKET_DGRAM) ?
SOCK_DGRAM : SOCK_RAW,
ETH_P_ALL);
if (*sock < 0) {
LOG_ERR("Failed to create RAW socket : %d", errno);
LOG_ERR("Failed to create %s socket : %d",
IS_ENABLED(CONFIG_NET_SAMPLE_ENABLE_PACKET_DGRAM) ?
"DGRAM" : "RAW",
errno);
return -errno;
}
@ -140,12 +146,28 @@ static void recv_packet(void)
static int send_packet_socket(struct packet_data *packet)
{
struct sockaddr_ll dst;
struct sockaddr_ll dst = { 0 };
size_t send = 100U;
int ret;
dst.sll_ifindex = net_if_get_by_iface(net_if_get_default());
if (IS_ENABLED(CONFIG_NET_SAMPLE_ENABLE_PACKET_DGRAM)) {
dst.sll_halen = sizeof(struct net_eth_addr);
/* FIXME: assume IP data atm */
dst.sll_protocol = htons(ETH_P_IP);
ret = net_bytes_from_str(
dst.sll_addr,
dst.sll_halen,
CONFIG_NET_SAMPLE_DESTINATION_ADDR);
if (ret < 0) {
LOG_ERR("Invalid MAC address '%s'",
CONFIG_NET_SAMPLE_DESTINATION_ADDR);
}
}
do {
/* Sending dummy data */
ret = sendto(packet->send_sock, lorem_ipsum, send, 0,