This doesn't build right now Signed-off-by: Joe Hershberger <joe.hershber...@ni.com>
--- Changes in v2: -Added the raw packet proof-of-concept patch. drivers/net/sandbox-raw.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++ drivers/net/sandbox.c | 23 ++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 drivers/net/sandbox-raw.c diff --git a/drivers/net/sandbox-raw.c b/drivers/net/sandbox-raw.c new file mode 100644 index 0000000..735783c --- /dev/null +++ b/drivers/net/sandbox-raw.c @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2015 National Instruments + * + * (C) Copyright 2015 + * Joe Hershberger <joe.hershber...@ni.com> + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#include <linux/if.h> +#include <linux/if_ether.h> +#include <linux/if_packet.h> +#include <sys/socket.h> +#include <netinet/in.h> + +int sandbox_raw_init(int *sd, void **devp) +{ + uint8_t eth0mac[6]; + int tempsd = 0; + struct ifreq ifr; + const char *ifname = "eth0"; + + strcpy(ifr.ifr_name, ifname); + ifr.ifr_addr.sa_family = AF_INET; + memset(eth0mac, 0, 6); + tempsd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW); + if (tempsd < 0) + return 1; + if (ioctl(tempsd, SIOCGIFHWADDR, &ifr) < 0) { + close(tempsd); + return 1; + } + memcpy(eth0mac, ifr.ifr_hwaddr.sa_data, 6 * sizeof(uint8_t)); + close(tempsd); + + *devp = malloc(sizeof(struct sockaddr_ll)); + struct sockaddr_ll *device = *devp; + memset(device, 0, sizeof(struct sockaddr_ll)); + device->sll_ifindex = if_nametoindex(ifname); + device->sll_family = AF_PACKET; + memcpy(device->sll_addr, eth0mac, 6); + device->sll_halen = htons(6); + + *sd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); + + return 0; +} + +int sandbox_raw_send(void *packet, int length, int sd, void *device) +{ + if (sendto(sd, packet, length, 0, + (struct sockaddr *)device, sizeof(struct sockaddr)) <= 0) + return 1; + return 0; +} + +int sandbox_raw_halt(int sd) +{ + close(sd); +} diff --git a/drivers/net/sandbox.c b/drivers/net/sandbox.c index 79a2fd5..c5113b4 100644 --- a/drivers/net/sandbox.c +++ b/drivers/net/sandbox.c @@ -20,8 +20,18 @@ struct eth_sandbox_priv { IPaddr_t fake_host_ipaddr; uchar recv_packet_buffer[PKTSIZE]; int recv_packet_length; +#ifdef CONFIG_ETH_SANDBOX_RAW + void *device; + int sd; +#endif }; +#ifdef CONFIG_ETH_SANDBOX_RAW +int sandbox_raw_init(int *sd, void **devp); +int sandbox_raw_send(void *packet, int length, int sd, void *device); +int sandbox_raw_halt(int sd); +#endif + int sb_eth_init(struct udevice *dev, bd_t *bis) { debug("eth_sandbox: Init\n"); @@ -35,6 +45,11 @@ int sb_eth_init(struct udevice *dev, bd_t *bis) for (i = 0; i < ARP_HLEN; i++) priv->fake_host_hwaddr[i] = (uchar)int_array[i]; +#ifdef CONFIG_ETH_SANDBOX_RAW + int ret = sandbox_raw_init(&(priv->sd), &(priv->device)); + if (ret) + return ret; +#endif return 0; } @@ -43,6 +58,9 @@ int sb_eth_send(struct udevice *dev, void *packet, int length) debug("eth_sandbox: Send packet %d\n", length); struct eth_sandbox_priv *priv = dev->priv; +#ifdef CONFIG_ETH_SANDBOX_RAW + return sandbox_raw_send(packet, length, priv->sd, priv->device); +#else struct ethernet_hdr *eth = packet; if (ntohs(eth->et_protlen) == PROT_ARP) { struct arp_hdr *arp = packet + ETHER_HDR_SIZE; @@ -133,6 +151,11 @@ int sb_eth_recv(struct udevice *dev) void sb_eth_halt(struct udevice *dev) { debug("eth_sandbox: Halt\n"); + +#ifdef CONFIG_ETH_SANDBOX_RAW + struct eth_sandbox_priv *priv = dev->priv; + sandbox_raw_halt(priv->sd); +#endif } int sb_eth_write_hwaddr(struct udevice *dev) -- 1.7.11.5 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot