{
if (!output_packet_len || memcmp(nc_ether, NetEtherNullAddr, 6)) {
/* going to check for input packet */
- NetSetHandler(nc_handler);
+ net_set_udp_handler(nc_handler);
NetSetTimeout(net_timeout, nc_timeout);
} else {
/* send arp request */
uchar *pkt;
- NetSetHandler(nc_wait_arp_handler);
+ net_set_arp_handler(nc_wait_arp_handler);
pkt = (uchar *)NetTxPacket + NetEthHdrSize() + IP_UDP_HDR_SIZE;
memcpy(pkt, output_packet, output_packet_len);
NetSendUDPPacket(nc_ether, nc_ip, nc_port, nc_port,
extern uint NetCksum(uchar *, int); /* Calculate the checksum */
/* Callbacks */
-extern rxhand_f *NetGetHandler(void); /* Get RX packet handler */
-extern void NetSetHandler(rxhand_f *); /* Set RX packet handler */
+extern rxhand_f *net_get_udp_handler(void); /* Get UDP RX packet handler */
+extern void net_set_udp_handler(rxhand_f *); /* Set UDP RX packet handler */
+extern rxhand_f *net_get_arp_handler(void); /* Get ARP RX packet handler */
+extern void net_set_arp_handler(rxhand_f *); /* Set ARP 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 UDP packet, performing ARP request if needed
+ * (ether will be populated)
*
* @param ether Raw packet buffer
* @param dest IP address to send the datagram to
memcpy(NetArpWaitPacketMAC,
&arp->ar_sha, ARP_HLEN);
-#ifdef CONFIG_NETCONSOLE
- NetGetHandler()(0, 0, 0, 0, 0);
-#endif
+ net_get_arp_handler()((uchar *)arp, 0, reply_ip_addr,
+ 0, len);
+
/* modify header, and transmit it */
memcpy(((struct ethernet_hdr *)NetArpWaitTxPacket)->
et_dest, NetArpWaitPacketMAC, ARP_HLEN);
#if defined(CONFIG_CMD_DHCP)
dhcp_state = SELECTING;
- NetSetHandler(DhcpHandler);
+ net_set_udp_handler(DhcpHandler);
#else
- NetSetHandler(BootpHandler);
+ net_set_udp_handler(BootpHandler);
#endif
NetSendPacket(NetTxPacket, pktlen);
}
net_set_state(NETLOOP_SUCCESS);
}
-static void
-CDPDummyHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src,
- unsigned len)
-{
- /* nothing */
-}
-
void cdp_receive(const uchar *pkt, unsigned len)
{
const uchar *t;
CDPApplianceVLAN = htons(-1);
NetSetTimeout(CDP_TIMEOUT, CDPTimeout);
- NetSetHandler(CDPDummyHandler);
CDPSendTrigger();
}
debug("%s\n", __func__);
NetSetTimeout(DNS_TIMEOUT, DnsTimeout);
- NetSetHandler(DnsHandler);
+ net_set_udp_handler(DnsHandler);
DnsSend();
}
/* Receive packet */
uchar *NetRxPackets[PKTBUFSRX];
-/* Current RX packet handler */
-static rxhand_f *packetHandler;
+/* Current UDP RX packet handler */
+static rxhand_f *udp_packet_handler;
+/* Current ARP RX packet handler */
+static rxhand_f *arp_packet_handler;
#ifdef CONFIG_CMD_TFTPPUT
-static rxhand_icmp_f *packet_icmp_handler; /* Current ICMP rx handler */
+/* Current ICMP rx handler */
+static rxhand_icmp_f *packet_icmp_handler;
#endif
/* Current timeout handler */
static thand_f *timeHandler;
return;
}
+static void net_clear_handlers(void)
+{
+ net_set_udp_handler(NULL);
+ net_set_arp_handler(NULL);
+ NetSetTimeout(0, NULL);
+}
+
+static void net_cleanup_loop(void)
+{
+ net_clear_handlers();
+}
+
/**********************************************************************/
/*
* Main network processing loop.
int NetLoop(enum proto_t protocol)
{
+ int i;
bd_t *bd = gd->bd;
int ret = -1;
NetTryCount = 1;
ArpInit();
+ net_clear_handlers();
- if (!NetTxPacket) {
- int i;
- /*
- * Setup packet buffers, aligned correctly.
- */
- NetTxPacket = &PktBuf[0] + (PKTALIGN - 1);
- NetTxPacket -= (ulong)NetTxPacket % PKTALIGN;
- for (i = 0; i < PKTBUFSRX; i++)
- NetRxPackets[i] = NetTxPacket + (i+1)*PKTSIZE_ALIGN;
- }
+ /*
+ * Setup packet buffers, aligned correctly.
+ */
+ NetTxPacket = &PktBuf[0] + (PKTALIGN - 1);
+ NetTxPacket -= (ulong)NetTxPacket % PKTALIGN;
+ for (i = 0; i < PKTBUFSRX; i++)
+ NetRxPackets[i] = NetTxPacket + (i+1)*PKTSIZE_ALIGN;
bootstage_mark_name(BOOTSTAGE_ID_ETH_START, "eth_start");
eth_halt();
* Abort if ctrl-c was pressed.
*/
if (ctrlc()) {
+ net_cleanup_loop();
eth_halt();
puts("\nAbort\n");
goto done;
goto restart;
case NETLOOP_SUCCESS:
+ net_cleanup_loop();
if (NetBootFileXferSize > 0) {
char buf[20];
printf("Bytes transferred = %ld (%lx hex)\n",
goto done;
case NETLOOP_FAIL:
+ net_cleanup_loop();
goto done;
case NETLOOP_CONTINUE:
done:
#ifdef CONFIG_CMD_TFTPPUT
/* Clear out the handlers */
- NetSetHandler(NULL);
+ net_set_udp_handler(NULL);
net_set_icmp_handler(NULL);
#endif
return ret;
net_set_state(NETLOOP_RESTART);
}
-static void
-startAgainHandler(uchar *pkt, unsigned dest, IPaddr_t sip,
- unsigned src, unsigned len)
-{
- /* Totally ignore the packet */
-}
-
void NetStartAgain(void)
{
char *nretry;
NetRestartWrap = 0;
if (NetDevExists) {
NetSetTimeout(10000UL, startAgainTimeout);
- NetSetHandler(startAgainHandler);
+ net_set_udp_handler(NULL);
} else {
net_set_state(NETLOOP_FAIL);
}
* Miscelaneous bits.
*/
-rxhand_f *
-NetGetHandler(void)
+static void dummy_handler(uchar *pkt, unsigned dport,
+ IPaddr_t sip, unsigned sport,
+ unsigned len)
{
- return packetHandler;
}
+rxhand_f *net_get_udp_handler(void)
+{
+ return udp_packet_handler;
+}
-void
-NetSetHandler(rxhand_f *f)
+void net_set_udp_handler(rxhand_f *f)
+{
+ if (f == NULL)
+ udp_packet_handler = dummy_handler;
+ else
+ udp_packet_handler = f;
+}
+
+rxhand_f *net_get_arp_handler(void)
{
- packetHandler = f;
+ return arp_packet_handler;
+}
+
+void net_set_arp_handler(rxhand_f *f)
+{
+ if (f == NULL)
+ arp_packet_handler = dummy_handler;
+ else
+ arp_packet_handler = f;
}
#ifdef CONFIG_CMD_TFTPPUT
/*
* IP header OK. Pass the packet to the current handler.
*/
- (*packetHandler)((uchar *)ip + IP_UDP_HDR_SIZE,
- ntohs(ip->udp_dst),
- src_ip,
- ntohs(ip->udp_src),
- ntohs(ip->udp_len) - UDP_HDR_SIZE);
+ (*udp_packet_handler)((uchar *)ip + IP_UDP_HDR_SIZE,
+ ntohs(ip->udp_dst),
+ src_ip,
+ ntohs(ip->udp_src),
+ ntohs(ip->udp_len) - UDP_HDR_SIZE);
break;
}
}
"Loading: *\b", load_addr);
NetSetTimeout(NFS_TIMEOUT, NfsTimeout);
- NetSetHandler(NfsHandler);
+ net_set_udp_handler(NfsHandler);
NfsTimeoutCount = 0;
NfsState = STATE_PRCLOOKUP_PROG_MOUNT_REQ;
debug("%s\n", __func__);
NetSetTimeout(SNTP_TIMEOUT, SntpTimeout);
- NetSetHandler(SntpHandler);
+ net_set_udp_handler(SntpHandler);
memset(NetServerEther, 0, sizeof(NetServerEther));
SntpSend();
TftpTimeoutCountMax = TftpRRQTimeoutCountMax;
NetSetTimeout(TftpTimeoutMSecs, TftpTimeout);
- NetSetHandler(TftpHandler);
+ net_set_udp_handler(TftpHandler);
#ifdef CONFIG_CMD_TFTPPUT
net_set_icmp_handler(icmp_handler);
#endif
#endif
TftpState = STATE_RECV_WRQ;
- NetSetHandler(TftpHandler);
+ net_set_udp_handler(TftpHandler);
}
#endif /* CONFIG_CMD_TFTPSRV */