9
0
Fork 0

svn_rev_108

removed ifdefs, moved ping to own file, fix timeout handler
This commit is contained in:
Sascha Hauer 2007-07-05 18:01:23 +02:00 committed by Sascha Hauer
parent 3533c30ef4
commit 11a0b5a0dd
8 changed files with 106 additions and 678 deletions

View File

@ -1,7 +1,8 @@
obj-y += bootp.o
obj-y += eth.o
obj-y += net.o
obj-y += nfs.o
obj-y += rarp.o
obj-y += sntp.o
obj-y += tftp.o
obj-$(CONFIG_NET) += bootp.o
obj-$(CONFIG_NET) += eth.o
obj-$(CONFIG_NET) += net.o
obj-$(CONFIG_NET_NFS) += nfs.o
obj-$(CONFIG_NET_RARP) += rarp.o
obj-$(CONFIG_NET_SNTP) += sntp.o
obj-$(CONFIG_NET_TFTP) += tftp.o
obj-$(CONFIG_NET_PING) += ping.o

View File

@ -28,8 +28,6 @@
#define BOOTP_VENDOR_MAGIC 0x63825363 /* RFC1048 Magic Cookie */
#if (CONFIG_COMMANDS & CFG_CMD_NET)
#define TIMEOUT 5 /* Seconds before trying BOOTP again */
#ifndef CONFIG_NET_RETRY_COUNT
# define TIMEOUT_COUNT 5 /* # of timeouts before giving up */
@ -50,7 +48,7 @@ int BootpTry;
ulong seed1, seed2;
#endif
#if (CONFIG_COMMANDS & CFG_CMD_DHCP)
#ifdef CONFIG_NET_DHCP
dhcp_state_t dhcp_state = INIT;
unsigned long dhcp_leasetime = 0;
IPaddr_t NetDHCPServerIP = 0;
@ -291,7 +289,6 @@ static void
BootpHandler(uchar * pkt, unsigned dest, unsigned src, unsigned len)
{
Bootp_t *bp;
char *s;
debug ("got BOOTP packet (src=%d, dst=%d, len=%d want_len=%d)\n",
src, dest, len, sizeof (Bootp_t));
@ -333,7 +330,7 @@ BootpTimeout(void)
puts ("\nRetry count exceeded; starting again\n");
NetStartAgain ();
} else {
NetSetTimeout (TIMEOUT * CFG_HZ, BootpTimeout);
NetSetTimeout (TIMEOUT * SECOND, BootpTimeout);
BootpRequest ();
}
}
@ -341,7 +338,7 @@ BootpTimeout(void)
/*
* Initialize BOOTP extension fields in the request.
*/
#if (CONFIG_COMMANDS & CFG_CMD_DHCP)
#ifdef CONFIG_NET_DHCP
static int DhcpExtended (u8 * e, int message_type, IPaddr_t ServerID, IPaddr_t RequestedIP)
{
u8 *start = e;
@ -468,7 +465,7 @@ static int BootpExtended (u8 * e)
*e++ = 83;
*e++ = 99;
#if (CONFIG_COMMANDS & CFG_CMD_DHCP)
#ifdef CONFIG_NET_DHCP
*e++ = 53; /* DHCP Message Type */
*e++ = 1;
*e++ = DHCP_DISCOVER;
@ -534,84 +531,10 @@ BootpRequest (void)
Bootp_t *bp;
int ext_len, pktlen, iplen;
#if (CONFIG_COMMANDS & CFG_CMD_DHCP)
#ifdef CONFIG_NET_DHCP
dhcp_state = INIT;
#endif
#ifdef CONFIG_BOOTP_RANDOM_DELAY /* Random BOOTP delay */
unsigned char bi_enetaddr[6];
int reg;
char *e,*s;
char tmp[64];
ulong tst1, tst2, sum, m_mask, m_value = 0;
if (BootpTry ==0) {
/* get our mac */
reg = getenv_r ("ethaddr", tmp, sizeof(tmp));
s = (reg > 0) ? tmp : NULL;
for (reg=0; reg<6; ++reg) {
bi_enetaddr[reg] = s ? simple_strtoul(s, &e, 16) : 0;
if (s) {
s = (*e) ? e+1 : e;
}
}
#ifdef DEBUG
puts ("BootpRequest => Our Mac: ");
for (reg=0; reg<6; reg++) {
printf ("%x%c",
bi_enetaddr[reg],
reg==5 ? '\n' : ':');
}
#endif /* DEBUG */
/* Mac-Manipulation 2 get seed1 */
tst1=0;
tst2=0;
for (reg=2; reg<6; reg++) {
tst1 = tst1 << 8;
tst1 = tst1 | bi_enetaddr[reg];
}
for (reg=0; reg<2; reg++) {
tst2 = tst2 | bi_enetaddr[reg];
tst2 = tst2 << 8;
}
seed1 = tst1^tst2;
/* Mirror seed1*/
m_mask=0x1;
for (reg=1;reg<=32;reg++) {
m_value |= (m_mask & seed1);
seed1 = seed1 >> 1;
m_value = m_value << 1;
}
seed1 = m_value;
seed2 = 0xB78D0945;
}
/* Random Number Generator */
for (reg=0;reg<=0;reg++) {
sum = seed1 + seed2;
if (sum < seed1 || sum < seed2)
sum++;
seed2 = seed1;
seed1 = sum;
if (BootpTry<=2) { /* Start with max 1024 * 1ms */
sum = sum >> (22-BootpTry);
} else { /*After 3rd BOOTP request max 8192 * 1ms */
sum = sum >> 19;
}
}
printf ("Random delay: %ld ms...\n", sum);
for (reg=0; reg <sum; reg++) {
udelay(1000); /*Wait 1ms*/
}
#endif /* CONFIG_BOOTP_RANDOM_DELAY */
printf("BOOTP broadcast %d\n", ++BootpTry);
pkt = NetTxPacket;
memset ((void*)pkt, 0, PKTSIZE);
@ -634,6 +557,7 @@ BootpRequest (void)
bp->bp_hlen = HWL_ETHER;
bp->bp_hops = 0;
/* FIXME what is this? */
#warning this is broken
// bp->bp_secs = htons(get_timer(0) / CFG_HZ);
NetWriteIP(&bp->bp_ciaddr, 0);
NetWriteIP(&bp->bp_yiaddr, 0);
@ -643,7 +567,7 @@ 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)
#ifdef CONFIG_NET_DHCP
ext_len = DhcpExtended((u8 *)bp->bp_vend, DHCP_DISCOVER, 0, 0);
#else
ext_len = BootpExtended((u8 *)bp->bp_vend);
@ -668,9 +592,9 @@ 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);
NetSetTimeout(SELECT_TIMEOUT * CFG_HZ, BootpTimeout);
NetSetTimeout(SELECT_TIMEOUT * SECOND, BootpTimeout);
#if (CONFIG_COMMANDS & CFG_CMD_DHCP)
#ifdef CONFIG_NET_DHCP
dhcp_state = SELECTING;
NetSetHandler(DhcpHandler);
#else
@ -679,7 +603,7 @@ BootpRequest (void)
NetSendPacket(NetTxPacket, pktlen);
}
#if (CONFIG_COMMANDS & CFG_CMD_DHCP)
#ifdef CONFIG_NET_DHCP
static void DhcpOptionsProcess (uchar * popt, Bootp_t *bp)
{
uchar *end = popt + BOOTP_HDR_SIZE;
@ -885,7 +809,7 @@ DhcpHandler(uchar * pkt, unsigned dest, unsigned src, unsigned len)
BootpCopyNetParams(bp); /* Store net params from reply */
NetSetTimeout(TIMEOUT * CFG_HZ, BootpTimeout);
NetSetTimeout(TIMEOUT * SECOND, BootpTimeout);
DhcpSendRequestPkt(bp);
#ifdef CFG_BOOTFILE_PREFIX
}
@ -924,4 +848,3 @@ void DhcpRequest(void)
}
#endif /* CFG_CMD_DHCP */
#endif /* CFG_CMD_NET */

