Курсовая работа: Домашнее задание
Описание
Характеристики курсовой работы
Список файлов
- Домашнее задание
- How to build p4.txt 2,42 Kb
- VasilenkoAE_521 (static NAT (no openflow)).zip 1,39 Mb
- VasilenkoAE_521 (switch openflow start)
- file_map.txt 18,09 Kb
- switch functioning.png 335,52 Kb
- explanation (static NAT (no openflow)).txt 4,36 Kb
- p4 spec v1.1.pdf 1,13 Mb
- Условие домашнего задания 2016.txt 1,86 Kb
# ======================================== ======================================== =====================================
# ======================================== ======================================== =====================================
# ======================================== ======================================== =====================================
# Installation
git clone https://github.com/p4lang/p4factory.git
cd p4factory
git submodule update --init --recursive
# If you will have errors then ssh-add your private key from github and repeat command
sudo ./install_depth.sh
./autogen.sh
./configure
# Makes virtual eth
sudo p4factory/tools/veth_setup.sh
cd ~/Desktop
git clone https://github.com/p4lang/tutorials.git
cd ~/Desktop
git clone https://github.com/osrg/ryu.git
sudo pip install ryu
# ======================================== ======================================== =====================================
# ======================================== ======================================== =====================================
# ======================================== ======================================== =====================================
cd targets/switch
make bm-p4ofagent PLUGIN_OPENFLOW=1
cd targets/l2_switch
make bm-p4ofagent PLUGIN_OPENFLOW=1
sudo ryu-manager --verbose ~/Desktop/ryu/ryu/app/simple_switch_13.p y
sudo python ~/Desktop/p4factory/mininet/openflow_l2. py --controller-ip 127.0.0.1 --cli
# ======================================== ======================================== =====================================
# ======================================== ======================================== =====================================
# ======================================== ======================================== =====================================
# If something cracked this commands will clear the os memory
sudo mn -c ; sudo killall behavioral-model ; redis-cli FLUSHALL
# ======================================== ======================================== =====================================
# ======================================== ======================================== =====================================
# ======================================== ======================================== =====================================
# Other
p4factory/tools/newtarget.py lvk_task
sudo python ~/Desktop/p4factory/mininet/l2_demo.py --num-hosts 4 --behavioral-exe ~/Desktop/p4factory/targets/l2_switch/be havioral-model
.
behavioral-model
bmv2
main.c
Makefile
README.md
run_bm.sh
build
bin
bm-p4ofagent
bm
obj
action_profiles.d
action_profiles.o
actions.d
actions.o
calculations.d
calculations.o
checksums.d
checksums.o
conditional_tables.d
conditional_tables.o
conn_mgr.d
conn_mgr.o
conn_mgr_pd_rpc_constants.d
conn_mgr_pd_rpc_constants.o
conn_mgr_pd_rpc_types.d
conn_mgr_pd_rpc_types.o
dc.d
dc.o
deparser.d
deparser.o
devport_mgr.d
devport_mgr.o
devport_mgr_pd_rpc_constants.d
devport_mgr_pd_rpc_constants.o
devport_mgr_pd_rpc_types.d
devport_mgr_pd_rpc_types.o
egress_pipeline.d
egress_pipeline.o
field_list.d
field_list.o
fields.d
fields.o
ingress_pipeline.d
ingress_pipeline.o
lf.d
lf.o
mc.d
mc.o
mc_pd_rpc_constants.d
mc_pd_rpc_constants.o
mc_pd_rpc_types.d
mc_pd_rpc_types.o
metadata_recirc.d
metadata_recirc.o
metadata_utils.d
metadata_utils.o
mirroring.d
mirroring.o
ofpat_groups.d
ofpat_groups.o
ofpat_pipeline.d
ofpat_pipeline.o
ofpat_state.d
ofpat_state.o
p4_pd_rpc_constants.d
p4_pd_rpc_constants.o
p4_pd_rpc_types.d
p4_pd_rpc_types.o
parser.d
parser.o
pd.d
pd_devport_mgr.d
pd_devport_mgr.o
pd_ms.d
pd_ms.o
pd.o
pd_pre.d
pd_pre.o
pd_rpc_server.d
pd_rpc_server.o
pd_static.d
pd_static.o
pd_wrappers.d
pd_wrappers.o
pg.d
pg_int.d
pg_int.o
pg.o
phv.d
phv.o
pipeline.d
pipeline.o
pkt_manager.d
pkt_manager.o
portmanager.d
portmanager.o
pre.d
pre.o
queuing.d
queuing.o
res_constants.d
res_constants.o
res_types.d
res_types.o
rmt.d
rmt.o
stateful.d
stateful.o
tables.d
tables.o
tcam_cache.d
tcam_cache.o
value_set.d
value_set.o
plugin
of
src
ofpat_groups.c
ofpat_pipeline.c
ofpat_state.c
ofpat_state.h
pd_wrappers.c
src
action_profiles.c
action_profiles.h
actions.c
actions.h
calculations.c
calculations.h
checksums_algos.h
checksums.c
checksums.h
conditionals.h
conditional_tables.c
conn_mgr.cpp
conn_mgr.h
conn_mgr_pd_rpc_constants.cpp
conn_mgr_pd_rpc_constants.h
conn_mgr_pd_rpc_server.ipp
conn_mgr_pd_rpc_types.cpp
conn_mgr_pd_rpc_types.h
conn_mgr_server.skeleton.cpp
crc_tables.h
dc.cpp
dc.h
dc_server.skeleton.cpp
deparser.c
deparser.h
devport_mgr.cpp
devport_mgr.h
devport_mgr_pd_rpc_constants.cpp
devport_mgr_pd_rpc_constants.h
devport_mgr_pd_rpc_server.ipp
devport_mgr_pd_rpc_types.cpp
devport_mgr_pd_rpc_types.h
devport_mgr_server.skeleton.cpp
egress_pipeline.c
enums.h
field_list.c
field_list.h
fields.c
fields.h
ingress_pipeline.c
lf.c
lf.h
mc.cpp
mc.h
mc_pd_rpc_constants.cpp
mc_pd_rpc_constants.h
mc_pd_rpc_server.ipp
mc_pd_rpc_types.cpp
mc_pd_rpc_types.h
mc_server.skeleton.cpp
metadata_recirc.c
metadata_recirc.h
metadata_utils.c
metadata_utils.h
mirroring.c
mirroring_internal.h
p4_pd_rpc_constants.cpp
p4_pd_rpc_constants.h
p4_pd_rpc_server.ipp
p4_pd_rpc_types.cpp
p4_pd_rpc_types.h
parser.c
parser.h
pd.c
pd_devport_mgr.c
pd_ms.c
pd_ms.h
pd_pre.c
pd_rpc_server.cpp
pd_static.c
pg.c
pg_int.c
pg_int.h
phv.c
phv.h
pipeline.c
pipeline.h
pkt_manager.c
pkt_manager.h
portmanager.c
portmanager.h
pre.c
pre_internal.h
primitives_arith.h
primitives.h
queuing.c
queuing.h
res_constants.cpp
res_constants.h
res_types.cpp
res_types.h
rmt.c
rmt_internal.h
stateful.c
stateful.h
tables.c
tables.h
tcam_cache.c
tcam_cache.h
value_set.c
value_set.h
thrift
conn_mgr_pd_rpc.thrift
devport_mgr_pd_rpc.thrift
mc_pd_rpc.thrift
p4_pd_rpc.thrift
res.thrift
BMI
obj
bmi_interface.d
bmi_interface.o
bmi_port.d
bmi_port.o
graphs
inc
p4_sim
mirroring.h
ofpat_groups.h
ofpat_pipeline.h
openflow.h
pd_devport_mgr.h
pd.h
pd_pre.h
pd_rpc_server.h
pd_static.h
pd_wrappers.h
pg.h
pre.h
rmt.h
traffic_manager.h
lib
bm.a
BMI.a
p4ns_common.a
p4utils.a
plugin-openflow.a
obj
main.o
p4ns_common
obj
p4ns_db.d
p4ns_db.o
p4ns_utils.d
p4ns_utils.o
p4utils
obj
atomic_int.d
atomic_int.o
cheap_tcam.d
cheap_tcam.o
cheap_trie.d
cheap_trie.o
circular_buffer.d
circular_buffer.o
Здравствуйте,
Я написал Static NAT.
1) внутри архива файлы расположены так, как они были расположены у меня в workspace для успешной работы.
это один файл из папки mininet и папка lvk_task, в которой находится свитч
2) Я удалил папку build, т.к. она много весит, поэтому сначала нужно сделать "make bm"
3) Можно открыть файл run_add_demo_entries.sh и увидеть топологию того, что запускает mininet
4) мой NAT - static, т.е. он заменяет у пакета конкретные ip адреса из внутренней сети, на конкретные ip адреса из внешней сети
5) все умеют делать ping всех, за исключением h3-h4 - они находятся в одной подсети, и потому если запустить ping, они не пользуются default gateway (заданный в скрипте mininet), а шлют arp запросы, которые я обрабатывать не умею. Зато для всех остальных пар хосты находятся в разных подсетях и потому пользуют default gateway, однако arp не шлют, потому что в mininet нужное значение сразу прописывается при запуске в каждый хост.
6) свитч состоит из 7 таблиц:
- таблица определения, что пакет пришёл из intranet (определяется по тому, из какого порта свитча прилетел пакет)
- таблица определения, что пакет идёт в internet (определяется по ipv4 dstAddr - если пакет идёт не в сеть intranet, то он идёт в интернет)
- таблица подмены source адреса, вызываемая, если пакет идёт из intranet в интернет
- таблица подмены destination адреса, вызываемая, если пакет пришёл из интернета в intranet
3 стандартные таблицы, которые я взял из simple_router
- таблица определения, в какой порт коммутатора выкинуть пакет по dstAddr ipv4
- таблица подмены dst mac в зависимости от dstAddr (обычная операция, свойственная рутеру)
- таблица подмены src mac в зависимости от того, из какого порта рутер выкинет пакет (тоже обычная операция, но вообще говоря, её можно убрать, потому что в данном конкретном примере, всё сработает и без неё (т.к. есть другая процедура через mininet - как заставить пакет с хоста быть посланным в коммутатор))
7) Для запуска нужно вызвать "run_demo.sh" - она запустит mininet топологию, автоматически зальёт правила на свитч/
8) В результате на моём нате можно задать, какие порты рутера являются внутренними, а какие внешними, задать статическое отображение одних ip-адресов на другие ip-адреса, а также статически задать данные для последних 3-х таблиц, используемых для обычной маршрутизации пакетов.
9) Всё происходит исключительно статически, никакого openflow и обучения
В прикреплённом файле "How to build p4" находится необходимый комплект команд, чтобы скомпилировать p4 фреймворк, switch и запустить его в режиме openflow с ryu (вряд ли это можно считать частью задания).
На наш взгляд одной из очень интересных тем является язык P4 (и темы сходные с ним, типа NetASM). Поэтому хотелось бы, чтобы вы почувствовали на практике, что это такое и как работа с ним выглядит.
Поэтому надо зайти на сайт p4.org и там:
- посмотреть видео по ссылке "SEE HOW P4 WORKS"
- перейти по ссылке "Try It" http://p4.org/code/
По ссылке нужно будет перейти на гитхаб в p4factory. Это окружение, в котором можно будет компилировать p4 программму, запускать получившийся свитч, запускать мининет, на хостах можно запускать docker контейнеры.
Далее задание носит творческий характер. Возможные направления:
1. Внести модификации в sample программу так, чтобы на коммутаторе выполнялась некоторая дополнительная функция типа ограничения трафика, трансляции адресов, для ЦОД (https://github.com/p4lang/tutorials/tre e/master/examples).
2. Установить OpenFlow агент и попробовать подключить контроллер (https://github.com/p4lang/p4ofagent).
Задание сдается в виде небольшое отчета о том, что было сделано. Кроме того рекурсивный вывод всех файлов и поддиректорий вашего workspace для p4. Модификации тех файлов, которые правились.