当年使用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微信鉴权

 

posted @ 2020-07-01 20:41  codestacklinuxer  阅读(195)  评论(0编辑  收藏  举报