forum.bitel.ru
http://forum.bitel.ru/

BGInetAccess дает exception
http://forum.bitel.ru/viewtopic.php?f=44&t=9231
Страница 1 из 1

Автор:  survivor [ 13 май 2014, 21:23 ]
Заголовок сообщения:  BGInetAccess дает exception

Доброго дня,
В полностью рабочую схему добавил новый тип устройства уровня доступа (GePON OLT), в принципе для биллинга должно быть все равно - так как устройство так же вставляет в opt82 номер порта (в этом случае разве что виртуального), но в результате получаю ошибку:

Код:
05-13/20:03:24  INFO [dhcpLstnr-p-9-t-7] InetAbstractDhcpProcessor - REQUEST:
Message type: BOOT_REQUEST
Dhcp message type: DHCP Discover{1}
htype: 1, hlen: 6, hops: 1
xid: 125318934, secs: 0, flags: 0
Client IP: 0.0.0.0
Your IP: 0.0.0.0
Server IP: 0.0.0.0
Relay IP: 109.XXX.49.254
Client MAC: {001560BBCB17}
  Host name{12}={hp-notebook}
  Parameter request list{55}={1, 28, 2, 3, 15, 6, 12, 44, 47}
  Agent information{82}=
    sub{1}={0515000701}
    sub{2}={FCFAF7C5AB36}

05-13/20:03:24 DEBUG [dhcpLstnr-p-9-t-7] InetAbstractDhcpProcessor - OP_BOOT_REQUEST
05-13/20:03:24 DEBUG [dhcpLstnr-p-9-t-7] InetAbstractDhcpProcessor - Found device by giaddr id=13

05-13/20:03:24 ERROR [dhcpLstnr-p-9-t-7] DhcpListenerWorker -
java.lang.ArrayIndexOutOfBoundsException
        at java.lang.System.arraycopy(Native Method)
        at ru.bitel.bgbilling.modules.inet.runtime.device.AbstractInetDeviceRuntime.getOption82AgentRemoteId(AbstractInetDeviceRuntime.java:97)
        at ru.bitel.bgbilling.modules.inet.runtime.device.InetDeviceRuntime.getOption82AgentRemoteId(InetDeviceRuntime.java:1)
        at ru.bitel.bgbilling.modules.inet.dhcp.InetAbstractDhcpProcessor.processOption82Request(InetAbstractDhcpProcessor.java:395)
        at ru.bitel.bgbilling.modules.inet.dhcp.InetAbstractDhcpProcessor.processRequest(InetAbstractDhcpProcessor.java:261)
        at ru.bitel.bgbilling.kernel.network.dhcp.DhcpListenerWorker.runImpl(DhcpListenerWorker.java:55)
        at ru.bitel.common.worker.WorkerTask.run(WorkerTask.java:86)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
        at java.lang.Thread.run(Thread.java:662)
        at ru.bitel.common.worker.WorkerThread.run(WorkerThread.java:40)


dhcpdump запроса:
Код:
---------------------------------------------------------------------------

  TIME: 2014-05-13 20:12:16.018
    IP: 109.XXX.49.254 (0:21:a0:71:d1:d0) > 10.199.1.23 (0:c:29:b2:74:d9)
    OP: 1 (BOOTPREQUEST)
 HTYPE: 1 (Ethernet)
  HLEN: 6
  HOPS: 1
   XID: 5fe4d917
  SECS: 0
 FLAGS: 0
CIADDR: 0.0.0.0
YIADDR: 0.0.0.0
SIADDR: 0.0.0.0
GIADDR: 109.XXX.49.254
CHADDR: 00:15:60:bb:cb:17:00:00:00:00:00:00:00:00:00:00
 SNAME: .
 FNAME: .
OPTION:  53 (  1) DHCP message type         1 (DHCPDISCOVER)
OPTION:  12 ( 13) Host name                 hp-notebook
OPTION:  55 (  9) Parameter Request List      1 (Subnet mask)
                                             28 (Broadcast address)
                                              2 (Time offset)
                                              3 (Routers)
                                             15 (Domainname)
                                              6 (DNS server)
                                             12 (Host name)
                                             44 (NetBIOS name server)
                                             47 (NetBIOS scope)
                                           
OPTION:  82 ( 15) Relay Agent Information   
                  Circuit-ID    05:15:00:07:01
                  Remote-ID     fc:fa:f7:c5:ab:36
