Re: [U-Boot] [PATCH 06/28] net: Move ARP out of net.c
Acked-by: Mike Frysinger vap...@gentoo.org -mike signature.asc Description: This is a digitally signed message part. ___ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot
Re: [U-Boot] [PATCH 06/28] net: Move ARP out of net.c
On Thu, Jan 19, 2012 at 4:53 PM, Joe Hershberger joe.hershber...@ni.com wrote: Signed-off-by: Joe Hershberger joe.hershber...@ni.com Acked-by: Simon Glass s...@chromium.org Cc: Joe Hershberger joe.hershber...@gmail.com Cc: Wolfgang Denk w...@denx.de --- include/net.h | 3 +- net/Makefile | 1 + net/arp.c | 213 + net/arp.h | 30 net/net.c | 209 5 files changed, 259 insertions(+), 197 deletions(-) create mode 100644 net/arp.c create mode 100644 net/arp.h diff --git a/include/net.h b/include/net.h index 0396b69..2d00233 100644 --- a/include/net.h +++ b/include/net.h @@ -418,7 +418,8 @@ extern void NetSetIP(uchar *, IPaddr_t, int, int, int); extern int NetCksumOk(uchar *, int); /* Return true if cksum OK */ extern uint NetCksum(uchar *, int); /* Calculate the checksum */ -/* Set callbacks */ +/* Callbacks */ +extern rxhand_f *NetGetHandler(void); /* Get RX packet handler */ 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 */ diff --git a/net/Makefile b/net/Makefile index b350bfc..0916a56 100644 --- a/net/Makefile +++ b/net/Makefile @@ -27,6 +27,7 @@ include $(TOPDIR)/config.mk LIB = $(obj)libnet.o +COBJS-$(CONFIG_CMD_NET) += arp.o COBJS-$(CONFIG_CMD_NET) += bootp.o COBJS-$(CONFIG_CMD_CDP) += cdp.o COBJS-$(CONFIG_CMD_DNS) += dns.o diff --git a/net/arp.c b/net/arp.c new file mode 100644 index 000..f75217c --- /dev/null +++ b/net/arp.c @@ -0,0 +1,213 @@ +/* + * Copied from Linux Monitor (LiMon) - Networking. + * + * Copyright 1994 - 2000 Neil Russell. + * (See License) + * Copyright 2000 Roland Borde + * Copyright 2000 Paolo Scaffardi + * Copyright 2000-2002 Wolfgang Denk, w...@denx.de + */ + +#include common.h + +#include arp.h + +#ifndef CONFIG_ARP_TIMEOUT +/* Milliseconds before trying ARP again */ +# define ARP_TIMEOUT 5000UL +#else +# define ARP_TIMEOUT CONFIG_ARP_TIMEOUT +#endif + + +#ifndef CONFIG_NET_RETRY_COUNT +# define ARP_TIMEOUT_COUNT 5 /* # of timeouts before giving up */ +#else +# define ARP_TIMEOUT_COUNT CONFIG_NET_RETRY_COUNT +#endif + +IPaddr_t NetArpWaitPacketIP; +IPaddr_t NetArpWaitReplyIP; +/* MAC address of waiting packet's destination */ +uchar *NetArpWaitPacketMAC; +/* THE transmit packet */ +uchar *NetArpWaitTxPacket; +int NetArpWaitTxPacketSize; +uchar NetArpWaitPacketBuf[PKTSIZE_ALIGN + PKTALIGN]; +ulong NetArpWaitTimerStart; +int NetArpWaitTry; + +void ArpInit(void) +{ + /* XXX problem with bss workaround */ + NetArpWaitPacketMAC = NULL; + NetArpWaitPacketIP = 0; + NetArpWaitReplyIP = 0; + NetArpWaitTxPacket = NetArpWaitPacketBuf[0] + (PKTALIGN - 1); + NetArpWaitTxPacket -= (ulong)NetArpWaitTxPacket % PKTALIGN; + NetArpWaitTxPacketSize = 0; +} + +void ArpRequest(void) +{ + uchar *pkt; + ARP_t *arp; + + debug(ARP broadcast %d\n, NetArpWaitTry); + + pkt = NetTxPacket; + + pkt += NetSetEther(pkt, NetBcastAddr, PROT_ARP); + + arp = (ARP_t *) pkt; + + arp-ar_hrd = htons(ARP_ETHER); + arp-ar_pro = htons(PROT_IP); + arp-ar_hln = 6; + arp-ar_pln = 4; + arp-ar_op = htons(ARPOP_REQUEST); + + /* source ET addr */ + memcpy(arp-ar_data[0], NetOurEther, 6); + /* source IP addr */ + NetWriteIP((uchar *) arp-ar_data[6], NetOurIP); + /* dest ET addr = 0 */ + memset(arp-ar_data[10], '\0', 6); + if ((NetArpWaitPacketIP NetOurSubnetMask) != + (NetOurIP NetOurSubnetMask)) { + if (NetOurGatewayIP == 0) { + puts(## Warning: gatewayip needed but not set\n); + NetArpWaitReplyIP = NetArpWaitPacketIP; + } else { + NetArpWaitReplyIP = NetOurGatewayIP; + } + } else { + NetArpWaitReplyIP = NetArpWaitPacketIP; + } + + NetWriteIP((uchar *) arp-ar_data[16], NetArpWaitReplyIP); + (void) eth_send(NetTxPacket, (pkt - NetTxPacket) + ARP_HDR_SIZE); +} + +void ArpTimeoutCheck(void) +{ + ulong t; + + if (!NetArpWaitPacketIP) + return; + + t = get_timer(0); + + /* check for arp timeout */ + if ((t - NetArpWaitTimerStart) ARP_TIMEOUT) { + NetArpWaitTry++; + + if (NetArpWaitTry = ARP_TIMEOUT_COUNT) { + puts(\nARP Retry count exceeded; starting again\n); +
[U-Boot] [PATCH 06/28] net: Move ARP out of net.c
Signed-off-by: Joe Hershberger joe.hershber...@ni.com Cc: Joe Hershberger joe.hershber...@gmail.com Cc: Wolfgang Denk w...@denx.de --- include/net.h |3 +- net/Makefile |1 + net/arp.c | 213 + net/arp.h | 30 net/net.c | 209 5 files changed, 259 insertions(+), 197 deletions(-) create mode 100644 net/arp.c create mode 100644 net/arp.h diff --git a/include/net.h b/include/net.h index 0396b69..2d00233 100644 --- a/include/net.h +++ b/include/net.h @@ -418,7 +418,8 @@ extern void NetSetIP(uchar *, IPaddr_t, int, int, int); extern int NetCksumOk(uchar *, int); /* Return true if cksum OK */ extern uintNetCksum(uchar *, int); /* Calculate the checksum */ -/* Set callbacks */ +/* Callbacks */ +extern rxhand_f *NetGetHandler(void); /* Get RX packet handler */ extern voidNetSetHandler(rxhand_f *); /* Set RX packet handler */ extern void net_set_icmp_handler(rxhand_icmp_f *f); /* Set ICMP RX handler */ extern voidNetSetTimeout(ulong, thand_f *);/* Set timeout handler */ diff --git a/net/Makefile b/net/Makefile index b350bfc..0916a56 100644 --- a/net/Makefile +++ b/net/Makefile @@ -27,6 +27,7 @@ include $(TOPDIR)/config.mk LIB= $(obj)libnet.o +COBJS-$(CONFIG_CMD_NET) += arp.o COBJS-$(CONFIG_CMD_NET) += bootp.o COBJS-$(CONFIG_CMD_CDP) += cdp.o COBJS-$(CONFIG_CMD_DNS) += dns.o diff --git a/net/arp.c b/net/arp.c new file mode 100644 index 000..f75217c --- /dev/null +++ b/net/arp.c @@ -0,0 +1,213 @@ +/* + * Copied from Linux Monitor (LiMon) - Networking. + * + * Copyright 1994 - 2000 Neil Russell. + * (See License) + * Copyright 2000 Roland Borde + * Copyright 2000 Paolo Scaffardi + * Copyright 2000-2002 Wolfgang Denk, w...@denx.de + */ + +#include common.h + +#include arp.h + +#ifndefCONFIG_ARP_TIMEOUT +/* Milliseconds before trying ARP again */ +# define ARP_TIMEOUT 5000UL +#else +# define ARP_TIMEOUT CONFIG_ARP_TIMEOUT +#endif + + +#ifndefCONFIG_NET_RETRY_COUNT +# define ARP_TIMEOUT_COUNT 5 /* # of timeouts before giving up */ +#else +# define ARP_TIMEOUT_COUNT CONFIG_NET_RETRY_COUNT +#endif + +IPaddr_t NetArpWaitPacketIP; +IPaddr_t NetArpWaitReplyIP; +/* MAC address of waiting packet's destination */ +uchar *NetArpWaitPacketMAC; +/* THE transmit packet */ +uchar *NetArpWaitTxPacket; +intNetArpWaitTxPacketSize; +uchar NetArpWaitPacketBuf[PKTSIZE_ALIGN + PKTALIGN]; +ulong NetArpWaitTimerStart; +intNetArpWaitTry; + +void ArpInit(void) +{ + /* XXX problem with bss workaround */ + NetArpWaitPacketMAC = NULL; + NetArpWaitPacketIP = 0; + NetArpWaitReplyIP = 0; + NetArpWaitTxPacket = NetArpWaitPacketBuf[0] + (PKTALIGN - 1); + NetArpWaitTxPacket -= (ulong)NetArpWaitTxPacket % PKTALIGN; + NetArpWaitTxPacketSize = 0; +} + +void ArpRequest(void) +{ + uchar *pkt; + ARP_t *arp; + + debug(ARP broadcast %d\n, NetArpWaitTry); + + pkt = NetTxPacket; + + pkt += NetSetEther(pkt, NetBcastAddr, PROT_ARP); + + arp = (ARP_t *) pkt; + + arp-ar_hrd = htons(ARP_ETHER); + arp-ar_pro = htons(PROT_IP); + arp-ar_hln = 6; + arp-ar_pln = 4; + arp-ar_op = htons(ARPOP_REQUEST); + + /* source ET addr */ + memcpy(arp-ar_data[0], NetOurEther, 6); + /* source IP addr */ + NetWriteIP((uchar *) arp-ar_data[6], NetOurIP); + /* dest ET addr = 0 */ + memset(arp-ar_data[10], '\0', 6); + if ((NetArpWaitPacketIP NetOurSubnetMask) != + (NetOurIP NetOurSubnetMask)) { + if (NetOurGatewayIP == 0) { + puts(## Warning: gatewayip needed but not set\n); + NetArpWaitReplyIP = NetArpWaitPacketIP; + } else { + NetArpWaitReplyIP = NetOurGatewayIP; + } + } else { + NetArpWaitReplyIP = NetArpWaitPacketIP; + } + + NetWriteIP((uchar *) arp-ar_data[16], NetArpWaitReplyIP); + (void) eth_send(NetTxPacket, (pkt - NetTxPacket) + ARP_HDR_SIZE); +} + +void ArpTimeoutCheck(void) +{ + ulong t; + + if (!NetArpWaitPacketIP) + return; + + t = get_timer(0); + + /* check for arp timeout */ + if ((t - NetArpWaitTimerStart) ARP_TIMEOUT) { + NetArpWaitTry++; + + if (NetArpWaitTry = ARP_TIMEOUT_COUNT) { + puts(\nARP Retry count exceeded; starting again\n); + NetArpWaitTry = 0; + NetStartAgain(); + } else { + NetArpWaitTimerStart = t; + ArpRequest(); + } + } +} + +void ArpReceive(Ethernet_t *et, IP_t *ip, int len) +{ +