Skip to content

Commit

Permalink
[AFS]: Replace rtnetlink client by direct dev_base walking
Browse files Browse the repository at this point in the history
Replace the large and complicated rtnetlink client by two simple
functions for getting the MAC address for the first ethernet device
and building a list of IPv4 addresses.

Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David Howells <dhowells@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Patrick McHardy authored and David S. Miller committed May 3, 2007
1 parent 4e9cac2 commit dc1f6bf
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 475 deletions.
2 changes: 1 addition & 1 deletion fs/afs/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ kafs-objs := \
security.o \
server.o \
super.o \
use-rtnetlink.o \
netdevices.o \
vlclient.o \
vlocation.o \
vnode.o \
Expand Down
1 change: 0 additions & 1 deletion fs/afs/internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -349,7 +349,6 @@ struct afs_permits {
* record of one of a system's set of network interfaces
*/
struct afs_interface {
unsigned index; /* interface index */
struct in_addr address; /* IPv4 address bound to interface */
struct in_addr netmask; /* netmask applied to address */
unsigned mtu; /* MTU of interface */
Expand Down
54 changes: 54 additions & 0 deletions fs/afs/netdevices.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
/* 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"

int afs_get_MAC_address(u8 mac[ETH_ALEN])
{
struct net_device *dev;
int ret = -ENODEV;

rtnl_lock();
dev = __dev_getfirstbyhwtype(ARPHRD_ETHER);
if (dev) {
memcpy(mac, dev->dev_addr, ETH_ALEN);
ret = 0;
}
rtnl_unlock();
return ret;
}

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;

rtnl_lock();
for (dev = dev_base; dev; dev = dev->next) {
if (dev->type == ARPHRD_LOOPBACK && !wantloopback)
continue;
idev = __in_dev_get_rtnl(dev);
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)
}
out:
rtnl_unlock();
return n;
}
Loading

0 comments on commit dc1f6bf

Please sign in to comment.