---------------------------------------------------------------------------



dhcpdump обычного запроса от обычного свича уровня доступа (на котором все работает):
Код:
---------------------------------------------------------------------------
  TIME: 2014-05-13 20:12:11.241
    IP: 109.XXX.48.1 (0:21:a0:71:d1:d0) > 10.199.1.23 (0:c:29:b2:74:d9)
    OP: 1 (BOOTPREQUEST)
 HTYPE: 1 (Ethernet)
  HLEN: 6
  HOPS: 1
   XID: 4168f746
  SECS: 0
 FLAGS: 0
CIADDR: 109.XXX.48.7
YIADDR: 0.0.0.0
SIADDR: 0.0.0.0
GIADDR: 109.XXX.48.1
CHADDR: 00:e0:4c:00:09:39:00:00:00:00:00:00:00:00:00:00
 SNAME: .
 FNAME: .
OPTION:  53 (  1) DHCP message type         3 (DHCPREQUEST)
OPTION:  61 (  7) Client-identifier         01:00:e0:4c:00:09:39
OPTION:  12 (  6) Host name                 Router
OPTION:  60 ( 15) Vendor class identifier   udhcp 0.9.9-pre
OPTION:  55 (  9) Parameter Request List      1 (Subnet mask)
                                              3 (Routers)
                                              6 (DNS server)
                                             12 (Host name)
                                             15 (Domainname)
                                             28 (Broadcast address)
                                             44 (NetBIOS name server)
                                             46 (NetBIOS node type)
                                             47 (NetBIOS scope)
                                           
OPTION:  82 ( 18) Relay Agent Information   
                  Circuit-ID    00:04:04:50:00:03
                  Remote-ID     00:06:00:0a:8a:d6:63:00
---------------------------------------------------------------------------


Версия биллинга:
Код:
Сервер: вер. 6.0 сборка 1723 от 10.04.2014 12:49:07
    os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.6.0_41

  inet вер. 6.0 сборка 1369 от 07.04.2014 19:04:33


Настройки в биллинге для устройства выполняющего L3 аггрегацию (к нему подключены свичи и этот OLT):
Код:
# Код субопции 82, содержащей VLAN, позиция и длина в субопции
dhcp.option82.vlanId.code=1
dhcp.option82.vlanId.position=0
dhcp.option82.vlanId.length=2
 
dhcp.option82.interfaceId.code=1
dhcp.option82.interfaceId.position=2
dhcp.option82.interfaceId.length=2
 
dhcp.option.leaseTime=300
 
# параметры DHCP к сети не привязанные
dhcp.option.serverIdentifier=0.0.0.0
#dhcp.option.leaseTime=600
#dhcp.option.timeServer=ntp.bgbilling.ru
# параметр DHCP "основной шлюз" для сети
#dhcp.net.option.188.191.0.0:255.255.255.0.gate=
#dhcp.net.option.188.191.1.0:255.255.255.0.gate=
#dhcp.net.option.188.191.2.0:255.255.255.0.gate=
#dhcp.net.option.188.191.3.0:255.255.255.0.gate=
 
#dhcp.option.timeOffset=43200
#dhcp.option.domainName=bgbilling.ru


Номер интерфейса в opt82 что у OLT что у свича в конце строки. Разве что у OLT само поле Circuit-ID короче:
Circuit-ID 05:15:00:07:01
против
Circuit-ID 00:04:04:50:00:03
Это можно отрегулировать к конфиге? Exception может быть из-за этого?

Автор:  Amir [ 13 май 2014, 23:04 ]
Заголовок сообщения:  Re: BGInetAccess дает exception

Падает на разборе Remote-ID. В данном случае, наверное, придется сделать предобработку, т.к. формат Remote-ID разный (в одном случае есть префикс-длина, в другом - нет).
http://wiki.bitel.ru/index.php/%D0%9D%D ... B8_DHCP.82

Автор:  survivor [ 14 май 2014, 12:44 ]
Заголовок сообщения:  Re: BGInetAccess дает exception

В смущение вводит "Расширьте обработчик процессора протокола типа устройства, с с которого приходит запрос на InetAccess (т.е. чей giaddr указан в пакете)"
У меня обработчик процессора протокола пустой. При попытке его редактировать говорит - "не выбран класс". Где об этой процедуре почитать чтоб понять что делать?

