драйвера сетевых устройств

Вопросы программного кода и архитектуры Linux

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

драйвера сетевых устройств

Непрочитанное сообщение Olej » 18 июн 2022, 20:47

Таких тем и работающих образцов уже много было:
простой виртуальный сетевой интерфейс
Модуль ядра Linux. Виртуальный сетевой интерфейс.
Виртуальное сетевой устройство с криптованием

Ну и, естественно:
практикум по Linux Kernel

Но...
Всё это делалось и работоспособно максимум для ядра 3.19 ... а сейчас в обиходе 5.4, и стабильное 5.18 ...
И всё раньше сделанное на 70-80% просто не компилируется!
И всё нужно переделывать по-новой... :-(

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: драйвера сетевых устройств

Непрочитанное сообщение Olej » 18 июн 2022, 21:00

Olej писал(а):
18 июн 2022, 20:47
И всё раньше сделанное на 70-80% просто не компилируется!
И всё нужно переделывать по-новой...
Это соответствует каталог /net предыдущей книги и архива.
Это уже работающие варианты ... относительно регистрации сетевых устройств (интерфейсов!).

P.S. Это выкладывается не для того чтобы скачивать ... а в качестве справочника промежуточной версии.
Но если кого заинтересует - всё соответствует тексту книги 2015 года, но работает с ядром 5.4.120
Вложения
net.7.262.tgz
(38.42 КБ) 37 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: драйвера сетевых устройств

Непрочитанное сообщение Olej » 19 июн 2022, 15:11

Olej писал(а):
18 июн 2022, 21:00
Это уже работающие варианты ...
Особый интерес представляет перенос всего этого кино на платформу ARM ... всякие мелки наладонники. То что на то время (2012г.) просто не было возможности проверить.
Это вот создание сетевых интерфейсов:

Код: Выделить всё

olej@raspberrypi:~/2022/kernel/examples/network/net $ modinfo mulnet.ko
filename:       /home/olej/2022/kernel/examples/network/net/mulnet.ko
license:        GPL v2
description:    LDD:1.0 s_24/lab1_network.c
author:         Oleg Tsiliuric
author:         Tatsuo Kawasaki
author:         Jerry Cooperstein
author:         Bill Shubert
srcversion:     80160630547B3EB682B2D50
depends:        
name:           mulnet
vermagic:       5.15.32-v7+ SMP mod_unload modversions ARMv7 p2v8 
parm:           num:int
parm:           title:charp
parm:           digit:int
parm:           mode:int

Код: Выделить всё

olej@raspberrypi:~/2022/kernel/examples/network/net $ sudo insmod mulnet.ko num=4 title=zx

Код: Выделить всё

olej@raspberrypi:~/2022/kernel/examples/network/net $ ip l
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether b8:27:eb:7e:2c:a8 brd ff:ff:ff:ff:ff:ff
4: zx0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 1000
    link/ether 00:01:02:03:04:05 brd ff:ff:ff:ff:ff:ff
5: zx1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 1000
    link/ether 01:02:03:04:05:06 brd ff:ff:ff:ff:ff:ff
6: zx2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 1000
    link/ether 02:03:04:05:06:07 brd ff:ff:ff:ff:ff:ff
7: zx3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 1000
    link/ether 03:04:05:06:07:08 brd ff:ff:ff:ff:ff:ff

Код: Выделить всё

olej@raspberrypi:~/2022/kernel/examples/network/net $ sudo rmmod mulnet

Код: Выделить всё

olej@raspberrypi:~/2022/kernel/examples/network/net $ ip l
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether b8:27:eb:7e:2c:a8 brd ff:ff:ff:ff:ff:ff

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: драйвера сетевых устройств

Непрочитанное сообщение Olej » 19 июн 2022, 15:23

Olej писал(а):
19 июн 2022, 15:11
Это вот создание сетевых интерфейсов:
А это вот как "перелистываются" сетевые интерфейся - существувющие и вновь созданные:

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples/network/net$ uname -a
Linux R420 5.4.0-120-generic #136-Ubuntu SMP Fri Jun 10 13:40:48 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples/network/net$ sudo insmod mulnet.ko num=4 title=abc
[sudo] пароль для olej:

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples/network/net$ ip l
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether 90:b1:1c:54:3a:46 brd ff:ff:ff:ff:ff:ff
3: eno2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether 90:b1:1c:54:3a:47 brd ff:ff:ff:ff:ff:ff
4: team1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default qlen 1000
    link/ether ee:8b:90:64:9b:dd brd ff:ff:ff:ff:ff:ff
5: abc0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN mode DEFAULT group default qlen 1000
    link/ether 00:01:02:03:04:05 brd ff:ff:ff:ff:ff:ff
6: abc1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN mode DEFAULT group default qlen 1000
    link/ether 01:02:03:04:05:06 brd ff:ff:ff:ff:ff:ff
7: abc2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN mode DEFAULT group default qlen 1000
    link/ether 02:03:04:05:06:07 brd ff:ff:ff:ff:ff:ff
8: abc3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN mode DEFAULT group default qlen 1000
    link/ether 03:04:05:06:07:08 brd ff:ff:ff:ff:ff:ff

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples/network/net$ sudo insmod devices.ko
insmod: ERROR: could not insert module devices.ko: Operation not permitted

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples/network/net$ dmesg | tail -n 10
[18147.771220] Hello: module loaded at 0xffffffffc0d24000
[18147.771222] Hello: dev_base address=0xffff95f48b20e000
[18147.771228] name=lo     irq=0   MAC=00:00:00:00:00:00 rx_bytes=9602226  tx_bytes=9602226
[18147.771232] name=eno1   irq=16  MAC=90:b1:1c:54:3a:46 rx_bytes=33949503 tx_bytes=11483504
[18147.771235] name=eno2   irq=17  MAC=90:b1:1c:54:3a:47 rx_bytes=22621614 tx_bytes=7072507
[18147.771240] name=team1  irq=0   MAC=ee:8b:90:64:9b:dd rx_bytes=0        tx_bytes=0
[18147.771242] name=abc0   irq=0   MAC=00:01:02:03:04:05 rx_bytes=0        tx_bytes=0
[18147.771244] name=abc1   irq=0   MAC=01:02:03:04:05:06 rx_bytes=0        tx_bytes=0
[18147.771246] name=abc2   irq=0   MAC=02:03:04:05:06:07 rx_bytes=0        tx_bytes=0
[18147.771248] name=abc3   irq=0   MAC=03:04:05:06:07:08 rx_bytes=0        tx_bytes=0

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: драйвера сетевых устройств

Непрочитанное сообщение Olej » 20 июн 2022, 09:49

Olej писал(а):
19 июн 2022, 15:23
А это вот как "перелистываются" сетевые интерфейся - существувющие и вновь созданные:
Это всё превосходно работает на всех X86_64 ... Но ... :lol: - глухо подвешивает микро ARM - имидж Armbian Orange Pi One. :-(
Нужно разбираться.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: драйвера сетевых устройств

Непрочитанное сообщение Olej » 20 июн 2022, 11:06

Olej писал(а):
18 июн 2022, 20:47
простой виртуальный сетевой интерфейс
Виртуальный сетевой интерфейс. Делаем и проверяем.
В архиве их 3:

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples/network/virt$ ls -l *.ko
-rw-rw-r-- 1 olej olej 12328 июн 20 10:58 virt1.ko
-rw-rw-r-- 1 olej olej 12208 июн 20 10:58 virt2.ko
-rw-rw-r-- 1 olej olej 12248 июн 20 10:58 virt.ko
Но отличаются они только тем, как и в каких структурах у них накапливается статистика трафика, 3 старых способа (ndo_get_stats не ndo_get_stats64), как и было описано в книге.
Выглядит это примерно так:

Код: Выделить всё

#include <linux/module.h>
#include <linux/version.h>
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/moduleparam.h>
#include <net/arp.h>

#define ERR(...) printk(KERN_ERR "! "__VA_ARGS__)
#define LOG(...) printk(KERN_INFO "! "__VA_ARGS__)

static char* link = "eth0";
module_param(link, charp, 0);

static char* ifname = "virt"; 
module_param(ifname, charp, 0);

static struct net_device *child = NULL;

struct priv {
   struct net_device_stats stats;
   struct net_device *parent;
};

static rx_handler_result_t handle_frame(struct sk_buff **pskb) {
   struct sk_buff *skb = *pskb;
   if(child) {
      struct priv *priv = netdev_priv(child);
      priv->stats.rx_packets++;
      priv->stats.rx_bytes += skb->len;
      LOG("rx: injecting frame from %s to %s", skb->dev->name, child->name);
      skb->dev = child;
      /* netif_receive_skb(skb);
      return RX_HANDLER_CONSUMED; */
      return RX_HANDLER_ANOTHER;
   }
   return RX_HANDLER_PASS;
}

static int open(struct net_device *dev) {
   netif_start_queue(dev);
   LOG("%s: device opened", dev->name);
   return 0;
}

static int stop(struct net_device *dev) {
   netif_stop_queue(dev);
   LOG("%s: device closed", dev->name);
   return 0;
}

static netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *dev) {
   struct priv *priv = netdev_priv(dev);
   priv->stats.tx_packets++;
   priv->stats.tx_bytes += skb->len;
   if(priv->parent) {
      skb->dev = priv->parent;
      skb->priority = 1;
      dev_queue_xmit(skb);
      LOG("tx: injecting frame from %s to %s", dev->name, skb->dev->name);
      return 0;
   }
   return NETDEV_TX_OK;
}

static struct net_device_stats *get_stats(struct net_device *dev) {
   return &((struct priv*)netdev_priv(dev))->stats;
}

static struct net_device_ops crypto_net_device_ops = {
   .ndo_open = open,
   .ndo_stop = stop,
   .ndo_get_stats = get_stats,
   .ndo_start_xmit = start_xmit,
};

// #define MAX_ADDR_LEN    32  <netdev.h>
// #define ETH_ALEN        6   /* Octets in one ethernet addr   */ <if_ether.h>

static void setup(struct net_device *dev) {
   int j;
   ether_setup(dev);
   memset(netdev_priv(dev), 0, sizeof(struct priv));
   dev->netdev_ops = &crypto_net_device_ops;
   for(j = 0; j < ETH_ALEN; ++j) // fill in the MAC address with a phoney 
      dev->dev_addr[j]= (char)j;
}

int __init init(void) {
   int err = 0;
   struct priv *priv;
   char ifstr[40];
   sprintf(ifstr, "%s%s", ifname, "%d");
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 17, 0))
   child = alloc_netdev(sizeof(struct priv), ifstr, setup);
