当年使用dpdk干的事
对于dpdk收到的报文,从物理口上收到的报文,非内核接口发出的报文, 目前都是基于session流,类似于内核协议栈里面的netfiler的tuple来实现的,
一般一个session 里面有flow_org和 flow_reply两个flow。
目前存在路由接口也就是三层接口 l3ethx,接口上配置了ip地址,在此接口进行三层路由转发的接口;
同时也存在二层接 l2ethx,此接口用来做交换机的二层转发, 由于存在svi接口, 可以再l2ethx上创建改vlan属性的svi接口也属于三层接口。
举个例子:vrrp报文时组播报文,通过l2ethx 接口上来, 此时由于特性,应该转发到对应的svi接口上, 然后在做处理,此时应该将此报文按照三层转发逻辑来处理。
目前都直接在数据平面中跑vrrp协议,所以直接在L3ethx接口上处理vrrp协议。
对于三层转发也应该有一个三层expect以及alg相关表项,除了路由表外。
l3_slow_path逻辑如下:
1、expect = alg_expect_lookup(mbuf) 为NULL;
1.1pkt_route_lookup(mbuf, ctl_sess)
1.1.1 dp_fib_lookup_nexthop_ipv4
1.1.2 dp_pbr_match
查路由的时候,记得反向查找fib以及pbr
记得根据mbuf 填充ctl_sess ,ctl_sess为session的类似结构体
1.2 dp_snat_process()
1.3 根据路由类型 主机路由等决定是否送往内核还是,并且根据接口类型打上标志是来自有线口还是无线口
1.4 对于路由类型为网络路由,比如pkt为dhcp dns proxy等需要根据策略来决定是否送往内核还是drop
1.5 设置ctl_sess 中的alg相关信息,根据mbuf中的五元组来判断。和内核协议栈一样的逻辑
2、expect = 存在。
2.1 直接使用expect保存的信息来填充ctl_sess
3、 使用ddos检查
4、创建session 根据mbuf ctl_sess来处理
5、走转发逻辑(涉及到alg、以及portal 认证的双向nat转到内核等)
这只是转发逻辑!!
来看一下认证业务相关逻辑:
ps:创建session 的时候根据配置来设置是否需要做portal 认证、微信认证等熟悉。后面转发报文时,根据属性决定后转发到内核,应用层有http服务器以及代理服务器来重定向。
这里面的代码逻辑涉及到业务量比较大。不说了!!!
- dpdk的主线程中为了接受ac的配置消息。注册了libevent dispatch io复用网络事件库,比如配置更新时 等通过socket消息通信
记忆犹新的一点是苹果设备弹portal--点亮wifi图标
苹果设备接入一个不加密的无线时要获取苹果服务器的安全许可,一般会发安全网络探测包,网络探测包的URL有八个分别对应iphone、ipad , "www.apple.com",
"captive.apple.com", ".push.apple.com", "www.thinkdifferent.us", "www.airport.us", "www.ibook.info", "www.itools.info","www.appleiphonecell.com"。
通过这八个特殊的URL识别是苹果设备,对应苹果设备的弹portal有两种方案,
- 1、弹出portal页面后放行一定时间的数据包,让苹果终端和苹果服务器通信获取网络安全许可这样才能点亮wifi图标,
- 2、portal服务器等弹出portal页面后模拟苹果服务器回Sucess给苹果终端使其通过验证,点亮wifi图标保证网络的通畅,接下来就是微信认证、qq认证、web认证。
对于微信认证逻辑大概如下:
1. 用户手动选择SSID,手机浏览器弹出Portal页面
2. Portal页面初始化时,向AC/AP请求移动端和AC/AP的MAC地址
移动设备在portal页中引用下述微信JSAPI,让原有Wi-Fi portal页具备呼起微信的能力:
<script type="text/javascript" src="https://wifi.weixin.qq.com/resources/js/wechatticket/wechatutil.js" ></script>
<script type="text/javascript"> var appId = "wx1bxxxxx33e"; var secretkey = "9cf2exxxxxxx0c237a"; var extend = "shandian"; //开发者自定义参数集合 var timestamp = new Date().getTime(); //时间戳(毫秒) var shop_id = "819xxx52"; //AP设备所在门店的ID var authUrl = "http://xxx/callback/auth?httpCode=200?gwId=xxx"; //服务器回调地址 gwId当前连接的路由的设备编号 var mac = "3c:91:57:c2:cc:af"; //用户手机mac地址 安卓设备必需 var ssid = "A01-S001-R044"; //AP设备信号名称,非必须 var bssid = "00:a0:b1:4c:a1:c5"; //AP设备mac地址,非必须 function callWechatBrowser(){ var sign = $.md5(</span>appId + extend + timestamp + shop_id + authUrl + mac + ssid + bssid + secretkey); Wechat_GotoRedirect(appId, extend, timestamp, sign, shop_id, authUrl, mac, ssid, bssid); } </script>
appId:商家微信公众平台账号
extend:extend里面可以放开发者需要的相关参数集合,最终将透传给运营商认证URL。extend参数只支持英文和数字,且长度不得超过300个字符。
timestamp:时间戳使用毫秒
sign:请求参数签名,具体计算方法见下方说明
shop_id :AP设备所在门店的ID(微信公众平台门店)
authUrl:认证服务端URL,微信客户端将把用户微信身份信息向此URL提交并获得认证放行
3.前端获取微信返回的openId,tid,extend回调接口
对于微信鉴权:参考官方文档即可。wifi微信鉴权
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
2019-07-01 tcp 客户端 发送syn
2019-07-01 TCP输入 tcp_queue_rcv
2019-07-01 生产者-消费者的PV操作伪代码
2019-07-01 主动关闭 tcp fin-wait-2 time-wait 定时器
2019-07-01 fork-vfork-clone
2019-07-01 tcp 接收被动关闭 fin
2019-07-01 nagle 算法 tcp nodelay 以及 quick ack分析