mirror of
https://github.com/apache/nuttx.git
synced 2026-05-31 05:55:46 +08:00
ARP: Add IOCTL commands to manage the ARP table
This commit is contained in:
@@ -11466,4 +11466,6 @@
|
|||||||
g_readytorun() with the wrapper this_task() which hides the implementation
|
g_readytorun() with the wrapper this_task() which hides the implementation
|
||||||
and will permit such things as more scalable representations of task queues
|
and will permit such things as more scalable representations of task queues
|
||||||
and SMP (2016-02-06).
|
and SMP (2016-02-06).
|
||||||
|
* include/nuttx/net/arp.h, include/nuttx/net/ioctl.h, net/netdev/netdev_ioctl.c,
|
||||||
|
and ARP-related files: Add support for IOCTL commands to manage the
|
||||||
|
ARP table (2016-02-08).
|
||||||
|
|||||||
@@ -1740,7 +1740,7 @@ o Network Utilities (apps/netutils/)
|
|||||||
Priority: Low
|
Priority: Low
|
||||||
|
|
||||||
Title: DHCPD ACCESSES KERNEL PRIVATE INTERFACE
|
Title: DHCPD ACCESSES KERNEL PRIVATE INTERFACE
|
||||||
Description: arp_update() is referenced outside of nuttx/net. It is used in
|
Description: arp_hdr_update() is referenced outside of nuttx/net. It is used in
|
||||||
in the netutils/ DHCPD logic to set entries in the ARP table.
|
in the netutils/ DHCPD logic to set entries in the ARP table.
|
||||||
That is violation of the separation of kernel and OS
|
That is violation of the separation of kernel and OS
|
||||||
functionality. As a consequence, dhcpd will not work with the
|
functionality. As a consequence, dhcpd will not work with the
|
||||||
|
|||||||
+32
-2
@@ -2,7 +2,7 @@
|
|||||||
* include/nuttx/net/arp.h
|
* include/nuttx/net/arp.h
|
||||||
* Macros and definitions for the ARP module.
|
* Macros and definitions for the ARP module.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007, 2009-2012, 2015 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2007, 2009-2012, 2015-2016 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
*
|
*
|
||||||
* Derived from uIP with has a similar BSD-styple license:
|
* Derived from uIP with has a similar BSD-styple license:
|
||||||
@@ -48,6 +48,7 @@
|
|||||||
#include <nuttx/config.h>
|
#include <nuttx/config.h>
|
||||||
#include <nuttx/compiler.h>
|
#include <nuttx/compiler.h>
|
||||||
|
|
||||||
|
#include <sys/socket.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
@@ -60,6 +61,15 @@
|
|||||||
* Pre-processor Definitions
|
* Pre-processor Definitions
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* ARP protocol HARDWARE identifiers. Provided as the sa_family member of a
|
||||||
|
* struct sockaddr.
|
||||||
|
*
|
||||||
|
* When sa_family is ARPHRD_ETHER, the 6 byte Ethernet address is provided
|
||||||
|
* in the first 6-bytes of the sockaddr sa_data array.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define ARPHRD_ETHER 1 /* Only Ethernet is supported */
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Public Types
|
* Public Types
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
@@ -70,9 +80,29 @@ struct arp_entry
|
|||||||
{
|
{
|
||||||
in_addr_t at_ipaddr; /* IP address */
|
in_addr_t at_ipaddr; /* IP address */
|
||||||
struct ether_addr at_ethaddr; /* Hardware address */
|
struct ether_addr at_ethaddr; /* Hardware address */
|
||||||
uint8_t at_time;
|
uint8_t at_time; /* Time of last usage */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Used with the SIOCSARP, SIOCDARP, and SIOCGARP IOCTL commands to set,
|
||||||
|
* delete, or get an ARP table entry.
|
||||||
|
*
|
||||||
|
* SIOCSARP - Both values are inputs a define the new ARP table entry
|
||||||
|
* SIOCDARP - Only the protcol address is required as an input. The ARP
|
||||||
|
* table entry with that matching address will be deleted,
|
||||||
|
* regardless of the hardware address.
|
||||||
|
* SIOCGARP - The protocol address is an input an identifies the table
|
||||||
|
* entry to locate; The hardware address is an output and
|
||||||
|
* on a successful lookup, provides the matching hardware
|
||||||
|
* address.
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct arpreq
|
||||||
|
{
|
||||||
|
struct sockaddr arp_pa; /* Protocol address */
|
||||||
|
struct sockaddr arp_ha; /* Hardware address */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Public Data
|
* Public Data
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|||||||
+69
-60
@@ -1,7 +1,7 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* include/nuttx/net/ioctl.h
|
* include/nuttx/net/ioctl.h
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007-2008, 2010-2013, 2015 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2007-2008, 2010-2013, 2015-2016 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
@@ -94,97 +94,106 @@
|
|||||||
#define SIOCGIPMSFILTER _SIOC(0x001a) /* Retrieve source filter addresses */
|
#define SIOCGIPMSFILTER _SIOC(0x001a) /* Retrieve source filter addresses */
|
||||||
#define SIOCSIPMSFILTER _SIOC(0x001b) /* Set source filter content */
|
#define SIOCSIPMSFILTER _SIOC(0x001b) /* Set source filter content */
|
||||||
|
|
||||||
|
/* ARP Table. Argument is a reference to sruct arpreq as defined
|
||||||
|
* include/nuttx/net/arp.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define SIOCSARP _SIOC(0x001c) /* Set an ARP mapping */
|
||||||
|
#define SIOCDARP _SIOC(0x001d) /* Delete an ARP mapping */
|
||||||
|
#define SIOCGARP _SIOC(0x001e) /* Get an ARP mapping */
|
||||||
|
|
||||||
/* Routing table. Argument is a reference to struct rtentry as defined in
|
/* Routing table. Argument is a reference to struct rtentry as defined in
|
||||||
* include/net/route.h
|
* include/net/route.h
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define SIOCADDRT _SIOC(0x001c) /* Add an entry to the routing table */
|
#define SIOCADDRT _SIOC(0x001f) /* Add an entry to the routing table */
|
||||||
#define SIOCDELRT _SIOC(0x001d) /* Delete an entry from the routing table */
|
#define SIOCDELRT _SIOC(0x0020) /* Delete an entry from the routing table */
|
||||||
|
|
||||||
/* Wireless ioctl commands **************************************************/
|
/* Wireless ioctl commands **************************************************/
|
||||||
|
/* Not currently used */
|
||||||
|
|
||||||
#define SIOCSIWCOMMIT _SIOC(0x001e) /* Commit pending changes to driver */
|
#define SIOCSIWCOMMIT _SIOC(0x0021) /* Commit pending changes to driver */
|
||||||
#define SIOCGIWNAME _SIOC(0x001f) /* Get name of wireless protocol */
|
#define SIOCGIWNAME _SIOC(0x0022) /* Get name of wireless protocol */
|
||||||
|
|
||||||
#define SIOCSIWNWID _SIOC(0x0020) /* Set network ID (pre-802.11) */
|
#define SIOCSIWNWID _SIOC(0x0023) /* Set network ID (pre-802.11) */
|
||||||
#define SIOCGIWNWID _SIOC(0x0021) /* Get network ID (the cell) */
|
#define SIOCGIWNWID _SIOC(0x0024) /* Get network ID (the cell) */
|
||||||
#define SIOCSIWFREQ _SIOC(0x0022) /* Set channel/frequency (Hz) */
|
#define SIOCSIWFREQ _SIOC(0x0025) /* Set channel/frequency (Hz) */
|
||||||
#define SIOCGIWFREQ _SIOC(0x0023) /* Get channel/frequency (Hz) */
|
#define SIOCGIWFREQ _SIOC(0x0026) /* Get channel/frequency (Hz) */
|
||||||
#define SIOCSIWMODE _SIOC(0x0024) /* Set operation mode */
|
#define SIOCSIWMODE _SIOC(0x0027) /* Set operation mode */
|
||||||
#define SIOCGIWMODE _SIOC(0x0025) /* Get operation mode */
|
#define SIOCGIWMODE _SIOC(0x0028) /* Get operation mode */
|
||||||
#define SIOCSIWSENS _SIOC(0x0026) /* Set sensitivity (dBm) */
|
#define SIOCSIWSENS _SIOC(0x0029) /* Set sensitivity (dBm) */
|
||||||
#define SIOCGIWSENS _SIOC(0x0027) /* Get sensitivity (dBm) */
|
#define SIOCGIWSENS _SIOC(0x002a) /* Get sensitivity (dBm) */
|
||||||
|
|
||||||
#define SIOCGIWRANGE _SIOC(0x0028) /* Get range of parameters */
|
#define SIOCGIWRANGE _SIOC(0x002b) /* Get range of parameters */
|
||||||
#define SIOCGIWPRIV _SIOC(0x0029) /* Get private ioctl interface info */
|
#define SIOCGIWPRIV _SIOC(0x002c) /* Get private ioctl interface info */
|
||||||
#define SIOCGIWSTATS _SIOC(0x002a) /* Get wireless stats */
|
#define SIOCGIWSTATS _SIOC(0x002d) /* Get wireless stats */
|
||||||
|
|
||||||
#define SIOCSIWSPY _SIOC(0x002b) /* Set spy addresses */
|
#define SIOCSIWSPY _SIOC(0x002e) /* Set spy addresses */
|
||||||
#define SIOCGIWSPY _SIOC(0x002c) /* Get spy info (quality of link) */
|
#define SIOCGIWSPY _SIOC(0x002f) /* Get spy info (quality of link) */
|
||||||
#define SIOCSIWTHRSPY _SIOC(0x002d) /* Set spy threshold (spy event) */
|
#define SIOCSIWTHRSPY _SIOC(0x0030) /* Set spy threshold (spy event) */
|
||||||
#define SIOCGIWTHRSPY _SIOC(0x002e) /* Get spy threshold */
|
#define SIOCGIWTHRSPY _SIOC(0x0031) /* Get spy threshold */
|
||||||
|
|
||||||
#define SIOCSIWAP _SIOC(0x002f) /* Set access point MAC addresses */
|
#define SIOCSIWAP _SIOC(0x0032) /* Set access point MAC addresses */
|
||||||
#define SIOCGIWAP _SIOC(0x0030) /* Get access point MAC addresses */
|
#define SIOCGIWAP _SIOC(0x0033) /* Get access point MAC addresses */
|
||||||
#define SIOCGIWAPLIST _SIOC(0x0031) /* Deprecated in favor of scanning */
|
#define SIOCGIWAPLIST _SIOC(0x0034) /* Deprecated in favor of scanning */
|
||||||
#define SIOCSIWSCAN _SIOC(0x0032) /* Trigger scanning (list cells) */
|
#define SIOCSIWSCAN _SIOC(0x0035) /* Trigger scanning (list cells) */
|
||||||
#define SIOCGIWSCAN _SIOC(0x0033) /* Get scanning results */
|
#define SIOCGIWSCAN _SIOC(0x0036) /* Get scanning results */
|
||||||
|
|
||||||
#define SIOCSIWESSID _SIOC(0x0034) /* Set ESSID (network name) */
|
#define SIOCSIWESSID _SIOC(0x0037) /* Set ESSID (network name) */
|
||||||
#define SIOCGIWESSID _SIOC(0x0035) /* Get ESSID */
|
#define SIOCGIWESSID _SIOC(0x0038) /* Get ESSID */
|
||||||
#define SIOCSIWNICKN _SIOC(0x0036) /* Set node name/nickname */
|
#define SIOCSIWNICKN _SIOC(0x0039) /* Set node name/nickname */
|
||||||
#define SIOCGIWNICKN _SIOC(0x0037) /* Get node name/nickname */
|
#define SIOCGIWNICKN _SIOC(0x003a) /* Get node name/nickname */
|
||||||
|
|
||||||
#define SIOCSIWRATE _SIOC(0x0038) /* Set default bit rate (bps) */
|
#define SIOCSIWRATE _SIOC(0x003b) /* Set default bit rate (bps) */
|
||||||
#define SIOCGIWRATE _SIOC(0x0039) /* Get default bit rate (bps) */
|
#define SIOCGIWRATE _SIOC(0x003c) /* Get default bit rate (bps) */
|
||||||
#define SIOCSIWRTS _SIOC(0x003a) /* Set RTS/CTS threshold (bytes) */
|
#define SIOCSIWRTS _SIOC(0x003d) /* Set RTS/CTS threshold (bytes) */
|
||||||
#define SIOCGIWRTS _SIOC(0x003b) /* Get RTS/CTS threshold (bytes) */
|
#define SIOCGIWRTS _SIOC(0x003e) /* Get RTS/CTS threshold (bytes) */
|
||||||
#define SIOCSIWFRAG _SIOC(0x003c) /* Set fragmentation thr (bytes) */
|
#define SIOCSIWFRAG _SIOC(0x003f) /* Set fragmentation thr (bytes) */
|
||||||
#define SIOCGIWFRAG _SIOC(0x003d) /* Get fragmentation thr (bytes) */
|
#define SIOCGIWFRAG _SIOC(0x0040) /* Get fragmentation thr (bytes) */
|
||||||
#define SIOCSIWTXPOW _SIOC(0x003e) /* Set transmit power (dBm) */
|
#define SIOCSIWTXPOW _SIOC(0x0041) /* Set transmit power (dBm) */
|
||||||
#define SIOCGIWTXPOW _SIOC(0x003f) /* Get transmit power (dBm) */
|
#define SIOCGIWTXPOW _SIOC(0x0042) /* Get transmit power (dBm) */
|
||||||
#define SIOCSIWRETRY _SIOC(0x0040) /* Set retry limits and lifetime */
|
#define SIOCSIWRETRY _SIOC(0x0043) /* Set retry limits and lifetime */
|
||||||
#define SIOCGIWRETRY _SIOC(0x0041) /* Get retry limits and lifetime */
|
#define SIOCGIWRETRY _SIOC(0x0044) /* Get retry limits and lifetime */
|
||||||
|
|
||||||
#define SIOCSIWPOWER _SIOC(0x0042) /* Set Power Management settings */
|
#define SIOCSIWPOWER _SIOC(0x0045) /* Set Power Management settings */
|
||||||
#define SIOCGIWPOWER _SIOC(0x0043) /* Get Power Management settings */
|
#define SIOCGIWPOWER _SIOC(0x0046) /* Get Power Management settings */
|
||||||
|
|
||||||
#define SIOCSIWGENIE _SIOC(0x0044) /* Set generic IE */
|
#define SIOCSIWGENIE _SIOC(0x0047) /* Set generic IE */
|
||||||
#define SIOCGIWGENIE _SIOC(0x0045) /* Get generic IE */
|
#define SIOCGIWGENIE _SIOC(0x0048) /* Get generic IE */
|
||||||
|
|
||||||
#define SIOCSIWMLME _SIOC(0x0046) /* Request MLME operation */
|
#define SIOCSIWMLME _SIOC(0x0049) /* Request MLME operation */
|
||||||
|
|
||||||
#define SIOCSIWAUTH _SIOC(0x0047) /* Set authentication mode params */
|
#define SIOCSIWAUTH _SIOC(0x004a) /* Set authentication mode params */
|
||||||
#define SIOCGIWAUTH _SIOC(0x0048) /* Get authentication mode params */
|
#define SIOCGIWAUTH _SIOC(0x004b) /* Get authentication mode params */
|
||||||
|
|
||||||
#define SIOCSIWENCODEEXT _SIOC(0x0049) /* Set encoding token & mode */
|
#define SIOCSIWENCODEEXT _SIOC(0x004c) /* Set encoding token & mode */
|
||||||
#define SIOCGIWENCODEEXT _SIOC(0x004a) /* Get encoding token & mode */
|
#define SIOCGIWENCODEEXT _SIOC(0x004d) /* Get encoding token & mode */
|
||||||
|
|
||||||
#define SIOCSIWPMKSA _SIOC(0x004b) /* PMKSA cache operation */
|
#define SIOCSIWPMKSA _SIOC(0x004e) /* PMKSA cache operation */
|
||||||
|
|
||||||
/* MDIO/MCD *****************************************************************/
|
/* MDIO/MCD *****************************************************************/
|
||||||
|
|
||||||
#define SIOCMIINOTIFY _SIOC(0x004b) /* Receive notificaion via signal on
|
#define SIOCMIINOTIFY _SIOC(0x004f) /* Receive notificaion via signal on
|
||||||
* PHY state change */
|
* PHY state change */
|
||||||
#define SIOCGMIIPHY _SIOC(0x004c) /* Get address of MII PHY in use */
|
#define SIOCGMIIPHY _SIOC(0x0050) /* Get address of MII PHY in use */
|
||||||
#define SIOCGMIIREG _SIOC(0x004d) /* Get a MII register via MDIO */
|
#define SIOCGMIIREG _SIOC(0x0051) /* Get a MII register via MDIO */
|
||||||
#define SIOCSMIIREG _SIOC(0x004e) /* Set a MII register via MDIO */
|
#define SIOCSMIIREG _SIOC(0x0052) /* Set a MII register via MDIO */
|
||||||
|
|
||||||
/* Unix domain sockets ******************************************************/
|
/* Unix domain sockets ******************************************************/
|
||||||
|
|
||||||
#define SIOCINQ _SIOC(0x004f) /* Returns the amount of queued unread
|
#define SIOCINQ _SIOC(0x0053) /* Returns the amount of queued unread
|
||||||
* data in the receive */
|
* data in the receive */
|
||||||
|
|
||||||
/* Telnet driver ************************************************************/
|
/* Telnet driver ************************************************************/
|
||||||
|
|
||||||
#define SIOCTELNET _SIOC(0x0050) /* Create a Telnet sessions.
|
#define SIOCTELNET _SIOC(0x0054) /* Create a Telnet sessions.
|
||||||
* See include/nuttx/net/telnet.h */
|
* See include/nuttx/net/telnet.h */
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Type Definitions
|
* Pulbic Type Definitions
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
/* See include/net/if.h */
|
/* See include/net/if.h, include/net/route.h, and include/net/arp.h */
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Public Function Prototypes
|
* Public Function Prototypes
|
||||||
|
|||||||
+31
-4
@@ -1,7 +1,7 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* net/arp/arp.h
|
* net/arp/arp.h
|
||||||
*
|
*
|
||||||
* Copyright (C) 2014-2015 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2014-2016 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
@@ -420,15 +420,41 @@ FAR struct arp_entry *arp_find(in_addr_t ipaddr);
|
|||||||
* address of an existing association.
|
* address of an existing association.
|
||||||
*
|
*
|
||||||
* Input parameters:
|
* Input parameters:
|
||||||
* pipaddr - Refers to an IP address uint16_t[2] in network order
|
* ipaddr - The IP address as an inaddr_t
|
||||||
* ethaddr - Refers to a HW address uint8_t[IFHWADDRLEN]
|
* ethaddr - Refers to a HW address uint8_t[IFHWADDRLEN]
|
||||||
*
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* Zero (OK) if the ARP table entry was successfully modified. A negated
|
||||||
|
* errno value is returned on any error.
|
||||||
|
*
|
||||||
* Assumptions
|
* Assumptions
|
||||||
* Interrupts are disabled to assure exclusive access to the ARP table.
|
* The network is locked to assure exclusive access to the ARP table
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
void arp_update(FAR uint16_t *pipaddr, FAR uint8_t *ethaddr);
|
int arp_update(in_addr_t ipaddr, FAR uint8_t *ethaddr);
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: arp_hdr_update
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Add the IP/HW address mapping to the ARP table -OR- change the IP
|
||||||
|
* address of an existing association.
|
||||||
|
*
|
||||||
|
* Input parameters:
|
||||||
|
* pipaddr - Refers to an IP address uint16_t[2] in network order
|
||||||
|
* ethaddr - Refers to a HW address uint8_t[IFHWADDRLEN]
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* Zero (OK) if the ARP table entry was successfully modified. A negated
|
||||||
|
* errno value is returned on any error.
|
||||||
|
*
|
||||||
|
* Assumptions
|
||||||
|
* The network is locked to assure exclusive access to the ARP table
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void arp_hdr_update(FAR uint16_t *pipaddr, FAR uint8_t *ethaddr);
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: arp_dump
|
* Name: arp_dump
|
||||||
@@ -467,6 +493,7 @@ void arp_dump(FAR struct arp_hdr_s *arp);
|
|||||||
# define arp_find(i) (NULL)
|
# define arp_find(i) (NULL)
|
||||||
# define arp_delete(i)
|
# define arp_delete(i)
|
||||||
# define arp_update(i,m);
|
# define arp_update(i,m);
|
||||||
|
# define arp_hdr_update(i,m);
|
||||||
# define arp_dump(arp)
|
# define arp_dump(arp)
|
||||||
|
|
||||||
#endif /* CONFIG_NET_ARP */
|
#endif /* CONFIG_NET_ARP */
|
||||||
|
|||||||
+2
-2
@@ -132,7 +132,7 @@ void arp_arpin(FAR struct net_driver_s *dev)
|
|||||||
* with this host in the future.
|
* with this host in the future.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
arp_update(arp->ah_sipaddr, arp->ah_shwaddr);
|
arp_hdr_update(arp->ah_sipaddr, arp->ah_shwaddr);
|
||||||
|
|
||||||
arp->ah_opcode = HTONS(ARP_REPLY);
|
arp->ah_opcode = HTONS(ARP_REPLY);
|
||||||
memcpy(arp->ah_dhwaddr, arp->ah_shwaddr, ETHER_ADDR_LEN);
|
memcpy(arp->ah_dhwaddr, arp->ah_shwaddr, ETHER_ADDR_LEN);
|
||||||
@@ -161,7 +161,7 @@ void arp_arpin(FAR struct net_driver_s *dev)
|
|||||||
{
|
{
|
||||||
/* Yes... Insert the address mapping in the ARP table */
|
/* Yes... Insert the address mapping in the ARP table */
|
||||||
|
|
||||||
arp_update(arp->ah_sipaddr, arp->ah_shwaddr);
|
arp_hdr_update(arp->ah_sipaddr, arp->ah_shwaddr);
|
||||||
|
|
||||||
/* Then notify any logic waiting for the ARP result */
|
/* Then notify any logic waiting for the ARP result */
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -101,7 +101,7 @@ void arp_ipin(FAR struct net_driver_s *dev)
|
|||||||
srcipaddr = net_ip4addr_conv32(IPBUF->eh_srcipaddr);
|
srcipaddr = net_ip4addr_conv32(IPBUF->eh_srcipaddr);
|
||||||
if (net_ipv4addr_maskcmp(srcipaddr, dev->d_ipaddr, dev->d_netmask))
|
if (net_ipv4addr_maskcmp(srcipaddr, dev->d_ipaddr, dev->d_netmask))
|
||||||
{
|
{
|
||||||
arp_update(IPBUF->eh_srcipaddr, ETHBUF->src);
|
arp_hdr_update(IPBUF->eh_srcipaddr, ETHBUF->src);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+36
-4
@@ -142,18 +142,21 @@ void arp_timer(void)
|
|||||||
* address of an existing association.
|
* address of an existing association.
|
||||||
*
|
*
|
||||||
* Input parameters:
|
* Input parameters:
|
||||||
* pipaddr - Refers to an IP address uint16_t[2]
|
* ipaddr - The IP address as an inaddr_t
|
||||||
* ethaddr - Refers to a HW address uint8_t[IFHWADDRLEN]
|
* ethaddr - Refers to a HW address uint8_t[IFHWADDRLEN]
|
||||||
*
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* Zero (OK) if the ARP table entry was successfully modified. A negated
|
||||||
|
* errno value is returned on any error.
|
||||||
|
*
|
||||||
* Assumptions
|
* Assumptions
|
||||||
* Interrupts are disabled
|
* The network is locked to assure exclusive access to the ARP table
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
void arp_update(FAR uint16_t *pipaddr, FAR uint8_t *ethaddr)
|
int arp_update(in_addr_t ipaddr, FAR uint8_t *ethaddr)
|
||||||
{
|
{
|
||||||
struct arp_entry *tabptr = NULL;
|
struct arp_entry *tabptr = NULL;
|
||||||
in_addr_t ipaddr = net_ip4addr_conv32(pipaddr);
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* Walk through the ARP mapping table and try to find an entry to
|
/* Walk through the ARP mapping table and try to find an entry to
|
||||||
@@ -229,6 +232,35 @@ void arp_update(FAR uint16_t *pipaddr, FAR uint8_t *ethaddr)
|
|||||||
tabptr->at_time = g_arptime;
|
tabptr->at_time = g_arptime;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: arp_hdr_update
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Add the IP/HW address mapping to the ARP table -OR- change the IP
|
||||||
|
* address of an existing association.
|
||||||
|
*
|
||||||
|
* Input parameters:
|
||||||
|
* pipaddr - Refers to an IP address uint16_t[2] in network order
|
||||||
|
* ethaddr - Refers to a HW address uint8_t[IFHWADDRLEN]
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* Zero (OK) if the ARP table entry was successfully modified. A negated
|
||||||
|
* errno value is returned on any error.
|
||||||
|
*
|
||||||
|
* Assumptions
|
||||||
|
* The network is locked to assure exclusive access to the ARP table
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void arp_hdr_update(FAR uint16_t *pipaddr, FAR uint8_t *ethaddr)
|
||||||
|
{
|
||||||
|
in_addr_t ipaddr = net_ip4addr_conv32(pipaddr);
|
||||||
|
|
||||||
|
/* Update the ARP table */
|
||||||
|
|
||||||
|
(void)arp_update(ipaddr, ethaddr);
|
||||||
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: arp_find
|
* Name: arp_find
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -57,12 +57,14 @@
|
|||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
|
|
||||||
#include <nuttx/net/netdev.h>
|
#include <nuttx/net/netdev.h>
|
||||||
|
#include <nuttx/net/arp.h>
|
||||||
|
|
||||||
#ifdef CONFIG_NET_IGMP
|
#ifdef CONFIG_NET_IGMP
|
||||||
# include "sys/sockio.h"
|
# include "sys/sockio.h"
|
||||||
# include "nuttx/net/igmp.h"
|
# include "nuttx/net/igmp.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "arp/arp.h"
|
||||||
#include "socket/socket.h"
|
#include "socket/socket.h"
|
||||||
#include "netdev/netdev.h"
|
#include "netdev/netdev.h"
|
||||||
#include "devif/devif.h"
|
#include "devif/devif.h"
|
||||||
@@ -808,6 +810,129 @@ static int netdev_imsfioctl(FAR struct socket *psock, int cmd,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: netdev_arpioctl
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Perform ARP table specific operations.
|
||||||
|
*
|
||||||
|
* Parameters:
|
||||||
|
* psock Socket structure
|
||||||
|
* dev Ethernet driver device structure
|
||||||
|
* cmd The ioctl command
|
||||||
|
* req The argument of the ioctl cmd
|
||||||
|
*
|
||||||
|
* Return:
|
||||||
|
* >=0 on success (positive non-zero values are cmd-specific)
|
||||||
|
* Negated errno returned on failure.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifdef CONFIG_NET_ARP
|
||||||
|
static int netdev_arpioctl(FAR struct socket *psock, int cmd,
|
||||||
|
FAR struct arpreq *req)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
/* Execute the command */
|
||||||
|
|
||||||
|
switch (cmd)
|
||||||
|
{
|
||||||
|
case SIOCSARP: /* Set an ARP mapping */
|
||||||
|
{
|
||||||
|
if (req != NULL &&
|
||||||
|
req->arp_pa.sa_family == AF_INET &&
|
||||||
|
req->arp_ha.sa_family == ARPHRD_ETHER)
|
||||||
|
{
|
||||||
|
FAR struct sockaddr_in *addr =
|
||||||
|
(FAR struct sockaddr_in *)&req->arp_pa;
|
||||||
|
|
||||||
|
/* Update any existing ARP table entry for this protocol
|
||||||
|
* address -OR- add a new ARP table entry if there is not.
|
||||||
|
*/
|
||||||
|
|
||||||
|
ret = arp_update(addr->sin_addr.s_addr,
|
||||||
|
(FAR uint8_t *)req->arp_ha.sa_data);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ret = -EINVAL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SIOCDARP: /* Delete an ARP mapping */
|
||||||
|
{
|
||||||
|
if (req != NULL && req->arp_pa.sa_family == AF_INET)
|
||||||
|
{
|
||||||
|
FAR struct sockaddr_in *addr =
|
||||||
|
(FAR struct sockaddr_in *)&req->arp_pa;
|
||||||
|
|
||||||
|
/* Find the existing ARP table entry for this protocol address. */
|
||||||
|
|
||||||
|
FAR struct arp_entry *entry = arp_find(addr->sin_addr.s_addr);
|
||||||
|
if (entry != NULL)
|
||||||
|
{
|
||||||
|
/* The ARP table is fixed size; an entry is deleted
|
||||||
|
* by nullifying its protocol address.
|
||||||
|
*/
|
||||||
|
|
||||||
|
entry->at_ipaddr = 0;
|
||||||
|
ret = OK;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ret = -ENOENT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ret = -EINVAL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SIOCGARP: /* Get an ARP mapping */
|
||||||
|
{
|
||||||
|
if (req != NULL && req->arp_pa.sa_family == AF_INET)
|
||||||
|
{
|
||||||
|
FAR struct sockaddr_in *addr =
|
||||||
|
(FAR struct sockaddr_in *)&req->arp_pa;
|
||||||
|
|
||||||
|
/* Find the existing ARP table entry for this protocol address. */
|
||||||
|
|
||||||
|
FAR struct arp_entry *entry = arp_find(addr->sin_addr.s_addr);
|
||||||
|
if (entry != NULL)
|
||||||
|
{
|
||||||
|
/* Return the mapped hardware address. */
|
||||||
|
|
||||||
|
req->arp_ha.sa_family = ARPHRD_ETHER;
|
||||||
|
memcpy(req->arp_ha.sa_data,
|
||||||
|
entry->at_ethaddr.ether_addr_octet,
|
||||||
|
ETHER_ADDR_LEN);
|
||||||
|
ret = OK;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ret = -ENOENT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ret = -EINVAL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
ret = -ENOTTY;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: netdev_rtioctl
|
* Name: netdev_rtioctl
|
||||||
*
|
*
|
||||||
@@ -972,6 +1097,18 @@ int netdev_ioctl(int sockfd, int cmd, unsigned long arg)
|
|||||||
ret = netdev_imsfioctl(psock, cmd, (FAR struct ip_msfilter *)((uintptr_t)arg));
|
ret = netdev_imsfioctl(psock, cmd, (FAR struct ip_msfilter *)((uintptr_t)arg));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Check for ARP table IOCTL commands */
|
||||||
|
|
||||||
|
#ifdef CONFIG_NET_ARP
|
||||||
|
if (ret == -ENOTTY)
|
||||||
|
{
|
||||||
|
ret = netdev_arpioctl(psock, cmd, (FAR struct arpreq *)((uintptr_t)arg));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Check for Routing table IOCTL commands */
|
||||||
|
|
||||||
#ifdef CONFIG_NET_ROUTE
|
#ifdef CONFIG_NET_ROUTE
|
||||||
if (ret == -ENOTTY)
|
if (ret == -ENOTTY)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user