参考文档:
PI/proto/demo_grpc/README.md
环境配置
由于本次实验grpc服务器在端口8888上开启了一个web服务,而我的实验是在服务器上的容器运行的,无法使用浏览器。所以这里给容器增加一个端口映射,将18888映射到8888。
#停止我们的容器
docker stop p4-rt
#构建我们的新的镜像
docker commit p4-rt p4-rt1
#增加端口映射,使用的是镜像p4-rt1
docker run -it --privileged --name p4-rt1 -p 18888:8888 -v /home/admin/p4-rt:/p4-rt -w /p4-rt p4-rt1 bash
编译我们的实验程序
#安装轻量级的http服务器库
apt-get install libmicrohttpd-dev
cd PI/proto/demo_grpc/
./configure --with-proto --with-bmv2
make
make install
#编译后,在该目录下会生成四个可执行文件。
controller #grpc客户端,运行了一个以8888位端口的web服务器。
pi_grpc_server #bmv2 target的grpc服务器
pi_server_dummy #dummy target的grpc服务器
test_perf
通过查看Makefile.am文件即可以知道这几个文件的作用了:
ACLOCAL_AMFLAGS = ${ACLOCAL_FLAGS} -I m4
AM_CPPFLAGS = \
-I$(top_srcdir)/../include \
-I$(top_srcdir)/frontend \
-I$(top_srcdir)/server \
-I$(top_builddir)/cpp_out \
-I$(top_builddir)/grpc_out \
-I$(top_srcdir)/p4info
AM_CXXFLAGS = -Wall -Werror -Wno-unused-command-line-argument
noinst_PROGRAMS = controller pi_server_dummy test_perf
#pi_server_dummy为dummy target的grpc服务器
pi_server_dummy_SOURCES = pi_server_main.cpp
test_perf_SOURCES = test_perf.cpp
#controller可执行文件包含了web服务器的代码和grpc客户端的代码
controller_SOURCES = \
simple_router_mgr.cpp \
simple_router_mgr.h \
web_server.cpp \
web_server.h \
app.cpp
COMMON_SERVER_LIBS = \
$(top_builddir)/server/libpigrpcserver.la \
$(top_builddir)/frontend/libpifeproto.la \
$(top_builddir)/libpiprotogrpc.la \
$(top_builddir)/libpiprotobuf.la \
$(top_builddir)/../src/libpiall.la
#pi_grpc_server为bmv2 target的grpc服务器
if WITH_BMV2
bin_PROGRAMS = pi_grpc_server
pi_grpc_server_SOURCES = pi_server_main.cpp
pi_grpc_server_LDADD = \
$(COMMON_SERVER_LIBS) \
$(top_builddir)/../targets/bmv2/libpi_bmv2.la \
-lthrift -lruntimestubs -lsimpleswitch_thrift
endif # WITH_BMV2
pi_server_dummy_LDADD = \
$(COMMON_SERVER_LIBS) \
$(top_builddir)/../targets/dummy/libpi_dummy.la
test_perf_LDADD = \
$(top_builddir)/../src/libpip4info.la \
$(top_builddir)/libpiprotogrpc.la \
$(top_builddir)/libpiprotobuf.la \
$(top_builddir)/p4info/libpiconvertproto.la \
$(PROTOBUF_LIBS) $(GRPC_LIBS)
controller_LDADD = \
$(top_builddir)/../src/libpip4info.la \
$(top_builddir)/libpiprotogrpc.la \
$(top_builddir)/libpiprotobuf.la \
$(top_builddir)/p4info/libpiconvertproto.la \
-lmicrohttpd $(BOOST_SYSTEM_LIB) \
$(PROTOBUF_LIBS) $(GRPC_LIBS)
运行测试例
在PI/proto/demo_grpc/目录下运行测试例:
#按照该目录下的md文件的指示执行如下命令:
ip link add name veth250 type veth peer name veth251
ip link set dev veth250 up
ip link set dev veth251 up
python 1sw_demo.py --cpu-port veth250
./pi_grpc_server
./controller -c simple_router.json -p simple_router.p4info.txt
controller不能启动,报错。bmv2模型有bug,google没有得到想要的解决方案,退而求其次运行dummy模型。
dummy模型
#在一个console上运行
./pi_server_dummy
#在另外一个console上运行
./controller -c simple_router.json -p simple_router.p4info.txt
#成功
使用web进行转发数据面替换
在一台能访问物理服务器的设备上打开浏览器,访问我们的web服务器:192.168.1.1:18888。得到如下页面:
选择需要替换的数据面文件,执行submit
在console上可以看到如下输出:
P4Runtime SetForwardingPipelineConfig
[P4Runtime] [warn] p4::tmp::P4DeviceConfig is deprecated
P4Runtime Write
updates {
type: INSERT
entity {
table_entry {
table_id: 33589124
match {
field_id: 1
exact {
value: "\000\000\000\000"
}
}
action {
action {
action_id: 16784184
}
}
}
}
}
P4Runtime Write
updates {
type: INSERT
entity {
table_entry {
table_id: 33581985
match {
field_id: 1
lpm {
value: "\n\000\000\n"
prefix_len: 32
}
}
action {
action {
action_id: 16812204
params {
param_id: 1
value: "\n\000\000\n"
}
params {
param_id: 2
value: "\000\001"
}
}
}
}
}
}
P4Runtime Write
updates {
type: INSERT
entity {
table_entry {
table_id: 33581985
match {
field_id: 1
lpm {
value: "\n\000\001\n"
prefix_len: 32
}
}
action {
action {
action_id: 16812204
params {
param_id: 1
value: "\n\000\001\n"
}
params {
param_id: 2
value: "\000\002"
}
}
}
}
}
}
P4Runtime Write
updates {
type: INSERT
entity {
table_entry {
table_id: 33562826
match {
field_id: 1
exact {
value: "\000\001"
}
}
action {
action {
action_id: 16813016
params {
param_id: 1
value: "\000\252\273\000\000\000"
}
}
}
}
}
}
P4Runtime Write
updates {
type: INSERT
entity {
table_entry {
table_id: 33562826
match {
field_id: 1
exact {
value: "\000\002"
}
}
action {
action {
action_id: 16813016
params {
param_id: 1
value: "\000\252\273\000\000\001"
}
}
}
}
}
}
P4Runtime SetForwardingPipelineConfig
[P4Runtime] [warn] p4::tmp::P4DeviceConfig is deprecated
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。