forum.bitel.ru http://forum.bitel.ru/ |
|
Разные форматы agentRemoteId http://forum.bitel.ru/viewtopic.php?f=44&t=12861 |
Страница 1 из 1 |
Автор: | Alex-XXI [ 13 апр 2018, 14:07 ] |
Заголовок сообщения: | Разные форматы agentRemoteId |
Ситуация аналогична описанной в этом сообщении - https://forum.bitel.ru/viewtopic.php?f= ... 918#p63234 Схема ISG с авторизацией по порту коммутатора. С разного оборудования agentRemoteId приходит в разном формате: Код: Agent information{82}= sub{1}={00040BBF0108} sub{2}={00060012CFC5DC60} Код: Agent information{82}= sub{1}={21090BB800000000000085} sub{2}={000000000CA8F94B892CA002002202A6D0} Код: Agent information{82}= sub{1}={03E7000A18} sub{2}={847973D96492} В первом случае работает без каких-либо доп.настроек, во втором решается предобработкой в preprocessDhcpRequest. А в третьем до предобработчика не доходит и вылетает ошибка: Код: dhcp 04-12/14:32:17 ERROR [dhcpLstnr-p-11-t-6] AbstractInetDeviceRuntime - Error while parsing agentRemoteId from DHCP-request. Check dhcp.option82.agentRemoteId... and dhcp.option82.removeHeader parameters. dhcp 04-12/14:32:17 ERROR [dhcpLstnr-p-11-t-6] DhcpListenerWorker - java.lang.ArrayIndexOutOfBoundsException at ru.bitel.bgbilling.modules.inet.runtime.device.AbstractInetDeviceRuntime.getOption82AgentRemoteId(AbstractInetDeviceRuntime.java:100) at ru.bitel.bgbilling.modules.inet.runtime.device.InetDeviceRuntime.getOption82AgentRemoteId(InetDeviceRuntime.java:47) at ru.bitel.bgbilling.modules.inet.dhcp.InetAbstractDhcpProcessor.processOption82Request(InetAbstractDhcpProcessor.java:453) at ru.bitel.bgbilling.modules.inet.dhcp.InetAbstractDhcpProcessor.processRequest(InetAbstractDhcpProcessor.java:253) at ru.bitel.bgbilling.kernel.network.dhcp.DhcpListenerWorker.runImpl(DhcpListenerWorker.java:90) at ru.bitel.common.worker.WorkerTask.run(WorkerTask.java:86) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) at ru.bitel.common.worker.WorkerThread.run(WorkerThread.java:46) Подскажите в чем проблема и как ее решить? |
Автор: | Amir [ 13 апр 2018, 17:32 ] |
Заголовок сообщения: | Re: Разные форматы agentRemoteId |
https://docs.bitel.ru/pages/viewpage.ac ... d=43385877 dhcp.deviceSearchMode=0 0 - В этом режиме сначала находится устройство по giaddr, у него вызывается preprocess, затем находится агентское ус-во, у него тоже вызывается preprocess 1 (по умолчанию) - В этом режиме сначала находится устройство по giaddr, затем находится агентское ус-во, у него тоже вызывается preprocess. 2 - В этом режиме находится ус-во по giaddr, у него вызывается preprocess. |
Автор: | Alex-XXI [ 13 апр 2018, 18:14 ] |
Заголовок сообщения: | Re: Разные форматы agentRemoteId |
А здесь вы почему-то рекомендуете ставить 2. Перепробовали все значения dhcp.deviceSearchMode, логика работы не меняется. |
Автор: | Amir [ 13 апр 2018, 18:41 ] |
Заголовок сообщения: | Re: Разные форматы agentRemoteId |
Это было давно, тогда возможно еще не было режима 0. Параметр указываете в корневом устройстве? |
Автор: | Alex-XXI [ 13 апр 2018, 18:58 ] |
Заголовок сообщения: | Re: Разные форматы agentRemoteId |
Опция dhcp.deviceSearchMode прописана на циске, на которой поднят ISG. Все коммутаторы для нее являются дочерними. Для циски корневым устройством является ProcessGroup |
Автор: | Amir [ 13 апр 2018, 19:10 ] |
Заголовок сообщения: | Re: Разные форматы agentRemoteId |
У циски в типе устройства точно есть ProtocolHandler? |
Автор: | Alex-XXI [ 13 апр 2018, 19:15 ] |
Заголовок сообщения: | Re: Разные форматы agentRemoteId |
Amir писал(а): У циски в типе устройства точно есть ProtocolHandler? Без него бы вообще не работало. Проверю его актуальность. |
Автор: | Amir [ 13 апр 2018, 19:22 ] |
Заголовок сообщения: | Re: Разные форматы agentRemoteId |
Вам надо расширить ISGProtocolHandler и извлечение agentRemoteId сделать в нем. Предобработка циски с режимом dhcp.deviceSearchMode=0 должна вызываться до Цитата: dhcp 04-12/14:32:17 ERROR [dhcpLstnr-p-11-t-6] AbstractInetDeviceRuntime - Error while parsing agentRemoteId from DHCP-request. Check dhcp.option82.agentRemoteId... and dhcp.option82.removeHeader parameters.
dhcp 04-12/14:32:17 ERROR [dhcpLstnr-p-11-t-6] DhcpListenerWorker - java.lang.ArrayIndexOutOfBoundsException at ru.bitel.bgbilling.modules.inet.runtime.device.AbstractInetDeviceRuntime.getOption82AgentRemoteId(AbstractInetDeviceRuntime.java:100) |
Автор: | Alex-XXI [ 13 апр 2018, 19:36 ] |
Заголовок сообщения: | Re: Разные форматы agentRemoteId |
У нас ISGProtocolHandler расширен для обработки 82 опции. Предобработчик preprocessDhcpRequest просто по какой-то причине не вызывается для некоторых вариантов 82 опции, об этом писал в первом посту. |
Автор: | Amir [ 13 апр 2018, 19:50 ] |
Заголовок сообщения: | Re: Разные форматы agentRemoteId |
Прямо перед этой ошибкой Код: java.lang.ArrayIndexOutOfBoundsException есть код at ru.bitel.bgbilling.modules.inet.runtime.device.AbstractInetDeviceRuntime.getOption82AgentRemoteId(AbstractInetDeviceRuntime.java:100) at ru.bitel.bgbilling.modules.inet.runtime.device.InetDeviceRuntime.getOption82AgentRemoteId(InetDeviceRuntime.java:47) at ru.bitel.bgbilling.modules.inet.dhcp.InetAbstractDhcpProcessor.processOption82Request(InetAbstractDhcpProcessor.java:453) Код: if( device.deviceSearchMode == InetDhcpDevice.DEVICE_SEARCH_MODE_REMOTE_ID_SUB_PREPROCESS Т.е. если установлен режим dhcp.deviceSearchMode=0, то перед ошибкой должен вызваться preprocessDhcpRequest у устройства, найденного по giaddr/IP.&& device.deviceRuntime.protocolHandler != null ) { try { device.deviceRuntime.protocolHandler.preprocessDhcpRequest( request, null ); if( logger.isInfoEnabled() ) { logger.info( "REQUEST_AFTER_PREPROCESS:\n" + request ); } } catch( Exception e ) { logger.error( e.getMessage(), e ); } } Перед тем как перейти к попытке распарсить agentRemoteId по параметрам конфига происходит: Код: final Object result = request.getOption( InetAbstractDhcpProcessor.AGENT_REMOTE_ID ); Т.е. если AGENT_REMOTE_ID проставлен в пакете, то парсить его из опций пакета уже не будет.if( result != null ) { return result; } Итого: Перед ошибкой должна быть запись в логах REQUEST_AFTER_PREPROCESS о вызове предобработки для циски. В предобработке нужно проставить request.setOption( InetDhcpProcessor.AGENT_REMOTE_ID ) (может быть это не для всех случаев происходит?). В записи REQUEST_AFTER_PREPROCESS в конце пакета должно быть "Common options: agentRemoteId=xxx". |
Автор: | Alex-XXI [ 13 апр 2018, 20:01 ] |
Заголовок сообщения: | Re: Разные форматы agentRemoteId |
Вот лог, когда предобработчик preprocessDhcpRequest не вызывается(здесь agentRemoteId видимо вычисляется по какому-то встроенному алгоритму): Код: dhcp 04-13/16:29:35 INFO [dhcpLstnr-p-11-t-6] InetAbstractDhcpProcessor - REQUEST: Message type: BOOT_REQUEST Dhcp message type: DHCP Request{3} htype: 1, hlen: 6, hops: 1 xid: -723452386, secs: 0, flags: 0 Client IP: 10.24.104.162 Your IP: 0.0.0.0 Server IP: 0.0.0.0 Relay IP: 192.168.52.1 Client MAC: {28285D67708D} Client-ident.{61}={0128285D67708D} Vendor class ident.{60}={6E6468637063} Host name{12}={Keenetic_Start} Max Msg Size{57}=0 Param request list{55}={1, 3, 6, 15, 28, 33, 42, 43, 121, -7} Agent information{82}= sub{1}={000404220003} sub{2}={0006BCF685F91BC0} dhcp 04-13/16:29:35 DEBUG [dhcpLstnr-p-11-t-6] InetAbstractDhcpProcessor - OP_BOOT_REQUEST dhcp 04-13/16:29:35 DEBUG [dhcpLstnr-p-11-t-6] InetAbstractDhcpProcessor - Found device by giaddr id=200 dhcp 04-13/16:29:35 DEBUG [dhcpLstnr-p-11-t-6] InetAbstractDhcpProcessor - Found subDevice by identifier id=133 dhcp 04-13/16:29:35 DEBUG [dhcpLstnr-p-11-t-6] InetDhcpHelperProcessor - request.giaddr = 192.168.52.1 dhcp 04-13/16:29:35 DEBUG [dhcpLstnr-p-11-t-6] InetAbstractDhcpProcessor - DHCP_REQUEST dhcp 04-13/16:29:35 INFO [dhcpLstnr-p-11-t-6] InetAbstractDhcpProcessor - RESPONSE: Message type: BOOT_RESPONSE Dhcp message type: DHCP ACK{5} htype: 1, hlen: 6, hops: 1 xid: -723452386, secs: 0, flags: 0 Client IP: 10.24.104.162 Your IP: 10.24.104.162 Server IP: 0.0.0.0 Relay IP: 192.168.52.1 Client MAC: {28285D67708D} Agent information{82}= sub{1}={000404220003} sub{2}={0006BCF685F91BC0} IP Address Lease Time{51}=600 Server Identifier{54}={00000000} DNS{6}={08080808B2D48006} Subnet mask{1}=255.255.240.0 Router{3}=10.24.96.1 Вот лог, когда предобработчик вызывается, но видно, что сначала тоже есть попытка вычисления по какому-то встроенному алгоритму: Код: dhcp 04-13/16:29:36 INFO [dhcpLstnr-p-11-t-7] InetAbstractDhcpProcessor - REQUEST: Message type: BOOT_REQUEST Dhcp message type: DHCP Request{3} htype: 1, hlen: 6, hops: 1 xid: -1728768363, secs: 0, flags: 0 Client IP: 10.24.100.25 Your IP: 0.0.0.0 Server IP: 0.0.0.0 Relay IP: 192.168.52.1 Client MAC: {BCEE7B20EF56} Client-ident.{61}={01BCEE7B20EF56} Host name{12}={home} Client FQDN{81}={000000686F6D65} Vendor class ident.{60}={4D53465420352E30} Param request list{55}={1, 15, 3, 6, 44, 46, 47, 31, 33, 121, -7, -4, 43} Agent information{82}= sub{1}={2109047B000001000000B4} sub{2}={000000000CA8F94B892CA002005E006568} dhcp 04-13/16:29:36 DEBUG [dhcpLstnr-p-11-t-7] InetAbstractDhcpProcessor - OP_BOOT_REQUEST dhcp 04-13/16:29:36 DEBUG [dhcpLstnr-p-11-t-7] InetAbstractDhcpProcessor - Found device by giaddr id=200 dhcp 04-13/16:29:36 INFO [dhcpLstnr-p-11-t-7] InetAbstractDhcpProcessor - Agent device not found by agentRemoteId=00000ca8f94b dhcp 04-13/16:29:36 INFO [dhcpLstnr-p-11-t-7] ISGProtocolHandler - preprocessDhcpRequest dhcp 04-13/16:29:36 INFO [dhcpLstnr-p-11-t-7] InetAbstractDhcpProcessor - REQUEST_AFTER_PREPROCESS: Message type: BOOT_REQUEST Dhcp message type: DHCP Request{3} htype: 1, hlen: 6, hops: 1 xid: -1728768363, secs: 0, flags: 0 Client IP: 10.24.100.25 Your IP: 0.0.0.0 Server IP: 0.0.0.0 Relay IP: 192.168.52.1 Client MAC: {BCEE7B20EF56} Client-ident.{61}={01BCEE7B20EF56} Host name{12}={home} Client FQDN{81}={000000686F6D65} Vendor class ident.{60}={4D53465420352E30} Param request list{55}={1, 15, 3, 6, 44, 46, 47, 31, 33, 121, -7, -4, 43} Agent information{82}= sub{1}={2109047B000001000000B4} sub{2}={000CA8F94B892CA0} А здесь видимо встроенный алгоритм дает сбой, т.к. опция слишком короткая, при этом предобработчик не вызывается, а просто вываливается с ошибка: Код: dhcp 04-13/16:29:36 INFO [dhcpLstnr-p-11-t-1] InetAbstractDhcpProcessor - REQUEST: Message type: BOOT_REQUEST Dhcp message type: DHCP Discover{1} htype: 1, hlen: 6, hops: 1 xid: -1024031714, secs: 0, flags: 0 Client IP: 0.0.0.0 Your IP: 0.0.0.0 Server IP: 0.0.0.0 Relay IP: 192.168.52.1 Client MAC: {A8F94B02F0FF} Client-ident.{61}={01A8F94B02F0FF} Vendor class ident.{60}={456C746578526F75746572} Param request list{55}={33, 121, 1, 3, 6, 12, 15, 28, 40, 41, 42, 43, 66, 67} Agent information{82}= sub{1}={03E7000A18} sub{2}={847973D96492} sub{9}={00000CF8080106537769746368} dhcp 04-13/16:29:36 DEBUG [dhcpLstnr-p-11-t-1] InetAbstractDhcpProcessor - OP_BOOT_REQUEST dhcp 04-13/16:29:36 DEBUG [dhcpLstnr-p-11-t-1] InetAbstractDhcpProcessor - Found device by giaddr id=200 dhcp 04-13/16:29:36 ERROR [dhcpLstnr-p-11-t-1] AbstractInetDeviceRuntime - Error while parsing agentRemoteId from DHCP-request. Check dhcp.option82.agentRemoteId... and dhcp.option82.removeHeader parameters. dhcp 04-13/16:29:36 ERROR [dhcpLstnr-p-11-t-1] DhcpListenerWorker - java.lang.ArrayIndexOutOfBoundsException at ru.bitel.bgbilling.modules.inet.runtime.device.AbstractInetDeviceRuntime.getOption82AgentRemoteId(AbstractInetDeviceRuntime.java:100) at ru.bitel.bgbilling.modules.inet.runtime.device.InetDeviceRuntime.getOption82AgentRemoteId(InetDeviceRuntime.java:47) at ru.bitel.bgbilling.modules.inet.dhcp.InetAbstractDhcpProcessor.processOption82Request(InetAbstractDhcpProcessor.java:453) at ru.bitel.bgbilling.modules.inet.dhcp.InetAbstractDhcpProcessor.processRequest(InetAbstractDhcpProcessor.java:253) at ru.bitel.bgbilling.kernel.network.dhcp.DhcpListenerWorker.runImpl(DhcpListenerWorker.java:90) at ru.bitel.common.worker.WorkerTask.run(WorkerTask.java:86) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) at ru.bitel.common.worker.WorkerThread.run(WorkerThread.java:46) |
Автор: | Amir [ 13 апр 2018, 21:45 ] |
Заголовок сообщения: | Re: Разные форматы agentRemoteId |
Я не вижу, чтобы у вас отрабатывала предобработка перед попыткой получить agentRemoteId. C параметром dhcp.deviceSearchMode=0 предобработка должна быть сразу после Found device by giaddr id=200 Может быть этот параметр у вас два раза указан в конфиге? |
Автор: | Alex-XXI [ 14 апр 2018, 01:08 ] |
Заголовок сообщения: | Re: Разные форматы agentRemoteId |
У нас обработчик не вынесен отдельным классом, изменения внесены непосредственно в preprocessDhcpRequest в ISGProtocolHandler. Знаю что это неправильно, но уже много лет работает так. В логах видно выполнение команды logger.info("preprocessDhcpRequest") в обработчике preprocessDhcpRequest: Код: dhcp 04-13/16:29:36 INFO [dhcpLstnr-p-11-t-7] ISGProtocolHandler - preprocessDhcpRequest Также видно изменение 82 опции в DHCP-пакете после его обработки: Код: было Agent information{82}= sub{1}={2109047B000001000000B4} sub{2}={000000000CA8F94B892CA002005E006568} стало Agent information{82}= sub{1}={2109047B000001000000B4} sub{2}={000CA8F94B892CA0} На опции длиной 8 байт sub{2}={0006BCF685F91BC0} обработчик preprocessDhcpRequest не вызывается, т.к. agentRemoteId вычисляется по какому-то дефолтовому алгоритму. А на короткой опции длиной всего 6 байт sub{2}={847973D96492} по всей видимости этот дефолтовый алгоритм выдает ошибку и вызов обработчика preprocessDhcpRequest уже не происходит. |
Автор: | Alex-XXI [ 14 апр 2018, 01:15 ] |
Заголовок сообщения: | Re: Разные форматы agentRemoteId |
Amir писал(а): Я не вижу, чтобы у вас отрабатывала предобработка перед попыткой получить agentRemoteId. C параметром dhcp.deviceSearchMode=0 предобработка должна быть сразу после Found device by giaddr id=200 Может быть этот параметр у вас два раза указан в конфиге? Только сейчас заметил, что после того как перепробовали все значения этого параметра его вообще закомментировали. Какое значение этой опции по умолчанию? |
Автор: | Amir [ 14 апр 2018, 02:19 ] |
Заголовок сообщения: | Re: Разные форматы agentRemoteId |
По умолчанию исторически - 1. Вам нужно 0. |
Автор: | Alex-XXI [ 16 апр 2018, 14:25 ] |
Заголовок сообщения: | Re: Разные форматы agentRemoteId |
С dhcp.deviceSearchMode=0 все заработало как надо, спасибо. |
Страница 1 из 1 | Часовой пояс: UTC + 5 часов [ Летнее время ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |