前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >vpp dhcp配置

vpp dhcp配置

作者头像
dpdk-vpp源码解读
发布2023-03-07 17:20:36
1.5K0
发布2023-03-07 17:20:36
举报
文章被收录于专栏:DPDK VPP源码分析

DHCP基本介绍

DHCP,动态主机配置协议,前身是BOOTP协议,是一个局域网的网络协议,使用UDP协议工作,常用的2个端口:67(DHCP server),68(DHCP client)。DHCP通常被用于局域网环境,主要作用是集中的管理、分配IP地址,使client动态的获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率。简单来说,DHCP就是一个不需要账号密码登录的、自动给内网机器分配IP地址等信息的协议。 关于DHCP业务的具体流程,可以参考公众号《Linux云计算网络》文章的介绍,文章很详细的介绍了DHCP的业务流程。本文以vpp 20.1版本dhcp处理逻辑来说明:

基本配置

环境组网

代码语言:javascript
复制
       vpp                             dhcp server  vnet2
+--------------------+               +---------------------------+
|                    +               | 网络:vnet2                |
| GigabitEthernet0/3/0-------------->+                           |
|                    |               |                           |
+--------------------+               +---------------------------+

环境使用VMware来搭建,vnet2 作为一个网关,并使能dhcp功能,配置如下:

这里特意把租用周期调整成1分钟,来观察一下,客户端在租约到期更新时的发包频率。vpp默认是每间隔租期的1/2时间发送一个dhcp request的单播报文(因为此时dhcp server及租约的ip地址都是确定的)。

接口使能dhcp功能,

vpp只支持dhcp clinet,不支持配置server,通过下面命令使能

代码语言:javascript
复制
set dhcp client intfc GigabitEthernet0/3/0

在windows系统是开启wirshark进行抓包vnet2,如下:

下面可以看到每隔30S收到一个client发的续约的请求:

在vpp源码中没有打印clinet端的基本信息,下面使用gdb来查看一下:

代码语言:javascript
复制
(gdb) p dhcp_client_main.clients[0]
$3 = {
  state = DHCP_BOUND, #当前状态
  sw_if_index = 2, #接口索引
  retry_count = 0, #记录重传次数
  next_transmit = 70068.925321623043, #next_transmit 和lease_expires 决定了发包的频率单位s,30s发送一下
  lease_expires = 70098.925321623043,
  transaction_id = 896274263, #事务的ID,由dhcp clinet申请0x356C0F57,对应报文的字段。
  leased_address = {#租用ip地址192.168.136.128   对应16进制网络序0x8088 A8C0
    data = "\300\250\210\200",
    data_u32 = 2156439744,
    as_u8 = "\300\250\210\200",
    as_u16 = {43200, 32904},
    as_u32 = 2156439744
  },
  dhcp_server = {#dhcp server地址:192.168.136.254   对应16进制网络序0xFE88 A8C0
    data = "\300\250\210\376",
    data_u32 = 4270368960,
    as_u8 = "\300\250\210\376",
    as_u16 = {43200, 65160},
    as_u32 = 4270368960
  },
  subnet_mask_width = 24, #子网掩码
  router_address = {#
    data = "\000\000\000",
    data_u32 = 0,
    as_u8 = "\000\000\000",
    as_u16 = {0, 0},
    as_u32 = 0
  },
  lease_renewal_interval = 30, #每隔30秒会重新发起request单播请求。
  lease_lifetime = 60, #默认租期时间1分钟
  option_55_data = 0x7f2ba12e813c "\001\034\002\003\017\006w\f,/\032y*",
  l2_rewrite = 0x7f2ba12ee51c "\377\377\377\377\377\377",
  hostname = 0x0,
  client_identifier = 0x7f2ba135797c "vpe 1.0",
  client_index = 0,
  pid = 0,
  set_broadcast_flag = 1 '\001',
  client_hardware_address = "\000\f)c\224\060",
  client_detect_feature_enabled = 0 '\000',
  event_callback = 0x0
}

在测试中发现一个现象,dhcp server收到discover报文,在回应offer之前会发送一个ping报文,应该是尝试看是否有设备使用了当前ip。

dhcp其他命令行

