The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



"Модуль lapbether"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Сеть, сокеты)
Изначальное сообщение [ Отслеживать ]

"Модуль lapbether"  +/
Сообщение от Pavel515 (ok), 06-Мрт-19, 18:11 
Здравствуйте


Есть такая штука

/*
*    "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)

[ccode]
int main(int argc,char** argv)
{
    int fd,rc,nr,i;
    unsigned char packet[40];

    if((fd = socket(PF_PACKET,SOCK_RAW,htons(ETH_P_ALL))) == -1){
    printf("Socket error (%d)(%s)\n",errno,strerror(errno));
    return -1;
    }

    struct sockaddr_ll sll;
    struct ifreq ifr;

    memset( &sll, 0, sizeof( sll));
    memset( &ifr, 0, sizeof( ifr));

    strcpy( ifr.ifr_name, "lapb0");

    if(( ioctl( fd, SIOCGIFINDEX, &ifr))==-1)
    {
    printf( "error\n");
        return(-1);
    }
    sll.sll_family = AF_PACKET;
    sll.sll_ifindex = ifr.ifr_ifindex;
    sll.sll_protocol = htons(ETH_P_ALL);
      
    rc =  bind( fd, (struct sockaddr*)&sll, sizeof( sll));


    if(rc == -1){
    printf("Bind socket error (%d)(%s)\n",errno,strerror(errno));
    return -1;
    }

        
    nr = read(fd,packet,40);
    if(nr < 0){
        printf("Read socket error (%d)(%s)\n",errno,strerror(errno));
    return -1;
    }
    printf("len = %d\n",nr);
    for(i=0;i<nr;i++)printf("(X)",packet[i]);
    printf("\n");

    nr = write(fd,packet,1);
    if(nr != 1){
    printf("write error: %d(%s)\n",errno,strerror(errno));
    }

    close(fd);

    return 0;
}

[/ccode]

пробовал добавлять ip адрес и работать через AF_INET - вообще ничего не принимает
таким образом какой-то караул
Вопросы

socket(????? family, ???????? typ, ??????? protocol <- ну тут исходя из исходников lapcether.c вроде как ETH_P_DEC (?)
с bind-ом понятнее (пристыковываем к устройству)

Если кто встречался - помогите, пожалуйста.

С уважением, Павел

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения [Сортировка по времени | RSS]


1. "Модуль lapbether"  +/
Сообщение от wizard22 (ok), 07-Мрт-19, 18:39 
Вам это все зачем?
Сети X.25/FrameRelay/ISDN и другие практически умерли.
IP+Ethernet их похоронили более 15-20 лет назад.
Но если очень интересно, начните хотя бы с википедии.
Там есть ссылки на стандарты, например.
https://en.wikipedia.org/wiki/LAPB
Можно взять учебники/книги по телекоммуникациям (переводные,импортные,некоторые отечественные)
1980-х и 1990-х годов там эти технологии описаны достаточно хорошо.
В современном мире скромные остатки этих технологий можно найти в старом банковском ПО, старом телекоммуникационном оборудовании и еще кое-где.
Просто уж как бездуховно(бездумно) действуете.


Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Модуль lapbether"  +/
Сообщение от Pavel515 (ok), 11-Мрт-19, 10:01 
> Вам это все зачем?
> Сети X.25/FrameRelay/ISDN и другие практически умерли.
> IP+Ethernet их похоронили более 15-20 лет назад.
> Но если очень интересно, начните хотя бы с википедии.

Здравствуйте
Поверьте, задача есть
Немного истории:
Существовала себе ничего фирма Siemens и производила замечательное коммутационное оборудование: станции типа EWSD. Они управлялись в том числе посредством протокола X.25 В 2008 году не выдержав конкуренции на рынке производителей коммутационного оборудования Siemens, как производитель станций коммутации, как канальной так и пакетной приказал долго жить. Сначала там Nokia-Siemens, а потом и всё... Но станции на сети остались и их довольно много как классической телефонии EWSD, сотовых коммутаторов D900, пакетной коммутации hiE9200. В "нулевых", чтобы поспеть за технологиями Siemens все-таки выпустил несколько модулей(плат) и интерфейсом IP(Ethernet) IOP:UNI2, IOP:OAM, появилось (именно появилось. в ядрях меньше чем 2.6.32 - его нет, хотя в исходниках фигурирует 2000 год) устройство SSNC. У нас были приобретены модули IOP:OAM, которые выполняют ряд конвертаций протоколов. Устройство управления NetManaget(NetM)---(RFC1006)--->IOP:OAM-(X.25)->EWSD. Работали себе эти модули ничего 12 лет и стали ломаться. Что-бы не утомлять альтернатива:

NetM-----(RFC1006)--->(UnixPC  X.25 XOTD)-------->cisco(XOTD)-----x.25---->EWSD
часть (UnixPC  X.25 XOTD) на ядре 2.6.18 с использованием x25.ko x25tap.ko и xotd работает великолепно
Но x25tap не поддерживается в ядрах более чем 2.6.18, но появилось устройство lapb очень напоминающее x25tap.


Я, конечно, не супер программист, который работает в vi, но качество кода модуля x25 постоянно растет, сравните сами, значит это кому-то нужно? в наш век, когда все делается за деньги.

А вопрос у меня простой. Если отбросить вопросы по необходимости, он становится академическим:
как "открыть" устройство lapb в своей программе?

в исходниках lapbether.c функция передающая информацию из облака x25 называется lapbeth_data_transmit
она работает и виден рост количества байтов и пакетов в команде ifconfig lapb0, и в программе, "открывающей" lapb как PF_PACKET,SOCK_RAW<ETH_P_ALL подключив напрямик к lapb0

strcpy( ifr.ifr_name, "lapb0");
if(( ioctl( fd, SIOCGIFINDEX, &ifr))==-1)

    sll.sll_family = AF_PACKET;
    sll.sll_ifindex = ifr.ifr_ifindex;
    sll.sll_protocol = htons(ETH_P_ALL);
//    sll.sll_pkttype = PACKET_OUTGOING;
//    sll.sll_hatype = ARPHRD_X25;

    rc =  bind( fd, (struct sockaddr*)&sll, sizeof( sll));
    if(rc == -1){
        printf("Bind socket error (%d)(%s)\n",errno,strerror(errno));
    return -1;
    }

    struct sockaddr_ll sll_in;
    socklen_t in_len;
    in_len = sizeof(sll_in);

    nr = recvfrom(fd,packet,40,0,(struct sockaddr*)&sll_in,&in_len);
видно в sll_in то же, что и в tcpdump -i lapb0 ...

in_len = 12
family   = 17
ifindex  = 6
protocol = 0x0805  ->ETH_P_X25 linux/if_ether.h
pkttype  = 4       ->PACKET_OUTGOING  linux/if_packet.h пакет идет из облака X25 кода-то наружу
hatype   = 271     ->ARPHDR_X25     linux/if_arp.h
halen    = 0
(00)(00)(00)(00)(00)(00)(00)(00)
len = 1
(01)   -> X25_IFACE_CONNECT linux/if_x25.h   запрос на установку соединения между 3 и 2 уровнем X25


TCPDUMP
00 04 01 0f 00 00 00 00 00 00 00 00 00 00 08 05 01
pkttype
      271(ARPHRD_X25)
            00 00 halen
                                          08 05(ETH_P_X25)
                                                 01 X25_IFACE_CONNECT


Передача в сторону облака X25 по всей вероятности должна вестись посредством функции
lapbeth_rcv, ссылка на которую указана в структуре,

static struct packet_type lapbeth_packet_type __read_mostly = {
    .type = cpu_to_be16(ETH_P_DEC),
    .func = lapbeth_rcv,
};

где также указан тип заголовка(протокола)  или чего ??? ETH_P_DEC
т.е. как я понимаю тут говорится ядру, что если в очереди пакетов для устройства lapb появится пакет с типом (заголовком) ETH_P_DEC, то надо выполнить процедуру lapbeth_rcv
и, к сожалению,(или просто не хватает информации как мне поступать), эта функция ядром не вызывается...

Помогите, пожалуйста, информацией по ядру unix (не надо отсылать к википедии, поверьте ITUT X25 - моя настольная книга, а вот по очередям пакетов в ядре как-то не очень)

Спасибо Вам огромное за ответ. Может мой вопрос настолько простой, что все на поверхности?
С уважением, Павел

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "Модуль lapbether"  +/
Сообщение от Аноним (3), 11-Мрт-19, 15:33 
Попробовать написать Стивену Хеммингеру shemminger@vyatta.com ?

Может подскажет и поможет. Попытка не пытка.

Почитать https://habr.com/ru/company/mailru/blog/314168/

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

4. "Модуль lapbether"  +/
Сообщение от wizard22 (ok), 12-Мрт-19, 15:36 
В 90-е годы Linux не был промышленной ОС. Поэтому использовали в сетях X.25 Cisco,Motorola,SCO/Unixware/iRMX,Eicon,Sangoma и т.д. X.25 стек в Linux никогда не имел промышленного статуса. Об этом ясно сказано в исходных текстах и документации. Т.е. промышленного качества там нет. Возможно, отдельные компании типа Sangoma могли бы поддержать разработку X.25 стека, ибо платы выпускают до сих пор.
LAPB - это канальный уровень X.25 (это часть X.25 стека).
Вы не даете подробных диаграмм взаимодействия оборудования и ПО (с указанием версий), которое использовали или используете.
Поэтому прокомментирую кратко и ясно.
Можно запустить ВМ с старой версий Linux, в которой работает x25tap. Далее очевидно.
Для современных версий Linux можно посмотреть xotd (там были разные версии) или что-то аналогичное и разобраться можно ли x25tap заменить стандарным tap устройством. Если там нет поддержки x.25, то смело клонировать его и сделать собственный x25tap. Ибо оригинальный x25tap сделан из ethertap. И остается посмотреть что сегодня с маршрутизацией X.25 кадров на устройство x25tap или tap устройства. Ибо x25tap - это интерфейс для энкапсуляции кадров X.25 в Ethernet кадры.
К программированию нужно переходить только тогда, когда стандартными средствами задачу решить нельзя принципиально.


Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

5. "Модуль lapbether"  +/
Сообщение от Pavel515 (ok), 12-Мрт-19, 18:36 
Спасибо за внимание к данной теме.
Как я уже писал ранее на ядре 2.6.18 все работает
написал программку, что-то вроде xotd: с одной стороны слушающий socket, который обрабатывает RFC1006 на порту в моем случае 5084, приняв вызов, создает соединение через X25socket. В ядре x25 адрес направлен на x25tap0, а в xotd x25tap0 связывается с удаленным адресом cisco с xotd
modprobe x25
modprobe x25tap
ifconfig x25tap0 up
route add -A x25 (x25 адрес) x25tap0
xotd -v x25tap0 192.168.100.11 <- cisco
rfc1006 -l 5084 (x25 адрес) <- собственный x25 адрес зашит внутри программки
Это все заработало, но хочется улучшить перейти на ядро 3.10

Достиг результатов в понимании 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 общаются друг с другом

но на сервере accept не происходит: lapb1 сервера надо как-то связать со слушающим x25 socket ????

вот он socket, но dev ???  
cat /proc/net/x25/socket
dest_addr  src_addr   dev   lci st vs vr va   t  t2 t21 t22 t23 Snd-Q Rcv-Q inode
*          44         ???   000  0  0  0  0   0   3 200 180 180     0     0 31582

просто уже задело

Спасибо еще раз за внимание, просто когда сам в себе варишься... А тут написал пост, оно и немного прояснилось, по крайней мере направление.

А как в ядре 3.10 выглядит этот ethertap ? я нашел упоминание о tun/tap устройствах в исходнике ядра drivers/net/tun.c Если это оно буду разбираться, если нет посоветуйте куда смотреть.

С уважением, Павел


Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

6. "Модуль lapbether"  +1 +/
Сообщение от Pavel515 (ok), 13-Мрт-19, 14:26 
Довел до конца lapbether

./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

http://files.rsdn.org/45405/x25client.c
http://files.rsdn.org/45405/x25server.c

теперь бы ethertap для ядра 3.10 найти :)

С уважением,  Павел

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

7. "Модуль lapbether"  +/
Сообщение от wizard22 (ok), 14-Мрт-19, 14:03 
ethertap был удален из состава ядра 2.5 (согласно документации)
Всем разработчикам было рекомендовано перейти на использование tun/tap.
В данном случае tap является заменой ethertap.

Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

8. "Модуль lapbether"  +/
Сообщение от Pavel515 (ok), 18-Мрт-19, 11:31 
> ethertap был удален из состава ядра 2.5 (согласно документации)
> Всем разработчикам было рекомендовано перейти на использование tun/tap.
> В данном случае tap является заменой ethertap.

Спасибо.
Изучаю...

С уважением, Павел

Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

9. "Модуль lapbether"  +/
Сообщение от Pavel515 (ok), 08-Апр-19, 09:25 
Здравствуйте

Вот настал момент поделиться результатом
Не сразу и не быстро получилось адаптировать код 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

    if((__skb = dev_alloc_skb(skb->len)) == NULL)
    {
        printk(KERN_INFO "%s : dev_alloc_skb(%d) == NULL\n", dev->name,skb->len);
        return;
    }

    if (skb->data[0] == 0) {
        x25tap->stats.rx_packets++;
        x25tap->stats.rx_bytes += len;
    }

    dptr = skb_put(__skb,skb->len);
    memcpy(dptr,skb->data,skb->len);


Изменения в 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 (для удобства)
...
добавлением заголовка
struct nl_header {
    struct nlmsghdr nlh;
    u_int16_t length;
};
и изменением буферов в функциях void *outbound(void *arg)
...
    unsigned char nls_packet[sizeof(struct nl_header) + MAX_PKT_LEN + 4];
    unsigned char *full_packet = nls_packet + (sizeof(struct nl_header) - sizeof(struct xot_header)) + 1;
//    unsigned char full_packet[sizeof(struct xot_header) + MAX_PKT_LEN];
    struct xot_header *header = (struct xot_header *)full_packet;
    unsigned char *packet = full_packet + sizeof(*header);
    unsigned char *tap_packet = packet - 1;

и void *inbound(void *arg)
...
    unsigned char nls_packet[sizeof(struct nl_header) + MAX_PKT_LEN + 1 + 4];
    unsigned char *tap_packet = nls_packet + sizeof(struct nl_header);
//    unsigned char tap_packet[MAX_PKT_LEN + 1];
    unsigned char *packet = tap_packet + 1;


паралельно при переходе к 64 битной версии в функции void *outbound(void *arg)
...
unsigned char *packet = full_packet + sizeof(*header);
...
nread += sizeof(*header);

не было * (разыменования) в 32 - битной версии размер указателя равен размеру заголовка, а 64 битной указатель становится размером 8, а заголовок остается 4

Ну вот, кажется и всё!
http://files.rsdn.org/45405/x25tap.c
http://files.rsdn.org/45405/xotd.c

С уважением, Павел

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

10. "Модуль lapbether"  +/
Сообщение от pavel_simple (ok), 09-Апр-19, 12:27 
>[оверквотинг удален]
> unsigned char *packet = full_packet + sizeof(*header);
> ...
> nread += sizeof(*header);
> не было * (разыменования) в 32 - битной версии размер указателя равен
> размеру заголовка, а 64 битной указатель становится размером 8, а заголовок
> остается 4
> Ну вот, кажется и всё!
> http://files.rsdn.org/45405/x25tap.c
> http://files.rsdn.org/45405/xotd.c
> С уважением, Павел

по хорошему, чтобы дело не пропадало и было полезно кому-то ещё всё это нужно опубликовать на bitbucket/github/тысячи_их

Ответить | Правка | ^ к родителю #9 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру