2007-05-03 14:28:49 +04:00
/* 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>
2007-09-17 22:56:21 +04:00
# include <net/net_namespace.h>
2007-05-03 14:28:49 +04:00
# include "internal.h"
2007-05-03 14:29:41 +04:00
/*
* 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 )
2007-05-03 14:28:49 +04:00
{
struct net_device * dev ;
int ret = - ENODEV ;
2009-04-09 20:10:28 +04:00
BUG_ON ( maclen ! = ETH_ALEN ) ;
2007-05-03 14:29:41 +04:00
2007-05-03 14:28:49 +04:00
rtnl_lock ( ) ;
2007-09-17 22:56:21 +04:00
dev = __dev_getfirstbyhwtype ( & init_net , ARPHRD_ETHER ) ;
2007-05-03 14:28:49 +04:00
if ( dev ) {
2007-05-03 14:29:41 +04:00
memcpy ( mac , dev - > dev_addr , maclen ) ;
2007-05-03 14:28:49 +04:00
ret = 0 ;
}
rtnl_unlock ( ) ;
return ret ;
}
2007-05-03 14:29:41 +04:00
/*
* 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
*/
2007-05-03 14:28:49 +04:00
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 ;
2007-05-03 14:29:41 +04:00
ASSERT ( maxbufs > 0 ) ;
2007-05-03 14:28:49 +04:00
rtnl_lock ( ) ;
2007-09-17 22:56:21 +04:00
for_each_netdev ( & init_net , dev ) {
2007-05-03 14:28:49 +04:00
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 + + ;
2007-05-03 14:29:41 +04:00
if ( n > = maxbufs )
goto out ;
} endfor_ifa ( idev ) ;
2007-05-03 14:28:49 +04:00
}
out :
rtnl_unlock ( ) ;
return n ;
}