参考文档:

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。得到如下页面:

image.png

选择需要替换的数据面文件,执行submit

image.png

在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

ouyangxibao
189 声望161 粉丝

不生产代码,只是代码的搬运工