/*
* "LAPB via ethernet" driver release 001
*
* This code REQUIRES 2.1.15 or higher/ NET3.038
*
* This module:
* This module is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*
* This is a "pseudo" network driver to allow LAPB over Ethernet.
*
* This driver can use any ethernet destination address, and can be
* limited to accept frames from one dedicated ethernet card only.
Скажите, пожалуйста, как её использовать?
Делаю
insmod lapb
insmod lapbether
insmod x25
ifconfig lapb0 up
x25route add 33 lapb0
x25client 44 33 (<- программа создает x25 сокет и пытается установить соединение на X25 адрес 33. Маршрутизатор направляет пакет на устройство lapb0. Tcpdump показывает пакет 01 — запрос соединения)
с какими параметрами создавать socket
У меня получилость ТОЛЬКО принять этот байт программой (это просто sniffer. Ну уж если Tcpdump ловит...) (далее)
при попытке отправить — ошибка (понятно, что sniffer работает только по приему...)
# ./lapb3
len = 1
(01)
write error: 22(Invalid argument)
пробовал добавлять ip адрес и работать через AF_INET — вообще ничего не принимает
таким образом какой-то караул
Вопросы
socket(????? family, ???????? typ, ??????? protocol <- ну тут исходя из исходников lapcether.c вроде как ETH_P_DEC (?)
с bind-ом понятнее (пристыковываем к устройству)
Если кто встречался — помогите, пожалуйста.
С уважением, Павел
Если хочешь выиграть в лотерею, то купи, хотя-бы лотерейный билет. (В.Мэгре)
TX пакетов вон сколько пришло, а до RX процесс не дошел!!!
возвращаемся к вопросу как lapb# связывать с ethdev lapbether.c (строки 56...60)
struct lapbethdev {
...
struct net_device *ethdev; /* link to ethernet device */
...
};
С уважением, Павел.
Если хочешь выиграть в лотерею, то купи, хотя-бы лотерейный билет. (В.Мэгре)
Достиг результатов в понимании lapbether
Это такая штука, которая создает пару lapb и eth, причем однозначную, скажем в системе две карты eth0 и eth1. После
modprobe x25
modprobe lapb
modprobe lapbether
получается два устройства lapb, которые однозначно связываются с устройствами Ethernet
lapb0 <-> eth0
lapb1 <-> eth1
В общем случае, если в системе N eternet карт (кроме dummy, loop ...?) то будет N lapb однозначно связанных пар
lapbN <-> ethN
Провел эксперимент
две машины eth1 обоих связал в отдельном valn
ifconfig lapb1 up
на стороне клиента
route add -A x25 44 lapb1
x25client 33 44 <- программа устанавливает соединение с сервером по адресу 44 с использованием x25 socket
socket(PF_X25...
bind -> 33
connect -> 44
на стороне сервера
x25server 44
socket(PF_X25...
bind -> 44
listen
accept
в отдельном vlan, там где eth1, виден трафик (tcpdump) пакеты lapb, x25
устройства lapb общаются друг с другом
./x25server 44
X25: socket created
X25: get socket option qbit = 0
X25: set socket facility OK
X25: socket bind to 44
X25: start listen ...
X25: socket listening
X25: socket accept from 33
X25: from client: Hello server !!! (17)
X25: to client: Hi client !!! (14)
X25: client closed
X25: socket closed
./x25client 33 44
X25: socket created
X25: get socket option qbit = 0
X25: set socket facility OK
X25: socket bind to 33
X25: socket connecting to 44 ...
X25: socket connect to 44
X25: to server: 'Hello server !!!' (17)
X25: from server: Hi client !!! (14)
X25: socket closed
Вот настал момент поделиться результатом
Не сразу и не быстро получилось адаптировать код x25tap для ядра 3.10
Основываясь на результатах https://switch-case.ru/51655676, только автор шел от broadcat к unicast, а я наоборот, изменения в коде x25tap:
(основные моменты)
в функции static void x25tap_rx_skb(struct sk_buff *skb)
при вызове функции kfree_skb(принятого skb) зависает с перегрузкой.
При передаче skb в пространство x25 в принимающей функции (x25_dev.c)
(int x25_lapb_receive_frame(struct sk_buff *skb, struct net_device *dev,
struct packet_type *ptype, struct net_device *orig_dev)
при выполнении skb_copy копия выполняется, но адрес skb и data внутри skb не меняется!!!!!, а размер данных обнуляется, поэтому pskb_may_pull возвращаяе FALSE), возвращаясь к x25tap_rx_skb(struct sk_buff *skb)
создаю новый буфер skb и копирую в него данные из буфера net_link
Изменения в xotd — две функции
int writenls(struct xot_device* dev, unsigned char *packet, int len);
int readnls(struct xot_device* dev, unsigned char *packet, int len);
с изменением структуры struct xot_device* dev
...
struct iovec iov;
struct msghdr msg;
int nls; /* The x25tap device it talks to. */ вместо tap (для удобства)
...
не было * (разыменования) в 32 — битной версии размер указателя равен размеру заголовка, а 64 битной указатель становится размером 8, а заголовок остается 4