Автор:  survivor [ 14 май 2014, 13:52 ]
Заголовок сообщения:  Re: BGInetAccess дает exception

понимаю что вопрос нубский, но бгбиллинг все более становится средой обитания джава программеров )) чем просто биллингом и от четвертой к шестой версии я все меньше понимаю где чего делать...
Просто помогите - где чего ткнуть чтобы вставить код, я уж потом разберусь, тем более пример на вики есть.

Автор:  Amir [ 14 май 2014, 14:47 ]
Заголовок сообщения:  Re: BGInetAccess дает exception

А можете показать дерево устройств?

Автор:  survivor [ 14 май 2014, 16:03 ]
Заголовок сообщения:  Re: BGInetAccess дает exception

Скриншоты:

Вложения:
Комментарий к файлу: 3
BGB3.png
BGB3.png [ 74.71 КБ | Просмотров: 8135 ]
Комментарий к файлу: 2
BGB2.png
BGB2.png [ 45.05 КБ | Просмотров: 8135 ]
Комментарий к файлу: 1
BGB1.png
BGB1.png [ 36.59 КБ | Просмотров: 8135 ]

Автор:  survivor [ 14 май 2014, 16:05 ]
Заголовок сообщения:  Re: BGInetAccess дает exception

и еще один:

Вложения:
Комментарий к файлу: 4
BGB4.png
BGB4.png [ 40.64 КБ | Просмотров: 8135 ]

Автор:  Amir [ 14 май 2014, 16:38 ]
Заголовок сообщения:  Re: BGInetAccess дает exception

Если под L3 (GEPON) будут только устройства L2 OLD (т.е. формат AgentRemoteId будет одинаков), то можно в конфиге его типа устройства просто указать параметры разбора опций
Код:
# Нужно указать код субопции опции 82 для извлечения значений
# agentRemoteId обычно находится в субопции 2
dhcp.option82.agentRemoteId.code=2
# interfaceId обычно находится в субопции 1 (circuitId)
dhcp.option82.interfaceId.code=1
# vlanId обычно находится в субопции 1 (circuitId)
dhcp.option82.vlanId.code=1
# Если в субопции отсутствует заголовок с длиной субопции, то укажите 0. Иначе укажите длину заголовка.
# Данный параметр используется в том числе, для того, чтобы извлеченные значения circuitId из DHCP-пакета и из RADIUS-пакета были идентичны.
# Соответственно, значение position нужно указывать относительно removeHeader.
dhcp.option82.removeHeader=0
# Нужно указать параметры извлечения agentRemoteId из субопции (dhcp.option82.agentRemoteId.code)
# позиция значения внутри субопции
dhcp.option82.agentRemoteId.position=0
# если длина значения может изменятся и нужно брать значение до конца субопции, то укажите -1
dhcp.option82.agentRemoteId.length=6
# 0, если remoteId в бинарном виде, например, MAC-адрес; 1, если там закодирована строка
dhcp.option82.agentRemoteId.type=0
# Нужно указать параметры извлечения interfaceId из субопции (dhcp.option82.interfaceId.code)
dhcp.option82.interfaceId.position=4
dhcp.option82.interfaceId.length=1
# Нужно указать параметры извлечения interfaceId из субопции (dhcp.option82.vlanId.code)
dhcp.option82.vlanId.position=2
dhcp.option82.vlanId.length=2

Автор:  Amir [ 14 май 2014, 16:42 ]
Заголовок сообщения:  Re: BGInetAccess дает exception

Если же под L3 (GEPON) будут разные типы устройств, то нужно сделать как здесь http://wiki.bitel.ru/index.php/Поддержка_устройств_с_разными_форматами_опции_DHCP.82#.D0.A0.D0.B0.D0.B7.D0.BD.D1.8B.D0.B5_.D1.82.D0.B8.D0.BF.D1.8B_.D1.83.D1.81.D1.82.D1.80.D0.BE.D0.B9.D1.81.D1.82.D0.B2_c_.D1.80.D0.B0.D0.B7.D0.BD.D1.8B.D0.BC_.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.82.D0.BE.D0.BC_agentRemoteId.

Для типа устройства L3 Catalist (GEPON) добавить обработчик процессора протокола (динамический класс):
Код:
import java.util.Arrays;
 
