net: Refactor to separate the UDP handler from the ARP handler
authorJoe Hershberger <joe.hershberger@ni.com>
Wed, 23 May 2012 07:59:15 +0000 (07:59 +0000)
committerJoe Hershberger <joe.hershberger@ni.com>
Wed, 23 May 2012 22:52:53 +0000 (17:52 -0500)
Call a built-in dummy if none is registered... don't require
protocols to register a handler (eliminating dummies)
NetConsole now uses the ARP handler when waiting on arp
(instead of needing a #define hack in arp.c)
Clear handlers at the end of net loop

Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
Acked-by: Simon Glass <sjg@chromium.org>
drivers/net/netconsole.c
include/net.h
net/arp.c
net/bootp.c
net/cdp.c
net/dns.c
net/net.c
net/nfs.c
net/sntp.c
net/tftp.c

index 28bb955de49aa5beafb17c717c588f780326e6e8..744f4d15ec226c7b7b605cc8c011157a71f2f46a 100644 (file)
@@ -63,12 +63,12 @@ void NcStart(void)
 {
        if (!output_packet_len || memcmp(nc_ether, NetEtherNullAddr, 6)) {
                /* going to check for input packet */
-               NetSetHandler(nc_handler);
+               net_set_udp_handler(nc_handler);
                NetSetTimeout(net_timeout, nc_timeout);
        } else {
                /* send arp request */
                uchar *pkt;
-               NetSetHandler(nc_wait_arp_handler);
+               net_set_arp_handler(nc_wait_arp_handler);
                pkt = (uchar *)NetTxPacket + NetEthHdrSize() + IP_UDP_HDR_SIZE;
                memcpy(pkt, output_packet, output_packet_len);
                NetSendUDPPacket(nc_ether, nc_ip, nc_port, nc_port,
index 8dd407e6cfe132008f7baf948d38ac02203c37a6..09f040f33d66543095039ce5b924e1c6af4650bf 100644 (file)
@@ -460,8 +460,10 @@ extern int NetCksumOk(uchar *, int);       /* Return true if cksum OK */
 extern uint    NetCksum(uchar *, int);         /* Calculate the checksum */
 
 /* Callbacks */
-extern rxhand_f *NetGetHandler(void);          /* Get RX packet handler */
-extern void    NetSetHandler(rxhand_f *);      /* Set RX packet handler */
+extern rxhand_f *net_get_udp_handler(void);    /* Get UDP RX packet handler */
+extern void net_set_udp_handler(rxhand_f *);   /* Set UDP RX packet handler */
+extern rxhand_f *net_get_arp_handler(void);    /* Get ARP RX packet handler */
+extern void net_set_arp_handler(rxhand_f *);   /* Set ARP RX packet handler */
 extern void net_set_icmp_handler(rxhand_icmp_f *f); /* Set ICMP RX handler */
 extern void    NetSetTimeout(ulong, thand_f *);/* Set timeout handler */
 
@@ -487,6 +489,7 @@ static inline void NetSendPacket(uchar *pkt, int len)
 
 /*
  * Transmit UDP packet, performing ARP request if needed
+ *  (ether will be populated)
  *
  * @param ether Raw packet buffer
  * @param dest IP address to send the datagram to
index 997c2abdb35a901b4fca87022bc055b3b28266ec..fcff53602f03e765ee79f0c7ccfb309638ffc3a8 100644 (file)
--- a/net/arp.c
+++ b/net/arp.c
@@ -192,9 +192,9 @@ void ArpReceive(struct ethernet_hdr *et, struct ip_udp_hdr *ip, int len)
                        memcpy(NetArpWaitPacketMAC,
                                &arp->ar_sha, ARP_HLEN);
 
-#ifdef CONFIG_NETCONSOLE
-                       NetGetHandler()(0, 0, 0, 0, 0);
-#endif
+                       net_get_arp_handler()((uchar *)arp, 0, reply_ip_addr,
+                               0, len);
+
                        /* modify header, and transmit it */
                        memcpy(((struct ethernet_hdr *)NetArpWaitTxPacket)->
                                et_dest, NetArpWaitPacketMAC, ARP_HLEN);
index b47205168012748cc0e2a5767a912c54cb338c1b..b36abac818f6ca621953dbd452bdc85f800d0a7c 100644 (file)
@@ -669,9 +669,9 @@ BootpRequest(void)
 
 #if defined(CONFIG_CMD_DHCP)
        dhcp_state = SELECTING;
-       NetSetHandler(DhcpHandler);
+       net_set_udp_handler(DhcpHandler);
 #else
-       NetSetHandler(BootpHandler);
+       net_set_udp_handler(BootpHandler);
 #endif
        NetSendPacket(NetTxPacket, pktlen);
 }
index fa924097ac8750f996c5a80d1719b851f7440593..3d9559eb3b66b67c3214b1f65165e42ae3dc1062 100644 (file)
--- a/net/cdp.c
+++ b/net/cdp.c
@@ -238,13 +238,6 @@ CDPTimeout(void)
                net_set_state(NETLOOP_SUCCESS);
 }
 
-static void
-CDPDummyHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src,
-               unsigned len)
-{
-       /* nothing */
-}
-
 void cdp_receive(const uchar *pkt, unsigned len)
 {
        const uchar *t;
@@ -368,7 +361,6 @@ CDPStart(void)
        CDPApplianceVLAN = htons(-1);
 
        NetSetTimeout(CDP_TIMEOUT, CDPTimeout);
-       NetSetHandler(CDPDummyHandler);
 
        CDPSendTrigger();
 }
index cc0aa0a2dcc936ddf735671f4111ec63d5b060b5..ff9ddffc9d0a1f15e7febf808c5606f69ab48a3d 100644 (file)
--- a/net/dns.c
+++ b/net/dns.c
@@ -200,7 +200,7 @@ DnsStart(void)
        debug("%s\n", __func__);
 
        NetSetTimeout(DNS_TIMEOUT, DnsTimeout);
-       NetSetHandler(DnsHandler);
+       net_set_udp_handler(DnsHandler);
 
        DnsSend();
 }
