]> www.infradead.org Git - users/rw/armboot.git/commitdiff
one more network code cleanup. Code is now mostly in sync with PPCboot
authorrobertkaiser <robertkaiser>
Tue, 1 Oct 2002 22:20:41 +0000 (22:20 +0000)
committerrobertkaiser <robertkaiser>
Tue, 1 Oct 2002 22:20:41 +0000 (22:20 +0000)
CHANGELOG
include/net.h
net/arp.c
net/bootp.c
net/net.c
net/rarp.c
net/tftp.c

index 20bbab6a64dd43ce49ec1831fb005a171ec68183..110d29b33547c2b2e68b25531840ae35f9c0218b 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -2,6 +2,11 @@
 Recent Modifications
 ======================================================================
 
+* Patch by Robert Kaiser <rob@sysgo.de>:
+
+  - one more network code cleanup. Code is now mostly in sync
+    with PPCboot
+
 * Patch by Robert Kaiser <rob@sysgo.de>:
 
   - optimzation of kermit protocol loader: "loadb" now works
index 2ce2fa72b20d4b0e451c31d9a44a8ace4568ad93..e87e93a6c515ec08fba3caa60d5e7a09da8b13e4 100644 (file)
@@ -235,17 +235,57 @@ extern void       NetStop(void);
 /* Load failed.         Start again. */
 extern void    NetStartAgain(void);
 
+/*
+ * The following functions are a bit ugly, but necessary to deal with
+ * alignment restrictions on ARM.
+ *
+ * We're using inline functions, which had the smallest memory
+ * footprint in our tests.
+ */
 /* Copy ethernet address */
-extern void    NetCopyEther(volatile uchar *, uchar *);
+static inline void     NetCopyEther(volatile uchar *to, uchar *from)
+{
+       memcpy((void*)to, (void*)from, 6);
+}
 
-/* Write IP address to network data structure (outgoing traffic) */
-extern void    NetWriteIP(volatile uchar * to, IPaddr_t ip);
+static inline int NetCmpEther(uchar *a, uchar *b)
+{
+       return(memcmp((void*)a, (void*)b, 6));
+}
 
-/* Read IP address from network data structure (incoming traffic) */
-extern IPaddr_t        NetReadIP(volatile uchar * to);
+/* return IP *in network byteorder* */
+static inline IPaddr_t NetReadIP(IPaddr_t *from)
+{
+    IPaddr_t ip;
+    memcpy((void*)&ip, (void*)from, sizeof(ip));
+    return ip;
+}
 
-/* Copy IP address from one location to another */
-extern void    NetCopyIP(volatile uchar * to, volatile uchar *from);
+/* write IP *in network byteorder* */
+static inline void NetWriteIP(IPaddr_t *to, IPaddr_t ip)
+{
+    memcpy((void*)to, (void*)&ip, sizeof(ip));
+}
+
+/* copy IP */
+static inline void NetCopyIP(volatile IPaddr_t *to, IPaddr_t *from)
+{
+    memcpy((void*)to, (void*)from, sizeof(IPaddr_t));
+}
+
+/* return ulong *in network byteorder* */
+static inline ulong NetReadLong(ulong *from)
+{
+    ulong l;
+    memcpy((void*)&l, (void*)from, sizeof(l));
+    return l;
+}
+
+/* copy ulong */
+static inline void NetCopyLong(ulong *to, ulong *from)
+{
+    memcpy((void*)to, (void*)from, sizeof(ulong));
+}
 
 /* Set ethernet header */
 extern void    NetSetEther(volatile uchar *, uchar *, uint);
index e475aceaa9489c52a4cf3b4ed20c82cc75635441..d814aed2f3c0b0d08ca6e3e306087e871f396be8 100644 (file)
--- a/net/arp.c
+++ b/net/arp.c
@@ -43,10 +43,13 @@ int ArpTry = 0;
 static void
 ArpHandler(uchar *pkt, unsigned dest, unsigned src, unsigned len)
 {
+       /* Check if the frame is really an ARP reply */
+       if (NetCmpEther(NetServerEther, NetBcastAddr) != 0) {
 #ifdef DEBUG
-       printf("Got good ARP - start TFTP\n");
+               printf("Got good ARP - start TFTP\n");
 #endif
-       TftpStart ();
+               TftpStart ();
+       }
 }
 
 
