## mp2 - ip五元组分流增加优先级 ### 目前ip五元组分流的大致流程 ![ip_rule_priority_1](../../../_static/ip_rule_priority_1.png) `ue` 流量过来后,会去匹配 `session`,然后轮询查找 `session` 下的 `pdr` 规则,`pdr` 的 `acl` 中可能包含转发至边缘 `dn` 的 `acl`,也可能包含转发至正常 `dn` 的规则,只要命中其中一条规则,就往对应的 `dn` 转发。 ### 增加优先级和traffic-rule的设计思想 * 边缘 `acl` 要插在最前面,每条边缘 `acl` 都有优先级,插入时按优先级排序,这样匹配 `pdr` 的 `acl` 时就能最先命中优先级高的 `acl`。 * 目前代码的 `acl` 规则没有隶属于某个 `traffic-rule` 的概念,增加下发 `upf_traffic_id` ,使每条规则隶属于对应的 `traffic-rule`。 ### 具体开发方法 ```c typedef struct { u8 upf_trafficrule_id; u16 mp2_precedence; }acl_list_information_t; ``` ```c typedef struct { ... acl_rule_t *acl; acl_list_information_t *acl_information; ... } upf_pdi_t; ``` 在结构体 `upf_pdi_t` 里面增加向量 `acl_information`,插入 `acl` 时记录 `upf_trafficrule_id` 和优先级,因为两个向量排序一致,插入后我们也能知道每条 `acl` 的信息,如下: ![ip_rule_priority_2](../../../_static/ip_rule_priority_2.png) 这样,就能保证后插入的规则可与之前的规则进行优先级比较,进行排序,同时删除时也知道每条规则的 `upf_trafficrule_id`,保证精确删除。 ### 命令行更改说明 ``` 注:traffic_rule_precedence的范围是1-255,值越小优先级越高。 //命令行原型 #upf mec-traffic pfd-list appid fd {xxx} [traffic_rule_precedence <>] [upf_traffic_id <>] [] [] // del :删除该 mec APPID 指定 upf_traffic_id 的 pfd // del_all : 删除该 mec APPID 下挂所有 pfd // 新增一条 mec fd (若 appid 已存在,则删除指定 upf_traffic_id 下的规则,再增加) # upf mec-traffic pfd-list appid 1030 fd {permit in ip from 172.20.231.0/24 to 192.168.2.1/32} traffic_rule_precedence 1 upf_traffic_id 1 // 删除该 mec APPID 指定upf_traffic_id 的 pfd # upf mec-traffic pfd-list appid 1030 upf_traffic_id 1 del // 删除该 mec APPID 下挂所有 pfd # upf mec-traffic pfd-list appid 1030 del_all ```