summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2013-04-06 18:26:10 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2013-04-11 11:48:34 +0200
commit6d0161d02a3a829a12b85bdd3a71cddb714d66f5 (patch)
tree0e19b1192dd2d8029b4dc2f733d52f6a674d81af
parent7d29b3cd83be22c8c714e5e1b331cf832cf03dd2 (diff)
downloadbarebox-6d0161d02a3a829a12b85bdd3a71cddb714d66f5.tar.gz
barebox-6d0161d02a3a829a12b85bdd3a71cddb714d66f5.tar.xz
net: store ethernet device parameters in device
Rather than storing the parameters globally and trying to keep them in sync with the device parameters, store the parameters in the ethernet device directly. Also, update to dev_add_param_ip(). Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r--include/net.h7
-rw-r--r--net/eth.c40
-rw-r--r--net/net.c80
3 files changed, 45 insertions, 82 deletions
diff --git a/include/net.h b/include/net.h
index e4f6f86ad0..bb6b8fa281 100644
--- a/include/net.h
+++ b/include/net.h
@@ -52,6 +52,12 @@ struct eth_device {
struct device_d *parent;
struct list_head list;
+
+ IPaddr_t ipaddr;
+ IPaddr_t serverip;
+ IPaddr_t netmask;
+ IPaddr_t gateway;
+ char ethaddr[6];
};
#define dev_to_edev(d) container_of(d, struct eth_device, dev)
@@ -384,7 +390,6 @@ typedef void rx_handler_f(void *ctx, char *packet, unsigned int len);
void eth_set_current(struct eth_device *eth);
struct eth_device *eth_get_current(void);
struct eth_device *eth_get_byname(char *name);
-void net_update_env(void);
/**
* net_receive - Pass a received packet from an ethernet driver to the protocol stack
diff --git a/net/eth.c b/net/eth.c
index 98ec726b84..4646dd8b89 100644
--- a/net/eth.c
+++ b/net/eth.c
@@ -86,7 +86,6 @@ void eth_set_current(struct eth_device *eth)
}
eth_current = eth;
- net_update_env();
}
struct eth_device * eth_get_current(void)
@@ -210,39 +209,16 @@ int eth_rx(void)
static int eth_set_ethaddr(struct device_d *dev, struct param_d *param, const char *val)
{
struct eth_device *edev = dev_to_edev(dev);
- u8 ethaddr[6];
-
- if (!val)
- return dev_param_set_generic(dev, param, NULL);
-
- if (string_to_ethaddr(val, ethaddr) < 0)
- return -EINVAL;
-
- dev_param_set_generic(dev, param, val);
-
- edev->set_ethaddr(edev, ethaddr);
-
- if (edev == eth_current)
- net_update_env();
-
- return 0;
-}
-
-static int eth_set_ipaddr(struct device_d *dev, struct param_d *param, const char *val)
-{
- struct eth_device *edev = dev_to_edev(dev);
- IPaddr_t ip;
if (!val)
return dev_param_set_generic(dev, param, NULL);
- if (string_to_ip(val, &ip))
+ if (string_to_ethaddr(val, edev->ethaddr) < 0)
return -EINVAL;
dev_param_set_generic(dev, param, val);
- if (edev == eth_current)
- net_update_env();
+ edev->set_ethaddr(edev, edev->ethaddr);
return 0;
}
@@ -267,11 +243,11 @@ int eth_register(struct eth_device *edev)
register_device(&edev->dev);
- dev_add_param(dev, "ipaddr", eth_set_ipaddr, NULL, 0);
+ dev_add_param_ip(dev, "ipaddr", NULL, NULL, &edev->ipaddr, edev);
+ dev_add_param_ip(dev, "serverip", NULL, NULL, &edev->serverip, edev);
+ dev_add_param_ip(dev, "gateway", NULL, NULL, &edev->gateway, edev);
+ dev_add_param_ip(dev, "netmask", NULL, NULL, &edev->netmask, edev);
dev_add_param(dev, "ethaddr", eth_set_ethaddr, NULL, 0);
- dev_add_param(dev, "gateway", eth_set_ipaddr, NULL, 0);
- dev_add_param(dev, "netmask", eth_set_ipaddr, NULL, 0);
- dev_add_param(dev, "serverip", eth_set_ipaddr, NULL, 0);
if (edev->init)
edev->init(edev);
@@ -296,10 +272,8 @@ int eth_register(struct eth_device *edev)
}
}
- if (!eth_current) {
+ if (!eth_current)
eth_current = edev;
- net_update_env();
- }
return 0;
}
diff --git a/net/net.c b/net/net.c
index 639bc2d985..0bd9084dd0 100644
--- a/net/net.c
+++ b/net/net.c
@@ -36,29 +36,9 @@
#include <linux/ctype.h>
#include <linux/err.h>
-static IPaddr_t net_netmask; /* Our subnet mask (0=unknown) */
-static IPaddr_t net_gateway; /* Our gateways IP address */
-
-static unsigned char net_ether[6]; /* Our ethernet address */
-static IPaddr_t net_ip; /* Our IP addr (0 = unknown) */
-static IPaddr_t net_serverip; /* Our IP addr (0 = unknown) */
-
unsigned char *NetRxPackets[PKTBUFSRX]; /* Receive packets */
static unsigned int net_ip_id;
-void net_update_env(void)
-{
- struct eth_device *edev = eth_get_current();
-
- net_ip = dev_get_param_ip(&edev->dev, "ipaddr");
- net_serverip = dev_get_param_ip(&edev->dev, "serverip");
- net_gateway = dev_get_param_ip(&edev->dev, "gateway");
- net_netmask = dev_get_param_ip(&edev->dev, "netmask");
-
- string_to_ethaddr(dev_get_param(&edev->dev, "ethaddr"),
- net_ether);
-}
-
int net_checksum_ok(unsigned char *ptr, int len)
{
return net_checksum(ptr, len) + 1;
@@ -210,6 +190,7 @@ static void arp_handler(struct arprequest *arp)
static int arp_request(IPaddr_t dest, unsigned char *ether)
{
+ struct eth_device *edev = eth_get_current();
char *pkt;
struct arprequest *arp;
uint64_t arp_start;
@@ -232,7 +213,7 @@ static int arp_request(IPaddr_t dest, unsigned char *ether)
pr_debug("ARP broadcast\n");
memset(et->et_dest, 0xff, 6);
- memcpy(et->et_src, net_ether, 6);
+ memcpy(et->et_src, edev->ethaddr, 6);
et->et_protlen = htons(PROT_ARP);
arp = (struct arprequest *)(pkt + ETHER_HDR_SIZE);
@@ -243,15 +224,15 @@ static int arp_request(IPaddr_t dest, unsigned char *ether)
arp->ar_pln = 4;
arp->ar_op = htons(ARPOP_REQUEST);
- memcpy(arp->ar_data, net_ether, 6); /* source ET addr */
- net_write_ip(arp->ar_data + 6, net_ip); /* source IP addr */
+ memcpy(arp->ar_data, edev->ethaddr, 6); /* source ET addr */
+ net_write_ip(arp->ar_data + 6, edev->ipaddr); /* source IP addr */
memset(arp->ar_data + 10, 0, 6); /* dest ET addr = 0 */
- if ((dest & net_netmask) != (net_ip & net_netmask)) {
- if (!net_gateway)
+ if ((dest & edev->netmask) != (edev->ipaddr & edev->netmask)) {
+ if (!edev->gateway)
arp_wait_ip = dest;
else
- arp_wait_ip = net_gateway;
+ arp_wait_ip = edev->gateway;
} else {
arp_wait_ip = dest;
}
@@ -310,44 +291,44 @@ static uint16_t net_udp_new_localport(void)
IPaddr_t net_get_serverip(void)
{
- return net_serverip;
+ struct eth_device *edev = eth_get_current();
+
+ return edev->serverip;
}
void net_set_serverip(IPaddr_t ip)
{
struct eth_device *edev = eth_get_current();
- net_serverip = ip;
- dev_set_param_ip(&edev->dev, "serverip", net_serverip);
+ edev->serverip = ip;
}
void net_set_ip(IPaddr_t ip)
{
struct eth_device *edev = eth_get_current();
- net_ip = ip;
- dev_set_param_ip(&edev->dev, "ipaddr", net_ip);
+ edev->ipaddr = ip;
}
IPaddr_t net_get_ip(void)
{
- return net_ip;
+ struct eth_device *edev = eth_get_current();
+
+ return edev->ipaddr;
}
void net_set_netmask(IPaddr_t nm)
{
struct eth_device *edev = eth_get_current();
- net_netmask = nm;
- dev_set_param_ip(&edev->dev, "netmask", net_netmask);
+ edev->netmask = nm;
}
void net_set_gateway(IPaddr_t gw)
{
struct eth_device *edev = eth_get_current();
- net_gateway = gw;
- dev_set_param_ip(&edev->dev, "gateway", net_gateway);
+ edev->gateway = gw;
}
static LIST_HEAD(connection_list);
@@ -362,16 +343,16 @@ static struct net_connection *net_new(IPaddr_t dest, rx_handler_f *handler,
if (!edev)
return ERR_PTR(-ENETDOWN);
- if (!is_valid_ether_addr(net_ether)) {
+ if (!is_valid_ether_addr(edev->ethaddr)) {
char str[sizeof("xx:xx:xx:xx:xx:xx")];
- random_ether_addr(net_ether);
- ethaddr_to_string(net_ether, str);
+ random_ether_addr(edev->ethaddr);
+ ethaddr_to_string(edev->ethaddr, str);
printf("warning: No MAC address set. Using random address %s\n", str);
dev_set_param(&edev->dev, "ethaddr", str);
}
/* If we don't have an ip only broadcast is allowed */
- if (!net_ip && dest != 0xffffffff)
+ if (!edev->ipaddr && dest != 0xffffffff)
return ERR_PTR(-ENETDOWN);
con = xzalloc(sizeof(*con));
@@ -394,14 +375,14 @@ static struct net_connection *net_new(IPaddr_t dest, rx_handler_f *handler,
}
con->et->et_protlen = htons(PROT_IP);
- memcpy(con->et->et_src, net_ether, 6);
+ memcpy(con->et->et_src, edev->ethaddr, 6);
con->ip->hl_v = 0x45;
con->ip->tos = 0;
con->ip->frag_off = htons(0x4000); /* No fragmentation */;
con->ip->ttl = 255;
net_copy_ip(&con->ip->daddr, &dest);
- net_copy_ip(&con->ip->saddr, &net_ip);
+ net_copy_ip(&con->ip->saddr, &edev->ipaddr);
list_add_tail(&con->list, &connection_list);
@@ -479,20 +460,21 @@ static int net_answer_arp(unsigned char *pkt, int len)
{
struct arprequest *arp = (struct arprequest *)(pkt + ETHER_HDR_SIZE);
struct ethernet *et = (struct ethernet *)pkt;
+ struct eth_device *edev = eth_get_current();
unsigned char *packet;
int ret;
debug("%s\n", __func__);
memcpy (et->et_dest, et->et_src, 6);
- memcpy (et->et_src, net_ether, 6);
+ memcpy (et->et_src, edev->ethaddr, 6);
et->et_protlen = htons(PROT_ARP);
arp->ar_op = htons(ARPOP_REPLY);
memcpy(&arp->ar_data[10], &arp->ar_data[0], 6);
net_copy_ip(&arp->ar_data[16], &arp->ar_data[6]);
- memcpy(&arp->ar_data[0], net_ether, 6);
- net_copy_ip(&arp->ar_data[6], &net_ip);
+ memcpy(&arp->ar_data[0], edev->ethaddr, 6);
+ net_copy_ip(&arp->ar_data[6], &edev->ipaddr);
packet = net_alloc_packet();
if (!packet)
@@ -517,6 +499,7 @@ static void net_bad_packet(unsigned char *pkt, int len)
static int net_handle_arp(unsigned char *pkt, int len)
{
+ struct eth_device *edev = eth_get_current();
struct arprequest *arp;
debug("%s: got arp\n", __func__);
@@ -541,9 +524,9 @@ static int net_handle_arp(unsigned char *pkt, int len)
goto bad;
if (arp->ar_pln != 4)
goto bad;
- if (net_ip == 0)
+ if (edev->ipaddr == 0)
return 0;
- if (net_read_ip(&arp->ar_data[16]) != net_ip)
+ if (net_read_ip(&arp->ar_data[16]) != edev->ipaddr)
return 0;
switch (ntohs(arp->ar_op)) {
@@ -600,6 +583,7 @@ static int net_handle_icmp(unsigned char *pkt, int len)
static int net_handle_ip(unsigned char *pkt, int len)
{
struct iphdr *ip = (struct iphdr *)(pkt + ETHER_HDR_SIZE);
+ struct eth_device *edev = eth_get_current();
IPaddr_t tmp;
debug("%s\n", __func__);
@@ -619,7 +603,7 @@ static int net_handle_ip(unsigned char *pkt, int len)
goto bad;
tmp = net_read_ip(&ip->daddr);
- if (net_ip && tmp != net_ip && tmp != 0xffffffff)
+ if (edev->ipaddr && tmp != edev->ipaddr && tmp != 0xffffffff)
return 0;
switch (ip->protocol) {