Имею кучку свичей HP Procurve 2848,3500
Хочу выяснить соответствие MAC=PORT на них. Делаю путем опроса SNMP
snmpwalk -v2c -c public switch1.mydomain 1.3.6.1.2.1.17.7.1.2.2.1.2
В данном виде получаю кучку строк вида
SNMPv2-SMI::mib-2.17.7.1.2.2.1.2.2.0.27.120.236.125.187 = INTEGER: 36
SNMPv2-SMI::mib-2.17.7.1.2.2.1.2.2.0.29.96.154.226.97 = INTEGER: 6
SNMPv2-SMI::mib-2.17.7.1.2.2.1.2.2.0.30.11.7.132.102 = INTEGER: 30
SNMPv2-SMI::mib-2.17.7.1.2.2.1.2.2.0.30.11.234.50.104 = INTEGER: 49
SNMPv2-SMI::mib-2.17.7.1.2.2.1.2.2.0.30.11.234.209.106 = INTEGER: 49
SNMPv2-SMI::mib-2.17.7.1.2.2.1.2.2.1.30.11.234.225.144 = INTEGER: 49
SNMPv2-SMI::mib-2.17.7.1.2.2.1.2.2.1.30.103.80.144.161 = INTEGER: 292
SNMPv2-SMI::mib-2.17.7.1.2.2.1.2.2.1.31.41.235.36.67 = INTEGER: 49
SNMPv2-SMI::mib-2.17.7.1.2.2.1.2.2.1.33.90.221.183.59 = INTEGER: 49
После фильтрации (отброс ненужного, dec2hex, выделение порта)
snmpwalk -v2c -c public switch1.mydomain 1.3.6.1.2.1.17.7.1.2.2.1.2 | sed "s/\./
/g; s/SNMPv2-SMI::mib-2 17 7 1 2 2 1 2 //g ; s/ = INTEGER://g" | awk '{printf "MAC:%02X%02X%02X%02X%02X%02X
Port %02d\n",$2,$3,$4,$5,$6,$7,$8}'
Получаю вот такой список
MAC:001B78EC7DBB Port 36
MAC:001D609AE261 Port 06
MAC:001E0B078466 Port 30
MAC:001E0BEA3268 Port 49
MAC:001E0BEAD16A Port 49
MAC:011E0BEAE190 Port 49
MAC:011E675090A1 Port 292
MAC:011F29EB2443 Port 49
MAC:01215ADDB73B Port 49
Свич имеет 48 обычных порта, + 4 10GbE для связи с другими свичами (не знаю как называются
они правильно 2x10GbE-GEN, 2x10GbE-CX4 )
Все бы ничего, пока порты идут <= 48. Когда порты идут >48 (то это как раз эти 4
дополнительных (в свиче они обозначаются как А1-А4)). И если продолжать обычную нумерацию
то 49,50,51,51. С этим тоже проблем нет, если порт >48, то МАС на другом свиче, идем
туда и ищем пока порт не будет <=48.
А вот порты 291, 294, 297.. и прочие, опытным путем установлено,что это транки (Trk1..TrkN).
Но как понять какой именно транк, на каких портах и с какой нумерации они вообще
идут - загадка.
P.S. Нашел snmp бразером соответствие цифр и человеческих названий -
snmpwalk -v2c -c public switch1.mydomain .iso.org.dod.internet.mgmt.mib-2.interfaces.ifTable.ifEntry.ifDescr
Выдает
IF-MIB::ifDescr.47 = STRING: 47
IF-MIB::ifDescr.48 = STRING: 48
IF-MIB::ifDescr.49 = STRING: A1
IF-MIB::ifDescr.50 = STRING: A2
IF-MIB::ifDescr.51 = STRING: A3
IF-MIB::ifDescr.52 = STRING: A4
IF-MIB::ifDescr.291 = STRING: Trk2
IF-MIB::ifDescr.292 = STRING: Trk3
IF-MIB::ifDescr.293 = STRING: Trk4
Пожалуй это то что надо!
Ответы
Ответ 1
Нашел snmp бразером соответствие цифр и человеческих названий -
snmpwalk -v2c -c public switch1.mydomain .iso.org.dod.internet.mgmt.mib-2.interfaces.ifTable.ifEntry.ifDescr
Не уверен, что вопрос соответствует правилам, но всё же.
Есть 10Gb карточка (марка не важна, т.к. результат повторялся и на двух других, отличных
от этой) и Debian Buster, соединенный оптикой напрямую с машинкой-источником данных.
Организован поток данных ~9Gb, состоящий из ethernet фреймов размера ~9000 байт, в
которых кроме MAC отравителя, МАС получателя, кастомного EtherType и счетчика пакетов
ничего нет.
Замеры утилитами wireshark, tshark, tcpdump (хотя они всё равно все работают через
одну библиотеку) показывают пропуск примерно каждого второго пакета. Самописный кривой
код показывает примерно то же. При этом под Windows 7 тот же wireshark (при большом
выделенном буфере) ловит все пакеты.
Проверка пропускной способности сети утилитой iperf3 на TCP трафике даёт стабильные
9.8Gb.
# uname -a
Linux debian 4.19.0-6-amd64 #1 SMP Debian 4.19.67-2 (2019-08-28) x86_64 GNU/Linux
# ifconfig enp1s0
enp1s0: flags=4163 mtu 12000
inet 10.0.0.1 netmask 255.255.255.0 broadcast 10.0.255.255
inet6 fe80::b2c5:54ff:feff:f37f prefixlen 64 scopeid 0x20
ether b0:c5:54:ff:f3:7f txqueuelen 3000 (Ethernet)
RX packets 1501482032 bytes 13216245041216 (12.0 TiB)
RX errors 0 dropped 1501472982 overruns 0 frame 0
TX packets 75 bytes 7809 (7.6 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device interrupt 34 memory 0x90400000-90410000
# ethtool -g enp1s0
Ring parameters for enp1s0:
Pre-set maximums:
RX: 1365
RX Mini: 0
RX Jumbo: 0
TX: 2048
Current hardware settings:
RX: 1365
RX Mini: 0
RX Jumbo: 0
TX: 2048
# ethtool -k enp1s0
Features for enp1s0:
rx-checksumming: on
tx-checksumming: on
tx-checksum-ipv4: on
tx-checksum-ip-generic: off [fixed]
tx-checksum-ipv6: off [fixed]
tx-checksum-fcoe-crc: off [fixed]
tx-checksum-sctp: off [fixed]
scatter-gather: on
tx-scatter-gather: on
tx-scatter-gather-fraglist: on
tcp-segmentation-offload: on
tx-tcp-segmentation: on
tx-tcp-ecn-segmentation: off [fixed]
tx-tcp-mangleid-segmentation: off
tx-tcp6-segmentation: off [fixed]
udp-fragmentation-offload: off
generic-segmentation-offload: on
generic-receive-offload: on
large-receive-offload: off [fixed]
rx-vlan-offload: on
tx-vlan-offload: on
ntuple-filters: off [fixed]
receive-hashing: on
highdma: on
rx-vlan-filter: on
vlan-challenged: off [fixed]
tx-lockless: off [fixed]
netns-local: off [fixed]
tx-gso-robust: off [fixed]
tx-fcoe-segmentation: off [fixed]
tx-gre-segmentation: off [fixed]
tx-gre-csum-segmentation: off [fixed]
tx-ipxip4-segmentation: off [fixed]
tx-ipxip6-segmentation: off [fixed]
tx-udp_tnl-segmentation: off [fixed]
tx-udp_tnl-csum-segmentation: off [fixed]
tx-gso-partial: off [fixed]
tx-sctp-segmentation: off [fixed]
tx-esp-segmentation: off [fixed]
tx-udp-segmentation: off [fixed]
fcoe-mtu: off [fixed]
tx-nocache-copy: off
loopback: off [fixed]
rx-fcs: off [fixed]
rx-all: off [fixed]
tx-vlan-stag-hw-insert: off [fixed]
rx-vlan-stag-hw-parse: off [fixed]
rx-vlan-stag-filter: off [fixed]
l2-fwd-offload: off [fixed]
hw-tc-offload: off [fixed]
esp-hw-offload: off [fixed]
esp-tx-csum-hw-offload: off [fixed]
rx-udp_tunnel-port-offload: off [fixed]
tls-hw-tx-offload: off [fixed]
tls-hw-rx-offload: off [fixed]
rx-gro-hw: off [fixed]
tls-hw-record: off [fixed]
Я плохо знаю сетевой стек и откровенно "плаваю" при настройке сети, поэтому прошу
помощи сообщества или хотя бы вектора, в котором необходимо копать. Особенно интересует
эта строка RX errors 0 dropped 1501472982 overruns 0 frame 0
Ответы
Ответ 1
В большинстве случаев в linux требуется подтюнить драйвер, настройки ядра и, возможно,
перераспределить прерывания по ядрам. Ниже представлены примеры рабочих параметров
с 10g машин под debian.
# cat /etc/modprobe.d/ixgbe.conf
options ixgbe MQ=1,1
options ixgbe RSS=8,8
options ixgbe InterruptThrottleRate=1,1
options ixgbe DCA=2,2
options ixgbe FCoE=0,0
options ixgbe LRO=0,0
# cat /etc/sysctl.conf
# Kernel sysctl configuration file for Red Hat Linux
#
# For binary values, 0 is disabled, 1 is enabled. See sysctl(8) and
# sysctl.conf(5) for more details.
# Controls IP packet forwarding
net.ipv4.ip_forward = 1
# Controls source route verification
net.ipv4.conf.default.rp_filter = 0
# Do not accept source routing
net.ipv4.conf.default.accept_source_route = 0
# Controls the System Request debugging functionality of the kernel
kernel.sysrq = 0
# Controls whether core dumps will append the PID to the core filename.
# Useful for debugging multi-threaded applications.
kernel.core_uses_pid = 1
# Controls the use of TCP syncookies
net.ipv4.tcp_syncookies = 1
# Controls the default maxmimum size of a mesage queue
kernel.msgmnb = 65536
# Controls the maximum size of a message, in bytes
kernel.msgmax = 65536
# Controls the maximum shared segment size, in bytes
kernel.shmmax = 68719476736
# Controls the maximum number of shared memory segments, in pages
kernel.shmall = 4294967296
# No swappiness
vm.swappiness = 0
net.core.rmem_default = 8388608
net.core.wmem_default = 8388608
net.core.rmem_max = 8388608
net.core.wmem_max = 8388608
net.netfilter.nf_conntrack_max = 30000000
net.netfilter.nf_conntrack_tcp_timeout_established = 1800
net.ipv4.conf.all.arp_announce = 1
net.ipv4.conf.lo.arp_announce = 1
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_fin_timeout = 20
net.core.netdev_max_backlog = 8192
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_timestamps = 1
net.core.somaxconn = 16384
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_max_orphans = 65536
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_tw_reuse = 1
net.ipv4.conf.all.rp_filter = 0
net.ipv4.tcp_orphan_retries = 0
net.ipv4.udp_mem = 51200 76800 102400
net.ipv4.tcp_mem = 51200 76800 102400
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.tcp_congestion_control = htcp
net.ipv4.tcp_keepalive_time = 1800
net.ipv4.tcp_synack_retries = 2
net.ipv6.conf.all.disable_ipv6 = 1
vm.zone_reclaim_mode = 1
vm.min_free_kbytes = 512000
net.ipv4.neigh.default.gc_thresh1 = 512
net.ipv4.neigh.default.gc_thresh2 = 1024
net.ipv4.neigh.default.gc_thresh3 = 2048
kernel.panic = 60
Прерывания можно перераспределить скриптом от intel: https://github.com/majek/ixgbe/blob/master/scripts/set_irq_affinity
Ответ 2
На данном этапе вопрос закрыт: я слишком доверял утилитам (wireshark, tshark, tcpdump)
в сочетании со строкой dropped 1501472982 от ifconfig. Что на самом деле такое эти
dropped (присутствующие также в выводе упомянутых программ), нужно разбираться в каждом
случае отдельно, но это не безвозвратно потерянные пакеты.
В моём случае достаточно было увеличения этих параметров ядра:
net.core.rmem_max
net.core.wmem_max
net.core.rmem_default
net.core.wmem_default
net.core.optmem_max
На имеющемся потоке данных самописный код (немного модифицированная версия вот этого
https://github.com/hundeboll/rawsend) ловит каждый пакет, попытка замерить максимальную
пропускную способность дала ~9.9Gb с ~0.4% потерянных пакетов (согласно внутреннему
счётчику). Потери возможно из-за того, что карточка на стороне клиента чуть круче,
чем на стороне сервера.
Здравствуйте. У меня есть пульт который подключается к специальному контроллеру через ethernet кабель. Пульт состоит из двух кнопок, а в кабеле имеется только 3 провода. Я хочу подключить компьютеру к контроллеру, что бы компьютер выполнял функции пульта. План был такой:
Сперва я хотел подключить пульт к компьютеру и узнать какого рода команды он подаёт контроллеру нажимая на кнопки. Далее написать не большой код на основе полученной информации, который давал бы команды на контроллер. Потом уже добавил бы те функции программе которые не мог выполнять пульт. Проблема в том, что у меня и так не большой опыт в программировании на c++, а о работе с портами я вообще не чего не знаю. Вопрос: Что потребуется для написания программы которая будет отображать сигнал поступающий на ethernet порт компьютера? Как отправлять сигнал на ethernet порт с помощью c++? Возможно ли вообще всё это? Ниже приведена "схема" подключений. 1011 символизирует информацию. (1. Нынешнее подключение. 2. Получение сигнала от пульта на компьютер. 3. Отправка сигнала с компьютера на контроллер) Также фотография пульта с обратной стороны. Заранее спасибо!
Ответ
Как уже выяснили в комментариях, это не Ethernet. И даже не com. По-моему, эта вещичка устроена так:
На средний провод подаётся постоянное напряжение, а кнопки замыкают соответствующие цепи, и тогда напряжение появляется на других линиях. Из интерфейсов, существующих в компьютере, здесь подойдёт только LPT-порт: центральный провод соединить с линией strobe и подать на него высокий уровень (логическую единицу). Другие линии соединить с любой из линий состояния и постоянно проверять на них логический уровень. Проблема в том, что на современных компьютерах такого порта давно уже нет. Поэтому я могу посоветовать брать свой контроллер (например, STM32F103), с его помощью проверять состояние кнопок. Это легко делается через порты GPIO. На компьютер можно передавать данные с помощью USB, который встроен в этот контроллер. Но USB - штука довольно сложная, поэтому вам легче будет воспользоваться преобразователем USB-UART, например, CP2102.