void net_init(void) { cyg_netdevtab_entry_t *t; unsigned index; struct eth_drv_sc *primary_net = (struct eth_drv_sc *)0; #if defined(CYGHWR_NET_DRIVERS) && (CYGHWR_NET_DRIVERS > 1) char *default_devname; int default_index; #endif #ifdef CYGDAT_REDBOOT_DEFAULT_BOOTP_SERVER_IP_ADDR char ip_addr[16]; #endif // Set defaults as appropriate #ifdef CYGSEM_REDBOOT_DEFAULT_NO_BOOTP use_bootp = false; #else use_bootp = true; #endif #ifdef CYGDBG_REDBOOT_NET_DEBUG net_debug = true; #else net_debug = false; #endif gdb_port = CYGNUM_REDBOOT_NETWORKING_TCP_PORT; #ifdef CYGSEM_REDBOOT_FLASH_CONFIG // Fetch values from saved config data, if available #if defined(CYGHWR_NET_DRIVERS) && (CYGHWR_NET_DRIVERS > 1) flash_get_config("net_device", &default_devname, CONFIG_NETPORT); #endif flash_get_config("net_debug", &net_debug, CONFIG_BOOL); flash_get_config("gdb_port", &gdb_port, CONFIG_INT); flash_get_config("bootp", &use_bootp, CONFIG_BOOL); if (!use_bootp) { flash_get_IP("bootp_my_ip", &__local_ip_addr); #ifdef CYGSEM_REDBOOT_NETWORKING_USE_GATEWAY flash_get_IP("bootp_my_ip_mask", &__local_ip_mask); flash_get_IP("bootp_my_gateway_ip", &__local_ip_gate); #endif } #endif # ifdef CYGDBG_IO_ETH_DRIVERS_DEBUG // Don't override if the user has deliberately set something more // verbose. if (0 == cyg_io_eth_net_debug) cyg_io_eth_net_debug = net_debug; # endif have_net = false; // Make sure the recv buffers are set up eth_drv_buffers_init(); __pktbuf_init(); // Initialize network device(s). #if defined(CYGHWR_NET_DRIVERS) && (CYGHWR_NET_DRIVERS > 1) default_index = net_devindex(default_devname); if (default_index < 0) default_index = 0; #ifdef CYGSEM_REDBOOT_NETWORK_INIT_ONE_DEVICE if ((t = net_devtab_entry(default_index)) != NULL && t->init(t)) { t->status = CYG_NETDEVTAB_STATUS_AVAIL; primary_net = __local_enet_sc; } else #endif #endif for (index = 0; (t = net_devtab_entry(index)) != NULL; index++) { #if defined(CYGSEM_REDBOOT_NETWORK_INIT_ONE_DEVICE) if (index == default_index) continue; #endif if (t->init(t)) { t->status = CYG_NETDEVTAB_STATUS_AVAIL; if (primary_net == (struct eth_drv_sc *)0) { primary_net = __local_enet_sc; } #if defined(CYGHWR_NET_DRIVERS) && (CYGHWR_NET_DRIVERS > 1) #if !defined(CYGSEM_REDBOOT_NETWORK_INIT_ONE_DEVICE) if (index == default_index) { primary_net = __local_enet_sc; } #else break; #endif #endif } } __local_enet_sc = primary_net; if (!__local_enet_sc) { diag_printf("No network interfaces found\n"); return; } // Initialize the network [if present] if (use_bootp) { if (__bootp_find_local_ip(&my_bootp_info) == 0) { have_net = true; } else { // Is it an unset address, or has it been set to a static addr if (__local_ip_addr[0] == 0 && __local_ip_addr[1] == 0 && __local_ip_addr[2] == 0 && __local_ip_addr[3] == 0) { show_eth_info(); diag_printf("Can't get BOOTP info for device!\n"); } else { diag_printf("Can't get BOOTP info, using default IP address\n"); have_net = true; } } } else { enet_addr_t enet_addr; have_net = true; // Assume values in FLASH were OK // Tell the world that we are using this fixed IP address if (__arp_request((ip_addr_t *)__local_ip_addr, &enet_addr, 1) >= 0) { diag_printf("Warning: IP address %s in use\n", inet_ntoa((in_addr_t *)&__local_ip_addr)); } } if (have_net) { show_eth_info(); #ifdef CYGDAT_REDBOOT_DEFAULT_BOOTP_SERVER_IP_ADDR diag_sprintf(ip_addr, "%d.%d.%d.%d", CYGDAT_REDBOOT_DEFAULT_BOOTP_SERVER_IP_ADDR); inet_aton(ip_addr, &my_bootp_info.bp_siaddr); #endif #ifdef CYGSEM_REDBOOT_FLASH_CONFIG flash_get_IP("bootp_server_ip", (ip_addr_t *)&my_bootp_info.bp_siaddr); #endif #ifdef CYGPKG_REDBOOT_NETWORKING_DNS redboot_dns_res_init(); #endif show_addrs(); net_io_init(); } }
void net_init(void) { cyg_netdevtab_entry_t *t; // Set defaults as appropriate #ifdef CYGSEM_REDBOOT_DEFAULT_NO_BOOTP use_bootp = false; #else use_bootp = true; #endif #ifdef CYGDBG_REDBOOT_NET_DEBUG net_debug = true; #else net_debug = false; #endif gdb_port = CYGNUM_REDBOOT_NETWORKING_TCP_PORT; #ifdef CYGSEM_REDBOOT_FLASH_CONFIG // Fetch values from saved config data, if available flash_get_config("net_debug", &net_debug, CONFIG_BOOL); flash_get_config("gdb_port", &gdb_port, CONFIG_INT); flash_get_config("bootp", &use_bootp, CONFIG_BOOL); use_bootp = false; if (!use_bootp) { flash_get_IP("bootp_my_ip", &__local_ip_addr); #ifdef CYGSEM_REDBOOT_NETWORKING_USE_GATEWAY flash_get_IP("bootp_my_ip_mask", &__local_ip_mask); flash_get_IP("bootp_my_gateway_ip", &__local_ip_gate); #endif flash_get_config("bootp_server_ip", &my_bootp_info.bp_siaddr, CONFIG_IP); } #endif # ifdef CYGDBG_IO_ETH_DRIVERS_DEBUG // Don't override if the user has deliberately set something more // verbose. if (0 == cyg_io_eth_net_debug) cyg_io_eth_net_debug = net_debug; # endif have_net = false; // Make sure the recv buffers are set up eth_drv_buffers_init(); __pktbuf_init(); // Initialize all network devices for (t = &__NETDEVTAB__[0]; t != &__NETDEVTAB_END__; t++) { if (t->init(t)) { t->status = CYG_NETDEVTAB_STATUS_AVAIL; } else { // What to do if device init fails? t->status = 0; // Device not [currently] available } } if (!__local_enet_sc) { diag_printf("No network interfaces found\n"); return; } // Initialize the network [if present] if (use_bootp) { if (__bootp_find_local_ip(&my_bootp_info) == 0) { have_net = true; } else { // Is it an unset address, or has it been set to a static addr if (__local_ip_addr[0] == 0 && __local_ip_addr[1] == 0 && __local_ip_addr[2] == 0 && __local_ip_addr[3] == 0) { diag_printf("Ethernet %s: MAC address %02x:%02x:%02x:%02x:%02x:%02x\n", __local_enet_sc->dev_name, __local_enet_addr[0], __local_enet_addr[1], __local_enet_addr[2], __local_enet_addr[3], __local_enet_addr[4], __local_enet_addr[5]); diag_printf("Can't get BOOTP info for device!\n"); } else { diag_printf("Can't get BOOTP info, using default IP address\n"); have_net = true; } } } else { have_net = true; // Assume values in FLASH were OK } if (have_net) { diag_printf("Ethernet %s: MAC address %02x:%02x:%02x:%02x:%02x:%02x\n", __local_enet_sc->dev_name, __local_enet_addr[0], __local_enet_addr[1], __local_enet_addr[2], __local_enet_addr[3], __local_enet_addr[4], __local_enet_addr[5]); #ifdef CYGPKG_REDBOOT_NETWORKING_DNS redboot_dns_res_init(); #endif show_addrs(); net_io_init(); } }
void do_ip_addr(int argc, char *argv[]) { struct option_info opts[5]; char *ip_addr, *host_addr; bool ip_addr_set, host_addr_set; bool do_bootp = false; struct sockaddr_in host; #ifdef CYGPKG_REDBOOT_NETWORKING_DNS char *dns_addr; bool dns_addr_set; #ifdef CYGPKG_REDBOOT_NETWORKING_DNS_FCONFIG_DOMAIN char *dns_domain; bool dns_domain_set; #endif #endif int num_opts; if (!have_net) { diag_printf("Sorry, networking is not available.\n"); return; } init_opts(&opts[0], 'l', true, OPTION_ARG_TYPE_STR, (void *)&ip_addr, (bool *)&ip_addr_set, "local IP address"); init_opts(&opts[1], 'h', true, OPTION_ARG_TYPE_STR, (void *)&host_addr, (bool *)&host_addr_set, "default server address"); init_opts(&opts[2], 'b', false, OPTION_ARG_TYPE_FLG, &do_bootp, 0, "use BOOTP"); num_opts = 3; #ifdef CYGPKG_REDBOOT_NETWORKING_DNS init_opts(&opts[num_opts], 'd', true, OPTION_ARG_TYPE_STR, (void *)&dns_addr, (bool *)&dns_addr_set, "DNS server address"); num_opts++; #ifdef CYGPKG_REDBOOT_NETWORKING_DNS_FCONFIG_DOMAIN init_opts(&opts[num_opts], 'D', true, OPTION_ARG_TYPE_STR, (void *)&dns_domain, (bool *)&dns_domain_set, "DNS domain"); num_opts++; #endif #endif CYG_ASSERT(num_opts <= NUM_ELEMS(opts), "Too many options"); if (!scan_opts(argc, argv, 1, opts, num_opts, 0, 0, "")) { return; } if (do_bootp) { if (__bootp_find_local_ip(&my_bootp_info) != 0) { diag_printf("Failed to get BOOTP address\n"); } } if (ip_addr_set) { #ifdef CYGSEM_REDBOOT_NETWORKING_USE_GATEWAY char *slash_pos; /* see if the (optional) mask length was given */ if( (slash_pos = strchr(ip_addr, '/')) ) { int mask_len; unsigned long mask; *slash_pos = '\0'; slash_pos++; if( !parse_num(slash_pos, (unsigned long *)&mask_len, 0, 0) || mask_len <= 0 || mask_len > 32 ) { diag_printf("Invalid mask length: %s\n", slash_pos); return; } mask = htonl((0xffffffff << (32-mask_len))&0xffffffff); memcpy(&__local_ip_mask, &mask, 4); } #endif if (!_gethostbyname(ip_addr, (in_addr_t *)&host)) { diag_printf("Invalid local IP address: %s\n", ip_addr); return; } // Of course, each address goes in its own place :-) memcpy(&__local_ip_addr, &host.sin_addr, sizeof(host.sin_addr)); } if (host_addr_set) { if (!_gethostbyname(host_addr, (in_addr_t *)&host)) { diag_printf("Invalid server address: %s\n", host_addr); return; } my_bootp_info.bp_siaddr = host.sin_addr; } #ifdef CYGPKG_REDBOOT_NETWORKING_DNS if (dns_addr_set) { set_dns(dns_addr); } #ifdef CYGPKG_REDBOOT_NETWORKING_DNS_FCONFIG_DOMAIN if (dns_domain_set) { setdomainname(dns_domain, strlen(dns_domain)); } #endif #endif show_addrs(); if (!have_net) { have_net = true; net_io_init(); } }