diff options
author | Michael Chan <mchan@broadcom.com> | 2007-12-25 00:28:09 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-01-28 18:00:05 -0500 |
commit | 7ffc49a6ee92b7138c2ee28073a8e10e58335d62 (patch) | |
tree | 6421d389980f3a71b1b53ed6e1548eb08dbf1226 /net/ethernet | |
parent | 21371f768bf7127ee45bfaadd17899df6a439e8f (diff) |
[ETH]: Combine format_addr() with print_mac().
print_mac() used many most net drivers and format_addr() used by
net-sysfs.c are very similar and they can be intergrated.
format_addr() is also identically redefined in the qla4xxx iscsi
driver.
Export a new function sysfs_format_mac() to be used by net-sysfs,
qla4xxx and others in the future. Both print_mac() and
sysfs_format_mac() call _format_mac_addr() to do the formatting.
Changed print_mac() to use unsigned char * to be consistent with
net_device struct's dev_addr. Added buffer length overrun checking
as suggested by Joe Perches.
Signed-off-by: Michael Chan <mchan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ethernet')
-rw-r--r-- | net/ethernet/eth.c | 30 |
1 files changed, 27 insertions, 3 deletions
diff --git a/net/ethernet/eth.c b/net/ethernet/eth.c index 6b2e454ae31..a7b417523e9 100644 --- a/net/ethernet/eth.c +++ b/net/ethernet/eth.c | |||
@@ -359,10 +359,34 @@ struct net_device *alloc_etherdev_mq(int sizeof_priv, unsigned int queue_count) | |||
359 | } | 359 | } |
360 | EXPORT_SYMBOL(alloc_etherdev_mq); | 360 | EXPORT_SYMBOL(alloc_etherdev_mq); |
361 | 361 | ||
362 | char *print_mac(char *buf, const u8 *addr) | 362 | static size_t _format_mac_addr(char *buf, int buflen, |
363 | const unsigned char *addr, int len) | ||
363 | { | 364 | { |
364 | sprintf(buf, MAC_FMT, | 365 | int i; |
365 | addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]); | 366 | char *cp = buf; |
367 | |||
368 | for (i = 0; i < len; i++) { | ||
369 | cp += scnprintf(cp, buflen - (cp - buf), "%02x", addr[i]); | ||
370 | if (i == len - 1) | ||
371 | break; | ||
372 | cp += strlcpy(cp, ":", buflen - (cp - buf)); | ||
373 | } | ||
374 | return cp - buf; | ||
375 | } | ||
376 | |||
377 | ssize_t sysfs_format_mac(char *buf, const unsigned char *addr, int len) | ||
378 | { | ||
379 | size_t l; | ||
380 | |||
381 | l = _format_mac_addr(buf, PAGE_SIZE, addr, len); | ||
382 | l += strlcpy(buf + l, "\n", PAGE_SIZE - l); | ||
383 | return ((ssize_t) l); | ||
384 | } | ||
385 | EXPORT_SYMBOL(sysfs_format_mac); | ||
386 | |||
387 | char *print_mac(char *buf, const unsigned char *addr) | ||
388 | { | ||
389 | _format_mac_addr(buf, MAC_BUF_SIZE, addr, ETH_ALEN); | ||
366 | return buf; | 390 | return buf; |
367 | } | 391 | } |
368 | EXPORT_SYMBOL(print_mac); | 392 | EXPORT_SYMBOL(print_mac); |