net: Make netconsole src and dest ports configurable

It is desirable to use different port numbers for sending and receiving
packets with netconsole in the case where you have more than one device
on the local subnet with netconsole enabled for broadcast.  When they
use the same port for both, any output from one will look like input to
the other.  This is typlically not desirable.

This patch allows the input and output ports to be specified separately
in the environment.

Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
Cc: Mike Frysinger <vapier@gentoo.org>
Acked-by: Mike Frysinger <vapier@gentoo.org>
diff --git a/drivers/net/netconsole.c b/drivers/net/netconsole.c
index 14243b8..86f5301 100644
--- a/drivers/net/netconsole.c
+++ b/drivers/net/netconsole.c
@@ -36,7 +36,8 @@
 static int net_timeout;
 static uchar nc_ether[6]; /* server enet address */
 static IPaddr_t nc_ip; /* server ip */
-static short nc_port; /* source/target port */
+static short nc_out_port; /* target output port */
+static short nc_in_port; /* source input port */
 static const char *output_packet; /* used by first send udp */
 static int output_packet_len;
 
@@ -71,7 +72,7 @@
 		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,
+		NetSendUDPPacket(nc_ether, nc_ip, nc_out_port, nc_in_port,
 			output_packet_len);
 	}
 }
@@ -80,7 +81,7 @@
 {
 	int end, chunk;
 
-	if (dest != nc_port || !len)
+	if (dest != nc_in_port || !len)
 		return 0; /* not for us */
 
 	debug_cond(DEBUG_DEV_PKT, "input: \"%*.*s\"\n", len, len, pkt);
@@ -139,7 +140,7 @@
 	memcpy(pkt, buf, len);
 	ether = nc_ether;
 	ip = nc_ip;
-	NetSendUDPPacket(ether, ip, nc_port, nc_port, len);
+	NetSendUDPPacket(ether, ip, nc_out_port, nc_in_port, len);
 
 	if (inited)
 		eth_halt();
@@ -148,20 +149,30 @@
 static int nc_start(void)
 {
 	int netmask, our_ip;
+	char *p;
 
-	nc_port = 6666;		/* default port */
+	nc_out_port = 6666; /* default port */
+	nc_in_port = nc_out_port;
 
 	if (getenv("ncip")) {
-		char *p;
 
 		nc_ip = getenv_IPaddr("ncip");
 		if (!nc_ip)
 			return -1;	/* ncip is 0.0.0.0 */
 		p = strchr(getenv("ncip"), ':');
-		if (p != NULL)
-			nc_port = simple_strtoul(p + 1, NULL, 10);
+		if (p != NULL) {
+			nc_out_port = simple_strtoul(p + 1, NULL, 10);
+			nc_in_port = nc_out_port;
+		}
 	} else
-		nc_ip = ~0;		/* ncip is not set */
+		nc_ip = ~0; /* ncip is not set, so broadcast */
+
+	p = getenv("ncoutport");
+	if (p != NULL)
+		nc_out_port = simple_strtoul(p, NULL, 10);
+	p = getenv("ncinport");
+	if (p != NULL)
+		nc_in_port = simple_strtoul(p, NULL, 10);
 
 	our_ip = getenv_IPaddr("ipaddr");
 	netmask = getenv_IPaddr("netmask");