# VPP-Agent MP2 API 汇总 ## Traffic Rule ### UPF 北向 API 定义 ``` typedef mp2_traffic_rule_content { u8 flags; u8 flow_description[128]; }; autoreply define upf_mp2_ip_traffic_rule { u32 client_index; u32 context; u32 is_add; u32 del_all; u32 upf_trafficrule_id; u8 app_id[32]; u32 n_pfd_contents; vl_api_pfd_content_t mp2_traffic_rule_content[8]; }; ``` - is_add 0:删除 1:添加或更新 - del_add 0:删除 upf_trafficrule_id 关联的 rule 1:删除 app 下所有 trafficrule - upf_trafficrule_id:删除时指定的 rule,唯一值,由 vpp-agent 维护其维一性;后期关联 fd 的优先级。 - app_id:APP Name - n_pfd_contents:fd 数量 - mp2_traffic_rule_content flags:1,下发的为 fd flow_description:fd 具体值 ### UPF 所接收结构体 ``` type PfdContent struct { Flags uint32 `binapi:"u32,name=flags" json:"flags,omitempty"` FlowDescription []byte `binapi:"u8[128],name=flow_description" json:"flow_description,omitempty"` URL []byte `binapi:"u8[32],name=url" json:"url,omitempty"` Domain []byte `binapi:"u8[16],name=domain" json:"domain,omitempty"` Custom []byte `binapi:"u8[8],name=custom" json:"custom,omitempty"` } type UpfMp2IPTrafficRule struct { IsAdd uint32 `binapi:"u32,name=is_add" json:"is_add,omitempty"` DelAll uint32 `binapi:"u32,name=del_all" json:"del_all,omitempty"` UpfTrafficruleID uint32 `binapi:"u32,name=upf_trafficrule_id" json:"upf_trafficrule_id,omitempty"` AppID []byte `binapi:"u8[32],name=app_id" json:"app_id,omitempty"` NPfdContents uint32 `binapi:"u32,name=n_pfd_contents" json:"n_pfd_contents,omitempty"` Mp2TrafficRuleContent [8]PfdContent `binapi:"pfd_content[8],name=mp2_traffic_rule_content" json:"mp2_traffic_rule_content,omitempty"` } ``` ### MP2 API 解析成 UPF API MP2 body 如下: ``` { "trafficRuleId": "priority": "action": "trafficFilter": [ { "ipAddressType": "srcAddress": "dstAddress": "srcPort": "dstPort": "protocol": } ] } ``` VPP-Agent 从 URL 里解析 APP Name 至 AppID 中;解析 action 和 五元组到 FD 中,如 premit/deny,协议转为协议号等。然后发出。 ## DnsRedirect Rule ### UPF 北向 API 定义 ``` manual_print typedef u8 ip4_address[4]; autoreply define upf_mp2_dns_redirect_rule { u32 client_index; u32 context; u32 is_add; u8 app_id[32]; u32 upf_dnsredirect_rule_id; string domain_name[256]; vl_api_ip4_address_t ip4; vl_api_ip6_address_t ip6; }; ``` - is_add 0:删除 1:添加或更新 - app_id:APP Name - upf_dnsredirect_rule_id:删除时指定的 rule。 - domain_name:域名 - ip4:dns server IP ### UPF 所接收结构体 ``` type IP4Address [4]uint8 type UpfMp2DNSRedirectRule struct { IsAdd uint32 `binapi:"u32,name=is_add" json:"is_add,omitempty"` AppID []byte `binapi:"u8[32],name=app_id" json:"app_id,omitempty"` UpfDnsredirectRuleID uint32 `binapi:"u32,name=upf_dnsredirect_rule_id" json:"upf_dnsredirect_rule_id,omitempty"` DomainName string `binapi:"string[256],name=domain_name" json:"domain_name,omitempty"` IP4 ip_types.IP4Address `binapi:"ip4_address,name=ip4" json:"ip4,omitempty"` IP6 ip_types.IP6Address `binapi:"ip6_address,name=ip6" json:"ip6,omitempty"` } ``` ### MP2 API 解析成 UPF API MP2 body 如下 ``` { "dnsRedirectRuleId": "domainName": "ipAddressType": "dnsServerIp": } ``` VPP-Agent 从 URL 里解析 APP Name 至 AppID 中;解析 domainName 到 DomainName ,解析 ipAddressType 和 dnsServerIp 到 IP4 或 IP6 中 。然后发出。 ## Dns Rule ### UPF 北向 API 定义 ``` type UpfMp2DNSRule struct { IsAdd uint32 `binapi:"u32,name=is_add" json:"is_add,omitempty"` AppID []byte `binapi:"u8[32],name=app_id" json:"app_id,omitempty"` UpfDnsruleID uint32 `binapi:"u32,name=upf_dnsrule_id" json:"upf_dnsrule_id,omitempty"` DomainName string `binapi:"string[256],name=domain_name" json:"domain_name,omitempty"` IP4 ip_types.IP4Address `binapi:"ip4_address,name=ip4" json:"ip4,omitempty"` IP6 ip_types.IP6Address `binapi:"ip6_address,name=ip6" json:"ip6,omitempty"` TTL uint32 `binapi:"u32,name=ttl" json:"ttl,omitempty"` } ``` - is_add 0:删除 1:添加或更新 - app_id:APP Name - upf_dnsrule_id:删除时指定的 rule。 - IP4:dns 解析的 IPv4 地址。 - TTL:TTL 设置。 ### UPF 所接收的结构体 ``` autoreply define upf_mp2_dns_rule { u32 client_index; u32 context; u32 is_add; u8 app_id[32]; u32 upf_dnsrule_id; string domain_name[256]; vl_api_ip4_address_t ip4; vl_api_ip6_address_t ip6; u32 ttl; }; ``` ### MP2 API 解析成 UPF API ``` { "dnsRuleId": "domainName": "ipAddressType": "ipAddress": "ttl": } ``` VPP-Agent 从 URL 里解析 APP Name 至 AppID 中;解析 domainName 到 DomainName ,解析 ipAddressType 和 ipAddress 到 ip4 或 ip6 中 。然后发出。 ## Acl Rule ### UPF 北向 API 定义 ``` type UeValue struct { Value string `binapi:"string[32],name=value" json:"value,omitempty"` } type UpfMp2ACLRule struct { IsAdd uint32 `binapi:"u32,name=is_add" json:"is_add,omitempty"` AppID []byte `binapi:"u8[32],name=app_id" json:"app_id,omitempty"` ACLType uint8 `binapi:"u8,name=acl_type" json:"acl_type,omitempty"` UeType uint8 `binapi:"u8,name=ue_type" json:"ue_type,omitempty"` NUeValue uint8 `binapi:"u8,name=n_ue_value" json:"-"` UeValues []UeValue `binapi:"ue_value[n_ue_value],name=ue_values" json:"ue_values,omitempty"` } ``` - is_add 0:删除 1:添加或更新 - app_id:APP Name - ACLType 黑白名单类型 1:BLACK 2:WHITE - UeType UE 信息类型 1:IPADDRESS 2:SUPI 3:GPSI 4:PEI - NUeValue:UE 个数 - UeValue Value:具体 UE 值 ### UPF 所接收的结构体 ``` typedef ue_value { string value[32]; }; autoreply define upf_mp2_acl_rule { u32 client_index; u32 context; u32 is_add; u8 app_id[32]; u8 acl_type; u8 ue_type; u8 n_ue_value; vl_api_ue_value_t ue_values[n_ue_value]; }; ``` ### MP2 API 解析成 UPF API ``` { "aclType": "ueTagList": [ { "ueTag": "type": "value": } ] } ``` VPP-Agent 从 URL 里解析 APP Name 至 AppID 中;解析 aclType 到 acl_type,解析 UeTag 中 type 到 ue_type ,目前同时只支持一种类型,解析 UeTag 中 value 到 ue_values 中的 value。然后发出。 ## UE Information ### UPF 北向 API 定义 ``` type UpfUeInformation struct { UeidType string `binapi:"string[32],name=ueid_type" json:"ueid_type,omitempty"` UeidValue string `binapi:"string[32],name=ueid_value" json:"ueid_value,omitempty"` } ``` - UeidType:UE 类型 ipaddress, supi, gpsi, pei。 - UeidValue:UE 具体数值 ### UPF 所接收的结构体 ``` define upf_ue_information { u32 client_index; u32 context; string ueid_type[32]; string ueid_value[32]; }; ``` ### MP2 API 解析成 UPF API ``` GET https://{ip}:{port}/mp2/v1/meps/{mepId}/ueinformation/query/ue_id?type={ueIdType}&value={ueIdValue} ``` 解析 URL 中的 ueIdType 到 UeidType,解析 ueIdValue 到 UeidValue,然后发出。