Exemple #1
0
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();
    }
}
Exemple #2
0
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();
    }
}
Exemple #3
0
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();
    }
}