NET: pass source IP address to packet handlers
authorLuca Ceresoli <luca.ceresoli@comelit.it>
Mon, 18 Apr 2011 06:19:50 +0000 (06:19 +0000)
committerWolfgang Denk <wd@denx.de>
Thu, 12 May 2011 17:38:19 +0000 (19:38 +0200)
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>
drivers/net/netconsole.c
include/net.h
net/bootp.c
net/dns.c
net/net.c
net/nfs.c
net/rarp.c
net/sntp.c
net/tftp.c

index e27bb3e71db9b0e593681f038bf36cb10cf675bb..e40efb826bb13973a621584afedaf3c00886ee7d 100644 (file)
@@ -40,13 +40,14 @@ static short nc_port;                       /* source/target port */
 static const char *output_packet;      /* used by first send udp */
 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)
 {
        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)
 {
        if (input_size)
index 95ef8ab83c3f0ac3c9f3f3a1cfb7b3125d9ca225..01f7159a0781aae480d55d1fc3373e6197c12b9e 100644 (file)
 typedef ulong          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);
 
 /*
  *     A timeout handler.  Called after time interval has expired.
index 87b027e8fa65b03e126992a3a44971e7842c24ba..4db63cbbe64c65dd6722d94b91b5e2fb9aeb863a 100644 (file)
@@ -44,7 +44,8 @@ ulong         seed1, seed2;
 dhcp_state_t dhcp_state = INIT;
 unsigned long dhcp_leasetime = 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 */
 #if 0
@@ -282,7 +283,8 @@ static void BootpVendorProcess (u8 * ext, int size)
  *     Handle a BOOTP received packet.
  */
 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;
        char    *s;
@@ -858,7 +860,8 @@ static void DhcpSendRequestPkt(Bootp_t *bp_offer)
  *     Handle DHCP received packets.
  */
 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;
 
index bb3e3f54e05d03f3f8799cc65a376d2788350188..b51d1bd98220bdea88ef4cebe46a68b9f2ab4756 100644 (file)
--- a/net/dns.c
+++ b/net/dns.c
@@ -101,7 +101,7 @@ DnsTimeout(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;
        const unsigned char *p, *e, *s;
index 19ac0196b541e5d08d8599f2b01c9c3c5913f0c5..9566356b2ab85d71c13f46fa06928650fcd752be 100644 (file)
--- a/net/net.c
+++ b/net/net.c
@@ -555,7 +555,8 @@ startAgainTimeout(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 */
 }
@@ -752,13 +753,10 @@ PingTimeout (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;
-       volatile IP_t *ip = (volatile IP_t *)pkt;
-
-       tmp = NetReadIP((void *)&ip->ip_src);
-       if (tmp != NetPingIP)
+       if (sip != NetPingIP)
                return;
 
        NetState = NETLOOP_SUCCESS;
@@ -990,7 +988,8 @@ CDPTimeout (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 */
 }
@@ -1304,6 +1303,7 @@ NetReceive(volatile uchar * inpkt, int len)
        IP_t    *ip;
        ARP_t   *arp;
        IPaddr_t tmp;
+       IPaddr_t src_ip;
        int     x;
        uchar *pkt;
 #if defined(CONFIG_CMD_CDP)
@@ -1477,7 +1477,7 @@ NetReceive(volatile uchar * inpkt, int len)
                                memcpy(NetArpWaitPacketMAC, &arp->ar_data[0], 6);
 
 #ifdef CONFIG_NETCONSOLE
-                               (*packetHandler)(0,0,0,0);
+                               (*packetHandler)(0, 0, 0, 0, 0);
 #endif
                                /* modify header, and transmit it */
                                memcpy(((Ethernet_t *)NetArpWaitTxPacket)->et_dest, NetArpWaitPacketMAC, 6);
@@ -1517,7 +1517,7 @@ NetReceive(volatile uchar * inpkt, int len)
                                NetCopyIP(&NetServerIP, &arp->ar_data[ 6]);
                        memcpy (NetServerEther, &arp->ar_data[ 0], 6);
 
-                       (*packetHandler)(0,0,0,0);
+                       (*packetHandler)(0, 0, 0, 0, 0);
                }
                break;
 #endif
@@ -1557,6 +1557,8 @@ NetReceive(volatile uchar * inpkt, int len)
 #endif
                        return;
                }
+               /* Read source IP address for later use */
+               src_ip = NetReadIP(&ip->ip_src);
                /*
                 * The function returns the unchanged packet if it's not
                 * 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.
                                 */
                                /* XXX point to ip packet */
-                               (*packetHandler)((uchar *)ip, 0, 0, 0);
+                               (*packetHandler)((uchar *)ip, 0, src_ip, 0, 0);
                                return;
                        case ICMP_ECHO_REQUEST:
-                               debug("Got ICMP ECHO REQUEST, return %d bytes \n",
-                                       ETHER_HDR_SIZE + len);
+                               debug("Got ICMP ECHO REQUEST, "
+                                     "return %d bytes\n",
+                                     ETHER_HDR_SIZE + len);
 
                                memcpy (&et->et_dest[0], &et->et_src[0], 6);
                                memcpy (&et->et_src[ 0], NetOurEther, 6);
@@ -1678,6 +1681,7 @@ NetReceive(volatile uchar * inpkt, int len)
                 */
                (*packetHandler)((uchar *)ip +IP_HDR_SIZE,
                                                ntohs(ip->udp_dst),
+                                               src_ip,
                                                ntohs(ip->udp_src),
                                                ntohs(ip->udp_len) - 8);
                break;
index d11bb4c15fb87803eb252c764616ed814571262a..f76f60d16270ba3b7de637c4455c53a38cbc2468 100644 (file)
--- a/net/nfs.c
+++ b/net/nfs.c
@@ -580,7 +580,7 @@ NfsTimeout (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;
 
index 9444c036453a946b7e232f4d3c89140f624f9b7b..94c86d3429b7f7479aa2dbb1c0f5dd53b16ac1d0 100644 (file)
@@ -43,7 +43,8 @@ int           RarpTry;
  *     Handle a RARP received packet.
  */
 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;
        debug("Got good RARP\n");
index 76c10ecd3b5d4565c684d155659e5a2036636860..82f2fe6cd1cf45187e529a231f2538f8f2f5be1d 100644 (file)
@@ -48,7 +48,8 @@ SntpTimeout (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 rtc_time tm;
index ed559b71d57b5437e88b6c3f331dd324f0607ec9..00abec38049484b32063496bf8e9853e52b65b82 100644 (file)
@@ -278,7 +278,8 @@ TftpSend (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 *s;