提交 b10aeeef 编写于 作者: J Jeff Dike 提交者: Linus Torvalds

[PATCH] uml: mechanical tidying after random MACs change

Mechanical, hopefully non-functional changes stemming from
setup_etheraddr always succeeding now that it always assigns a MAC,
either from the command line or generated randomly:
   the test of the return of setup_etheraddr is removed, and code
dependent on it succeeding is now unconditional
   setup_etheraddr can now be made void
   struct uml_net.have_mac is now always 1, so tests of it can be
similarly removed, and uses of it can be replaced with 1
   struct uml_net.have_mac is no longer used, so it can be removed
   struct uml_net_private.have_mac is copied from struct uml_net, so
it is always 1
   tests of uml_net_private.have_mac can be removed
   uml_net_private.have_mac can now be removed
   the only call to dev_ip_addr was removed, so it can be deleted

It also turns out that setup_etheraddr is called only once, from the same
file, so it can be static and its declaration removed from net_kern.h.

Similarly, set_ether_mac is defined and called only from one file.

Finally, setup_etheraddr and set_ether_mac were moved to avoid needing forward
declarations.
Signed-off-by: NJeff Dike <jdike@addtoit.com>
Signed-off-by: NAndrew Morton <akpm@osdl.org>
Signed-off-by: NLinus Torvalds <torvalds@osdl.org>
上级 f3e7ed2b
...@@ -119,11 +119,6 @@ static int uml_net_open(struct net_device *dev) ...@@ -119,11 +119,6 @@ static int uml_net_open(struct net_device *dev)
goto out; goto out;
} }
if(!lp->have_mac){
dev_ip_addr(dev, &lp->mac[2]);
set_ether_mac(dev, lp->mac);
}
lp->fd = (*lp->open)(&lp->user); lp->fd = (*lp->open)(&lp->user);
if(lp->fd < 0){ if(lp->fd < 0){
err = lp->fd; err = lp->fd;
...@@ -287,6 +282,39 @@ void uml_net_user_timer_expire(unsigned long _conn) ...@@ -287,6 +282,39 @@ void uml_net_user_timer_expire(unsigned long _conn)
#endif #endif
} }
static void setup_etheraddr(char *str, unsigned char *addr)
{
char *end;
int i;
if(str == NULL)
goto random;
for(i=0;i<6;i++){
addr[i] = simple_strtoul(str, &end, 16);
if((end == str) ||
((*end != ':') && (*end != ',') && (*end != '\0'))){
printk(KERN_ERR
"setup_etheraddr: failed to parse '%s' "
"as an ethernet address\n", str);
goto random;
}
str = end + 1;
}
if(addr[0] & 1){
printk(KERN_ERR
"Attempt to assign a broadcast ethernet address to a "
"device disallowed\n");
goto random;
}
return;
random:
addr[0] = 0xfe;
addr[1] = 0xfd;
random_mac(addr);
}
static DEFINE_SPINLOCK(devices_lock); static DEFINE_SPINLOCK(devices_lock);
static LIST_HEAD(devices); static LIST_HEAD(devices);
...@@ -322,15 +350,13 @@ static int eth_configure(int n, void *init, char *mac, ...@@ -322,15 +350,13 @@ static int eth_configure(int n, void *init, char *mac,
list_add(&device->list, &devices); list_add(&device->list, &devices);
spin_unlock(&devices_lock); spin_unlock(&devices_lock);
if (setup_etheraddr(mac, device->mac)) setup_etheraddr(mac, device->mac);
device->have_mac = 1;
printk(KERN_INFO "Netdevice %d ", n); printk(KERN_INFO "Netdevice %d ", n);
if (device->have_mac) printk("(%02x:%02x:%02x:%02x:%02x:%02x) ",
printk("(%02x:%02x:%02x:%02x:%02x:%02x) ", device->mac[0], device->mac[1],
device->mac[0], device->mac[1], device->mac[2], device->mac[3],
device->mac[2], device->mac[3], device->mac[4], device->mac[5]);
device->mac[4], device->mac[5]);
printk(": "); printk(": ");
dev = alloc_etherdev(size); dev = alloc_etherdev(size);
if (dev == NULL) { if (dev == NULL) {
...@@ -396,7 +422,6 @@ static int eth_configure(int n, void *init, char *mac, ...@@ -396,7 +422,6 @@ static int eth_configure(int n, void *init, char *mac,
.dev = dev, .dev = dev,
.fd = -1, .fd = -1,
.mac = { 0xfe, 0xfd, 0x0, 0x0, 0x0, 0x0}, .mac = { 0xfe, 0xfd, 0x0, 0x0, 0x0, 0x0},
.have_mac = device->have_mac,
.protocol = transport->kern->protocol, .protocol = transport->kern->protocol,
.open = transport->user->open, .open = transport->user->open,
.close = transport->user->close, .close = transport->user->close,
...@@ -411,14 +436,12 @@ static int eth_configure(int n, void *init, char *mac, ...@@ -411,14 +436,12 @@ static int eth_configure(int n, void *init, char *mac,
init_timer(&lp->tl); init_timer(&lp->tl);
spin_lock_init(&lp->lock); spin_lock_init(&lp->lock);
lp->tl.function = uml_net_user_timer_expire; lp->tl.function = uml_net_user_timer_expire;
if (lp->have_mac) memcpy(lp->mac, device->mac, sizeof(lp->mac));
memcpy(lp->mac, device->mac, sizeof(lp->mac));
if (transport->user->init) if (transport->user->init)
(*transport->user->init)(&lp->user, dev); (*transport->user->init)(&lp->user, dev);
if (device->have_mac) set_ether_mac(dev, device->mac);
set_ether_mac(dev, device->mac);
return 0; return 0;
} }
...@@ -747,54 +770,6 @@ static void close_devices(void) ...@@ -747,54 +770,6 @@ static void close_devices(void)
__uml_exitcall(close_devices); __uml_exitcall(close_devices);
int setup_etheraddr(char *str, unsigned char *addr)
{
char *end;
int i;
if(str == NULL)
goto random;
for(i=0;i<6;i++){
addr[i] = simple_strtoul(str, &end, 16);
if((end == str) ||
((*end != ':') && (*end != ',') && (*end != '\0'))){
printk(KERN_ERR
"setup_etheraddr: failed to parse '%s' "
"as an ethernet address\n", str);
goto random;
}
str = end + 1;
}
if(addr[0] & 1){
printk(KERN_ERR
"Attempt to assign a broadcast ethernet address to a "
"device disallowed\n");
goto random;
}
return 1;
random:
addr[0] = 0xfe;
addr[1] = 0xfd;
random_mac(addr);
return 1;
}
void dev_ip_addr(void *d, unsigned char *bin_buf)
{
struct net_device *dev = d;
struct in_device *ip = dev->ip_ptr;
struct in_ifaddr *in;
if((ip == NULL) || ((in = ip->ifa_list) == NULL)){
printk(KERN_WARNING "dev_ip_addr - device not assigned an "
"IP address\n");
return;
}
memcpy(bin_buf, &in->ifa_address, sizeof(in->ifa_address));
}
struct sk_buff *ether_adjust_skb(struct sk_buff *skb, int extra) struct sk_buff *ether_adjust_skb(struct sk_buff *skb, int extra)
{ {
if((skb != NULL) && (skb_tailroom(skb) < extra)){ if((skb != NULL) && (skb_tailroom(skb) < extra)){
......
...@@ -18,7 +18,6 @@ struct uml_net { ...@@ -18,7 +18,6 @@ struct uml_net {
struct platform_device pdev; struct platform_device pdev;
int index; int index;
unsigned char mac[ETH_ALEN]; unsigned char mac[ETH_ALEN];
int have_mac;
}; };
struct uml_net_private { struct uml_net_private {
...@@ -29,7 +28,6 @@ struct uml_net_private { ...@@ -29,7 +28,6 @@ struct uml_net_private {
struct net_device_stats stats; struct net_device_stats stats;
int fd; int fd;
unsigned char mac[ETH_ALEN]; unsigned char mac[ETH_ALEN];
int have_mac;
unsigned short (*protocol)(struct sk_buff *); unsigned short (*protocol)(struct sk_buff *);
int (*open)(void *); int (*open)(void *);
void (*close)(int, void *); void (*close)(int, void *);
...@@ -62,7 +60,6 @@ struct transport { ...@@ -62,7 +60,6 @@ struct transport {
extern struct net_device *ether_init(int); extern struct net_device *ether_init(int);
extern unsigned short ether_protocol(struct sk_buff *); extern unsigned short ether_protocol(struct sk_buff *);
extern int setup_etheraddr(char *str, unsigned char *addr);
extern struct sk_buff *ether_adjust_skb(struct sk_buff *skb, int extra); extern struct sk_buff *ether_adjust_skb(struct sk_buff *skb, int extra);
extern int tap_setup_common(char *str, char *type, char **dev_name, extern int tap_setup_common(char *str, char *type, char **dev_name,
char **mac_out, char **gate_addr); char **mac_out, char **gate_addr);
...@@ -70,14 +67,3 @@ extern void register_transport(struct transport *new); ...@@ -70,14 +67,3 @@ extern void register_transport(struct transport *new);
extern unsigned short eth_protocol(struct sk_buff *skb); extern unsigned short eth_protocol(struct sk_buff *skb);
#endif #endif
/*
* Overrides for Emacs so that we follow Linus's tabbing style.
* Emacs will notice this stuff at the end of the file and automatically
* adjust the settings for this buffer only. This must remain at the end
* of the file.
* ---------------------------------------------------------------------------
* Local variables:
* c-file-style: "linux"
* End:
*/
...@@ -25,7 +25,6 @@ struct net_user_info { ...@@ -25,7 +25,6 @@ struct net_user_info {
}; };
extern void ether_user_init(void *data, void *dev); extern void ether_user_init(void *data, void *dev);
extern void dev_ip_addr(void *d, unsigned char *bin_buf);
extern void iter_addresses(void *d, void (*cb)(unsigned char *, extern void iter_addresses(void *d, void (*cb)(unsigned char *,
unsigned char *, void *), unsigned char *, void *),
void *arg); void *arg);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册