diff options
| author | Wim Van Sebroeck <wim@iguana.be> | 2007-05-11 19:03:13 +0000 | 
|---|---|---|
| committer | Wim Van Sebroeck <wim@iguana.be> | 2007-05-11 19:03:13 +0000 | 
| commit | 5c34202b8bf942da411b6599668a76b07449bbfd (patch) | |
| tree | 5719c361321eaddc8e4f1b0c8a7994f0e9a6fdd3 /fs/afs/netdevices.c | |
| parent | 0d4804b31f91cfbcff6d62af0bc09a893a1c8ae0 (diff) | |
| parent | 1f8a6b658a943b4f04a1fc7b3a420360202c86cd (diff) | |
Merge /pub/scm/linux/kernel/git/torvalds/linux-2.6
Diffstat (limited to 'fs/afs/netdevices.c')
| -rw-r--r-- | fs/afs/netdevices.c | 68 | 
1 files changed, 68 insertions, 0 deletions
diff --git a/fs/afs/netdevices.c b/fs/afs/netdevices.c new file mode 100644 index 00000000000..fc27d4b52e5 --- /dev/null +++ b/fs/afs/netdevices.c @@ -0,0 +1,68 @@ +/* AFS network device helpers + * + * Copyright (c) 2007 Patrick McHardy <kaber@trash.net> + */ + +#include <linux/string.h> +#include <linux/rtnetlink.h> +#include <linux/inetdevice.h> +#include <linux/netdevice.h> +#include <linux/if_arp.h> +#include "internal.h" + +/* + * 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, 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) +{ +	struct net_device *dev; +	struct in_device *idev; +	int n = 0; + +	ASSERT(maxbufs > 0); + +	rtnl_lock(); +	for_each_netdev(dev) { +		if (dev->type == ARPHRD_LOOPBACK && !wantloopback) +			continue; +		idev = __in_dev_get_rtnl(dev); +		if (!idev) +			continue; +		for_primary_ifa(idev) { +			bufs[n].address.s_addr = ifa->ifa_address; +			bufs[n].netmask.s_addr = ifa->ifa_mask; +			bufs[n].mtu = dev->mtu; +			n++; +			if (n >= maxbufs) +				goto out; +		} endfor_ifa(idev); +	} +out: +	rtnl_unlock(); +	return n; +}  | 
