mirror of
https://github.com/apache/nuttx.git
synced 2026-05-31 14:27:37 +08:00
Networking: Remove all logic conditioned upon IPv6 from the net/icmp/directory
This commit is contained in:
+1
-113
@@ -2,7 +2,7 @@
|
|||||||
* net/icmp/icmp_input.c
|
* net/icmp/icmp_input.c
|
||||||
* Handling incoming ICMP/ICMP6 input
|
* Handling incoming ICMP/ICMP6 input
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007-2009, 2012, 2014 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2007-2009, 2012, 2014-2015 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
*
|
*
|
||||||
* Adapted for NuttX from logic in uIP which also has a BSD-like license:
|
* Adapted for NuttX from logic in uIP which also has a BSD-like license:
|
||||||
@@ -114,9 +114,6 @@ void icmp_input(FAR struct net_driver_s *dev)
|
|||||||
g_netstats.icmp.recv++;
|
g_netstats.icmp.recv++;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef CONFIG_NET_IPv6
|
|
||||||
/* ICMPv4 processing code follows. */
|
|
||||||
|
|
||||||
/* ICMP echo (i.e., ping) processing. This is simple, we only change the
|
/* ICMP echo (i.e., ping) processing. This is simple, we only change the
|
||||||
* ICMP type from ECHO to ECHO_REPLY and adjust the ICMP checksum before
|
* ICMP type from ECHO to ECHO_REPLY and adjust the ICMP checksum before
|
||||||
* we return the packet.
|
* we return the packet.
|
||||||
@@ -207,115 +204,6 @@ typeerr:
|
|||||||
g_netstats.icmp.drop++;
|
g_netstats.icmp.drop++;
|
||||||
#endif
|
#endif
|
||||||
dev->d_len = 0;
|
dev->d_len = 0;
|
||||||
|
|
||||||
#else /* !CONFIG_NET_IPv6 */
|
|
||||||
|
|
||||||
/* If we get a neighbor solicitation for our address we should send
|
|
||||||
* a neighbor advertisement message back.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (picmp->type == ICMP6_NEIGHBOR_SOLICITATION)
|
|
||||||
{
|
|
||||||
if (net_ipaddr_cmp(picmp->icmp6data, dev->d_ipaddr))
|
|
||||||
{
|
|
||||||
if (picmp->options[0] == ICMP6_OPTION_SOURCE_LINK_ADDRESS)
|
|
||||||
{
|
|
||||||
/* Save the sender's address in our neighbor list. */
|
|
||||||
|
|
||||||
net_neighbor_add(picmp->srcipaddr, &(picmp->options[2]));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* We should now send a neighbor advertisement back to where the
|
|
||||||
* neighbor solicitation came from.
|
|
||||||
*/
|
|
||||||
|
|
||||||
picmp->type = ICMP6_NEIGHBOR_ADVERTISEMENT;
|
|
||||||
picmp->flags = ICMP6_FLAG_S; /* Solicited flag. */
|
|
||||||
|
|
||||||
picmp->reserved1 = picmp->reserved2 = picmp->reserved3 = 0;
|
|
||||||
|
|
||||||
net_ipaddr_hdrcopy(picmp->destipaddr, picmp->srcipaddr);
|
|
||||||
net_ipaddr_hdrcopy(picmp->srcipaddr, &dev->d_ipaddr);
|
|
||||||
picmp->options[0] = ICMP6_OPTION_TARGET_LINK_ADDRESS;
|
|
||||||
picmp->options[1] = 1; /* Options length, 1 = 8 bytes. */
|
|
||||||
memcpy(&(picmp->options[2]), &dev->d_mac, IFHWADDRLEN);
|
|
||||||
picmp->icmpchksum = 0;
|
|
||||||
picmp->icmpchksum = ~icmp_6chksum(dev);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
goto drop;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (picmp->type == ICMP6_ECHO_REQUEST)
|
|
||||||
{
|
|
||||||
/* ICMP echo (i.e., ping) processing. This is simple, we only
|
|
||||||
* change the ICMP type from ECHO to ECHO_REPLY and update the
|
|
||||||
* ICMP checksum before we return the packet.
|
|
||||||
*/
|
|
||||||
|
|
||||||
picmp->type = ICMP6_ECHO_REPLY;
|
|
||||||
|
|
||||||
net_ipaddr_hdrcopy(picmp->destipaddr, picmp->srcipaddr);
|
|
||||||
net_ipaddr_hdrcopy(picmp->srcipaddr, &dev->d_ipaddr);
|
|
||||||
picmp->icmpchksum = 0;
|
|
||||||
picmp->icmpchksum = ~icmp_6chksum(dev);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If an ICMP echo reply is received then there should also be
|
|
||||||
* a thread waiting to received the echo response.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef CONFIG_NET_ICMP_PING
|
|
||||||
else if (picmp->type == ICMP6_ECHO_REPLY && g_echocallback)
|
|
||||||
{
|
|
||||||
uint16_t flags = ICMP_ECHOREPLY;
|
|
||||||
|
|
||||||
if (g_echocallback)
|
|
||||||
{
|
|
||||||
/* Dispatch the ECHO reply to the waiting thread */
|
|
||||||
|
|
||||||
flags = devif_callback_execute(dev, picmp, flags, g_echocallback);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the ECHO reply was not handled, then drop the packet */
|
|
||||||
|
|
||||||
if (flags == ICMP_ECHOREPLY)
|
|
||||||
{
|
|
||||||
/* The ECHO reply was not handled */
|
|
||||||
|
|
||||||
goto drop;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
else
|
|
||||||
{
|
|
||||||
nlldbg("Unknown ICMP6 cmd: %d\n", picmp->type);
|
|
||||||
goto typeerr;
|
|
||||||
}
|
|
||||||
|
|
||||||
nllvdbg("Outgoing ICMP6 packet length: %d (%d)\n",
|
|
||||||
dev->d_len, (picmp->len[0] << 8) | picmp->len[1]);
|
|
||||||
|
|
||||||
#ifdef CONFIG_NET_STATISTICS
|
|
||||||
g_netstats.icmp.sent++;
|
|
||||||
g_netstats.ip.sent++;
|
|
||||||
#endif
|
|
||||||
return;
|
|
||||||
|
|
||||||
typeerr:
|
|
||||||
#ifdef CONFIG_NET_STATISTICS
|
|
||||||
g_netstats.icmp.typeerr++;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
drop:
|
|
||||||
#ifdef CONFIG_NET_STATISTICS
|
|
||||||
g_netstats.icmp.drop++;
|
|
||||||
#endif
|
|
||||||
dev->d_len = 0;
|
|
||||||
|
|
||||||
#endif /* !CONFIG_NET_IPv6 */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* CONFIG_NET_ICMP */
|
#endif /* CONFIG_NET_ICMP */
|
||||||
|
|||||||
@@ -218,12 +218,9 @@ static uint16_t ping_interrupt(FAR struct net_driver_s *dev, FAR void *conn,
|
|||||||
|
|
||||||
picmp->type = ICMP_ECHO_REQUEST;
|
picmp->type = ICMP_ECHO_REQUEST;
|
||||||
picmp->icode = 0;
|
picmp->icode = 0;
|
||||||
#ifndef CONFIG_NET_IPv6
|
|
||||||
picmp->id = htons(pstate->png_id);
|
picmp->id = htons(pstate->png_id);
|
||||||
picmp->seqno = htons(pstate->png_seqno);
|
picmp->seqno = htons(pstate->png_seqno);
|
||||||
#else
|
|
||||||
# error "IPv6 ECHO Request not implemented"
|
|
||||||
#endif
|
|
||||||
/* Add some easily verifiable data */
|
/* Add some easily verifiable data */
|
||||||
|
|
||||||
for (i = 0, ptr = ICMPDAT; i < pstate->png_datlen; i++)
|
for (i = 0, ptr = ICMPDAT; i < pstate->png_datlen; i++)
|
||||||
|
|||||||
+1
-20
@@ -110,24 +110,7 @@ void icmp_send(FAR struct net_driver_s *dev, FAR net_ipaddr_t *destaddr)
|
|||||||
|
|
||||||
dev->d_sndlen += ICMP_HDRLEN;
|
dev->d_sndlen += ICMP_HDRLEN;
|
||||||
|
|
||||||
/* Initialize the IP header. Note that for IPv6, the IP length field
|
/* Initialize the IP header. */
|
||||||
* does not include the IPv6 IP header length.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef CONFIG_NET_IPv6
|
|
||||||
|
|
||||||
picmp->vtc = 0x60;
|
|
||||||
picmp->tcf = 0x00;
|
|
||||||
picmp->flow = 0x00;
|
|
||||||
picmp->len[0] = (dev->d_sndlen >> 8);
|
|
||||||
picmp->len[1] = (dev->d_sndlen & 0xff);
|
|
||||||
picmp->nexthdr = IP_PROTO_ICMP;
|
|
||||||
picmp->hoplimit = IP_TTL;
|
|
||||||
|
|
||||||
net_ipaddr_copy(picmp->srcipaddr, &dev->d_ipaddr);
|
|
||||||
net_ipaddr_copy(picmp->destipaddr, destaddr);
|
|
||||||
|
|
||||||
#else /* CONFIG_NET_IPv6 */
|
|
||||||
|
|
||||||
picmp->vhl = 0x45;
|
picmp->vhl = 0x45;
|
||||||
picmp->tos = 0;
|
picmp->tos = 0;
|
||||||
@@ -149,8 +132,6 @@ void icmp_send(FAR struct net_driver_s *dev, FAR net_ipaddr_t *destaddr)
|
|||||||
picmp->ipchksum = 0;
|
picmp->ipchksum = 0;
|
||||||
picmp->ipchksum = ~(ip_chksum(dev));
|
picmp->ipchksum = ~(ip_chksum(dev));
|
||||||
|
|
||||||
#endif /* CONFIG_NET_IPv6 */
|
|
||||||
|
|
||||||
/* Calculate the ICMP checksum. */
|
/* Calculate the ICMP checksum. */
|
||||||
|
|
||||||
picmp->icmpchksum = 0;
|
picmp->icmpchksum = 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user