Дерево страниц

Сравнение версий

Ключ

  • Эта строка добавлена.
  • Эта строка удалена.
  • Изменено форматирование.

...

Предобработка:

Блок кода
languagejava
collapsetrue
package ru.provider.bgbilling.modules.inet.dyn.device;

import javax.annotation.Resource;

import org.apache.log4j.Logger;

import ru.bitel.bgbilling.kernel.network.dhcp.DhcpOption;
import ru.bitel.bgbilling.kernel.network.dhcp.DhcpPacket;
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.modules.inet.dhcp.InetDhcpProcessor;
import ru.bitel.bgbilling.modules.inet.runtime.device.PacketValueExtractor;
import ru.bitel.bgbilling.server.util.Setup;
import ru.bitel.common.ParameterMap;
import ru.bitel.common.io.BinaryValueExtractor;

public class PonDhcpRelayProtocolHandler
    extends ProtocolHandlerAdapter
{
    private static final Logger logger = Logger.getLogger( PonDhcpRelayProtocolHandler.class );

    @Resource
    private PacketValueExtractor packetValueExtractor;

    private byte oltPortCode;
    private BinaryValueExtractor oltPortExtractor;

    private byte ontIdPortCode;
    private BinaryValueExtractor ontIdPortExtractor;

    @Override
    public void init( Setup setup, int moduleId, InetDevice inetDevice, InetDeviceType inetDeviceType, ParameterMap deviceConfig )
        throws Exception
    {
        oltPortCode = (byte)deviceConfig.getInt( "dhcp.option82.oltPort.code", 1 );
        oltPortExtractor = packetValueExtractor.getExtractor( deviceConfig, "dhcp.option82.oltPort." );

        ontIdPortCode = (byte)deviceConfig.getInt( "dhcp.option82.ontId.code", 1 );
        ontIdPortExtractor = packetValueExtractor.getExtractor( deviceConfig, "dhcp.option82.ontId." );
    }

    @Override
    public void preprocessDhcpRequest( final DhcpPacket request, final DhcpPacket response )
        throws Exception
    {
        final int svlan = packetValueExtractor.getOption82AgentSvlanId( request, true );
        final int vlan = packetValueExtractor.getOption82VlanId( request, true );

        final int oltPort = extract( request, oltPortCode, oltPortExtractor );
        final int ontId = extract( request, ontIdPortCode, ontIdPortExtractor );

        final String onuIdentifier = (String)packetValueExtractor.getOption82Login( request, true );

        final String calledStationId = svlan + "." + vlan + "/" + oltPort + ":" + ontId + "/" + onuIdentifier;

        logger.info( calledStationId );

        // устанавливаем VLAN, чтобы он был досупен биллингу при обработке пакета
        request.setOption( InetDhcpProcessor.VLAN_ID, vlan );
        // устанавливаем VLAN в circuitId сессии
        request.setOption( InetDhcpProcessor.CIRCUIT_ID, vlan );
        // устанавливаем в calledStationId сессии, для информации
        request.setOption( InetDhcpProcessor.CALLED_STATION_ID, calledStationId );
    }

    private static int extract( final DhcpPacket request, final byte code, final BinaryValueExtractor extractor )
    {
        final DhcpOption subOption = request.getSubOption( code );
        if( subOption != null )
        {
            return extractor.extractInt( subOption.value, -1 );
        }

        return -1;
    }
}