summaryrefslogtreecommitdiffstats
path: root/net
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 /net
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>
Diffstat (limited to 'net')
-rw-r--r--net/eth.c40
-rw-r--r--net/net.c80
2 files changed, 39 insertions, 81 deletions
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) {