Вот текущий код SmartEdgeClipsServiceActivator с комментариями, который отвечает за изменение состояния и закрытие.
Это чтобы видно было какой параметр за что отвечает.
Код:
/**
* Изменение состояния сессии или набора опций.
*/
@Override
public Object connectionModify( ServiceActivatorEvent e )
throws Exception
{
logger.info( "Connection modify: oldState: " + e.getOldState() + "; newState: " + e.getNewState() + "; oldOptionSet: " + e.getOldOptions() + "; newOptionSet: " + e.getNewOptions() );
final InetConnection connection = e.getConnection();
// если нужно переключить в состояние отключен
if( e.getNewState() == InetServ.STATE_DISABLE )
{
// если всегда сбрасываем соединение при переключении состояния - вызываем просто connectionClose
// например, чтобы поменять IP с белого на серый
// sa.radius.connection.withoutBreak=0
if( !withoutBreak )
{
return connectionClose( e );
}
// устанавливаем флаг, что нужно будет поменять состояние соединения в базе
// sa.radius.connection.stateModify=1
if( needConnectionStateModify )
{
e.setConnectionStateModified( true );
}
// отключаем соединение
return connectionDisable( connection );
}
// если раньше было состояние отключено, а теперь включено
if( e.getOldState() == InetServ.STATE_DISABLE )
{
// если всегда сбрасываем соединение при переключении состояния - вызываем просто connectionClose
// например, чтобы поменять IP с белого на серый
// sa.radius.connection.withoutBreak=0
if( !withoutBreak )
{
// убрать из DHCP, чтобы выдало NaK
EventProcessor.getInstance().request( new InetConnectionManager.ConnectionRemoveEvent( connection ) );
// если при необходимости включить доступ до того как поменяли IP мы хотим включить доступ на SE, то идем дальше
// иначе return
if( !coaOnEnable )
{
return null;
}
}
// устанавливаем флаг, что нужно будет поменять состояние соединения в базе
// sa.radius.connection.stateModify=1
if( needConnectionStateModify )
{
e.setConnectionStateModified( true );
}
}
// закрываем все сервисы с помощью набора атрибутов sa.radius.service.closeAttributes=
RadiusPacket request = radiusClient.createModifyRequest();
prepareRequest( request, connection );
request.addAttributes( serviceCloseAttributes );
logger.info( "Send CoA: \n" + request );
radiusClient.send( request );
// готовим пакет на включение сервисов
request = radiusClient.createModifyRequest();
prepareRequest( request, connection );
final String realm = e.getRealm();
// открываем все подключенные сервисы
for( Integer option : e.getNewOptions() )
{
RadiusAttributeSet set = optionRadiusAttributesMap.get( realm, option );
if( set != null )
{
request.addAttributes( set );
}
}
logger.info( "Send CoA: \n" + request );
return radiusClient.sendAsync( request );
}
/**
* Ограничение доступа.
*/
private Object connectionDisable( InetConnection connection )
throws Exception
{
logger.info( "Connection disable" );
RadiusPacket request = radiusClient.createModifyRequest();
prepareRequest( request, connection );
// Выключение сервиса. Отправляем атрибуты редиректа
// sa.radius.disable.attributes= radius.disable.attributes=
request.addAttributes( disableRadiusAttributes );
logger.info( "Send CoA lock: \n" + request );
return radiusClient.sendAsync( request );
}
/**
* Закрытие сессии. Ограничение доступа и в следующий раз выдаем NAK.
*/
@Override
public Object connectionClose( ServiceActivatorEvent event )
throws Exception
{
logger.info( "Connection close" );
InetConnection connection = event.getConnection();
// убрать из DHCP, чтобы выдало NaK
EventProcessor.getInstance().request( new InetConnectionManager.ConnectionRemoveEvent( connection ) );
// вызываем отключение доступа
return connectionDisable( connection );
}