代码语言:javascript
复制
#查询dhcp clinet状态及ip地址情况。
ucpe-cli-kvm# show dhcp client intfc GigabitEthernet0/3/0 verbose
[0] GigabitEthernet0/3/0 state DHCP_BOUND addr 192.168.136.128/24 gw 0.0.0.0
retry count 0, next xmt 71192.90
#删除dhcp功能
set dhcp client del intfc GigabitEthernet0/3/0
#dhcp中继命令行配置,没有尝试配置,后续有时间再搭环境验证
set dhcp proxy [del] server <ip-addr> src-address <ip-addr> [server-fib-id <n>] [rx-fib-id <n>]
#下面应该是dhcp中继功能查询命令行
ucpe-cli-kvm# show dhcp option-82-address interface  GigabitEthernet0/3/0
      interface       source IP address
GigabitEthernet0/3/0   192.168.136.128

option 82是dhcp报文中的中继代理信息选项(relay agent information option)。当dhcp client发送请求报文到dhcp server时,若需要经过dhcp中继,则由dhcp中继将option 82添加到请求报文中。option 82包含很多sub-option,本文中的option 82只支持sub-option 1、sub-option 2和sub-option 5。sub-option 1中定义了代理电路id(即circuit id),sub-option 2中定义了代理远程id(即 remote id),sub-option 5为链路选择(link selection)子项,该选项中包含了dhcp中继添加的ip地址。 DHCP 中继解决了跨越多个网段申请 IP 地址的问题,对不同网段的 IP 地址分配可以只由一个 DHCP 服务器进行统一管理和运维。 每个网段可以设置一个 DHCP 中继(可以在路由器上设或者直接在主机上配置),它可以配置 DHCP 服务器的地址,这样通过中继代理即可完成和 DHCP 服务器之间的交互(通过选项字段来标识 DHCP 中继的信息)。

DHCP clinet端状态机转换

dhcp clinet是通过process node节点来实现状态机转换及报文的发送的。process node通过定时任务和事件的方式来启动dhcp报文的发送。如果新配置一个接口使能或去使能dhcp通过事件来通知process node来发送discover报文。后续都是由定时任务来处理。目前DHCP clinet支持三个状态DISCOVER、REQUEST、BOUND。状态之间的切换如下图所示:

dhcp业务处理流程

在dhcp业务处理流程中,节点ip4-dhcp-client-detect是动态使能和去使能。 1、在discover、request状态,发送报文前需要使能ip4-dhcp-client-detect,用于接收dhcp server的回应报文。 2、在切换成bound状态后,会把节点去使能能ip4-dhcp-client-detect。后续不会再收到dhcp server发送的报文。

这里应该考虑到dhcp租期一般是2小时左右,所以2小时内不会发送request报文。在发送request报文时,需要重新使能节点。收到dhcp server回应的ack报文后,重新去使能。

在测试中发现一个bug,在查询接口feature的时候,具体存在多次使能,如下所示:

代码语言:javascript
复制
ip4-unicast:
  ip4-dhcp-client-detect
  ip4-dhcp-client-detect
  ip4-dhcp-client-detect
  ip4-reassembly-feature

问题原因:vpp的Feture在使能的缺少容错机制,存在重复使能问题。这个需要使用者维护。dhcp clinet虽然有处理容错机制,但是判断不全。

dhcp_hw_interface_state_change函数中这里缺少对使能标识的判断,导致接口状态变化时,产生重复使能的问题:

代码语言:javascript
复制
  vnet_feature_enable_disable ("ip4-unicast",
                               "ip4-dhcp-client-detect",
                               c->sw_if_index, 1 /* enable */ , 0, 0);
  c->client_detect_feature_enabled = 1;

总结

本文简单分析一下vpp dhcp的处理流程,dhcp使用process node的事件及定时任务机制实现dhcp 报文的发送及检测机制,是非常有借鉴意义的。可以运用此机制增加自己的心跳监测功能。其他的类似bfd应该也是这种实现机制吧。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-02-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DPDK VPP源码分析 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • DHCP基本介绍
  • 基本配置
  • 环境组网
  • 接口使能dhcp功能,
  • dhcp其他命令行
    • DHCP clinet端状态机转换
      • dhcp业务处理流程
        • 总结
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档