net: Allow netconsole settings to change after nc_start
Refresh the netconsole settings from the env before each packet instead of only on netconsole init. Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
This commit is contained in:
parent
f8be7d659c
commit
e827fec2b2
|
@ -69,8 +69,69 @@ static void nc_timeout(void)
|
||||||
net_set_state(NETLOOP_SUCCESS);
|
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)
|
void NcStart(void)
|
||||||
{
|
{
|
||||||
|
refresh_settings_from_env();
|
||||||
if (!output_packet_len || memcmp(nc_ether, NetEtherNullAddr, 6)) {
|
if (!output_packet_len || memcmp(nc_ether, NetEtherNullAddr, 6)) {
|
||||||
/* going to check for input packet */
|
/* going to check for input packet */
|
||||||
net_set_udp_handler(nc_handler);
|
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)
|
static int nc_start(void)
|
||||||
{
|
{
|
||||||
int netmask, our_ip;
|
int retval;
|
||||||
char *p;
|
|
||||||
|
|
||||||
nc_out_port = 6666; /* default port */
|
nc_out_port = 6666; /* default port */
|
||||||
nc_in_port = nc_out_port;
|
nc_in_port = nc_out_port;
|
||||||
|
|
||||||
if (getenv("ncip")) {
|
retval = refresh_settings_from_env();
|
||||||
|
if (retval != 0)
|
||||||
nc_ip = getenv_IPaddr("ncip");
|
return retval;
|
||||||
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 */
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initialize the static IP settings and buffer pointers
|
* Initialize the static IP settings and buffer pointers
|
||||||
|
|
Loading…
Reference in New Issue