У меня есть приложение RYU, основанное на simple_switch_13, которое хорошо работает, улучшено для работы с несколькими коммутаторами. Я решил, что было бы неплохо добавить к нему некоторую интерактивность, поэтому на init я создаю поток, который будет принимать входные данные с консоли, и выполняю такие действия, как перечисление идентификаторов пути к данным подключенных коммутаторов. Проблема возникает, когда я реализую команду, которая генерирует запрос функций коммутатора.
Я реализовал консольный поток (производный от threading.Thread) с помощью класса, который имеет метод run (). В методе init этого класса я передаю ссылку на его родителя, который является объектом класса SimpleSwitch13.
В родительском классе SimpleSwitch13 я реализовал метод, который генерирует сообщение OFPFeaturesRequest, а затем вызывает send_msg () для отправки его в switch / datapath.
Поток консоли вызывает этот метод посредством ссылки на родительский объект, который, как я ожидал, отправит запрос функций коммутатору, и после этого будет вызван обработчик EventOFPSwitchFeatures, также в родительском объекте, для сообщения ответа от коммутатора. .
Вместо этого происходит то, что когда я вызываю send_msg () с запросом, я получаю сообщение об ошибке «не могу переключиться на другой поток» - и, кроме того, коммутатор отключается, а затем повторно подключается.
Насколько я могу понять, этот поток, который я создал для создания своей маленькой консольной подпрограммы, не контролируется моим ryu-менеджером или какой-то другой черной магией, и хотя я использую подпрограммы внутри своего класса SimpleSwitch13 для генерации запрос функций, это заставляет вещи скрываться.
Есть какие-нибудь идеи относительно отправки этого запроса? Боюсь, у меня возникла проблема контекста, которую я не совсем понимаю относительно реализации для управления несколькими коммутаторами.