#else
   child = alloc_netdev(sizeof(struct priv), ifstr, NET_NAME_UNKNOWN, setup);
#endif
   if(child == NULL) {
      ERR("%s: allocate error", THIS_MODULE->name); return -ENOMEM;
   }
   priv = netdev_priv(child);
   priv->parent = __dev_get_by_name(&init_net, link); // parent interface  
   if(!priv->parent) {
      ERR("%s: no such link: %s", THIS_MODULE->name, link);
      err = -ENODEV; goto err;
   }
   if(priv->parent->type != ARPHRD_ETHER && priv->parent->type != ARPHRD_LOOPBACK) {
      ERR("%s: illegal net type", THIS_MODULE->name);
      err = -EINVAL; goto err;
   }
   /* also, and clone its IP, MAC and other information */
   memcpy(child->dev_addr, priv->parent->dev_addr, ETH_ALEN);
   memcpy(child->broadcast, priv->parent->broadcast, ETH_ALEN);
   if((err = dev_alloc_name(child, child->name))) {
      ERR("%s: allocate name, error %i", THIS_MODULE->name, err);
      err = -EIO; goto err;
   }
   register_netdev(child);
   rtnl_lock();
   netdev_rx_handler_register(priv->parent, &handle_frame, NULL);
   rtnl_unlock();
   LOG("module %s loaded", THIS_MODULE->name);
   LOG("%s: create link %s", THIS_MODULE->name, child->name);
   LOG("%s: registered rx handler for %s", THIS_MODULE->name, priv->parent->name);
   return 0;