import ru.bitel.bgbilling.kernel.network.dhcp.DhcpPacket;
import ru.bitel.bgbilling.kernel.network.dhcp.DhcpProtocolHandler;
import ru.bitel.bgbilling.modules.inet.access.sa.ProtocolHandlerAdapter;
import ru.bitel.bgbilling.modules.inet.dhcp.InetDhcpProcessor;
 
public class Dhcp82ProtocolHandler
   extends ProtocolHandlerAdapter
   implements DhcpProtocolHandler
{
   @Override
   public void preprocessDhcpRequest( DhcpPacket request, DhcpPacket response )
      throws Exception
   {
      byte[] agentRemoteId = request.getSubOption( (byte)2 ).value;
      if( agentRemoteId.length == 8 )
      {
         request.setOption( InetDhcpProcessor.AGENT_REMOTE_ID, Arrays.copyOfRange( agentRemoteId, 2, 6 ) );
      }
      // OLT
      else
      {
         request.setOption( InetDhcpProcessor.AGENT_REMOTE_ID, Arrays.copyOfRange( agentRemoteId, 0, 6 ) );
      }
   }
}
А для в типе устройства OLT указать параметры разбора CircuitId:
Код:
# Нужно указать код субопции опции 82 для извлечения значений
# interfaceId обычно находится в субопции 1 (circuitId)
dhcp.option82.interfaceId.code=1
# vlanId обычно находится в субопции 1 (circuitId)
dhcp.option82.vlanId.code=1
# Если в субопции отсутствует заголовок с длиной субопции, то укажите 0. Иначе укажите длину заголовка.
# Данный параметр используется в том числе, для того, чтобы извлеченные значения circuitId из DHCP-пакета и из RADIUS-пакета были идентичны.
# Соответственно, значение position нужно указывать относительно removeHeader.
dhcp.option82.removeHeader=0
# Нужно указать параметры извлечения interfaceId из субопции (dhcp.option82.interfaceId.code)
dhcp.option82.interfaceId.position=4
dhcp.option82.interfaceId.length=1
# Нужно указать параметры извлечения interfaceId из субопции (dhcp.option82.vlanId.code)
dhcp.option82.vlanId.position=2
dhcp.option82.vlanId.length=2

Автор:  survivor [ 14 май 2014, 18:08 ]
Заголовок сообщения:  Re: BGInetAccess дает exception

Amir, спасибо большое! Все заработало :)

Автор:  survivor [ 14 май 2014, 18:15 ]
Заголовок сообщения:  Re: BGInetAccess дает exception

я сделал первый вариант, со вторым туплю на: "добавить обработчик процессора протокола (динамический класс)"
Как это сделать? Создать новый класс и в него вставить код? Но класс создается уже не пустой. Или выбрать какой-то существующий обработчик процессора протокола и его редактировать?
Наверное программерам смешно слышать эти вопросы, но я как-то не соображу.

Автор:  survivor [ 14 май 2014, 18:19 ]
Заголовок сообщения:  Re: BGInetAccess дает exception

Если сделать так как показано на скриншоте, открывается управление динамическим кодом с уже существующим макетом:
Код:
import ru.bitel.bgbilling.kernel.network.dhcp.DhcpPacket;
import ru.bitel.bgbilling.kernel.network.radius.RadiusPacket;
import ru.bitel.bgbilling.modules.inet.access.sa.ProtocolHandler;
import ru.bitel.bgbilling.modules.inet.access.sa.ProtocolHandlerAdapter;
import ru.bitel.bgbilling.modules.inet.api.common.bean.InetDevice;
import ru.bitel.bgbilling.modules.inet.api.common.bean.InetDeviceType;
import ru.bitel.bgbilling.server.util.Setup;
import ru.bitel.common.ParameterMap;
import ru.bitel.common.sql.ConnectionSet;

