Skip to content

Commit

Permalink
[NET]: Validate device addr prior to interface-up
Browse files Browse the repository at this point in the history
Signed-off-by: Jeff Garzik <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
Jeff Garzik authored and David S. Miller committed Oct 24, 2007
1 parent c9927c2 commit bada339
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 5 deletions.
2 changes: 2 additions & 0 deletions include/linux/netdevice.h
Original file line number Diff line number Diff line change
Expand Up @@ -669,6 +669,8 @@ struct net_device
#define HAVE_SET_MAC_ADDR
int (*set_mac_address)(struct net_device *dev,
void *addr);
#define HAVE_VALIDATE_ADDR
int (*validate_addr)(struct net_device *dev);
#define HAVE_PRIVATE_IOCTL
int (*do_ioctl)(struct net_device *dev,
struct ifreq *ifr, int cmd);
Expand Down
14 changes: 9 additions & 5 deletions net/core/dev.c
Original file line number Diff line number Diff line change
Expand Up @@ -1007,17 +1007,20 @@ int dev_open(struct net_device *dev)
* Call device private open method
*/
set_bit(__LINK_STATE_START, &dev->state);
if (dev->open) {

if (dev->validate_addr)
ret = dev->validate_addr(dev);

if (!ret && dev->open)
ret = dev->open(dev);
if (ret)
clear_bit(__LINK_STATE_START, &dev->state);
}

/*
* If it went open OK then:
*/

if (!ret) {
if (ret)
clear_bit(__LINK_STATE_START, &dev->state);
else {
/*
* Set the flags.
*/
Expand All @@ -1038,6 +1041,7 @@ int dev_open(struct net_device *dev)
*/
call_netdevice_notifiers(NETDEV_UP, dev);
}

return ret;
}

Expand Down
9 changes: 9 additions & 0 deletions net/ethernet/eth.c
Original file line number Diff line number Diff line change
Expand Up @@ -298,6 +298,14 @@ static int eth_change_mtu(struct net_device *dev, int new_mtu)
return 0;
}

static int eth_validate_addr(struct net_device *dev)
{
if (!is_valid_ether_addr(dev->dev_addr))
return -EINVAL;

return 0;
}

const struct header_ops eth_header_ops ____cacheline_aligned = {
.create = eth_header,
.parse = eth_header_parse,
Expand All @@ -317,6 +325,7 @@ void ether_setup(struct net_device *dev)

dev->change_mtu = eth_change_mtu;
dev->set_mac_address = eth_mac_addr;
dev->validate_addr = eth_validate_addr;

dev->type = ARPHRD_ETHER;
dev->hard_header_len = ETH_HLEN;
Expand Down

0 comments on commit bada339

Please sign in to comment.