@@ -81,12 +84,12 @@ ArpRequest (void)
        arp->ar_pln = 4;
        arp->ar_op  = htons(ARPOP_REQUEST);
 
-       NetCopyEther(&arp->ar_data[0], NetOurEther);    /* source ET addr       */
-       NetWriteIP((uchar*)&arp->ar_data[6], NetOurIP);   /* source IP addr     */
+       NetCopyEther(&arp->ar_data[0], NetOurEther);            /*source ET addr        */
+       NetWriteIP((IPaddr_t*)&arp->ar_data[6], NetOurIP);      /* source IP addr       */
        for (i=10; i<16; ++i) {
                arp->ar_data[i] = 0;                    /* dest ET addr = 0     */
        }
-       NetWriteIP((uchar*)&arp->ar_data[16],           /* dest IP addr         */
+       NetWriteIP((IPaddr_t*)&arp->ar_data[16],        /* dest IP addr         */
                   NetOurGatewayIP ? NetOurGatewayIP    /* => Gateway           */
                                   : NetServerIP);      /* => TFTP server       */
 
index 92f3a8c1b391bdaf69710783995b53112c8656cb..f35b72ae15eba8a53ce70e2417f3df564de0c4c6 100644 (file)
@@ -56,13 +56,13 @@ static void DhcpHandler(uchar * pkt, unsigned dest, unsigned src, unsigned len);
 char *dhcpmsg2str(int type)
 {
        switch (type) {
-       case 1: return "DHCPDISCOVER"; break;
-       case 2: return "DHCPOFFER"; break;
-       case 3: return "DHCPREQUEST"; break;
-       case 4: return "DHCPDECLINE"; break;
-       case 5: return "DHCPACK"; break;
-       case 6: return "DHCPNACK"; break;
-       case 7: return "DHCPRELEASE"; break;
+       case 1:  return "DHCPDISCOVER"; break;
+       case 2:  return "DHCPOFFER";    break;
+       case 3:  return "DHCPREQUEST";  break;
+       case 4:  return "DHCPDECLINE";  break;
+       case 5:  return "DHCPACK";      break;
+       case 6:  return "DHCPNACK";     break;
+       case 7:  return "DHCPRELEASE";  break;
        default: return "UNKNOWN/INVALID MSG TYPE"; break;
        }
 }
@@ -72,12 +72,9 @@ static int BootpCheckPkt(uchar *pkt, unsigned dest, unsigned src, unsigned len)
 {
        Bootp_t *bp = (Bootp_t *) pkt;
        int retval = 0;
-       ulong id;
 
        if (dest != PORT_BOOTPC || src != PORT_BOOTPS)
                retval = -1;
-       /* note: use "else if" instead of "if" or the debug message
-          below shows a wrong retval */
        else if (len < sizeof (Bootp_t) - OPT_SIZE)
                retval = -2;
        else if (bp->bp_op != OP_BOOTREQUEST &&
@@ -91,13 +88,10 @@ static int BootpCheckPkt(uchar *pkt, unsigned dest, unsigned src, unsigned len)
                retval = -4;
        else if (bp->bp_hlen != HWL_ETHER)
                retval = -5;
-       else
-       {
-               memcpy(&id, &bp->bp_id, sizeof(id));
-               id = ntohl(id);
-               if (id != BootpID)
-                       retval = -6;
+       else if (NetReadLong((ulong*)&bp->bp_id) != BootpID) {
+               retval = -6;
        }
+
        debug ("Filtering pkt = %d\n", retval);
 
        return retval;
@@ -108,15 +102,20 @@ static int BootpCheckPkt(uchar *pkt, unsigned dest, unsigned src, unsigned len)
  */
 void BootpCopyNetParams(Bootp_t *bp)
 {
-       NetOurIP = NetReadIP((vuchar*)&bp->bp_yiaddr);
-       NetServerIP = NetReadIP((vuchar*)&bp->bp_siaddr);
+       NetCopyIP(&NetOurIP, &bp->bp_yiaddr);
+       NetCopyIP(&NetServerIP, &bp->bp_siaddr);
        NetCopyEther(NetServerEther, ((Ethernet_t *)NetRxPkt)->et_src);
        copy_filename (BootFile, bp->bp_file, sizeof(BootFile));
 
        debug ("Bootfile: %s\n", BootFile);
 
-       /* Propagate to environment */
-       setenv (Net_bd, "bootfile", BootFile);
+       /* Propagate to environment
+        * don't delete exising entry when BOOTP / DHCP reply does
+        * not contain a new value
+        */
+       if (*BootFile) {
+               setenv (Net_bd, "bootfile", BootFile);
+       }
 }
 
 static int truncate_sz (const char *name, int maxlen, int curlen)
@@ -143,14 +142,14 @@ static void BootpVendorFieldProcess(u8 *ext)
     /* Fixed length fields */
        case 1:         /* Subnet mask                                  */
                if (NetOurSubnetMask == 0)
-                       NetOurSubnetMask = NetReadIP(ext+2);
+                       NetCopyIP(&NetOurSubnetMask, (IPaddr_t*)(ext+2));
                break;
        case 2:         /* Time offset - Not yet supported              */
                break;
     /* Variable length fields */
        case 3:         /* Gateways list                                */
                if (NetOurGatewayIP == 0) {
-                   NetOurGatewayIP = NetReadIP(ext+2);
+                       NetCopyIP(&NetOurGatewayIP, (IPaddr_t*)(ext+2));
                }
                break;
        case 4:         /* Time server - Not yet supported              */
@@ -159,7 +158,7 @@ static void BootpVendorFieldProcess(u8 *ext)
                break;
        case 6:
                if (NetOurDNSIP == 0) {
-                   NetOurDNSIP = NetReadIP(ext+2);
+                       NetCopyIP(&NetOurDNSIP, (IPaddr_t*)(ext+2));
                }
                break;
        case 7:         /* Log server - Not yet supported               */
@@ -180,9 +179,9 @@ static void BootpVendorFieldProcess(u8 *ext)
                }
                break;
        case 13:        /* Boot file size                               */
-               if(size == 2)
+               if (size == 2)
                        NetBootFileSize = ntohs(*(ushort*)(ext+2));
-               else if(size == 4)
+               else if (size == 4)
                        NetBootFileSize = ntohl(*(ulong*)(ext+2));
                break;
        case 14:        /* Merit dump file - Not yet supported          */
@@ -273,9 +272,6 @@ static void BootpVendorProcess(u8 *ext, int size)
         printf("NetOurNISDomain : %s\n", NetOurNISDomain);
     }
 
-       if (NetBootFileSize) {
-        printf("NetBootFileSize: %d\n", NetBootFileSize);
-    }
 #endif
 }
 
@@ -287,7 +283,6 @@ BootpHandler(uchar * pkt, unsigned dest, unsigned src, unsigned len)
 {
        Bootp_t *bp;
        char    *s;
-       ulong vendmagic;
 
        debug ("got BOOTP packet (src=%d, dst=%d, len=%d want_len=%d)\n",
                src, dest, len, sizeof (Bootp_t));
@@ -306,10 +301,9 @@ BootpHandler(uchar * pkt, unsigned dest, unsigned src, unsigned len)
 
        BootpCopyNetParams(bp);         /* Store net parameters from reply */
 
-       /* Retrieve extended informations (we must parse the vendor area) */
-       memcpy(&vendmagic, bp->bp_vend, sizeof(vendmagic));
-       if (ntohl(vendmagic) == BOOTP_VENDOR_MAGIC)
-           BootpVendorProcess(&bp->bp_vend[4], len);
+       /* Retrieve extended information (we must parse the vendor area) */
+       if (NetReadLong((ulong*)&bp->bp_vend[0]) == htonl(BOOTP_VENDOR_MAGIC))
+               BootpVendorProcess(&bp->bp_vend[4], len);
 
        NetSetTimeout(0, (thand_f *)0);
 
@@ -364,21 +358,25 @@ static int DhcpExtended(u8 *e, int message_type, IPaddr_t ServerID, IPaddr_t Req
     *e++ = (576-312+OPT_SIZE) & 0xff;
 
     if ( ServerID ) {
+           int tmp = ntohl(ServerID);
+
            *e++ = 54;  /* ServerID */
            *e++ = 4;
-           *e++ = ServerID >> 24;
-           *e++ = ServerID >> 16;
-           *e++ = ServerID >> 8;
-           *e++ = ServerID & 0xff;
+           *e++ = tmp >> 24;
+           *e++ = tmp >> 16;
+           *e++ = tmp >> 8;
+           *e++ = tmp & 0xff;
     }
 
     if ( RequestedIP ) {
+           int tmp = ntohl(RequestedIP);
+
            *e++ = 50;  /* Requested IP */
            *e++ = 4;
-           *e++ = RequestedIP >> 24;
-           *e++ = RequestedIP >> 16;
-           *e++ = RequestedIP >> 8;
-           *e++ = RequestedIP & 0xff;
+           *e++ = tmp >> 24;
+           *e++ = tmp >> 16;
+           *e++ = tmp >> 8;
+           *e++ = tmp & 0xff;
     }
 
     *e++ = 55;         /* Parameter Request List */
@@ -412,7 +410,6 @@ static int DhcpExtended(u8 *e, int message_type, IPaddr_t ServerID, IPaddr_t Req
     *e++ = 40;         /* NIS Domain name request */
     *cnt += 1;
 #endif
-
     *e++ = 255;                /* End of the list */
 
     return e - start ;
@@ -496,7 +493,6 @@ BootpRequest (void)
        volatile uchar *pkt, *iphdr;
        Bootp_t *bp;
        int ext_len, pktlen, iplen;
-       ulong id;
 
 #if (CONFIG_COMMANDS & CFG_CMD_DHCP)
        dhcp_state = INIT;
@@ -515,7 +511,7 @@ BootpRequest (void)
         * set in packet header after extension length has been determined.
         * C. Hallinan, DS4.COM, Inc.
         */
-       /* NetSetIP(pkt, 0xffffffffL, PORT_BOOTPS, PORT_BOOTPC, sizeof (Bootp_t)); */
+       /* NetSetIP(pkt, 0xFFFFFFFFL, PORT_BOOTPS, PORT_BOOTPC, sizeof (Bootp_t)); */
        iphdr = pkt;    /* We need this later for NetSetIP() */
        pkt += IP_HDR_SIZE;
 
@@ -524,11 +520,11 @@ BootpRequest (void)
        bp->bp_htype = HWT_ETHER;
        bp->bp_hlen = HWL_ETHER;
        bp->bp_hops = 0;
-       bp->bp_secs = htons( get_timer(0) / CFG_HZ);
-       NetWriteIP((vuchar*)&bp->bp_ciaddr, 0);
-       NetWriteIP((vuchar*)&bp->bp_yiaddr, 0);
-       NetWriteIP((vuchar*)&bp->bp_siaddr, 0);
-       NetWriteIP((vuchar*)&bp->bp_giaddr, 0);
+       bp->bp_secs = htons(get_timer(0) / CFG_HZ);
+       NetWriteIP(&bp->bp_ciaddr, 0);
+       NetWriteIP(&bp->bp_yiaddr, 0);
+       NetWriteIP(&bp->bp_siaddr, 0);
+       NetWriteIP(&bp->bp_giaddr, 0);
        NetCopyEther(bp->bp_chaddr, NetOurEther);
        copy_filename (bp->bp_file, BootFile, sizeof(bp->bp_file));
 
@@ -548,9 +544,8 @@ BootpRequest (void)
                | ((ulong)NetOurEther[4] << 8)
                | (ulong)NetOurEther[5];
        BootpID += get_timer(0);
-
-       id = htonl(BootpID);
-       memcpy(&bp->bp_id, &id, sizeof(id));
+       BootpID  = htonl(BootpID);
+       NetCopyLong(&bp->bp_id, &BootpID);
 
        /*
         * Calculate proper packet lengths taking into account the
@@ -558,7 +553,7 @@ BootpRequest (void)
         */
        pktlen = BOOTP_SIZE - sizeof(bp->bp_vend) + ext_len;
        iplen = BOOTP_HDR_SIZE - sizeof(bp->bp_vend) + ext_len;
-       NetSetIP(iphdr, 0xffffffffL, PORT_BOOTPS, PORT_BOOTPC, iplen);
+       NetSetIP(iphdr, 0xFFFFFFFFL, PORT_BOOTPS, PORT_BOOTPC, iplen);
        NetSetTimeout(SELECT_TIMEOUT * CFG_HZ, BootpTimeout);
 
 #if (CONFIG_COMMANDS & CFG_CMD_DHCP)
@@ -580,13 +575,13 @@ void DhcpOptionsProcess(char *popt)
                oplen = *(popt + 1);
                switch(*popt) {
                        case  1:
-                               NetOurSubnetMask = *(IPaddr_t *)(popt + 2);
+                               NetCopyIP(&NetOurSubnetMask, (popt+2));
                                break;
                        case  3:
-                               NetOurGatewayIP = *(IPaddr_t *)(popt + 2);
+                               NetCopyIP(&NetOurGatewayIP, (popt+2));
                                break;
                        case  6:
-                               NetOurDNSIP = *(IPaddr_t *)(popt +2);
+                               NetCopyIP(&NetOurDNSIP, (popt+2));
                                break;
                        case 12:
                                size = truncate_sz ("Host Name",
@@ -610,7 +605,7 @@ void DhcpOptionsProcess(char *popt)
                        case 53:                /* Ignore Message Type Option */
                                break;
                        case 54:
-                               NetServerIP = *(IPaddr_t *)(popt+2);
+                               NetCopyIP(&NetServerIP, (popt+2));
                                break;
                        case 58:                /* Ignore Renewal Time Option */
                                break;
@@ -627,9 +622,7 @@ void DhcpOptionsProcess(char *popt)
 
 static int DhcpMessageType(unsigned char *popt)
 {
-       ulong vendmagic;
-       memcpy(&vendmagic, popt, sizeof(vendmagic));
-       if (ntohl(vendmagic) != BOOTP_VENDOR_MAGIC)
+       if (NetReadLong((ulong*)popt) != htonl(BOOTP_VENDOR_MAGIC))
                return -1;
 
        popt += 4;
@@ -662,18 +655,18 @@ void DhcpSendRequestPkt(Bootp_t *bp_offer)
        bp->bp_htype = HWT_ETHER;
        bp->bp_hlen = HWL_ETHER;
        bp->bp_hops = 0;
-       bp->bp_secs = htons( get_timer(0) / CFG_HZ);
-       NetCopyIP((vuchar*)&bp->bp_ciaddr, (vuchar*)&bp_offer->bp_ciaddr);
-       NetCopyIP((vuchar*)&bp->bp_yiaddr, (vuchar*)&bp_offer->bp_yiaddr);
-       NetCopyIP((vuchar*)&bp->bp_siaddr, (vuchar*)&bp_offer->bp_siaddr);
-       NetCopyIP((vuchar*)&bp->bp_giaddr, (vuchar*)&bp_offer->bp_giaddr);
+       bp->bp_secs = htons(get_timer(0) / CFG_HZ);
+       NetCopyIP(&bp->bp_ciaddr, &bp_offer->bp_ciaddr); /* both in network byte order */
+       NetCopyIP(&bp->bp_yiaddr, &bp_offer->bp_yiaddr);
+       NetCopyIP(&bp->bp_siaddr, &bp_offer->bp_siaddr);
+       NetCopyIP(&bp->bp_giaddr, &bp_offer->bp_giaddr);
        NetCopyEther(bp->bp_chaddr, NetOurEther);
 
        /*
         * ID is the id of the OFFER packet
         */
 
-       memcpy(&bp->bp_id, &bp_offer->bp_id, sizeof(bp->bp_id));
+       NetCopyLong(&bp->bp_id, &bp_offer->bp_id);
 
        /*
         * Copy options from OFFER packet if present
@@ -682,7 +675,7 @@ void DhcpSendRequestPkt(Bootp_t *bp_offer)
 
        pktlen = BOOTP_SIZE - sizeof(bp->bp_vend) + extlen;
        iplen = BOOTP_HDR_SIZE - sizeof(bp->bp_vend) + extlen;
-       NetSetIP(iphdr, 0xffffffffL, PORT_BOOTPS, PORT_BOOTPC, iplen);
+       NetSetIP(iphdr, 0xFFFFFFFFL, PORT_BOOTPS, PORT_BOOTPC, iplen);
 
        debug ("Transmitting DHCPREQUEST packet: len = %d\n", pktlen);
        NetSendPacket(NetTxPacket, pktlen);
@@ -694,7 +687,6 @@ void DhcpSendRequestPkt(Bootp_t *bp_offer)
 static void
 DhcpHandler(uchar * pkt, unsigned dest, unsigned src, unsigned len)
 {
-       ulong vendmagic;
        Bootp_t *bp = (Bootp_t *)pkt;
 
        debug ("DHCPHandler: got packet: (src=%d, dst=%d, len=%d) state: %d\n",
@@ -724,8 +716,7 @@ DhcpHandler(uchar * pkt, unsigned dest, unsigned src, unsigned len)
                        debug ("TRANSITIONING TO REQUESTING STATE\n");
                        dhcp_state = REQUESTING;
 #if 0
-                       memcpy(&vendmagic, bp->bp_vend, sizeof(vendmagic));
-                       if (ntohl(vendmagic) == BOOTP_VENDOR_MAGIC)
+                       if (NetReadLong((ulong*)&bp->bp_vend[0]) == htonl(BOOTP_VENDOR_MAGIC))
                                DhcpOptionsProcess(&bp->bp_vend[4]);
 
 #endif
@@ -743,8 +734,8 @@ DhcpHandler(uchar * pkt, unsigned dest, unsigned src, unsigned len)
                debug ("DHCP State: REQUESTING\n");
 
                if ( DhcpMessageType(bp->bp_vend) == DHCP_ACK ) {
-                       memcpy(&vendmagic, bp->bp_vend, sizeof(vendmagic));
-                       if (ntohl(vendmagic) == BOOTP_VENDOR_MAGIC)
+
+                       if (NetReadLong((ulong*)&bp->bp_vend[0]) == htonl(BOOTP_VENDOR_MAGIC))
                                DhcpOptionsProcess(&bp->bp_vend[4]);
                        BootpCopyNetParams(bp); /* Store net params from reply */
                        dhcp_state = BOUND;
index 824fd4a89f0f75141b48739e27ff60affd8f8073..4eac1d6c01bad9c35e0654958f652076423f26f4 100644 (file)
--- a/net/net.c
+++ b/net/net.c
@@ -162,7 +162,7 @@ restart:
         */
 
        if (protocol == TFTP) {                 /* TFTP */
-               NetOurIP = bis->bi_ip_addr;
+               NetCopyIP(&NetOurIP, (IPaddr_t*)&bis->bi_ip_addr);
                NetServerIP = 0;
                s = getenv (bis, "serverip");
                for (reg=0; reg<4; ++reg) {
@@ -335,6 +335,7 @@ NetReceive(volatile uchar * pkt, int len)
        Ethernet_t *et;
        IP_t    *ip;
        ARP_t   *arp;
+       IPaddr_t tmp;
        int     x;
 
        NetRxPkt = pkt;
@@ -403,14 +404,11 @@ NetReceive(volatile uchar * pkt, int len)
                }
 
                
-               {
-                       IPaddr_t ip = NetReadIP((uchar*)&arp->ar_data[16]);
-                       if (ip != NetOurIP) {
+               if (NetReadIP((IPaddr_t*)&arp->ar_data[16]) != NetOurIP) {
 #ifdef ET_DEBUG
-                               printf("Requested IP is not ours\n");
+                       printf("Requested IP is not ours\n");
 #endif                 
-                               return;
-                       }
+                       return;
                }
 
                switch (ntohs(arp->ar_op)) {
@@ -420,10 +418,10 @@ NetReceive(volatile uchar * pkt, int len)
 #endif
                        NetSetEther((uchar *)et, et->et_src, PROT_ARP);
                        arp->ar_op = htons(ARPOP_REPLY);
-                       NetCopyEther(&arp->ar_data[0],  NetOurEther);
-                       NetWriteIP(  &arp->ar_data[6],  NetOurIP);
-                       NetCopyEther(&arp->ar_data[10], NetOurEther);
-                       NetWriteIP(  &arp->ar_data[16], NetOurIP);
+                       NetCopyEther(&arp->ar_data[10], &arp->ar_data[0]);
+                       NetCopyIP((IPaddr_t*)&arp->ar_data[16], (IPaddr_t*)&arp->ar_data[6]);
+                       NetCopyEther(&arp->ar_data[ 0], NetOurEther);
+                       NetCopyIP((IPaddr_t*)&arp->ar_data[ 6], &NetOurIP);
                        NetSendPacket((uchar *)et,((uchar *)arp-pkt)+ARP_HDR_SIZE);
                        return;
                case ARPOP_REPLY:               /* set TFTP server eth addr     */
@@ -431,7 +429,7 @@ NetReceive(volatile uchar * pkt, int len)
                        printf("Got ARP REPLY, set server/gtwy eth addr\n");
 #endif
                        /* check if target ether is ours */
-                       if ( memcmp(NetOurEther, &(arp->ar_data[10]), 6) != 0 )
+                       if ( NetCmpEther(NetOurEther, &(arp->ar_data[10])) != 0 )
                        {
 #ifdef ET_DEBUG
                                printf("  Reply is not for us. Ignoring it...\n");
@@ -467,9 +465,9 @@ NetReceive(volatile uchar * pkt, int len)
 
                        printf("invalid RARP header\n");
                } else {
-                       NetOurIP = NetReadIP((uchar*)&arp->ar_data[16]);
-                       NetServerIP = NetReadIP((uchar*)&arp->ar_data[6]);
-                       NetCopyEther(NetServerEther, &arp->ar_data[0]);
+                       NetCopyIP(&NetOurIP,    (IPaddr_t*)&arp->ar_data[16]);
+                       NetCopyIP(&NetServerIP, (IPaddr_t*)&arp->ar_data[ 6]);
+                       NetCopyEther(NetServerEther,       &arp->ar_data[ 0]);
 
                        (*packetHandler)(0,0,0,0);
                }
@@ -503,16 +501,13 @@ NetReceive(volatile uchar * pkt, int len)
                        printf("checksum bad\n");
                        return;
                }
-               if (NetOurIP) {
-                   IPaddr_t ipaddr = NetReadIP((uchar*)&ip->ip_dst);
-                   if (ipaddr != NetOurIP && ipaddr != 0xFFFFFFFF)
-                   {
+               tmp = NetReadIP((IPaddr_t*)&ip->ip_dst);
+               if (NetOurIP && tmp != NetOurIP && tmp != 0xFFFFFFFF) {
 #ifdef ET_DEBUG
                        printf("ip packet not for us\n");
-                       print_IPaddr(ipaddr);
+                       print_IPaddr(tmp);
 #endif
                        return;
-                   }
                }
                /*
                 * watch for ICMP host redirects
@@ -585,7 +580,7 @@ static int net_check_prereq (proto_t protocol)
        case DHCP:
        case RARP:
        case BOOTP:
-                       if (memcmp(NetOurEther, "\0\0\0\0\0\0", 6) == 0) {
+                       if (NetCmpEther(NetOurEther, "\0\0\0\0\0\0") == 0) {
                                puts ("*** ERROR: `ethaddr' not set\n");
                                return (1);
                        }
@@ -616,48 +611,6 @@ NetCksum(uchar * ptr, int len)
 }
 
 
-void
-NetCopyEther(volatile uchar * to, uchar * from)
-{
-       int     i;
-
-       for (i = 0; i < 6; i++)
-               *to++ = *from++;
-}
-
-void
-NetWriteIP(volatile uchar * to, IPaddr_t ip)
-{
-       int     i;
-
-       for (i = 0; i < 4; i++) 
-       {
-               *to++ = ip >> 24;
-               ip <<= 8;
-       }
-}
-
-IPaddr_t
-NetReadIP(volatile uchar * from)
-{
-       IPaddr_t ip;
-       int i;
-
-       ip = 0;
-       for (i = 0; i < 4; i++) 
-               ip = (ip << 8) | *from++;
-
-       return ip;
-}
-
-void
-NetCopyIP(volatile uchar * to, volatile uchar *from)
-{
-       int i;
-       for (i = 0; i < 4; i++) 
-               *to++ = *from++;
-}
-
 void
 NetSetEther(volatile uchar * xet, uchar * addr, uint prot)
 {
@@ -694,8 +647,8 @@ NetSetIP(volatile uchar * xip, IPaddr_t dest, int dport, int sport, int len)
        ip->ip_ttl   = 255;
        ip->ip_p     = 17;              /* UDP */
        ip->ip_sum   = 0;
-       NetWriteIP((uchar*)&ip->ip_src, NetOurIP);
-       NetWriteIP((uchar*)&ip->ip_dst, dest);
+       NetCopyIP(&ip->ip_src, &NetOurIP);      /* already in network byte order */
+       NetCopyIP(&ip->ip_dst, &dest);          /* - "" - */
        ip->udp_src  = htons(sport);
        ip->udp_dst  = htons(dport);
        ip->udp_len  = htons(8 + len);
@@ -720,6 +673,7 @@ void copy_filename (uchar *dst, uchar *src, int size)
 
 void ip_to_string (IPaddr_t x, char *s)
 {
+       x = ntohl(x);
     sprintf (s,"%d.%d.%d.%d",
        (int)((x >> 24) & 0xff),
        (int)((x >> 16) & 0xff),
index 98d0fbc888f083f3550731e6a5e3ac28a02d859f..bcddef075cdd86a14131df876596b54366624e0d 100644 (file)
@@ -79,7 +79,7 @@ RarpRequest (void)
        rarp->ar_pln = 4;
        rarp->ar_op  = RARPOP_REQUEST;
        NetCopyEther(&rarp->ar_data[0], NetOurEther);   /* source ET addr */
-       *(IPaddr_t *)(&rarp->ar_data[6]) = SWAP32(NetOurIP);    /* source IP addr */
+       NetCopyIP((IPaddr_t*)&rarp->ar_data[6], &NetOurIP);             /* source IP addr */
        NetCopyEther(&rarp->ar_data[10], NetOurEther);  /* dest ET addr = source ET addr ??*/
        /* dest. IP addr set to broadcast */
        for (i = 0; i <= 3; i++) {
index 12f7916f8a66b1db187d639e71d2d4f1e78df829..fee89f3b15c7b2a5f898244c9cf1a6f9bd15a605 100644 (file)
@@ -120,7 +120,7 @@ TftpSend (void)
 static void
 TftpHandler (uchar * pkt, unsigned dest, unsigned src, unsigned len)
 {
-       ushort proto;
+       ushort proto;
        if (dest != TftpOurPort) {
                return;
        }
@@ -133,10 +133,9 @@ TftpHandler (uchar * pkt, unsigned dest, unsigned src, unsigned len)
        }
        len -= 2;
 
-       /* warning: don't use increment (++) in ntohs() macros!! */
-        proto = *((ushort *)pkt)++;
-       proto = ntohs(proto);
-       switch (proto) {
+       /* warning: don't use increment (++) in ntohs() macros!! */
+       proto = *((ushort *)pkt)++;
+       switch (ntohs(proto)) {
 
        case TFTP_RRQ:
        case TFTP_WRQ:
@@ -234,11 +233,13 @@ TftpStart (void)
 #endif /* DEBUG */
 
        if (BootFile[0] == '\0') {
+               IPaddr_t OurIP = ntohl(NetOurIP);
+
                sprintf(default_filename, "%02lX%02lX%02lX%02lX.img",
-                       NetOurIP & 0xFF,
-                       (NetOurIP >>  8) & 0xFF,
-                       (NetOurIP >> 16) & 0xFF,
-                       (NetOurIP >> 24) & 0xFF );
+                       OurIP & 0xFF,
+                       (OurIP >>  8) & 0xFF,
+                       (OurIP >> 16) & 0xFF,
+                       (OurIP >> 24) & 0xFF    );
                tftp_filename = default_filename;
 
                printf ("*** Warning: no boot file name; using '%s'\n",
@@ -256,7 +257,7 @@ TftpStart (void)
            IPaddr_t ServerNet  = NetServerIP & NetOurSubnetMask;
 
            if (OurNet != ServerNet) {
-               puts ("; sending throught gateway ");
+               puts ("; sending through gateway ");
                print_IPaddr (NetOurGatewayIP) ;
            }
        }