diff options
Diffstat (limited to 'net')
| -rw-r--r-- | net/bootp.c | 96 | ||||
| -rw-r--r-- | net/bootp.h | 2 | ||||
| -rw-r--r-- | net/eth.c | 62 | ||||
| -rw-r--r-- | net/net.c | 78 | ||||
| -rw-r--r-- | net/nfs.c | 4 | ||||
| -rw-r--r-- | net/rarp.c | 6 | ||||
| -rw-r--r-- | net/sntp.c | 6 | ||||
| -rw-r--r-- | net/tftp.c | 238 | 
8 files changed, 392 insertions, 100 deletions
| diff --git a/net/bootp.c b/net/bootp.c index 1de9a8f2c..be1ee332a 100644 --- a/net/bootp.c +++ b/net/bootp.c @@ -31,7 +31,7 @@  #define BOOTP_VENDOR_MAGIC	0x63825363	/* RFC1048 Magic Cookie		*/ -#if (CONFIG_COMMANDS & CFG_CMD_NET) +#if defined(CONFIG_CMD_NET)  #define TIMEOUT		5		/* Seconds before trying BOOTP again	*/  #ifndef CONFIG_NET_RETRY_COUNT @@ -53,7 +53,7 @@ int		BootpTry;  ulong		seed1, seed2;  #endif -#if (CONFIG_COMMANDS & CFG_CMD_DHCP) +#if defined(CONFIG_CMD_DHCP)  dhcp_state_t dhcp_state = INIT;  unsigned long dhcp_leasetime = 0;  IPaddr_t NetDHCPServerIP = 0; @@ -76,12 +76,12 @@ static char *dhcpmsg2str(int type)  }  #endif -#if (CONFIG_BOOTP_MASK & CONFIG_BOOTP_VENDOREX) +#if defined(CONFIG_BOOTP_VENDOREX)  extern u8 *dhcp_vendorex_prep (u8 *e); /*rtn new e after add own opts. */  extern u8 *dhcp_vendorex_proc (u8 *e); /*rtn next e if mine,else NULL  */  #endif -#endif	/* CFG_CMD_DHCP */ +#endif  static int BootpCheckPkt(uchar *pkt, unsigned dest, unsigned src, unsigned len)  { @@ -120,10 +120,12 @@ static void BootpCopyNetParams(Bootp_t *bp)  	IPaddr_t tmp_ip;  	NetCopyIP(&NetOurIP, &bp->bp_yiaddr); +#if !defined(CONFIG_BOOTP_SERVERIP)  	NetCopyIP(&tmp_ip, &bp->bp_siaddr);  	if (tmp_ip != 0)  		NetCopyIP(&NetServerIP, &bp->bp_siaddr);  	memcpy (NetServerEther, ((Ethernet_t *)NetRxPkt)->et_src, 6); +#endif  	if (strlen(bp->bp_file) > 0)  		copy_filename (BootFile, bp->bp_file, sizeof(BootFile)); @@ -148,7 +150,7 @@ static int truncate_sz (const char *name, int maxlen, int curlen)  	return (curlen);  } -#if !(CONFIG_COMMANDS & CFG_CMD_DHCP) +#if !defined(CONFIG_CMD_DHCP)  static void BootpVendorFieldProcess (u8 * ext)  { @@ -181,7 +183,7 @@ static void BootpVendorFieldProcess (u8 * ext)  		if (NetOurDNSIP == 0) {  			NetCopyIP (&NetOurDNSIP, (IPaddr_t *) (ext + 2));  		} -#if (CONFIG_BOOTP_MASK & CONFIG_BOOTP_DNS2) +#if defined(CONFIG_BOOTP_DNS2)  		if ((NetOurDNS2IP == 0) && (size > 4)) {  			NetCopyIP (&NetOurDNS2IP, (IPaddr_t *) (ext + 2 + 4));  		} @@ -344,7 +346,7 @@ BootpHandler(uchar * pkt, unsigned dest, unsigned src, unsigned len)  			 */  			NetState = NETLOOP_SUCCESS;  			return; -#if (CONFIG_COMMANDS & CFG_CMD_NFS) +#if defined(CONFIG_CMD_NFS)  		} else if (strcmp(s, "NFS") == 0) {  			/*  			 * Use NFS to load the bootfile. @@ -357,7 +359,7 @@ BootpHandler(uchar * pkt, unsigned dest, unsigned src, unsigned len)  	TftpStart();  } -#endif	/* !CFG_CMD_DHCP */ +#endif  /*   *	Timeout on BOOTP/DHCP request. @@ -377,16 +379,16 @@ BootpTimeout(void)  /*   *	Initialize BOOTP extension fields in the request.   */ -#if (CONFIG_COMMANDS & CFG_CMD_DHCP) +#if defined(CONFIG_CMD_DHCP)  static int DhcpExtended (u8 * e, int message_type, IPaddr_t ServerID, IPaddr_t RequestedIP)  {  	u8 *start = e;  	u8 *cnt; -#if (CONFIG_BOOTP_MASK & CONFIG_BOOTP_VENDOREX) +#if defined(CONFIG_BOOTP_VENDOREX)  	u8 *x;  #endif -#if (CONFIG_BOOTP_MASK & CONFIG_BOOTP_SEND_HOSTNAME) +#if defined(CONFIG_BOOTP_SEND_HOSTNAME)  	char *hostname;  #endif @@ -425,7 +427,7 @@ static int DhcpExtended (u8 * e, int message_type, IPaddr_t ServerID, IPaddr_t R  		*e++ = tmp >> 8;  		*e++ = tmp & 0xff;  	} -#if (CONFIG_BOOTP_MASK & CONFIG_BOOTP_SEND_HOSTNAME) +#if defined(CONFIG_BOOTP_SEND_HOSTNAME)  	if ((hostname = getenv ("hostname"))) {  		int hostnamelen = strlen (hostname); @@ -436,7 +438,7 @@ static int DhcpExtended (u8 * e, int message_type, IPaddr_t ServerID, IPaddr_t R  	}  #endif -#if (CONFIG_BOOTP_MASK & CONFIG_BOOTP_VENDOREX) +#if defined(CONFIG_BOOTP_VENDOREX)  	if ((x = dhcp_vendorex_prep (e)))  		return x - start;  #endif @@ -444,39 +446,39 @@ static int DhcpExtended (u8 * e, int message_type, IPaddr_t ServerID, IPaddr_t R  	*e++ = 55;		/* Parameter Request List */  	 cnt = e++;		/* Pointer to count of requested items */  	*cnt = 0; -#if (CONFIG_BOOTP_MASK & CONFIG_BOOTP_SUBNETMASK) +#if defined(CONFIG_BOOTP_SUBNETMASK)  	*e++  = 1;		/* Subnet Mask */  	*cnt += 1;  #endif -#if (CONFIG_BOOTP_MASK & CONFIG_BOOTP_TIMEOFFSET) +#if defined(CONFIG_BOOTP_TIMEOFFSET)  	*e++  = 2;  	*cnt += 1;  #endif -#if (CONFIG_BOOTP_MASK & CONFIG_BOOTP_GATEWAY) +#if defined(CONFIG_BOOTP_GATEWAY)  	*e++  = 3;		/* Router Option */  	*cnt += 1;  #endif -#if (CONFIG_BOOTP_MASK & CONFIG_BOOTP_DNS) +#if defined(CONFIG_BOOTP_DNS)  	*e++  = 6;		/* DNS Server(s) */  	*cnt += 1;  #endif -#if (CONFIG_BOOTP_MASK & CONFIG_BOOTP_HOSTNAME) +#if defined(CONFIG_BOOTP_HOSTNAME)  	*e++  = 12;		/* Hostname */  	*cnt += 1;  #endif -#if (CONFIG_BOOTP_MASK & CONFIG_BOOTP_BOOTFILESIZE) +#if defined(CONFIG_BOOTP_BOOTFILESIZE)  	*e++  = 13;		/* Boot File Size */  	*cnt += 1;  #endif -#if (CONFIG_BOOTP_MASK & CONFIG_BOOTP_BOOTPATH) +#if defined(CONFIG_BOOTP_BOOTPATH)  	*e++  = 17;		/* Boot path */  	*cnt += 1;  #endif -#if (CONFIG_BOOTP_MASK & CONFIG_BOOTP_NISDOMAIN) +#if defined(CONFIG_BOOTP_NISDOMAIN)  	*e++  = 40;		/* NIS Domain name request */  	*cnt += 1;  #endif -#if (CONFIG_BOOTP_MASK & CONFIG_BOOTP_NTPSERVER) +#if defined(CONFIG_BOOTP_NTPSERVER)  	*e++  = 42;  	*cnt += 1;  #endif @@ -491,9 +493,9 @@ static int DhcpExtended (u8 * e, int message_type, IPaddr_t ServerID, IPaddr_t R  	return e - start;  } -#else	/* CFG_CMD_DHCP */ +#else  /* - *	Warning: no field size check - change CONFIG_BOOTP_MASK at your own risk! + *	Warning: no field size check - change CONFIG_BOOTP_* at your own risk!   */  static int BootpExtended (u8 * e)  { @@ -504,7 +506,7 @@ static int BootpExtended (u8 * e)  	*e++ = 83;  	*e++ = 99; -#if (CONFIG_COMMANDS & CFG_CMD_DHCP) +#if defined(CONFIG_CMD_DHCP)  	*e++ = 53;		/* DHCP Message Type */  	*e++ = 1;  	*e++ = DHCP_DISCOVER; @@ -513,45 +515,45 @@ static int BootpExtended (u8 * e)  	*e++ = 2;  	*e++ = (576 - 312 + OPT_SIZE) >> 16;  	*e++ = (576 - 312 + OPT_SIZE) & 0xff; -#endif /* CFG_CMD_DHCP */ +#endif -#if (CONFIG_BOOTP_MASK & CONFIG_BOOTP_SUBNETMASK) +#if defined(CONFIG_BOOTP_SUBNETMASK)  	*e++ = 1;		/* Subnet mask request */  	*e++ = 4;  	e   += 4;  #endif -#if (CONFIG_BOOTP_MASK & CONFIG_BOOTP_GATEWAY) +#if defined(CONFIG_BOOTP_GATEWAY)  	*e++ = 3;		/* Default gateway request */  	*e++ = 4;  	e   += 4;  #endif -#if (CONFIG_BOOTP_MASK & CONFIG_BOOTP_DNS) +#if defined(CONFIG_BOOTP_DNS)  	*e++ = 6;		/* Domain Name Server */  	*e++ = 4;  	e   += 4;  #endif -#if (CONFIG_BOOTP_MASK & CONFIG_BOOTP_HOSTNAME) +#if defined(CONFIG_BOOTP_HOSTNAME)  	*e++ = 12;		/* Host name request */  	*e++ = 32;  	e   += 32;  #endif -#if (CONFIG_BOOTP_MASK & CONFIG_BOOTP_BOOTFILESIZE) +#if defined(CONFIG_BOOTP_BOOTFILESIZE)  	*e++ = 13;		/* Boot file size */  	*e++ = 2;  	e   += 2;  #endif -#if (CONFIG_BOOTP_MASK & CONFIG_BOOTP_BOOTPATH) +#if defined(CONFIG_BOOTP_BOOTPATH)  	*e++ = 17;		/* Boot path */  	*e++ = 32;  	e   += 32;  #endif -#if (CONFIG_BOOTP_MASK & CONFIG_BOOTP_NISDOMAIN) +#if defined(CONFIG_BOOTP_NISDOMAIN)  	*e++ = 40;		/* NIS Domain name request */  	*e++ = 32;  	e   += 32; @@ -561,7 +563,7 @@ static int BootpExtended (u8 * e)  	return e - start;  } -#endif	/* CFG_CMD_DHCP */ +#endif  void  BootpRequest (void) @@ -570,7 +572,7 @@ BootpRequest (void)  	Bootp_t *bp;  	int ext_len, pktlen, iplen; -#if (CONFIG_COMMANDS & CFG_CMD_DHCP) +#if defined(CONFIG_CMD_DHCP)  	dhcp_state = INIT;  #endif @@ -678,11 +680,11 @@ BootpRequest (void)  	copy_filename (bp->bp_file, BootFile, sizeof(bp->bp_file));  	/* Request additional information from the BOOTP/DHCP server */ -#if (CONFIG_COMMANDS & CFG_CMD_DHCP) +#if defined(CONFIG_CMD_DHCP)  	ext_len = DhcpExtended((u8 *)bp->bp_vend, DHCP_DISCOVER, 0, 0);  #else  	ext_len = BootpExtended((u8 *)bp->bp_vend); -#endif	/* CFG_CMD_DHCP */ +#endif  	/*  	 *	Bootp ID is the lower 4 bytes of our ethernet address @@ -705,16 +707,16 @@ BootpRequest (void)  	NetSetIP(iphdr, 0xFFFFFFFFL, PORT_BOOTPS, PORT_BOOTPC, iplen);  	NetSetTimeout(SELECT_TIMEOUT * CFG_HZ, BootpTimeout); -#if (CONFIG_COMMANDS & CFG_CMD_DHCP) +#if defined(CONFIG_CMD_DHCP)  	dhcp_state = SELECTING;  	NetSetHandler(DhcpHandler);  #else  	NetSetHandler(BootpHandler); -#endif	/* CFG_CMD_DHCP */ +#endif  	NetSendPacket(NetTxPacket, pktlen);  } -#if (CONFIG_COMMANDS & CFG_CMD_DHCP) +#if defined(CONFIG_CMD_DHCP)  static void DhcpOptionsProcess (uchar * popt, Bootp_t *bp)  {  	uchar *end = popt + BOOTP_HDR_SIZE; @@ -726,7 +728,7 @@ static void DhcpOptionsProcess (uchar * popt, Bootp_t *bp)  		case 1:  			NetCopyIP (&NetOurSubnetMask, (popt + 2));  			break; -#if (CONFIG_COMMANDS & CFG_CMD_SNTP) && (CONFIG_BOOTP_MASK & CONFIG_BOOTP_TIMEOFFSET) +#if defined(CONFIG_CMD_SNTP) && defined(CONFIG_BOOTP_TIMEOFFSET)  		case 2:		/* Time offset	*/  			NetCopyLong (&NetTimeOffset, (ulong *) (popt + 2));  			NetTimeOffset = ntohl (NetTimeOffset); @@ -737,7 +739,7 @@ static void DhcpOptionsProcess (uchar * popt, Bootp_t *bp)  			break;  		case 6:  			NetCopyIP (&NetOurDNSIP, (popt + 2)); -#if (CONFIG_BOOTP_MASK & CONFIG_BOOTP_DNS2) +#if defined(CONFIG_BOOTP_DNS2)  			if (*(popt + 1) > 4) {  				NetCopyIP (&NetOurDNS2IP, (popt + 2 + 4));  			} @@ -755,7 +757,7 @@ static void DhcpOptionsProcess (uchar * popt, Bootp_t *bp)  			memcpy (&NetOurRootPath, popt + 2, size);  			NetOurRootPath[size] = 0;  			break; -#if (CONFIG_COMMANDS & CFG_CMD_SNTP) && (CONFIG_BOOTP_MASK & CONFIG_BOOTP_NTPSERVER) +#if defined(CONFIG_CMD_SNTP) && defined(CONFIG_BOOTP_NTPSERVER)  		case 42:	/* NTP server IP */  			NetCopyIP (&NetNtpServerIP, (popt + 2));  			break; @@ -801,7 +803,7 @@ static void DhcpOptionsProcess (uchar * popt, Bootp_t *bp)  			}  			break;  		default: -#if (CONFIG_BOOTP_MASK & CONFIG_BOOTP_VENDOREX) +#if defined(CONFIG_BOOTP_VENDOREX)  			if (dhcp_vendorex_proc (popt))  				break;  #endif @@ -950,7 +952,7 @@ DhcpHandler(uchar * pkt, unsigned dest, unsigned src, unsigned len)  					 */  					NetState = NETLOOP_SUCCESS;  					return; -#if (CONFIG_COMMANDS & CFG_CMD_NFS) +#if defined(CONFIG_CMD_NFS)  				} else if (strcmp(s, "NFS") == 0) {  					/*  					 * Use NFS to load the bootfile. @@ -975,6 +977,6 @@ void DhcpRequest(void)  {  	BootpRequest();  } -#endif	/* CFG_CMD_DHCP */ +#endif -#endif /* CFG_CMD_NET */ +#endif diff --git a/net/bootp.h b/net/bootp.h index 0b3163901..ba9826e91 100644 --- a/net/bootp.h +++ b/net/bootp.h @@ -18,7 +18,7 @@  /*   *	BOOTP header.   */ -#if (CONFIG_COMMANDS & CFG_CMD_DHCP) +#if defined(CONFIG_CMD_DHCP)  #define OPT_SIZE 312	/* Minimum DHCP Options size per RFC2131 - results in 576 byte pkt */  #else  #define OPT_SIZE 64 @@ -26,7 +26,7 @@  #include <net.h>  #include <miiphy.h> -#if (CONFIG_COMMANDS & CFG_CMD_NET) && defined(CONFIG_NET_MULTI) +#if defined(CONFIG_CMD_NET) && defined(CONFIG_NET_MULTI)  #ifdef CFG_GT_6426x  extern int gt6426x_eth_initialize(bd_t *bis); @@ -40,6 +40,7 @@ extern int eth_3com_initialize(bd_t*);  extern int fec_initialize(bd_t*);  extern int inca_switch_initialize(bd_t*);  extern int mpc5xxx_fec_initialize(bd_t*); +extern int mpc512x_fec_initialize(bd_t*);  extern int mpc8220_fec_initialize(bd_t*);  extern int mv6436x_eth_initialize(bd_t *);  extern int mv6446x_eth_initialize(bd_t *); @@ -143,7 +144,7 @@ int eth_initialize(bd_t *bis)  	eth_current = NULL;  	show_boot_progress (64); -#if defined(CONFIG_MII) || (CONFIG_COMMANDS & CFG_CMD_MII) +#if defined(CONFIG_MII) || defined(CONFIG_CMD_MII)  	miiphy_init();  #endif @@ -168,6 +169,9 @@ int eth_initialize(bd_t *bis)  #if defined(CONFIG_MPC5xxx_FEC)  	mpc5xxx_fec_initialize(bis);  #endif +#if defined(CONFIG_MPC512x_FEC) +	mpc512x_fec_initialize (bis); +#endif  #if defined(CONFIG_MPC8220_FEC)  	mpc8220_fec_initialize(bis);  #endif @@ -349,6 +353,51 @@ void eth_set_enetaddr(int num, char *addr) {  	memcpy(dev->enetaddr, enetaddr, 6);  } +#ifdef CONFIG_MCAST_TFTP +/* Multicast. + * mcast_addr: multicast ipaddr from which multicast Mac is made + * join: 1=join, 0=leave. + */ +int eth_mcast_join( IPaddr_t mcast_ip, u8 join) +{ + u8 mcast_mac[6]; +	if (!eth_current || !eth_current->mcast) +		return -1; +	mcast_mac[5] = htonl(mcast_ip) & 0xff; +	mcast_mac[4] = (htonl(mcast_ip)>>8) & 0xff; +	mcast_mac[3] = (htonl(mcast_ip)>>16) & 0x7f; +	mcast_mac[2] = 0x5e; +	mcast_mac[1] = 0x0; +	mcast_mac[0] = 0x1; +	return eth_current->mcast(eth_current, mcast_mac, join); +} + +/* the 'way' for ethernet-CRC-32. Spliced in from Linux lib/crc32.c + * and this is the ethernet-crc method needed for TSEC -- and perhaps + * some other adapter -- hash tables + */ +#define CRCPOLY_LE 0xedb88320 +u32 ether_crc (size_t len, unsigned char const *p) +{ +	int i; +	u32 crc; +	crc = ~0; +	while (len--) { +		crc ^= *p++; +		for (i = 0; i < 8; i++) +			crc = (crc >> 1) ^ ((crc & 1) ? CRCPOLY_LE : 0); +	} +	/* an reverse the bits, cuz of way they arrive -- last-first */ +	crc = (crc >> 16) | (crc << 16); +	crc = (crc >> 8 & 0x00ff00ff) | (crc << 8 & 0xff00ff00); +	crc = (crc >> 4 & 0x0f0f0f0f) | (crc << 4 & 0xf0f0f0f0); +	crc = (crc >> 2 & 0x33333333) | (crc << 2 & 0xcccccccc); +	crc = (crc >> 1 & 0x55555555) | (crc << 1 & 0xaaaaaaaa); +	return crc; +} + +#endif +  int eth_init(bd_t *bis)  { @@ -454,16 +503,18 @@ char *eth_get_name (void)  {  	return (eth_current ? eth_current->name : "unknown");  } -#elif (CONFIG_COMMANDS & CFG_CMD_NET) && !defined(CONFIG_NET_MULTI) +#elif defined(CONFIG_CMD_NET) && !defined(CONFIG_NET_MULTI)  extern int at91rm9200_miiphy_initialize(bd_t *bis);  extern int emac4xx_miiphy_initialize(bd_t *bis);  extern int mcf52x2_miiphy_initialize(bd_t *bis);  extern int ns7520_miiphy_initialize(bd_t *bis); +extern int dm644x_eth_miiphy_initialize(bd_t *bis); +  int eth_initialize(bd_t *bis)  { -#if defined(CONFIG_MII) || (CONFIG_COMMANDS & CFG_CMD_MII) +#if defined(CONFIG_MII) || defined(CONFIG_CMD_MII)  	miiphy_init();  #endif @@ -480,6 +531,9 @@ int eth_initialize(bd_t *bis)  #if defined(CONFIG_NETARM)  	ns7520_miiphy_initialize(bis);  #endif +#if defined(CONFIG_DRIVER_TI_EMAC) +	dm644x_eth_miiphy_initialize(bis); +#endif  	return 0;  }  #endif @@ -86,11 +86,11 @@  #include <status_led.h>  #include <miiphy.h>  #endif -#if (CONFIG_COMMANDS & CFG_CMD_SNTP) +#if defined(CONFIG_CMD_SNTP)  #include "sntp.h"  #endif -#if (CONFIG_COMMANDS & CFG_CMD_NET) +#if defined(CONFIG_CMD_NET)  DECLARE_GLOBAL_DATA_PTR; @@ -110,7 +110,7 @@ DECLARE_GLOBAL_DATA_PTR;  IPaddr_t	NetOurSubnetMask=0;		/* Our subnet mask (0=unknown)	*/  IPaddr_t	NetOurGatewayIP=0;		/* Our gateways IP address	*/  IPaddr_t	NetOurDNSIP=0;			/* Our DNS IP address		*/ -#if (CONFIG_BOOTP_MASK & CONFIG_BOOTP_DNS2) +#if defined(CONFIG_BOOTP_DNS2)  IPaddr_t	NetOurDNS2IP=0;			/* Our 2nd DNS IP address	*/  #endif  char		NetOurNISDomain[32]={0,};	/* Our NIS domain		*/ @@ -118,6 +118,10 @@ char		NetOurHostName[32]={0,};	/* Our hostname			*/  char		NetOurRootPath[64]={0,};	/* Our bootpath			*/  ushort		NetBootFileSize=0;		/* Our bootfile size in blocks	*/ +#ifdef CONFIG_MCAST_TFTP	/* Multicast TFTP */ +IPaddr_t Mcast_addr; +#endif +  /** END OF BOOTP EXTENTIONS **/  ulong		NetBootFileXferSize;	/* The actual transferred size of the bootfile (in bytes) */ @@ -133,7 +137,7 @@ uchar		NetBcastAddr[6] =	/* Ethernet bcast address		*/  			{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };  uchar		NetEtherNullAddr[6] =  			{ 0, 0, 0, 0, 0, 0 }; -#if (CONFIG_COMMANDS & CFG_CMD_CDP) +#if defined(CONFIG_CMD_CDP)  uchar		NetCDPAddr[6] =		/* Ethernet bcast address		*/  			{ 0x01, 0x00, 0x0c, 0xcc, 0xcc, 0xcc };  #endif @@ -150,17 +154,17 @@ ushort		NetOurNativeVLAN = 0xFFFF;	/* ditto			*/  char		BootFile[128];		/* Boot File name			*/ -#if (CONFIG_COMMANDS & CFG_CMD_PING) +#if defined(CONFIG_CMD_PING)  IPaddr_t	NetPingIP;		/* the ip address to ping 		*/  static void PingStart(void);  #endif -#if (CONFIG_COMMANDS & CFG_CMD_CDP) +#if defined(CONFIG_CMD_CDP)  static void CDPStart(void);  #endif -#if (CONFIG_COMMANDS & CFG_CMD_SNTP) +#if defined(CONFIG_CMD_SNTP)  IPaddr_t	NetNtpServerIP;		/* NTP server IP address		*/  int		NetTimeOffset=0;	/* offset time from UTC			*/  #endif @@ -326,13 +330,13 @@ restart:  	 */  	switch (protocol) { -#if (CONFIG_COMMANDS & CFG_CMD_NFS) +#if defined(CONFIG_CMD_NFS)  	case NFS:  #endif -#if (CONFIG_COMMANDS & CFG_CMD_PING) +#if defined(CONFIG_CMD_PING)  	case PING:  #endif -#if (CONFIG_COMMANDS & CFG_CMD_SNTP) +#if defined(CONFIG_CMD_SNTP)  	case SNTP:  #endif  	case NETCONS: @@ -344,19 +348,19 @@ restart:  		NetOurNativeVLAN = getenv_VLAN("nvlan");  		switch (protocol) { -#if (CONFIG_COMMANDS & CFG_CMD_NFS) +#if defined(CONFIG_CMD_NFS)  		case NFS:  #endif  		case NETCONS:  		case TFTP:  			NetServerIP = getenv_IPaddr ("serverip");  			break; -#if (CONFIG_COMMANDS & CFG_CMD_PING) +#if defined(CONFIG_CMD_PING)  		case PING:  			/* nothing */  			break;  #endif -#if (CONFIG_COMMANDS & CFG_CMD_SNTP) +#if defined(CONFIG_CMD_SNTP)  		case SNTP:  			/* nothing */  			break; @@ -406,7 +410,7 @@ restart:  			TftpStart();  			break; -#if (CONFIG_COMMANDS & CFG_CMD_DHCP) +#if defined(CONFIG_CMD_DHCP)  		case DHCP:  			/* Start with a clean slate... */  			BootpTry = 0; @@ -414,7 +418,7 @@ restart:  			NetServerIP = getenv_IPaddr ("serverip");  			DhcpRequest();		/* Basically same as BOOTP */  			break; -#endif /* CFG_CMD_DHCP */ +#endif  		case BOOTP:  			BootpTry = 0; @@ -425,17 +429,17 @@ restart:  			RarpTry = 0;  			RarpRequest ();  			break; -#if (CONFIG_COMMANDS & CFG_CMD_PING) +#if defined(CONFIG_CMD_PING)  		case PING:  			PingStart();  			break;  #endif -#if (CONFIG_COMMANDS & CFG_CMD_NFS) +#if defined(CONFIG_CMD_NFS)  		case NFS:  			NfsStart();  			break;  #endif -#if (CONFIG_COMMANDS & CFG_CMD_CDP) +#if defined(CONFIG_CMD_CDP)  		case CDP:  			CDPStart();  			break; @@ -445,7 +449,7 @@ restart:  			NcStart();  			break;  #endif -#if (CONFIG_COMMANDS & CFG_CMD_SNTP) +#if defined(CONFIG_CMD_SNTP)  		case SNTP:  			SntpStart();  			break; @@ -458,7 +462,7 @@ restart:  		break;  	} -#if defined(CONFIG_MII) || (CONFIG_COMMANDS & CFG_CMD_MII) +#if defined(CONFIG_MII) || defined(CONFIG_CMD_MII)  #if defined(CFG_FAULT_ECHO_LINK_DOWN) && defined(CONFIG_STATUS_LED) && defined(STATUS_LED_RED)  	/*  	 * Echo the inverted link state to the fault LED. @@ -507,7 +511,7 @@ restart:  		if (timeHandler && ((get_timer(0) - timeStart) > timeDelta)) {  			thand_f *x; -#if defined(CONFIG_MII) || (CONFIG_COMMANDS & CFG_CMD_MII) +#if defined(CONFIG_MII) || defined(CONFIG_CMD_MII)  #  if defined(CFG_FAULT_ECHO_LINK_DOWN) && \        defined(CONFIG_STATUS_LED) &&	   \        defined(STATUS_LED_RED) @@ -687,7 +691,7 @@ NetSendUDPPacket(uchar *ether, IPaddr_t dest, int dport, int sport, int len)  	return 0;	/* transmitted */  } -#if (CONFIG_COMMANDS & CFG_CMD_PING) +#if defined(CONFIG_CMD_PING)  static ushort PingSeqNo;  int PingSend(void) @@ -775,9 +779,9 @@ static void PingStart(void)  	PingSend();  } -#endif	/* CFG_CMD_PING */ +#endif -#if (CONFIG_COMMANDS & CFG_CMD_CDP) +#if defined(CONFIG_CMD_CDP)  #define CDP_DEVICE_ID_TLV		0x0001  #define CDP_ADDRESS_TLV			0x0002 @@ -1128,7 +1132,7 @@ static void CDPStart(void)  	CDPSendTrigger();  } -#endif	/* CFG_CMD_CDP */ +#endif  void @@ -1140,7 +1144,7 @@ NetReceive(volatile uchar * inpkt, int len)  	IPaddr_t tmp;  	int	x;  	uchar *pkt; -#if (CONFIG_COMMANDS & CFG_CMD_CDP) +#if defined(CONFIG_CMD_CDP)  	int iscdp;  #endif  	ushort cti = 0, vlanid = VLAN_NONE, myvlanid, mynvlanid; @@ -1157,7 +1161,7 @@ NetReceive(volatile uchar * inpkt, int len)  	if (len < ETHER_HDR_SIZE)  		return; -#if (CONFIG_COMMANDS & CFG_CMD_CDP) +#if defined(CONFIG_CMD_CDP)  	/* keep track if packet is CDP */  	iscdp = memcmp(et->et_dest, NetCDPAddr, 6) == 0;  #endif @@ -1200,7 +1204,7 @@ NetReceive(volatile uchar * inpkt, int len)  		/* if no VLAN active */  		if ((ntohs(NetOurVLAN) & VLAN_IDMASK) == VLAN_NONE -#if (CONFIG_COMMANDS & CFG_CMD_CDP) +#if defined(CONFIG_CMD_CDP)  				&& iscdp == 0  #endif  				) @@ -1218,7 +1222,7 @@ NetReceive(volatile uchar * inpkt, int len)  	printf("Receive from protocol 0x%x\n", x);  #endif -#if (CONFIG_COMMANDS & CFG_CMD_CDP) +#if defined(CONFIG_CMD_CDP)  	if (iscdp) {  		CDPHandler((uchar *)ip, len);  		return; @@ -1386,6 +1390,9 @@ NetReceive(volatile uchar * inpkt, int len)  		}  		tmp = NetReadIP(&ip->ip_dst);  		if (NetOurIP && tmp != NetOurIP && tmp != 0xFFFFFFFF) { +#ifdef CONFIG_MCAST_TFTP +			if (Mcast_addr != tmp) +#endif  			return;  		}  		/* @@ -1416,7 +1423,7 @@ NetReceive(volatile uchar * inpkt, int len)  				print_IPaddr(icmph->un.gateway);  				putc(' ');  				return; -#if (CONFIG_COMMANDS & CFG_CMD_PING) +#if defined(CONFIG_CMD_PING)  			case ICMP_ECHO_REPLY:  				/*  				 *	IP header OK.  Pass the packet to the current handler. @@ -1492,6 +1499,7 @@ NetReceive(volatile uchar * inpkt, int len)  		}  #endif +  #ifdef CONFIG_NETCONSOLE  		nc_input_packet((uchar *)ip +IP_HDR_SIZE,  						ntohs(ip->udp_dst), @@ -1516,7 +1524,7 @@ static int net_check_prereq (proto_t protocol)  {  	switch (protocol) {  		/* Fall through */ -#if (CONFIG_COMMANDS & CFG_CMD_PING) +#if defined(CONFIG_CMD_PING)  	case PING:  		if (NetPingIP == 0) {  			puts ("*** ERROR: ping address not given\n"); @@ -1524,7 +1532,7 @@ static int net_check_prereq (proto_t protocol)  		}  		goto common;  #endif -#if (CONFIG_COMMANDS & CFG_CMD_SNTP) +#if defined(CONFIG_CMD_SNTP)  	case SNTP:  		if (NetNtpServerIP == 0) {  			puts ("*** ERROR: NTP server address not given\n"); @@ -1532,7 +1540,7 @@ static int net_check_prereq (proto_t protocol)  		}  		goto common;  #endif -#if (CONFIG_COMMANDS & CFG_CMD_NFS) +#if defined(CONFIG_CMD_NFS)  	case NFS:  #endif  	case NETCONS: @@ -1541,7 +1549,7 @@ static int net_check_prereq (proto_t protocol)  			puts ("*** ERROR: `serverip' not set\n");  			return (1);  		} -#if (CONFIG_COMMANDS & (CFG_CMD_PING | CFG_CMD_SNTP)) +#if defined(CONFIG_CMD_PING) || defined(CONFIG_CMD_SNTP)      common:  #endif @@ -1693,7 +1701,7 @@ void copy_filename (char *dst, char *src, int size)  	*dst = '\0';  } -#endif /* CFG_CMD_NET */ +#endif  void ip_to_string (IPaddr_t x, char *s)  { @@ -31,7 +31,7 @@  /*#define NFS_DEBUG*/ -#if ((CONFIG_COMMANDS & CFG_CMD_NET) && (CONFIG_COMMANDS & CFG_CMD_NFS)) +#if defined(CONFIG_CMD_NET) && defined(CONFIG_CMD_NFS)  #define HASHES_PER_LINE 65	/* Number of "loading" hashes per line	*/  #define NFS_TIMEOUT 60 @@ -775,4 +775,4 @@ NfsStart (void)  	NfsSend ();  } -#endif /* CONFIG_COMMANDS & CFG_CMD_NFS */ +#endif diff --git a/net/rarp.c b/net/rarp.c index 1ba60e803..21dfa529c 100644 --- a/net/rarp.c +++ b/net/rarp.c @@ -29,7 +29,7 @@  #include "rarp.h"  #include "tftp.h" -#if (CONFIG_COMMANDS & CFG_CMD_NET) +#if defined(CONFIG_CMD_NET)  #define TIMEOUT		5		/* Seconds before trying BOOTP again */  #ifndef	CONFIG_NET_RETRY_COUNT @@ -59,7 +59,7 @@ RarpHandler(uchar * dummi0, unsigned dummi1, unsigned dummi2, unsigned dummi3)  			 */  			NetState = NETLOOP_SUCCESS;  			return; -#if (CONFIG_COMMANDS & CFG_CMD_NFS) +#if defined(CONFIG_CMD_NFS)  		} else if ((s != NULL) && !strcmp(s, "NFS")) {  			NfsStart();  			return; @@ -119,4 +119,4 @@ RarpRequest (void)  	NetSetHandler(RarpHandler);  } -#endif /* CFG_CMD_NET */ +#endif diff --git a/net/sntp.c b/net/sntp.c index db8c2c279..95e75422c 100644 --- a/net/sntp.c +++ b/net/sntp.c @@ -12,7 +12,7 @@  #include "sntp.h" -#if ((CONFIG_COMMANDS & CFG_CMD_NET) && (CONFIG_COMMANDS & CFG_CMD_SNTP)) +#if defined(CONFIG_CMD_NET) && defined(CONFIG_CMD_SNTP)  #define SNTP_TIMEOUT 10 @@ -67,7 +67,7 @@ SntpHandler (uchar *pkt, unsigned dest, unsigned src, unsigned len)  	memcpy (&seconds, &rpktp->transmit_timestamp, sizeof(ulong));  	to_tm(ntohl(seconds) - 2208988800UL + NetTimeOffset, &tm); -#if (CONFIG_COMMANDS & CFG_CMD_DATE) +#if defined(CONFIG_CMD_DATE)  	rtc_set (&tm);  #endif  	printf ("Date: %4d-%02d-%02d Time: %2d:%02d:%02d\n", @@ -89,4 +89,4 @@ SntpStart (void)  	SntpSend ();  } -#endif /* CONFIG_COMMANDS & CFG_CMD_SNTP */ +#endif diff --git a/net/tftp.c b/net/tftp.c index f3a547148..888ec987c 100644 --- a/net/tftp.c +++ b/net/tftp.c @@ -12,7 +12,7 @@  #undef	ET_DEBUG -#if (CONFIG_COMMANDS & CFG_CMD_NET) +#if defined(CONFIG_CMD_NET)  #define WELL_KNOWN_PORT	69		/* Well known TFTP port #		*/  #define TIMEOUT		5		/* Seconds to timeout for a lost pkt	*/ @@ -61,10 +61,43 @@ static char *tftp_filename;  extern flash_info_t flash_info[];  #endif +/* 512 is poor choice for ethernet, MTU is typically 1500. + * Minus eth.hdrs thats 1468.  Can get 2x better throughput with + * almost-MTU block sizes.  At least try... fall back to 512 if need be. + */ +#define TFTP_MTU_BLOCKSIZE 1468 +static unsigned short TftpBlkSize=TFTP_BLOCK_SIZE; +static unsigned short TftpBlkSizeOption=TFTP_MTU_BLOCKSIZE; + +#ifdef CONFIG_MCAST_TFTP +#include <malloc.h> +#define MTFTP_BITMAPSIZE	0x1000 +static unsigned *Bitmap; +static int PrevBitmapHole,Mapsize=MTFTP_BITMAPSIZE; +static uchar ProhibitMcast=0, MasterClient=0; +static uchar Multicast=0; +extern IPaddr_t Mcast_addr; +static int Mcast_port; +static ulong TftpEndingBlock; /* can get 'last' block before done..*/ + +static void parse_multicast_oack(char *pkt,int len); + +static void +mcast_cleanup(void) +{ +	if (Mcast_addr) eth_mcast_join(Mcast_addr, 0); +	if (Bitmap) free(Bitmap); +	Bitmap=NULL; +	Mcast_addr = Multicast = Mcast_port = 0; +	TftpEndingBlock = -1; +} + +#endif	/* CONFIG_MCAST_TFTP */ +  static __inline__ void  store_block (unsigned block, uchar * src, unsigned len)  { -	ulong offset = block * TFTP_BLOCK_SIZE + TftpBlockWrapOffset; +	ulong offset = block * TftpBlkSize + TftpBlockWrapOffset;  	ulong newsize = offset + len;  #ifdef CFG_DIRECT_FLASH_TFTP  	int i, rc = 0; @@ -90,6 +123,10 @@ store_block (unsigned block, uchar * src, unsigned len)  	{  		(void)memcpy((void *)(load_addr + offset), src, len);  	} +#ifdef CONFIG_MCAST_TFTP +	if (Multicast) +		ext2_set_bit(block, Bitmap); +#endif  	if (NetBootFileXferSize < newsize)  		NetBootFileXferSize = newsize; @@ -108,6 +145,13 @@ TftpSend (void)  	int			len = 0;  	volatile ushort *s; +#ifdef CONFIG_MCAST_TFTP +	/* Multicast TFTP.. non-MasterClients do not ACK data. */ +	if (Multicast +	 && (TftpState == STATE_DATA) +	 && (MasterClient == 0)) +		return; +#endif  	/*  	 *	We will always be sending some sort of packet, so  	 *	cobble together the packet headers now. @@ -132,11 +176,30 @@ TftpSend (void)  		printf("send option \"timeout %s\"\n", (char *)pkt);  #endif  		pkt += strlen((char *)pkt) + 1; +		/* try for more effic. blk size */ +		pkt += sprintf((char *)pkt,"blksize%c%d%c", +				0,htons(TftpBlkSizeOption),0); +#ifdef CONFIG_MCAST_TFTP +		/* Check all preconditions before even trying the option */ +		if (!ProhibitMcast +		 && (Bitmap=malloc(Mapsize)) +		 && eth_get_dev()->mcast) { +			free(Bitmap); +			Bitmap=NULL; +			pkt += sprintf((char *)pkt,"multicast%c%c",0,0); +		} +#endif /* CONFIG_MCAST_TFTP */  		len = pkt - xp;  		break; -	case STATE_DATA:  	case STATE_OACK: +#ifdef CONFIG_MCAST_TFTP +		/* My turn!  Start at where I need blocks I missed.*/ +		if (Multicast) +			TftpBlock=ext2_find_next_zero_bit(Bitmap,(Mapsize*8),0); +		/*..falling..*/ +#endif +	case STATE_DATA:  		xp = pkt;  		s = (ushort *)pkt;  		*s++ = htons(TFTP_ACK); @@ -177,8 +240,13 @@ TftpHandler (uchar * pkt, unsigned dest, unsigned src, unsigned len)  {  	ushort proto;  	ushort *s; +	int i;  	if (dest != TftpOurPort) { +#ifdef CONFIG_MCAST_TFTP +		if (Multicast +		 && (!Mcast_port || (dest != Mcast_port))) +#endif  		return;  	}  	if (TftpState != STATE_RRQ && src != TftpServerPort) { @@ -208,6 +276,24 @@ TftpHandler (uchar * pkt, unsigned dest, unsigned src, unsigned len)  #endif  		TftpState = STATE_OACK;  		TftpServerPort = src; +		/* Check for 'blksize' option */ +		for (i=0;i<len-8;i++) { +			if (strcmp ((char*)pkt+i,"blksize") == 0) { +				TftpBlkSize = (unsigned short) +					simple_strtoul((char*)pkt+i+8,NULL,10); +#ifdef ET_DEBUG +				printf ("Blocksize ack: %s, %d\n", +					(char*)pkt+i+8,TftpBlkSize); +#endif +				break; +			} +		} +#ifdef CONFIG_MCAST_TFTP +		parse_multicast_oack((char *)pkt,len-1); +		if ((Multicast) && (!MasterClient)) +			TftpState = STATE_DATA;	/* passive.. */ +		else +#endif  		TftpSend (); /* Send ACK */  		break;  	case TFTP_DATA: @@ -224,7 +310,7 @@ TftpHandler (uchar * pkt, unsigned dest, unsigned src, unsigned len)  		 */  		if (TftpBlock == 0) {  			TftpBlockWrap++; -			TftpBlockWrapOffset += TFTP_BLOCK_SIZE * TFTP_SEQUENCE_SIZE; +			TftpBlockWrapOffset += TftpBlkSize * TFTP_SEQUENCE_SIZE;  			printf ("\n\t %lu MB received\n\t ", TftpBlockWrapOffset>>20);  		} else {  			if (((TftpBlock - 1) % 10) == 0) { @@ -248,6 +334,11 @@ TftpHandler (uchar * pkt, unsigned dest, unsigned src, unsigned len)  			TftpBlockWrap = 0;  			TftpBlockWrapOffset = 0; +#ifdef CONFIG_MCAST_TFTP +			if (Multicast) { /* start!=1 common if mcast */ +				TftpLastBlock = TftpBlock - 1; +			} else +#endif  			if (TftpBlock != 1) {	/* Assertion */  				printf ("\nTFTP error: "  					"First block is not block 1 (%ld)\n" @@ -274,9 +365,44 @@ TftpHandler (uchar * pkt, unsigned dest, unsigned src, unsigned len)  		 *	Acknoledge the block just received, which will prompt  		 *	the server for the next one.  		 */ +#ifdef CONFIG_MCAST_TFTP +		/* if I am the MasterClient, actively calculate what my next +		 * needed block is; else I'm passive; not ACKING + 		 */ +		if (Multicast) { +			if (len < TftpBlkSize)  { +				TftpEndingBlock = TftpBlock; +			} else if (MasterClient) { +				TftpBlock = PrevBitmapHole = +					ext2_find_next_zero_bit( +						Bitmap, +						(Mapsize*8), +						PrevBitmapHole); +				if (TftpBlock > ((Mapsize*8) - 1)) { +					printf ("tftpfile too big\n"); +					/* try to double it and retry */ +					Mapsize<<=1; +					mcast_cleanup(); +					NetStartAgain (); +					return; +				} +				TftpLastBlock = TftpBlock; +			} +		} +#endif  		TftpSend (); -		if (len < TFTP_BLOCK_SIZE) { +#ifdef CONFIG_MCAST_TFTP +		if (Multicast) { +			if (MasterClient && (TftpBlock >= TftpEndingBlock)) { +				puts ("\nMulticast tftp done\n"); +				mcast_cleanup(); +				NetState = NETLOOP_SUCCESS; +			} +		} +		else +#endif +		if (len < TftpBlkSize) {  			/*  			 *	We received the whole thing.  Try to  			 *	run it. @@ -290,6 +416,9 @@ TftpHandler (uchar * pkt, unsigned dest, unsigned src, unsigned len)  		printf ("\nTFTP error: '%s' (%d)\n",  					pkt + 2, ntohs(*(ushort *)pkt));  		puts ("Starting again\n\n"); +#ifdef CONFIG_MCAST_TFTP +		mcast_cleanup(); +#endif  		NetStartAgain ();  		break;  	} @@ -301,6 +430,9 @@ TftpTimeout (void)  {  	if (++TftpTimeoutCount > TIMEOUT_COUNT) {  		puts ("\nRetry count exceeded; starting again\n"); +#ifdef CONFIG_MCAST_TFTP +		mcast_cleanup(); +#endif  		NetStartAgain ();  	} else {  		puts ("T "); @@ -370,6 +502,7 @@ TftpStart (void)  	TftpState = STATE_RRQ;  	/* Use a pseudo-random port unless a specific port is set */  	TftpOurPort = 1024 + (get_timer(0) % 3072); +  #ifdef CONFIG_TFTP_PORT  	if ((ep = getenv("tftpdstp")) != NULL) {  		TftpServerPort = simple_strtol(ep, NULL, 10); @@ -382,8 +515,103 @@ TftpStart (void)  	/* zero out server ether in case the server ip has changed */  	memset(NetServerEther, 0, 6); +	/* Revert TftpBlkSize to dflt */ +	TftpBlkSize = TFTP_BLOCK_SIZE; +#ifdef CONFIG_MCAST_TFTP +    	mcast_cleanup(); +#endif  	TftpSend ();  } +#ifdef CONFIG_MCAST_TFTP +/* Credits: atftp project. + */ + +/* pick up BcastAddr, Port, and whether I am [now] the master-client. * + * Frame: + *    +-------+-----------+---+-------~~-------+---+ + *    |  opc  | multicast | 0 | addr, port, mc | 0 | + *    +-------+-----------+---+-------~~-------+---+ + * The multicast addr/port becomes what I listen to, and if 'mc' is '1' then + * I am the new master-client so must send ACKs to DataBlocks.  If I am not + * master-client, I'm a passive client, gathering what DataBlocks I may and + * making note of which ones I got in my bitmask. + * In theory, I never go from master->passive.. + * .. this comes in with pkt already pointing just past opc + */ +static void parse_multicast_oack(char *pkt, int len) +{ + int i; + IPaddr_t addr; + char *mc_adr, *port,  *mc; + +	mc_adr=port=mc=NULL; +	/* march along looking for 'multicast\0', which has to start at least +	 * 14 bytes back from the end. +	 */ +	for (i=0;i<len-14;i++) +		if (strcmp (pkt+i,"multicast") == 0) +			break; +	if (i >= (len-14)) /* non-Multicast OACK, ign. */ +		return; + +	i+=10; /* strlen multicast */ +	mc_adr = pkt+i; +	for (;i<len;i++) { +		if (*(pkt+i) == ',') { +			*(pkt+i) = '\0'; +			if (port) { +				mc = pkt+i+1; +				break; +			} else { +				port = pkt+i+1; +			} +		} +	} +	if (!port || !mc_adr || !mc ) return; +	if (Multicast && MasterClient) { +		printf ("I got a OACK as master Client, WRONG!\n"); +		return; +	} +	/* ..I now accept packets destined for this MCAST addr, port */ +	if (!Multicast) { +		if (Bitmap) { +			printf ("Internal failure! no mcast.\n"); +			free(Bitmap); +			Bitmap=NULL; +			ProhibitMcast=1; +			return ; +		} +		/* I malloc instead of pre-declare; so that if the file ends +		 * up being too big for this bitmap I can retry +		 */ +		if (!(Bitmap = malloc (Mapsize))) { +			printf ("No Bitmap, no multicast. Sorry.\n"); +			ProhibitMcast=1; +			return; +		} +		memset (Bitmap,0,Mapsize); +		PrevBitmapHole = 0; +		Multicast = 1; +	} +	addr = string_to_ip(mc_adr); +	if (Mcast_addr != addr) { +		if (Mcast_addr) +			eth_mcast_join(Mcast_addr, 0); +		if (eth_mcast_join(Mcast_addr=addr, 1)) { +			printf ("Fail to set mcast, revert to TFTP\n"); +			ProhibitMcast=1; +			mcast_cleanup(); +			NetStartAgain(); +		} +	} +	MasterClient = (unsigned char)simple_strtoul((char *)mc,NULL,10); +	Mcast_port = (unsigned short)simple_strtoul(port,NULL,10); +	printf ("Multicast: %s:%d [%d]\n", mc_adr, Mcast_port, MasterClient); +	return; +} + +#endif /* Multicast TFTP */ +  #endif /* CFG_CMD_NET */ |