index 60be9782c93f9ba827b131738a444c9fa2b0385d..72fafd817aad6d07ecdb8ba0eb6475bb6b7882f9 100644 (file)
--- a/net/net.c
+++ b/net/net.c
@@ -178,10 +178,13 @@ uchar PktBuf[(PKTBUFSRX+1) * PKTSIZE_ALIGN + PKTALIGN];
 /* Receive packet */
 uchar *NetRxPackets[PKTBUFSRX];
 
-/* Current RX packet handler */
-static rxhand_f *packetHandler;
+/* Current UDP RX packet handler */
+static rxhand_f *udp_packet_handler;
+/* Current ARP RX packet handler */
+static rxhand_f *arp_packet_handler;
 #ifdef CONFIG_CMD_TFTPPUT
-static rxhand_icmp_f *packet_icmp_handler;     /* Current ICMP rx handler */
+/* Current ICMP rx handler */
+static rxhand_icmp_f *packet_icmp_handler;
 #endif
 /* Current timeout handler */
 static thand_f *timeHandler;
@@ -250,6 +253,18 @@ static void NetInitLoop(enum proto_t protocol)
        return;
 }
 
+static void net_clear_handlers(void)
+{
+       net_set_udp_handler(NULL);
+       net_set_arp_handler(NULL);
+       NetSetTimeout(0, NULL);
+}
+
+static void net_cleanup_loop(void)
+{
+       net_clear_handlers();
+}
+
 /**********************************************************************/
 /*
  *     Main network processing loop.
@@ -257,6 +272,7 @@ static void NetInitLoop(enum proto_t protocol)
 
 int NetLoop(enum proto_t protocol)
 {
+       int     i;
        bd_t *bd = gd->bd;
        int ret = -1;
 
@@ -267,17 +283,15 @@ int NetLoop(enum proto_t protocol)
        NetTryCount = 1;
 
        ArpInit();
+       net_clear_handlers();
 
-       if (!NetTxPacket) {
-               int     i;
-               /*
-                *      Setup packet buffers, aligned correctly.
-                */
-               NetTxPacket = &PktBuf[0] + (PKTALIGN - 1);
-               NetTxPacket -= (ulong)NetTxPacket % PKTALIGN;
-               for (i = 0; i < PKTBUFSRX; i++)
-                       NetRxPackets[i] = NetTxPacket + (i+1)*PKTSIZE_ALIGN;
-       }
+       /*
+        *      Setup packet buffers, aligned correctly.
+        */
+       NetTxPacket = &PktBuf[0] + (PKTALIGN - 1);
+       NetTxPacket -= (ulong)NetTxPacket % PKTALIGN;
+       for (i = 0; i < PKTBUFSRX; i++)
+               NetRxPackets[i] = NetTxPacket + (i+1)*PKTSIZE_ALIGN;
 
        bootstage_mark_name(BOOTSTAGE_ID_ETH_START, "eth_start");
        eth_halt();
