diff options
Diffstat (limited to 'drivers/net/netconsole.c')
| -rw-r--r-- | drivers/net/netconsole.c | 96 | 
1 files changed, 65 insertions, 31 deletions
| diff --git a/drivers/net/netconsole.c b/drivers/net/netconsole.c index da82aa94c..63ce73c81 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 |