net: tftpput: Move ICMP code into its own function
authorSimon Glass <sjg@chromium.org>
Mon, 24 Oct 2011 18:00:00 +0000 (18:00 +0000)
committerWolfgang Denk <wd@denx.de>
Wed, 26 Oct 2011 19:32:59 +0000 (21:32 +0200)
NetReceive() is a very long function with a lot of indent. Before adding
code to the ICMP bit, split it out.

Signed-off-by: Simon Glass <sjg@chromium.org>
net/net.c

index 5e67886b6806d98b7fc000ae8c996d6dfe2003cd..266b9538d8c916b67f660becf356fdd8742de5b9 100644 (file)
--- a/net/net.c
+++ b/net/net.c
@@ -1331,6 +1331,62 @@ static inline IP_t *NetDefragment(IP_t *ip, int *lenp)
 }
 #endif
 
+/**
+ * Receive an ICMP packet. We deal with REDIRECT and PING here, and silently
+ * drop others.
+ *
+ * @parma ip   IP packet containing the ICMP
+ */
+static void receive_icmp(IP_t *ip, int len, IPaddr_t src_ip, Ethernet_t *et)
+{
+       ICMP_t *icmph = (ICMP_t *)&ip->udp_src;
+
+       switch (icmph->type) {
+       case ICMP_REDIRECT:
+               if (icmph->code != ICMP_REDIR_HOST)
+                       return;
+               printf(" ICMP Host Redirect to %pI4 ",
+                       &icmph->un.gateway);
+               break;
+#if defined(CONFIG_CMD_PING)
+       case ICMP_ECHO_REPLY:
+               /*
+                       * IP header OK.  Pass the packet to the
+                       * current handler.
+                       */
+               /*
+                * XXX point to ip packet - should this use
+                * packet_icmp_handler?
+                */
+               (*packetHandler)((uchar *)ip, 0, src_ip, 0, 0);
+               break;
+       case ICMP_ECHO_REQUEST:
+               debug("Got ICMP ECHO REQUEST, return %d bytes\n",
+                       ETHER_HDR_SIZE + len);
+
+               memcpy(&et->et_dest[0], &et->et_src[0], 6);
+               memcpy(&et->et_src[0], NetOurEther, 6);
+
+               ip->ip_sum = 0;
+               ip->ip_off = 0;
+               NetCopyIP((void *)&ip->ip_dst, &ip->ip_src);
+               NetCopyIP((void *)&ip->ip_src, &NetOurIP);
+               ip->ip_sum = ~NetCksum((uchar *)ip,
+                                       IP_HDR_SIZE_NO_UDP >> 1);
+
+               icmph->type = ICMP_ECHO_REPLY;
+               icmph->checksum = 0;
+               icmph->checksum = ~NetCksum((uchar *)icmph,
+                       (len - IP_HDR_SIZE_NO_UDP) >> 1);
+               (void) eth_send((uchar *)et,
+                               ETHER_HDR_SIZE + len);
+               break;
+#endif
+       default:
+               break;
+       }
+}
+
 void
 NetReceive(volatile uchar *inpkt, int len)
 {
@@ -1617,49 +1673,8 @@ NetReceive(volatile uchar *inpkt, int len)
                 * sure if there aren't any other situations.
                 */
                if (ip->ip_p == IPPROTO_ICMP) {
-                       ICMP_t *icmph = (ICMP_t *)&(ip->udp_src);
-
-                       switch (icmph->type) {
-                       case ICMP_REDIRECT:
-                               if (icmph->code != ICMP_REDIR_HOST)
-                                       return;
-                               printf(" ICMP Host Redirect to %pI4 ",
-                                       &icmph->un.gateway);
-                               return;
-#if defined(CONFIG_CMD_PING)
-                       case ICMP_ECHO_REPLY:
-                               /*
-                                * IP header OK.  Pass the packet to the
-                                * current handler.
-                                */
-                               /* XXX point to ip packet */
-                               (*packetHandler)((uchar *)ip, 0, src_ip, 0, 0);
-                               return;
-                       case ICMP_ECHO_REQUEST:
-                               debug("Got ICMP ECHO REQUEST, return %d bytes\n",
-                                     ETHER_HDR_SIZE + len);
-
-                               memcpy(&et->et_dest[0], &et->et_src[0], 6);
-                               memcpy(&et->et_src[0], NetOurEther, 6);
-
-                               ip->ip_sum = 0;
-                               ip->ip_off = 0;
-                               NetCopyIP((void *)&ip->ip_dst, &ip->ip_src);
-                               NetCopyIP((void *)&ip->ip_src, &NetOurIP);
-                               ip->ip_sum = ~NetCksum((uchar *)ip,
-                                                      IP_HDR_SIZE_NO_UDP >> 1);
-
-                               icmph->type = ICMP_ECHO_REPLY;
-                               icmph->checksum = 0;
-                               icmph->checksum = ~NetCksum((uchar *)icmph,
-                                       (len - IP_HDR_SIZE_NO_UDP) >> 1);
-                               (void) eth_send((uchar *)et,
-                                               ETHER_HDR_SIZE + len);
-                               return;
-#endif
-                       default:
-                               return;
-                       }
+                       receive_icmp(ip, len, src_ip, et);
+                       return;
                } else if (ip->ip_p != IPPROTO_UDP) {   /* Only UDP packets */
                        return;
                }