static inline int env_changed(int *id) { int env_id = get_env_id(); if (*id != env_id) { debug("env_id: %d -> %d\n", *id, env_id); *id = env_id; return 1; } return 0; }
static int is_broadcast(struct in_addr ip) { static struct in_addr netmask; static struct in_addr 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_ip("netmask"); our_ip = getenv_ip("ipaddr"); env_changed_id = env_id; } return (ip.s_addr == ~0 || /* 255.255.255.255 (global bcast) */ ((netmask.s_addr & our_ip.s_addr) == (netmask.s_addr & ip.s_addr) && /* on the same net and */ (netmask.s_addr | ip.s_addr) == ~0)); /* bcast to our net */ }
static void NetInitLoop(void) { static int env_changed_id; int env_id = get_env_id(); /* update only when the environment has changed */ if (env_changed_id != env_id) { NetOurIP = getenv_IPaddr("ipaddr"); NetOurGatewayIP = getenv_IPaddr("gatewayip"); NetOurSubnetMask = getenv_IPaddr("netmask"); NetServerIP = getenv_IPaddr("serverip"); NetOurNativeVLAN = getenv_VLAN("nvlan"); NetOurVLAN = getenv_VLAN("vlan"); #if defined(CONFIG_CMD_DNS) NetOurDNSIP = getenv_IPaddr("dnsip"); #endif env_changed_id = env_id; } memcpy(NetOurEther, eth_get_dev()->enetaddr, 6); return; }
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_ip("ncip"); if (!nc_ip.s_addr) 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.s_addr = ~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; }