err:
   free_netdev(child);
   return err;
}

void __exit virt_exit(void) {
   struct priv *priv = netdev_priv(child);
   if(priv->parent) {
      rtnl_lock();
      netdev_rx_handler_unregister(priv->parent);
      rtnl_unlock();
      LOG("unregister rx handler for %s\n", priv->parent->name);
   }
   unregister_netdev(child);
   free_netdev(child);
   LOG("module %s unloaded", THIS_MODULE->name);
}

module_init(init);
module_exit(virt_exit);

MODULE_AUTHOR("Oleg Tsiliuric");
MODULE_AUTHOR("Nikita Dorokhin");
MODULE_LICENSE("GPL v2");
MODULE_VERSION("3.2");
Функционально это: вы можете навесить такой интерфейс на любой существующий, сделав ему любые сетевые присвоения, и работать через него вместо родительского!
Для сетевых экспериментов - это сила! :lol:
Вложения
virt.7.264.tgz
(8.36 КБ) 36 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: драйвера сетевых устройств

Непрочитанное сообщение Olej » 20 июн 2022, 11:15

Olej писал(а):
20 июн 2022, 11:06
и проверяем
Итак...
Имею сервер:

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples/network/virt$ inxi -MCSxxx
System:    Host: R420 Kernel: 5.4.0-120-generic x86_64 bits: 64 compiler: gcc v: 9.4.0 Desktop: Cinnamon 5.2.7 
           wm: muffin 5.2.1 dm: LightDM 1.30.0 Distro: Linux Mint 20.3 Una base: Ubuntu 20.04 focal 
