Добрый день!
В сети используются коммутаторы Zyxel и SNR. У SNR стандартный Cisco-like Opt82 (где remoteId приходит в subOption 2)
Zyxel же впереди планеты всей и шлет agentRemoteId и порт/vlan в одной subOption 1
Раньше проблему решал путем разнесения коммутаторов на разные dhcp relay, и, соотвественно в биллинге указывал разные форматы опций. Проблем не было. В силу определенных причин надо теперь все объеденить в один dhcp relay. Решил выкрутиться из ситуации через preprocessDhcpRequest.
В конфигурации устройства DHCP relay оставил только:
Цитата:
dhcp.deviceSearchMode=1
dhcp.servSearchMode=6,1
Т. е. убрал определение
dhcp.option82.agentRemoteIdНаписал свой обработчик протокола для dhcp relay:
Код:
@Override
public void preprocessDhcpRequest( DhcpPacket request, DhcpPacket response )
throws Exception
{
// Из-за смешения Cisco-like и Zyxel коммутаторов делаем такой вот финт ушами
DhcpOption agentRemoteId = request.getSubOption( CISCO_REMOTEID_CODE );
if( agentRemoteId != null )
{
logger.info("preprocessDhcpRequest: Cisco-like agentRemoteId");
byte[] value = new byte[CISCO_REMOTEID_LENGTH];
System.arraycopy( agentRemoteId.value, CISCO_REMOTEID_POSITION, value, 0, CISCO_REMOTEID_LENGTH );
request.setOption( InetDhcpProcessor.AGENT_REMOTE_ID, value );
}
else
{
logger.info("preprocessDhcpRequest: Zyxel-like agentRemoteId");
agentRemoteId = request.getSubOption( ZYXEL_REMOTEID_CODE );
byte[] value = new byte[ZYXEL_REMOTEID_LENGTH];
System.arraycopy( agentRemoteId.value, ZYXEL_REMOTEID_POSITION, value, 0, ZYXEL_REMOTEID_LENGTH );
request.setOption( InetDhcpProcessor.AGENT_REMOTE_ID, value );
}
}
В результате вроде бы как все хорошо. После обработки получаем примерно вот такое сообщение:
Цитата:
01-16/12:24:21 INFO [dhcpLstnr-p-7-t-18] InetAbstractDhcpProcessor - agentRemoteId is empty
01-16/12:24:21 INFO [dhcpLstnr-p-7-t-18] DHCPRelay - preprocessDhcpRequest: Zyxel-like agentRemoteId
01-16/12:24:21 INFO [dhcpLstnr-p-7-t-18] InetAbstractDhcpProcessor - REQUEST_AFTER_PREPROCESS:
Message type: BOOT_REQUEST
Dhcp message type: DHCP Discover{1}
htype: 1, hlen: 6, hops: 1
xid: 431457924, secs: 0, flags: 0
Client IP: 0.0.0.0
Your IP: 0.0.0.0
Server IP: 0.0.0.0
Relay IP: x.x.x.254
Client MAC: {BCF685013B8D}
Requested IP Address{50}=x.x.x.120
Parameter request list{55}={1, 3, 6, 12, 15, 28, 66, 121}
Agent information{82}=
sub{1}={000A02E3303031303831}
Common options: {agentRemoteId={303031303831}}
01-16/12:24:21 INFO [dhcpLstnr-p-7-t-18] InetDhcpDevice - Search serv on deviceId: 26 and it's descendants
И вот тут засада. deviceId 26 - это dhcp relay! Почему не происходит поиск дочерних устройств по agentRemoteId? Такое устройство присутствует.
P.S. Проблема горит