diff --git a/net/arp/Make.defs b/net/arp/Make.defs index 8ec6916e1d..688c74f000 100644 --- a/net/arp/Make.defs +++ b/net/arp/Make.defs @@ -36,7 +36,7 @@ # ARP supported is not provided for SLIP (Ethernet only) ifneq ($(CONFIG_NET_SLIP),y) -NET_CSRCS +=arp_arpin.c arp_out.c arp_table.c arp_timer.c +NET_CSRCS +=arp_arpin.c arp_out.c arp_format.c arp_table.c arp_timer.c ifeq ($(CONFIG_NET_ARP_IPIN),y) NET_CSRCS += arp_ipin.c diff --git a/net/arp/arp.h b/net/arp/arp.h index d0c9163d5b..399ecae3e5 100644 --- a/net/arp/arp.h +++ b/net/arp/arp.h @@ -53,6 +53,7 @@ #include #include +#include /**************************************************************************** * Pre-processor Definitions @@ -156,6 +157,24 @@ void arp_timer_initialize(void); void arp_timer(void); +/**************************************************************************** + * Name: arp_format + * + * Description: + * Format an ARP packet. + * + * Input Parameters: + * dev - Device structure + * ipaddr - Target IP address (32-bit) + * + * Returned Value: + * None + * + ****************************************************************************/ + +struct net_driver_s; /* Forward reference */ +void arp_format(FAR struct net_driver_s *dev, in_addr_t ipaddr); + /**************************************************************************** * Name: arp_dump * diff --git a/net/arp/arp_format.c b/net/arp/arp_format.c new file mode 100644 index 0000000000..96546cc3b4 --- /dev/null +++ b/net/arp/arp_format.c @@ -0,0 +1,121 @@ +/**************************************************************************** + * net/arp/arp_format.c + * + * Copyright (C) 2007-2011, 2014 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * Based on uIP which also has a BSD style license: + * + * Author: Adam Dunkels + * Copyright (c) 2001-2003, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include + +#include + +#include +#include + +#include "arp/arp.h" + +#ifdef CONFIG_NET_ARP + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#define ETHBUF ((struct eth_hdr_s *)&dev->d_buf[0]) +#define ARPBUF ((struct arp_hdr_s *)&dev->d_buf[NET_LL_HDRLEN]) + +/**************************************************************************** + * Private Types + ****************************************************************************/ + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: arp_format + * + * Description: + * Format an ARP packet. + * + * Input Parameters: + * dev - Device structure + * ipaddr - Target IP address (32-bit) + * + * Returned Value: + * None + * + ****************************************************************************/ + +void arp_format(FAR struct net_driver_s *dev, in_addr_t ipaddr) +{ + FAR struct arp_hdr_s *arp = ARPBUF; + FAR struct eth_hdr_s *eth = ETHBUF; + + /* Construct the ARP packet. Creating both the Ethernet and ARP headers */ + + memset(eth->dest, 0xff, ETHER_ADDR_LEN); + memset(arp->ah_dhwaddr, 0x00, ETHER_ADDR_LEN); + memcpy(eth->src, dev->d_mac.ether_addr_octet, ETHER_ADDR_LEN); + memcpy(arp->ah_shwaddr, dev->d_mac.ether_addr_octet, ETHER_ADDR_LEN); + + net_ipaddr_hdrcopy(arp->ah_dipaddr, &ipaddr); + net_ipaddr_hdrcopy(arp->ah_sipaddr, &dev->d_ipaddr); + + arp->ah_opcode = HTONS(ARP_REQUEST); + arp->ah_hwtype = HTONS(ARP_HWTYPE_ETH); + arp->ah_protocol = HTONS(ETHTYPE_IP); + arp->ah_hwlen = ETHER_ADDR_LEN; + arp->ah_protolen = 4; + + eth->type = HTONS(ETHTYPE_ARP); + dev->d_len = sizeof(struct arp_hdr_s) + NET_LL_HDRLEN; +} + +#endif /* CONFIG_NET_ARP */ diff --git a/net/arp/arp_out.c b/net/arp/arp_out.c index fe947cf3e0..76f9c1fe3a 100644 --- a/net/arp/arp_out.c +++ b/net/arp/arp_out.c @@ -133,7 +133,6 @@ static const uint8_t g_multicast_ethaddr[3] = {0x01, 0x00, 0x5e}; void arp_out(FAR struct net_driver_s *dev) { FAR const struct arp_entry *tabptr = NULL; - FAR struct arp_hdr_s *parp = ARPBUF; FAR struct eth_hdr_s *peth = ETHBUF; FAR struct arp_iphdr_s *pip = IPBUF; in_addr_t ipaddr; @@ -225,29 +224,14 @@ void arp_out(FAR struct net_driver_s *dev) tabptr = arp_find(ipaddr); if (!tabptr) { - nllvdbg("ARP request for IP %04lx\n", (long)ipaddr); + nllvdbg("ARP request for IP %08lx\n", (unsigned long)ipaddr); /* The destination address was not in our ARP table, so we * overwrite the IP packet with an ARP request. */ - memset(peth->dest, 0xff, ETHER_ADDR_LEN); - memset(parp->ah_dhwaddr, 0x00, ETHER_ADDR_LEN); - memcpy(peth->src, dev->d_mac.ether_addr_octet, ETHER_ADDR_LEN); - memcpy(parp->ah_shwaddr, dev->d_mac.ether_addr_octet, ETHER_ADDR_LEN); - - net_ipaddr_hdrcopy(parp->ah_dipaddr, &ipaddr); - net_ipaddr_hdrcopy(parp->ah_sipaddr, &dev->d_ipaddr); - - parp->ah_opcode = HTONS(ARP_REQUEST); - parp->ah_hwtype = HTONS(ARP_HWTYPE_ETH); - parp->ah_protocol = HTONS(ETHTYPE_IP); - parp->ah_hwlen = ETHER_ADDR_LEN; - parp->ah_protolen = 4; - arp_dump(parp); - - peth->type = HTONS(ETHTYPE_ARP); - dev->d_len = sizeof(struct arp_hdr_s) + NET_LL_HDRLEN; + arp_format(dev, ipaddr); + arp_dump(ARPBUF); return; }