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>
master
Joe Hershberger 12 years ago
parent ee1f4caaa2
commit 7f51898c1b
  1. 3
      doc/README.NetConsole
  2. 29
      drivers/net/netconsole.c
  3. 18
      tools/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 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 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. 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: For example, if your server IP is 192.168.1.1, you could use:

@ -36,7 +36,8 @@ static int output_recursion;
static int net_timeout; static int net_timeout;
static uchar nc_ether[6]; /* server enet address */ static uchar nc_ether[6]; /* server enet address */
static IPaddr_t nc_ip; /* server ip */ 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 const char *output_packet; /* used by first send udp */
static int output_packet_len; static int output_packet_len;
@ -71,7 +72,7 @@ void NcStart(void)
net_set_arp_handler(nc_wait_arp_handler); net_set_arp_handler(nc_wait_arp_handler);
pkt = (uchar *)NetTxPacket + NetEthHdrSize() + IP_UDP_HDR_SIZE; pkt = (uchar *)NetTxPacket + NetEthHdrSize() + IP_UDP_HDR_SIZE;
memcpy(pkt, output_packet, output_packet_len); 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); output_packet_len);
} }
} }
@ -80,7 +81,7 @@ int nc_input_packet(uchar *pkt, unsigned dest, unsigned src, unsigned len)
{ {
int end, chunk; int end, chunk;
if (dest != nc_port || !len) if (dest != nc_in_port || !len)
return 0; /* not for us */ return 0; /* not for us */
debug_cond(DEBUG_DEV_PKT, "input: \"%*.*s\"\n", len, len, pkt); 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); memcpy(pkt, buf, len);
ether = nc_ether; ether = nc_ether;
ip = nc_ip; ip = nc_ip;
NetSendUDPPacket(ether, ip, nc_port, nc_port, len); NetSendUDPPacket(ether, ip, nc_out_port, nc_in_port, len);
if (inited) if (inited)
eth_halt(); eth_halt();
@ -148,20 +149,30 @@ static void nc_send_packet(const char *buf, int len)
static int nc_start(void) static int nc_start(void)
{ {
int netmask, our_ip; 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")) { if (getenv("ncip")) {
char *p;
nc_ip = getenv_IPaddr("ncip"); nc_ip = getenv_IPaddr("ncip");
if (!nc_ip) if (!nc_ip)
return -1; /* ncip is 0.0.0.0 */ return -1; /* ncip is 0.0.0.0 */
p = strchr(getenv("ncip"), ':'); p = strchr(getenv("ncip"), ':');
if (p != NULL) if (p != NULL) {
nc_port = simple_strtoul(p + 1, NULL, 10); nc_out_port = simple_strtoul(p + 1, NULL, 10);
nc_in_port = nc_out_port;
}
} else } 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"); our_ip = getenv_IPaddr("ipaddr");
netmask = getenv_IPaddr("netmask"); netmask = getenv_IPaddr("netmask");

@ -2,7 +2,7 @@
usage() { usage() {
( (
echo "Usage: $0 <board IP> [board port]" echo "Usage: $0 <board-IP> [board-port [board-in-port]]"
echo "" echo ""
echo "If port is not specified, '6666' will be used" echo "If port is not specified, '6666' will be used"
[ -z "$*" ] && exit 0 [ -z "$*" ] && exit 0
@ -24,9 +24,13 @@ while [ -n "$1" ] ; do
done done
ip=$1 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" usage "Invalid number of arguments"
fi fi
@ -41,19 +45,19 @@ stty -icanon -echo intr ^T
( (
if type ncb 2>/dev/null ; then if type ncb 2>/dev/null ; then
# see if ncb is in $PATH # see if ncb is in $PATH
exec ncb ${port} exec ncb ${board_out_port}
elif [ -x ${0%/*}/ncb ] ; then elif [ -x ${0%/*}/ncb ] ; then
# maybe it's in the same dir as the netconsole script # maybe it's in the same dir as the netconsole script
exec ${0%/*}/ncb ${port} exec ${0%/*}/ncb ${board_out_port}
else else
# blah, just use regular netcat # 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 done
fi fi
) & ) &
pid=$! pid=$!
${nc} -u ${ip} ${port} ${nc} -u ${ip} ${board_in_port}
kill ${pid} 2>/dev/null kill ${pid} 2>/dev/null

Loading…
Cancel
Save