Machine:   Type: Server System: Dell product: PowerEdge R420 v: N/A serial: <superuser/root required> Chassis: type: 23 
           serial: <superuser/root required> 
           Mobo: Dell model: 0CN7CM v: A06 serial: <superuser/root required> BIOS: Dell v: 2.9.0 date: 01/09/2020 
CPU:       Topology: 2x 10-Core model: Intel Xeon E5-2470 v2 bits: 64 type: MT MCP SMP arch: Ivy Bridge rev: 4 
           L2 cache: 50.0 MiB 
           flags: avx lm nx pae sse sse2 sse3 sse4_1 sse4_2 ssse3 vmx bogomips: 192080 
           Speed: 1241 MHz min/max: 1200/3200 MHz Core speeds (MHz): 1: 1495 2: 1331 3: 2955 4: 1733 5: 2872 6: 1500 7: 2843 
           8: 1864 9: 2880 10: 1574 11: 2899 12: 1578 13: 1479 14: 2495 15: 1387 16: 1249 17: 1345 18: 1277 19: 1390 20: 1680 
           21: 1448 22: 2788 23: 1494 24: 1289 25: 2880 26: 1399 27: 2861 28: 1389 29: 2899 30: 1432 31: 2901 32: 1274 
           33: 2885 34: 1558 35: 1841 36: 1288 37: 2202 38: 1242 39: 1572 40: 1714 
У него сетевые интерфейсы:

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples/network/virt$ ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 90:b1:1c:54:3a:46 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.14/24 brd 192.168.1.255 scope global noprefixroute eno1
       valid_lft forever preferred_lft forever
3: eno2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 90:b1:1c:54:3a:47 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.13/24 brd 192.168.1.255 scope global noprefixroute eno2
       valid_lft forever preferred_lft forever
4: team1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
    link/ether ee:22:fc:60:77:8a brd ff:ff:ff:ff:ff:ff
Как понятно, в LAN работает в сетке 192.168.1.0
2 физических адаптера:

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples/network/virt$ inxi -Nxxx
Network:   Device-1: Broadcom and subsidiaries NetXtreme BCM5720 2-port Gigabit Ethernet PCIe vendor: Dell driver: tg3
           v: 3.137 port: fc00 bus ID: 02:00.0 chip ID: 14e4:165f
           Device-2: Broadcom and subsidiaries NetXtreme BCM5720 2-port Gigabit Ethernet PCIe vendor: Dell driver: tg3
           v: 3.137 port: fc00 bus ID: 02:00.1 chip ID: 14e4:165f
Хочу :lol: :
- "навесить" на интерфейс eno2 виртуальный интерфейс ...
- и конфигурировать этот виртуальный адаптер для работы в сетке 192.168.5.0

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: драйвера сетевых устройств

Непрочитанное сообщение Olej » 20 июн 2022, 11:23

Olej писал(а):
20 июн 2022, 11:15
- и конфигурировать этот виртуальный адаптер для работы в сетке 192.168.5.0
Но прежде чем конфигурировать сервер сетку 192.168.5.0, нужно создать ответную часть в этой сети...
Для этого, и для усложнения жизни и условий эксперимента :lol: выбираю ответным хостом в LAN - Raspberry Pi ... совершенно разнородное создание: ARM процессор, 32 бит...

Код: Выделить всё

olej@raspberrypi:~ $ ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether b8:27:eb:7e:2c:a8 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.142/24 brd 192.168.1.255 scope global dynamic noprefixroute eth0
       valid_lft 95709sec preferred_lft 67134sec
    inet6 fe80::5b06:3ef5:5b91:15d3/64 scope link
       valid_lft forever preferred_lft forever

Код: Выделить всё

