Patchwork [U-Boot,2/6] NET: pass source IP address to packet handlers

login
register
mail settings
Submitter Luca Ceresoli
Date April 14, 2011, 3:52 p.m.
Message ID <1302796377-3321-3-git-send-email-luca.ceresoli@comelit.it>
Download mbox | patch
Permalink /patch/91256/
State Accepted
Headers show

Comments

Luca Ceresoli - April 14, 2011, 3:52 p.m.
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>
---
 drivers/net/netconsole.c |    5 +++--
 include/net.h            |   15 ++++++++++-----
 net/bootp.c              |    9 ++++++---
 net/dns.c                |    2 +-
 net/net.c                |   25 ++++++++++++++-----------
 net/nfs.c                |    2 +-
 net/rarp.c               |    3 ++-
 net/sntp.c               |    3 ++-
 net/tftp.c               |    3 ++-
 9 files changed, 41 insertions(+), 26 deletions(-)
Wolfgang Denk - April 30, 2011, 8:22 p.m.
Dear Luca Ceresoli,

In message <1302796377-3321-3-git-send-email-luca.ceresoli@comelit.it> you wrote:
> 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>
> ---
>  drivers/net/netconsole.c |    5 +++--
>  include/net.h            |   15 ++++++++++-----
>  net/bootp.c              |    9 ++++++---
>  net/dns.c                |    2 +-
>  net/net.c                |   25 ++++++++++++++-----------
>  net/nfs.c                |    2 +-
>  net/rarp.c               |    3 ++-
>  net/sntp.c               |    3 ++-
>  net/tftp.c               |    3 ++-
>  9 files changed, 41 insertions(+), 26 deletions(-)

Applied, thanks.

Best regards,

Wolfgang Denk
Wolfgang Denk - April 30, 2011, 8:24 p.m.
Dear Luca Ceresoli,

In message <1302796377-3321-3-git-send-email-luca.ceresoli@comelit.it> you wrote:
> 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>

Undone this and previous one as there is a V2 version of this patch.

I wish you would thread yout postings!

Best regards,

Wolfgang Denk
Luca Ceresoli - May 3, 2011, 8:54 a.m.
Hi Wolfgang,

Wolfgang Denk wrote:

> Dear Luca Ceresoli,
>
> In message<1302796377-3321-3-git-send-email-luca.ceresoli@comelit.it>  you wrote:
>> 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>
> Undone this and previous one as there is a V2 version of this patch.
>
> I wish you would thread yout postings!
I'm sorry for your wasted time, but it's not clear (to me at least...) how
postings should be threaded in the U-Boot ml.

The Wiki says:

>  Make sure that your mailer adds or keeps correct
>  |"In-reply-to:"|  and|"References:"|  headers, so threading of
>  messages is working and everybody can see that the new message
>  refers to some older posting of the same topic.
>
>  Uncommented and un-threaded repostings are extremely annoying and
>  time-consuming, as we have to try to remember if anything similar has
>  been posted before, look up the old threads, and then manually
>  compare if anything has been changed, or what.

'correct|"In-reply-to:"|  and|"References:"|' can have many interpretations.

On the ML I see varying ones, and I even see submissions with NO THREADING
AT ALL: the first submit is in a thread, v2 starts a new thread, v3 yet
another one etc.

MY humble interpretation of the Wiki wording is this:

- [PATCH 0/2]
   |
   +->  [PATCH 1/2]
   +->  [PATCH 2/2]
   |   +->  Re: [PATCH 2/2] reviewers comments to patch 2/2
   |   +->  Re: [PATCH 2/2] more reviewers comments to patch 2/2
   |
   +->  Re: [PATCH 0/2] reviewers comments to the patchset (0/2)
   |   +->  Re: [PATCH 0/2] discussion...
   |
   +->  [PATCH v2 0/2] resubmit (In-Reply-To: the first submit)
       |
       +->  [PATCH v2 1/2]
       +->  [PATCH v2 2/2]
       |   ... more discussion - not shown...
       |
       +->  [PATCH v3 0/2] resubmit (In-Reply-To: the first submit)
           |
           +->  [PATCH v3 1/2]
           +->  [PATCH v3 2/2]

What's wrong with this?
Please state in absolutely unambiguous detail what the correct threading is,
and please docuemnt it in the wiki for everybody.

My postings look correctly threaded according to the above interpretation,
as you can see for example on the Gmane threaded interface.

Luca

Patch

diff --git a/drivers/net/netconsole.c b/drivers/net/netconsole.c
index e27bb3e..ed753d1 100644
--- a/drivers/net/netconsole.c
+++ b/drivers/net/netconsole.c
@@ -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)
diff --git a/include/net.h b/include/net.h
index 95ef8ab..01f7159 100644
--- a/include/net.h
+++ b/include/net.h
@@ -72,12 +72,17 @@ 
 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.
diff --git a/net/bootp.c b/net/bootp.c
index 87b027e..eafaae2 100644
--- a/net/bootp.c
+++ b/net/bootp.c
@@ -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;
 
diff --git a/net/dns.c b/net/dns.c
index bb3e3f5..b51d1bd 100644
--- 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;
diff --git a/net/net.c b/net/net.c
index a609632..79afd8b 100644
--- 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,7 +1598,7 @@  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",
@@ -1678,6 +1680,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;
diff --git a/net/nfs.c b/net/nfs.c
index d11bb4c..23e43e1 100644
--- 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;
 
diff --git a/net/rarp.c b/net/rarp.c
index 9444c03..d1c83e0 100644
--- a/net/rarp.c
+++ b/net/rarp.c
@@ -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");
diff --git a/net/sntp.c b/net/sntp.c
index 76c10ec..7342cfd 100644
--- a/net/sntp.c
+++ b/net/sntp.c
@@ -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;
diff --git a/net/tftp.c b/net/tftp.c
index ed559b7..8e6df0a 100644
--- a/net/tftp.c
+++ b/net/tftp.c
@@ -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;