sdn - 如何将数据包转发到 OpenDaylight 控制器
问题描述
我使用 Open vSwitch 和 OpenDaylight。我想将数据包转发到控制器。我要做的是建立一个防火墙,所以ovs首先将所有数据包发送到控制器,控制器会判断数据包是否应该被阻止。我在 datapath/datapath.c/ovs_dp_process_packet() 中添加以下代码
struct dp_upcall_info upcall;
int error;
memset(&upcall, 0, sizeof(upcall));
upcall.cmd = OVS_PACKET_CMD_MISS;
upcall.portid = ovs_vport_find_upcall_portid(p, skb);
upcall.mru = OVS_CB(skb)->mru;
error = ovs_dp_upcall(dp, skb, key, &upcall, 0);
我想要做的是将数据包调用到控制器,即使它们与流表匹配。但是在我编译代码之后,它就不起作用了。那么如何将数据包调用到控制器?
解决方案
OVS:
向 OVS 添加新操作是一个很长的故事,您可以遵循。这是您应该更改的最重要的代码文件的列表:
- lib/ofp-actions.c : 定义新动作、编码、解码和格式化
- include/openvswitch/ofp-actions.h:传播动作
- datapath/linux/compat/include/linux/openvswitch.h:在内核级别定义
- lib/odp-util.c : 定义动作的字节长度
- ofproto/ofproto-dpif-xlate.c:这个文件处理内核和用户空间之间的通信。特别是当新流程不匹配时
- datapath/flow_netlink.c : 在内核中定义动作的字节
- datapath/actions.c:执行动作
对于完整的步骤,我强烈建议遵循 自定义 Open vSwitch 操作
更改源文件后,使用 OVS 根目录中的这些命令来停止、生成和运行它。请注意,您的 gcc 版本应该与您的 Linux 头文件已编译的版本相同。
ovs-ctl stop
ovs-dpctl del-dp ovs-system
rmmod openvswitch
make clean
make modules_install clean
./boot.sh
./configure --with-linux=/lib/modules/`uname -r`/build --enable-Werror
make
make install
make modules_install
config_file="/etc/depmod.d/openvswitch.conf"
for module in datapath/linux/*.ko; do
modname="$(basename ${module})"
echo "override ${modname%.ko} * extra" >> "$config_file"
echo "override ${modname%.ko} * weak-updates" >> "$config_file"
done
depmod -a
modprobe openvswitch
lsmod | grep openvswitch
mkdir -p /usr/local/etc/openvswitch
ovsdb-tool create /usr/local/etc/openvswitch/conf.db vswitchd/vswitch.ovsschema
mkdir -p /usr/local/var/run/openvswitch
ovsdb-server --remote=punix:/usr/local/var/run/openvswitch/db.sock --remote=db:Open_vSwitch,Open_vSwitch,manager_options --pidfile --detach --log-file
ovs-vsctl --no-wait init
ovs-vswitchd --pidfile --detach --log-file
export PATH=$PATH:/usr/local/share/openvswitch/scripts
ovs-ctl start
控制器:
在控制器中,您应该能够创建并按下 Action 进行切换。我没有关于在 OpenDayLight 中定义新动作的方式的信息,但是我知道在 Floodlight 中它是通过使用 Loxigen 来实现的。
如果您有任何问题,请随时与我联系。
推荐阅读
- c# - Unity动画设置bool true但设置true后不设置false?
- java - Java 依赖项无法找到自己的资源 - 在 AWS Lambda 中运行的代码
- excel - 不同文件中的相同公式不同值-小数四舍五入问题
- android - gson.fromJson 预期 BEGIN_OBJECT 但由于对象的存储方式而为 BEGIN_ARRAY
- docker - 如果docker上的cuda版本与PC上的cuda版本不同,这有关系吗?
- python - 如何从 ls 命令创建文件列表?
- python - FileInput中的Django“未选择文件”
- python - 将线图添加到 Facetgrid 图
- reactjs - 反应 .map 具有许多表格单元格的多个表格行
- google-drive-api - 使用 Pydrive 上传带有可共享链接的视频,但未处理