diff options
Diffstat (limited to 'net/net.c')
-rw-r--r-- | net/net.c | 209 |
1 files changed, 13 insertions, 196 deletions
@@ -79,6 +79,7 @@ #include <command.h> #include <linux/compiler.h> #include <net.h> +#include "arp.h" #include "bootp.h" #include "tftp.h" #ifdef CONFIG_CMD_RARP @@ -99,20 +100,6 @@ DECLARE_GLOBAL_DATA_PTR; -#ifndef CONFIG_ARP_TIMEOUT -/* Milliseconds before trying ARP again */ -# define ARP_TIMEOUT 5000UL -#else -# define ARP_TIMEOUT CONFIG_ARP_TIMEOUT -#endif - - -#ifndef CONFIG_NET_RETRY_COUNT -# define ARP_TIMEOUT_COUNT 5 /* # of timeouts before giving up */ -#else -# define ARP_TIMEOUT_COUNT CONFIG_NET_RETRY_COUNT -#endif - /** BOOTP EXTENTIONS **/ /* Our subnet mask (0=unknown) */ @@ -219,82 +206,6 @@ static int NetTryCount; /**********************************************************************/ -IPaddr_t NetArpWaitPacketIP; -IPaddr_t NetArpWaitReplyIP; -/* MAC address of waiting packet's destination */ -uchar *NetArpWaitPacketMAC; -/* THE transmit packet */ -uchar *NetArpWaitTxPacket; -int NetArpWaitTxPacketSize; -uchar NetArpWaitPacketBuf[PKTSIZE_ALIGN + PKTALIGN]; -ulong NetArpWaitTimerStart; -int NetArpWaitTry; - -void ArpRequest(void) -{ - uchar *pkt; - ARP_t *arp; - - debug("ARP broadcast %d\n", NetArpWaitTry); - - pkt = NetTxPacket; - - pkt += NetSetEther(pkt, NetBcastAddr, PROT_ARP); - - arp = (ARP_t *) pkt; - - arp->ar_hrd = htons(ARP_ETHER); - arp->ar_pro = htons(PROT_IP); - arp->ar_hln = 6; - arp->ar_pln = 4; - arp->ar_op = htons(ARPOP_REQUEST); - - /* source ET addr */ - memcpy(&arp->ar_data[0], NetOurEther, 6); - /* source IP addr */ - NetWriteIP((uchar *) &arp->ar_data[6], NetOurIP); - /* dest ET addr = 0 */ - memset(&arp->ar_data[10], '\0', 6); - if ((NetArpWaitPacketIP & NetOurSubnetMask) != - (NetOurIP & NetOurSubnetMask)) { - if (NetOurGatewayIP == 0) { - puts("## Warning: gatewayip needed but not set\n"); - NetArpWaitReplyIP = NetArpWaitPacketIP; - } else { - NetArpWaitReplyIP = NetOurGatewayIP; - } - } else { - NetArpWaitReplyIP = NetArpWaitPacketIP; - } - - NetWriteIP((uchar *) &arp->ar_data[16], NetArpWaitReplyIP); - (void) eth_send(NetTxPacket, (pkt - NetTxPacket) + ARP_HDR_SIZE); -} - -void ArpTimeoutCheck(void) -{ - ulong t; - - if (!NetArpWaitPacketIP) - return; - - t = get_timer(0); - - /* check for arp timeout */ - if ((t - NetArpWaitTimerStart) > ARP_TIMEOUT) { - NetArpWaitTry++; - - if (NetArpWaitTry >= ARP_TIMEOUT_COUNT) { - puts("\nARP Retry count exceeded; starting again\n"); - NetArpWaitTry = 0; - NetStartAgain(); - } else { - NetArpWaitTimerStart = t; - ArpRequest(); - } - } -} - /* * Check if autoload is enabled. If so, use either NFS or TFTP to download * the boot file. @@ -360,15 +271,11 @@ int NetLoop(enum proto_t protocol) NetRestarted = 0; NetDevExists = 0; - /* XXX problem with bss workaround */ - NetArpWaitPacketMAC = NULL; - NetArpWaitTxPacket = NULL; - NetArpWaitPacketIP = 0; - NetArpWaitReplyIP = 0; - NetArpWaitTxPacket = NULL; NetTxPacket = NULL; NetTryCount = 1; + ArpInit(); + if (!NetTxPacket) { int i; /* @@ -380,12 +287,6 @@ int NetLoop(enum proto_t protocol) NetRxPackets[i] = NetTxPacket + (i+1)*PKTSIZE_ALIGN; } - if (!NetArpWaitTxPacket) { - NetArpWaitTxPacket = &NetArpWaitPacketBuf[0] + (PKTALIGN - 1); - NetArpWaitTxPacket -= (ulong)NetArpWaitTxPacket % PKTALIGN; - NetArpWaitTxPacketSize = 0; - } - bootstage_mark_name(BOOTSTAGE_ID_ETH_START, "eth_start"); eth_halt(); eth_set_current(); @@ -659,6 +560,13 @@ void NetStartAgain(void) * Miscelaneous bits. */ +rxhand_f * +NetGetHandler(void) +{ + return packetHandler; +} + + void NetSetHandler(rxhand_f *f) { @@ -1070,11 +978,12 @@ NetReceive(uchar *inpkt, int len) { Ethernet_t *et; IP_t *ip; +#ifdef CONFIG_CMD_RARP ARP_t *arp; +#endif IPaddr_t tmp; IPaddr_t src_ip; int x; - uchar *pkt; #if defined(CONFIG_CMD_CDP) int iscdp; #endif @@ -1171,99 +1080,7 @@ NetReceive(uchar *inpkt, int len) switch (x) { case PROT_ARP: - /* - * We have to deal with two types of ARP packets: - * - REQUEST packets will be answered by sending our - * IP address - if we know it. - * - REPLY packates are expected only after we asked - * for the TFTP server's or the gateway's ethernet - * address; so if we receive such a packet, we set - * the server ethernet address - */ - debug("Got ARP\n"); - - arp = (ARP_t *)ip; - if (len < ARP_HDR_SIZE) { - printf("bad length %d < %d\n", len, ARP_HDR_SIZE); - return; - } - if (ntohs(arp->ar_hrd) != ARP_ETHER) - return; - if (ntohs(arp->ar_pro) != PROT_IP) - return; - if (arp->ar_hln != 6) - return; - if (arp->ar_pln != 4) - return; - - if (NetOurIP == 0) - return; - - if (NetReadIP(&arp->ar_data[16]) != NetOurIP) - return; - - switch (ntohs(arp->ar_op)) { - case ARPOP_REQUEST: - /* reply with our IP address */ - debug("Got ARP REQUEST, return our IP\n"); - pkt = (uchar *)et; - pkt += NetSetEther(pkt, et->et_src, PROT_ARP); - arp->ar_op = htons(ARPOP_REPLY); - memcpy(&arp->ar_data[10], &arp->ar_data[0], 6); - NetCopyIP(&arp->ar_data[16], &arp->ar_data[6]); - memcpy(&arp->ar_data[0], NetOurEther, 6); - NetCopyIP(&arp->ar_data[6], &NetOurIP); - (void) eth_send((uchar *)et, - (pkt - (uchar *)et) + ARP_HDR_SIZE); - return; - - case ARPOP_REPLY: /* arp reply */ - /* are we waiting for a reply */ - if (!NetArpWaitPacketIP || !NetArpWaitPacketMAC) - break; - -#ifdef CONFIG_KEEP_SERVERADDR - if (NetServerIP == NetArpWaitPacketIP) { - char buf[20]; - sprintf(buf, "%pM", arp->ar_data); - setenv("serveraddr", buf); - } -#endif - - debug("Got ARP REPLY, set server/gtwy eth addr (%pM)\n", - arp->ar_data); - - tmp = NetReadIP(&arp->ar_data[6]); - - /* matched waiting packet's address */ - if (tmp == NetArpWaitReplyIP) { - debug("Got it\n"); - - /* save address for later use */ - memcpy(NetArpWaitPacketMAC, - &arp->ar_data[0], 6); - -#ifdef CONFIG_NETCONSOLE - (*packetHandler)(0, 0, 0, 0, 0); -#endif - /* modify header, and transmit it */ - memcpy(((Ethernet_t *)NetArpWaitTxPacket)-> - et_dest, NetArpWaitPacketMAC, 6); - (void) eth_send(NetArpWaitTxPacket, - NetArpWaitTxPacketSize); - - /* no arp request pending now */ - NetArpWaitPacketIP = 0; - NetArpWaitTxPacketSize = 0; - NetArpWaitPacketMAC = NULL; - - } - return; - default: - debug("Unexpected ARP opcode 0x%x\n", - ntohs(arp->ar_op)); - return; - } + ArpReceive(et, ip, len); break; #ifdef CONFIG_CMD_RARP |