본문 바로가기

리눅스 커널/네트워크

struct net_device example

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/netdevice.h>
#include <linux/inetdevice.h>

char * if_name = NULL;
module_param(if_name, charp, 0644);

static int print_info(void)
{
	struct net_device * dev = dev_get_by_name(&init_net, if_name);
	struct in_ifaddr * addrs = NULL;
	struct wireless_dev * wdev = NULL;

	if (!dev)
		return -1;

	printk("-----net_device info-----\n");
	printk("name: %s\n", dev->name); //interface name
	printk("ifindex: %d\n", dev->ifindex); //interface index
	printk("dev_addr: %pM\n", dev->dev_addr); //hw address
	printk("broadcast: %pM\n", dev->broadcast); //hw broadcast address
	printk("flags: %u\n", dev->flags); //interface state "ref, ifconfig"
	printk("promiscuity: %u\n", dev->promiscuity); //promiscious mode flag

	if (dev->ip_ptr)
		addrs = dev->ip_ptr->ifa_list;
	
	if (addrs)
	{
		printk("ifa_local: %pI4\n", &addrs->ifa_local); //ip address
		printk("ifa_address: %pI4\n", &addrs->ifa_address); //;;
		printk("ifa_mask: %pI4\n", &addrs->ifa_mask); //subnet mask
		printk("ifa_broadcast: %pI4\n", &addrs->ifa_broadcast); //ip broadcast address
	}

	wdev = dev->ieee80211_ptr; //wireless device
	if (!wdev)
		return -1;

	return -1;
}

int test_init(void)
{
	if (!if_name)
		return -1;

	//always return -1, so dont care about rmmod
	return print_info();	
}

void test_exit(void)
{
	
}

module_init(test_init);
module_exit(test_exit);
MODULE_AUTHOR("testkernel.tistory.com");
MODULE_DESCRIPTION("struct net_device example");
MODULE_LICENSE("GPL");

dev_get_by_index() 나 dev_get_by_name() 으로 원하는 NIC의 net_device 구조체를 얻어 올 수 있다.

 

%pM 은 문자열 형태의 MAC 주소 출력을 위해 사용되고,

%pI4 는 문자열 형태의 IPv4  주소 출력을 위해 사용된다.

 

사용법

 

모듈 컴파일 후,

#insmod "~~~.ko" if_name="interface 이름" & dmesg



'리눅스 커널 > 네트워크' 카테고리의 다른 글

Raw socket incoming packet capture  (0) 2021.10.24
Ethernet & ARP Header  (0) 2021.10.24
IP & ICMP Header  (0) 2021.10.24
TCP & UDP Header  (0) 2021.10.24
ioctl - socket  (0) 2021.10.24