From ab84733e570b889324f2594685f7f5d33b3c39be Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Mon, 20 Nov 2017 22:46:47 +0100 Subject: net: dhcp: Allow to specify network device Instead of allowing to DHCP only on the "current" network device, allow to specify the desired network device. This is a first step to get rid of the concept of a "current" network device. Signed-off-by: Sascha Hauer --- net/dhcp.c | 15 +++++++++------ net/ifup.c | 5 ++++- net/net.c | 12 +++--------- 3 files changed, 16 insertions(+), 16 deletions(-) (limited to 'net') diff --git a/net/dhcp.c b/net/dhcp.c index 37aad8f1ff..82f60f0535 100644 --- a/net/dhcp.c +++ b/net/dhcp.c @@ -79,6 +79,7 @@ static dhcp_state_t dhcp_state; static uint32_t dhcp_leasetime; static IPaddr_t net_dhcp_server_ip; static uint64_t dhcp_start; +static struct eth_device *dhcp_edev; static char dhcp_tftpname[256]; static const char* dhcp_get_barebox_global(const char * var) @@ -126,7 +127,7 @@ static void netmask_handle(struct dhcp_opt *opt, unsigned char *popt, int optlen IPaddr_t ip; ip = net_read_ip(popt); - net_set_netmask(ip); + net_set_netmask(dhcp_edev, ip); } static void gateway_handle(struct dhcp_opt *opt, unsigned char *popt, int optlen) @@ -369,7 +370,7 @@ static void bootp_copy_net_params(struct bootp *bp) IPaddr_t tmp_ip; tmp_ip = net_read_ip(&bp->bp_yiaddr); - net_set_ip(tmp_ip); + net_set_ip(dhcp_edev, tmp_ip); tmp_ip = net_read_ip(&bp->bp_siaddr); if (tmp_ip != 0) @@ -618,7 +619,7 @@ static void dhcp_handler(void *ctx, char *packet, unsigned int len) dhcp_options_process((u8 *)&bp->bp_vend[4], bp); bootp_copy_net_params(bp); /* Store net params from reply */ dhcp_state = BOUND; - ip = net_get_ip(); + ip = net_get_ip(dhcp_edev); printf("DHCP client bound to address %pI4\n", &ip); return; } @@ -646,12 +647,14 @@ static void dhcp_reset_env(void) } } -int dhcp(int retries, struct dhcp_req_param *param) +int dhcp(struct eth_device *edev, int retries, struct dhcp_req_param *param) { int ret = 0; dhcp_reset_env(); + dhcp_edev = edev; + dhcp_set_param_data(DHCP_HOSTNAME, param->hostname); dhcp_set_param_data(DHCP_VENDOR_ID, param->vendor_id); dhcp_set_param_data(DHCP_CLIENT_ID, param->client_id); @@ -661,7 +664,7 @@ int dhcp(int retries, struct dhcp_req_param *param) if (!retries) retries = DHCP_DEFAULT_RETRY; - dhcp_con = net_udp_new(IP_BROADCAST, PORT_BOOTPS, dhcp_handler, NULL); + dhcp_con = net_udp_eth_new(edev, IP_BROADCAST, PORT_BOOTPS, dhcp_handler, NULL); if (IS_ERR(dhcp_con)) { ret = PTR_ERR(dhcp_con); goto out; @@ -671,7 +674,7 @@ int dhcp(int retries, struct dhcp_req_param *param) if (ret) goto out1; - net_set_ip(0); + net_set_ip(dhcp_edev, 0); dhcp_start = get_time_ns(); ret = bootp_request(); /* Basically same as BOOTP */ diff --git a/net/ifup.c b/net/ifup.c index c3ea1b6a45..2160e3ae46 100644 --- a/net/ifup.c +++ b/net/ifup.c @@ -101,12 +101,15 @@ int ifup(const char *name, unsigned flags) if (!strcmp(ip, "dhcp")) { IPaddr_t serverip; + char *dhcp_cmd; serverip = getenv_ip("serverip"); if (serverip) net_set_serverip_empty(serverip); - ret = run_command("dhcp"); + dhcp_cmd = basprintf("dhcp %s", name); + ret = run_command(dhcp_cmd); + free(dhcp_cmd); if (ret) goto out; dev_set_param(dev, "linux.bootargs", "ip=dhcp"); diff --git a/net/net.c b/net/net.c index 6cdffa4b8d..33d6e2c5b0 100644 --- a/net/net.c +++ b/net/net.c @@ -261,24 +261,18 @@ void net_set_serverip_empty(IPaddr_t ip) net_set_serverip(ip); } -void net_set_ip(IPaddr_t ip) +void net_set_ip(struct eth_device *edev, IPaddr_t ip) { - struct eth_device *edev = eth_get_current(); - edev->ipaddr = ip; } -IPaddr_t net_get_ip(void) +IPaddr_t net_get_ip(struct eth_device *edev) { - struct eth_device *edev = eth_get_current(); - return edev->ipaddr; } -void net_set_netmask(IPaddr_t nm) +void net_set_netmask(struct eth_device *edev, IPaddr_t nm) { - struct eth_device *edev = eth_get_current(); - edev->netmask = nm; } -- cgit v1.2.3