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:
 
 
 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;
 
                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);
        }
 }
 {
        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);
        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();
 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");
 
 
 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
 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
 
 (
 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