2002-07-21 04:14:13 +08:00
|
|
|
/*
|
|
|
|
* Copied from LiMon - BOOTP.
|
|
|
|
*
|
|
|
|
* Copyright 1994, 1995, 2000 Neil Russell.
|
|
|
|
* (See License)
|
|
|
|
* Copyright 2000 Paolo Scaffardi
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef __BOOTP_H__
|
|
|
|
#define __BOOTP_H__
|
|
|
|
|
|
|
|
#ifndef __NET_H__
|
2012-05-15 16:59:06 +08:00
|
|
|
#include <net.h>
|
2002-07-21 04:14:13 +08:00
|
|
|
#endif /* __NET_H__ */
|
|
|
|
|
|
|
|
/**********************************************************************/
|
|
|
|
|
|
|
|
/*
|
|
|
|
* BOOTP header.
|
|
|
|
*/
|
2007-07-10 06:45:14 +08:00
|
|
|
#if defined(CONFIG_CMD_DHCP)
|
2012-05-15 16:59:06 +08:00
|
|
|
/* Minimum DHCP Options size per RFC2131 - results in 576 byte pkt */
|
2012-05-23 15:58:14 +08:00
|
|
|
#define OPT_FIELD_SIZE 312
|
2012-05-15 16:59:06 +08:00
|
|
|
#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
|
2002-07-21 04:14:13 +08:00
|
|
|
#else
|
2012-05-23 15:58:14 +08:00
|
|
|
#define OPT_FIELD_SIZE 64
|
2002-07-21 04:14:13 +08:00
|
|
|
#endif
|
|
|
|
|
2012-05-15 16:59:06 +08:00
|
|
|
struct Bootp_t {
|
|
|
|
uchar bp_op; /* Operation */
|
2002-07-21 04:14:13 +08:00
|
|
|
# define OP_BOOTREQUEST 1
|
|
|
|
# define OP_BOOTREPLY 2
|
2012-05-15 16:59:06 +08:00
|
|
|
uchar bp_htype; /* Hardware type */
|
2002-07-21 04:14:13 +08:00
|
|
|
# define HWT_ETHER 1
|
2012-05-15 16:59:06 +08:00
|
|
|
uchar bp_hlen; /* Hardware address length */
|
2002-07-21 04:14:13 +08:00
|
|
|
# define HWL_ETHER 6
|
2012-05-15 16:59:06 +08:00
|
|
|
uchar bp_hops; /* Hop count (gateway thing) */
|
|
|
|
ulong bp_id; /* Transaction ID */
|
|
|
|
ushort bp_secs; /* Seconds since boot */
|
|
|
|
ushort bp_spare1; /* Alignment */
|
2015-04-08 14:41:01 +08:00
|
|
|
struct in_addr bp_ciaddr; /* Client IP address */
|
|
|
|
struct in_addr bp_yiaddr; /* Your (client) IP address */
|
|
|
|
struct in_addr bp_siaddr; /* Server IP address */
|
|
|
|
struct in_addr bp_giaddr; /* Gateway IP address */
|
2012-05-15 16:59:06 +08:00
|
|
|
uchar bp_chaddr[16]; /* Client hardware address */
|
|
|
|
char bp_sname[64]; /* Server host name */
|
|
|
|
char bp_file[128]; /* Boot file name */
|
2012-05-23 15:58:14 +08:00
|
|
|
char bp_vend[OPT_FIELD_SIZE]; /* Vendor information */
|
2012-05-15 16:59:06 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
#define BOOTP_HDR_SIZE sizeof(struct Bootp_t)
|
2002-07-21 04:14:13 +08:00
|
|
|
|
|
|
|
/**********************************************************************/
|
|
|
|
/*
|
|
|
|
* Global functions and variables.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* bootp.c */
|
2012-05-15 16:59:06 +08:00
|
|
|
extern ulong BootpID; /* ID of cur BOOTP request */
|
2002-07-21 04:14:13 +08:00
|
|
|
extern int BootpTry;
|
|
|
|
|
|
|
|
|
|
|
|
/* Send a BOOTP request */
|
net: BOOTP retry timeout improvements
Currently, the BOOTP code sends out its initial request as soon as the
Ethernet driver indicates "link up". If this packet is lost or not
replied to for some reason, the code waits for a 1s timeout before
retrying. For some reason, such early packets are often lost on my
system, so this causes an annoying delay.
To optimize this, modify the BOOTP code to have very short timeouts for
the first packet transmitted, but gradually increase the timeout each
time a timeout occurs. This way, if the first packet is lost, the second
packet is transmitted quite quickly and hence the overall delay is low.
However, if there's still no response, we don't keep spewing out packets
at an insane speed.
It's arguably more correct to try and find out why the first packet is
lost. However, it seems to disappear inside my Ethenet chip; the TX chip
indicates no error during TX (not that it has much in the way of
reporting...), yet wireshark on the RX side doesn't see any packet.
FWIW, I'm using an ASIX USB Ethernet adapter. Perhaps "link up" is
reported too early or based on the wrong condition in HW, and we should
add some fixed extra delay into the driver. However, this would slow down
every link up event even if it ends up not being needed in some cases.
Having BOOTP retry quickly applies the fix/WAR to every possible
Ethernet device, and is quite simple to implement, so seems a better
solution.
Signed-off-by: Stephen Warren <swarren@nvidia.com>
Acked-by: Joe Hershberger <joe.hershberger@ni.com>
2014-07-26 07:30:48 +08:00
|
|
|
extern void BootpReset(void);
|
2012-05-15 16:59:06 +08:00
|
|
|
extern void BootpRequest(void);
|
2002-07-21 04:14:13 +08:00
|
|
|
|
|
|
|
/****************** DHCP Support *********************/
|
|
|
|
extern void DhcpRequest(void);
|
|
|
|
|
|
|
|
/* DHCP States */
|
|
|
|
typedef enum { INIT,
|
|
|
|
INIT_REBOOT,
|
|
|
|
REBOOTING,
|
|
|
|
SELECTING,
|
|
|
|
REQUESTING,
|
|
|
|
REBINDING,
|
|
|
|
BOUND,
|
|
|
|
RENEWING } dhcp_state_t;
|
|
|
|
|
|
|
|
#define DHCP_DISCOVER 1
|
|
|
|
#define DHCP_OFFER 2
|
|
|
|
#define DHCP_REQUEST 3
|
|
|
|
#define DHCP_DECLINE 4
|
|
|
|
#define DHCP_ACK 5
|
|
|
|
#define DHCP_NAK 6
|
|
|
|
#define DHCP_RELEASE 7
|
|
|
|
|
|
|
|
/**********************************************************************/
|
|
|
|
|
|
|
|
#endif /* __BOOTP_H__ */
|