{"id":27277318,"url":"https://github.com/sadimer/sdn_hw","last_synced_at":"2025-04-11T16:58:24.069Z","repository":{"id":262275636,"uuid":"886747945","full_name":"sadimer/sdn_hw","owner":"sadimer","description":null,"archived":false,"fork":false,"pushed_at":"2024-11-11T14:48:03.000Z","size":5,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2024-11-11T15:33:34.979Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sadimer.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-11-11T14:31:38.000Z","updated_at":"2024-11-11T14:48:07.000Z","dependencies_parsed_at":"2024-11-11T15:48:49.942Z","dependency_job_id":null,"html_url":"https://github.com/sadimer/sdn_hw","commit_stats":null,"previous_names":["sadimer/sdn_hw"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sadimer%2Fsdn_hw","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sadimer%2Fsdn_hw/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sadimer%2Fsdn_hw/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sadimer%2Fsdn_hw/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sadimer","download_url":"https://codeload.github.com/sadimer/sdn_hw/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248445865,"owners_count":21104988,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-04-11T16:58:23.517Z","updated_at":"2025-04-11T16:58:24.044Z","avatar_url":"https://github.com/sadimer.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Задание по SDN для спецкурса \"Современные облачные технологии\"\n\n## Гайд по установке и запуску\n**Установить на свой компьютер openvswitch**\n\nДля debian/ubuntu: ```sudo apt-get install openvswitch-switch``` \n\nДля rhel/centos/rocky: ```sudo yum install openvswitch``` или ```sudo dnf install openvswitch```\n\n**Установить mininet и osken:**\n\n```sudo pip install -r requirements.txt```\n\nЛибо ```sudo apt-get install mininet``` или ```sudo yum install mininet``` или ```sudo dnf install mininet```\n\n**Запустить конфигурацию Mininet для отладки вашего алгоритма (на примере задачи 1):**\n\n```sudo python3 tasks/task_1/mininet_cli.py```\n\n**Запустить контроллер OSKen в режиме отладки (на примере задачи 1):**\n\n```sudo osken-manager tasks/task_1/task.py```\n\n**Запустить оценочное тестирование:**\n\n```sudo pytest .```\n\n## Задание 1 (6 баллов из 10)\n\nВ этом задании вам нужно реализовать алгоритм обучения MAC-адресов (MAC Learning) в файле `tasks/task_1/task.py` с использованием фреймворка OSKen для создания SDN-приложений.\n\n### Как работает обучение MAC-адресов в коммутаторе:\n1) Когда устройство получает пакет на одном из портов, оно проверяет заголовок Ethernet-кадра.\n2) Извлекает из него MAC-адрес отправителя.\n3) Запоминает порт, на который пришёл пакет, и добавляет эту информацию в таблицу коммутации `mac_table` (данное поле класса `SimpleSwitch`).\n4) Если в таблице уже есть запись с `destination MAC-адресом` пакета, коммутатор перенаправляет его на порт, указанный в таблице. Если же записи нет, то коммутатор делает широковещательную рассылку, отправляя пакет на все доступные порты.\n\n### Важно:\nДля выполнения задания вам потребуется запрограммировать обработку пакетов, попадающих на контроллер, и настройку правил `match-action`. Эти правила позволят устройствам коммутатора узнавать, где находится `destination MAC_ADDRESS`, и прекращать широковещательную рассылку.\n\nДля этого:\n- По умолчанию, в таблице каждого коммутатора должно быть правило с наименьшим приоритетом, отправляющее пакеты на контроллер, если для них нет соответствующих `destination MAC_ADDRESS` правил.\n- При отправке пакета на контроллер генерируется событие `EventOFPPacketIn`, в теле которого содержатся все слои пакета по модели OSI. Вы можете использовать это событие для обработки необходимых полей.\n\nСсылки на полезные ресурсы: [Примеры на GitHub](https://github.com/faucetsdn/ryu/blob/master/ryu/app) и [документация OSKen](https://docs.openstack.org/os-ken/latest/developing.html).\n\n## Задание 2 (4 балла из 10)\n\nВ этом задании нужно расширить алгоритм обучения MAC-адресов с учётом VLAN. Реализацию выполняем в файле `tasks/task_2/task.py` с помощью OSKen.\n\n### Отличие от предыдущего задания:\nТеперь порты разделяются на разные сегменты (VLAN), и в каждом VLAN могут быть порты с одинаковыми IP-адресами. \n- Порты с MAC-адресами из списка ниже будут работать в режиме `ACCESS`, соответствующем указанному VLAN.\n- Остальные порты будут работать в режиме `TRUNK`, предназначенном для связи между коммутаторами.\n\n![VLAN схема](https://media.fs.com/images/community/upload/kindEditor/202110/08/1-02-1633674435-O7SvTEZXYz.jpg)\n\n### Важно:\n- Для каждого VLAN создаётся отдельная таблица MAC-адресов на каждом коммутаторе.\n\n```python\nVLAN_MAPPING = {\n    \"10:00:00:00:00:01\": 1,\n    \"10:00:00:00:00:02\": 1,\n    \"10:00:00:00:00:06\": 1,\n    \"10:00:00:00:00:03\": 2,\n    \"10:00:00:00:00:04\": 2,\n    \"10:00:00:00:00:05\": 2,\n}\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsadimer%2Fsdn_hw","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsadimer%2Fsdn_hw","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsadimer%2Fsdn_hw/lists"}