@ -178,10 +178,13 @@ uchar PktBuf[(PKTBUFSRX+1) * PKTSIZE_ALIGN + PKTALIGN];
/* 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 ;
@ -250,6 +253,18 @@ static void NetInitLoop(enum proto_t protocol)
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 .
@ -257,6 +272,7 @@ static void NetInitLoop(enum proto_t protocol)
int NetLoop ( enum proto_t protocol )
{
int i ;
bd_t * bd = gd - > bd ;
int ret = - 1 ;
@ -267,17 +283,15 @@ int NetLoop(enum proto_t protocol)
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 ( ) ;
@ -416,6 +430,7 @@ restart:
* Abort if ctrl - c was pressed .
*/
if ( ctrlc ( ) ) {
net_cleanup_loop ( ) ;
eth_halt ( ) ;
puts ( " \n Abort \n " ) ;
goto done ;
@ -458,6 +473,7 @@ restart:
goto restart ;
case NETLOOP_SUCCESS :
net_cleanup_loop ( ) ;
if ( NetBootFileXferSize > 0 ) {
char buf [ 20 ] ;
printf ( " Bytes transferred = %ld (%lx hex) \n " ,
@ -474,6 +490,7 @@ restart:
goto done ;
case NETLOOP_FAIL :
net_cleanup_loop ( ) ;
goto done ;
case NETLOOP_CONTINUE :
@ -484,7 +501,7 @@ restart:
done :
# ifdef CONFIG_CMD_TFTPPUT
/* Clear out the handlers */
NetSetH andler( NULL ) ;
net_set_udp_h andler( NULL ) ;
net_set_icmp_handler ( NULL ) ;
# endif
return ret ;
@ -498,13 +515,6 @@ startAgainTimeout(void)
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 ;
@ -541,7 +551,7 @@ void NetStartAgain(void)
NetRestartWrap = 0 ;
if ( NetDevExists ) {
NetSetTimeout ( 10000UL , startAgainTimeout ) ;
NetSetHandler ( startAgainHandler ) ;
net_set_udp_handler ( NULL ) ;
} else {
net_set_state ( NETLOOP_FAIL ) ;
}
@ -555,17 +565,36 @@ void NetStartAgain(void)
* 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
@ -1091,11 +1120,11 @@ NetReceive(uchar *inpkt, int len)
/*
* IP header OK . Pass the packet to the current handler .
*/
( * packetH andler) ( ( 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_h andler) ( ( uchar * ) ip + IP_UDP_HDR_SIZE ,
ntohs ( ip - > udp_dst ) ,
src_ip ,
ntohs ( ip - > udp_src ) ,
ntohs ( ip - > udp_len ) - UDP_HDR_SIZE ) ;
break ;
}
}