[Uneex] Пошлю сюда

Max Lapshin uneex@cs.msu.su
Tue, 26 Nov 2002 01:17:30 +0300


--EeQfGwPcQSOJBaQU
Content-Type: text/plain; charset=koi8-r
Content-Disposition: inline
Content-Transfer-Encoding: 8bit

Может хоть сюда дойдет, раз на netgraph не идет.
---
Химические реакции протекающие в большинстве голов
никак нельзя назвать мышлением.


--EeQfGwPcQSOJBaQU
Content-Type: text/plain; charset=koi8-r
Content-Disposition: attachment; filename=report
Content-Transfer-Encoding: 8bit

	Вводятся следующие термины:
	1. канал - однонаправленный канал передачи данных,
	с гарантированной доставкой сообщений, т.е. целостных
	пакетов данных. Как реальный обьект может не существовать.
	
	2. выходной порт (output_port) - сущность, из которой данные
	исходят, т.е. начало канала. В простейшем случае, как реальный
	обьект может не существовать.

	3. входной порт (input_port) -  сущность, в которую данные входят,
	т.е. конец канала. Эта сущность будет существовать, как порт
	в HURD, т.е. будет реальным обьектом.

	4. upl - universal port locator. Строка, однозначно описывающая
	порт входной или выходной.

interface filter
{
	/*
	Все функции возвращают int - код ошибки. 0 - не было
ошибки.
	in - параметр передающийсе от клиента серверу, out -
возвращаемый параметр
	*/
	
	int configure(in string cmd, out string reply);
	int open_input_port(in string portname, out input_port port);
	int open_output_port(in string portname, out output_port port);
	int connect_input_to_output(in input_port inp, in output_port outp);
	int connect_output_to_input(in output_port outp, in input_port inp);
	int disconnect_input(in input_port port);
	int disconnect_output(in output_port output);
	int resolve_output_port(in string name, out output_port port);
	int resolve_input_port(in string name, out input_port port);
}

Пояснения:
*** int configure(in string cmd, out string reply);
	Требуется для конфигурации модуля менеджером.

*** int open_input_port(in string portname, out input_port port);
*** int open_output_port(in string portname, out output_port port);
	Открывают входной и выходной порты
соответственно. portname - имя порта
	
*** int connect_input_to_output(in input_port inp, in output_port outp);
*** int connect_output_to_input(in output_port outp, in input_port inp);
	Собственно говоря, эти процедуры прописывают
некоторые поля в input_port и output_port, после чего
становится возможной пересылка данных. В частности
connect_input_to_output записывает в input_port
некоторую уникальную характеристику output_port (handle).
Обязательно должна быть вызвана ПЕРЕД
connect_output_to_input, по поводу чего можно
рекомендовать ставить соответствующую проверку. А
connect_output_to_input прописывает handle который принимает пакет.
Таким образом разрешается передача данных.
	На стороне input_port автор фильтра может воспользоваться
filter_lib, у которой он будет регистрировать свою
функцию, принимающую сообщения. Таким образом он избавится
от необходимости производить рутинную работу по работе с RPC.
	
*** int disconnect_input(in input_port port);
*** int disconnect_output(in output_port output);
	Закрытие соответствующего порта.

*** int resolve_output_port(in string name, out output_port port);
*** int resolve_input_port(in string name, out input_port port);
	Соответствие имени порта реальной структуре данных.
	

	Pежимы передачи данных по каналу между фильтрами.

	1. Синхронный режим. В таком режиме фильтр не выполняет никакой
буферизации сообщений и обрабатывает их сразу по мере поступлений.
Таким образом исключаются накладные расходы на поддержание очереди
сообщений и упрощается планировка запуска фильтров. При грамотной
поддержке rpc, т.е. передаче управления с rpc, использование
синхронного режима может повысить скорость. Недостатком является то,
что при возникновении "затора" после этого фильтра или по вине этого
фильтра, решение этой проблемы передается модулю выше. Примером такого
модуля может служить примитивный фильтр пакетов, фильтрующий по 
адресам отправителя и получателя. 

	2. Асинхронный режим. В таком режиме фильтр буферизует сообщения и не
блокируется при блокировании посылки сообщения или приеме. Практически
любой фильтр, работающий с различающимися по скорости каналами должен
использовать такой режим. В этом случае все проблемы из-за "заторов"
могут быть решены в конкретном фильтре.

--EeQfGwPcQSOJBaQU--