8#include <linux/module.h>
9#include <linux/kernel.h>
10#include <linux/init.h>
11#include <linux/netdevice.h>
12#include <linux/inet.h>
13#include <linux/sysctl.h>
14#include <linux/rtnetlink.h>
15#include <linux/types.h>
19#define VNET_IFNAME "vnet0"
22#define VNET_DEFAULT_IP "10.0.0.1"
40static netdev_tx_t
vnet_xmit(
struct sk_buff *skb,
struct net_device *dev);
46static void vnet_arp_reply(
struct sk_buff
const *skb,
struct net_device *dev, __u32 target_ip);
49static int vnet_sysctl_handler(
const struct ctl_table *table,
int write,
void *buffer,
size_t *lenp, loff_t *ppos);
52static bool str_to_ip(__u32 *ip_out,
const char *ip_str, spinlock_t *lock);
71 .procname =
"ip_addr",
Приватные данные интерфейса vnet.
struct rtnl_link_stats64 stats
static void vnet_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats)
Возвращает статистику интерфейса.
static const struct net_device_ops vnet_ops
Операции сетевого устройства vnet.
static struct ctl_table vnet_table[]
Таблица sysctl для /proc/sys/net/vnet/ip_addr.
static struct net_device * vnet_dev
Указатель на зарегистрированное сетевое устройство vnet.
static void vnet_arp_reply(struct sk_buff const *skb, struct net_device *dev, __u32 target_ip)
Формирует и отправляет ARP reply для целевого IP.
static int __init virtual_net_init(void)
Инициализация и регистрация модуля в ядре.
#define VNET_DEFAULT_IP
IPv4 адрес интерфейса по умолчанию.
static struct ctl_table_header * vnet_sysctl_header
Дескриптор Зарегистрированной таблицы sysctl.
static netdev_tx_t vnet_xmit(struct sk_buff *skb, struct net_device *dev)
Обработчик передачи пакета с эмуляцией ARP/ICMP ответа.
static DEFINE_SPINLOCK(vnet_ip_lock)
Spinlock для синхронизации чтения/записи vnet_ip_str.
static void __exit virtual_net_exit(void)
Выгрузка и очистка ресурсов модуля.
static char vnet_ip_str[16]
Текущее значение IPv4 адреса интерфейса в строковом виде.
static bool str_to_ip(__u32 *ip_out, const char *ip_str, spinlock_t *lock)
Преобразует IPv4 строку в сетевой формат.
static int modify_vif_ip_userspace(const char *name, const char *ip_str, bool is_add)
Изменяет IPv4 интерфейса через userspace-утилиту ip.
static int vnet_sysctl_handler(const struct ctl_table *table, int write, void *buffer, size_t *lenp, loff_t *ppos)
Обработчик записи/чтения /proc/sys/net/vnet/ip_addr.