From: robertkaiser Date: Tue, 1 Oct 2002 22:20:41 +0000 (+0000) Subject: one more network code cleanup. Code is now mostly in sync with PPCboot X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=cb5d078822c1cae52fad692a791b505e0ffb46a6;p=users%2Frw%2Farmboot.git one more network code cleanup. Code is now mostly in sync with PPCboot --- diff --git a/CHANGELOG b/CHANGELOG index 20bbab6..110d29b 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,6 +2,11 @@ Recent Modifications ====================================================================== +* Patch by Robert Kaiser : + + - one more network code cleanup. Code is now mostly in sync + with PPCboot + * Patch by Robert Kaiser : - optimzation of kermit protocol loader: "loadb" now works diff --git a/include/net.h b/include/net.h index 2ce2fa7..e87e93a 100644 --- a/include/net.h +++ b/include/net.h @@ -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); diff --git a/net/arp.c b/net/arp.c index e475ace..d814aed 100644 --- 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 */ diff --git a/net/bootp.c b/net/bootp.c index 92f3a8c..f35b72a 100644 --- a/net/bootp.c +++ b/net/bootp.c @@ -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; diff --git a/net/net.c b/net/net.c index 824fd4a..4eac1d6 100644 --- 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), diff --git a/net/rarp.c b/net/rarp.c index 98d0fbc..bcddef0 100644 --- a/net/rarp.c +++ b/net/rarp.c @@ -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++) { diff --git a/net/tftp.c b/net/tftp.c index 12f7916..fee89f3 100644 --- a/net/tftp.c +++ b/net/tftp.c @@ -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) ; } }