Virtual Net Kernel Module 1.0.0
Модуль ядра Linux на C, который создаёт виртуальный сетевой интерфейс, позволяет задавать IPv4 через `procfs/sysctl` и отвечает на `ping`.
Загрузка...
Поиск...
Не найдено
virtual_net.h
См. документацию.
1#pragma once
2
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>
16#include <net/ip.h>
17
19#define VNET_IFNAME "vnet0"
20
22#define VNET_DEFAULT_IP "10.0.0.1"
23
25static char vnet_ip_str[16] = VNET_DEFAULT_IP;
27static DEFINE_SPINLOCK(vnet_ip_lock);
29static struct ctl_table_header *vnet_sysctl_header;
31static struct net_device *vnet_dev;
34static int __init virtual_net_init(void);
35
37static void __exit virtual_net_exit(void);
38
40static netdev_tx_t vnet_xmit(struct sk_buff *skb, struct net_device *dev);
41
43static void vnet_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats);
44
46static void vnet_arp_reply(struct sk_buff const *skb, struct net_device *dev, __u32 target_ip);
47
49static int vnet_sysctl_handler(const struct ctl_table *table, int write, void *buffer, size_t *lenp, loff_t *ppos);
50
52static bool str_to_ip(__u32 *ip_out, const char *ip_str, spinlock_t *lock);
53
55static int modify_vif_ip_userspace(const char *name, const char *ip_str, bool is_add);
56
58struct vnet_priv {
59 struct rtnl_link_stats64 stats;
60};
61
63static const struct net_device_ops vnet_ops = {
64 .ndo_start_xmit = vnet_xmit,
65 .ndo_get_stats64 = vnet_get_stats64,
66};
67
69static struct ctl_table vnet_table[] = {
70 {
71 .procname = "ip_addr",
72 .data = vnet_ip_str,
73 .maxlen = sizeof(vnet_ip_str),
74 .mode = 0644,
75 .proc_handler = vnet_sysctl_handler,
76 },
77};
78
79
80
Приватные данные интерфейса vnet.
Definition virtual_net.h:58
struct rtnl_link_stats64 stats
Definition virtual_net.h:59
static void vnet_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats)
Возвращает статистику интерфейса.
static const struct net_device_ops vnet_ops
Операции сетевого устройства vnet.
Definition virtual_net.h:63
static struct ctl_table vnet_table[]
Таблица sysctl для /proc/sys/net/vnet/ip_addr.
Definition virtual_net.h:69
static struct net_device * vnet_dev
Указатель на зарегистрированное сетевое устройство vnet.
Definition virtual_net.h:31
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 адрес интерфейса по умолчанию.
Definition virtual_net.h:22
static struct ctl_table_header * vnet_sysctl_header
Дескриптор Зарегистрированной таблицы sysctl.
Definition virtual_net.h:29
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 адреса интерфейса в строковом виде.
Definition virtual_net.h:25
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.