olej@raspberrypi:~ $ inxi -Sxxx
System:    Host: raspberrypi Kernel: 5.15.32-v7+ armv7l bits: 32 compiler: gcc v: 10.2.1 Desktop: Openbox 3.6.1 info: lxpanel 
           dm: LightDM 1.26.0 Distro: Raspbian GNU/Linux 11 (bullseye) 
Его дохленький сетевой интерфейс:

Код: Выделить всё

olej@raspberrypi:~ $ ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether b8:27:eb:7e:2c:a8 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.142/24 brd 192.168.1.255 scope global dynamic noprefixroute eth0
       valid_lft 95709sec preferred_lft 67134sec
    inet6 fe80::5b06:3ef5:5b91:15d3/64 scope link 
       valid_lft forever preferred_lft forever
Присваиваю ему алиасный IP в другой (192.168.5.0) сетке:

Код: Выделить всё

olej@raspberrypi:~ $ sudo ifconfig eth0:1 192.168.5.142

Код: Выделить всё

 
olej@raspberrypi:~ $ ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether b8:27:eb:7e:2c:a8 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.142/24 brd 192.168.1.255 scope global dynamic noprefixroute eth0
       valid_lft 95653sec preferred_lft 67078sec
    inet 192.168.5.142/24 brd 192.168.5.255 scope global eth0:1
       valid_lft forever preferred_lft forever
    inet6 fe80::5b06:3ef5:5b91:15d3/64 scope link 
       valid_lft forever preferred_lft forever

Код: Выделить всё

olej@raspberrypi:~ $ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.3     0.0.0.0         UG    202    0        0 eth0
192.168.1.0     0.0.0.0         255.255.255.0   U     202    0        0 eth0
192.168.5.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0

Теперь всё готово для испытаний... :lol:

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: драйвера сетевых устройств

Непрочитанное сообщение Olej » 20 июн 2022, 11:31

Olej писал(а):
20 июн 2022, 11:23
Теперь всё готово для испытаний...
Навешиваю виртуальный интерфейс:

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples/network/net$ sudo insmod devices.ko
insmod: ERROR: could not insert module devices.ko: Operation not permitted

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples/network/virt$ ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 90:b1:1c:54:3a:46 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.14/24 brd 192.168.1.255 scope global noprefixroute eno1
       valid_lft forever preferred_lft forever
3: eno2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 90:b1:1c:54:3a:47 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.13/24 brd 192.168.1.255 scope global noprefixroute eno2
       valid_lft forever preferred_lft forever
4: team1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
    link/ether ee:22:fc:60:77:8a brd ff:ff:ff:ff:ff:ff
5: virt0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 1000
    link/ether 90:b1:1c:54:3a:47 brd ff:ff:ff:ff:ff:ff
Заодно диагностика:

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples/network/net$ sudo insmod devices.ko 
insmod: ERROR: could not insert module devices.ko: Operation not permitted
В dmesg вижу как побежали отладочные сообщения...

Код: Выделить всё

