[U-Boot] [PATCH] 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 --- doc/README.NetConsole | 3 +++ drivers/net/netconsole.c | 29 ++++++++++++++++++++--------- tools/netconsole | 18 +++++++++++------- 3 files changed, 34 insertions(+), 16 deletions(-)
diff --git a/doc/README.NetConsole b/doc/README.NetConsole index c8bcb90..070e86a 100644 --- a/doc/README.NetConsole +++ b/doc/README.NetConsole @@ -11,6 +11,9 @@ port of the destination. The format is <ip_addr>:<port>. If <port> is omitted, the value of 6666 is used. If the env var doesn't exist, the broadcast address and port 6666 are used. If it is set to an IP address of 0 (or 0.0.0.0) then no messages are sent to the network. +The source / listening port can be configured separately by setting +the 'ncinport' environment variable and the destination port can be +configured by setting the 'ncoutport' environment variable.
For example, if your server IP is 192.168.1.1, you could use:
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 output_recursion; 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 @@ void NcStart(void) 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 nc_input_packet(uchar *pkt, unsigned dest, unsigned src, unsigned len) { 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 @@ static void nc_send_packet(const char *buf, int len) 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 void nc_send_packet(const char *buf, int len) 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"); diff --git a/tools/netconsole b/tools/netconsole index c8109bb..b2b6edb 100755 --- a/tools/netconsole +++ b/tools/netconsole @@ -2,7 +2,7 @@
usage() { ( - echo "Usage: $0 <board IP> [board port]" + echo "Usage: $0 <board-IP> [board-port [board-in-port]]" echo "" echo "If port is not specified, '6666' will be used" [ -z "$*" ] && exit 0 @@ -24,9 +24,13 @@ while [ -n "$1" ] ; do done
ip=$1 -port=${2:-6666} +board_out_port=${2:-6666} +board_in_port=${3:-$board_out_port}
-if [ -z "${ip}" ] || [ -n "$3" ] ; then +echo Board out port: $board_out_port +echo Board in port: $board_in_port + +if [ -z "${ip}" ] || [ -n "$4" ] ; then usage "Invalid number of arguments" fi
@@ -41,19 +45,19 @@ stty -icanon -echo intr ^T ( if type ncb 2>/dev/null ; then # see if ncb is in $PATH - exec ncb ${port} + exec ncb ${board_out_port}
elif [ -x ${0%/*}/ncb ] ; then # maybe it's in the same dir as the netconsole script - exec ${0%/*}/ncb ${port} + exec ${0%/*}/ncb ${board_out_port}
else # blah, just use regular netcat - while ${nc} -u -l -p ${port} < /dev/null ; do + while ${nc} -u -l -p ${board_out_port} < /dev/null ; do : done fi ) & pid=$! -${nc} -u ${ip} ${port} +${nc} -u ${ip} ${board_in_port} kill ${pid} 2>/dev/null

On Tuesday 24 July 2012 16:11:05 Joe Hershberger wrote:
--- a/tools/netconsole +++ b/tools/netconsole
+board_in_port=${3:-$board_out_port}
board_in_port=${3:-${board_out_port}}
+echo Board out port: $board_out_port +echo Board in port: $board_in_port
echo "Board out port: ${board_out_port}" echo "Board in port: ${board_in_port}" -mike

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 --- doc/README.NetConsole | 3 +++ drivers/net/netconsole.c | 29 ++++++++++++++++++++--------- tools/netconsole | 18 +++++++++++------- 3 files changed, 34 insertions(+), 16 deletions(-)
diff --git a/doc/README.NetConsole b/doc/README.NetConsole index c8bcb90..070e86a 100644 --- a/doc/README.NetConsole +++ b/doc/README.NetConsole @@ -11,6 +11,9 @@ port of the destination. The format is <ip_addr>:<port>. If <port> is omitted, the value of 6666 is used. If the env var doesn't exist, the broadcast address and port 6666 are used. If it is set to an IP address of 0 (or 0.0.0.0) then no messages are sent to the network. +The source / listening port can be configured separately by setting +the 'ncinport' environment variable and the destination port can be +configured by setting the 'ncoutport' environment variable.
For example, if your server IP is 192.168.1.1, you could use:
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 output_recursion; 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 @@ void NcStart(void) 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 nc_input_packet(uchar *pkt, unsigned dest, unsigned src, unsigned len) { 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 @@ static void nc_send_packet(const char *buf, int len) 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 void nc_send_packet(const char *buf, int len) 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"); diff --git a/tools/netconsole b/tools/netconsole index c8109bb..1a0ef22 100755 --- a/tools/netconsole +++ b/tools/netconsole @@ -2,7 +2,7 @@
usage() { ( - echo "Usage: $0 <board IP> [board port]" + echo "Usage: $0 <board-IP> [board-port [board-in-port]]" echo "" echo "If port is not specified, '6666' will be used" [ -z "$*" ] && exit 0 @@ -24,9 +24,13 @@ while [ -n "$1" ] ; do done
ip=$1 -port=${2:-6666} +board_out_port=${2:-6666} +board_in_port=${3:-${board_out_port}}
-if [ -z "${ip}" ] || [ -n "$3" ] ; then +echo Board out port: ${board_out_port} +echo Board in port: ${board_in_port} + +if [ -z "${ip}" ] || [ -n "$4" ] ; then usage "Invalid number of arguments" fi
@@ -41,19 +45,19 @@ stty -icanon -echo intr ^T ( if type ncb 2>/dev/null ; then # see if ncb is in $PATH - exec ncb ${port} + exec ncb ${board_out_port}
elif [ -x ${0%/*}/ncb ] ; then # maybe it's in the same dir as the netconsole script - exec ${0%/*}/ncb ${port} + exec ${0%/*}/ncb ${board_out_port}
else # blah, just use regular netcat - while ${nc} -u -l -p ${port} < /dev/null ; do + while ${nc} -u -l -p ${board_out_port} < /dev/null ; do : done fi ) & pid=$! -${nc} -u ${ip} ${port} +${nc} -u ${ip} ${board_in_port} kill ${pid} 2>/dev/null

Acked-by: Mike Frysinger vapier@gentoo.org -mike
participants (2)
-
Joe Hershberger
-
Mike Frysinger