393
net/eth.c
View File

@ -26,392 +26,6 @@
#include <net.h>
#include <miiphy.h>
#if (CONFIG_COMMANDS & CFG_CMD_NET) && defined(CONFIG_NET_MULTI)
#ifdef CFG_GT_6426x
extern int gt6426x_eth_initialize(bd_t *bis);
#endif
extern int au1x00_enet_initialize(bd_t*);
extern int dc21x4x_initialize(bd_t*);
extern int e1000_initialize(bd_t*);
extern int eepro100_initialize(bd_t*);
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 mpc8220_fec_initialize(bd_t*);
extern int mv6436x_eth_initialize(bd_t *);
extern int mv6446x_eth_initialize(bd_t *);
extern int natsemi_initialize(bd_t*);
extern int ns8382x_initialize(bd_t*);
extern int pcnet_initialize(bd_t*);
extern int plb2800_eth_initialize(bd_t*);
extern int ppc_4xx_eth_initialize(bd_t *);
extern int rtl8139_initialize(bd_t*);
extern int rtl8169_initialize(bd_t*);
extern int scc_initialize(bd_t*);
extern int skge_initialize(bd_t*);
extern int tsec_initialize(bd_t*, int, char *);
extern int npe_initialize(bd_t *);
extern int uec_initialize(int);
struct eth_device *eth_get_dev(void)
{
return eth_current;
}
struct eth_device *eth_get_dev_by_name(char *devname)
{
struct eth_device *dev, *target_dev;
if (!eth_devices)
return NULL;
dev = eth_devices;
target_dev = NULL;
do {
if (strcmp(devname, dev->name) == 0) {
target_dev = dev;
break;
}
dev = dev->next;
} while (dev != eth_devices);
return target_dev;
}
int eth_get_dev_index (void)
{
struct eth_device *dev;
int num = 0;
if (!eth_devices) {
return (-1);
}
for (dev = eth_devices; dev; dev = dev->next) {
if (dev == eth_current)
break;
++num;
}
if (dev) {
return (num);
}
return (0);
}
int eth_register(struct eth_device* dev)
{
struct eth_device *d;
if (!eth_devices) {
eth_current = eth_devices = dev;
#ifdef CONFIG_NET_MULTI
/* update current ethernet name */
{
char *act = getenv("ethact");
if (act == NULL || strcmp(act, eth_current->name) != 0)
setenv("ethact", eth_current->name);
}
#endif
} else {
for (d=eth_devices; d->next!=eth_devices; d=d->next);
d->next = dev;
}
dev->state = ETH_STATE_INIT;
dev->next = eth_devices;
return 0;
}
int eth_initialize(bd_t *bis)
{
char enetvar[32], env_enetaddr[6];
int i, eth_number = 0;
char *tmp, *end;
eth_devices = NULL;
eth_current = NULL;
#if defined(CONFIG_MII) || (CONFIG_COMMANDS & CFG_CMD_MII)
miiphy_init();
#endif
#if defined(CONFIG_DB64360) || defined(CONFIG_CPCI750)
mv6436x_eth_initialize(bis);
#endif
#if defined(CONFIG_DB64460) || defined(CONFIG_P3Mx)
mv6446x_eth_initialize(bis);
#endif
#if defined(CONFIG_4xx) && !defined(CONFIG_IOP480) && !defined(CONFIG_AP1000)
ppc_4xx_eth_initialize(bis);
#endif
#ifdef CONFIG_INCA_IP_SWITCH
inca_switch_initialize(bis);
#endif
#ifdef CONFIG_PLB2800_ETHER
plb2800_eth_initialize(bis);
#endif
#ifdef SCC_ENET
scc_initialize(bis);
#endif
#if defined(CONFIG_MPC5xxx_FEC)
mpc5xxx_fec_initialize(bis);
#endif
#if defined(CONFIG_MPC8220_FEC)
mpc8220_fec_initialize(bis);
#endif
#if defined(CONFIG_SK98)
skge_initialize(bis);
#endif
#if defined(CONFIG_MPC85XX_TSEC1)
tsec_initialize(bis, 0, CONFIG_MPC85XX_TSEC1_NAME);
#elif defined(CONFIG_MPC83XX_TSEC1)
tsec_initialize(bis, 0, CONFIG_MPC83XX_TSEC1_NAME);
#endif
#if defined(CONFIG_MPC85XX_TSEC2)
tsec_initialize(bis, 1, CONFIG_MPC85XX_TSEC2_NAME);
#elif defined(CONFIG_MPC83XX_TSEC2)
tsec_initialize(bis, 1, CONFIG_MPC83XX_TSEC2_NAME);
#endif
#if defined(CONFIG_MPC85XX_FEC)
tsec_initialize(bis, 2, CONFIG_MPC85XX_FEC_NAME);
#else
# if defined(CONFIG_MPC85XX_TSEC3)
tsec_initialize(bis, 2, CONFIG_MPC85XX_TSEC3_NAME);
# elif defined(CONFIG_MPC83XX_TSEC3)
tsec_initialize(bis, 2, CONFIG_MPC83XX_TSEC3_NAME);
# endif
# if defined(CONFIG_MPC85XX_TSEC4)
tsec_initialize(bis, 3, CONFIG_MPC85XX_TSEC4_NAME);
# elif defined(CONFIG_MPC83XX_TSEC4)
tsec_initialize(bis, 3, CONFIG_MPC83XX_TSEC4_NAME);
# endif
#endif
#if defined(CONFIG_UEC_ETH1)
uec_initialize(0);
#endif
#if defined(CONFIG_UEC_ETH2)
uec_initialize(1);
#endif
#if defined(CONFIG_MPC86XX_TSEC1)
tsec_initialize(bis, 0, CONFIG_MPC86XX_TSEC1_NAME);
#endif
#if defined(CONFIG_MPC86XX_TSEC2)
tsec_initialize(bis, 1, CONFIG_MPC86XX_TSEC2_NAME);
#endif
#if defined(CONFIG_MPC86XX_TSEC3)
tsec_initialize(bis, 2, CONFIG_MPC86XX_TSEC3_NAME);
#endif
#if defined(CONFIG_MPC86XX_TSEC4)
tsec_initialize(bis, 3, CONFIG_MPC86XX_TSEC4_NAME);
#endif
#if defined(FEC_ENET) || defined(CONFIG_ETHER_ON_FCC)
fec_initialize(bis);
#endif
#if defined(CONFIG_AU1X00)
au1x00_enet_initialize(bis);
#endif
#if defined(CONFIG_IXP4XX_NPE)
npe_initialize(bis);
#endif
#ifdef CONFIG_E1000
e1000_initialize(bis);
#endif
#ifdef CONFIG_EEPRO100
eepro100_initialize(bis);
#endif
#ifdef CONFIG_TULIP
dc21x4x_initialize(bis);
#endif
#ifdef CONFIG_3COM
eth_3com_initialize(bis);
#endif
#ifdef CONFIG_PCNET
pcnet_initialize(bis);
#endif
#ifdef CFG_GT_6426x
gt6426x_eth_initialize(bis);
#endif
#ifdef CONFIG_NATSEMI
natsemi_initialize(bis);
#endif
#ifdef CONFIG_NS8382X
ns8382x_initialize(bis);
#endif
#if defined(CONFIG_RTL8139)
rtl8139_initialize(bis);
#endif
#if defined(CONFIG_RTL8169)
rtl8169_initialize(bis);
#endif
if (!eth_devices) {
puts ("No ethernet found.\n");
} else {
struct eth_device *dev = eth_devices;
char *ethprime = getenv ("ethprime");
do {
if (eth_number)
puts (", ");
printf("%s", dev->name);
if (ethprime && strcmp (dev->name, ethprime) == 0) {
eth_current = dev;
puts (" [PRIME]");
}
sprintf(enetvar, eth_number ? "eth%daddr" : "ethaddr", eth_number);
tmp = getenv (enetvar);
for (i=0; i<6; i++) {
env_enetaddr[i] = tmp ? simple_strtoul(tmp, &end, 16) : 0;
if (tmp)
tmp = (*end) ? end+1 : end;
}
if (memcmp(env_enetaddr, "\0\0\0\0\0\0", 6)) {
if (memcmp(dev->enetaddr, "\0\0\0\0\0\0", 6) &&
memcmp(dev->enetaddr, env_enetaddr, 6))
{
printf ("\nWarning: %s MAC addresses don't match:\n",
dev->name);
printf ("Address in SROM is "
"%02X:%02X:%02X:%02X:%02X:%02X\n",
dev->enetaddr[0], dev->enetaddr[1],
dev->enetaddr[2], dev->enetaddr[3],
dev->enetaddr[4], dev->enetaddr[5]);
printf ("Address in environment is "
"%02X:%02X:%02X:%02X:%02X:%02X\n",
env_enetaddr[0], env_enetaddr[1],
env_enetaddr[2], env_enetaddr[3],
env_enetaddr[4], env_enetaddr[5]);
}
memcpy(dev->enetaddr, env_enetaddr, 6);
}
eth_number++;
dev = dev->next;
} while(dev != eth_devices);
#ifdef CONFIG_NET_MULTI
/* update current ethernet name */
if (eth_current) {
char *act = getenv("ethact");
if (act == NULL || strcmp(act, eth_current->name) != 0)
setenv("ethact", eth_current->name);
} else
setenv("ethact", NULL);
#endif
putc ('\n');
}
return eth_number;
}
void eth_set_enetaddr(int num, char *addr) {
struct eth_device *dev;
unsigned char enetaddr[6];
char *end;
int i;
debug ("eth_set_enetaddr(num=%d, addr=%s)\n", num, addr);
if (!eth_devices)
return;
for (i=0; i<6; i++) {
enetaddr[i] = addr ? simple_strtoul(addr, &end, 16) : 0;
if (addr)
addr = (*end) ? end+1 : end;
}
dev = eth_devices;
while(num-- > 0) {
dev = dev->next;
if (dev == eth_devices)
return;
}
debug ( "Setting new HW address on %s\n"
"New Address is %02X:%02X:%02X:%02X:%02X:%02X\n",
dev->name,
enetaddr[0], enetaddr[1],
enetaddr[2], enetaddr[3],
enetaddr[4], enetaddr[5]);
memcpy(dev->enetaddr, enetaddr, 6);
}
void eth_try_another(int first_restart)
{
static struct eth_device *first_failed = NULL;
if (!eth_current)
return;
if (first_restart) {
first_failed = eth_current;
}
eth_current = eth_current->next;
#ifdef CONFIG_NET_MULTI
/* update current ethernet name */
{
char *act = getenv("ethact");
if (act == NULL || strcmp(act, eth_current->name) != 0)
setenv("ethact", eth_current->name);
}
#endif
if (first_failed == eth_current) {
NetRestartWrap = 1;
}
}
#ifdef CONFIG_NET_MULTI
void eth_set_current(void)
{
char *act;
struct eth_device* old_current;
if (!eth_current) /* XXX no current */
return;
act = getenv("ethact");
if (act != NULL) {
old_current = eth_current;
do {
if (strcmp(eth_current->name, act) == 0)
return;
eth_current = eth_current->next;
} while (old_current != eth_current);
}
setenv("ethact", eth_current->name);
}
#endif
char *eth_get_name (void)
{
return (eth_current ? eth_current->name : "unknown");
}
#elif (CONFIG_COMMANDS & CFG_CMD_NET) && !defined(CONFIG_NET_MULTI)
static struct eth_device *eth_current;
void eth_set_current(struct eth_device *eth)
@ -469,7 +83,8 @@ extern int ns7520_miiphy_initialize(bd_t *bis);
int eth_initialize(bd_t *bis)
{
unsigned char ethaddr_tmp[20];
unsigned char *ethaddr, *e = NULL;
unsigned char *ethaddr;
char *e = NULL;
int i;
if (!eth_current) {
@ -504,6 +119,7 @@ int eth_initialize(bd_t *bis)
return -1;
}
printf("got MAC address from Environment: %s\n",ethaddr);
for(i = 0; i < 6; i++) {
eth_current->enetaddr[i] = ethaddr ? simple_strtoul (ethaddr, &e, 16) : 0;
if (ethaddr) {
@ -517,7 +133,7 @@ int eth_initialize(bd_t *bis)
miiphy_init();
#endif
#if defined(CONFIG_AT91RM9200)
#if defined(CONFIG_DRIVER_NET_AT91_ETHER)
at91rm9200_miiphy_initialize(bis);
#endif
#if defined(CONFIG_4xx) && !defined(CONFIG_IOP480) \
@ -532,4 +148,3 @@ int eth_initialize(bd_t *bis)
#endif
return 0;
}
#endif

159
net/net.c
View File

@ -87,12 +87,10 @@
#include <status_led.h>
#include <miiphy.h>
#endif
#if (CONFIG_COMMANDS & CFG_CMD_SNTP)
#ifdef CONFIG_NET_SNTP
#include "sntp.h"
#endif
#if (CONFIG_COMMANDS & CFG_CMD_NET)
DECLARE_GLOBAL_DATA_PTR;
#define ARP_TIMEOUT (5 * SECOND) /* Seconds before trying ARP again */
@ -148,17 +146,17 @@ ushort NetOurNativeVLAN = 0xFFFF; /* ditto */
char BootFile[128]; /* Boot File name */
#if (CONFIG_COMMANDS & CFG_CMD_PING)
#ifdef CONFIG_NET_PING
IPaddr_t NetPingIP; /* the ip address to ping */
static void PingStart(void);
extern void PingStart(void);
#endif
#if (CONFIG_COMMANDS & CFG_CMD_CDP)
static void CDPStart(void);
#endif
#if (CONFIG_COMMANDS & CFG_CMD_SNTP)
#ifdef CONFIG_NET_SNTP
IPaddr_t NetNtpServerIP; /* NTP server IP address */
int NetTimeOffset=0; /* offset time from UTC */
#endif
@ -174,8 +172,8 @@ volatile uchar *NetRxPackets[PKTBUFSRX]; /* Receive packets */
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 */
static uint64_t timeStart; /* Time base value */
static uint64_t timeDelta; /* Current timeout value */
volatile uchar *NetTxPacket = 0; /* THE transmit packet */
static int net_check_prereq (proto_t protocol);
@ -188,7 +186,7 @@ uchar *NetArpWaitPacketMAC; /* MAC address of waiting packet's destinatio
uchar *NetArpWaitTxPacket; /* THE transmit packet */
int NetArpWaitTxPacketSize;
uchar NetArpWaitPacketBuf[PKTSIZE_ALIGN + PKTALIGN];
ulong NetArpWaitTimerStart;
uint64_t NetArpWaitTimerStart;
int NetArpWaitTry;
void ArpRequest (void)
@ -262,8 +260,12 @@ void ArpTimeoutCheck(void)
int
NetLoop(proto_t protocol)
{
IPaddr_t ip;
bd_t *bd = gd->bd;
ip = getenv_IPaddr ("ipaddr");
NetCopyIP(&NetOurIP, &ip);
#ifdef CONFIG_NET_MULTI
NetRestarted = 0;
NetDevExists = 0;
@ -320,37 +322,36 @@ restart:
*/
switch (protocol) {
#if (CONFIG_COMMANDS & CFG_CMD_NFS)
#ifdef CONFIG_NET_NFS
case NFS:
#endif
#if (CONFIG_COMMANDS & CFG_CMD_PING)
#ifdef CONFIG_NET_PING
case PING:
#endif
#if (CONFIG_COMMANDS & CFG_CMD_SNTP)
#ifdef CONFIG_NET_SNTP
case SNTP:
#endif
case NETCONS:
case TFTP:
NetCopyIP(&NetOurIP, &bd->bi_ip_addr);
NetOurGatewayIP = getenv_IPaddr ("gatewayip");
NetOurSubnetMask= getenv_IPaddr ("netmask");
NetOurVLAN = getenv_VLAN("vlan");
NetOurNativeVLAN = getenv_VLAN("nvlan");
switch (protocol) {
#if (CONFIG_COMMANDS & CFG_CMD_NFS)
#ifdef CONFIG_NET_NFS
case NFS:
#endif
case NETCONS:
case TFTP:
NetServerIP = getenv_IPaddr ("serverip");
break;
#if (CONFIG_COMMANDS & CFG_CMD_PING)
#ifdef CONFIG_NET_PING
case PING:
/* nothing */
break;
#endif
#if (CONFIG_COMMANDS & CFG_CMD_SNTP)
#ifdef CONFIG_NET_SNTP
case SNTP:
/* nothing */
break;
@ -395,12 +396,13 @@ restart:
NetDevExists = 1;
#endif
switch (protocol) {
#ifdef CONFIG_NET_TFTP
case TFTP:
/* always use ARP to get server ethernet address */
TftpStart();
break;
#if (CONFIG_COMMANDS & CFG_CMD_DHCP)
#endif
#ifdef CONFIG_NET_DHCP
case DHCP:
/* Start with a clean slate... */
BootpTry = 0;
@ -408,23 +410,24 @@ restart:
NetServerIP = getenv_IPaddr ("serverip");
DhcpRequest(); /* Basically same as BOOTP */
break;
#endif /* CFG_CMD_DHCP */
#endif
case BOOTP:
BootpTry = 0;
BootpRequest ();
break;
#ifdef CONFIG_NET_RARP
case RARP:
RarpTry = 0;
RarpRequest ();
break;
#if (CONFIG_COMMANDS & CFG_CMD_PING)
#endif
#ifdef CONFIG_NET_PING
case PING:
PingStart();
break;
#endif
#if (CONFIG_COMMANDS & CFG_CMD_NFS)
#ifdef CONFIG_NET_NFS
case NFS:
NfsStart();
break;
@ -439,7 +442,7 @@ restart:
NcStart();
break;
#endif
#if (CONFIG_COMMANDS & CFG_CMD_SNTP)
#ifdef CONFIG_NET_SNTP
case SNTP:
SntpStart();
break;
@ -498,7 +501,7 @@ restart:
* Check for a timeout, and run the timeout handler
* if we have one.
*/
if (timeHandler && ((get_time_ns() - timeStart) > timeDelta)) {
if (timeHandler && is_timeout(timeStart, timeDelta)) {
thand_f *x;
#if defined(CONFIG_MII) || (CONFIG_COMMANDS & CFG_CMD_MII)
@ -579,7 +582,7 @@ void NetStartAgain (void)
return;
}
#ifndef CONFIG_NET_MULTI
NetSetTimeout (10 * CFG_HZ, startAgainTimeout);
NetSetTimeout (10 * SECOND, startAgainTimeout);
NetSetHandler (startAgainHandler);
#else /* !CONFIG_NET_MULTI*/
eth_halt ();
@ -588,7 +591,7 @@ void NetStartAgain (void)
if (NetRestartWrap) {
NetRestartWrap = 0;
if (NetDevExists && !once) {
NetSetTimeout (10 * CFG_HZ, startAgainTimeout);
NetSetTimeout (10 * SECOND, startAgainTimeout);
NetSetHandler (startAgainHandler);
} else {
NetState = NETLOOP_FAIL;
@ -681,96 +684,6 @@ NetSendUDPPacket(uchar *ether, IPaddr_t dest, int dport, int sport, int len)
return 0; /* transmitted */
}
#if (CONFIG_COMMANDS & CFG_CMD_PING)
static ushort PingSeqNo;
int PingSend(void)
{
static uchar mac[6];
volatile IP_t *ip;
volatile ushort *s;
uchar *pkt;
/* XXX always send arp request */
memcpy(mac, NetEtherNullAddr, 6);
#ifdef ET_DEBUG
printf("sending ARP for %08lx\n", NetPingIP);
#endif
NetArpWaitPacketIP = NetPingIP;
NetArpWaitPacketMAC = mac;
pkt = NetArpWaitTxPacket;
pkt += NetSetEther(pkt, mac, PROT_IP);
ip = (volatile IP_t *)pkt;
/*
* 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->ip_tos = 0;
ip->ip_len = htons(IP_HDR_SIZE_NO_UDP + 8);
ip->ip_id = htons(NetIPID++);
ip->ip_off = htons(0x4000); /* No fragmentation */
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); /* - "" - */
ip->ip_sum = ~NetCksum((uchar *)ip, IP_HDR_SIZE_NO_UDP / 2);
s = &ip->udp_src; /* XXX ICMP starts here */
s[0] = htons(0x0800); /* echo-request, code */
s[1] = 0; /* checksum */
s[2] = 0; /* identifier */
s[3] = htons(PingSeqNo++); /* sequence number */
s[1] = ~NetCksum((uchar *)s, 8/2);
/* size of the waiting packet */
NetArpWaitTxPacketSize = (pkt - NetArpWaitTxPacket) + IP_HDR_SIZE_NO_UDP + 8;
/* and do the ARP request */
NetArpWaitTry = 1;
NetArpWaitTimerStart = get_time_ns();
ArpRequest();
return 1; /* waiting */
}
static void
PingTimeout (void)
{
eth_halt();
NetState = NETLOOP_FAIL; /* we did not get the reply */
}
static void
PingHandler (uchar * pkt, unsigned dest, unsigned src, unsigned len)
{
IPaddr_t tmp;
volatile IP_t *ip = (volatile IP_t *)pkt;
tmp = NetReadIP((void *)&ip->ip_src);
if (tmp != NetPingIP)
return;
NetState = NETLOOP_SUCCESS;
}
static void PingStart(void)
{
#if defined(CONFIG_NET_MULTI)
printf ("Using %s device\n", eth_get_name());
#endif /* CONFIG_NET_MULTI */
NetSetTimeout (10 * CFG_HZ, PingTimeout);
NetSetHandler (PingHandler);
PingSend();
}
#endif /* CFG_CMD_PING */
#if (CONFIG_COMMANDS & CFG_CMD_CDP)
#define CDP_DEVICE_ID_TLV 0x0001
@ -787,7 +700,7 @@ static void PingStart(void)
#define CDP_SYSOBJECT_TLV 0x0015
#define CDP_MANAGEMENT_ADDRESS_TLV 0x0016
#define CDP_TIMEOUT (CFG_HZ/4) /* one packet every 250ms */
#define CDP_TIMEOUT (250 * MSECOND) /* one packet every 250ms */
static int CDPSeq;
static int CDPOK;
@ -1410,7 +1323,7 @@ NetReceive(volatile uchar * inpkt, int len)
print_IPaddr(icmph->un.gateway);
putc(' ');
return;
#if (CONFIG_COMMANDS & CFG_CMD_PING)
#ifdef CONFIG_NET_PING
case ICMP_ECHO_REPLY:
/*
* IP header OK. Pass the packet to the current handler.
@ -1490,7 +1403,7 @@ static int net_check_prereq (proto_t protocol)
{
switch (protocol) {
/* Fall through */
#if (CONFIG_COMMANDS & CFG_CMD_PING)
#ifdef CONFIG_NET_PING
case PING:
if (NetPingIP == 0) {
puts ("*** ERROR: ping address not given\n");
@ -1498,7 +1411,7 @@ static int net_check_prereq (proto_t protocol)
}
goto common;
#endif
#if (CONFIG_COMMANDS & CFG_CMD_SNTP)
#ifdef CONFIG_NET_SNTP
case SNTP:
if (NetNtpServerIP == 0) {
puts ("*** ERROR: NTP server address not given\n");
@ -1506,7 +1419,7 @@ static int net_check_prereq (proto_t protocol)
}
goto common;
#endif
#if (CONFIG_COMMANDS & CFG_CMD_NFS)
#ifdef CONFIG_NET_NFS
case NFS:
#endif
case NETCONS:
@ -1515,9 +1428,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))
common:
#endif
if (NetOurIP == 0) {
puts ("*** ERROR: `ipaddr' not set\n");
@ -1667,8 +1578,6 @@ void copy_filename (char *dst, char *src, int size)
*dst = '\0';
}
#endif /* CFG_CMD_NET */
void ip_to_string (IPaddr_t x, char *s)
{
x = ntohl (x);

View File

@ -24,6 +24,7 @@
#include <common.h>
#include <command.h>
#include <clock.h>
#include <net.h>
#include <malloc.h>
#include "nfs.h"
@ -31,8 +32,6 @@
/*#define NFS_DEBUG*/
#if ((CONFIG_COMMANDS & CFG_CMD_NET) && (CONFIG_COMMANDS & CFG_CMD_NFS))
#define HASHES_PER_LINE 65 /* Number of "loading" hashes per line */
#define NFS_TIMEOUT 60
@ -68,28 +67,8 @@ static __inline__ int
store_block (uchar * src, unsigned offset, unsigned len)
{
ulong newsize = offset + len;
#ifdef CFG_DIRECT_FLASH_NFS
int i, rc = 0;
for (i=0; i<CFG_MAX_FLASH_BANKS; i++) {
/* start address in flash? */
if (load_addr + offset >= flash_info[i].start[0]) {
rc = 1;
break;
}
}
if (rc) { /* Flash is destination for this packet */
rc = flash_write ((uchar *)src, (ulong)(load_addr+offset), len);
if (rc) {
flash_perror (rc);
return -1;
}
} else
#endif /* CFG_DIRECT_FLASH_NFS */
{
(void)memcpy ((void *)(load_addr + offset), src, len);
}
memcpy ((void *)(load_addr + offset), src, len);
if (NetBootFileXferSize < (offset+len))
NetBootFileXferSize = newsize;
@ -670,7 +649,7 @@ NfsHandler (uchar *pkt, unsigned dest, unsigned src, unsigned len)
case STATE_READ_REQ:
rlen = nfs_read_reply (pkt, len);
NetSetTimeout (NFS_TIMEOUT * CFG_HZ, NfsTimeout);
NetSetTimeout (NFS_TIMEOUT * SECOND, NfsTimeout);
if (rlen > 0) {
nfs_offset += rlen;
NfsSend ();
@ -759,7 +738,7 @@ NfsStart (void)
printf ("\nLoad address: 0x%lx\n"
"Loading: *\b", load_addr);
NetSetTimeout (NFS_TIMEOUT * CFG_HZ, NfsTimeout);
NetSetTimeout (NFS_TIMEOUT * SECOND, NfsTimeout);
NetSetHandler (NfsHandler);
NfsTimeoutCount = 0;
@ -774,4 +753,3 @@ NfsStart (void)
NfsSend ();
}
#endif /* CONFIG_COMMANDS & CFG_CMD_NFS */

View File

@ -23,14 +23,13 @@
#include <common.h>
#include <command.h>
#include <clock.h>
#include <net.h>
#include "nfs.h"
#include "bootp.h"
#include "rarp.h"
#include "tftp.h"
#if (CONFIG_COMMANDS & CFG_CMD_NET)
#define TIMEOUT 5 /* Seconds before trying BOOTP again */
#ifndef CONFIG_NET_RETRY_COUNT
# define TIMEOUT_COUNT 5 /* # of timeouts before giving up */
@ -47,7 +46,6 @@ int RarpTry;
static void
RarpHandler(uchar * dummi0, unsigned dummi1, unsigned dummi2, unsigned dummi3)
{
char *s;
#ifdef DEBUG
puts ("Got good RARP\n");
#endif
@ -65,7 +63,7 @@ RarpTimeout(void)
puts ("\nRetry count exceeded; starting again\n");
NetStartAgain ();
} else {
NetSetTimeout (TIMEOUT * CFG_HZ, RarpTimeout);
NetSetTimeout (TIMEOUT * SECOND, RarpTimeout);
RarpRequest ();
}
}
@ -100,8 +98,7 @@ RarpRequest (void)
NetSendPacket(NetTxPacket, (pkt - NetTxPacket) + ARP_HDR_SIZE);
NetSetTimeout(TIMEOUT * CFG_HZ, RarpTimeout);
NetSetTimeout(TIMEOUT * SECOND, RarpTimeout);
NetSetHandler(RarpHandler);
}
#endif /* CFG_CMD_NET */

View File

@ -7,13 +7,12 @@
#include <common.h>
#include <command.h>
#include <clock.h>
#include <net.h>
#include <rtc.h>
#include "sntp.h"
#if ((CONFIG_COMMANDS & CFG_CMD_NET) && (CONFIG_COMMANDS & CFG_CMD_SNTP))
#define SNTP_TIMEOUT 10
static int SntpOurPort;
@ -35,7 +34,7 @@ SntpSend (void)
memcpy ((char *)NetTxPacket + NetEthHdrSize() + IP_HDR_SIZE, (char *)&pkt, pktlen);
SntpOurPort = 10000 + (get_timer(0) % 4096);
SntpOurPort = 10000 + ((uint32_t)get_time_ns() % 4096);
sport = NTP_SERVICE_PORT;
NetSendUDPPacket (NetServerEther, NetNtpServerIP, sport, SntpOurPort, pktlen);
@ -82,11 +81,46 @@ SntpStart (void)
{
debug ("%s\n", __FUNCTION__);
NetSetTimeout (SNTP_TIMEOUT * CFG_HZ, SntpTimeout);
NetSetTimeout (SNTP_TIMEOUT * SECOND, SntpTimeout);
NetSetHandler(SntpHandler);
memset (NetServerEther, 0, 6);
SntpSend ();
}
#endif /* CONFIG_COMMANDS & CFG_CMD_SNTP */
int do_sntp (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
char *toff;
if (argc < 2) {
NetNtpServerIP = getenv_IPaddr ("ntpserverip");
if (NetNtpServerIP == 0) {
printf ("ntpserverip not set\n");
return (1);
}
} else {
NetNtpServerIP = string_to_ip(argv[1]);
if (NetNtpServerIP == 0) {
printf ("Bad NTP server IP address\n");
return (1);
}
}
toff = getenv ("timeoffset");
if (toff == NULL) NetTimeOffset = 0;
else NetTimeOffset = simple_strtol (toff, NULL, 10);
if (NetLoop(SNTP) < 0) {
printf("SNTP failed: host %s not responding\n", argv[1]);
return 1;
}
return 0;
}
U_BOOT_CMD(
sntp, 2, 1, do_sntp,
"sntp\t- synchronize RTC via network\n",
"[NTP server IP]\n"
);

View File

@ -13,8 +13,6 @@
#undef ET_DEBUG
#if (CONFIG_COMMANDS & CFG_CMD_NET)
#define WELL_KNOWN_PORT 69 /* Well known TFTP port # */
#define TIMEOUT 5 /* Seconds to timeout for a lost pkt */
#ifndef CONFIG_NET_RETRY_COUNT
@ -58,36 +56,11 @@ static int TftpState;
static char default_filename[DEFAULT_NAME_LEN];
static char *tftp_filename;
#ifdef CFG_DIRECT_FLASH_TFTP
extern flash_info_t flash_info[];
#endif
static __inline__ void
store_block (unsigned block, uchar * src, unsigned len)
{
ulong offset = block * TFTP_BLOCK_SIZE + TftpBlockWrapOffset;
ulong newsize = offset + len;
#ifdef CFG_DIRECT_FLASH_TFTP
int i, rc = 0;
for (i=0; i<CFG_MAX_FLASH_BANKS; i++) {
/* start address in flash? */
if (load_addr + offset >= flash_info[i].start[0]) {
rc = 1;
break;
}
}
if (rc) { /* Flash is destination for this packet */
rc = flash_write ((char *)src, (ulong)(load_addr+offset), len);
if (rc) {
flash_perror (rc);
NetState = NETLOOP_FAIL;
return;
}
}
else
#endif /* CFG_DIRECT_FLASH_TFTP */
{
(void)memcpy((void *)(load_addr + offset), src, len);
}
@ -267,7 +240,7 @@ TftpHandler (uchar * pkt, unsigned dest, unsigned src, unsigned len)
}
TftpLastBlock = TftpBlock;
NetSetTimeout (TIMEOUT * CFG_HZ, TftpTimeout);
NetSetTimeout (TIMEOUT * SECOND, TftpTimeout);
store_block (TftpBlock - 1, pkt + 2, len);
@ -305,7 +278,7 @@ TftpTimeout (void)
NetStartAgain ();
} else {
puts ("T ");
NetSetTimeout (TIMEOUT * CFG_HZ, TftpTimeout);
NetSetTimeout (TIMEOUT * SECOND, TftpTimeout);
TftpSend ();
}
}
@ -363,7 +336,7 @@ TftpStart (void)
puts ("Loading: *\b");
NetSetTimeout (TIMEOUT * CFG_HZ, TftpTimeout);
NetSetTimeout (TIMEOUT * SECOND, TftpTimeout);
NetSetHandler (TftpHandler);
TftpServerPort = WELL_KNOWN_PORT;
@ -386,5 +359,3 @@ TftpStart (void)
TftpSend ();
}
#endif /* CFG_CMD_NET */