public class gepon
   extends ProtocolHandlerAdapter
   implements ProtocolHandler
{
   @Override
   public void preprocessAccountingRequest( RadiusPacket radiusPacket1, RadiusPacket radiusPacket2, ConnectionSet connectionSet3 )
      throws Exception
   {
   }

   @Override
   public void postprocessDhcpRequest( DhcpPacket dhcpPacket1, DhcpPacket dhcpPacket2 )
      throws Exception
   {
   }

   @Override
   public void init( Setup setup1, int int2, InetDevice inetDevice3, InetDeviceType inetDeviceType4, ParameterMap parameterMap5 )
      throws Exception
   {
   }

   @Override
   public void postprocessAccessRequest( RadiusPacket radiusPacket1, RadiusPacket radiusPacket2, ConnectionSet connectionSet3 )
      throws Exception
   {
   }

   @Override
   public void preprocessDhcpRequest( DhcpPacket dhcpPacket1, DhcpPacket dhcpPacket2 )
      throws Exception
   {
   }

   @Override
   public void postprocessAccountingRequest( RadiusPacket radiusPacket1, RadiusPacket radiusPacket2, ConnectionSet connectionSet3 )
      throws Exception
   {
   }

   @Override
   public void preprocessAccessRequest( RadiusPacket radiusPacket1, RadiusPacket radiusPacket2, ConnectionSet connectionSet3 )
      throws Exception
   {
   }

}

все это заменить на:
Код:
import java.util.Arrays;
 
import ru.bitel.bgbilling.kernel.network.dhcp.DhcpPacket;
import ru.bitel.bgbilling.kernel.network.dhcp.DhcpProtocolHandler;
import ru.bitel.bgbilling.modules.inet.access.sa.ProtocolHandlerAdapter;
import ru.bitel.bgbilling.modules.inet.dhcp.InetDhcpProcessor;
 
public class Dhcp82ProtocolHandler
   extends ProtocolHandlerAdapter
   implements DhcpProtocolHandler
{
   @Override
   public void preprocessDhcpRequest( DhcpPacket request, DhcpPacket response )
      throws Exception
   {
      byte[] agentRemoteId = request.getSubOption( (byte)2 ).value;
      if( agentRemoteId.length == 8 )
      {
         request.setOption( InetDhcpProcessor.AGENT_REMOTE_ID, Arrays.copyOfRange( agentRemoteId, 2, 6 ) );
      }
      // OLT
      else
      {
         request.setOption( InetDhcpProcessor.AGENT_REMOTE_ID, Arrays.copyOfRange( agentRemoteId, 0, 6 ) );
      }
   }
}


или только postprocessDhcpRequest?

Вложения:
BG1.png
BG1.png [ 85.82 КБ | Просмотров: 8119 ]

Автор:  Amir [ 14 май 2014, 18:49 ]
Заголовок сообщения:  Re: BGInetAccess дает exception

Заменить. Хотя оба варианта должны работать (В ProtocolHandlerAdapter уже есть эти ничего неделающие методы).
И имя класса должно совпадать с именем файла. Т.е. имя класса оставить gepon.

Автор:  survivor [ 14 май 2014, 19:47 ]
Заголовок сообщения:  Re: BGInetAccess дает exception

Ага, с механизмом препроцесса все стало ясно.
Попробовал второй способ - gepon получил адрес, все работает. Но когда под этим же L3 GEPON создаю устройство типа опычный L2 switch, то:

Код:
Message type: BOOT_REQUEST
Dhcp message type: DHCP Discover{1}
htype: 1, hlen: 6, hops: 1
xid: -23281611, secs: 30, flags: 0
Client IP: 0.0.0.0
Your IP: 0.0.0.0
Server IP: 0.0.0.0
Relay IP: 109.XXX.49.254
Client MAC: {001560BBCB17}
  Requested IP Address{50}=109.XXX.49.199
  Host name{12}={hp-notebook}
  Parameter request list{55}={1, 28, 2, 3, 15, 6, 12, 44, 47}
  Agent information{82}=
    sub{1}={000404B10000}
    sub{2}={0006000B46CA4F00}
