summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/netconsole.c96
1 files changed, 65 insertions, 31 deletions
diff --git a/drivers/net/netconsole.c b/drivers/net/netconsole.c
index da82aa94ca..63ce73c818 100644
--- a/drivers/net/netconsole.c
+++ b/drivers/net/netconsole.c
@@ -69,8 +69,69 @@ static void nc_timeout(void)
net_set_state(NETLOOP_SUCCESS);
}
+static int is_broadcast(IPaddr_t ip)
+{
+ static IPaddr_t netmask;
+ static IPaddr_t our_ip;
+ static int env_changed_id;
+ int env_id = get_env_id();
+
+ /* update only when the environment has changed */
+ if (env_changed_id != env_id) {
+ netmask = getenv_IPaddr("netmask");
+ our_ip = getenv_IPaddr("ipaddr");
+
+ env_changed_id = env_id;
+ }
+
+ return (ip == ~0 || /* 255.255.255.255 */
+ ((netmask & our_ip) == (netmask & ip) && /* on the same net */
+ (netmask | ip) == ~0)); /* broadcast to our net */
+}
+
+static int refresh_settings_from_env(void)
+{
+ const char *p;
+ static int env_changed_id;
+ int env_id = get_env_id();
+
+ /* update only when the environment has changed */
+ if (env_changed_id != env_id) {
+ if (getenv("ncip")) {
+ nc_ip = getenv_IPaddr("ncip");
+ if (!nc_ip)
+ return -1; /* ncip is 0.0.0.0 */
+ p = strchr(getenv("ncip"), ':');
+ 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, 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);
+
+ if (is_broadcast(nc_ip))
+ /* broadcast MAC address */
+ memset(nc_ether, 0xff, sizeof(nc_ether));
+ else
+ /* force arp request */
+ memset(nc_ether, 0, sizeof(nc_ether));
+ }
+ return 0;
+}
+
+/**
+ * Called from NetLoop in net/net.c before each packet
+ */
void NcStart(void)
{
+ refresh_settings_from_env();
if (!output_packet_len || memcmp(nc_ether, NetEtherNullAddr, 6)) {
/* going to check for input packet */
net_set_udp_handler(nc_handler);
@@ -166,41 +227,14 @@ static void nc_send_packet(const char *buf, int len)
static int nc_start(void)
{
- int netmask, our_ip;
- char *p;
+ int retval;
nc_out_port = 6666; /* default port */
nc_in_port = nc_out_port;
- if (getenv("ncip")) {
-
- nc_ip = getenv_IPaddr("ncip");
- if (!nc_ip)
- return -1; /* ncip is 0.0.0.0 */
- p = strchr(getenv("ncip"), ':');
- 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, 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");
-
- if (nc_ip == ~0 || /* 255.255.255.255 */
- ((netmask & our_ip) == (netmask & nc_ip) && /* on the same net */
- (netmask | nc_ip) == ~0)) /* broadcast to our net */
- memset(nc_ether, 0xff, sizeof(nc_ether));
- else
- memset(nc_ether, 0, sizeof(nc_ether)); /* force arp request */
+ retval = refresh_settings_from_env();
+ if (retval != 0)
+ return retval;
/*
* Initialize the static IP settings and buffer pointers
OpenPOWER on IntegriCloud