...
Jun 20 10:24:36 R420 kernel: [ 3310.530333] ! rx: injecting frame from eno2 to virt0
Jun 20 10:24:36 R420 kernel: [ 3313.207319] Hello: module loaded at 0xffffffffc0eda000
Jun 20 10:24:36 R420 kernel: [ 3313.207321] Hello: dev_base address=0xffffa0f60b20a000
Jun 20 10:24:36 R420 kernel: [ 3313.207326] name=lo     irq=0   MAC=00:00:00:00:00:00 rx_bytes=88590    tx_bytes=88590
Jun 20 10:24:36 R420 kernel: [ 3313.207331] name=eno1   irq=16  MAC=90:b1:1c:54:3a:46 rx_bytes=3237288  tx_bytes=1231065
Jun 20 10:24:36 R420 kernel: [ 3313.207334] name=eno2   irq=17  MAC=90:b1:1c:54:3a:47 rx_bytes=8418264  tx_bytes=2129813
Jun 20 10:24:36 R420 kernel: [ 3313.207343] name=team1  irq=0   MAC=ee:22:fc:60:77:8a rx_bytes=0        tx_bytes=0
Jun 20 10:24:36 R420 kernel: [ 3313.207345] name=virt0  irq=0   MAC=90:b1:1c:54:3a:47 rx_bytes=0        tx_bytes=0
Jun 20 10:24:39 R420 kernel: [ 3313.530309] ! rx: injecting frame from eno2 to virt0
Jun 20 10:24:42 R420 kernel: [ 3316.530384] ! rx: injecting frame from eno2 to virt0
Jun 20 10:24:43 R420 kernel: [ 3319.530619] ! rx: injecting frame from eno2 to virt0
Jun 20 10:24:45 R420 kernel: [ 3320.246571] ! rx: injecting frame from eno2 to virt0
Jun 20 10:24:48 R420 kernel: [ 3322.530873] ! rx: injecting frame from eno2 to virt0
Jun 20 10:24:51 R420 kernel: [ 3325.531131] ! rx: injecting frame from eno2 to virt0
Jun 20 10:24:53 R420 kernel: [ 3328.531422] ! rx: injecting frame from eno2 to virt0
...
Конфигурирую свой виртуальный интерфейс на сетку 192.168.5.0:

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples/network/virt$ sudo ifconfig virt0 192.168.5.240 up

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples/network/virt$ route -n
Таблица маршутизации ядра протокола IP
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0         192.168.1.3     0.0.0.0         UG    100    0        0 eno1
0.0.0.0         192.168.1.6     0.0.0.0         UG    20101  0        0 eno2
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eno1
192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 eno1
192.168.1.0     0.0.0.0         255.255.255.0   U     101    0        0 eno2
192.168.5.0     0.0.0.0         255.255.255.0   U     0      0        0 virt0

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples/network/virt$ sudo ifconfig virt0
virt0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.5.240  netmask 255.255.255.0  broadcast 192.168.5.255
        ether 90:b1:1c:54:3a:47  txqueuelen 1000  (Ethernet)
        RX packets 274  bytes 32518 (32.5 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 36  bytes 4064 (4.0 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
Всё! :lol:

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: драйвера сетевых устройств

Непрочитанное сообщение Olej » 20 июн 2022, 11:34

Olej писал(а):
20 июн 2022, 11:06
и проверяем.
ping по LAN с 2-х концов...

С сервера на Raspberry Pi:

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples/network/virt$ ping -I virt0 -c3 192.168.5.142
PING 192.168.5.142 (192.168.5.142) from 192.168.5.240 virt0: 56(84) bytes of data.
64 bytes from 192.168.5.142: icmp_seq=1 ttl=64 time=9.02 ms
64 bytes from 192.168.5.142: icmp_seq=2 ttl=64 time=3.87 ms
64 bytes from 192.168.5.142: icmp_seq=3 ttl=64 time=3.95 ms

--- 192.168.5.142 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 3.871/5.614/9.020/2.408 ms
С Raspberry Pi на сервер:

Код: Выделить всё

olej@raspberrypi:~ $ ping -c3 192.168.5.240
PING 192.168.5.240 (192.168.5.240) 56(84) bytes of data.
64 bytes from 192.168.5.240: icmp_seq=1 ttl=64 time=5.02 ms
64 bytes from 192.168.5.240: icmp_seq=2 ttl=64 time=12.7 ms
64 bytes from 192.168.5.240: icmp_seq=3 ttl=64 time=4.58 ms

--- 192.168.5.240 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 4.581/7.416/12.651/3.705 ms
P.S. И проверка того, что с 1-го физического интерфейса ping продолжает идти, а с 2-го он заблокирован:

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples/network/virt$ ping -I eno1 -c3 192.168.1.142
PING 192.168.1.142 (192.168.1.142) from 192.168.1.14 eno1: 56(84) bytes of data.
64 bytes from 192.168.1.142: icmp_seq=1 ttl=64 time=3.83 ms
64 bytes from 192.168.1.142: icmp_seq=2 ttl=64 time=3.80 ms
64 bytes from 192.168.1.142: icmp_seq=3 ttl=64 time=6.34 ms

--- 192.168.1.142 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 3.799/4.656/6.344/1.193 ms

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples/network/virt$ ping -I eno2 -c3 192.168.1.142
PING 192.168.1.142 (192.168.1.142) from 192.168.1.13 eno2: 56(84) bytes of data.
From 192.168.1.13 icmp_seq=1 Destination Host Unreachable
From 192.168.1.13 icmp_seq=2 Destination Host Unreachable
From 192.168.1.13 icmp_seq=3 Destination Host Unreachable

--- 192.168.1.142 ping statistics ---
3 packets transmitted, 0 received, +3 errors, 100% packet loss, time 2037ms
pipe 3

Ответить

Вернуться в «Linux изнутри»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 6 гостей