Skip to content
Snippets Groups Projects
netdevices.c 1.07 KiB
Newer Older
  • Learn to ignore specific revisions
  • /* 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;
    }