2 // Copyright (c) 2017 Intel Corporation
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
8 // http://www.apache.org/licenses/LICENSE-2.0
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
17 #ifndef _CGNAPT_PCP_H_
18 #define _CGNAPT_PCP_H_
26 #include <rte_ether.h>
28 #include <rte_pipeline.h>
30 #include "pipeline_cgnapt_common.h"
32 void handle_pcp_req(struct rte_mbuf *rx_pkt,
34 void *pipeline_cgnapt_ptr);
36 void construct_pcp_resp(struct rte_mbuf *rx_pkt,
37 struct rte_mbuf *tx_pkt,
39 struct rte_pipeline *rte_p);
41 void *pipeline_cgnapt_msg_req_pcp_handler(
42 __rte_unused struct pipeline *p,
49 /************************** Constats used in PCP ****************************/
50 #define PCP_SERVER_PORT 5351
57 /* PCP life time in seconds */
59 PCP_LONG_LTIME = 30 * 60,
61 MAX_PCP_LIFE_TIME = 120 * 60,
70 /* PCP result codes */
75 PCP_MALFORMED_REQUEST,
83 PCP_CANNOT_PROVIDE_EXTERNAL,
85 PCP_EXCESSIVE_REMOTE_PEERS
91 * PCP request header format
95 uint8_t opcode:7; //First LSB
96 uint8_t req_resp:1;// MSB
100 } __attribute__((__packed__));
105 * PCP response header format
107 struct pcp_resp_hdr {
109 uint8_t opcode:7; //First LSB
110 uint8_t req_resp:1;// MSB
116 } __attribute__((__packed__));
121 * PCP MAP request header format
126 uint32_t res_unuse1:24;
130 } __attribute__((__packed__));
135 * PCP MAP response header format
137 struct pcp_map_resp {
140 uint32_t res_unuse1:24;
144 } __attribute__((__packed__));
149 * PCP PEER request header format
151 struct pcp_peer_req {
154 uint32_t res_unuse1:24;
160 uint32_t rpeer_ip[4];
161 } __attribute__((__packed__));
166 * PCP PEER response header format
168 struct pcp_peer_resp {
171 uint32_t res_unuse1:24;
177 uint32_t rpeer_ip[4];
178 } __attribute__((__packed__));
183 * Customized IPv4 header of struct ipv4_hdr
186 uint8_t version_ihl; /**< version and header length */
187 uint8_t type_of_service; /**< type of service */
188 uint16_t total_length; /**< length of packet */
189 uint16_t packet_id; /**< packet ID */
190 uint16_t fragment_offset; /**< fragmentation offset */
191 uint8_t time_to_live; /**< time to live */
192 uint8_t next_proto_id; /**< protocol ID */
193 uint16_t hdr_checksum; /**< header checksum */
194 uint32_t src_addr; /**< source address */
195 uint32_t dst_addr; /**< destination address */
198 } __attribute__((__packed__));
203 * Customized IPv6 header of struct ipv6_hdr
206 uint32_t vtc_flow; /**< IP version, traffic class & flow label. */
207 uint16_t payload_len; /**< IP packet length -
208 * includes sizeof(ip_header).
210 uint8_t proto; /**< Protocol, next header. */
211 uint8_t hop_limits; /**< Hop limits. */
212 uint8_t src_addr[16]; /**< IP address of source host. */
213 uint8_t dst_addr[16]; /**< IP address of destination host(s). */
217 } __attribute__((__packed__));
222 * To represent the entire pkt data in one structure
225 struct ether_hdr eth;
230 } __attribute__((__packed__));
233 * A structure defining the PCP msg request
235 struct pipeline_cgnapt_pcp_msg_req {
236 enum pipeline_msg_req_type type;
237 enum pipeline_cgnapt_msg_req_type subtype;
245 * A structure defining the PCP cmd response message.
247 struct pipeline_cgnapt_pcp_msg_rsp {
252 /* All required offsets */
254 MBUF_HEAD_ROOM = 256,
262 PCP_REQ_RESP_HDR_SZ = 24,
263 PCP_MAP_REQ_RESP_SZ = 36,
264 PCP_PEER_REQ_RESP_SZ = 56,
268 ETH_DST_MAC = MBUF_HEAD_ROOM,
269 ETH_SRC_MAC = MBUF_HEAD_ROOM + 6,
270 PKT_TYPE = MBUF_HEAD_ROOM + 12,
271 IP_OFFSET = MBUF_HEAD_ROOM + ETH_HDR_SZ,
275 IPV4_PROTOCOL = MBUF_HEAD_ROOM + ETH_HDR_SZ + 9,
276 IPV4_SRC_ADD_OFST = MBUF_HEAD_ROOM + ETH_HDR_SZ + 12,
277 IPV4_DST_ADD_OFST = MBUF_HEAD_ROOM + ETH_HDR_SZ + 12 + IPV4_SZ,
279 IPV4_TCP_OFST = MBUF_HEAD_ROOM + ETH_HDR_SZ + IPV4_HDR_SZ,
280 IPV4_TCP_SRC_PORT_OFST = MBUF_HEAD_ROOM + ETH_HDR_SZ + IPV4_HDR_SZ,
281 IPV4_TCP_DST_PORT_OFST = MBUF_HEAD_ROOM + ETH_HDR_SZ + IPV4_HDR_SZ + 2,
283 IPV4_UDP_OFST = MBUF_HEAD_ROOM + ETH_HDR_SZ + IPV4_HDR_SZ,
284 IPV4_UDP_SRC_PORT_OFST = MBUF_HEAD_ROOM + ETH_HDR_SZ + IPV4_HDR_SZ,
285 IPV4_UDP_DST_PORT_OFST = MBUF_HEAD_ROOM + ETH_HDR_SZ + IPV4_HDR_SZ + 2,
287 IPV4_PCP_OFST = MBUF_HEAD_ROOM + ETH_HDR_SZ +
288 IPV4_HDR_SZ + UDP_HDR_SZ,
289 IPV4_PCP_MAP_OFST = MBUF_HEAD_ROOM + ETH_HDR_SZ + IPV4_HDR_SZ +
290 UDP_HDR_SZ + PCP_REQ_RESP_HDR_SZ,
291 IPV4_PCP_PEER_OFST = MBUF_HEAD_ROOM + ETH_HDR_SZ + IPV4_HDR_SZ +
292 UDP_HDR_SZ + PCP_REQ_RESP_HDR_SZ,
294 IPV4_PCP_MAP_PL_LEN = IPV4_HDR_SZ + UDP_HDR_SZ + PCP_REQ_RESP_HDR_SZ +
296 IPV4_PCP_PEER_PL_LEN = IPV4_HDR_SZ + UDP_HDR_SZ + PCP_REQ_RESP_HDR_SZ +
297 PCP_PEER_REQ_RESP_SZ,
300 IPV6_PROTOCOL = MBUF_HEAD_ROOM + ETH_HDR_SZ + 6,
301 IPV6_SRC_ADD_OFST = MBUF_HEAD_ROOM + ETH_HDR_SZ + 8,
302 IPV6_DST_ADD_OFST = MBUF_HEAD_ROOM + ETH_HDR_SZ + 8 + IPV6_SZ,
304 IPV6_TCP_OFST = MBUF_HEAD_ROOM + ETH_HDR_SZ + IPV6_HDR_SZ,
305 IPV6_TCP_SRC_PORT_OFST = MBUF_HEAD_ROOM + ETH_HDR_SZ + IPV6_HDR_SZ,
306 IPV6_TCP_DST_PORT_OFST = MBUF_HEAD_ROOM + ETH_HDR_SZ + IPV6_HDR_SZ + 2,
308 IPV6_UDP_OFST = MBUF_HEAD_ROOM + ETH_HDR_SZ + IPV6_HDR_SZ,
309 IPV6_UCP_SRC_PORT_OFST = MBUF_HEAD_ROOM + ETH_HDR_SZ + IPV6_HDR_SZ,
310 IPV6_UCP_DST_PORT_OFST = MBUF_HEAD_ROOM + ETH_HDR_SZ + IPV6_HDR_SZ + 2,
312 IPV6_PCP_OFST = MBUF_HEAD_ROOM + ETH_HDR_SZ +
313 IPV6_HDR_SZ + UDP_HDR_SZ,
314 IPV6_PCP_MAP_OFST = MBUF_HEAD_ROOM + ETH_HDR_SZ + IPV6_HDR_SZ +
315 UDP_HDR_SZ + PCP_REQ_RESP_HDR_SZ,
316 IPV6_PCP_PEER_OFST = MBUF_HEAD_ROOM + ETH_HDR_SZ + IPV6_HDR_SZ +
317 UDP_HDR_SZ + PCP_REQ_RESP_HDR_SZ,
319 IPV6_PCP_MAP_PL_LEN = IPV6_HDR_SZ + UDP_HDR_SZ +
320 PCP_REQ_RESP_HDR_SZ + PCP_MAP_REQ_RESP_SZ,
321 IPV6_PCP_PEER_PL_LEN = IPV6_HDR_SZ + UDP_HDR_SZ +
322 PCP_REQ_RESP_HDR_SZ + PCP_PEER_REQ_RESP_SZ,
326 STATIC_CGNAPT_TIMEOUT = -1,
327 DYNAMIC_CGNAPT_TIMEOUT = 0,
334 //PCP_PCP_PKT_SUCCESS,
341 uint32_t pcp_success_count;
342 uint32_t pcp_error_count;
343 uint32_t pcp_entry_count;
346 uint8_t pcp_pool_init;
347 struct rte_mempool *pcp_mbuf_pool;
349 enum PCP_RET pcp_init(void);
356 #endif /* CGNAPT_PCP_H_ */