@@ -416,6 +430,7 @@ restart:
                 *      Abort if ctrl-c was pressed.
                 */
                if (ctrlc()) {
+                       net_cleanup_loop();
                        eth_halt();
                        puts("\nAbort\n");
                        goto done;
@@ -458,6 +473,7 @@ restart:
                        goto restart;
 
                case NETLOOP_SUCCESS:
+                       net_cleanup_loop();
                        if (NetBootFileXferSize > 0) {
                                char buf[20];
                                printf("Bytes transferred = %ld (%lx hex)\n",
@@ -474,6 +490,7 @@ restart:
                        goto done;
 
                case NETLOOP_FAIL:
+                       net_cleanup_loop();
                        goto done;
 
                case NETLOOP_CONTINUE:
@@ -484,7 +501,7 @@ restart:
 done:
 #ifdef CONFIG_CMD_TFTPPUT
        /* Clear out the handlers */
-       NetSetHandler(NULL);
+       net_set_udp_handler(NULL);
        net_set_icmp_handler(NULL);
 #endif
        return ret;
@@ -498,13 +515,6 @@ startAgainTimeout(void)
        net_set_state(NETLOOP_RESTART);
 }
 
-static void
-startAgainHandler(uchar *pkt, unsigned dest, IPaddr_t sip,
-                 unsigned src, unsigned len)
-{
-       /* Totally ignore the packet */
-}
-
 void NetStartAgain(void)
 {
        char *nretry;
@@ -541,7 +551,7 @@ void NetStartAgain(void)
                NetRestartWrap = 0;
                if (NetDevExists) {
                        NetSetTimeout(10000UL, startAgainTimeout);
-                       NetSetHandler(startAgainHandler);
+                       net_set_udp_handler(NULL);
                } else {
                        net_set_state(NETLOOP_FAIL);
                }
@@ -555,17 +565,36 @@ void NetStartAgain(void)
  *     Miscelaneous bits.
  */
 
-rxhand_f *
-NetGetHandler(void)
+static void dummy_handler(uchar *pkt, unsigned dport,
+                       IPaddr_t sip, unsigned sport,
+                       unsigned len)
 {
-       return packetHandler;
 }
 
+rxhand_f *net_get_udp_handler(void)
+{
+       return udp_packet_handler;
+}
 
-void
-NetSetHandler(rxhand_f *f)
+void net_set_udp_handler(rxhand_f *f)
+{
+       if (f == NULL)
+               udp_packet_handler = dummy_handler;
+       else
+               udp_packet_handler = f;
+}
+
+rxhand_f *net_get_arp_handler(void)
 {
-       packetHandler = f;
+       return arp_packet_handler;
+}
+
+void net_set_arp_handler(rxhand_f *f)
+{
+       if (f == NULL)
+               arp_packet_handler = dummy_handler;
+       else
+               arp_packet_handler = f;
 }
 
 #ifdef CONFIG_CMD_TFTPPUT
@@ -1091,11 +1120,11 @@ NetReceive(uchar *inpkt, int len)
                /*
                 *      IP header OK.  Pass the packet to the current handler.
                 */
-               (*packetHandler)((uchar *)ip + IP_UDP_HDR_SIZE,
-                                       ntohs(ip->udp_dst),
-                                       src_ip,
-                                       ntohs(ip->udp_src),
-                                       ntohs(ip->udp_len) - UDP_HDR_SIZE);
+               (*udp_packet_handler)((uchar *)ip + IP_UDP_HDR_SIZE,
+                               ntohs(ip->udp_dst),
+                               src_ip,
+                               ntohs(ip->udp_src),
+                               ntohs(ip->udp_len) - UDP_HDR_SIZE);
                break;
        }
 }
index db73e93380d9e35ca8935c85a8d839416410088a..5b9976354cc184d8ba7f17e048a7edadfec314ad 100644 (file)
--- a/net/nfs.c
+++ b/net/nfs.c
@@ -735,7 +735,7 @@ NfsStart(void)
                "Loading: *\b", load_addr);
 
        NetSetTimeout(NFS_TIMEOUT, NfsTimeout);
-       NetSetHandler(NfsHandler);
+       net_set_udp_handler(NfsHandler);
 
        NfsTimeoutCount = 0;
        NfsState = STATE_PRCLOOKUP_PROG_MOUNT_REQ;
index 48ce07f18cdb05c5dbd7ffc99eaab9099cf5957b..5de19526e6394b213cd2204d594026d6201a5175 100644 (file)
@@ -85,7 +85,7 @@ SntpStart(void)
        debug("%s\n", __func__);
 
        NetSetTimeout(SNTP_TIMEOUT, SntpTimeout);
-       NetSetHandler(SntpHandler);
+       net_set_udp_handler(SntpHandler);
        memset(NetServerEther, 0, sizeof(NetServerEther));
 
        SntpSend();
index bf32eabe88f2172c731f5b4baeaf6608f6eed029..b2e08b4bfb3d3daba64328c24e84ecbe9afc6970 100644 (file)
@@ -778,7 +778,7 @@ void TftpStart(enum proto_t protocol)
        TftpTimeoutCountMax = TftpRRQTimeoutCountMax;
 
        NetSetTimeout(TftpTimeoutMSecs, TftpTimeout);
-       NetSetHandler(TftpHandler);
+       net_set_udp_handler(TftpHandler);
 #ifdef CONFIG_CMD_TFTPPUT
        net_set_icmp_handler(icmp_handler);
 #endif
@@ -840,7 +840,7 @@ TftpStartServer(void)
 #endif
 
        TftpState = STATE_RECV_WRQ;
-       NetSetHandler(TftpHandler);
+       net_set_udp_handler(TftpHandler);
 }
 #endif /* CONFIG_CMD_TFTPSRV */