Виртуальный сетевой интерфейс ядра 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>
См. исходные тексты.
|
| 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_str | IPv4 адрес в строковом виде. |
| is_add | true для 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_init()
◆ MODULE_LICENSE()
◆ 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 адрес. |
| lock | Spinlock для синхронизации чтения строки адреса. |
- Возвращает
- 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_ip | IPv4 адрес интерфейса в сетевом порядке. |
См. определение в файле 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