mirror of
https://github.com/u-boot/u-boot.git
synced 2025-05-09 03:21:51 +00:00
NET: pass source IP address to packet handlers
This is needed for the upcoming TFTP server implementation. This also simplifies PingHandler() and fixes rxhand_f documentation. Signed-off-by: Luca Ceresoli <luca.ceresoli@comelit.it> Cc: Wolfgang Denk <wd@denx.de> Acked-by: Detlev Zundel <dzu@denx.de>
This commit is contained in:
parent
8eccee7ae7
commit
03eb129f8a
9 changed files with 44 additions and 28 deletions
|
@ -40,13 +40,14 @@ static short nc_port; /* source/target port */
|
||||||
static const char *output_packet; /* used by first send udp */
|
static const char *output_packet; /* used by first send udp */
|
||||||
static int output_packet_len = 0;
|
static int output_packet_len = 0;
|
||||||
|
|
||||||
static void nc_wait_arp_handler (uchar * pkt, unsigned dest, unsigned src,
|
static void nc_wait_arp_handler(uchar *pkt, unsigned dest,
|
||||||
|
IPaddr_t sip, unsigned src,
|
||||||
unsigned len)
|
unsigned len)
|
||||||
{
|
{
|
||||||
NetState = NETLOOP_SUCCESS; /* got arp reply - quit net loop */
|
NetState = NETLOOP_SUCCESS; /* got arp reply - quit net loop */
|
||||||
}
|
}
|
||||||
|
|
||||||
static void nc_handler (uchar * pkt, unsigned dest, unsigned src,
|
static void nc_handler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src,
|
||||||
unsigned len)
|
unsigned len)
|
||||||
{
|
{
|
||||||
if (input_size)
|
if (input_size)
|
||||||
|
|
|
@ -72,12 +72,17 @@
|
||||||
typedef ulong IPaddr_t;
|
typedef ulong IPaddr_t;
|
||||||
|
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* The current receive packet handler. Called with a pointer to the
|
* An incoming packet handler.
|
||||||
* application packet, and a protocol type (PORT_BOOTPC or PORT_TFTP).
|
* @param pkt pointer to the application packet
|
||||||
* All other packets are dealt with without calling the handler.
|
* @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);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* A timeout handler. Called after time interval has expired.
|
* A timeout handler. Called after time interval has expired.
|
||||||
|
|
|
@ -44,7 +44,8 @@ ulong seed1, seed2;
|
||||||
dhcp_state_t dhcp_state = INIT;
|
dhcp_state_t dhcp_state = INIT;
|
||||||
unsigned long dhcp_leasetime = 0;
|
unsigned long dhcp_leasetime = 0;
|
||||||
IPaddr_t NetDHCPServerIP = 0;
|
IPaddr_t NetDHCPServerIP = 0;
|
||||||
static void DhcpHandler(uchar * pkt, unsigned dest, unsigned src, unsigned len);
|
static void DhcpHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src,
|
||||||
|
unsigned len);
|
||||||
|
|
||||||
/* For Debug */
|
/* For Debug */
|
||||||
#if 0
|
#if 0
|
||||||
|
@ -282,7 +283,8 @@ static void BootpVendorProcess (u8 * ext, int size)
|
||||||
* Handle a BOOTP received packet.
|
* Handle a BOOTP received packet.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
BootpHandler(uchar * pkt, unsigned dest, unsigned src, unsigned len)
|
BootpHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src,
|
||||||
|
unsigned len)
|
||||||
{
|
{
|
||||||
Bootp_t *bp;
|
Bootp_t *bp;
|
||||||
char *s;
|
char *s;
|
||||||
|
@ -858,7 +860,8 @@ static void DhcpSendRequestPkt(Bootp_t *bp_offer)
|
||||||
* Handle DHCP received packets.
|
* Handle DHCP received packets.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
DhcpHandler(uchar * pkt, unsigned dest, unsigned src, unsigned len)
|
DhcpHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src,
|
||||||
|
unsigned len)
|
||||||
{
|
{
|
||||||
Bootp_t *bp = (Bootp_t *)pkt;
|
Bootp_t *bp = (Bootp_t *)pkt;
|
||||||
|
|
||||||
|
|
|
@ -101,7 +101,7 @@ DnsTimeout(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
DnsHandler(uchar *pkt, unsigned dest, unsigned src, unsigned len)
|
DnsHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src, unsigned len)
|
||||||
{
|
{
|
||||||
struct header *header;
|
struct header *header;
|
||||||
const unsigned char *p, *e, *s;
|
const unsigned char *p, *e, *s;
|
||||||
|
|
30
net/net.c
30
net/net.c
|
@ -555,7 +555,8 @@ startAgainTimeout(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
startAgainHandler(uchar * pkt, unsigned dest, unsigned src, unsigned len)
|
startAgainHandler(uchar *pkt, unsigned dest, IPaddr_t sip,
|
||||||
|
unsigned src, unsigned len)
|
||||||
{
|
{
|
||||||
/* Totally ignore the packet */
|
/* Totally ignore the packet */
|
||||||
}
|
}
|
||||||
|
@ -752,13 +753,10 @@ PingTimeout (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
PingHandler (uchar * pkt, unsigned dest, unsigned src, unsigned len)
|
PingHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src,
|
||||||
|
unsigned len)
|
||||||
{
|
{
|
||||||
IPaddr_t tmp;
|
if (sip != NetPingIP)
|
||||||
volatile IP_t *ip = (volatile IP_t *)pkt;
|
|
||||||
|
|
||||||
tmp = NetReadIP((void *)&ip->ip_src);
|
|
||||||
if (tmp != NetPingIP)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
NetState = NETLOOP_SUCCESS;
|
NetState = NETLOOP_SUCCESS;
|
||||||
|
@ -990,7 +988,8 @@ CDPTimeout (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
CDPDummyHandler (uchar * pkt, unsigned dest, unsigned src, unsigned len)
|
CDPDummyHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src,
|
||||||
|
unsigned len)
|
||||||
{
|
{
|
||||||
/* nothing */
|
/* nothing */
|
||||||
}
|
}
|
||||||
|
@ -1304,6 +1303,7 @@ NetReceive(volatile uchar * inpkt, int len)
|
||||||
IP_t *ip;
|
IP_t *ip;
|
||||||
ARP_t *arp;
|
ARP_t *arp;
|
||||||
IPaddr_t tmp;
|
IPaddr_t tmp;
|
||||||
|
IPaddr_t src_ip;
|
||||||
int x;
|
int x;
|
||||||
uchar *pkt;
|
uchar *pkt;
|
||||||
#if defined(CONFIG_CMD_CDP)
|
#if defined(CONFIG_CMD_CDP)
|
||||||
|
@ -1477,7 +1477,7 @@ NetReceive(volatile uchar * inpkt, int len)
|
||||||
memcpy(NetArpWaitPacketMAC, &arp->ar_data[0], 6);
|
memcpy(NetArpWaitPacketMAC, &arp->ar_data[0], 6);
|
||||||
|
|
||||||
#ifdef CONFIG_NETCONSOLE
|
#ifdef CONFIG_NETCONSOLE
|
||||||
(*packetHandler)(0,0,0,0);
|
(*packetHandler)(0, 0, 0, 0, 0);
|
||||||
#endif
|
#endif
|
||||||
/* modify header, and transmit it */
|
/* modify header, and transmit it */
|
||||||
memcpy(((Ethernet_t *)NetArpWaitTxPacket)->et_dest, NetArpWaitPacketMAC, 6);
|
memcpy(((Ethernet_t *)NetArpWaitTxPacket)->et_dest, NetArpWaitPacketMAC, 6);
|
||||||
|
@ -1517,7 +1517,7 @@ NetReceive(volatile uchar * inpkt, int len)
|
||||||
NetCopyIP(&NetServerIP, &arp->ar_data[ 6]);
|
NetCopyIP(&NetServerIP, &arp->ar_data[ 6]);
|
||||||
memcpy (NetServerEther, &arp->ar_data[ 0], 6);
|
memcpy (NetServerEther, &arp->ar_data[ 0], 6);
|
||||||
|
|
||||||
(*packetHandler)(0,0,0,0);
|
(*packetHandler)(0, 0, 0, 0, 0);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
@ -1557,6 +1557,8 @@ NetReceive(volatile uchar * inpkt, int len)
|
||||||
#endif
|
#endif
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
/* Read source IP address for later use */
|
||||||
|
src_ip = NetReadIP(&ip->ip_src);
|
||||||
/*
|
/*
|
||||||
* The function returns the unchanged packet if it's not
|
* The function returns the unchanged packet if it's not
|
||||||
* a fragment, and either the complete packet or NULL if
|
* a fragment, and either the complete packet or NULL if
|
||||||
|
@ -1596,11 +1598,12 @@ NetReceive(volatile uchar * inpkt, int len)
|
||||||
* IP header OK. Pass the packet to the current handler.
|
* IP header OK. Pass the packet to the current handler.
|
||||||
*/
|
*/
|
||||||
/* XXX point to ip packet */
|
/* XXX point to ip packet */
|
||||||
(*packetHandler)((uchar *)ip, 0, 0, 0);
|
(*packetHandler)((uchar *)ip, 0, src_ip, 0, 0);
|
||||||
return;
|
return;
|
||||||
case ICMP_ECHO_REQUEST:
|
case ICMP_ECHO_REQUEST:
|
||||||
debug("Got ICMP ECHO REQUEST, return %d bytes \n",
|
debug("Got ICMP ECHO REQUEST, "
|
||||||
ETHER_HDR_SIZE + len);
|
"return %d bytes\n",
|
||||||
|
ETHER_HDR_SIZE + len);
|
||||||
|
|
||||||
memcpy (&et->et_dest[0], &et->et_src[0], 6);
|
memcpy (&et->et_dest[0], &et->et_src[0], 6);
|
||||||
memcpy (&et->et_src[ 0], NetOurEther, 6);
|
memcpy (&et->et_src[ 0], NetOurEther, 6);
|
||||||
|
@ -1678,6 +1681,7 @@ NetReceive(volatile uchar * inpkt, int len)
|
||||||
*/
|
*/
|
||||||
(*packetHandler)((uchar *)ip +IP_HDR_SIZE,
|
(*packetHandler)((uchar *)ip +IP_HDR_SIZE,
|
||||||
ntohs(ip->udp_dst),
|
ntohs(ip->udp_dst),
|
||||||
|
src_ip,
|
||||||
ntohs(ip->udp_src),
|
ntohs(ip->udp_src),
|
||||||
ntohs(ip->udp_len) - 8);
|
ntohs(ip->udp_len) - 8);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -580,7 +580,7 @@ NfsTimeout (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
NfsHandler (uchar *pkt, unsigned dest, unsigned src, unsigned len)
|
NfsHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src, unsigned len)
|
||||||
{
|
{
|
||||||
int rlen;
|
int rlen;
|
||||||
|
|
||||||
|
|
|
@ -43,7 +43,8 @@ int RarpTry;
|
||||||
* Handle a RARP received packet.
|
* Handle a RARP received packet.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
RarpHandler(uchar * dummi0, unsigned dummi1, unsigned dummi2, unsigned dummi3)
|
RarpHandler(uchar *dummi0, unsigned dummi1, IPaddr_t sip, unsigned dummi2,
|
||||||
|
unsigned dummi3)
|
||||||
{
|
{
|
||||||
char *s;
|
char *s;
|
||||||
debug("Got good RARP\n");
|
debug("Got good RARP\n");
|
||||||
|
|
|
@ -48,7 +48,8 @@ SntpTimeout (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
SntpHandler (uchar *pkt, unsigned dest, unsigned src, unsigned len)
|
SntpHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src,
|
||||||
|
unsigned len)
|
||||||
{
|
{
|
||||||
struct sntp_pkt_t *rpktp = (struct sntp_pkt_t *)pkt;
|
struct sntp_pkt_t *rpktp = (struct sntp_pkt_t *)pkt;
|
||||||
struct rtc_time tm;
|
struct rtc_time tm;
|
||||||
|
|
|
@ -278,7 +278,8 @@ TftpSend (void)
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
TftpHandler (uchar * pkt, unsigned dest, unsigned src, unsigned len)
|
TftpHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src,
|
||||||
|
unsigned len)
|
||||||
{
|
{
|
||||||
ushort proto;
|
ushort proto;
|
||||||
ushort *s;
|
ushort *s;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue