X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=include%2Fnet.h;h=ee11f82ccc87acf426b95f78337bb2de52d77abd;hb=e7075bb7536e91acd5da7940d811aab00185df14;hp=b192db1938cf2c7ee6e35fad6c62f779fcf94efd;hpb=156feb90d200f186cdfd856d7f6f1878bb1bec1e;p=u-boot diff --git a/include/net.h b/include/net.h index b192db1938..ee11f82ccc 100644 --- a/include/net.h +++ b/include/net.h @@ -14,44 +14,9 @@ #if defined(CONFIG_8xx) #include -# if !defined(CONFIG_NET_MULTI) -# if defined(FEC_ENET) || defined(SCC_ENET) -# define CONFIG_NET_MULTI -# endif -# endif #endif /* CONFIG_8xx */ -#if defined(CONFIG_MPC5xxx) -# if !defined(CONFIG_NET_MULTI) -# if defined(CONFIG_MPC5xxx_FEC) -# define CONFIG_NET_MULTI -# endif -# endif -#endif /* CONFIG_MPC5xxx */ - -#if !defined(CONFIG_NET_MULTI) && defined(CONFIG_CPM2) -#include -#if defined(CONFIG_ETHER_ON_FCC) -#if defined(CONFIG_ETHER_ON_SCC) -#error "Ethernet not correctly defined" -#endif /* CONFIG_ETHER_ON_SCC */ -#define CONFIG_NET_MULTI -#if (CONFIG_ETHER_INDEX == 1) -#define CONFIG_ETHER_ON_FCC1 -# define CONFIG_SYS_CMXFCR_MASK1 CONFIG_SYS_CMXFCR_MASK -# define CONFIG_SYS_CMXFCR_VALUE1 CONFIG_SYS_CMXFCR_VALUE -#elif (CONFIG_ETHER_INDEX == 2) -#define CONFIG_ETHER_ON_FCC2 -# define CONFIG_SYS_CMXFCR_MASK2 CONFIG_SYS_CMXFCR_MASK -# define CONFIG_SYS_CMXFCR_VALUE2 CONFIG_SYS_CMXFCR_VALUE -#elif (CONFIG_ETHER_INDEX == 3) -#define CONFIG_ETHER_ON_FCC3 -# define CONFIG_SYS_CMXFCR_MASK3 CONFIG_SYS_CMXFCR_MASK -# define CONFIG_SYS_CMXFCR_VALUE3 CONFIG_SYS_CMXFCR_VALUE -#endif /* CONFIG_ETHER_INDEX */ -#endif /* CONFIG_ETHER_ON_FCC */ -#endif /* !CONFIG_NET_MULTI && CONFIG_8260 */ - +#include #include /* for nton* / ntoh* stuff */ @@ -67,25 +32,42 @@ # define PKTBUFSRX 4 #endif -#define PKTALIGN 32 +#define PKTALIGN ARCH_DMA_MINALIGN -typedef ulong IPaddr_t; +/* IPv4 addresses are always 32 bits in size */ +typedef u32 IPaddr_t; -/* - * The current receive packet handler. Called with a pointer to the - * application packet, and a protocol type (PORT_BOOTPC or PORT_TFTP). - * All other packets are dealt with without calling the handler. +/** + * An incoming packet handler. + * @param pkt pointer to the application packet + * @param dport destination UDP port + * @param sip source IP address + * @param sport source UDP port + * @param len packet length */ -typedef void rxhand_f(uchar *, unsigned, unsigned, unsigned); +typedef void rxhand_f(uchar *pkt, unsigned dport, + IPaddr_t sip, unsigned sport, + unsigned len); + +/** + * An incoming ICMP packet handler. + * @param type ICMP type + * @param code ICMP code + * @param dport destination UDP port + * @param sip source IP address + * @param sport source UDP port + * @param pkt pointer to the ICMP packet data + * @param len packet length + */ +typedef void rxhand_icmp_f(unsigned type, unsigned code, unsigned dport, + IPaddr_t sip, unsigned sport, uchar *pkt, unsigned len); /* * A timeout handler. Called after time interval has expired. */ typedef void thand_f(void); -#define NAMESIZE 16 - enum eth_state_t { ETH_STATE_INIT, ETH_STATE_PASSIVE, @@ -93,7 +75,7 @@ enum eth_state_t { }; struct eth_device { - char name[NAMESIZE]; + char name[16]; unsigned char enetaddr[6]; int iobase; int state; @@ -105,24 +87,41 @@ struct eth_device { #ifdef CONFIG_MCAST_TFTP int (*mcast) (struct eth_device*, u32 ip, u8 set); #endif + int (*write_hwaddr) (struct eth_device*); struct eth_device *next; + int index; void *priv; }; extern int eth_initialize(bd_t *bis); /* Initialize network subsystem */ extern int eth_register(struct eth_device* dev);/* Register network device */ +extern int eth_unregister(struct eth_device *dev);/* Remove network device */ extern void eth_try_another(int first_restart); /* Change the device */ -#ifdef CONFIG_NET_MULTI extern void eth_set_current(void); /* set nterface to ethcur var */ -#endif extern struct eth_device *eth_get_dev(void); /* get the current device MAC */ -extern struct eth_device *eth_get_dev_by_name(char *devname); /* get device */ +extern struct eth_device *eth_get_dev_by_name(const char *devname); extern struct eth_device *eth_get_dev_by_index(int index); /* get dev @ index */ extern int eth_get_dev_index (void); /* get the device index */ -extern void eth_set_enetaddr(int num, char* a); /* Set new MAC address */ +extern void eth_parse_enetaddr(const char *addr, uchar *enetaddr); +extern int eth_getenv_enetaddr(char *name, uchar *enetaddr); +extern int eth_setenv_enetaddr(char *name, const uchar *enetaddr); +/* + * Get the hardware address for an ethernet interface . + * Args: + * base_name - base name for device (normally "eth") + * index - device index number (0 for first) + * enetaddr - returns 6 byte hardware address + * Returns: + * Return true if the address is valid. + */ +extern int eth_getenv_enetaddr_by_index(const char *base_name, int index, + uchar *enetaddr); + +extern int usb_eth_initialize(bd_t *bi); extern int eth_init(bd_t *bis); /* Initialize the device */ extern int eth_send(volatile void *packet, int length); /* Send a packet */ + #ifdef CONFIG_API extern int eth_receive(volatile void *packet, int length); /* Receive a packet*/ #endif @@ -130,6 +129,18 @@ extern int eth_rx(void); /* Check for received packets */ extern void eth_halt(void); /* stop SCC */ extern char *eth_get_name(void); /* get name of current device */ +/* + * Set the hardware address for an ethernet interface based on 'eth%daddr' + * environment variable (or just 'ethaddr' if eth_number is 0). + * Args: + * base_name - base name for device (normally "eth") + * eth_number - value of %d (0 for first device of this type) + * Returns: + * 0 is success, non-zero is error status from driver. + */ +int eth_write_hwaddr(struct eth_device *dev, const char *base_name, + int eth_number); + #ifdef CONFIG_MCAST_TFTP int eth_mcast_join( IPaddr_t mcast_addr, u8 join); u32 ether_crc (size_t len, unsigned char const *p); @@ -248,6 +259,7 @@ typedef struct * ICMP stuff (just enough to handle (host) redirect messages) */ #define ICMP_ECHO_REPLY 0 /* Echo reply */ +#define ICMP_NOT_REACH 3 /* Detination unreachable */ #define ICMP_REDIRECT 5 /* Redirect (change route) */ #define ICMP_ECHO_REQUEST 8 /* Echo request */ @@ -255,6 +267,9 @@ typedef struct #define ICMP_REDIR_NET 0 /* Redirect Net */ #define ICMP_REDIR_HOST 1 /* Redirect Host */ +/* Codes for NOT_REACH */ +#define ICMP_NOT_REACH_PORT 3 /* Port unreachable */ + typedef struct icmphdr { uchar type; uchar code; @@ -269,6 +284,7 @@ typedef struct icmphdr { ushort __unused; ushort mtu; } frag; + uchar data[0]; } un; } ICMP_t; @@ -328,8 +344,8 @@ extern IPaddr_t NetOurIP; /* Our IP addr (0 = unknown) */ extern IPaddr_t NetServerIP; /* Server IP addr (0 = unknown) */ extern volatile uchar * NetTxPacket; /* THE transmit packet */ extern volatile uchar * NetRxPackets[PKTBUFSRX];/* Receive packets */ -extern volatile uchar * NetRxPkt; /* Current receive packet */ -extern int NetRxPktLen; /* Current rx packet length */ +extern volatile uchar * NetRxPacket; /* Current receive packet */ +extern int NetRxPacketLen; /* Current rx packet length */ extern unsigned NetIPID; /* IP ID (counting) */ extern uchar NetBcastAddr[6]; /* Ethernet boardcast address */ extern uchar NetEtherNullAddr[6]; @@ -349,15 +365,21 @@ extern int NetState; /* Network loop state */ #define NETLOOP_SUCCESS 3 #define NETLOOP_FAIL 4 -#ifdef CONFIG_NET_MULTI extern int NetRestartWrap; /* Tried all network devices */ -#endif -typedef enum { BOOTP, RARP, ARP, TFTP, DHCP, PING, DNS, NFS, CDP, NETCONS, SNTP } proto_t; +enum proto_t { + BOOTP, RARP, ARP, TFTPGET, DHCP, PING, DNS, NFS, CDP, NETCONS, SNTP, + TFTPSRV, TFTPPUT +}; /* from net/net.c */ extern char BootFile[128]; /* Boot File name */ +#if defined(CONFIG_CMD_DNS) +extern char *NetDNSResolve; /* The host to resolve */ +extern char *NetDNSenvvar; /* the env var to put the ip into */ +#endif + #if defined(CONFIG_CMD_PING) extern IPaddr_t NetPingIP; /* the ip address to ping */ #endif @@ -374,7 +396,7 @@ extern int NetTimeOffset; /* offset time from UTC */ #endif /* Initialize the network adapter */ -extern int NetLoop(proto_t); +extern int NetLoop(enum proto_t); /* Shutdown adapters and cleanup */ extern void NetStop(void); @@ -397,6 +419,7 @@ extern uint NetCksum(uchar *, int); /* Calculate the checksum */ /* Set callbacks */ extern void NetSetHandler(rxhand_f *); /* Set RX packet handler */ +extern void net_set_icmp_handler(rxhand_icmp_f *f); /* Set ICMP RX handler */ extern void NetSetTimeout(ulong, thand_f *);/* Set timeout handler */ /* Transmit "NetTxPacket" */ @@ -408,8 +431,11 @@ extern int NetSendUDPPacket(uchar *ether, IPaddr_t dest, int dport, int sport, i /* Processes a received packet */ extern void NetReceive(volatile uchar *, int); -/* Print an IP address on the console */ -extern void print_IPaddr (IPaddr_t); +/* + * Check if autoload is enabled. If so, use either NFS or TFTP to download + * the boot file. + */ +void net_auto_load(void); /* * The following functions are a bit ugly, but necessary to deal with @@ -475,7 +501,18 @@ static inline int is_multicast_ether_addr(const u8 *addr) return (0x01 & addr[0]); } -/** +/* + * is_broadcast_ether_addr - Determine if the Ethernet address is broadcast + * @addr: Pointer to a six-byte array containing the Ethernet address + * + * Return true if the address is the broadcast address. + */ +static inline int is_broadcast_ether_addr(const u8 *addr) +{ + return (addr[0] & addr[1] & addr[2] & addr[3] & addr[4] & addr[5]) == 0xff; +} + +/* * is_valid_ether_addr - Determine if the given Ethernet address is valid * @addr: Pointer to a six-byte array containing the Ethernet address * @@ -484,7 +521,7 @@ static inline int is_multicast_ether_addr(const u8 *addr) * * Return true if the address is valid. */ -static inline int is_valid_ether_addr(const u8 * addr) +static inline int is_valid_ether_addr(const u8 *addr) { /* FF:FF:FF:FF:FF:FF is a multicast address so we don't need to * explicitly check for it here. */ @@ -495,22 +532,22 @@ static inline int is_valid_ether_addr(const u8 * addr) extern void ip_to_string (IPaddr_t x, char *s); /* Convert a string to ip address */ -extern IPaddr_t string_to_ip(char *s); +extern IPaddr_t string_to_ip(const char *s); /* Convert a VLAN id to a string */ extern void VLAN_to_string (ushort x, char *s); /* Convert a string to a vlan id */ -extern ushort string_to_VLAN(char *s); - -/* read an IP address from a environment variable */ -extern IPaddr_t getenv_IPaddr (char *); +extern ushort string_to_VLAN(const char *s); /* read a VLAN id from an environment variable */ extern ushort getenv_VLAN(char *); /* copy a filename (allow for "..." notation, limit length) */ -extern void copy_filename (char *dst, char *src, int size); +extern void copy_filename (char *dst, const char *src, int size); + +/* get a random source port */ +extern unsigned int random_port(void); /**********************************************************************/