Common options: {agentRemoteId=[B@285d8e2}
05-14/18:15:57  INFO [dhcpLstnr-p-9-t-6] InetAbstractDhcpProcessor - Agent device not found by agentRemoteId=000b46ca
05-14/18:15:57 DEBUG [dhcpLstnr-p-9-t-6] InetDhcpProcessor - DHCP_DISCOVER
05-14/18:15:57 DEBUG [dhcpLstnr-p-9-t-6] InetDhcpProcessor - request.giaddr= 109.XXX.49.254, clientAddress=/109.XXX.49.254:67
05-14/18:15:57  INFO [dhcpLstnr-p-9-t-6] InetDhcpDevice - Search serv on deviceId: 13; 1; interfaceId: 0
05-14/18:15:57  INFO [dhcpLstnr-p-9-t-6] InetDhcpProcessor - InetServ not found.


Обратил внимание на:
Agent device not found by agentRemoteId=000b46ca
мак слишком короткий. Должен быть 000b46ca4f00.

Проблема наверное здесь?:
Код:
      if( agentRemoteId.length == 8 )
      {
         request.setOption( InetDhcpProcessor.AGENT_REMOTE_ID, Arrays.copyOfRange( agentRemoteId, 2, 6 ) );
      }


Но почему?

Автор:  Amir [ 14 май 2014, 19:55 ]
Заголовок сообщения:  Re: BGInetAccess дает exception

Не посмотрел, последнее значение это не длина, а toIndex, т.е. надо
Код:
      if( agentRemoteId.length == 8 )
      {
         request.setOption( InetDhcpProcessor.AGENT_REMOTE_ID, Arrays.copyOfRange( agentRemoteId, 2, 7 ) );
      }
      // OLT
      else
      {
         request.setOption( InetDhcpProcessor.AGENT_REMOTE_ID, Arrays.copyOfRange( agentRemoteId, 0, 5 ) );
      }
Хотя где 7 и 5 могут быть и бОльшие значения - это не вызовет ошибки (поэтому 0, 6 нормально отрабатывало).

Автор:  survivor [ 15 май 2014, 11:21 ]
Заголовок сообщения:  Re: BGInetAccess дает exception

Код:
if( agentRemoteId.length == 8 )
      {
         request.setOption( InetDhcpProcessor.AGENT_REMOTE_ID, Arrays.copyOfRange( agentRemoteId, 2, 7 ) );
      }

тоже не прокатило (не хватало последнего байта после предпроцесса), но:
Код:
     if( agentRemoteId.length == 8 )
      {
         request.setOption( InetDhcpProcessor.AGENT_REMOTE_ID, Arrays.copyOfRange( agentRemoteId, 2, 8 ) );
      }
 

помогло.

правда exception переместился чуть дальше:
Код:
05-15/10:16:44  INFO [dhcpLstnr-p-9-t-4] InetAbstractDhcpProcessor - REQUEST:
Message type: BOOT_REQUEST
Dhcp message type: DHCP Discover{1}
htype: 1, hlen: 6, hops: 1
xid: 1740869417, secs: 6, flags: 0
Client IP: 0.0.0.0
Your IP: 0.0.0.0
Server IP: 0.0.0.0
Relay IP: 109.XXX.49.254
Client MAC: {001560BBCB17}
  Requested IP Address{50}=109.XXX.49.199
  Host name{12}={hp-notebook}
  Parameter request list{55}={1, 28, 2, 3, 15, 6, 12, 44, 47}
  Agent information{82}=
    sub{1}={000404B10000}
    sub{2}={0006000B46CA4F00}

05-15/10:16:44 DEBUG [dhcpLstnr-p-9-t-4] InetAbstractDhcpProcessor - OP_BOOT_REQUEST
05-15/10:16:44 DEBUG [dhcpLstnr-p-9-t-4] InetAbstractDhcpProcessor - Found device by giaddr id=13
05-15/10:16:44  INFO [dhcpLstnr-p-9-t-4] InetAbstractDhcpProcessor - REQUEST_AFTER_PREPROCESS:
Message type: BOOT_REQUEST
Dhcp message type: DHCP Discover{1}
htype: 1, hlen: 6, hops: 1
xid: 1740869417, secs: 6, flags: 0
Client IP: 0.0.0.0
Your IP: 0.0.0.0
Server IP: 0.0.0.0
Relay IP: 109.XXX.49.254
Client MAC: {001560BBCB17}
  Requested IP Address{50}=109.XXX.49.199
  Host name{12}={hp-notebook}
  Parameter request list{55}={1, 28, 2, 3, 15, 6, 12, 44, 47}
  Agent information{82}=
    sub{1}={000404B10000}
    sub{2}={0006000B46CA4F00}
Common options: {agentRemoteId=[B@3067e236}
05-15/10:16:44 DEBUG [dhcpLstnr-p-9-t-4] InetAbstractDhcpProcessor - Found subDevice by identifier id=16
05-15/10:16:44 DEBUG [dhcpLstnr-p-9-t-4] InetDhcpProcessor - DHCP_DISCOVER
05-15/10:16:44 DEBUG [dhcpLstnr-p-9-t-4] InetDhcpProcessor - request.giaddr= 109.XXX.49.254, clientAddress=/109.XXX.49.254:67
05-15/10:16:44 ERROR [dhcpLstnr-p-9-t-4] InetDhcpProcessor - 7
java.lang.ArrayIndexOutOfBoundsException: 7
        at ru.bitel.bgbilling.modules.inet.api.server.InetUtils.parseInt(InetUtils.java:495)
        at ru.bitel.bgbilling.modules.inet.runtime.device.AbstractInetDeviceRuntime.getOption82InterfaceId(AbstractInetDeviceRuntime.java:298)
        at ru.bitel.bgbilling.modules.inet.runtime.device.InetDeviceRuntime.getOption82InterfaceId(InetDeviceRuntime.java:1)
        at ru.bitel.bgbilling.modules.inet.dhcp.InetDhcpDevice.findServRuntime(InetDhcpDevice.java:266)
        at ru.bitel.bgbilling.modules.inet.dhcp.InetDhcpProcessor.processOption82RequestImpl(InetDhcpProcessor.java:187)
        at ru.bitel.bgbilling.modules.inet.dhcp.InetAbstractDhcpProcessor.processOption82Request(InetAbstractDhcpProcessor.java:453)
        at ru.bitel.bgbilling.modules.inet.dhcp.InetAbstractDhcpProcessor.processRequest(InetAbstractDhcpProcessor.java:261)
        at ru.bitel.bgbilling.kernel.network.dhcp.DhcpListenerWorker.runImpl(DhcpListenerWorker.java:55)
        at ru.bitel.common.worker.WorkerTask.run(WorkerTask.java:86)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
        at java.lang.Thread.run(Thread.java:662)
        at ru.bitel.common.worker.WorkerThread.run(WorkerThread.java:40)

Автор:  survivor [ 15 май 2014, 11:44 ]
Заголовок сообщения:  Re: BGInetAccess дает exception

Получилось :) ошибка моя была в том, что под устройством нового типа - L3 catalyst (GePON), я завел устройство обычного типа L2 catalyst без конфигурации:
Код:
# Нужно указать код субопции опции 82 для извлечения значений
# interfaceId обычно находится в субопции 1 (circuitId)
dhcp.option82.interfaceId.code=1
# vlanId обычно находится в субопции 1 (circuitId)
dhcp.option82.vlanId.code=1
# Если в субопции отсутствует заголовок с длиной субопции, то укажите 0. Иначе укажите длину заголовка.
# Данный параметр используется в том числе, для того, чтобы извлеченные значения circuitId из DHCP-пакета и из RADIUS-пакета были идентичны.
# Соответственно, значение position нужно указывать относительно removeHeader.
dhcp.option82.removeHeader=0
# Нужно указать параметры извлечения interfaceId из субопции (dhcp.option82.interfaceId.code)
dhcp.option82.interfaceId.position=4
dhcp.option82.interfaceId.length=1
# Нужно указать параметры извлечения interfaceId из субопции (dhcp.option82.vlanId.code)
dhcp.option82.vlanId.position=2
dhcp.option82.vlanId.length=2

Создал новый тип для свичей которые будут под универсальным L3 типом (который терминирует и GePON и обычные свичи) и все заработало!
Спасибо еще раз!

Автор:  survivor [ 15 май 2014, 11:50 ]
Заголовок сообщения:  Re: BGInetAccess дает exception

В итоге GePON и свичи работают оба при таком коде:

Код:
      if( agentRemoteId.length == 8 )
      {
         request.setOption( InetDhcpProcessor.AGENT_REMOTE_ID, Arrays.copyOfRange( agentRemoteId, 2, 8 ) );
      }
      // OLT
      else
      {
         request.setOption( InetDhcpProcessor.AGENT_REMOTE_ID, Arrays.copyOfRange( agentRemoteId, 0, 6 ) );
      }

Автор:  survivor [ 22 май 2014, 18:23 ]
Заголовок сообщения:  Re: BGInetAccess дает exception

у истории оказалось есть продолжение :)

