diff options
author | David Howells <dhowells@redhat.com> | 2007-05-03 03:29:41 -0700 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2007-05-03 03:29:41 -0700 |
commit | ec9c948546a84d0dcee851be1009a8066958e69d (patch) | |
tree | a812ede303158d36e1d4a1530009044cd37f39ea /fs/afs/netdevices.c | |
parent | dc1f6bff6a9d6733a07b9b97905bc824c055e8f4 (diff) | |
download | kernel-crypto-ec9c948546a84d0dcee851be1009a8066958e69d.tar.gz kernel-crypto-ec9c948546a84d0dcee851be1009a8066958e69d.tar.xz kernel-crypto-ec9c948546a84d0dcee851be1009a8066958e69d.zip |
[AFS]: Adjust the new netdevice scanning code
Adjust the new netdevice scanning code provided by Patrick McHardy:
(1) Restore the function banner comments that were dropped.
(2) Rather than using an array size of 6 in some places and an array size of
ETH_ALEN in others, pass a pointer instead and pass the array size
through so that we can actually check it.
(3) Do the buffer fill count check before checking the for_primary_ifa
condition again. This permits us to skip that check should maxbufs be
reached before we run out of interfaces.
Signed-off-by: David Howells <dhowells@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'fs/afs/netdevices.c')
-rw-r--r-- | fs/afs/netdevices.c | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/fs/afs/netdevices.c b/fs/afs/netdevices.c index 2b3087357fa..ce08977858e 100644 --- a/fs/afs/netdevices.c +++ b/fs/afs/netdevices.c @@ -10,21 +10,33 @@ #include <linux/if_arp.h> #include "internal.h" -int afs_get_MAC_address(u8 mac[ETH_ALEN]) +/* + * get a MAC address from a random ethernet interface that has a real one + * - the buffer will normally be 6 bytes in size + */ +int afs_get_MAC_address(u8 *mac, size_t maclen) { struct net_device *dev; int ret = -ENODEV; + if (maclen != ETH_ALEN) + BUG(); + rtnl_lock(); dev = __dev_getfirstbyhwtype(ARPHRD_ETHER); if (dev) { - memcpy(mac, dev->dev_addr, ETH_ALEN); + memcpy(mac, dev->dev_addr, maclen); ret = 0; } rtnl_unlock(); return ret; } +/* + * get a list of this system's interface IPv4 addresses, netmasks and MTUs + * - maxbufs must be at least 1 + * - returns the number of interface records in the buffer + */ int afs_get_ipv4_interfaces(struct afs_interface *bufs, size_t maxbufs, bool wantloopback) { @@ -32,6 +44,8 @@ int afs_get_ipv4_interfaces(struct afs_interface *bufs, size_t maxbufs, struct in_device *idev; int n = 0; + ASSERT(maxbufs > 0); + rtnl_lock(); for (dev = dev_base; dev; dev = dev->next) { if (dev->type == ARPHRD_LOOPBACK && !wantloopback) @@ -40,13 +54,13 @@ int afs_get_ipv4_interfaces(struct afs_interface *bufs, size_t maxbufs, if (!idev) continue; for_primary_ifa(idev) { - if (n == maxbufs) - goto out; bufs[n].address.s_addr = ifa->ifa_address; bufs[n].netmask.s_addr = ifa->ifa_mask; bufs[n].mtu = dev->mtu; n++; - } endfor_ifa(idev) + if (n >= maxbufs) + goto out; + } endfor_ifa(idev); } out: rtnl_unlock(); |