User Tools

Site Tools


mywiki:linux:ip_kernel

Table of Contents

Get Interface IP adderss in Linux Kernel

Method

struct net_device { 
  ...
   struct in_device __rcu  *ip_ptr;        /* IPv4 specific data   */
   struct inet6_dev __rcu  *ip6_ptr;       /* IPv6 specific data */
   ...
}

Example 1

get_ip.c
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/inetdevice.h>
#include <linux/netdevice.h>
 
MODULE_DESCRIPTION("Test Module");
MODULE_AUTHOR("Gilboa Davara");
MODULE_LICENSE("GPL");
 
static int ethernet_id = 0;
module_param(ethernet_id,int,0400);
MODULE_PARM_DESC(ethernet_id,"Ethernet device to display");
 
static int __init test_startup(void)
{
        struct net_device *device;
        struct in_device *in_dev;
        struct in_ifaddr *if_info;
        char dev_name[20];
        __u8 *addr;
 
 
        sprintf(dev_name,"eth%d",ethernet_id);
        device = dev_get_by_name(dev_name);
        in_dev = (struct in_device *)device->ip_ptr;
        if_info = in_dev->ifa_list;
 
        addr = (char *)&if_info->ifa_local;
        printk(KERN_WARNING "Device %s IP: %u.%u.%u.%u\n",
                        dev_name,
                        (__u32)addr[0],
                        (__u32)addr[1],
                        (__u32)addr[2],
                        (__u32)addr[3]);
 
        return 0;
}
 
static void __exit test_exit(void)
{
}
 
module_init(test_startup);
module_exit(test_exit); 

Example 2

 int get_ifaddr_by_name(const char *ifname, __u32 * addr)
  {
         struct net_device *pnet_device;
         struct in_device *pin_device;
         struct in_ifaddr* inet_ifaddr;
 
         read_lock_bh(&dev_base_lock);
  #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22)
         pnet_device = dev_base;
  #else
         pnet_device = first_net_device();
  #endif
         while (pnet_device != NULL)
         {
                 if ((netif_running(pnet_device))
                                 && (pnet_device-ip_ptr != NULL)
                                 && (strcmp(pnet_device-name, ifname) == 0))
                 {
                         pin_device =
                                 (struct in_device *) pnet_device-ip_ptr;
                         inet_ifaddr = pin_device-ifa_list;
                         if(inet_ifaddr == NULL)
                         {
                                 printk("ifa_list is null!\n");
                                 break;
                         }
                         /* ifa_local: ifa_address is the remote point in ppp */
                         *addr = (inet_ifaddr-ifa_local);
                           read_unlock_bh(&dev_base_lock);
                         return 1;
                 }
  #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22)
                 pnet_device = pnet_device-next;
  #else
                 pnet_device = next_net_device(pnet_device);
  #endif
 
         }
 
         read_unlock_bh(&dev_base_lock);
         return -1;              /* address not found! */
  }
mywiki/linux/ip_kernel.txt · Last modified: by 127.0.0.1