diff options
-rw-r--r-- | include/linux/etherdevice.h | 14 | ||||
-rw-r--r-- | include/linux/netdevice.h | 6 | ||||
-rw-r--r-- | net/core/net-sysfs.c | 2 |
3 files changed, 22 insertions, 0 deletions
diff --git a/include/linux/etherdevice.h b/include/linux/etherdevice.h index 3d7a6687d247..848480bc2bf9 100644 --- a/include/linux/etherdevice.h +++ b/include/linux/etherdevice.h | |||
@@ -127,6 +127,20 @@ static inline void random_ether_addr(u8 *addr) | |||
127 | } | 127 | } |
128 | 128 | ||
129 | /** | 129 | /** |
130 | * dev_hw_addr_random - Create random MAC and set device flag | ||
131 | * @dev: pointer to net_device structure | ||
132 | * @addr: Pointer to a six-byte array containing the Ethernet address | ||
133 | * | ||
134 | * Generate random MAC to be used by a device and set addr_assign_type | ||
135 | * so the state can be read by sysfs and be used by udev. | ||
136 | */ | ||
137 | static inline void dev_hw_addr_random(struct net_device *dev, u8 *hwaddr) | ||
138 | { | ||
139 | dev->addr_assign_type |= NET_ADDR_RANDOM; | ||
140 | random_ether_addr(hwaddr); | ||
141 | } | ||
142 | |||
143 | /** | ||
130 | * compare_ether_addr - Compare two Ethernet addresses | 144 | * compare_ether_addr - Compare two Ethernet addresses |
131 | * @addr1: Pointer to a six-byte array containing the Ethernet address | 145 | * @addr1: Pointer to a six-byte array containing the Ethernet address |
132 | * @addr2: Pointer other six-byte array containing the Ethernet address | 146 | * @addr2: Pointer other six-byte array containing the Ethernet address |
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index b6262898ece0..1bca6171b1aa 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
@@ -66,6 +66,11 @@ struct wireless_dev; | |||
66 | #define HAVE_FREE_NETDEV /* free_netdev() */ | 66 | #define HAVE_FREE_NETDEV /* free_netdev() */ |
67 | #define HAVE_NETDEV_PRIV /* netdev_priv() */ | 67 | #define HAVE_NETDEV_PRIV /* netdev_priv() */ |
68 | 68 | ||
69 | /* hardware address assignment types */ | ||
70 | #define NET_ADDR_PERM 0 /* address is permanent (default) */ | ||
71 | #define NET_ADDR_RANDOM 1 /* address is generated randomly */ | ||
72 | #define NET_ADDR_STOLEN 2 /* address is stolen from other device */ | ||
73 | |||
69 | /* Backlog congestion levels */ | 74 | /* Backlog congestion levels */ |
70 | #define NET_RX_SUCCESS 0 /* keep 'em coming, baby */ | 75 | #define NET_RX_SUCCESS 0 /* keep 'em coming, baby */ |
71 | #define NET_RX_DROP 1 /* packet dropped */ | 76 | #define NET_RX_DROP 1 /* packet dropped */ |
@@ -919,6 +924,7 @@ struct net_device { | |||
919 | 924 | ||
920 | /* Interface address info. */ | 925 | /* Interface address info. */ |
921 | unsigned char perm_addr[MAX_ADDR_LEN]; /* permanent hw address */ | 926 | unsigned char perm_addr[MAX_ADDR_LEN]; /* permanent hw address */ |
927 | unsigned char addr_assign_type; /* hw address assignment type */ | ||
922 | unsigned char addr_len; /* hardware address length */ | 928 | unsigned char addr_len; /* hardware address length */ |
923 | unsigned short dev_id; /* for shared network cards */ | 929 | unsigned short dev_id; /* for shared network cards */ |
924 | 930 | ||
diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c index d2b596537d41..af4dfbadf2a0 100644 --- a/net/core/net-sysfs.c +++ b/net/core/net-sysfs.c | |||
@@ -95,6 +95,7 @@ static ssize_t netdev_store(struct device *dev, struct device_attribute *attr, | |||
95 | } | 95 | } |
96 | 96 | ||
97 | NETDEVICE_SHOW(dev_id, fmt_hex); | 97 | NETDEVICE_SHOW(dev_id, fmt_hex); |
98 | NETDEVICE_SHOW(addr_assign_type, fmt_dec); | ||
98 | NETDEVICE_SHOW(addr_len, fmt_dec); | 99 | NETDEVICE_SHOW(addr_len, fmt_dec); |
99 | NETDEVICE_SHOW(iflink, fmt_dec); | 100 | NETDEVICE_SHOW(iflink, fmt_dec); |
100 | NETDEVICE_SHOW(ifindex, fmt_dec); | 101 | NETDEVICE_SHOW(ifindex, fmt_dec); |
@@ -295,6 +296,7 @@ static ssize_t show_ifalias(struct device *dev, | |||
295 | } | 296 | } |
296 | 297 | ||
297 | static struct device_attribute net_class_attributes[] = { | 298 | static struct device_attribute net_class_attributes[] = { |
299 | __ATTR(addr_assign_type, S_IRUGO, show_addr_assign_type, NULL), | ||
298 | __ATTR(addr_len, S_IRUGO, show_addr_len, NULL), | 300 | __ATTR(addr_len, S_IRUGO, show_addr_len, NULL), |
299 | __ATTR(dev_id, S_IRUGO, show_dev_id, NULL), | 301 | __ATTR(dev_id, S_IRUGO, show_dev_id, NULL), |
300 | __ATTR(ifalias, S_IRUGO | S_IWUSR, show_ifalias, store_ifalias), | 302 | __ATTR(ifalias, S_IRUGO | S_IWUSR, show_ifalias, store_ifalias), |