Skip to content

Commit

Permalink
uml: improve checking and diagnostics of ethernet MACs
Browse files Browse the repository at this point in the history
Improve checking and diagnostics for broadcast and multicast Ethernet MAC
addresses, and distinguish between those cases in output; also make sure the
device is assigned a MAC address valid only locally to avoid collisions.

Signed-off-by: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
Signed-off-by: Jeff Dike <jdike@linux.intel.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Paolo 'Blaisorblade' Giarrusso authored and Linus Torvalds committed May 7, 2007
1 parent 85ee2ce commit e024715
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 9 deletions.
38 changes: 29 additions & 9 deletions arch/um/drivers/net_kern.c
Original file line number Diff line number Diff line change
Expand Up @@ -283,7 +283,7 @@ void uml_net_user_timer_expire(unsigned long _conn)
#endif
}

static void setup_etheraddr(char *str, unsigned char *addr)
static void setup_etheraddr(char *str, unsigned char *addr, char *name)
{
char *end;
int i;
Expand All @@ -302,15 +302,32 @@ static void setup_etheraddr(char *str, unsigned char *addr)
}
str = end + 1;
}
if(addr[0] & 1){
if (is_multicast_ether_addr(addr)) {
printk(KERN_ERR
"Attempt to assign a broadcast ethernet address to a "
"Attempt to assign a multicast ethernet address to a "
"device disallowed\n");
goto random;
}
if (!is_valid_ether_addr(addr)) {
printk(KERN_ERR
"Attempt to assign an invalid ethernet address to a "
"device disallowed\n");
goto random;
}
if (!is_local_ether_addr(addr)) {
printk(KERN_WARNING
"Warning: attempt to assign a globally valid ethernet address to a "
"device\n");
printk(KERN_WARNING "You should better enable the 2nd rightmost bit "
"in the first byte of the MAC, i.e. "
"%02x:%02x:%02x:%02x:%02x:%02x\n",
addr[0] | 0x02, addr[1], addr[2], addr[3], addr[4], addr[5]);
}
return;

random:
printk(KERN_INFO
"Choosing a random ethernet address for device %s\n", name);
random_ether_addr(addr);
}

Expand All @@ -331,6 +348,7 @@ static void eth_configure(int n, void *init, char *mac,
struct net_device *dev;
struct uml_net_private *lp;
int save, err, size;
char name[sizeof(dev->name)];

size = transport->private_size + sizeof(struct uml_net_private) +
sizeof(((struct uml_net_private *) 0)->user);
Expand All @@ -344,7 +362,13 @@ static void eth_configure(int n, void *init, char *mac,
INIT_LIST_HEAD(&device->list);
device->index = n;

setup_etheraddr(mac, device->mac);
/* If this name ends up conflicting with an existing registered
* netdevice, that is OK, register_netdev{,ice}() will notice this
* and fail.
*/
snprintf(name, sizeof(name), "eth%d", n);

setup_etheraddr(mac, device->mac, name);

printk(KERN_INFO "Netdevice %d ", n);
printk("(%02x:%02x:%02x:%02x:%02x:%02x) ",
Expand Down Expand Up @@ -375,11 +399,7 @@ static void eth_configure(int n, void *init, char *mac,
goto out_free_netdev;
SET_NETDEV_DEV(dev,&device->pdev.dev);

/* If this name ends up conflicting with an existing registered
* netdevice, that is OK, register_netdev{,ice}() will notice this
* and fail.
*/
snprintf(dev->name, sizeof(dev->name), "eth%d", n);
strcpy(dev->name, name);
device->dev = dev;

/*
Expand Down
12 changes: 12 additions & 0 deletions include/linux/etherdevice.h
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,18 @@ static inline int is_multicast_ether_addr(const u8 *addr)
return (0x01 & addr[0]);
}

/**
* is_local_ether_addr - Determine if the Ethernet address is locally-assigned
* one (IEEE 802).
* @addr: Pointer to a six-byte array containing the Ethernet address
*
* Return true if the address is a local address.
*/
static inline int is_local_ether_addr(const u8 *addr)
{
return (0x02 & addr[0]);
}

/**
* is_broadcast_ether_addr - Determine if the Ethernet address is broadcast
* @addr: Pointer to a six-byte array containing the Ethernet address
Expand Down

0 comments on commit e024715

Please sign in to comment.