diff options
Diffstat (limited to 'net/net.c')
| -rw-r--r-- | net/net.c | 230 | 
1 files changed, 154 insertions, 76 deletions
| @@ -101,7 +101,8 @@  DECLARE_GLOBAL_DATA_PTR;  #ifndef	CONFIG_ARP_TIMEOUT -# define ARP_TIMEOUT		5000UL	/* Milliseconds before trying ARP again */ +/* Milliseconds before trying ARP again */ +# define ARP_TIMEOUT		5000UL  #else  # define ARP_TIMEOUT		CONFIG_ARP_TIMEOUT  #endif @@ -115,16 +116,24 @@ DECLARE_GLOBAL_DATA_PTR;  /** BOOTP EXTENTIONS **/ -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		*/ +/* Our subnet mask (0=unknown) */ +IPaddr_t	NetOurSubnetMask=0; +/* Our gateways IP address */ +IPaddr_t	NetOurGatewayIP=0; +/* Our DNS IP address */ +IPaddr_t	NetOurDNSIP=0;  #if defined(CONFIG_BOOTP_DNS2) -IPaddr_t	NetOurDNS2IP=0;			/* Our 2nd DNS IP address	*/ +/* Our 2nd DNS IP address */ +IPaddr_t	NetOurDNS2IP=0;  #endif -char		NetOurNISDomain[32]={0,};	/* Our NIS domain		*/ -char		NetOurHostName[32]={0,};	/* Our hostname			*/ -char		NetOurRootPath[64]={0,};	/* Our bootpath			*/ -ushort		NetBootFileSize=0;		/* Our bootfile size in blocks	*/ +/* Our NIS domain */ +char		NetOurNISDomain[32]={0,}; +/* Our hostname */ +char		NetOurHostName[32]={0,}; +/* Our bootpath */ +char		NetOurRootPath[64]={0,}; +/* Our bootfile size in blocks */ +ushort		NetBootFileSize=0;  #ifdef CONFIG_MCAST_TFTP	/* Multicast TFTP */  IPaddr_t Mcast_addr; @@ -132,16 +141,25 @@ IPaddr_t Mcast_addr;  /** END OF BOOTP EXTENTIONS **/ -ulong		NetBootFileXferSize;	/* The actual transferred size of the bootfile (in bytes) */ -uchar		NetOurEther[6];		/* Our ethernet address			*/ -uchar		NetServerEther[6] =	/* Boot server enet address		*/ +/* The actual transferred size of the bootfile (in bytes) */ +ulong		NetBootFileXferSize; +/* Our ethernet address */ +uchar		NetOurEther[6]; +/* Boot server enet address */ +uchar		NetServerEther[6] =  			{ 0, 0, 0, 0, 0, 0 }; -IPaddr_t	NetOurIP;		/* Our IP addr (0 = unknown)		*/ -IPaddr_t	NetServerIP;		/* Server IP addr (0 = unknown)		*/ -volatile uchar *NetRxPacket;		/* Current receive packet		*/ -int		NetRxPacketLen;		/* Current rx packet length		*/ -unsigned	NetIPID;		/* IP packet ID				*/ -uchar		NetBcastAddr[6] =	/* Ethernet bcast address		*/ +/* Our IP addr (0 = unknown) */ +IPaddr_t	NetOurIP; +/* Server IP addr (0 = unknown) */ +IPaddr_t	NetServerIP; +/* Current receive packet */ +volatile uchar *NetRxPacket; +/* Current rx packet length */ +int		NetRxPacketLen; +/* IP packet ID */ +unsigned	NetIPID; +/* Ethernet bcast address */ +uchar		NetBcastAddr[6] =  			{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };  uchar		NetEtherNullAddr[6] =  			{ 0, 0, 0, 0, 0, 0 }; @@ -149,24 +167,33 @@ uchar		NetEtherNullAddr[6] =  void		(*push_packet)(volatile void *, int len) = 0;  #endif  #if defined(CONFIG_CMD_CDP) -uchar		NetCDPAddr[6] =		/* Ethernet bcast address		*/ +/* Ethernet bcast address */ +uchar		NetCDPAddr[6] =  			{ 0x01, 0x00, 0x0c, 0xcc, 0xcc, 0xcc };  #endif -int		NetState;		/* Network loop state			*/ +/* Network loop state */ +int		NetState;  #ifdef CONFIG_NET_MULTI -int		NetRestartWrap = 0;	/* Tried all network devices		*/ -static int	NetRestarted = 0;	/* Network loop restarted		*/ -static int	NetDevExists = 0;	/* At least one device configured	*/ +/* Tried all network devices */ +int		NetRestartWrap = 0; +/* Network loop restarted */ +static int	NetRestarted = 0; +/* At least one device configured */ +static int	NetDevExists = 0;  #endif  /* XXX in both little & big endian machines 0xFFFF == ntohs(-1) */ -ushort		NetOurVLAN = 0xFFFF;		/* default is without VLAN	*/ -ushort		NetOurNativeVLAN = 0xFFFF;	/* ditto			*/ +/* default is without VLAN */ +ushort		NetOurVLAN = 0xFFFF; +/* ditto */ +ushort		NetOurNativeVLAN = 0xFFFF; -char		BootFile[128];		/* Boot File name			*/ +/* Boot File name */ +char		BootFile[128];  #if defined(CONFIG_CMD_PING) -IPaddr_t	NetPingIP;		/* the ip address to ping		*/ +/* the ip address to ping */ +IPaddr_t	NetPingIP;  static void PingStart(void);  #endif @@ -176,8 +203,10 @@ static void CDPStart(void);  #endif  #if defined(CONFIG_CMD_SNTP) -IPaddr_t	NetNtpServerIP;		/* NTP server IP address		*/ -int		NetTimeOffset=0;	/* offset time from UTC			*/ +/* NTP server IP address */ +IPaddr_t	NetNtpServerIP; +/* offset time from UTC */ +int		NetTimeOffset=0;  #endif  #ifdef CONFIG_NETCONSOLE @@ -187,13 +216,19 @@ int nc_input_packet(uchar *pkt, unsigned dest, unsigned src, unsigned len);  volatile uchar	PktBuf[(PKTBUFSRX+1) * PKTSIZE_ALIGN + PKTALIGN]; -volatile uchar *NetRxPackets[PKTBUFSRX]; /* Receive packets			*/ +/* Receive packet */ +volatile uchar *NetRxPackets[PKTBUFSRX]; -static rxhand_f *packetHandler;		/* Current RX packet handler		*/ -static thand_f *timeHandler;		/* Current timeout handler		*/ -static ulong	timeStart;		/* Time base value			*/ -static ulong	timeDelta;		/* Current timeout value		*/ -volatile uchar *NetTxPacket = 0;	/* THE transmit packet			*/ +/* Current RX packet handler */ +static rxhand_f *packetHandler; +/* Current timeout handler */ +static thand_f *timeHandler; +/* Time base value */ +static ulong	timeStart; +/* Current timeout value */ +static ulong	timeDelta; +/* THE transmit packet */ +volatile uchar *NetTxPacket = 0;  static int net_check_prereq (proto_t protocol); @@ -203,8 +238,10 @@ static int NetTryCount;  IPaddr_t	NetArpWaitPacketIP;  IPaddr_t	NetArpWaitReplyIP; -uchar	       *NetArpWaitPacketMAC;	/* MAC address of waiting packet's destination	*/ -uchar	       *NetArpWaitTxPacket;	/* THE transmit packet			*/ +/* MAC address of waiting packet's destination */ +uchar	       *NetArpWaitPacketMAC; +/* THE transmit packet */ +uchar	       *NetArpWaitTxPacket;  int		NetArpWaitTxPacketSize;  uchar		NetArpWaitPacketBuf[PKTSIZE_ALIGN + PKTALIGN];  ulong		NetArpWaitTimerStart; @@ -230,10 +267,13 @@ void ArpRequest (void)  	arp->ar_pln = 4;  	arp->ar_op = htons (ARPOP_REQUEST); -	memcpy (&arp->ar_data[0], NetOurEther, 6);		/* source ET addr	*/ -	NetWriteIP ((uchar *) & arp->ar_data[6], NetOurIP);	/* source IP addr	*/ +	/* source ET addr */ +	memcpy (&arp->ar_data[0], NetOurEther, 6); +	/* source IP addr */ +	NetWriteIP ((uchar *) & arp->ar_data[6], NetOurIP);  	for (i = 10; i < 16; ++i) { -		arp->ar_data[i] = 0;				/* dest ET addr = 0     */ +		/* dest ET addr = 0 */ +		arp->ar_data[i] = 0;  	}  	if ((NetArpWaitPacketIP & NetOurSubnetMask) != @@ -449,7 +489,9 @@ restart:  	}  #if defined(CONFIG_MII) || defined(CONFIG_CMD_MII) -#if defined(CONFIG_SYS_FAULT_ECHO_LINK_DOWN) && defined(CONFIG_STATUS_LED) && defined(STATUS_LED_RED) +#if	defined(CONFIG_SYS_FAULT_ECHO_LINK_DOWN)	&& \ +	defined(CONFIG_STATUS_LED)			&& \ +	defined(STATUS_LED_RED)  	/*  	 * Echo the inverted link state to the fault LED.  	 */ @@ -504,7 +546,8 @@ restart:  			/*  			 * Echo the inverted link state to the fault LED.  			 */ -			if(miiphy_link(eth_get_dev()->name, CONFIG_SYS_FAULT_MII_ADDR)) { +			if(miiphy_link(eth_get_dev()->name, +				       CONFIG_SYS_FAULT_MII_ADDR)) {  				status_led_set (STATUS_LED_RED, STATUS_LED_OFF);  			} else {  				status_led_set (STATUS_LED_RED, STATUS_LED_ON); @@ -655,7 +698,10 @@ NetSendUDPPacket(uchar *ether, IPaddr_t dest, int dport, int sport, int len)  	if (dest == 0xFFFFFFFF)  		ether = NetBcastAddr; -	/* if MAC address was not discovered yet, save the packet and do an ARP request */ +	/* +	 * if MAC address was not discovered yet, save the packet and do +	 * an ARP request +	 */  	if (memcmp(ether, NetEtherNullAddr, 6) == 0) {  		debug("sending ARP for %08lx\n", dest); @@ -667,10 +713,12 @@ NetSendUDPPacket(uchar *ether, IPaddr_t dest, int dport, int sport, int len)  		pkt += NetSetEther (pkt, NetArpWaitPacketMAC, PROT_IP);  		NetSetIP (pkt, dest, dport, sport, len); -		memcpy(pkt + IP_HDR_SIZE, (uchar *)NetTxPacket + (pkt - (uchar *)NetArpWaitTxPacket) + IP_HDR_SIZE, len); +		memcpy(pkt + IP_HDR_SIZE, (uchar *)NetTxPacket + +		       (pkt - (uchar *)NetArpWaitTxPacket) + IP_HDR_SIZE, len);  		/* size of the waiting packet */ -		NetArpWaitTxPacketSize = (pkt - NetArpWaitTxPacket) + IP_HDR_SIZE + len; +		NetArpWaitTxPacketSize = (pkt - NetArpWaitTxPacket) + +			IP_HDR_SIZE + len;  		/* and do the ARP request */  		NetArpWaitTry = 1; @@ -714,9 +762,11 @@ int PingSend(void)  	ip = (volatile IP_t *)pkt;  	/* -	 *	Construct an IP and ICMP header.  (need to set no fragment bit - XXX) +	 * Construct an IP and ICMP header. +	 * (need to set no fragment bit - XXX)  	 */ -	ip->ip_hl_v  = 0x45;		/* IP_HDR_SIZE / 4 (not including UDP) */ +	/* IP_HDR_SIZE / 4 (not including UDP) */ +	ip->ip_hl_v  = 0x45;  	ip->ip_tos   = 0;  	ip->ip_len   = htons(IP_HDR_SIZE_NO_UDP + 8);  	ip->ip_id    = htons(NetIPID++); @@ -724,8 +774,10 @@ int PingSend(void)  	ip->ip_ttl   = 255;  	ip->ip_p     = 0x01;		/* ICMP */  	ip->ip_sum   = 0; -	NetCopyIP((void*)&ip->ip_src, &NetOurIP); /* already in network byte order */ -	NetCopyIP((void*)&ip->ip_dst, &NetPingIP);	   /* - "" - */ +	/* already in network byte order */ +	NetCopyIP((void*)&ip->ip_src, &NetOurIP); +	/* - "" - */ +	NetCopyIP((void*)&ip->ip_dst, &NetPingIP);  	ip->ip_sum   = ~NetCksum((uchar *)ip, IP_HDR_SIZE_NO_UDP / 2);  	s = &ip->udp_src;		/* XXX ICMP starts here */ @@ -736,7 +788,8 @@ int PingSend(void)  	s[1] = ~NetCksum((uchar *)s, 8/2);  	/* size of the waiting packet */ -	NetArpWaitTxPacketSize = (pkt - NetArpWaitTxPacket) + IP_HDR_SIZE_NO_UDP + 8; +	NetArpWaitTxPacketSize = +		(pkt - NetArpWaitTxPacket) + IP_HDR_SIZE_NO_UDP + 8;  	/* and do the ARP request */  	NetArpWaitTry = 1; @@ -798,7 +851,8 @@ static int CDPOK;  ushort CDPNativeVLAN;  ushort CDPApplianceVLAN; -static const uchar CDP_SNAP_hdr[8] = { 0xAA, 0xAA, 0x03, 0x00, 0x00, 0x0C, 0x20, 0x00 }; +static const uchar CDP_SNAP_hdr[8] = { 0xAA, 0xAA, 0x03, 0x00, 0x00, 0x0C, 0x20, +				       0x00 };  static ushort CDP_compute_csum(const uchar *buff, ushort len)  { @@ -829,13 +883,15 @@ static ushort CDP_compute_csum(const uchar *buff, ushort len)  			 * CDP uses the IP checksum algorithm with a twist;  			 * for the last byte it *sign* extends and sums.  			 */ -			result = (result & 0xffff0000) | ((result + leftover) & 0x0000ffff); +			result = (result & 0xffff0000) | +				 ((result + leftover) & 0x0000ffff);  		}  		while (result >> 16)  			result = (result & 0xFFFF) + (result >> 16);  		if (odd) -			result = ((result >> 8) & 0xff) | ((result & 0xff) << 8); +			result = ((result >> 8) & 0xff) | +				 ((result & 0xff) << 8);  	}  	/* add up 16-bit and 17-bit words for 17+c bits */ @@ -888,7 +944,8 @@ int CDPSendTrigger(void)  	*pkt++ = 180;				/* TTL */  	s = (volatile ushort *)pkt;  	cp = s; -	*s++ = htons(0);			/* checksum (0 for later calculation) */ +	/* checksum (0 for later calculation) */ +	*s++ = htons(0);  	/* CDP fields */  #ifdef CONFIG_CDP_DEVICE_ID @@ -960,7 +1017,8 @@ int CDPSendTrigger(void)  	et->et_protlen = htons(len);  	len = ETHER_HDR_SIZE + sizeof(CDP_SNAP_hdr); -	chksum = CDP_compute_csum((uchar *)NetTxPacket + len, (uchar *)s - (NetTxPacket + len)); +	chksum = CDP_compute_csum((uchar *)NetTxPacket + len, +				  (uchar *)s - (NetTxPacket + len));  	if (chksum == 0)  		chksum = 0xFFFF;  	*cp = htons(chksum); @@ -1018,7 +1076,10 @@ CDPHandler(const uchar * pkt, unsigned len)  	if (pkt[0] < 0x02 || pkt[1] == 0)  		return; -	/* if version is greater than 0x02 maybe we'll have a problem; output a warning */ +	/* +	 * if version is greater than 0x02 maybe we'll have a problem; +	 * output a warning +	 */  	if (pkt[0] != 0x02)  		printf("** WARNING: CDP packet received with a protocol version %d > 2\n",  				pkt[0] & 0xff); @@ -1074,10 +1135,12 @@ CDPHandler(const uchar * pkt, unsigned len)  					ss = (const ushort *)(t + 1);  #ifdef CONFIG_CDP_APPLIANCE_VLAN_TYPE -					if (applid == CONFIG_CDP_APPLIANCE_VLAN_TYPE) +					if (applid == +					    CONFIG_CDP_APPLIANCE_VLAN_TYPE)  						vlan = *ss;  #else -					vlan = ntohs(*ss);	/* XXX will this work; dunno */ +					/* XXX will this work; dunno */ +					vlan = ntohs(*ss);  #endif  					t += 3; tlen -= 3;  				} @@ -1440,7 +1503,8 @@ NetReceive(volatile uchar * inpkt, int len)  		}  		switch (ntohs(arp->ar_op)) { -		case ARPOP_REQUEST:		/* reply with our IP address	*/ +		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); @@ -1449,7 +1513,8 @@ NetReceive(volatile uchar * inpkt, int len)  			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); +			(void) eth_send((uchar *)et, +					(pkt - (uchar *)et) + ARP_HDR_SIZE);  			return;  		case ARPOP_REPLY:		/* arp reply */ @@ -1474,14 +1539,16 @@ NetReceive(volatile uchar * inpkt, int len)  			if (tmp == NetArpWaitReplyIP) {  				debug("Got it\n");  				/* save address for later use */ -				memcpy(NetArpWaitPacketMAC, &arp->ar_data[0], 6); +				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); +				(void) eth_send(NetArpWaitTxPacket, +						NetArpWaitTxPacketSize);  				/* no arp request pending now */  				NetArpWaitPacketIP = 0; @@ -1491,7 +1558,8 @@ NetReceive(volatile uchar * inpkt, int len)  			}  			return;  		default: -			debug("Unexpected ARP opcode 0x%x\n", ntohs(arp->ar_op)); +			debug("Unexpected ARP opcode 0x%x\n", +			      ntohs(arp->ar_op));  			return;  		}  		break; @@ -1590,19 +1658,20 @@ NetReceive(volatile uchar * inpkt, int len)  			case ICMP_REDIRECT:  				if (icmph->code != ICMP_REDIR_HOST)  					return; -				printf (" ICMP Host Redirect to %pI4 ", &icmph->un.gateway); +				printf (" ICMP Host Redirect to %pI4 ", +					&icmph->un.gateway);  				return;  #if defined(CONFIG_CMD_PING)  			case ICMP_ECHO_REPLY:  				/* -				 *	IP header OK.  Pass the packet to the current handler. +				 * IP header OK.  Pass the packet to the +				 * current handler.  				 */  				/* XXX point to ip packet */  				(*packetHandler)((uchar *)ip, 0, src_ip, 0, 0);  				return;  			case ICMP_ECHO_REQUEST: -				debug("Got ICMP ECHO REQUEST, " -				      "return %d bytes\n", +				debug("Got ICMP ECHO REQUEST, return %d bytes\n",  				      ETHER_HDR_SIZE + len);  				memcpy (&et->et_dest[0], &et->et_src[0], 6); @@ -1612,13 +1681,15 @@ NetReceive(volatile uchar * inpkt, int len)  				ip->ip_off = 0;  				NetCopyIP((void*)&ip->ip_dst, &ip->ip_src);  				NetCopyIP((void*)&ip->ip_src, &NetOurIP); -				ip->ip_sum = ~NetCksum((uchar *)ip, IP_HDR_SIZE_NO_UDP >> 1); +				ip->ip_sum = ~NetCksum((uchar *)ip, +						       IP_HDR_SIZE_NO_UDP >> 1);  				icmph->type = ICMP_ECHO_REPLY;  				icmph->checksum = 0;  				icmph->checksum = ~NetCksum((uchar *)icmph, -						(len - IP_HDR_SIZE_NO_UDP) >> 1); -				(void) eth_send((uchar *)et, ETHER_HDR_SIZE + len); +					(len - IP_HDR_SIZE_NO_UDP) >> 1); +				(void) eth_send((uchar *)et, +						ETHER_HDR_SIZE + len);  				return;  #endif  			default: @@ -1659,7 +1730,8 @@ NetReceive(volatile uchar * inpkt, int len)  				xsum += sumdata;  			}  			while ((xsum >> 16) != 0) { -				xsum = (xsum & 0x0000ffff) + ((xsum >> 16) & 0x0000ffff); +				xsum = (xsum & 0x0000ffff) + +				       ((xsum >> 16) & 0x0000ffff);  			}  			if ((xsum != 0x00000000) && (xsum != 0x0000ffff)) {  				printf(" UDP wrong checksum %08lx %08x\n", @@ -1809,7 +1881,8 @@ NetEthHdrSize(void)  	if (myvlanid == (ushort)-1)  		myvlanid = VLAN_NONE; -	return ((myvlanid & VLAN_IDMASK) == VLAN_NONE) ? ETHER_HDR_SIZE : VLAN_ETHER_HDR_SIZE; +	return ((myvlanid & VLAN_IDMASK) == VLAN_NONE) ? ETHER_HDR_SIZE : +		VLAN_ETHER_HDR_SIZE;  }  int @@ -1854,7 +1927,8 @@ NetSetIP(volatile uchar * xip, IPaddr_t dest, int dport, int sport, int len)  	 *	Construct an IP and UDP header.  	 *	(need to set no fragment bit - XXX)  	 */ -	ip->ip_hl_v  = 0x45;		/* IP_HDR_SIZE / 4 (not including UDP) */ +	/* IP_HDR_SIZE / 4 (not including UDP) */ +	ip->ip_hl_v  = 0x45;  	ip->ip_tos   = 0;  	ip->ip_len   = htons(IP_HDR_SIZE + len);  	ip->ip_id    = htons(NetIPID++); @@ -1862,8 +1936,10 @@ 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; -	NetCopyIP((void*)&ip->ip_src, &NetOurIP); /* already in network byte order */ -	NetCopyIP((void*)&ip->ip_dst, &dest);	   /* - "" - */ +	/* already in network byte order */ +	NetCopyIP((void*)&ip->ip_src, &NetOurIP); +	/* - "" - */ +	NetCopyIP((void*)&ip->ip_dst, &dest);  	ip->udp_src  = htons(sport);  	ip->udp_dst  = htons(dport);  	ip->udp_len  = htons(8 + len); @@ -1884,7 +1960,9 @@ void copy_filename (char *dst, const char *src, int size)  	*dst = '\0';  } -#if defined(CONFIG_CMD_NFS) || defined(CONFIG_CMD_SNTP) || defined(CONFIG_CMD_DNS) +#if	defined(CONFIG_CMD_NFS)		|| \ +	defined(CONFIG_CMD_SNTP)	|| \ +	defined(CONFIG_CMD_DNS)  /*   * make port a little random (1024-17407)   * This keeps the math somewhat trivial to compute, and seems to work with |