summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2018-12-07 08:12:40 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2018-12-07 08:12:40 +0100
commitbba3ddf8ef75a6102f48e6017e18f2e703cd3459 (patch)
treefd0a87102d26c91d08c03476650afdc66c9b36c5
parent4f23fb1070262255443d5fe0c5db757b1b8ea2c2 (diff)
parenta0e2d2fa05384cf9b9c1f00448e1ca175b7b3afb (diff)
downloadbarebox-bba3ddf8ef75a6102f48e6017e18f2e703cd3459.tar.gz
barebox-bba3ddf8ef75a6102f48e6017e18f2e703cd3459.tar.xz
Merge branch 'for-next/net'
-rw-r--r--common/blspec.c6
-rw-r--r--drivers/net/designware_socfpga.c4
-rw-r--r--fs/nfs.c6
-rw-r--r--fs/tftp.c19
-rw-r--r--include/net.h8
-rw-r--r--net/dhcp.c6
-rw-r--r--net/dns.c59
-rw-r--r--net/net.c4
-rw-r--r--net/ping.c8
-rw-r--r--net/sntp.c6
10 files changed, 77 insertions, 49 deletions
diff --git a/common/blspec.c b/common/blspec.c
index 2c682e1990..41f2a4c534 100644
--- a/common/blspec.c
+++ b/common/blspec.c
@@ -303,9 +303,11 @@ static char *parse_nfs_url(const char *url)
goto out;
}
- ip = resolv(host);
- if (ip == 0)
+ ret = resolv(host, &ip);
+ if (ret) {
+ pr_err("Cannot resolve \"%s\": %s\n", host, strerror(-ret));
goto out;
+ }
hostpath = basprintf("%pI4:%s", &ip, path);
diff --git a/drivers/net/designware_socfpga.c b/drivers/net/designware_socfpga.c
index cb88882d66..ff4b6a5655 100644
--- a/drivers/net/designware_socfpga.c
+++ b/drivers/net/designware_socfpga.c
@@ -158,9 +158,7 @@ static int socfpga_dwc_ether_probe(struct device_d *dev)
if (ret)
return ret;
- socfpga_dwc_set_phy_mode(dwc_dev);
-
- return 0;
+ return socfpga_dwc_set_phy_mode(dwc_dev);
}
static struct dw_eth_drvdata socfpga_stmmac_drvdata = {
diff --git a/fs/nfs.c b/fs/nfs.c
index eb5db344db..d7f156687f 100644
--- a/fs/nfs.c
+++ b/fs/nfs.c
@@ -1293,7 +1293,11 @@ static int nfs_probe(struct device_d *dev)
npriv->path = xstrdup(path + 1);
- npriv->server = resolv(tmp);
+ ret = resolv(tmp, &npriv->server);
+ if (ret) {
+ printf("cannot resolve \"%s\": %s\n", tmp, strerror(-ret));
+ goto err1;
+ }
debug("nfs: server: %s path: %s\n", tmp, npriv->path);
diff --git a/fs/tftp.c b/fs/tftp.c
index 0d9ee6effd..1b50ba84f9 100644
--- a/fs/tftp.c
+++ b/fs/tftp.c
@@ -80,7 +80,7 @@ struct file_priv {
int state;
int err;
char *filename;
- int filesize;
+ loff_t filesize;
uint64_t resend_timeout;
uint64_t progress_timeout;
struct kfifo *fifo;
@@ -136,7 +136,7 @@ static int tftp_send(struct file_priv *priv)
"timeout%c"
"%d%c"
"tsize%c"
- "%d%c"
+ "%lld%c"
"blksize%c"
"1432",
priv->filename + 1, 0,
@@ -235,7 +235,7 @@ static void tftp_parse_oack(struct file_priv *priv, unsigned char *pkt, int len)
if (val > s + len)
return;
if (!strcmp(opt, "tsize"))
- priv->filesize = simple_strtoul(val, NULL, 10);
+ priv->filesize = simple_strtoull(val, NULL, 10);
if (!strcmp(opt, "blksize"))
priv->blocksize = simple_strtoul(val, NULL, 10);
pr_debug("OACK opt: %s val: %s\n", opt, val);
@@ -658,7 +658,7 @@ static struct dentry *tftp_lookup(struct inode *dir, struct dentry *dentry,
struct fs_device_d *fsdev = container_of(sb, struct fs_device_d, sb);
struct inode *inode;
struct file_priv *priv;
- int filesize;
+ loff_t filesize;
priv = tftp_do_open(&fsdev->dev, O_RDONLY, dentry);
if (IS_ERR(priv))
@@ -696,10 +696,15 @@ static int tftp_probe(struct device_d *dev)
struct tftp_priv *priv = xzalloc(sizeof(struct tftp_priv));
struct super_block *sb = &fsdev->sb;
struct inode *inode;
+ int ret;
dev->priv = priv;
- priv->server = resolv(fsdev->backingstore);
+ ret = resolv(fsdev->backingstore, &priv->server);
+ if (ret) {
+ pr_err("Cannot resolve \"%s\": %s\n", fsdev->backingstore, strerror(-ret));
+ goto err;
+ }
sb->s_op = &tftp_ops;
@@ -707,6 +712,10 @@ static int tftp_probe(struct device_d *dev)
sb->s_root = d_make_root(inode);
return 0;
+err:
+ free(priv);
+
+ return ret;
}
static void tftp_remove(struct device_d *dev)
diff --git a/include/net.h b/include/net.h
index a09cb155a8..6912a557b5 100644
--- a/include/net.h
+++ b/include/net.h
@@ -330,13 +330,11 @@ int string_to_ethaddr(const char *str, u8 enetaddr[6]);
void ethaddr_to_string(const u8 enetaddr[6], char *str);
#ifdef CONFIG_NET_RESOLV
-IPaddr_t resolv(const char *host);
+int resolv(const char *host, IPaddr_t *ip);
#else
-static inline IPaddr_t resolv(const char *host)
+static inline int resolv(const char *host, IPaddr_t *ip)
{
- IPaddr_t ip = 0;
- string_to_ip(host, &ip);
- return ip;
+ return string_to_ip(host, ip);
}
#endif
diff --git a/net/dhcp.c b/net/dhcp.c
index 79aa75d878..670a6a6422 100644
--- a/net/dhcp.c
+++ b/net/dhcp.c
@@ -562,6 +562,8 @@ out:
int dhcp_set_result(struct eth_device *edev, struct dhcp_result *res)
{
+ int ret;
+
net_set_ip(edev, res->ip);
net_set_netmask(edev, res->netmask);
net_set_gateway(res->gateway);
@@ -580,8 +582,8 @@ int dhcp_set_result(struct eth_device *edev, struct dhcp_result *res)
if (res->tftp_server_name) {
IPaddr_t ip;
- ip = resolv(res->tftp_server_name);
- if (ip)
+ ret = resolv(res->tftp_server_name, &ip);
+ if (!ret)
net_set_serverip_empty(ip);
} else if (res->serverip) {
net_set_serverip_empty(res->serverip);
diff --git a/net/dns.c b/net/dns.c
index a8ce7a4484..4516235df2 100644
--- a/net/dns.c
+++ b/net/dns.c
@@ -21,7 +21,9 @@
* can do whatever you want with this stuff. If we meet some day, and you think
* this stuff is worth it, you can buy me a beer in return.
*/
-//#define DEBUG
+
+#define pr_fmt(fmt) "dns: " fmt
+
#include <common.h>
#include <command.h>
#include <net.h>
@@ -123,7 +125,7 @@ static void dns_recv(struct header *header, unsigned len)
int found, stop, dlen;
short tmp;
- debug("%s\n", __func__);
+ pr_debug("%s\n", __func__);
/* We sent 1 query. We want to see more that 1 answer. */
if (ntohs(header->nqueries) != 1)
@@ -132,7 +134,7 @@ static void dns_recv(struct header *header, unsigned len)
/* Received 0 answers */
if (header->nanswers == 0) {
dns_state = STATE_DONE;
- debug("DNS server returned no answers\n");
+ pr_debug("DNS server returned no answers\n");
return;
}
@@ -145,7 +147,7 @@ static void dns_recv(struct header *header, unsigned len)
/* We sent query class 1, query type 1 */
tmp = p[1] | (p[2] << 8);
if (&p[5] > e || ntohs(tmp) != DNS_A_RECORD) {
- debug("DNS response was not A record\n");
+ pr_debug("DNS response was not A record\n");
return;
}
@@ -161,23 +163,23 @@ static void dns_recv(struct header *header, unsigned len)
p++;
p--;
}
- debug("Name (Offset in header): %d\n", p[1]);
+ pr_debug("Name (Offset in header): %d\n", p[1]);
tmp = p[2] | (p[3] << 8);
type = ntohs(tmp);
- debug("type = %d\n", type);
+ pr_debug("type = %d\n", type);
if (type == DNS_CNAME_RECORD) {
/* CNAME answer. shift to the next section */
debug("Found canonical name\n");
tmp = p[10] | (p[11] << 8);
dlen = ntohs(tmp);
- debug("dlen = %d\n", dlen);
+ pr_debug("dlen = %d\n", dlen);
p += 12 + dlen;
} else if (type == DNS_A_RECORD) {
- debug("Found A-record\n");
+ pr_debug("Found A-record\n");
found = stop = 1;
} else {
- debug("Unknown type\n");
+ pr_debug("Unknown type\n");
stop = 1;
}
}
@@ -199,27 +201,27 @@ static void dns_handler(void *ctx, char *packet, unsigned len)
net_eth_to_udplen(packet));
}
-IPaddr_t resolv(const char *host)
+int resolv(const char *host, IPaddr_t *ip)
{
- IPaddr_t ip;
+ IPaddr_t nameserver;
- if (!string_to_ip(host, &ip))
- return ip;
+ if (!string_to_ip(host, ip))
+ return 0;
dns_ip = 0;
+ *ip = 0;
dns_state = STATE_INIT;
- ip = net_get_nameserver();
- if (!ip) {
- printk("%s: no nameserver specified in $net.nameserver\n",
- __func__);
+ nameserver = net_get_nameserver();
+ if (!nameserver) {
+ pr_err("no nameserver specified in $net.nameserver\n");
return 0;
}
- debug("resolving host %s via nameserver %pI4\n", host, &ip);
+ pr_debug("resolving host %s via nameserver %pI4\n", host, &nameserver);
- dns_con = net_udp_new(ip, DNS_PORT, dns_handler, NULL);
+ dns_con = net_udp_new(nameserver, DNS_PORT, dns_handler, NULL);
if (IS_ERR(dns_con))
return PTR_ERR(dns_con);
dns_timer_start = get_time_ns();
@@ -239,23 +241,32 @@ IPaddr_t resolv(const char *host)
net_unregister(dns_con);
- return dns_ip;
+ if (dns_ip) {
+ pr_debug("host %s is at %pI4\n", host, &dns_ip);
+ } else {
+ pr_debug("host %s not found\n", host);
+ return -ENOENT;
+ }
+
+ *ip = dns_ip;
+
+ return 0;
}
#ifdef CONFIG_CMD_HOST
static int do_host(int argc, char *argv[])
{
IPaddr_t ip;
+ int ret;
if (argc != 2)
return COMMAND_ERROR_USAGE;
- ip = resolv(argv[1]);
- if (!ip)
+ ret = resolv(argv[1], &ip);
+ if (ret)
printf("unknown host %s\n", argv[1]);
- else {
+ else
printf("%s is at %pI4\n", argv[1], &ip);
- }
return 0;
}
diff --git a/net/net.c b/net/net.c
index 63f42fa5cc..f1a7df0298 100644
--- a/net/net.c
+++ b/net/net.c
@@ -107,7 +107,9 @@ IPaddr_t getenv_ip(const char *name)
if (!string_to_ip(var, &ip))
return ip;
- return resolv((char*)var);
+ resolv(var, &ip);
+
+ return ip;
}
int setenv_ip(const char *name, IPaddr_t ip)
diff --git a/net/ping.c b/net/ping.c
index 4eb77cb785..a71f59a805 100644
--- a/net/ping.c
+++ b/net/ping.c
@@ -61,9 +61,9 @@ static int do_ping(int argc, char *argv[])
if (argc < 2)
return COMMAND_ERROR_USAGE;
- net_ping_ip = resolv(argv[1]);
- if (!net_ping_ip) {
- printf("unknown host %s\n", argv[1]);
+ ret = resolv(argv[1], &net_ping_ip);
+ if (ret) {
+ printf("Cannot resolve \"%s\": %s\n", argv[1], strerror(-ret));
return 1;
}
@@ -76,6 +76,8 @@ static int do_ping(int argc, char *argv[])
goto out;
}
+ printf("PING %s (%pI4)\n", argv[1], &net_ping_ip);
+
ping_start = get_time_ns();
ret = ping_send();
if (ret)
diff --git a/net/sntp.c b/net/sntp.c
index 577c859616..b4e6d6439c 100644
--- a/net/sntp.c
+++ b/net/sntp.c
@@ -120,9 +120,9 @@ s64 sntp(const char *server)
if (!server)
return -EINVAL;
- net_sntp_ip = resolv(server);
- if (!net_sntp_ip) {
- printf("unknown host %s\n", server);
+ ret = resolv(server, &net_sntp_ip);
+ if (ret) {
+ printf("Cannot resolve \"%s\": %s\n", server, strerror(-ret));;
return 1;
}