биллинг почему-то теперь видит всех абонентов (которые на свиче доступа) подключенными к первому порту.
Вот логи для второго порта (fastethernet0/2):

Код:
Message type: BOOT_REQUEST
Dhcp message type: DHCP Request{3}
htype: 1, hlen: 6, hops: 1
xid: 554854955, secs: 0, flags: 0
Client IP: 0.0.0.0
Your IP: 0.0.0.0
Server IP: 0.0.0.0
Relay IP: 109.XXX.49.254
Client MAC: {001560BBCB17}
  Server Identifier{54}={6D7F31FE}
  Requested IP Address{50}=109.XXX.49.1
  Host name{12}={hp-notebook}
  Parameter request list{55}={1, 28, 2, 3, 15, 6, 12, 44, 47}
  Agent information{82}=
    sub{1}={000404B10001}
    sub{2}={0006000B46CA4F00}
Common options: {agentRemoteId=[B@22beebcd}
05-22/16:14:09 DEBUG [dhcpLstnr-p-9-t-10] InetAbstractDhcpProcessor - Found subDevice by identifier id=16
05-22/16:14:09 DEBUG [dhcpLstnr-p-9-t-10] InetDhcpProcessor - DHCP_REQUEST
05-22/16:14:09 DEBUG [dhcpLstnr-p-9-t-10] InetDhcpProcessor - request.giaddr= 109.XXX.49.254, clientAddress=/109.XXX.49.254:67
05-22/16:14:09  INFO [dhcpLstnr-p-9-t-10] InetDhcpDevice - Search serv on deviceId: 16; 1; interfaceId: 0
05-22/16:14:09  INFO [dhcpLstnr-p-9-t-10] InetDhcpProcessor - InetServ found: ContractId: 35; servId: 33


И для 48-го порта:
Код:
Message type: BOOT_REQUEST
Dhcp message type: DHCP Request{3}
htype: 1, hlen: 6, hops: 1
xid: 1400915723, secs: 0, flags: 0
Client IP: 0.0.0.0
Your IP: 0.0.0.0
Server IP: 0.0.0.0
Relay IP: 109.XXX.49.254
Client MAC: {001560BBCB17}
  Server Identifier{54}={6D7F31FE}
  Requested IP Address{50}=109.XXX.49.2
  Host name{12}={hp-notebook}
  Parameter request list{55}={1, 28, 2, 3, 15, 6, 12, 44, 47}
  Agent information{82}=
    sub{1}={000404E0002F}
    sub{2}={0006000B46CA4F00}
Common options: {agentRemoteId=[B@7c9ed5d6}
05-22/16:18:45 DEBUG [dhcpLstnr-p-9-t-10] InetAbstractDhcpProcessor - Found subDevice by identifier id=16
05-22/16:18:45 DEBUG [dhcpLstnr-p-9-t-10] InetDhcpProcessor - DHCP_REQUEST
05-22/16:18:45 DEBUG [dhcpLstnr-p-9-t-10] InetDhcpProcessor - request.giaddr= 109.XXX.49.254, clientAddress=/109.XXX.49.254:67
05-22/16:18:45  INFO [dhcpLstnr-p-9-t-10] InetDhcpDevice - Search serv on deviceId: 16; 1; interfaceId: 0
05-22/16:18:45  INFO [dhcpLstnr-p-9-t-10] InetDhcpProcessor - InetServ found: ContractId: 35; servId: 33


т.е. приходит правильно:
sub{1}={000404B10001}
sub{1}={000404E0002F}
а получается все равно:
Search serv on deviceId: 16; 1; interfaceId: 0
Причем, самое интересное, что для гепона все работает корректно - onu сидящие на epon0/1:1 и epon0/1:2 попадают на соответствующие договоры...

Автор:  Amir [ 22 май 2014, 18:30 ]
Заголовок сообщения:  Re: BGInetAccess дает exception

Видимо в конфигурации сейчас получилось, что вытаскивает не последний байт, а предпоследний из 04B10001 и 04E0002F.
Нужно смотреть, что в конфигурации по парсингу option82 в устройствах этой ветки.

Автор:  survivor [ 22 май 2014, 18:54 ]
Заголовок сообщения:  Re: BGInetAccess дает exception

Спасибо за совет, помогла такая конфигурация типа устройства L2 свича:
dhcp.option82.removeHeader=2
dhcp.option82.interfaceId.position=2
dhcp.option82.interfaceId.length=2

Автор:  survivor [ 22 май 2014, 18:55 ]
Заголовок сообщения:  Re: BGInetAccess дает exception

а для гепона оставил:
dhcp.option82.removeHeader=0
dhcp.option82.interfaceId.position=4
dhcp.option82.interfaceId.length=1

Страница 1 из 1 Часовой пояс: UTC + 5 часов [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/