Virtual Net Kernel Module 1.0.0
Модуль ядра Linux на C, который создаёт виртуальный сетевой интерфейс, позволяет задавать IPv4 через `procfs/sysctl` и отвечает на `ping`.
Загрузка...
Поиск...
Не найдено
Файл virtual_net.c

Виртуальный сетевой интерфейс ядра Linux с управлением IPv4 через sysctl/procfs. Подробнее...

#include "virtual_net.h"
#include <linux/etherdevice.h>
#include <linux/ip.h>
#include <linux/icmp.h>
#include <linux/proc_fs.h>
#include <linux/if_arp.h>
#include <linux/if_ether.h>
#include <linux/if.h>
#include <net/arp.h>
Граф включаемых заголовочных файлов для virtual_net.c:

См. исходные тексты.

Функции

static int __init virtual_net_init (void)
 Инициализирует модуль: sysctl, интерфейс и стартовый IP.
 
static void __exit virtual_net_exit (void)
 Освобождает ресурсы модуля при выгрузке.
 
static bool str_to_ip (__u32 *ip_out, const char *ip_str, spinlock_t *lock)
 Преобразует IPv4 строку в 32-битный адрес в network byte order.
 
static netdev_tx_t vnet_xmit (struct sk_buff *skb, struct net_device *dev)
 Обрабатывает skb интерфейса и эмулирует ответное сетевое поведение.
 
static void vnet_get_stats64 (struct net_device *dev, struct rtnl_link_stats64 *stats)
 Возвращает статистику интерфейса для ndo_get_stats64.
 
static void vnet_arp_reply (struct sk_buff const *skb, struct net_device *dev, __u32 target_ip)
 Формирует и отправляет ARP reply.
 
static int vnet_sysctl_handler (const struct ctl_table *table, int write, void *buffer, size_t *lenp, loff_t *ppos)
 Обработчик sysctl для /proc/sys/net/vnet/ip_addr.
 
static int modify_vif_ip_userspace (const char *name, const char *ip_str, bool is_add)
 Изменяет IPv4 адрес интерфейса через userspace-команду ip.
 
 module_init (virtual_net_init)
 
 module_exit (virtual_net_exit)
 
 MODULE_LICENSE ("MIT")
 
 MODULE_AUTHOR ("Dmitry Chernikov")
 
 MODULE_DESCRIPTION ("Virtual Net Interface")
 

Подробное описание

Виртуальный сетевой интерфейс ядра Linux с управлением IPv4 через sysctl/procfs.

См. определение в файле virtual_net.c

Функции

◆ modify_vif_ip_userspace()

static int modify_vif_ip_userspace ( const char *  name,
const char *  ip_str,
bool  is_add 
)
static

Изменяет IPv4 адрес интерфейса через userspace-команду ip.

Аргументы
nameИмя сетевого интерфейса.
ip_strIPv4 адрес в строковом виде.
is_addtrue для add, false для del.
Возвращает
Код возврата call_usermodehelper().

См. определение в файле virtual_net.c строка 376

Граф вызова функции:

◆ MODULE_AUTHOR()

MODULE_AUTHOR ( "Dmitry Chernikov"  )

◆ MODULE_DESCRIPTION()

MODULE_DESCRIPTION ( "Virtual Net Interface"  )

◆ module_exit()

module_exit ( virtual_net_exit  )

◆ module_init()

module_init ( virtual_net_init  )

◆ MODULE_LICENSE()

MODULE_LICENSE ( "MIT"  )

◆ str_to_ip()

static bool str_to_ip ( __u32 *  ip_out,
const char *  ip_str,
spinlock_t *  lock 
)
static

Преобразует IPv4 строку в 32-битный адрес в network byte order.

Аргументы
ip_outУказатель на выходное значение IPv4 (network byte order).
ip_strСтроковый IPv4 адрес.
lockSpinlock для синхронизации чтения строки адреса.
Возвращает
true, если адрес корректен и успешно распознан; иначе false.

См. определение в файле virtual_net.c строка 110

Граф вызова функции:

◆ virtual_net_exit()

static void __exit virtual_net_exit ( void  )
static

Освобождает ресурсы модуля при выгрузке.

См. определение в файле virtual_net.c строка 88

◆ virtual_net_init()

static int __init virtual_net_init ( void  )
static

Инициализирует модуль: sysctl, интерфейс и стартовый IP.

Возвращает
0 при успехе, отрицательный код ошибки при неудаче.

См. определение в файле virtual_net.c строка 22

Граф вызовов:

◆ vnet_arp_reply()

static void vnet_arp_reply ( struct sk_buff const *  skb,
struct net_device *  dev,
__u32  target_ip 
)
static

Формирует и отправляет ARP reply.

Аргументы
skbВходящий ARP request.
devСетевое устройство.
target_ipIPv4 адрес интерфейса в сетевом порядке.

См. определение в файле virtual_net.c строка 266

Граф вызова функции:

◆ vnet_get_stats64()

static void vnet_get_stats64 ( struct net_device *  dev,
struct rtnl_link_stats64 *  stats 
)
static

Возвращает статистику интерфейса для ndo_get_stats64.

Аргументы
devСетевое устройство.
statsБуфер назначения статистики.

См. определение в файле virtual_net.c строка 255

◆ vnet_sysctl_handler()

static int vnet_sysctl_handler ( const struct ctl_table *  table,
int  write,
void *  buffer,
size_t *  lenp,
loff_t *  ppos 
)
static

Обработчик sysctl для /proc/sys/net/vnet/ip_addr.

Аргументы
tableОписание параметра sysctl.
writeФлаг операции записи.
bufferБуфер данных от VFS/sysctl.
lenpРазмер буфера.
pposПозиция в буфере.
Возвращает
0 при успехе или отрицательный код ошибки.

См. определение в файле virtual_net.c строка 318

Граф вызовов:

◆ vnet_xmit()

static netdev_tx_t vnet_xmit ( struct sk_buff *  skb,
struct net_device *  dev 
)
static

Обрабатывает skb интерфейса и эмулирует ответное сетевое поведение.

Аргументы
skbБуфер пакета.
devСетевое устройство.
Возвращает
NETDEV_TX_OK во всех ветках обработки.

Поддерживает:

  • ARP request -> ARP reply для текущего адреса vnet_ip_str.
  • ICMP Echo Request -> ICMP Echo Reply.

См. определение в файле virtual_net.c строка 131

Граф вызовов: